dsh-agent-board 1.4.0 → 1.5.1

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.
package/README.md CHANGED
@@ -80,6 +80,9 @@ dsh plugin --profile web remove dsh-agent-board
80
80
  ```
81
81
 
82
82
  > 看板数据存在 `~/.dsh/tasks-<sessionId>.json`,卸载不删数据。
83
+ >
84
+ > - **归属**:看板文件按**会话**分文件,同时在文件里记 `ownerCwd`(创建该看板的会话工作区路径,取不到则省略该字段)——`~/.dsh/tasks-*.json` 每个文件是一块看板,`list-boards` 全局视图可看到本机所有板。
85
+ > - **重启继承**:DSH 重启后同一会话的根 id 可能漂移,此时新 id 没有对应文件——若同工作区(`ownerCwd` 严格相等)存在**唯一**「原主已不在 `agents.roots()`」的看板,则自动继承:文件重命名为新 id、文件内 `ownerSession` 改写为新 id、`console.error` 留一行 `[task-board] 继承看板 <旧sid> → <新sid>`;**多个候选一律不自动接管**(记一行日志后按空板处理,防误合并,旧板仍可在 `list-boards` 全局视图里看到)。
83
86
 
84
87
  ## 功能总览
85
88
 
@@ -93,6 +96,20 @@ dsh plugin --profile web remove dsh-agent-board
93
96
  - Esc 逐级关闭(详情 → 看板 → 面板)
94
97
  - 全部结构性图标为 Lucide 线性 SVG(`currentColor` 跟随主题,浅深色自适应)
95
98
 
99
+ ### 仪表盘(Token 消耗)
100
+
101
+ - 仪表盘视图新增「Token 消耗」区:本看板累计总量 + 输入 / 输出 / 缓存读(缓存写非零时一并展示)拆分、按模型分布条形图、任务消耗 **Top 8**(标题可点击直达该任务详情);进行中的卡片右上角显示本任务已累计消耗(`⛁ 数字`)
102
+ - 数据来源:每次 Worker/Verifier run 结算时读该 run 的 v4 会话日志(`~/.dsh/sessions/*/<runId>/session.v4.jsonl.zstd`),把 `assistant/message` 事件的 `usage`(`inputTokens` / `outputTokens` / `cacheReadTokens` / `cacheWriteTokens` / `totalTokens`,字段形状以真实日志为准)按 zstd 帧逐帧累加到任务 `usage`(含按模型小计与 `runs` 计数,多轮重跑/驳回重做自动累加),`get-tasks` 再现算 board 级 `usageSummary`(总量 / 按模型 / Top8,不落盘额外表)——**只做展示、不做计费断言**,日志读不到或没有 usage 时一律显示「暂无数据」
103
+
104
+ ### 学习反馈(候选教训信号 → 主窗口沉淀)
105
+
106
+ - **信号源架构(零耦合)**:看板只产「候选教训**信号**」,不做**存储**——不调用任何笔记/记忆工具的 API、不写任何外部文件、也不知道教训最终被存到哪;用不用、存进哪个工具(如 `note_search` / `note_manage`)完全由主窗口 agent 自己决定
107
+ - **自动生成候选**(两处触发):① Verifier 驳回 → 一条 `lesson-candidate` 消息(场景 / 错误做法 / 来源);② 主窗口裁决 Worker 歧义 → 一条 `lesson-candidate` 消息(场景 / 疑问 / 裁决结论)。同一事件按「同时间戳 / 同内容前缀」轻量判重只落一条,且不写 `history` 流转记录(不刷屏)
108
+ - **详情页「沉淀」按钮**:把该条候选教训经 `push-lesson` RPC followup 给主窗口 agent(提示语写明「请用你可用的笔记/记忆工具沉淀,或评估后忽略」),推送成功后按钮变「✅ 已推送」置灰
109
+ - **软召回引导**:Worker prompt 与 Team 模式提示词都会加一句「开工前如环境装有笔记/记忆类工具(如 note_search),先检索相关历史教训再动手」(Team 档另外提醒把检索到的教训写进任务的 `contextNotes`)
110
+ - **开关 `feedbackEnabled`**(⚙️ 设置区「学习反馈」,默认**开**):关掉后不生成候选、prompt 不提软召回、详情页候选卡片与「沉淀」按钮整个不渲染;老看板文件没有该字段 → 读路径自动补 `true`(与升级前行为一致)
111
+ - **两插件完全独立**:`dsh-agent-board` 与笔记类插件(如 `dsh-notes-plugin`)之间没有任何依赖、服务调用或文件直写——看板只发一条 followup 文本,怎么用由主窗口 agent 决定
112
+
96
113
  ### 任务模型
97
114
 
98
115
  ```
@@ -106,7 +123,12 @@ draft → pending → in-progress → verifying → resolved → archived
106
123
  - **管线分档**:`full`(执行+验证)/ `work`(只做不验)/ `direct`(不进池,主窗口直接处理),创建时按规则自动分类、可手动覆盖
107
124
  - **硬性验收**:`acceptance` 字段写验收脚本命令,Worker 必须实际运行、Verifier 必须独立复跑
108
125
  - **文件级排他**:`touches` 声明本任务要改的文件/glob(如 `["src/**", "README.md"]`);进行中的任务持有文件锁,派发器发现候选与活动任务 touches 重叠就跳过本轮(卡片显示 `🔒 等文件释放`,详情页列出在等谁),锁在提交验收/完成后自动释放——避免并行 Worker 改同一批文件互踩。手动「派发」遇到冲突会列出冲突任务,确认后才以 `force` 越权派发
126
+ - **里程碑进展通道**:Worker 每完成一个可验证的里程碑,可调用 `board_report`(`kind: "progress"`,`question` 写一行进展摘要 ≤200 字符)上报——进行中的卡片显示「📈 最近进展 · 相对时间」(覆盖式只留最新一条),详情页消息流保留全部 progress 条目
127
+ - **防表演式汇报**:进展契约只写在 Worker prompt 里、且要求「有实际产物/结论才报」(禁止定时汇报);progress **静默不通知主窗口**(不进回执聚合),也不写 `history` 流转记录,避免刷屏
109
128
  - **子任务**:父子层级 + 上下文继承 + 父任务自动流转 + 级联归档
129
+ - **删除通道(真删,无 undo)**:`delete-task` RPC(卡片 hover 垃圾桶按钮 / 详情页「删除」按钮,均先 `confirm('删除不可恢复,确认删除「标题」?')`)+ `batch-op op='delete'`(多选模式底部「批量删除」,同样 confirm)。状态门禁:**草稿/待办/阻塞可删**;进行中/验证中拒绝并提示先用 `terminate-agent` 终止(避免在跑的 run 变孤儿);已完成/取消引导改用归档(`archive-task`,留档可检索);有**未归档子任务**时拒删(防 `parentId` 悬空破坏父任务自动流转);已归档任务幂等返回 ok。是真删(从 `tasks` 数组移除),因此**不产生 `batch-undo` 撤销快照**(批量条对 delete 不显示「↩️ 撤销」),删除操作在 host 端 `console.error` 留一行日志便于溯源
130
+ - **任务粒度建议**:单任务 **10~30 分钟**可独立完成为甜区;预计超过 30 分钟的大任务先建一张 **epic 父卡**(`pipeline: direct`,不进池派发),再挂若干 10~30 分钟的子任务(`task_create` 传 `parentId=父卡 id`,有先后顺序用 `dependsOn` 串联),子任务全部完成后父卡自动流转(`checkParentAuto`)——`task_create` 工具描述与 Team 模式提示词都写了这条契约
131
+ - **suggestSplit 软提示**:`task_create` / `create-task` 发现描述超 500 字符、或标题/描述命中「全量 / 整体 / 系统级 / 全面 / 重构 / 所有模块 / 整个」等史诗特征词时,返回体附带一行 `suggestSplit` 建议文案(**只提示,不阻断创建与派发**;未命中则不出现该字段,老调用方无感)
110
132
 
111
133
  ### 一次性派发(v74 去池化)
112
134
 
@@ -153,6 +175,7 @@ Team 托管档独有(调度员体验):
153
175
  | 子代理上报 | `board_report` / `board_verdict` |
154
176
 
155
177
  > 管理工具仅主窗口可用(子代理调用会被拒绝);`board_report`/`board_verdict` 是子代理的专用上报通道。
178
+ > `board_report` 的 `kind` 三档:`complete`(交付完成)/ `escalate`(歧义上报等裁决)/ `progress`(里程碑进展,静默可见、不通知)。
156
179
 
157
180
  ## 仓库结构
158
181
 
@@ -161,7 +184,7 @@ Team 托管档独有(调度员体验):
161
184
  │ ├── index.mjs # host 端:IO 编排(工具/RPC/一次性派发引擎接线)
162
185
  │ ├── lib/core.mjs # 纯逻辑核心:状态机/依赖/分类/prompt/解析(无 IO,可单测)
163
186
  │ ├── lib/client.js # client 端(ModuleLoader 包装,图标统一走 ICONS + ic())
164
- │ ├── test/core.test.mjs # 单元测试(node --test,54 例)
187
+ │ ├── test/core.test.mjs # 单元测试(node --test,72 例)
165
188
  │ ├── package.json # dsh.bundle.patch + dsh.client 元数据
166
189
  │ └── cordis.patch.yml # bundle 挂载行
167
190
  └── docs/
@@ -208,7 +231,7 @@ git push --follow-tags # tag 推送触发流水线
208
231
  - **README 单一来源**:本文件(根 README)即唯一来源;发版前在 `packages/dsh-agent-board` 跑一次 `npm run sync-readme` 同步进包(npm 页面展示的是包内 README)
209
232
  - 需在仓库 **Settings → Secrets and variables → Actions** 配置 `NPM_TOKEN`
210
233
  (npm granular access token:bypass 2FA + direct publish)
211
- - 日常 push / PR 有 `test.yml` 跑语法检查 + 54 例单测
234
+ - 日常 push / PR 有 `test.yml` 跑语法检查 + 60 例单测
212
235
  - 本地手动发布仍然可用:`npm publish --registry=https://registry.npmjs.org`(本机默认源是镜像时必须显式指定)
213
236
 
214
237
  ## License