Introduction¶
DeepSeek Harness (DSH) uses a plugin-based architecture, allowing developers to extend functionality beyond the conversation window. When developing agents or performing multi-turn collaboration, temporary notes within a session—such as DSH’s built-in todo_write—often cannot be persisted and cannot be reused in subsequently created sessions. dsh-task-board aims to solve this pain point: it provides an independent task board for each workspace. All sessions within the workspace share the same data, can be managed in the UI, and allow AI to read and modify it through model tools.
Core Features¶
This plugin provides a task board for each workspace. Its core capabilities include:
* Session integration: Adds a “Tasks” tab at the top of the session, with board and list views.
* Workspace-level sharing: Data is stored in .dsh/tasks.json; sessions in the same workspace read and write the same file, naturally forming sharing.
* AI-readable and manageable: Provides five model tools: task_list, task_get, task_create, task_update, task_delete.
* Multi-session safety: Uses atomic writes and optimistic version locking. When another session modifies the board, the panel prompts or automatically refreshes; stale modifications are rejected and reported, and will not silently overwrite.
* Issue synchronization: Supports syncing tasks to GitHub or GitLab Issues with bidirectional binding.
* Interaction capabilities: Includes right-side drawer editing, filtering (title, description, tags, priority), and keyboard shortcuts (N create, / search, ↑/↓ move, 1-4 switch status).
Installation and Activation¶
Install the plugin package with npm and configure the plugin entry.
- Enter the DSH plugin directory:
cd ~/.dsh/profiles
- Install the plugin package (it is recommended to install all plugins in a single command to avoid clearing other dependencies):
npm install dsh-task-board
- Add
dsh-task-boardtodsh.profile.bundlesin~/.dsh/profiles/<your profile>/package.json, or configure it in that profile’scordis.patch.yml:
- insert:
- id: task-board
name: dsh-task-board
- Restart DSH to make the configuration take effect.
Configuration¶
The plugin does not enable any synchronization feature by default; it must be enabled in the configuration file.
- insert:
- id: task-board
name: dsh-task-board
config:
storePath: .dsh/tasks.json # 相对工作区根目录;写绝对路径可让多个工作区共用一块板
sync:
enabled: true
provider: github # github | gitlab
repo: owner/repo # GitLab 用 group/project 或数字 id
baseUrl: https://gitlab.example.com # 仅私有部署需要
tokenEnv: GITHUB_TOKEN # 默认 GITHUB_TOKEN / GITLAB_TOKEN
labelPrefix: 'dsh:'
| Field | Default | Description |
|---|---|---|
storePath |
.dsh/tasks.json |
Location of the board file. Relative paths are resolved against the workspace root |
sync.enabled |
false |
When disabled, no network connection is used and no network requests are made |
sync.provider |
github |
github or gitlab |
sync.repo |
Not set | Leaving it empty is equivalent to disabling synchronization |
sync.baseUrl |
Official instance | API endpoint for self-hosted deployments |
sync.tokenEnv |
Based on provider | Environment variable name used to read the token |
sync.labelPrefix |
dsh: |
Label prefix used by the plugin for managing states on the remote side |
Credential security: The token is read only from DSH process environment variables when making calls; it is neither written to the configuration file nor to the board file, and is not persisted to disk.
Data Model and Panel Usage¶
Board data is stored in .dsh/tasks.json and is directly editable as JSON. If the file format is corrupted, the panel switches to read-only mode and displays the reason; if a single row of data is invalid, it is downgraded to default values or discarded.
The panel provides the following operations and views:
* Board view: Four columns (To Do / In Progress / Blocked / Done), supporting dragging between columns to change status and drag-within-column reordering.
* List view: Compact single-line rows, suitable for quick scanning.
* Right-side drawer: Used to edit task details (title, status, priority, assignee, tags, Markdown description), with an edit/preview toggle and a non-popup design.
* Filtering: Supports full-text search by title, description, and tags, plus filtering by priority and tags.
* Keyboard shortcuts: N create · / focus search · ↑↓ move selection · 1-4 directly change the status of the selected card · Esc close.
Model Tools¶
The plugin provides the following tools for the model to read and write tasks:
| Tool | Description |
|---|---|
task_list |
Filters by status / tag / assignee / query, returns compact rows, defaults to 50 entries |
task_get |
Gets the full text of a single task |
task_create |
Creates a task, records createdBy as ai, and records the current session |
task_update |
Updates any fields; when status changes to done, completion time is recorded automatically |
task_delete |
Deletes a task |
Note: The Issue synchronization feature does not expose model tools. Pushing to remote Issues is performed manually in the UI by binding each task, avoiding automated noise from the model.
Issue Synchronization Mechanism¶
After enabling synchronization, tasks can be manually bound to Issues.
- Field mapping: Task
titlemaps to Issuetitle;notesmaps tobody(an anchor is appended at the end for reverse binding lookup);status: donemaps to Issueclosed; other statuses map to Issueopenplus specific labels;assigneemaps to Issue Assignees. - Conflict handling: The most recently modified whole record wins; no field-level merge is performed.
- Reverse import: Supports importing from Issues, creating tasks from unbound open Issues.
- Unsynchronized fields:
order,sessionId,createdBy, andidare used for local display only and are not synchronized to the remote side.
Development and Known Boundaries¶
- Build commands:
npm install --legacy-peer-deps
npm run build # node 半边 tsc → lib/,client 半边 esbuild → lib/client.js
npm run typecheck # 两个 tsconfig 都查
npm test # 基于构建产物运行测试
- Known limitations:
- GitLab self-hosted deployment (custom
baseUrl) has not been verified against a real instance due to missing local credentials. - No system prompt injection: the model discovers the board through tool descriptions, and task summaries are not injected every turn (saves tokens).
- Concurrent writes across DSH processes are detected through version comparison; writes within the same process are serialized by the storage layer.
- GitLab self-hosted deployment (custom
Conclusion¶
dsh-task-board provides a persistent, workspace-level task management solution, filling the gap left by DSH’s native todo_write, which cannot be shared across sessions. Whether for manual management or AI assistance, it provides a standardized data model. The project source code is on GitHub and is licensed under the MIT License.