DeepSeek Harness plugin

dsh-catgirl-plugin

A token-efficient persona runtime for DeepSeek Harness. 把人格留在界面,把智能留给模型。Measured: -67% input tokens, -66% cache reads, 0-token catgirl rendering.

Jump to install

Source facts

Repository
Freakz2z/dsh-catgirl-plugin
Latest update
Aug 22, 2026
Category
Just for Fun
GitHub stars
1
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/Freakz2z/dsh-catgirl-plugin
Plugin: dsh-catgirl-plugin
Author: Freakz2z

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer4 files
README_en.mdSource · read only
README language

<div align="center">

<img src="./assets/logo.png" width="160" alt="Neko logo — a pixel-art blue-haired catgirl maid">

dsh-catgirl-plugin

A token-efficient persona runtime for DeepSeek Harness.

Keep personality in the interface, intelligence in the model.

简体中文 | English

</div>

<p align="center"> <img src="./assets/readme/hero.jpg" width="100%" alt="dsh-catgirl-plugin — a token-efficient catgirl persona runtime for DeepSeek Harness: -67% new input on the first request, -66% cache reads in steady state, catgirl flavor rendered locally at zero LLM token cost"> </p>

Example

> User: write me a sorting algorithm > > Model (normal output): Wrote /tmp/qs.py: in-place quicksort, all 6 test cases PASS. > > What you see: Wrote /tmp/qs.py: in-place quicksort, all 6 test cases PASS. 喵~ (。・ω・。)

Core idea

The traditional approach makes the LLM "act catgirl" itself: a few hundred tokens of persona injected into the system prompt, paid again on every request, and the model's output gets wordier.

This plugin does the opposite — persona virtualization:

<p align="center"> <img src="./assets/readme/mechanism.svg" width="100%" alt="Persona virtualization: the model answers normally with a 6-token persona, the session log stores raw text, and a local render layer adds the catgirl flavor at zero LLM token cost"> </p>

  • The session log stores raw text — zero pollution of the model's context
  • Catgirl flavor at 0 LLM tokens — all rendered locally
  • Tool schema trimming: 25 → 8 tools, saving thousands of tokens per request

Measured results

Real DeepSeek API (2026-08-14): -67% new input on the first request, -66% cache reads in steady state, no quality degradation.

<details> <summary>Full comparison data (same task: write quicksort + save + run)</summary>

Cold start (first agent request, no cache)

ConfigFirst request new inputTotal new inputTotal cache readsOutput
Baseline (no plugin)12,37212,52025,856838
Traditional catgirl12,57613,15626,240860
Lite + Economy3,8814,1788,960739

Steady state (second run, cache warm)

ConfigNew inputCache reads
Baseline49738,144
Lite + Economy38612,800 (-66%)

Findings

1. A traditional long-persona catgirl costs more tokens (+5%) — persona is a per-request recurring cost 2. A minimal persona ≈ baseline — its value is letting the model output normal text, leaving the catgirl flavor to local rendering 3. Tool schema trimming is the real token saverctx.tools.restrict() trims at the agent scope, keeping what the model sees aligned with what it can execute

</details>

Quality comparison

5-task battery (coding / web search / file search / pure Q&A / subagent): no quality degradation; the model adapts to missing tools (curl instead of web_search, direct answers instead of subagents).

<details> <summary>Full comparison data (baseline vs this plugin)</summary>

TaskTool statusBaseline qualityPlugin qualityBaseline tokens (new/cache)Plugin tokens
Codingkept✅ (+edge cases)309 / 37,760725 / 22,016
Web searchtrimmed✅ news data✅ live API (curl)2,476 / 65,4081,403 / 17,024
File searchkept✅ 215 files✅ 215 files7,066 / 40,8323,490 / 22,912
Pure Q&Ano tools✅ detailed✅ concise192 / 12,288149 / 3,840
Subagenttrimmed⚠️ truncated output✅ answered directly18,702 / 61,312189 / 3,840

</details>

The real boundary: tasks that require a specialized tool (parallel subagents, skill calls) change strategy. Progressive disclosure solves this:

Model: enable_tool("subagent") → tool unlocked
Model: subagent × 2 (parallel delegation) → subagents done → summary

Measured end-to-end: the model recognized the missing tool, called enable_tool, delegated to two parallel subagents, and summarized correctly. Capability fully restored, while the parent's tool schemas stay minimal until escalation (~2,000 tokens/request saved).

If a requested tool is not installed in the current profile, enable_tool reports it as unavailable and preserves the previous allow-list, so the session can continue unlocking other tools.

Quick start

# Install from npm
dsh plugin --profile demo add dsh-catgirl-plugin

Then add to the profile patch:

- insert:
    - id: catgirl-lite
      name: dsh-catgirl-plugin/catgirl-lite
      config:
        persona: 'Be concise, friendly, and natural.'
    - id: neko-renderer
      name: dsh-catgirl-plugin/neko-renderer
    - id: catgirl-economy
      name: dsh-catgirl-plugin/catgirl-economy
      config:
        allow: [bash, read, write, edit, glob, grep, str_replace_editor, todo_write]

Web UI rendering (optional): install dsh-catgirl-plugin-client and add it to the profile patch:

- insert:
    - id: neko-renderer-client
      name: dsh-catgirl-plugin-client

Plugin family

PluginRoleToken impact
catgirl-lite.jsminimal persona (6 tokens)+6 per request
neko-renderer.jsheadless display decoration0
catgirl-economy.jstool trimming + enable_tool on-demand unlock-8,491 per request (-69%)
client/Web UI rendering (shadows the assistant renderer)0
index.jstraditional long persona (for comparison)+hundreds per request
usage-meter.jsdev tool: records usage0

RoadMap (V2)

  • Tool profile switching (Coding / Normal / Chat): pick the tool set by task type
  • Reasoning Router: reasoning off for social chat, high/max for complex tasks (biggest win, biggest risk)
  • Chat-only tier: keep just 2-3 tools
  • Adaptive tool disclosure: predict unlocks by task type
  • Web UI state machine: agent lifecycle → catgirl states, 0 LLM tokens

Known Limitations

  • Headless one-shot does not wait for background subagents: run_in_background: true children are killed on parent exit (headless app limitation, not the plugin; sync mode works)
  • npm registry rc packages have a broken dep chain: dsh-client-runtime depends on unpublished dsh-compact; building the client package requires linking from a harness checkout (see [Development](#development))
  • nya tool output is random (Math.random()), unsuitable for snapshot tests
  • Persona text is Chinese-only: edit INTENSITY_TEXT in index.js or extend via traits

Development

npm install
npm test                       # persona, tool-unlock, renderer, and client unit tests
npm run test:composition       # real Loader composition test (needs a built deepseek-harness checkout)
npm run pack:check             # inspect the npm package contents

The test overlays under overlays/ contain absolute paths; replace them with your checkout path before use.

<details> <summary>Building the client plugin (npm registry chain is broken; link deps from a harness checkout)</summary>

cd client
npm install react tsdown typescript @types/react@18.3.31 --no-audit --no-fund
mkdir -p node_modules/@deepseek-ai
ln -s <harness>/packages/attachment/attachment node_modules/@deepseek-ai/dsh-attachment
ln -s <harness>/packages/client/runtime node_modules/@deepseek-ai/dsh-client-runtime
ln -s <harness>/packages/client/ui-attachment node_modules/@deepseek-ai/dsh-client-ui-attachment
ln -s <harness>/packages/client/ui-conversation node_modules/@deepseek-ai/dsh-client-ui-conversation
ln -s <harness>/packages/client/ui-primitives node_modules/@deepseek-ai/dsh-client-ui-primitives
ln -s <harness>/packages/client/ui-slots node_modules/@deepseek-ai/dsh-client-ui-slots
ln -s <harness>/vendor/cordis node_modules/@deepseek-ai/cordis
npx tsc --noEmit && npx tsdown
npx tsc src/index.ts --outDir lib --module esnext --target es2022 --moduleResolution bundler --skipLibCheck

</details>

License

[MIT](LICENSE)