Skip to content
dsh.fish
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

Source