deepseek-harness-yunoseek
一个基于tv动画yumemita中的人物千石由乃,使用剧照素材,应用于deepseek-harness的自定义配色插件;A custom color scheme plugin for deepseek-harness, based on the character Yuno Sengoku from the TV anime "Yumemita"
- Stars
- 2
- Language
- TypeScript
- Created
- Aug 23, 2026
- Updated
- Aug 24, 2026
Introduction
dsh-yunoseek-skin
Yunoseek pink skin for the DeepSeek Harness web GUI. It restyles the DSH browser UI with the pink art direction of the yunoseek chat UI (#E91E8C / #FF6B9D gradients, pink tints) while reusing every DSH layout and component unchanged, through the standard client-plugin interfaces:
- Pink token layer — a theme
overrideTokenslayer over the--dsw-*semantic tokens and the--dsw-static-deepseek-*scale, every token carrying explicit light and dark values from yunoseek's two palettes. The skin is always on and follows the user's light/dark/system preference; no settings change needed. - Art direction sheet — the pink Hero glow recolor per palette, and the assistant avatar painted into every chat assistant row via its stable
data-chat-flow-kindattribute (the host's CSS Modules class names are hashed and not addressable cross-package). - Brand marks (non-
officialbuilds only) — the yunoseek logo in the sidebar brand row, the gradient "Yunoseek" wordmark, and the welcome artwork in the conversation Hero seat. Official DeepSeek Harness compositions already own those single-occupant slots with the built-in brand, so the skin yields them by default (see "Build profile" below). - Yunoseek identity prompt — the node half registers the yunoseek system prompt (
assets/system-prompt.js) as the first system-prompt section, so every assembled system prompt starts with the Yunoseek persona.
In short: pink everywhere, yunoseek artwork, the Yunoseek identity, no host component modified, no yunoseek business features (player, minigames, mode pills, modals).
Yunoseek identity prompt
Beyond the visuals, the plugin injects the yunoseek identity prompt into the model. Its node half registers a systemPrompt section named yunoseek:identity with order -200, which renders before the harness identity (-100) and the deployment persona (0) — the very first text the model reads for every turn. The default text is the yunoseek system prompt from assets/system-prompt.js, embedded at build time.
The injection is on by default and applies globally to every agent in the profile (the section lives in the prompt registry's global layer). To disable it or replace the text, override the row from your profile patch ($DSH_HOME/profiles/web/cordis.patch.yml) — a later layer that replaces the row's config value:
- update:
- id: yunoseek-skin
config:
enabled: false # skin only, no prompt injection
- update:
- id: yunoseek-skin
config:
prompt: |
# My own identity
... # custom prompt text
Config is read at boot, so restart dsh web after changing it. The section text is static: it carries no {{variable}} references — a custom prompt containing {{…}} fails prompt assembly on purpose (fail loud keeps a malformed prompt out of the model request).
modified prompt takes about 1200 extra tokens
Install
Requirements: a dsh installation (the dsh CLI) and a web profile — the default GUI profile is named web.
From GitHub
dsh plugin --profile web add github:<owner>/dsh-yunoseek-skin
A git install fetches sources, not built artifacts, so pnpm runs the package's prepare script to build lib/. pnpm ≥ 10 refuses to run a git dependency's prepare until explicitly allowed — the first add fails and dsh prints the exact package key; copy it into the profile's pnpm-workspace.yaml:
allowBuilds:
dsh-yunoseek-skin: true
then re-run the add. (That allowance is permission to execute the package's code at install time; only allow packages whose source you trust, and pin a commit: github:<owner>/dsh-yunoseek-skin#<sha>.) Then (re)start your dsh web once so the new roster row composes; later code changes to the skin hot-reload through the web HMR chain.
From npm or a tarball
Prebuilt options need no build allowance:
dsh plugin --profile web add dsh-yunoseek-skin # npm, lib/ built at publish time
dsh plugin --profile web add ./dsh-yunoseek-skin-0.2.0.tgz # pnpm pack
Uninstall
dsh plugin --profile web remove dsh-yunoseek-skin
Build profile and the brand seats
The tsdown config pins DSH_CLIENT_BUILD_PROFILE (default official). In an official build the skin applies the token layer, avatar sheet, and Hero glow only — official web compositions contain the built-in deepseek brand, which owns the sidebar.brand.mark / sidebar.brand.name / conversation.hero.brand.mark seats and must not collide. To show the yunoseek marks instead (e.g. a dev/self-built web, or after disabling the built-in brand row), build with:
DSH_CLIENT_BUILD_PROFILE=dev pnpm install # rebuilds lib/ with brand marks on
and, when your composition still carries the built-in brand row, disable it in the profile patch ($DSH_HOME/profiles/web/cordis.patch.yml):
- update:
- id: ui-brand-official
disabled: true
Build
pnpm install # installs tsdown and runs prepare, emitting lib/
The prepare script is self-contained (docs/user/develop/basic/publish.md): it builds from src/ with a dedicated tsdown config — no monorepo context, no project references, no typechecking. Outputs: lib/index.js (ESM node half) and lib/client.js (CJS browser half).
Distribution
This is a standard dsh bundle: package.json declares dsh.bundle (patch cordis.patch.yml, which inserts the yunoseek-skin row) and dsh.client (platform: "web", informational inject edges). To publish: create a repository under your GitHub account, push this directory, and users install with dsh plugin --profile web add github:<owner>/dsh-yunoseek-skin; or npm publish with lib/ built, or ship pnpm pack tarballs.
Known limitations
- The identity prompt is global and forward-most: a later layer that registers a
complete: truesystem-prompt section replaces the whole prompt for an agent, and the injected text disappears there (the registry's documented complete-section behavior). - Custom prompt text must not contain
{{…}}— prompt variables render strictly and an unknown reference fails assembly. - The assistant avatar is painted into chat rows by selector:
[data-chat-flow-kind="assistant-step"]::beforewith a fixed 34px geometry. If ui-conversation changes that attribute or row geometry, the rule (insrc/client/styles.ts) needs a revisit. - The sidebar and Hero marks are skipped in
officialbuilds by design (single-occupant brand slots); see above for the dev-profile path. - The Hero glow rule targets
[data-phase="hero"] svg ellipse; a future Hero redesign may move the glow out of an SVG ellipse.
License
MIT