dsh-agent-board 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +175 -46
  2. package/package.json +3 -2
package/README.md CHANGED
@@ -1,77 +1,206 @@
1
- # dsh-agent-board
1
+ # Task Board Plugin for DeepSeek Harness
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/dsh-agent-board.svg)](https://www.npmjs.com/package/dsh-agent-board)
3
+ [![npm](https://img.shields.io/npm/v/dsh-agent-board)](https://www.npmjs.com/package/dsh-agent-board)
4
4
  [![npm downloads](https://img.shields.io/npm/dw/dsh-agent-board.svg)](https://www.npmjs.com/package/dsh-agent-board)
5
5
  [![node](https://img.shields.io/node/v/dsh-agent-board.svg)](https://www.npmjs.com/package/dsh-agent-board)
6
- [![license](https://img.shields.io/npm/l/dsh-agent-board.svg)](https://github.com/PPawnsir/task-board-plugin/blob/main/LICENSE)
6
+ [![license](https://img.shields.io/npm/l/dsh-agent-board)](https://github.com/PPawnsir/task-board-plugin/blob/main/LICENSE)
7
7
  ![category](https://img.shields.io/badge/awesome--dsh--plugin-workflow-blue)
8
8
 
9
- DeepSeek Harness 智能看板 — 让主窗口把编码工作变成可追踪、可验收、可审计的任务,而不是一段做完就散的对话。
10
-
11
- ## 背景与动机
12
-
13
- 直接在会话里让 agent 干活,随着任务变多变复杂,会遇到四个典型问题:
14
-
15
- 1. **长任务挤占对话** —— 一个改半小时的任务会让主窗口在这期间既不能干别的,也无法并行处理其他请求;多个任务只能排队串行。
16
- 2. **干完没有验收** —— agent 说"完成了"就是完成了,改动是否真的可跑、是否满足要求,没有第二双眼睛独立复核过。
17
- 3. **上下文反复调研** —— 每个新任务都从零读代码、查约定,主窗口调研过的结论和读过的文件无法带给执行者,时间都花在重复调研上。
18
- 4. **过程不可见、结果不可审计** —— 任务散落在对话流里:谁做的、卡在哪、被驳回过几次、为什么这么做,事后无从回溯。
19
-
20
- 看板针对这四点给出机制化的解法:
21
-
22
- | 问题 | 解法 |
23
- | --- | --- |
24
- | 挤占对话 | 每个任务派发给**一次性 Worker 子代理**独立执行,主窗口保持可交互;任务之间依赖调度、可并行 |
25
- | 没有验收 | **独立 Verifier 子代理**复核:Worker 必须实跑自测,Verifier 独立复跑验收脚本后给出结论;驳回自动重派,三次驳回升级人工 |
26
- | 重复调研 | 主窗口调研过的**结论/思路(contextNotes)和读过的文件(contextFiles)**随任务注入子代理的上下文注入区,子代理不必从零开始 |
27
- | 不可见不可审计 | 任务卡全程留痕:状态流转历史、每次验收结论、歧义上报与裁决、干预记录都在任务详情里;Worker/Verifier 会话可从详情页直达回看 |
28
-
29
- ## 核心机制
30
-
31
- - **看板 UI**:会话标题栏「智能看板」按钮打开顶部抽屉(看板 / 团队 / 仪表盘三视图),拖拽流转,多选批量操作(带一步撤销),筛选(文本/优先级/标签)
32
- - **任务模型**:draft → pending → in-progress → verifying → resolved → archived,含 blocked/cancelled;优先级、标签、依赖(DFS 环检测)、流水线分档(full 执行+验证 / work 只做不验 / direct 主窗口直办)
33
- - **一次性派发**:每个任务 spawn 一个一次性子代理,做完即销毁——无常驻池、无状态残留;孤儿回收 + 看门狗卡死标记(不自动杀,裁决权在主窗口/用户)
34
- - **Team 模式**:开启后向主窗口注入提示词引导(实质性改动建议走看板派发,不硬拦截);Worker 遇到歧义上报主窗口裁决(任何模式都通知);任务完成/阻塞时主窗口收到批量聚合回执(等空闲再发,不打断对话)
35
- - **异构模型**:Worker/Verifier 均可下拉配置不同模型(避免同源盲点),默认空 = 继承父级模型;模型故障自动熔断回退父级
36
- - **手动/自动模式**:自动模式看板自动调度派发;手动模式主窗口自行 claim,详情页可「派发 / 派发验收」手动触发
9
+ 智能看板插件 — Agent 自主任务驱动开发:看板管理 + 一次性 Worker/Verifier 派发 + 依赖调度 + Team 模式。
37
10
 
38
11
  ## 安装
39
12
 
40
- > 宿主要求:Node ≥ 22;DSH ≥ `0.1.5-rc.1`(已通过 `peerDependencies` 声明,含预发布分支的版本范围见 package.json)
13
+ ### 前置条件
14
+
15
+ - DeepSeek Harness(dsh)已安装并能正常启动:`dsh --profile web`
16
+ - Node.js ≥ 22(与 dsh 运行时一致)
41
17
 
42
18
  ### 版本兼容性(先按宿主选插件版本)
43
19
 
44
20
  | 宿主 DSH 版本 | 应装插件版本 | 原因 |
45
21
  | --- | --- | --- |
46
- | **≥ 0.1.7**(含 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`) |
22
+ | **≥ 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 断言全绿) |
23
+ | **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`) |
47
24
  | 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 |
48
25
 
49
- 指定版本安装:
50
-
51
26
  ```sh
52
- dsh plugin --profile web add dsh-agent-board@1.2.2 # 0.1.7+ 宿主
53
- dsh plugin --profile web add dsh-agent-board@1.2.1 # 0.1.5/0.1.6 宿主
27
+ dsh plugin --profile web add dsh-agent-board@latest # 0.1.7+/0.2.x 宿主(推荐)
28
+ dsh plugin --profile web add dsh-agent-board@1.2.1 # 0.1.5/0.1.6 宿主
54
29
  ```
55
30
 
56
31
  > 从 ≤1.2.1 升到 ≥1.2.2 必须重启 DSH(host 端代码在启动时加载;1.2.2 之前的老版本还有一个路由残留 bug:禁用/启用热重载会撞 `duplicate exact route`,只能重启恢复,1.2.2 已修复)。
57
32
 
33
+ ### 从插件市场安装(推荐)
34
+
35
+ 已发布至 npm 官方 registry([dsh-agent-board](https://www.npmjs.com/package/dsh-agent-board)):
36
+
58
37
  ```sh
59
38
  dsh plugin --profile web add dsh-agent-board
39
+ # 重启 dsh 生效
40
+ dsh --profile web
41
+ ```
42
+
43
+ ### 从源码安装(开发/调试)
44
+
45
+ ```sh
46
+ git clone https://github.com/PPawnsir/task-board-plugin.git
47
+ dsh plugin --profile web add <本仓库绝对路径>/packages/dsh-agent-board
48
+ # 重启 dsh
60
49
  ```
61
50
 
62
- 重启 DSH 后生效。数据存于 `~/.dsh/tasks-<sessionId>.json`,卸载不删数据。
51
+ ### 验证安装
63
52
 
64
- ## 升级
53
+ 1. 启动日志无 `plugin tree failed to load`
54
+ 2. 打开任意会话,标题栏出现 **智能看板** 按钮(Lucide 线性图标)
55
+ 3. RPC 路由可用:
65
56
 
66
57
  ```sh
58
+ curl -X POST http://127.0.0.1:3080/dsh-agent-board \
59
+ -H "Content-Type: application/json" \
60
+ -d '{"method":"get-tasks","args":{"sessionId":"<sessionId>"}}'
61
+ ```
62
+
63
+ 返回 JSON 即正常;405 空 body 说明路由未挂载。
64
+
65
+ ### 升级
66
+
67
+ ```sh
68
+ # 市场版
67
69
  dsh plugin --profile web add dsh-agent-board@latest
68
- # 重启 DSH
70
+ # 源码版
71
+ git pull
72
+ # 两者都需重启 dsh
69
73
  ```
70
74
 
71
- ## 源码与文档
75
+ ### 卸载
76
+
77
+ ```sh
78
+ dsh plugin --profile web remove dsh-agent-board
79
+ # 重启 dsh
80
+ ```
81
+
82
+ > 看板数据存在 `~/.dsh/tasks-<sessionId>.json`,卸载不删数据。
83
+
84
+ ## 功能总览
85
+
86
+ ### 看板 UI
87
+
88
+ - 会话标题栏「智能看板」按钮 → 顶部抽屉面板(看板 / 团队 / 仪表盘三视图)
89
+ - 六列状态流:草稿 → 待办 → 进行中 → 验证中 → 已完成 → 阻塞
90
+ - 拖拽流转、多选批量操作(带一步撤销)、文本/优先级/标签筛选
91
+ - 归档区:时间倒序 + 排序选择器 + 纵向滚动
92
+ - Esc 逐级关闭(详情 → 看板 → 面板)
93
+ - 全部结构性图标为 Lucide 线性 SVG(`currentColor` 跟随主题,浅深色自适应)
94
+
95
+ ### 任务模型
96
+
97
+ ```
98
+ draft → pending → in-progress → verifying → resolved → archived
99
+ ↓ ↑
100
+ blocked ←────── reject
101
+ ```
102
+
103
+ - **草稿态(draft)**:创建时可先进草稿,补全描述/依赖后再发布,杜绝"半成品被派发"
104
+ - **依赖调度**:`dependsOn` 声明依赖(DFS 环检测),依赖全部完成后才会被派发,串行链路自动编排
105
+ - **管线分档**:`full`(执行+验证)/ `work`(只做不验)/ `direct`(不进池,主窗口直接处理),创建时按规则自动分类、可手动覆盖
106
+ - **硬性验收**:`acceptance` 字段写验收脚本命令,Worker 必须实际运行、Verifier 必须独立复跑
107
+ - **子任务**:父子层级 + 上下文继承 + 父任务自动流转 + 级联归档
108
+
109
+ ### 一次性派发(v74 去池化)
110
+
111
+ - 每个任务 spawn 一个**一次性子代理**(Worker/Verifier),上下文全量注入 prompt,做完即销毁——无常驻池、无池化状态残留
112
+ - **Worker/Verifier 均可配置异构模型**(⚙️ 弹出层下拉选择,空 = 继承父级),避免同源盲点;模型故障自动熔断回退父级模型
113
+ - 孤儿回收:子代理 run 结束/丢失超 2 分钟 → 任务自动回待办重派
114
+ - 看门狗:运行超时且事件流停滞 → 标记"疑似卡死"(不自动杀,裁决权交主窗口/用户)
115
+ - 歧义上报:Worker 遇到歧义不猜测,上报等主窗口裁决(任何模式下都通知);裁决后新 Worker 携带裁决答案接手
116
+ - 手动派发:详情页「派发 / 派发验收」按钮可随时手动触发单任务派发(auto 模式补派、manual 模式主通道)
117
+ - 会话隔离:看板按会话分桶,多会话互不干扰
118
+
119
+ ### 手动 / 自动派发模式
120
+
121
+ | | 🤖 自动 | 👤 手动 |
122
+ |---|---|---|
123
+ | Worker 派发 | poolCycle 自动调度(并发上限可配) | 主窗口自行 claim 处理,或详情页手动「派发」 |
124
+ | Verifier 派发 | 自动 | **自动**(主窗口手动做完的 full 档任务也会自动验收) |
125
+ | 孤儿回收 | 开启 | 开启 |
126
+
127
+ Team 模式开启时强制自动派发(防止"引导派发 + 手动模式"死锁组合)。
128
+
129
+ ### Team 模式
130
+
131
+ 开启后(Team 开关):
132
+ - 主窗口 system prompt 注入派发引导(提示词层面建议实质性改动走看板,不硬拦截)
133
+ - 引导含**上下文书写提示**:子代理是全新会话、无会话记忆,description 写不够会自行调研跑偏
134
+ - Worker 歧义自动上报主窗口聊天流,等待裁决
135
+ - 任务完成/阻塞时主窗口收到**批量聚合回执**(45s 窗口或满 5 条聚合,等主窗口空闲再发,不打断对话)
136
+
137
+ ## 13 个 Agent 工具
138
+
139
+ | 类别 | 工具 |
140
+ |---|---|
141
+ | 任务管理 | `task_create` / `task_list` / `task_context` / `task_update` / `task_claim` / `task_resolve` / `task_verify` / `task_archive` |
142
+ | 池治理 | `task_terminate` / `task_intervene` / `task_arbitrate` |
143
+ | 子代理上报 | `board_report` / `board_verdict` |
144
+
145
+ > 管理工具仅主窗口可用(子代理调用会被拒绝);`board_report`/`board_verdict` 是子代理的专用上报通道。
146
+
147
+ ## 仓库结构
148
+
149
+ ```
150
+ └── packages/dsh-agent-board/ # 插件全部源码(直接维护,无构建步骤)
151
+ │ ├── index.mjs # host 端:IO 编排(工具/RPC/一次性派发引擎接线)
152
+ │ ├── lib/core.mjs # 纯逻辑核心:状态机/依赖/分类/prompt/解析(无 IO,可单测)
153
+ │ ├── lib/client.js # client 端(ModuleLoader 包装,图标统一走 ICONS + ic())
154
+ │ ├── test/core.test.mjs # 单元测试(node --test,30 例)
155
+ │ ├── package.json # dsh.bundle.patch + dsh.client 元数据
156
+ │ └── cordis.patch.yml # bundle 挂载行
157
+ └── docs/
158
+ ├── PRD.md # 产品需求文档
159
+ ├── PACKAGING.md # 打包/安装踩坑记录(link 依赖、单例隔离等)
160
+ ├── icon-style-guide.md # 图标风格指南(Lucide 线性 SVG + emoji 分界)
161
+ └── REGRESSION-v59.md # 端到端回归测试记录
162
+ ```
163
+
164
+ > v68 起拆除了"动态源码 → 静态包"的转换层(build-pkg.cjs):插件已稳定,
165
+ > 双形态维护的复杂度大于收益,包内文件即唯一源码,改完重启 dsh 即生效。
166
+ >
167
+ > v74 起去池化(一次性派发)+ 纯逻辑抽到 `lib/core.mjs`,跑
168
+ > `node --test packages/dsh-agent-board/test/` 即可验证状态机/依赖/派发决策,
169
+ > 不用重启 dsh 人肉回归。
170
+
171
+ ## 文档
172
+
173
+ - [docs/PRD.md](docs/PRD.md) — 完整产品需求文档
174
+ - [docs/PACKAGING.md](docs/PACKAGING.md) — 正式安装(Bundle 打包)注意事项
175
+ - [docs/icon-style-guide.md](docs/icon-style-guide.md) — 图标规范
176
+ - [docs/REGRESSION-v59.md](docs/REGRESSION-v59.md) — 回归测试说明
177
+
178
+ ## 发布新版本(维护者)
179
+
180
+ tag 驱动,GitHub Actions 自动发布到 npm(`.github/workflows/publish.yml`)。两种打 tag 方式都支持:
181
+
182
+ **方式 1:命令行**
183
+
184
+ ```sh
185
+ cd packages/dsh-agent-board
186
+ npm version patch # 或 minor / major——改 package.json
187
+ git add -A && git commit -m 'release: vX.Y.Z' && git tag vX.Y.Z
188
+ git push --follow-tags # tag 推送触发流水线
189
+ ```
190
+
191
+ **方式 2:GitHub 网页(Releases 页)**
192
+
193
+ 1. 先把 `packages/dsh-agent-board/package.json` 的 `version` 改成目标版本并合入 main(网页直接编辑即可)
194
+ 2. 仓库页 → **Releases** → **Draft a new release** → **Choose a tag** → 输入 `vX.Y.Z` 选 **Create new tag**(target 选 main)
195
+ 3. 点 **Publish release** —— 触发发布流水线
196
+
197
+ - 流水线会拒绝与 tag 不一致的 `package.json` version(如 tag `v1.0.1` 但包里是 `1.0.0`),防止版本错位
198
+ - **README 单一来源**:本文件(根 README)即唯一来源;发版前在 `packages/dsh-agent-board` 跑一次 `npm run sync-readme` 同步进包(npm 页面展示的是包内 README)
199
+ - 需在仓库 **Settings → Secrets and variables → Actions** 配置 `NPM_TOKEN`
200
+ (npm granular access token:bypass 2FA + direct publish)
201
+ - 日常 push / PR 有 `test.yml` 跑语法检查 + 30 例单测
202
+ - 本地手动发布仍然可用:`npm publish --registry=https://registry.npmjs.org`(本机默认源是镜像时必须显式指定)
203
+
204
+ ## License
72
205
 
73
- - 仓库:<https://github.com/PPawnsir/task-board-plugin>
74
- - 本包即源码,直接维护(v68 起拆除了动态→静态转换层,v74 起去池化)
75
- - 单元测试:`npm test`(node --test,39 例纯逻辑用例)
76
- - E2E 回归:`npm run e2e -- --session <会话id>`(5 场景 21 断言,驱动真实实例)
77
- - 改源码后重启 DSH 生效(host);`lib/client.js` 改动在 dsh ≥0.1.5-rc.2 下同样需重启(client bundle 启动时组合缓存)
206
+ MIT
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "dsh-agent-board",
3
3
  "description": "DeepSeek Harness 智能看板:任务卡片 + 一次性 Worker/Verifier 派发 + 依赖调度 + 管线分档 + Team 模式(歧义上报主窗口裁决)",
4
- "version": "1.2.4",
4
+ "version": "1.3.0",
5
5
  "type": "module",
6
6
  "main": "./index.mjs",
7
7
  "scripts": {
8
8
  "test": "node --test test/core.test.mjs",
9
+ "sync-readme": "node -e \"require('fs').copyFileSync('../../README.md','README.md')\"",
9
10
  "prepublishOnly": "node --check index.mjs && node --check lib/client.js && node --check lib/core.mjs && npm test",
10
11
  "e2e": "node scripts/e2e.cjs"
11
12
  },
@@ -56,7 +57,7 @@
56
57
  },
57
58
  "peerDependencies": {
58
59
  "react": ">=18",
59
- "@deepseek-ai/dsh": ">=0.1.5-rc.1 <0.2.0-0"
60
+ "@deepseek-ai/dsh": "^0.1.7 || 0.2.0-rc.2 || ^0.2.0"
60
61
  },
61
62
  "license": "MIT"
62
63
  }