dsh-agent-board
Kanban task board for DeepSeek Harness sessions: the main agent dispatches tasks to one-shot worker/verifier subagents, with dependency scheduling, file-level exclusion locks, arbitration hold/freeze, milestone progress reporting, and per-task token usage stats.
Install
dsh plugin --profile web add dsh-agent-board
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
Task Board Plugin for DeepSeek Harness




智能看板插件 — agent 团队的持久台账与治理层:把「派发 → 执行 → 验收 → 度量 → 复盘」跑成全链路闭环,每一张卡都是可审计、可度量的长期资产。
定位
dsh-agent-board 是 agent 团队的持久台账与治理层——看板只是界面,内核是「派发 → 执行 → 验收 → 度量 → 复盘」的全链路闭环。 它与「一次性组队、跑完即散」的冲锋型编排器、「人建卡、agent 认领、人逐张验收」的手工看板不是一个代际:
- 持久台账:任务卡是长期资产。完成 / 驳回 / 歧义裁决 / 验收结论 / Token 消耗 / 自测指南,每一笔都落账留痕,看板文件即审计底稿;卸载不删数据,重启自动继承。
- 池化 Worker + 独立 Verifier:执行与验收分离——Worker 负责动手(可续跑,续跑只认新增产出),Verifier 独立复跑验收脚本、以实证为准,不听 Worker 的一面之词。
- 独立验收:
acceptance硬性脚本命令由 Worker 实跑、Verifier 独立复跑;结论分通过 / 驳回并逐条给证据。人只看该看的——风险队列「待你过目」把该亲自确认的卡推到眼前,其余交给机器闭环。 - 可运维度量栈:记分卡(模型表现 / 质量趋势 / 驳回聚类)、运行时健康自检、异常驱动审视(风险队列 / 质量异动告警 / 批次摘要)三层,让成本与质量从「感觉」变成「数字」。
流水线归机器,审计台归人。 我们不造「跑完就散」的冲锋队,也不做「人逐张盯着验收」的手工看板;我们的信念只有三条:验收独立复跑、人只看该看的、数据沉淀成资产。别人负责冲锋,agent-board 负责记账与验收——互补,不对抗。
适合谁 / 什么时候用
- 长期多任务并行:一个会话里几十张卡、有依赖有先后、还不断追加新需求——需要一份不随会话结束而消失的台账,而不是每次重开都从零描述。
- 关心成本与质量趋势:想看清哪个模型在什么场景更省、驳回率在涨还是跌、哪些文件反复成为锁热点——需要记分卡与趋势,而不是拍脑袋。
- 不想逐张审卡:接受「独立复跑 + 风险队列兜底」的治理方式——机器把「该我亲自看」的卡筛出来,其余信任验收闭环。
- 缺一层治理而非缺一个编排器:已有冲锋型的团队 / 编排工具,缺的正是「记账、验收、度量、复盘」这一层——agent-board 补上它。
安装
前置条件
- DeepSeek Harness(dsh)已安装并能正常启动:
dsh --profile web - Node.js ≥ 22(与 dsh 运行时一致)
版本兼容性(先按宿主选插件版本)
宿主 DSH 版本 · 应装插件版本 · 原因
≥ 0.2.0(含 rc) · ≥ 1.3.0(必须) · 0.2.0 起宿主在启动/安装时强制校验 peerDependencies,区间不含 0.2.0 的包直接拒绝激活(路由不挂载、面板不出现)。1.3.0 声明 ^0.1.7 \ · \ · 0.2.0-rc.2 \ · \ · ^0.2.0——注意 semver 预发布不命中宽区间,0.2.0-rc.2 必须显式枚举。运行时 API(subagents/systemPrompt/agents/uiWorkspace.openSession/sessions/v4 日志格式)在 0.2.0 全部兼容,已过 0.2.0-rc.2 实测(E2E 23+8 断言全绿)
0.1.7 ~ 0.1.7-x(含 rc) · ≥ 1.2.2(必须) · 0.1.7 会话日志升级为 format v4:插件消息 source.kind 必须是生产者自有 kind。1.2.1 及更早会在任务完成/阻塞回执落盘时抛 SessionFormatError: format v4 message requires a producer-owned source kind,并连带使主窗口当前轮次失败(表现为「本轮运行失败」);同时「跳转会话」因宿主移除 sessions.open 而失效(控制台 sessionsSvc.open is not a function),卡片活动心跳读不到 v4 日志(session.v4.jsonl.zstd)
0.1.5-rc.1 ~ 0.1.6 · ≤ 1.2.1 · 1.2.2 起按 0.1.7 协议编写(v4 source kind、uiWorkspace.openSession 跳转),旧宿主未做回归验证,建议停留 1.2.1
当前版本 v1.9.6 已在宿主 0.2.1-rc.5 全量实测:775 断言全绿 + 拆解官/力度路由/健康嗅探/帧活性挂死检测真机 E2E 全链。
dsh plugin --profile web add dsh-agent-board@latest # 0.1.7+/0.2.x 宿主(推荐) dsh plugin --profile web add dsh-agent-board@1.2.1 # 0.1.5/0.1.6 宿主
从 ≤1.2.1 升到 ≥1.2.2 必须重启 DSH(host 端代码在启动时加载;1.2.2 之前的老版本还有一个路由残留 bug:禁用/启用热重载会撞 duplicate exact route,只能重启恢复,1.2.2 已修复)。
从插件市场安装(推荐)
已发布至 npm 官方 registry(dsh-agent-board):
dsh plugin --profile web add dsh-agent-board # 重启 dsh 生效 dsh --profile web
从源码安装(开发/调试)
git clone https://github.com/PPawnsir/task-board-plugin.git dsh plugin --profile web add <本仓库绝对路径>/packages/dsh-agent-board # 重启 dsh
验证安装
1. 启动日志无 plugin tree failed to load
2. 打开任意会话,标题栏出现 智能看板 按钮(Lucide 线性图标)
3. RPC 路由可用:
curl -X POST http://127.0.0.1:3080/dsh-agent-board \
-H "Content-Type: application/json" \
-d '{"method":"get-tasks","args":{"sessionId":"<sessionId>"}}'
返回 JSON 即正常;405 空 body 说明路由未挂载。
升级
# 市场版 dsh plugin --profile web add dsh-agent-board@latest # 源码版 git pull # 两者都需重启 dsh
卸载
dsh plugin --profile web remove dsh-agent-board # 重启 dsh
看板数据存在 ~/.dsh/tasks-<sessionId>.json,卸载不删数据。
- 归属:看板文件按会话分文件,同时在文件里记ownerCwd(创建该看板的会话工作区路径,取不到则省略该字段)——~/.dsh/tasks-*.json每个文件是一块看板,list-boards全局视图可看到本机所有板。
- 重启继承:DSH 重启后同一会话的根 id 可能漂移,此时新 id 没有对应文件——若同工作区(ownerCwd严格相等)存在唯一「原主已不在agents.roots()」的看板,则自动继承:文件重命名为新 id、文件内ownerSession改写为新 id、console.error留一行[task-board] 继承看板 <旧sid> → <新sid>;多个候选一律不自动接管(记一行日志后按空板处理,防误合并,旧板仍可在list-boards全局视图里看到)。
- 写盘保护:落盘走 临时文件+rename 原子写(EPERM/EBUSY 退避重试);瞬时读失败/坏文件隔离后返回的空板禁止回写(防一个"读不到"的瞬间把看板覆成空板),坏文件隔离为 .corrupt-<时间戳> 留档不丢数据。
数据安全
看板数据(~/.dsh/tasks-<sessionId>.json)是本插件唯一的持久化状态,按三层防线保证数据不丢、事故可见:
- 原子写盘(防撕裂写):落盘一律「写临时文件 →
fsync→rename覆盖目标」——rename在同分区是原子的,进程在写盘中途被强杀时磁盘上最多残留一个.tmp残件,看板本体永远不会是截断的半个 JSON。Windows 上rename覆盖已存在目标原生支持(实测直接覆盖成功),仅当目标被并发读句柄/Defender/索引器瞬时占用(EPERM/EBUSY/EACCES/ENOTEMPTY)时做有限退避重试;重试耗尽仍失败则降级「先unlink目标再rename」并留日志——绝不丢整板。 - 腐坏隔离可见化(不再静默):加载时若 JSON 解析失败(撕裂写/重启打断导致文件中部夹杂另一版本残片),坏文件改名
.corrupt-<时间戳>留档隔离(防反复 poison),同时在「架构健康」区亮一条 err 级红条(healthHints)提示「看板数据文件腐坏已隔离,历史在.corrupt-<ts>,可联系恢复」,并向 owner 会话推送通知——数据不丢,也不再静默从空板重启。 - 自动 salvage(截断抢救):隔离前先尝试抢救——从首字节起截到第一个完整 JSON 值(
JSON.parse报错position截断法,与人工恢复同款手法),成功则以抢救出的完整板为底自动写回继续(healthHints红条记「已抢救保留 N 张卡,丢弃撕裂残片」),失败才回退空板。两种情况下原始文件都留档.corrupt-<ts>,可随时人工恢复。
功能总览
核心能力一页速览(★ 为 v1.7.5–1.8.4 新栈;☆ 为 v1.9.0 新栈):
- 看板:六列状态流、拖拽 / 多选批量 / 文本·优先级·标签筛选、归档留档、会话隔离
- 派发:一次性 Worker / 独立 Verifier、依赖调度(DFS 环检测)、touches 文件级排他、可续跑 Worker、Team 托管、spawn 落闸锁内重验(spawnGateOk:claim 占位与落闸决策读同一把锁的同一份快照,terminate/dependsOn 后补 落在 spawn 在途窗口即弃权——竞态与后补依赖双双根治)、高优干预分态(intervene 无活跃 run 时区分「续跑窗口,干预随续跑注入」与「真无 run」,返回体带 state 字段)、建卡派发预警(将自动派发时 lintWarnings 瞬态提示「约 1s 内被领取,想占位请 draft:true」)、宿主 spawn API 双兼容(v0.2.1 宿主把
subagents.start/startContinuable统一重构为startActivation(spec)——能力探测自动选路:新契约按delivery语义分发(continuable=parent结算留言 / 一次性=caller只回 result),Activation 适配旧 run 形状下游零改动;老宿主逐字走旧双路径)+ continuable 结算兜底臂(activation.result在子会话被宿主拆除时落定即接失败结算——rate-limit/模型崩溃的死子不再挂到硬超时) - 智能调度
☆:拆解官工作流(自然语言需求卡 →task_decompose拆解官先调研后提案(outputSch
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::42,最后更新 2026-11-05