Bundle
@user/dsh-openclaw-persona
DSH profile bundle: load OpenClaw-style persona files (SOUL.md, IDENTITY.md, USER.md, TOOLS.md, MEMORY.md, AGENTS.md, HEARTBEAT.md, memory/*.md) into every DSH session whose workspace contains an openclaw/ subdirectory.
- Source
- AskingTheHeavens
- License
- MIT
- Updated
- Updated 3 days ago
Readme
# @user/dsh-openclaw-persona
> Bring OpenClaw-style persona files (SOUL.md, IDENTITY.md, USER.md, TOOLS.md,
> MEMORY.md, AGENTS.md, HEARTBEAT.md, plus `memory/*.md` daily notes) into
> [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness) as a
> standard **profile bundle** that activates automatically for every agent in
> any session whose working directory contains an `openclaw/` subdirectory.
## Install
```bash
dsh plugin --profile web add github:AskingTheHeavens/dsh-openclaw-persona
```
Then **restart DSH** so the bundle is composed into the host composition.
Bundles are not hot-reloadable; one restart is required after install.
Verify the install:
```bash
dsh plugin --profile web list
# └── @user/dsh-openclaw-persona@github:AskingTheHeavens/dsh-openclaw-persona
```
Uninstall:
```bash
dsh plugin --profile web remove @user/dsh-openclaw-persona
# then restart DSH
```
For non-`web` profiles (`tui`, `headless`, custom), substitute your profile
name for `web`.
> **Source of truth:** [github.com/AskingTheHeavens/dsh-openclaw-persona](https://github.com/AskingTheHeavens/dsh-openclaw-persona).
> Report issues there.
## What this plugin does
DSH normally loads `AGENTS.md` (and `CLAUDE.md`) via
`@deepseek-ai/dsh-agent-instructions`. OpenClaw uses a richer set of workspace
files to give an agent identity, memory, and context. This bundle brings that
whole set into DSH.
For every agent whose session has a working directory of, say, `/opt/B/`, the
plugin reads:
| File / Dir | What it becomes | Order |
|-------------------------|----------------------------------------------------------------|-------|
| `openclaw/SOUL.md` | system-prompt **section** `openclaw:soul` | 0 |
| `openclaw/IDENTITY.md` | system-prompt **section** `openclaw:identity` | 1 |
| `openclaw/USER.md` | runtime context `openclaw:user` (always) | 50 |
| `openclaw/TOOLS.md` | runtime context `openclaw:tools` (always) | 60 |
| `openclaw/MEMORY.md` | runtime context `openclaw:memory` (main session only) | 70 |
| `openclaw/memory/*.md` | runtime context `openclaw:daily` (latest 2, by filename) | 80 |
| `openclaw/AGENTS.md` | runtime context `openclaw:agents` (OpenClaw boot protocol) | 110 |
| `openclaw/HEARTBEAT.md` | runtime context `openclaw:heartbeat` (only if it has real tasks) | 120 |
These match the [OpenClaw](https://github.com/openclaw/openclaw) file
semantics:
- `MEMORY.md` is **main-session only** — never loaded into a sub-agent or
group chat. (`mainOnly: true`)
- `HEARTBEAT.md` is **injected only when it has actual tasks**, not when it
is empty or contains only comments. (`heartbeatOnlyWhenNonEmpty: true`)
- `memory/*.md` is **truncated** to 16 KiB per note and capped at the **2 most
recent** files, matching OpenClaw's "today + yesterday" convention.
- `AGENTS.md` is loaded by `@deepseek-ai/dsh-agent-instructions` for the
workspace root. This bundle does **not** duplicate that load; it reads
`openclaw/AGENTS.md` (the OpenClaw-side protocol) as a separate runtime
context named `openclaw:agents`.
Sessions in workspaces **without** an `openclaw/` subdirectory see no
difference — the registered sections/contexts are empty and get dropped at
render time.
## Usage
After install and restart, create an OpenClaw-style workspace in any
directory you want to use:
```
/your/workspace/
└── openclaw/
├── AGENTS.md
├── SOUL.md
├── IDENTITY.md
├── USER.md
├── TOOLS.md
├── MEMORY.md
├── HEARTBEAT.md
└── memory/
└── 2026-08-16.md
```
Create a DSH session with that directory as the workspace:
```bash
dsh --cwd /your/workspace
```
or in the Web UI, start a new session in that workspace. The OpenClaw files
are auto-loaded into the system prompt (SOUL.md, IDENTITY.md) and the
runtime context (everything else). No preset selection is needed; the bundle
applies to **every** session, in every preset.
## Configuration
### Subdirectory name
By default the plugin reads from `./openclaw/` inside the session workspace.
Override via the environment variable:
```bash
OPENCLAW_SUBDIR=persona dsh --cwd /your/workspace
# reads from /your/workspace/persona/ instead of /your/workspace/openclaw/
```
### Daily notes limit
The default is **2** (matching OpenClaw's "today + yesterday" convention).
Edit `DAILY_NOTE_LIMIT` in `src/index.js` to change.
### Per-file byte cap
Daily notes are truncated at **16 KiB** each. Edit `DAILY_NOTE_MAX_BYTES` in
`src/index.js` to change.
## Uninstall
```bash
dsh plugin --profile web remove @user/dsh-openclaw-persona
# then restart DSH
```
Or, if installed from a local path, just remove the dependency:
```bash
# in your profile dir
pnpm remove @user/dsh-openclaw-persona
# then restart DSH
```
## How it works (technical)
A DSH profile bundle is an npm package whose `package.json` declares:
```json
{
"dsh": {
"bundle": {
"patch": "./cordis.patch.yml"
}
}
}
```
The `cordis.patch.yml` declares one row (a Cordis plugin row) that loads
this package's `src/index.js`. The loader reads the file with Node's
`require`, sees the named exports `name` + `apply`, and registers a host-
scoped Cordis Plugin. The plugin's `apply(ctx)`:
1. Reads `process.env.OPENCLAW_SUBDIR` (default `'openclaw'`).
2. Subscribes to `ctx.on('agent/created', ...)` and `ctx.on('agent/disposed', ...)`.
3. When an agent is created, registers `openclaw:soul` / `openclaw:identity`
as system-prompt sections on the agent's own system-prompt service, and
`openclaw:user` / `openclaw:tools` / `openclaw:memory` /
`openclaw:heartbeat` / `openclaw:agents` / `openclaw:daily` as runtime
contexts. The text functions read from a per-agent cache populated once
at attach time.
4. On `ctx.on('tools/result', ...)` for any successful `read` / `write` /
`edit` against a file inside `openclaw/`, refreshes the relevant cache
entry so subsequent turns see fresh content.
Files are read with Node's built-in `fs` directly, not the DSH `fs`
service, because DSH's host scope does not expose `fs` to bundle plugins.
## License
MIT — see [LICENSE](./LICENSE).
Install
dsh plugin --profile web add github:AskingTheHeavens/dsh-openclaw-persona#be07031b1a6af0ff696346a5acc90b8ee93d74c1
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 user-dsh-openclaw-persona from the hub