Bundle
dsh-soul-md
DeepSeek Harness 的 soul.md 风格人设 + 长期记忆插件:设置页输入人设卡名称和内容即可,文件由插件自动管理;可按工作区指定人设、聊天框可给会话单独切人设;AI 可自行演化人设与记忆(soul_read/soul_update/memory_*)。
- Source
- Scorp1o117
- stars
- 5 stars
- License
- MIT
- Updated
- Updated 10 days ago
Readme
# dsh-soul-md
[](README.zh.md)
**GitHub**: [Scorp1o117/dsh-soul-md](https://github.com/Scorp1o117/dsh-soul-md) · **npm**: [dsh-soul-md](https://www.npmjs.com/package/dsh-soul-md)
[](https://github.com/Scorp1o117/dsh-enhancement-suite) [](https://www.npmjs.com/package/dsh-enhancement-suite)
Part of the [DeepSeek Harness Enhancement Suite](https://github.com/Scorp1o117/dsh-enhancement-suite) — Vision · Soul/Persona · Long-term Memory · Plugin Marketplace.
Persona + long-term memory for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — **zero file management**:
> In Settings → 人设卡, type a card **name** and its **content**, hit save. The plugin manages everything else.
## What you get
- **Persona cards** — the card content is rendered into the system prompt as
the `soul:persona` section. Multiple cards are supported; pick a default,
and switch per chat from the **conversation header** (a "人设" select).
- **Long-term memory** — the agent gets five tools:
- `memory_append` / `memory_read` / `memory_rewrite` — a persistent memory
file (Agent.md / memory.md style). The active persona card has its own
memory; otherwise the global memory is used.
- `soul_read` / `soul_update` — the AI reads and **evolves its own persona
card**: when it notices a stable trait, preference, or value of its own,
it folds it into the card. It "grows" across sessions instead of
resetting every time.
- The memory is also injected as a `soul:memory` prompt section (capped)
so the agent always sees its memories.
- **Resolution** per prompt assembly: `session choice (chat switcher) > workspace mapping > default card > none`. Switching applies from the next turn — no restart.
- **Workspace personas (v0.5.2)**: Settings → 人设卡 lists every workspace with a card dropdown — sessions of that workspace use the assigned card by default (session-level switching still wins). Workspaces come from dsh's durable workspace registry, so no paths to type.
## Install
The plugin is a plain Cordis row. Mount it in a profile patch
(`$DSH_HOME/profiles/<name>/cordis.patch.yml`):
```yaml
- insert:
- id: soul-md
name: 'dsh-soul-md' # after: pnpm add dsh-soul-md in the profile
```
Then restart `dsh web` and open **Settings → 人设卡**: type a name + content, save.
## Where things live (you don't need to care, but for reference)
- Persona cards: stored in the `soul-md` settings namespace (`settings.yaml`),
as `cards: { name -> markdown }` + `active` + per-session `sessions`.
- Memory files: plugin-managed under `$DSH_HOME/soul-md/memory/`
(`global.md` + one file per card), created on demand.
- Upgrading from ≤ v0.4 (file-based)? The plugin **auto-imports** the old
`path` card (as "默认") and the old memory file on first run.
## Config
| Field | Default | Meaning |
|---|---|---|
| `cards` | `{}` | Persona cards: name → markdown content (managed from the UI). |
| `active` | `''` | Default card name; empty disables the persona by default. |
| `sessions` | `{}` | Per-session choice (sessionId → card name / `none` / `''`); written by the chat switcher. |
| `workspaces` | `{}` | Per-workspace choice (workspace path → card name / `none` / `''`); written from the settings page. |
| `workspaceList` | `[]` | Read-only workspace list (path + title), maintained by the host from dsh's workspace registry. |
| `memory.maxBytes` | `1048576` | `memory_append` / `memory_rewrite` refuse to exceed this size. |
| `memory.inject` | `true` | Render the memory as the `soul:memory` prompt section. |
| `memory.injectMaxChars` | `8000` | Cap for the injected section (from the file head). |
| `memory.order` | `0.5` | Prompt section order for the injected memory section. |
| legacy fields | — | `path`, `fallback`, `order`, `complete`, `watch`, `debounceMs`, `soulMaxBytes`, `personas`, `roster`, `memory.path`… kept so old composition entries and settings still validate; only used for the one-time import. |
## Notes
- **Never write `{{` / `}}` in a card body** — they are prompt-variable
syntax; unknown variables fail rendering (no escape syntax yet).
- Persona/memory sections resolve per assembly, so steady cards stay
byte-identical (KV-cache friendly) and edits hot-apply.
- DSH exposes the registered `soul-md` settings namespace directly; the plugin
does not modify files in the host installation.
- Suggest putting work-quality rules in the card (e.g. "task quality first")
so roleplay never degrades real work.
- Version 0.5.8 and newer require DSH `0.1.0-rc.7` or newer and are tested
against `0.1.0-rc.7`, `0.1.0-rc.8`, and `0.1.1-rc.1`.
- DSH `0.1.0-rc.6` users must pin `dsh-soul-md@0.5.6`, the last release
carrying the legacy settings-allowlist compatibility patch.
## License
MIT
Install
dsh plugin --profile web add github:Scorp1o117/dsh-soul-md
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-soul-md from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.