dsh-kanban
> A standalone DeepSeek Harness (DSH) Web GUI plugin that provides only a kanban board, enhanced with per-task model selection.
中文 · DSH plugin ecosystem reference
---
What it is
dsh-kanban is a standalone plugin following the official DSH cordis bundle standard. It is based on the packages/dsh-task-board from dsh-web-ui, with two key changes:
| Change | Description |
|---|---|
| Kanban only | A multi-column board plus task create / move / detail / delete / real execution. Cron scheduling, archiving, and the workspace / agent-preset / permission execution targets were removed to keep the plugin minimal and single-purpose. |
| Per-task model selection | When creating or editing a task, pick a specific model (provider / model) from the model catalog. On execution the plugin applies it via session.selectModel before sending the prompt; blank = session default model. |
Features
- 🗂 Multi-column board: Backlog / To Do / In Progress / Done / Failed, with live status on each card.
- 🚀 Real execution: connect session → apply model → rename session →
session.prompt→ watch for turn completion and settle the card (done / failed). - 🎯 Per-task model selection: the model dropdown is fed by the host-level
llm.modelscatalog (no session needed); applied viasession.selectModelbefore the prompt. - 🧾 Execution history: records the session, start/end times, result and failure reason; jump straight to the session transcript.
- 💾 Local persistence: stored in browser
localStorage(keydsh.kanban.v1), synced across tabs. - 🔌 Zero-invasion mounting: sidebar entry and center-column panel are DOM-injected and self-healing, mutually exclusive with the ssh / task-board panels, with no DSH source changes.
Quick start
Prerequisites
- DSH installed and initialized (
dsh webstarts, and awebprofile exists). - Node.js ≥ 22, pnpm ≥ 10.
Method 1: build locally and link (recommended for development)
# 1. Clone
git clone https://github.com/raosay/dsh-kanban.git
cd dsh-kanban
# 2. Install and build (produces lib/index.js and lib/client.js)
pnpm install
pnpm build
# 3. Link into your web profile (from the cloned directory)
dsh plugin --profile web add link:"$PWD"
# 4. Restart dsh web> dsh plugin add link:<path> adds the plugin under ~/.dsh/profiles/<profile> and appends it to dsh.profile.bundles automatically (the package declares dsh.bundle). The "Kanban" entry appears after restart.
Method 2: install directly from git
dsh plugin --profile web add github:raosay/dsh-kanban> pnpm ≥ 10 blocks the prepare build script of git dependencies by default. If it prints Ignored build scripts: dsh-kanban, add dsh-kanban to allowBuilds in ~/.dsh/profiles/<profile>/pnpm-workspace.yaml and re-run.
Verify
After restarting dsh web:
1. A "Kanban" entry appears below the New Session button in the sidebar. 2. Open the board → "New Task" → the "Model" dropdown is populated (from llm.models, e.g. deepseek-v4-flash · DeepSeek). 3. Run a task with a model selected and watch the card move through In Progress → Done / Failed.
Usage
Create a task
Click "+ New Task" and fill in:
- Title (required): one line describing what to do.
- Description (optional): background, scope, acceptance criteria.
- Run Prompt (optional): the full instruction sent to the agent; blank = the title is used.
- Model (optional): pick a specific model; blank = session default model.
Run a task
From the task detail, click "Run" / "Run Again". Execution drives a real dsh agent session:
1. Connect (reuse a blank session or create one) in the most-recently-used workspace. 2. If the task pins a model, apply it via session.selectModel. 3. Rename the session to the task title. 4. Send the prompt and watch for turn completion, settling the card as Done or Failed.
Task detail
- View description, prompt, model setting and execution history.
- Change the model, move the task to Backlog / To Do.
- Delete (with confirmation), jump to the execution session.
How model selection works
create/edit task at execution
──────────────── ─────────────
llm.models({}) connectWorkspace()
│ (host-level catalog) │
▼ ▼
{ provider, model } session.selectModel({ sessionId,
(persisted on the task) provider, model })
│
▼
session.prompt(...) ← send the prompt- Catalog source:
llm.models(session-independent), returning provider groups and their models. - Apply point:
applyModelinsrc/core/execution.ts, called before the prompt. - Persistence: the model is stored as
{ provider, model }on the task record, inlocalStorage.
> ⚠️ session.selectModel is DSH's only model-selection primitive, and it also records the chosen model as the default (same behavior as the official model picker). Selecting a model for a task therefore also affects the default model of subsequent sessions.
Project layout
dsh-kanban/
├── package.json # manifest: dsh.bundle.patch + dsh.client
├── cordis.patch.yml # bundle patch: inserts the plugin row
├── tsdown.config.ts # tsdown build config
├── tsconfig.json # typecheck config
├── tsconfig.build.json # type-emit config
├── build/ # client bundle preset (reused from dsh-web-ui)
└── src/
├── index.ts # host half: system-prompt announcement
├── invariant.ts # empty invariant
├── mount-once.ts # host single-instance guard
├── core/ # framework-free core (tasks / execution / store / controller / use-cases)
└── client/ # browser half (wiring / sidebar / board-mount / components / styles)Build & development
pnpm install # install dependencies
pnpm build # tsc (types) + tsdown (lib/index.js and lib/client.js)
pnpm run bundle # tsdown only (runtime artifacts, no types)
pnpm run typecheck # typecheck only
pnpm run watch # watch mode> The prepare script is tsdown, so git-installed packages build their runtime artifacts automatically.
Data storage
- Key:
dsh.kanban.v1(browserlocalStorage). - Content: the task array (title, description, prompt, status, timestamps, execution history, model selection).
- Cross-tab: listens for
storageevents.
Limitations
- API cost: running a task drives a real dsh agent session.
- Default-model side effect: see the ⚠️ note above.
- Shell-layout dependency: the panel is DOM-injected and depends on the DSH shell layout (
[class*="centerCol"],[data-pane="conversation"],[class*="logoRow"], …). Shell changes may require updating these selectors. - Overlaps with dsh-task-board: install one or the other to avoid two board entries in the sidebar.
License
[Apache-2.0](./LICENSE)
Acknowledgements
- DeepSeek Harness (DSH) — plugin host and runtime.
- dsh-web-ui — reference for the structure, board UI, and build preset.