DeepSeek Harness plugin: host-owned long-horizon task board for local coding agents. Next≤3, in-flight, done+verify, inject file + STATUS.md + rightbar/dock chip.
JavaScript
0
15 commits
updated Oct 3, 2026
Host-owned long-horizon task status for local coding agents in the DeepSeek Harness web UI.
Soft “keep a STATUS.md” conventions drift: agents invent sections, forget to
update, or burn tokens re-reading files after compaction. This plugin turns that
into a structured vault the Host owns, with validated agent tools, a
tiny inject file for resume, a one-way STATUS.md projection, and a
Long horizon rightbar + composer dock chip for the human.
Related plugins (same dual-face dsh.bundle shape for the web rightbar / dock):
| Plugin | Repo |
|---|---|
| NVIDIA GPU util / VRAM / power | dsh-gpu-monitor-nvml |
| Local LLM endpoint / slot health | dsh-slot-health |
| Agent process monitor | dsh-agent-processes |
This package: dsh-local-long-horizon.
Verified against DeepSeek Harness 0.1.7-rc.2 (dsh web).
dsh web).AGENTS.md is strongly recommended. DeepSeek Harness
injects it into agent instructions; this plugin hooks that seam so the agent
keeps reading the live inject file (snippet below).Light theme, matching the DSH default.
| Pane + chat (mid-run) | Board (fullscreen) |
|---|---|
![]() | ![]() |
| Dock chip (rightbar closed, chat active) |
|---|
![]() |
If images fail to load, the ASCII mock below still conveys the layout.
Long horizon ● Active [ Turn off ]
M4 · agent loop · main · 20s ago
Ship hello CLI + long-horizon dogfood
/home/you/dev/my-project
┌─ Now ─────────────────────────────────────────┐
│ In flight: wire pane smoke: Next / Done … │
│ Next 3 │
│ 1. wire pane smoke: Next / Done … │
│ 2. capture dock chip with rightbar closed │
│ 3. write README install + AGENTS snippet │
├─ Done (recent) ───────────────────────────────┤
│ ✓ verify node hello.js · verify: … · 3h ago │
│ ✓ write hello.js · verify: … · 4h ago │
└───────────────────────────────────────────────┘
DISABLED notice; status_get still works.status_set_inflight; clear with
status_clear_inflight (empty summary is refused).Horizon · …, Horizon · blocked, …). Click to reopen the pane.DeepSeek Harness already discovers project-root AGENTS.md (and related
baselines) and injects them into the agent’s instructions. This plugin does
not replace that seam — it hooks into it.
DSH injects AGENTS.md ──► agent instructions every turn
│
│ (your AGENTS.md says: read the inject file / use status_* tools)
▼
Agent tools ──► Host TaskStatus service ──► JSON vault (~/.dsh/storages/…)
│
├──► <cwd>/STATUS.md (human + git)
└──► <cwd>/.dsh/task-status-inject.md (≤ ~50 tokens)
STATUS.md.AGENTS.md so the harness keeps
pushing the contract into context. That file should tell the agent to treat
.dsh/task-status-inject.md as binding current state (and to update via
status_* tools). The mutable bytes stay in the tiny inject file — not in a
giant static prompt — while AGENTS.md is the stable “glue” DSH already
knows how to inject.When you turn Long horizon ON (status_init, pane “Start tracking”, or
re-enable), the Host auto-ensures that glue: creates a minimal root
AGENTS.md if missing, or appends the ## Long horizon section if the file
exists without it. It never overwrites a richer human AGENTS.md — hand-tune
project-specific rules freely; only the missing section is added.
Without that section, the vault and tools still work, but a fresh agent is more likely to ignore the inject file and fall back to chat memory or read-loops.
AGENTS.md snippet## Long horizon
Before coding, read `.dsh/task-status-inject.md` if present — it is binding
current task state (DeepSeek Harness injects this AGENTS.md; the inject file is
the live board).
Use status_* tools to update Next (≤3), in-flight, done (with verify), and blocked.
Do not invent a parallel STATUS novel; the vault owns truth and STATUS.md is generated.
dsh plugin --profile web add dsh-local-long-horizon
# restart dsh web (or rely on live patch reload), then hard-refresh the browser
dsh plugin --profile web add github:janpauldahlke/dsh-local-long-horizon
git clone https://github.com/janpauldahlke/dsh-local-long-horizon.git
cd dsh-local-long-horizon
npm install && npm run build
dsh plugin --profile web add "$(pwd)"
Restart (or boot) dsh web so the host + client faces load:
env -u DSH_WEB_URL -u DSH_SHELL -u DSH_SESSION_ID dsh web --no-open
Uninstall:
dsh plugin --profile web remove dsh-local-long-horizon
# restart the web instance that had the plugin
No harness file: dependencies — the host registers tools on the live
ctx.tools service provided by dsh.
| Tool | Purpose |
|---|---|
status_init | Create / refresh vault for a cwd; turns Long horizon ON |
status_get | Full structured record |
status_set_next | Replace Next (0–3 strings) |
status_set_inflight | Set in-flight (non-empty summary required) |
status_clear_inflight | Clear in-flight |
status_set_phase | Short phase label |
status_mark_done | Append done (+ optional verify, rotateNext) |
status_block / status_unblock | Blocked reason |
status_set_enabled | ON / OFF |
status_ping | Host health probe |
Default cwd comes from the agent session workspace; pass cwd to override.
| Surface | Path / name |
|---|---|
| Vault | ~/.dsh/storages/dsh-local-long-horizon/<taskId>.json |
| Inject | <cwd>/.dsh/task-status-inject.md |
| Markdown | <cwd>/STATUS.md (overwritten on every mutation) |
| HTTP | GET / POST /api/dsh-local-long-horizon |
| UI | Rightbar Long horizon + composer dock chip |
The pane auto-follows the chat’s workspace folder. Use Track folder only to override; Use chat workspace resets.
Dual-face package (same bar as gpu-monitor / slot-health):
lib/index.js, ESM) — vault service, agent tools, HTTP route.lib/client.js, CJS ModuleLoader factory) — rightbar pane + dock
chip; polls the Host JSON route.cordis.patch.yml + dsh.bundle / dsh.client in package.json.Presentation is inline styles only (sibling chrome: currentColor, rounded
cards, muted mono ages).
dsh-local-long-horizon/
├── package.json
├── build.mjs
├── cordis.patch.yml
├── media/ # README screenshots
├── src/host/ # vault, tools, route, inject, STATUS.md
├── src/client/ # pane + dock chip
├── src/shared/ # shared types
└── lib/ # built artifacts (required at runtime)
npm test # build + node suite (schema, vault, tools — no GPU)
STATUS.md overwrite is one-way: treat hand-edits as disposable.See CONTRIBUTING.md for setup, layout, and PR expectations.
MIT — see LICENSE.
JavaScript
52.9%
TypeScript
47.1%
DeepSeek Harness plugin: host-owned long-horizon task board for local coding agents. Next≤3, in-flight, done+verify, inject file + STATUS.md + rightbar/dock chip.
JavaScript
0
15 commits
updated Oct 3, 2026
Host-owned long-horizon task status for local coding agents in the DeepSeek Harness web UI.
Soft “keep a STATUS.md” conventions drift: agents invent sections, forget to
update, or burn tokens re-reading files after compaction. This plugin turns that
into a structured vault the Host owns, with validated agent tools, a
tiny inject file for resume, a one-way STATUS.md projection, and a
Long horizon rightbar + composer dock chip for the human.
Related plugins (same dual-face dsh.bundle shape for the web rightbar / dock):
| Plugin | Repo |
|---|---|
| NVIDIA GPU util / VRAM / power | dsh-gpu-monitor-nvml |
| Local LLM endpoint / slot health | dsh-slot-health |
| Agent process monitor | dsh-agent-processes |
This package: dsh-local-long-horizon.
Verified against DeepSeek Harness 0.1.7-rc.2 (dsh web).
dsh web).AGENTS.md is strongly recommended. DeepSeek Harness
injects it into agent instructions; this plugin hooks that seam so the agent
keeps reading the live inject file (snippet below).Light theme, matching the DSH default.
| Pane + chat (mid-run) | Board (fullscreen) |
|---|---|
![]() | ![]() |
| Dock chip (rightbar closed, chat active) |
|---|
![]() |
If images fail to load, the ASCII mock below still conveys the layout.
Long horizon ● Active [ Turn off ]
M4 · agent loop · main · 20s ago
Ship hello CLI + long-horizon dogfood
/home/you/dev/my-project
┌─ Now ─────────────────────────────────────────┐
│ In flight: wire pane smoke: Next / Done … │
│ Next 3 │
│ 1. wire pane smoke: Next / Done … │
│ 2. capture dock chip with rightbar closed │
│ 3. write README install + AGENTS snippet │
├─ Done (recent) ───────────────────────────────┤
│ ✓ verify node hello.js · verify: … · 3h ago │
│ ✓ write hello.js · verify: … · 4h ago │
└───────────────────────────────────────────────┘
DISABLED notice; status_get still works.status_set_inflight; clear with
status_clear_inflight (empty summary is refused).Horizon · …, Horizon · blocked, …). Click to reopen the pane.DeepSeek Harness already discovers project-root AGENTS.md (and related
baselines) and injects them into the agent’s instructions. This plugin does
not replace that seam — it hooks into it.
DSH injects AGENTS.md ──► agent instructions every turn
│
│ (your AGENTS.md says: read the inject file / use status_* tools)
▼
Agent tools ──► Host TaskStatus service ──► JSON vault (~/.dsh/storages/…)
│
├──► <cwd>/STATUS.md (human + git)
└──► <cwd>/.dsh/task-status-inject.md (≤ ~50 tokens)
STATUS.md.AGENTS.md so the harness keeps
pushing the contract into context. That file should tell the agent to treat
.dsh/task-status-inject.md as binding current state (and to update via
status_* tools). The mutable bytes stay in the tiny inject file — not in a
giant static prompt — while AGENTS.md is the stable “glue” DSH already
knows how to inject.When you turn Long horizon ON (status_init, pane “Start tracking”, or
re-enable), the Host auto-ensures that glue: creates a minimal root
AGENTS.md if missing, or appends the ## Long horizon section if the file
exists without it. It never overwrites a richer human AGENTS.md — hand-tune
project-specific rules freely; only the missing section is added.
Without that section, the vault and tools still work, but a fresh agent is more likely to ignore the inject file and fall back to chat memory or read-loops.
AGENTS.md snippet## Long horizon
Before coding, read `.dsh/task-status-inject.md` if present — it is binding
current task state (DeepSeek Harness injects this AGENTS.md; the inject file is
the live board).
Use status_* tools to update Next (≤3), in-flight, done (with verify), and blocked.
Do not invent a parallel STATUS novel; the vault owns truth and STATUS.md is generated.
dsh plugin --profile web add dsh-local-long-horizon
# restart dsh web (or rely on live patch reload), then hard-refresh the browser
dsh plugin --profile web add github:janpauldahlke/dsh-local-long-horizon
git clone https://github.com/janpauldahlke/dsh-local-long-horizon.git
cd dsh-local-long-horizon
npm install && npm run build
dsh plugin --profile web add "$(pwd)"
Restart (or boot) dsh web so the host + client faces load:
env -u DSH_WEB_URL -u DSH_SHELL -u DSH_SESSION_ID dsh web --no-open
Uninstall:
dsh plugin --profile web remove dsh-local-long-horizon
# restart the web instance that had the plugin
No harness file: dependencies — the host registers tools on the live
ctx.tools service provided by dsh.
| Tool | Purpose |
|---|---|
status_init | Create / refresh vault for a cwd; turns Long horizon ON |
status_get | Full structured record |
status_set_next | Replace Next (0–3 strings) |
status_set_inflight | Set in-flight (non-empty summary required) |
status_clear_inflight | Clear in-flight |
status_set_phase | Short phase label |
status_mark_done | Append done (+ optional verify, rotateNext) |
status_block / status_unblock | Blocked reason |
status_set_enabled | ON / OFF |
status_ping | Host health probe |
Default cwd comes from the agent session workspace; pass cwd to override.
| Surface | Path / name |
|---|---|
| Vault | ~/.dsh/storages/dsh-local-long-horizon/<taskId>.json |
| Inject | <cwd>/.dsh/task-status-inject.md |
| Markdown | <cwd>/STATUS.md (overwritten on every mutation) |
| HTTP | GET / POST /api/dsh-local-long-horizon |
| UI | Rightbar Long horizon + composer dock chip |
The pane auto-follows the chat’s workspace folder. Use Track folder only to override; Use chat workspace resets.
Dual-face package (same bar as gpu-monitor / slot-health):
lib/index.js, ESM) — vault service, agent tools, HTTP route.lib/client.js, CJS ModuleLoader factory) — rightbar pane + dock
chip; polls the Host JSON route.cordis.patch.yml + dsh.bundle / dsh.client in package.json.Presentation is inline styles only (sibling chrome: currentColor, rounded
cards, muted mono ages).
dsh-local-long-horizon/
├── package.json
├── build.mjs
├── cordis.patch.yml
├── media/ # README screenshots
├── src/host/ # vault, tools, route, inject, STATUS.md
├── src/client/ # pane + dock chip
├── src/shared/ # shared types
└── lib/ # built artifacts (required at runtime)
npm test # build + node suite (schema, vault, tools — no GPU)
STATUS.md overwrite is one-way: treat hand-edits as disposable.See CONTRIBUTING.md for setup, layout, and PR expectations.
MIT — see LICENSE.
JavaScript
52.9%
TypeScript
47.1%