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.

  1. Enter the DSH plugin directory:
    cd ~/.dsh/profiles
  1. 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
  1. Add dsh-task-board to dsh.profile.bundles in ~/.dsh/profiles/<your profile>/package.json, or configure it in that profile’s cordis.patch.yml:
    - insert:
        - id: task-board
          name: dsh-task-board
  1. 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 title maps to Issue title; notes maps to body (an anchor is appended at the end for reverse binding lookup); status: done maps to Issue closed; other statuses map to Issue open plus specific labels; assignee maps 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, and id are 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.

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.