dsh-project-kanban
A kanban board inside DeepSeek Harness, integrated with the conversation: the agent writes planning cards via kanban_* tools while you talk, boards are isolated per workspace (project), and data is persisted to disk.
This is an official bundle-format plugin (dsh.bundle declaration + cordis.patch.yml patch layer), installed through the official dsh plugin flow.
Preview

Features
- Agent-driven planning: 9 model tools (
kanban_get,kanban_add_card,kanban_update_card,kanban_delete_card,kanban_move_card,kanban_duplicate_card,kanban_add_column,kanban_rename_column,kanban_delete_column) — the agent writes cards directly during planning and feature breakdown - Per-workspace isolation: each workspace (project) has its own board; agent tools resolve the current workspace automatically
- Disk persistence: every change is written to
kanban-board-<workspaceId>.json— survives page refresh and process restarts - Browser board UI: a "看板" (Kanban) tab in the session header, no extra install
- Labels & colors: 功能 (feature, blue) / 缺陷 (bug, red) / 文档 (docs, green) / 优化 (optimization, orange)
- Priority: high / medium / low with a colored left-edge bar (red / orange / blue)
- Custom card color: any
#rrggbbbackground via the color picker in the edit form - In-column ordering & duplication: ↑ / ↓ buttons (or the
toIndexparameter) reorder cards within a column; one-click duplicate copies label/priority/color - Filtering & search: keyword, label, and priority filters at the top of the board
- Due dates: YYYY-MM-DD deadline with automatic overdue highlighting
- Trash & restore: delete is soft (to the trash); restore or purge from the trash view
- Bulk operations: multi-select cards to move / label / trash in one action
- Stats bar: totals by label, priority, and overdue count
- Drag reordering: drag a card onto another card's position to insert there
- Templates: default / dev / content column presets (adds missing columns only)
- Undo: every write operation is undoable (50-step stack)
- Cross-workspace move: move a card into another project's board
- Session references: cards created by the agent record their source session (click to jump back)
Installation (official flow)
Prerequisites
dshCLI installed (npx @deepseek-ai/dshorpnpm dshfrom source)- Pick the target profile (
webis the default browser profile)
Option 1: from GitHub (recommended)
dsh plugin --profile web add github:StruggleYang/dsh-project-kanban
pnpm ≥ 10 refuses to run a git dependency's prepare script on the first try. Copy the package key pnpm prints into the profile's pnpm-workspace.yaml (at $DSH_HOME/profiles/web/pnpm-workspace.yaml):
allowBuilds:
dsh-project-kanban: true
Then re-run add.
⚠️ Security note:
allowBuildsgrants install-time code execution on your machine. Only allow sources you trust, and consider pinning a commit:dsh plugin --profile web add github:StruggleYang/dsh-project-kanban#<commit-sha>
Option 2: from a local checkout
git clone https://github.com/StruggleYang/dsh-project-kanban.git
dsh plugin --profile web add ./dsh-project-kanban
Option 3: tarball / npm (no build permission needed)
Download the tarball from the GitHub Releases page, or build it locally:
pnpm pack
dsh plugin --profile web add ./dsh-project-kanban-0.3.0.tgz
Published to npm:
dsh plugin --profile web add dsh-project-kanban
Verify and enable
dsh --profile web --dump-config # should end with a "# == dsh-project-kanban" layer
Then restart dsh web (bundle rows load at boot). The 8 kanban_* tools appear in the agent's toolset, and the "看板" tab appears in the session header.
Uninstall
dsh plugin --profile web remove dsh-project-kanban
Removes both the dependency and the layer; board data files are kept on disk.
How it works
- This package is a bundle (npm package + config layer):
package.jsondeclaresdsh.bundle.patch, anddshappends it to the profile'sdsh.profile.bundlesafter@deepseek-ai/dsh-base cordis.patch.ymlinserts thedsh-project-kanbanrow; the Loader resolves it by package name from the profile'snode_modulesindex.jsis a standard Cordis function plugin (export const name/export const inject/export function apply) registering tools viactx.tools.register- The browser half (
lib/client.js) is a hand-written__ModuleLoader__closure bundle (official client-modules format):require('react')resolves via the platform seed word, and the UI talks to the host through a same-originfetchto the/api/kanbanwebServer route - Tools resolve the current workspace via
exec.agent.session.header.cwd→ctx.workspaceRegistry.resolveByPath - Layer order:
@deepseek-ai/dsh-base→ this bundle → the profile'scordis.patch.yml→ user--patchoverlays; later layers override earlier rows by id
Agent tools
| Tool | Purpose |
|---|---|
kanban_get |
Read the current board (optional includeArchived for the trash) |
kanban_add_card |
Add a card (title, note, optional label / priority / color / dueDate) |
kanban_update_card |
Update title / note / label / priority / color / dueDate |
kanban_delete_card |
Soft-delete into the trash |
kanban_restore_card |
Restore a card from the trash |
kanban_purge_card |
Permanently delete a card |
kanban_bulk_delete_cards |
Bulk soft-delete multiple cards |
kanban_move_card |
Move across columns, or reorder within a column via toIndex |
kanban_duplicate_card |
Duplicate a card (carries all fields) |
kanban_move_card_to_workspace |
Move a card to another workspace's board |
kanban_undo |
Undo the last write operation |
kanban_add_column / kanban_rename_column / kanban_delete_column |
Column management |
Testing
Keyless end-to-end verification (no DEEPSEEK_API_KEY needed): creates a temporary profile, installs the local package, boots the web composition, and asserts the tool schemas plus the full HTTP workflow.
bash scripts/verify.sh
Repository layout
dsh-project-kanban/
├── package.json # bundle manifest (dsh.bundle) + client declaration (dsh.client)
├── cordis.patch.yml # patch layer: inserts the kanban plugin row
├── index.js # host plugin: 9 tools + /api/kanban data layer
├── lib/client.js # browser bundle (board UI, official client-modules format)
├── src/host.js # dynamic-plugin host half (historical reference)
├── src/client.js # dynamic-plugin browser half (historical reference)
├── README.md # this file
├── README.zh.md # 中文说明
├── TWEET.md # social post drafts (中文 / English)
└── LICENSE
License
MIT © 2026 StruggleYang
No comments yet. Be the first to write one.