dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Native Backlog.md task management for DeepSeek Harness
Native Backlog.md task management inside DeepSeek Harness. The plugin adds a Backlog launcher beside Source Control, renders the task view in Harness's native right-side panel, and starts and manages the official Backlog.md local server for the active workspace.
Backlog.md remains the single source of truth. The plugin never creates a second task database and never writes task Markdown itself.
ListTodo button beside Source Control, with the same dimensions, hovertreatment, tooltip, focus ring, and panel-toggle behaviour. It highlights while Backlog is active.
collapse, fullscreen, focus, and per-session persistence. The chat and agent session stay mounted.
allocates a loopback port, starts backlog browser when needed, waits for health, and connects. Users never run backlog browser by hand.
sessions share it. A server the plugin did not start is never terminated.
change scopes to the panel, which invalidates TanStack Query caches. No duplicate filesystem watcher.
container queries switch at the panel's real content width, never the viewport. Filtering, sorting, selection, expansion, and detail navigation survive the switch.
dependencies, acceptance criteria, Definition of Done, subtasks, archive, and permanent delete.
detected before saving, with explicit reload or merge choices. No silent overwrites.
the message automatically.
appear through the same WebSocket notifications. No agent-side plugin integration is required.
Full table · Narrow panel ·
Task details · Filtered table ·
The launcher sits directly beside Source Control in the composer:
Component · Supported DeepSeek Harness · 0.2.1-rc.3 tested. The plugin uses the public Cordis lifecycle, slots, locale, sidebarRightTabs, sidebarRight, webServer, subprocess, sessions, and workingDirectory services. Backlog.md · 1.55.3 tested; 1.54.0 also verified in the Harness UI. Supported range: >=1.30.0 <2.0.0. Node · 22 or newer on the Host. The shipped plugin has no runtime npm dependencies. OS · macOS, Linux, and Windows where Backlog.md's native CLI runs.
Backlog.md must be installed in the workspace (node_modules/.bin/backlog) or available on PATH. A workspace-local install wins. An initialized Backlog.md project is required; the panel shows the exact backlog init commands when it is missing.
The desktop profile is managed by the Electron application, so the Settings flow is the supported installation path there.
Clone the repository and add it to a profile:
git clone https://github.com/jeremytenjo/dsh-plugin-backlog-md.git
dsh plugin --profile <profile> add ./dsh-plugin-backlog-mdA GitHub spec also works:
dsh plugin --profile <profile> add github:jeremytenjo/dsh-plugin-backlog-mdUse the profile that serves your Harness instance (for example web). The package ships its built client.js, so installation does not need a build step.
PATH:npm install --save-dev backlog.md
# or: pnpm add -D backlog.md
# or: npm install -g backlog.mdbacklog init
# or non-interactive defaults:
backlog init --defaultsThe panel starts the server itself. No backlog browser command is needed.
The Backlog button is registered in the composer's conversation.input.right slot at order 11, immediately after the Source Control trigger (order 10). Clicking it opens the backlog-md tab in the native right sidebar. Clicking again when Backlog is active follows Harness's native panel toggle. The panel is registered with keepMounted: true, so closing and reopening it preserves its state.
The status strip above the list shows a count per status and doubles as the status filter. Search narrows it further; Exclude status, Priority, Milestone, Label, and Assignee live behind the Filters control and combine without reloads. The header shows the filtered count; Clear filters resets everything. Filter, sorting, column visibility, and page size are persisted per workspace in localStorage; no task data is stored there.
Both presentations open in attention order: In Progress first, To Do second, Done last, with the Backlog.md ordinal then natural ID as the tie-breaker inside a status. Clicking a column header overrides that default for the current workspace.
Columns: ID, Title (with subtask progress), Status, Priority, Ordinal, Labels, Assignee, Milestone, Created, and row actions. The table has sticky headers, compact rows, hover and focus states, column sorting, row selection (send selected tasks to the composer), expandable subtasks, and configurable column visibility. At narrower panel widths, fixed-layout columns leave the DOM and become available again as the container grows.
Below the panel container's 640px breakpoint, the compact list shows the title, ID, subtask progress, status, priority, assignee, and relative creation time. It never requires horizontal scroll. Both presentations read the same TanStack Table instance, so switching widths keeps the same filter, sort, selection, expansion, pagination, and detail handlers.
Clicking a row drills into details inside the same panel. The header has a back button, task ID, editable title, and actions. Metadata includes status, priority, assignee, labels, milestone, parent task, dependency links, created and updated dates, and the server ownership/source. Content includes the Markdown description source, acceptance criteria, Definition of Done checklist, subtasks, and dependencies. Comments are shown read-only.
The footer shows unsaved state and provides Save/Cancel. The detail view:
The row menu and detail menu include Send to Chat. It identifies the current Harness session, builds a prompt such as:
Implement TASK-20.4 "Wire real-time sync" using its Backlog.md task definition. Follow AGENTS.md,
update task status as work progresses, and verify all acceptance criteria.and calls the official composer inputActions.setDraft(...). It does not submit. The full prompt is visible and editable before the user sends it.
A coding agent can keep using the Backlog.md CLI or MCP server normally:
ContentStore detects the change.Rapid bursts are debounced. A reconnect requests a full resync so missed events are recovered.
┌──────────────────────────── DeepSeek Harness ────────────────────────────┐
│ │
│ React panel (client.js) Host plugin (index.js) │
│ ┌────────────────────────┐ same-origin ┌──────────────────────────┐ │
│ │ BacklogPanel │ POST /__dsh/ │ BacklogBridge │ │
│ │ TanStack Query │ backlog-md │ session → workspace │ │
│ │ TanStack Table │ ─────────────► │ fixed action allowlist │ │
│ │ shadcn/ui + Tailwind │ ◄───────────── │ typed validation │ │
│ └────────────────────────┘ JSON + long └──────────┬───────────────┘ │
│ │ poll │ │
│ │ ▼ │
│ │ ┌──────────────────────────┐ │
│ │ │ BacklogServerManager │ │
│ │ │ one record per realpath │ │
│ │ │ port allocation │ │
│ │ │ health + version gate │ │
│ │ │ crash budget + cleanup │ │
│ │ └──────────┬───────────────┘ │
│ │ │ spawn │
│ │ ▼ │
│ │ ┌──────────────────────────┐ │
│ │ │ backlog browser │ │
│ │ │ 127.0.0.1:<dynamic port> │ │
│ │ └──────────┬───────────────┘ │
│ │ │ │
│ │ WebSocket notifications │ │
│ │ ┌──────────▼───────────────┐ │
│ └──────────────────────────────│ BacklogEventHub │ │
│ │ ring buffer + long poll │ │
│ └──────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
Backlog.md Markdown files (single source of truth)The browser never sends a filesystem path. It sends the active Harness session ID. The Host resolves the Session with ctx.sessions.get, then the working directory with ctx.workingDirectory.get, canonicalizes it with realpath, and walks up to the nearest Backlog.md project (backlog/config.yml, .backlog/config.yml, backlog.config.yml, or backlog.json). The canonical project root is the server-ownership identity.
BacklogServerManagernet and starts the official CLI:backlog browser --port <port> --no-openuses the actual port.
GET /api/status and GET /api/version until healthy, validating the reported