nx-kv 0.15.0 → 0.17.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.
- package/CHANGELOG.md +236 -72
- package/README.md +16 -3
- package/assets/groups.json +16 -20
- package/assets/kv-get/SKILL.md +100 -0
- package/assets/{kv-localget/SKILL.md → kv-get/references/localget.md} +21 -4
- package/assets/{kv-timegoal/references/workflow.md → kv-get/references/timegoal-workflow.md} +1 -1
- package/assets/{kv-timegoal/SKILL.md → kv-get/references/timegoal.md} +14 -1
- package/assets/{kv-waittask/references/kv-waittask-workflow.md → kv-get/references/wait-workflow.md} +11 -2
- package/assets/{kv-waittask/SKILL.md → kv-get/references/waitloop.md} +10 -1
- package/assets/kv-repo/SKILL.md +29 -2
- package/assets/kv-submit/SKILL.md +20 -6
- package/assets/nx-kv/references/repo-registry.md +5 -58
- package/package.json +2 -1
- package/src/core/command-table.js +22 -0
- package/src/core/instruction-template.js +109 -0
- package/src/core/keys.js +32 -0
- package/src/core/localatt.js +137 -0
- package/src/core/zip.js +69 -5
- package/src/modules/bundled/index.js +0 -1
- package/src/modules/docs/docref.js +94 -0
- package/src/modules/docs/index.js +357 -0
- package/src/modules/docs/knowledge.js +348 -0
- package/src/modules/docs/links.js +43 -0
- package/src/modules/docs/paths.js +102 -0
- package/src/modules/docs/refs.js +214 -0
- package/src/modules/docs/repos-bridge.js +11 -0
- package/src/modules/docs/seed.js +147 -0
- package/src/modules/docs/store.js +213 -0
- package/src/modules/file/index.js +9 -6
- package/src/modules/file/service.js +75 -9
- package/src/modules/localtask/board-target.js +161 -0
- package/src/modules/localtask/index.js +283 -27
- package/src/modules/localtask/service.js +318 -359
- package/src/modules/repos/boards.js +278 -22
- package/src/modules/repos/index.js +194 -79
- package/src/modules/repos/keys.js +1 -6
- package/src/modules/repos/remote.js +10 -111
- package/src/modules/repos/service.js +135 -177
- package/src/modules/repos/transfer.js +203 -42
- package/src/modules/setting/index.js +0 -1
- package/src/modules/system/index.js +8 -70
- package/src/modules/system/routes.js +71 -0
- package/src/modules/tasktool/add.js +113 -0
- package/src/modules/tasktool/attach.js +191 -0
- package/src/modules/tasktool/get.js +58 -0
- package/src/modules/tasktool/getloop.js +84 -0
- package/src/modules/tasktool/groupctx.js +85 -0
- package/src/modules/{timegoal → tasktool}/index.js +28 -11
- package/src/modules/tasktool/taskgoal.js +100 -0
- package/src/modules/{timegoal/service.js → tasktool/timegoal.js} +141 -16
- package/src/modules/tasktool/wait.js +510 -0
- package/src/modules/templates/index.js +97 -0
- package/src/modules/templates/service.js +182 -0
- package/src/modules/todo/index.js +0 -1
- package/src/modules/todo/service.js +1 -1
- package/src/runtime/cli.js +37 -17
- package/src/runtime/registry.js +21 -6
- package/src/runtime/spec.js +14 -0
- package/src/shared/frontmatter.js +80 -0
- package/src/shared/wikilink.js +64 -0
- package/src/web/frontend/App.jsx +385 -177
- package/src/web/frontend/app-context.jsx +13 -0
- package/src/web/frontend/components/Introduction/index.jsx +107 -0
- package/src/web/frontend/components/Introduction/rail.jsx +141 -0
- package/src/web/frontend/components/Introduction/style.css +54 -0
- package/src/web/frontend/components/Introduction/use-intro.js +203 -0
- package/src/web/frontend/components/board/member-picker.jsx +252 -0
- package/src/{modules/todo → web/frontend/components/cloud}/editor.jsx +2 -2
- package/src/{modules/todo → web/frontend/components/cloud}/group-popup.jsx +5 -3
- package/src/{modules/todo → web/frontend/components/cloud}/markdown.jsx +1 -1
- package/src/{modules/todo → web/frontend/components/cloud}/upload.js +7 -6
- package/src/web/frontend/components/icons.jsx +10 -2
- package/src/web/frontend/{modules/md-workspace → components/md}/attach-bar.jsx +1 -1
- package/src/web/frontend/components/md/attachments.js +106 -0
- package/src/web/frontend/components/md/doc-outline-rail.jsx +2 -0
- package/src/web/frontend/{modules/md-workspace → components/md}/md-panes.jsx +21 -72
- package/src/web/frontend/components/md/sel-menu.jsx +157 -0
- package/src/web/frontend/components/md/shortcut-sheet.jsx +59 -0
- package/src/web/frontend/components/md/template-editor.jsx +120 -0
- package/src/web/frontend/{modules/md-workspace → components/md}/tool-bar.jsx +7 -10
- package/src/web/frontend/components/migrate/dialog.jsx +51 -55
- package/src/web/frontend/components/migrate/use-move.js +1 -1
- package/src/web/frontend/components/pager.jsx +71 -0
- package/src/web/frontend/components/popup/dismiss.js +32 -0
- package/src/web/frontend/components/popup/index.jsx +270 -0
- package/src/web/frontend/components/popup/style.css +64 -0
- package/src/{modules → web/frontend/components}/repos/transfer-panel.jsx +15 -8
- package/src/web/frontend/components/sidebar/drag.js +34 -73
- package/src/web/frontend/components/sidebar/index.jsx +147 -144
- package/src/web/frontend/components/sidebar/model.js +92 -151
- package/src/web/frontend/components/sidebar/panel.jsx +193 -0
- package/src/web/frontend/components/sidebar/queue-nav.js +40 -0
- package/src/web/frontend/components/sidebar/rescue-fab.jsx +78 -0
- package/src/web/frontend/components/sidebar/row-menu.jsx +34 -138
- package/src/web/frontend/components/sidebar/side-state.js +48 -0
- package/src/web/frontend/components/sidebar/task-children.jsx +36 -7
- package/src/web/frontend/components/toast/index.jsx +40 -0
- package/src/web/frontend/components/toast/style.css +24 -0
- package/src/web/frontend/components/ui.jsx +11 -113
- package/src/web/frontend/main.jsx +2 -1
- package/src/{modules/localtask/board.js → web/frontend/modules/board/board-view.js} +35 -4
- package/src/web/frontend/modules/board/reopen-text.js +67 -0
- package/src/web/frontend/modules/md/doc-store.js +78 -0
- package/src/web/frontend/modules/md/md-parse.js +435 -0
- package/src/web/frontend/modules/md/style.css +1093 -0
- package/src/web/frontend/modules/md/use-templates.js +74 -0
- package/src/{modules/todo/view.jsx → web/frontend/page/cloud/index.jsx} +11 -11
- package/src/web/frontend/page/dir/index.jsx +255 -0
- package/src/web/frontend/page/dir/landing.jsx +184 -0
- package/src/web/frontend/page/dir/task.jsx +806 -0
- package/src/web/frontend/page/doc/index.jsx +411 -0
- package/src/web/frontend/page/group/index.jsx +208 -0
- package/src/web/frontend/page/overview/index.jsx +377 -0
- package/src/web/frontend/page/progress/index.jsx +234 -0
- package/src/{modules/repos/view.jsx → web/frontend/page/repos/index.jsx} +348 -172
- package/src/web/frontend/page/settings/index.jsx +610 -0
- package/src/web/frontend/page/settings/style.css +182 -0
- package/src/web/frontend/page/templates/index.jsx +232 -0
- package/src/web/frontend/panels.jsx +219 -0
- package/src/web/frontend/prefs.js +17 -81
- package/src/web/frontend/registry.js +16 -12
- package/src/web/frontend/style-v2.css +461 -252
- package/src/web/frontend/style.css +145 -142
- package/src/web/frontend/workspace.js +568 -0
- package/src/web/public/assets/Introduction-B4k08SH9.css +1 -0
- package/src/web/public/assets/Introduction-Bbee0iwv.js +1 -0
- package/src/web/public/assets/cloud-B2DmkIpl.js +3 -0
- package/src/web/public/assets/dir-DSN1ss82.js +3 -0
- package/src/web/public/assets/group-BeYvUIyv.js +1 -0
- package/src/web/public/assets/index-CXeLbq_l.css +1 -0
- package/src/web/public/assets/index-Cz51X3aE.js +50 -0
- package/src/web/public/assets/md-edit-ops-Bl0Zx0aJ.js +22 -0
- package/src/web/public/assets/md-history-CN-7pPNs.js +4 -0
- package/src/web/public/assets/member-picker-tkzaY0OF.js +1 -0
- package/src/web/public/assets/overview-BjqVRU69.js +1 -0
- package/src/web/public/assets/progress-CyAVplmW.js +3 -0
- package/src/web/public/assets/reopen-text-DSB76_rF.js +5 -0
- package/src/web/public/assets/repos-BPj9-JSh.js +11 -0
- package/src/web/public/assets/settings-DM779jcF.css +1 -0
- package/src/web/public/assets/settings-DR4KWF-R.js +1 -0
- package/src/web/public/assets/task-DN6Yf0IO.js +2 -0
- package/src/web/public/assets/templates-C2o7jy9W.js +2 -0
- package/src/web/public/assets/upload-D6_jmUnY.js +1 -0
- package/src/web/public/index.html +2 -3
- package/src/modules/localtask/use-cloud-dir.js +0 -74
- package/src/modules/localtask/view-overview.jsx +0 -96
- package/src/modules/repos/detail.jsx +0 -289
- package/src/modules/repos/remote-panel.jsx +0 -218
- package/src/modules/todo/row-menu.jsx +0 -52
- package/src/web/frontend/components/CliHints.jsx +0 -25
- package/src/web/frontend/components/overlay.jsx +0 -74
- package/src/web/frontend/modules/md-workspace/attachments.js +0 -60
- package/src/web/frontend/modules/md-workspace/landing.jsx +0 -30
- package/src/web/frontend/modules/md-workspace/md-parse.js +0 -222
- package/src/web/frontend/modules/md-workspace/progress-panel.jsx +0 -135
- package/src/web/frontend/modules/md-workspace/sel-menu.jsx +0 -65
- package/src/web/frontend/modules/md-workspace/shortcut-sheet.jsx +0 -90
- package/src/web/frontend/modules/md-workspace/style.css +0 -612
- package/src/web/frontend/modules/md-workspace/tabs-store.js +0 -130
- package/src/web/frontend/modules/md-workspace/view.jsx +0 -557
- package/src/web/public/assets/CliHints-ClCH9hMc.js +0 -1
- package/src/web/public/assets/board-BBYw95q0.js +0 -1
- package/src/web/public/assets/detail-DLLVTDvq.js +0 -2
- package/src/web/public/assets/index-DAAwgr0O.js +0 -11
- package/src/web/public/assets/index-DUWdqYzy.css +0 -1
- package/src/web/public/assets/jsx-runtime-DLNB9Qsn.js +0 -1
- package/src/web/public/assets/md-parse-BAglkG0y.js +0 -18
- package/src/web/public/assets/view-BI8jWJma.js +0 -10
- package/src/web/public/assets/view-BVRdFSDe.js +0 -26
- package/src/web/public/assets/view-Bd2rRJ3_.js +0 -3
- package/src/web/public/assets/view-CD0wpGx_.css +0 -1
- package/src/web/public/assets/view-overview-BzsxIsw5.js +0 -1
- /package/assets/{kv-repo-mmx-gitrepo/SKILL.md → kv-repo/references/mmx-gitclone.md} +0 -0
- /package/src/{modules/todo → shared}/attach.js +0 -0
- /package/src/web/frontend/modules/{md-workspace → md}/md-edit-ops.js +0 -0
- /package/src/web/frontend/modules/{md-workspace → md}/md-history.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,104 +2,268 @@
|
|
|
2
2
|
|
|
3
3
|
本文件记录对外可见的变更。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
|
|
4
4
|
|
|
5
|
-
## [0.
|
|
5
|
+
## [0.17.0] - 2026-11-04 参考仓库/看板改独立弹窗 + 弹窗组件收敛 + 本地任务附件落本机仓
|
|
6
6
|
|
|
7
7
|
### Added
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
- **本地任务附件改走本机附件仓(任务 #15 验收反馈)**:面板编辑器贴图/选文件、
|
|
10
|
+
`localtask attach --path` 一律落 `~/.nx-kv/attachments/local/`(不发网,与云端
|
|
11
|
+
图床零关联)——修掉「云端不可达时界面看着有图、agent 领取却 `count: 0`」的
|
|
12
|
+
断链。领取标注本机仓优先(命中即给绝对路径,全命中零网络),云端清单(todo)
|
|
13
|
+
的附件链路保持不变。`file upload --local` 是本机仓的直入口;`/api/file/content`
|
|
14
|
+
本机仓优先、未命中再透传云端(面板预览离线可用)。
|
|
15
|
+
- **简介「补充文档」支持分类标签 tag**(任务 #27):同一份简介下的多篇补充文档
|
|
16
|
+
可以按标签分组,列表里按标签成段,不再靠标题前缀辨认。
|
|
17
17
|
|
|
18
18
|
### Changed
|
|
19
19
|
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
20
|
+
- **参考仓库、看板管理从页面内联区块搬进独立弹窗**(筛选器右侧的两个入口,
|
|
21
|
+
虚线框 + ↗ 与筛选 chip 区分)。它们都是「隔一阵来维护一次」的元信息,平铺在
|
|
22
|
+
页面上会把开发仓库主表顶到两屏之外;主表因此重新回到首屏。
|
|
23
|
+
- 参考仓库弹窗用宽版(1180px):多列表格在 880px 里会将「绑定」列挤成一团;
|
|
24
|
+
表格自己当滚动容器,表头 sticky;名字列允许任意位置折断(带点的长标识原本
|
|
25
|
+
会冲出去盖住远程地址列)。
|
|
26
|
+
- **弹窗栈**:弹窗里再开弹窗(参考仓库 → 绑定 / 克隆)时,Esc 只关最上层;
|
|
27
|
+
导入导出全屏面板(z-30)在捕获阶段接管 Esc 并阻断,不会连带关掉下面的弹窗。
|
|
28
|
+
- 参考表格与看板行的字号提一档(td 13px、行高与留白同步),与新主表一致。
|
|
29
|
+
- **弹窗组件收敛(重构,界面行为不变)**:全站模态卡、确认/输入框、浮层菜单
|
|
30
|
+
收编到 `components/popup/`(Modal / useDialog / PopMenu / RowMenu / useDismiss),
|
|
31
|
+
轻提示收编到 `components/toast/`;此前散在各处的 `.dlg` / 两套互斥的 `.modal`
|
|
32
|
+
定义 / `.mdw-sheet` / `.gmenu` 全部合并为 `.pp-*` 一套。Esc、点外关闭、busy 禁关
|
|
33
|
+
从此只有一个实现,浏览器原生 `alert/confirm/prompt` 清零。
|
|
24
34
|
|
|
25
|
-
###
|
|
35
|
+
### Fixed
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
点侧边栏 → `#/repo/…`,md 渲染、任务列表、md chip 均正常)。
|
|
37
|
+
- **md 编辑器**:点中块时不再跳行高;占位符获得焦点即隐;标题上下留白统一
|
|
38
|
+
(任务 #31)。
|
|
30
39
|
|
|
31
|
-
## [0.
|
|
40
|
+
## [0.16.0] - 2026-11-04 占位成员可救可清 + 仓库页可读性 + 前后端分层解耦
|
|
32
41
|
|
|
33
42
|
### Added
|
|
34
43
|
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
+
- **`board rekey <from> --to <仓库>`**:把组里的**占位 key** 重绑到本机仓库——
|
|
45
|
+
改的是**关系**(`repoKeys`),仓库登记与 key 不动;组内描述(`repoNotes`)与
|
|
46
|
+
组内文档绑定(`repoDocs`)跟着 key 搬。不给 `--board` = 全组一起重绑
|
|
47
|
+
(假 key 是身份问题,只修一个组会留下另一半残局)。目标已在组里则合并。
|
|
48
|
+
- **`board prune [--board] [--all] [--apply]`**:清理占位成员。默认只清**无来源**的
|
|
49
|
+
(没有远程地址 → 克隆不回来 → 永远转不了正),带 remote 的加 `--all` 才清;
|
|
50
|
+
默认预览,`--apply` 落盘。
|
|
51
|
+
- **占位成员带线索**:导入布局时把对方的 `name / remote / desc / type` 记进
|
|
52
|
+
`board.repoHints`,占位从此能显示名字、能「克隆到本地」;`board export` 也不再
|
|
53
|
+
丢掉占位(以前导出的看板比屏幕上少人)。
|
|
44
54
|
|
|
45
55
|
### Changed
|
|
46
56
|
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
- **修掉「用本机仓库接管」的方向错误**:它原先把**本机仓库的 key** 改成占位 key
|
|
58
|
+
(`local/xxx`),真实身份被降级并随导出传播。现在改为重绑组里的 key,登记不动。
|
|
59
|
+
- **仓库页可读性**:正文字号整体提一档(表格 13.5px、描述两行、路径 12px 等宽),
|
|
60
|
+
待初始化区改成「一条占位一张卡」:名字 / 来源组 / key 分层,三个出口
|
|
61
|
+
(绑定到候选仓库 / 克隆 / 移除)+ 批量清理。
|
|
62
|
+
|
|
63
|
+
### Changed(架构:前后端彻底解耦)
|
|
64
|
+
|
|
65
|
+
- **模块声明里不再有 `view`**。`src/modules/<x>/index.js` 曾经写着
|
|
66
|
+
`view: () => import('../../web/frontend/page/x/index.jsx')`——后端声明里出现前端文件
|
|
67
|
+
路径,前端换个目录就要改后端代码;而 `localtask` 那条 `import('./view.jsx')` 指向的
|
|
68
|
+
文件**早就不存在**(没人读它,所以坏了也没报错)。视图现在只在前端
|
|
69
|
+
`web/frontend/registry.js` 登记,后端对自己的面板一无所知。
|
|
70
|
+
- **新增同构层 `src/shared/`**:`attach.js`(附件语法)、`wikilink.js`(双链)、
|
|
71
|
+
`frontmatter.js`(任务头)以前长在后端模块里,却被前端直接 import(12 处)——
|
|
72
|
+
等于浏览器包依赖后端的目录结构。现在只有这一层能同时被两端加载,且**零依赖**
|
|
73
|
+
(不许 `node:`、不许第三方包)。
|
|
74
|
+
- **两个纯前端文件归位**:`localtask/board.js`(显示序 / 队列拆分,7 处前端引用)、
|
|
75
|
+
`localtask/reopen-text.js`(重开正文拼装)没有任何后端消费方,移到
|
|
76
|
+
`web/frontend/modules/board/`;顺手删掉同目录里没人引用的 `use-cloud-dir.js`。
|
|
77
|
+
- **`routes` 改成平台命令**:它描述的是 `ALL_COMMANDS` 本身,只有 runtime 拿得到。
|
|
78
|
+
以前 system 模块为它 `await import('../../runtime/cli.js')`(分层倒置),现在逻辑
|
|
79
|
+
留在 `modules/system/routes.js`(纯函数,表由调用方传入),命令挂在 `cli.js` 的
|
|
80
|
+
BUILTINS 上;`bootstrap` 下发的命令表改读 `core/command-table.js` 的快照。
|
|
81
|
+
- **边界写成机器检查**:`eslint.config.js` 新增 modules→web / modules→runtime /
|
|
82
|
+
shared 零依赖 / 模块内禁 react 四类规则;新增 `tests/unit/layering.test.mjs`,
|
|
83
|
+
解析真实 import 路径比对层次(`web` 只能看到 `web + shared`),并断言后端目录里
|
|
84
|
+
没有 `.jsx`、模块不再声明 `view`。
|
|
85
|
+
|
|
86
|
+
## [0.15.0] - 2026-11-04 工作组两级口径(任务带归属)+ 划线评论与完成验收闭环 + 任务附件 + 队列显示序与分页
|
|
57
87
|
|
|
58
|
-
|
|
59
|
-
自定义 key 往返、改 key 搬关系、同名不冲突。全量:lint 干净 / build 通过 /
|
|
60
|
-
unit 296 / smoke 158。
|
|
88
|
+
### Added
|
|
61
89
|
|
|
62
|
-
|
|
90
|
+
- **任务带工作组归属(--board / --project)**:`localtask add --project <项目>` 让任务
|
|
91
|
+
挂到某个项目上(落点目录由归属项目的登记路径推导,任务正文自动写 frontmatter:
|
|
92
|
+
`board` / `project` + 双方介绍**引用式**字段);`--board <项目组>` 要求归属项目必须是
|
|
93
|
+
该组成员。改文案(`update --text` / `reopen`)不丢 frontmatter;正文自带 frontmatter
|
|
94
|
+
时同样认归属(fail-open:补介绍引用,落点跟到项目队列;显式给了 `--cwd` 就不挪窝)。
|
|
95
|
+
- 领到组内任务时,交付 `instruction` 封装**项目组上下文**:组定位、组介绍、本项目
|
|
96
|
+
位置、兄弟成员角色、组绑定参考文件的可读路径(`task.text` 保持原文)。
|
|
97
|
+
- CLI、HTTP、面板提交、远程清单导入同走一条 `submitTask`(tasktool/add.js)——
|
|
98
|
+
落点判定只此一份实现。
|
|
99
|
+
|
|
100
|
+
- **任务附件**:`localtask attach` 给任务追加附件(--path 上传本机文件,或 --fileId
|
|
101
|
+
追加已上传附件,以 markdown 嵌入正文末尾,与云端 todo 同构);`localtask attachments`
|
|
102
|
+
列出某条任务引用的附件与本地是否已有。`get` / `wait` / `show` 的交付自带附件清单与
|
|
103
|
+
本地绝对路径(自动下载跟随本机设置;标注/同步 fail-open,零附件时载荷不变)。
|
|
104
|
+
面板编辑器贴图即嵌附件(图床优先,图床不可达时退回本地旧路)。
|
|
105
|
+
|
|
106
|
+
- **划线评论 → 直接提交成任务**:MD 工作台划选正文 → 「评论」→ 提问**直接提交**成
|
|
107
|
+
新任务(不再先开编辑页),并**整块继承原任务的 frontmatter**——原任务属于某工作组,
|
|
108
|
+
评论出的新任务也归该组,组面板「本组任务」里能看见。
|
|
109
|
+
|
|
110
|
+
- **完成任务的验收闭环**:任务完成后给出 agent 的完成总结(ack)+ 验收条——
|
|
111
|
+
**通行**(验收通过)/ **重做**(评论模式下带反馈重开,反馈加粗进正文)/
|
|
112
|
+
**提详细问题**(划线评论生成新任务)。重开时正文自动追加**上一轮完成总结**与
|
|
113
|
+
**验收反馈**两段(`modules/localtask/reopen-text.js` 唯一实现:任务页评论框与
|
|
114
|
+
列表页行内重做共用;同一份总结不追加两遍)。
|
|
115
|
+
|
|
116
|
+
- **队列显示序与分页**:显示序改「**未完成(待领取)优先**」——队列数组是追加序,
|
|
117
|
+
新任务会被历史埋底;显示序与队列序分开(`sortTasksForDisplay`,桶内待领取仍按
|
|
118
|
+
队列原序)。侧栏任务子行不再硬截断 12 条(静默丢弃第 13 条起),改**分页**
|
|
119
|
+
(12 条/页);目录任务表同样分页(20 条/页)+「N 待领取 · M 个任务」计数。
|
|
120
|
+
|
|
121
|
+
- **项目组「添加成员」就地选择器**:组面板里就地弹窗——搜索框 + 「项目组」「项目」
|
|
122
|
+
两段列表;项目行加入/移出本组(行尾标出它还在哪些组),项目组行「并入 N」把该组
|
|
123
|
+
成员一并纳入(归属是复制不是移动);不再跳仓库管理页,去掉说明性段落。
|
|
124
|
+
仓库页「成员管理 / 导入仓库」复用同一组件。
|
|
125
|
+
|
|
126
|
+
- **dev-nxkv 项目级 skill**(`.claude/skills/dev-nxkv/`):改本仓库代码的施工单——
|
|
127
|
+
分层边界、模块骨架、action 字段全表、CRUD 契约、注册三步、常见坑与验收命令。
|
|
63
128
|
|
|
64
129
|
### Changed
|
|
65
130
|
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- **左侧的「组」回到侧边栏,但只是显示层(收纳组)**:把项目/项目组摆在一起的
|
|
72
|
-
格子(类似压缩包),存在 `prefs.groups`(浏览器本地),不写 store、不进导出。
|
|
73
|
-
一条资产最多在一个盒子里;解散盒子只拆格子,资产一个都不少。
|
|
74
|
-
与项目组的分工写死在菜单措辞里:**「归入项目组 X」= 数据**(store 里的成员表,
|
|
75
|
-
会导出、跨机可见),**「放进收纳组 X」= 显示**(只影响我怎么看)。
|
|
76
|
-
- **「对齐 remote」从一个仓库一个按钮改成一次扫全部**:判断该换哪条 remote 的依据
|
|
77
|
-
全在数据里(`git remote -v` + 登记采纳值 + key 派生),所以仓库页右上给一个
|
|
78
|
-
「对齐 remote」按钮:一屏列出 remote 现状(可替换 / 无 remote / 登记悬空 / 目录不可用),
|
|
79
|
-
带建议与「全部按建议对齐」。行内的 remote 按钮已去掉。
|
|
80
|
-
**清单只含开发仓库**:参考仓库的 remote 就是它 clone 的来源兼 key,没有「换一条」的
|
|
81
|
-
余地,列进来只是几十行噪音(它们的健康度看 `repo ref check`)。要看参考仓库得
|
|
82
|
-
显式 `--type ref`,两类一起是 `--type all`。
|
|
83
|
-
- 侧边栏点项目组 = 去仓库页筛选到这一组(`#/repos?board=<id>`)——项目组没有独立
|
|
84
|
-
页面,它的成员、组级参考仓库、组内描述都长在仓库页上。
|
|
131
|
+
- **进程界面时间起点改为领取时刻**(原为任务创建时刻)。
|
|
132
|
+
- 面板组任务提交走与 CLI 同一条严格口径(组 → 严格 board+project,成员校验一致)。
|
|
133
|
+
- MD 工作台修正:能打出空格(块↔正文往返不再吃掉尾随空白);标题不再与正文融合进
|
|
134
|
+
同一块;frontmatter 渲染成属性卡;划选不误触编辑。
|
|
135
|
+
- cloud 清单页移除「CLI 等价」提示块。
|
|
85
136
|
|
|
86
137
|
### Fixed
|
|
87
138
|
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
139
|
+
- 项目组「添加成员」的 UI/UX(见上:就地选择器 + 搜索 + 归属继承)。
|
|
140
|
+
|
|
141
|
+
## [0.14.0] - 2026-11-03 wait 收尾指令模板化 + 回调提示词/持续 get 可配多条 + timegoal 面板入口 + 前缀归组改一次性命令 + 删全局默认时长
|
|
142
|
+
|
|
143
|
+
### Changed
|
|
144
|
+
|
|
145
|
+
- **回调提示词可配多条**:`localtask config` 的收尾指令从单条升级为**列表**
|
|
146
|
+
(`settings.taskSuffix` 存 `string[]`,上限 10 条、单条 ≤2000 字)。设置面板
|
|
147
|
+
「模板与任务工具」改为按条编辑(每条一个文本框 + 删除,「添加一条…」追加,
|
|
148
|
+
一次保存整体生效);CLI 新增 `--suffix-add "<指令>"` 追加一条、
|
|
149
|
+
`--suffix-remove <序号>` 按序号删一条(与 `--suffix` / `--no-suffix` / `--reset-suffix`
|
|
150
|
+
互斥)。交付语义不变:多条按空行拼接后统一分流——任一条含 `{{` 整体渲染进
|
|
151
|
+
`instruction` 字段,纯文本仍追加正文末尾;删光 = 关闭。
|
|
152
|
+
- 兼容:旧单条 store(string)读入时整体迁为一列、不拆段;`--suffix "<文本>"`
|
|
153
|
+
仍是「整体替换为这一条」;设置视图同时暴露 `taskSuffix`(多条拼接串,旧消费者
|
|
154
|
+
无感)与 `taskSuffixList`(canonical 列表,UI/CLI 按条编辑用)。
|
|
155
|
+
- **项目级「持续 get」模板同步支持多条**(`getLoop.template` 存 `string[]`,同上限
|
|
156
|
+
规则):设置面板「项目级设置」的持续 get 区块同款按条编辑;交付时多条按空行
|
|
157
|
+
拼接后统一渲染,全部留空 = 用默认模板;`getLoopForCwd` 暴露 `template`(拼接串)
|
|
158
|
+
与 `templateList`(列表)。CLI `--get-loop-template` 仍是「整体替换为这一条」。
|
|
159
|
+
|
|
160
|
+
- **timegoal 时长删除全局默认,只在发布任务时设置**:任务时间目标的时长只在
|
|
161
|
+
`localtask add --duration` 显式给出(发布时校验写法),不再有「发布没给时长就按
|
|
162
|
+
全局默认计时」的兜底。设置面板「模板与任务工具」的「任务时间目标默认时长」输入框
|
|
163
|
+
与 CLI `localtask config --default-duration / --clear-default-duration` 一并移除。
|
|
164
|
+
- ⚠️ 升级注意:存量 store 里的 `settings.defaultDuration` 残留值被忽略(下次落盘
|
|
165
|
+
丢弃);此前靠默认时长隐式带时间目标的任务,现在发布时需显式 `--duration`。
|
|
166
|
+
|
|
167
|
+
- **timegoal 面板入口补齐(发布 + 编辑都可设)**:此前带时长的任务只能 CLI 发布——
|
|
168
|
+
面板任务编辑页没有时间目标入口。现在编辑页标题栏下新增「⏱ 时间目标」行(时长 +
|
|
169
|
+
可选附加要求):草稿提交即带声明(POST `/api/localtasks` 的 `duration`/`goalPrompt`
|
|
170
|
+
字段本来就已支持);**未领取**的任务在编辑页可改/清声明(`localtask update` 新增
|
|
171
|
+
`--duration` / `--goal-prompt` / `--clear-goal`,`--text` 在只改时间目标时可省);
|
|
172
|
+
已领取计时中的任务声明冻结(要调先 reopen 重开)。目录任务表任务标题旁显示
|
|
173
|
+
`⏱ <时长>` 徽标(悬停看附加要求)。
|
|
174
|
+
- 语义约束:`--clear-goal` 与 `--duration` 互斥;只带附加要求不带时长在发布端报错;
|
|
175
|
+
改时长不带 `--goal-prompt` 则保留原附加要求。
|
|
176
|
+
|
|
177
|
+
- **按前缀归组改为一次性命令,废除常驻规则**:原「仓库名以某前缀开头 → 自动算成员」
|
|
178
|
+
的前缀分组规则(`board prefix list/add/remove`、仓库页「按前缀分组」区块)整块移除,
|
|
179
|
+
改为一条一次性命令 `nx-kv board prefix <prefix> [--board <看板>]`——跑一次就把名字
|
|
180
|
+
以 `<prefix>` 开头(大小写不敏感)的已登记仓库**固化成目标看板的显式成员**(与手工
|
|
181
|
+
挂的完全同权);`--board` 省略 = 按前缀名自动建同名看板。成员关系从此只有显式成员
|
|
182
|
+
一个来源;之后新登记的仓库要再跑一次命令。组详情页随之去掉「归属(手动/按前缀)」列。
|
|
183
|
+
- ⚠️ 升级注意:存量 `prefixGroups` 规则不再生效、下次落盘时被丢弃;原来由规则
|
|
184
|
+
动态归组的仓库会回到未分组——需要的话对每个前缀各跑一次 `board prefix` 补回。
|
|
185
|
+
|
|
186
|
+
- **wait 收尾指令模板化(task / waittask / timegoal 融合)**:`localtask config --suffix`
|
|
187
|
+
从「固定追加语」升级为**占位符模板**。含 `{{` 的值在 wait 返回时由服务端渲染成融合
|
|
188
|
+
指令,放进返回载荷的新字段 `instruction`;默认模板 = 该目录 timegoal 状态
|
|
189
|
+
(`〔时间目标「目录名」剩余 X〕`,到点显示「已到点(已超时 X)」)+ 原收尾要求。
|
|
190
|
+
**模板模式下 `task.text` 保持库存原文、不再追加指令**(正文与指令分区打印)。
|
|
191
|
+
- 兼容:纯文本(无 `{{`)维持 v0.x 的 task.text 追加行为(旧 skill 副本不失效);
|
|
192
|
+
`''` 仍 = 关闭;显式存过旧默认文本的 store 需 `localtask config --reset-suffix`
|
|
193
|
+
才拿到新默认模板。
|
|
194
|
+
- 占位符:`{{goal.name}} {{goal.remainingHuman}} {{goal.deadline}} {{goal.prompt}}
|
|
195
|
+
{{task.id}} {{task.text}} {{source}} {{summary}} {{cwd}} {{name}}`;段落
|
|
196
|
+
`{{#goal}}…{{/goal}}`、`{{#task}}…{{/task}}` 上下文缺失时整段消失。渲染是服务端
|
|
197
|
+
**单遍确定性替换**——goal.prompt / task.text 里的 `{{...}}` 逐字保留、绝不二次
|
|
198
|
+
展开(防漂移契约延伸到字符串层)。
|
|
199
|
+
- 新核心模块 `src/core/instruction-template.js`(纯函数、零依赖);模板长度上限
|
|
200
|
+
500 → 2000(渲染产物不设限)。渲染走 `showTimegoal` 只读路径,不写盘、不影响
|
|
201
|
+
`timegoal check` 契约与到点自动收尾(goal_expired)行为。
|
|
202
|
+
- ⚠️ 降级注意:旧版 nx-kv 打开存了新默认模板的 store 会把原始 `{{...}}` 当纯文本
|
|
203
|
+
追加进 task.text(自定义模板超过旧版 500 上限的还会被截断)——请整版升级,
|
|
204
|
+
不要混跑新旧二进制。
|
|
205
|
+
|
|
206
|
+
## [0.13.0] - 2026-10-31 任务模板可配置 + 完成任务可删除 + 无队列仓库可从侧边栏新建任务 + 仓库前缀分组
|
|
92
207
|
|
|
93
208
|
### Added
|
|
94
209
|
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
|
|
100
|
-
-
|
|
101
|
-
|
|
102
|
-
|
|
210
|
+
- **点项目组/项目目录 = 看表格**:
|
|
211
|
+
- 新增**项目组详情**(`#/group/<看板 id>`):组里的**子目录**以表格呈现 ——
|
|
212
|
+
目录 / 路径 / 说明 / 待领取 / 归属(手动 vs 按前缀)。点组行进这里,点表行进该目录。
|
|
213
|
+
- 目录工作台的落地页改成**子任务表**(表格):编号 / 任务 / 状态 / 创建 / 领取 /
|
|
214
|
+
删除。列表把「什么时候建、什么时候被领走」压成一行就丢了,表格才看得到。
|
|
215
|
+
- 侧栏点击语义分开:**点行 = 去看内容**(组 → 组表,目录 → 子任务表),
|
|
216
|
+
**点 chevron = 在树里展开/收起**。以前两者抢同一个点击,展开就没法兼得。
|
|
217
|
+
- **仓库按前缀分组**:「仓库名以 nx 开头 → 归成一类」这类规则现在有了。
|
|
218
|
+
- 规则只改**成员关系**,看板仍是唯一分组载体 —— 侧边栏分组、仓库页看板筛选、
|
|
219
|
+
成员管理全都自动跟着生效,不用各改一遍。
|
|
220
|
+
- 规则存服务端(仓库 store 的 `prefixGroups`),换浏览器/换机一致;
|
|
221
|
+
规则同时记看板 id 与 key(改名不失效、导入换机有兜底)。
|
|
222
|
+
- CLI:`board prefix list` / `board prefix add <前缀> [--board <看板>]` /
|
|
223
|
+
`board prefix remove <前缀>`;HTTP 同构:
|
|
224
|
+
`GET/POST /api/boards/prefix-groups`、`DELETE /api/boards/prefix-groups/:prefix`。
|
|
225
|
+
目标看板留空 = 按前缀名**自动建同名看板**(如 `board prefix add nx`)。
|
|
226
|
+
- 面板:仓库管理页「看板」区新增「按前缀分组」区块(规则 chip + 前缀/看板输入 + 添加)。
|
|
227
|
+
- 删规则时,**规则建的空看板**一并清掉;看板里有手动成员则只删规则、不动看板。
|
|
228
|
+
- **侧边栏分组读成组**:看板的成员行原本混在全局名称序里(组标题与成员不相邻,
|
|
229
|
+
「nx 一类」看着只是一堆缩进行)。现在成员紧跟在自己的看板行下面,未归组的仓库
|
|
230
|
+
排在所有组之后。
|
|
231
|
+
- **任务模板(`template` 命令族 + 面板管理)**:MD 工作台「新建页」的起始正文不再写死。
|
|
232
|
+
- 存 `~/.nx-kv/templates.json`(`NX_KV_TEMPLATES_STORE` 可覆盖);内置一条默认模板
|
|
233
|
+
(不可删),删掉自定义默认后默认回落到内置。
|
|
234
|
+
- 面板:管理入口在**侧边栏设置**(齿轮 → 「任务模板…」弹窗:新增 / 编辑 / 删除 /
|
|
235
|
+
设为默认)。弹窗头部写明新建页默认用哪个模板;每行给正文前几行的等宽预览;
|
|
236
|
+
正文用 **MD 编辑器**(源码 + 实时预览 + 格式工具条 B/I/代码/链接/列表/待办/引用/
|
|
237
|
+
H2/H3,Ctrl/⌘+B/I/E/K,视图可切并排/源码/预览)——模板本身就是 Markdown,
|
|
238
|
+
配置它不该是一个裸 textarea;编辑是行内表单(Ctrl/⌘+Enter 保存);删除带确认。
|
|
239
|
+
落地页「模板 ▾」菜单按模板直接开新页(✓ 标默认)。「新建页」「新任务」一律取
|
|
240
|
+
默认模板正文,API 不可达时退回内置骨架(与旧版行为一致)。设置与工作台共享
|
|
241
|
+
同一份模板数据,改完即时生效。
|
|
242
|
+
- CLI:`template list` / `template add <name> [--body <md> | --body-file <文件> | --body -]`
|
|
243
|
+
`[--setDefault]` / `template update <id> [--name] [--body|--body-file]` /
|
|
244
|
+
`template remove <id>` / `template default <id>`;HTTP 同构:
|
|
245
|
+
`GET/POST /api/templates`、`PATCH /api/templates/:id`、
|
|
246
|
+
`DELETE /api/templates/:id`、`PATCH /api/templates/default`。
|
|
247
|
+
多行 Markdown 正文在 cmd.exe 里塞不进参数,所以给了 `--body-file`(读文件)与
|
|
248
|
+
`--body -`(读标准输入)——这两条**只在 CLI 生效**,HTTP 不暴露读本机文件。
|
|
249
|
+
- **设置齿轮图标画错**:原来的 `gear` 是「圆心 + 八向光线」的日芒/亮度形状,不像设置。
|
|
250
|
+
重画为标准齿轮(中心圆 + 齿圈)。
|
|
251
|
+
- **旧版 serve 进程配新版面板资产时,模板弹窗只说「加载失败」**:路由在进程启动时加载、
|
|
252
|
+
静态资产从磁盘现读——跑着旧进程时新 UI 会拿到 `/api/templates` 404。现在识别出
|
|
253
|
+
「接口不存在」这种版本偏差,弹窗明说「本机面板服务较旧,重启面板后重试」并隐藏
|
|
254
|
+
必然失败的表单,只留「重试」;普通瞬时失败同样给「重试」。
|
|
255
|
+
|
|
256
|
+
### Fixed
|
|
257
|
+
|
|
258
|
+
- **绑定的仓库没有任务队列时,侧边栏展不开也建不了任务**:仓库行的展开键在无队列时
|
|
259
|
+
是空串,渲染判断永远为 false——「+ 新建页」子行根本不出现;直接跳工作台又会因
|
|
260
|
+
找不到队列主题落「目录不存在」。现在点无队列仓库能正常展开,点「新建页」/行菜单
|
|
261
|
+
「打开详情」/收起态 rail 图标会先自动登记该目录为任务队列(幂等、防 prune),再进
|
|
262
|
+
工作台。
|
|
263
|
+
- **本地任务完成后没有任何删除入口**:完成(consumed)的任务此前只能留存在列表里。
|
|
264
|
+
现在两处都可删:落地页列表行悬停出「✕」;打开的页面在工具栏「更多」里有「删除」。
|
|
265
|
+
删除是**软删除**(`deletedAt` 标记,CLI `localtask task restore` 可恢复),已打开的
|
|
266
|
+
页签会随手关闭。
|
|
103
267
|
|
|
104
268
|
## [0.12.1] - 2026-10-30 key 归一化修复 + remote 对齐反馈
|
|
105
269
|
|
package/README.md
CHANGED
|
@@ -268,9 +268,10 @@ nx-kv todo get --ref "旧记录" --topic fr # 或按主题收窄
|
|
|
268
268
|
|
|
269
269
|
```
|
|
270
270
|
src/core/ 零业务语义:kvapi / fileapi(后端客户端) / attachstore(附件本地镜像) / config / errors / fstree
|
|
271
|
+
src/shared/ 同构纯函数:附件语法 / 双链 / frontmatter——Node 与浏览器加载同一份,零依赖
|
|
271
272
|
src/modules/ 功能域:system / setting / auth / group / localtask / timegoal / todo / file / bundled
|
|
272
273
|
src/runtime/ 装配层:registry / spec / cli / api / server
|
|
273
|
-
src/web/frontend/ React
|
|
274
|
+
src/web/frontend/ React 壳(视图全在这里,后端不知道它们的路径)
|
|
274
275
|
assets/nx-kv/ 内置 skill:KV 清单操作手册(远程)
|
|
275
276
|
assets/kv-waittask/ 内置 skill:对话内本地任务接力(等待侧)
|
|
276
277
|
assets/kv-submit/ 内置 skill:需求提炼与委托提交(提交侧)
|
|
@@ -278,8 +279,20 @@ assets/kv-localget/ 内置 skill:领取本目录本地任务(领取
|
|
|
278
279
|
assets/kv-timegoal/ 内置 skill:持续 N 小时任务的时间目标与提示词回显
|
|
279
280
|
```
|
|
280
281
|
|
|
281
|
-
分层由 `eslint.config.js` 的 `no-restricted-imports`
|
|
282
|
-
|
|
282
|
+
分层由 `eslint.config.js` 的 `no-restricted-imports` 与 `tests/unit/layering.test.mjs` 双重强制:
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
core ← 谁都不依赖 shared ← 零依赖(不许 node: / 第三方包)
|
|
286
|
+
modules ← core + shared runtime ← 装配全部 web ← 只有 shared
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**前端够不着 modules / runtime / core**——它消费后端的唯一方式就是 HTTP `/api`。
|
|
290
|
+
`tests/unit/registry.test.mjs` 断言模块目录 ↔ 后端注册表 ↔ 前端视图注册表三方对齐,
|
|
291
|
+
并检查面板里出现的每个 `/api` 路径都真实存在。
|
|
292
|
+
|
|
293
|
+
> **改本仓库代码时**:先看项目级 skill `.claude/skills/dev-nxkv/`——它是一份施工单
|
|
294
|
+
> (分层地图、模块骨架、action 字段全表、CRUD 契约、注册三步、常见坑与验收命令)。
|
|
295
|
+
> 在本仓库里开工的 agent 会自动带上它。
|
|
283
296
|
|
|
284
297
|
## 给 agent 用
|
|
285
298
|
|
package/assets/groups.json
CHANGED
|
@@ -3,32 +3,28 @@
|
|
|
3
3
|
"$comment": "group 名 → skill 名列表的别名表。当前 group 名 ≡ skill 名(一对一);skills 是数组,为「一个 group 含多个 skill」预留。路径恒由 assets/<skills[i]>/ 推导——本文件只做聚合,不是第二条事实源。",
|
|
4
4
|
"groups": {
|
|
5
5
|
"nx-kv": {
|
|
6
|
-
"skills": [
|
|
6
|
+
"skills": [
|
|
7
|
+
"nx-kv"
|
|
8
|
+
],
|
|
7
9
|
"summary": "KV 清单管理中枢主 skill(默认 install 装的就是这个):todo / group / 工作空间(远程,需登录)"
|
|
8
10
|
},
|
|
9
|
-
"kv-
|
|
10
|
-
"skills": [
|
|
11
|
-
|
|
11
|
+
"kv-get": {
|
|
12
|
+
"skills": [
|
|
13
|
+
"kv-get"
|
|
14
|
+
],
|
|
15
|
+
"summary": "领取与完成本机任务:get 领活 / wait 等人回填 / 时间目标 check 门禁 / done 完成 / reopen 按反馈重开"
|
|
12
16
|
},
|
|
13
17
|
"kv-submit": {
|
|
14
|
-
"skills": [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"skills": ["kv-localget"],
|
|
19
|
-
"summary": "领取排给本目录的本地任务 + 队列管理(领取侧)"
|
|
20
|
-
},
|
|
21
|
-
"kv-timegoal": {
|
|
22
|
-
"skills": ["kv-timegoal"],
|
|
23
|
-
"summary": "把「持续运行 N 小时」任务固化到 nx-kv:每轮回显原文提示词防偏移 + 时间到点自动停手"
|
|
18
|
+
"skills": [
|
|
19
|
+
"kv-submit"
|
|
20
|
+
],
|
|
21
|
+
"summary": "总结上下文、提炼用户需求,提交到别的目录队列委托其它 agent(提交侧);可带 --duration 时间目标"
|
|
24
22
|
},
|
|
25
23
|
"kv-repo": {
|
|
26
|
-
"skills": [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"skills": ["kv-repo-mmx-gitrepo"],
|
|
31
|
-
"summary": "mmx 深度搜索并克隆参考仓库——repo ref clone 统一落 gitRepoRoot、remote 为 key 登记绑定,替代散装的 git clone + git.remote 清单流程"
|
|
24
|
+
"skills": [
|
|
25
|
+
"kv-repo"
|
|
26
|
+
],
|
|
27
|
+
"summary": "仓库组识别与关系报告;克隆外源参考仓库并强制读(读参考实现不许只凭搜索摘要)"
|
|
32
28
|
}
|
|
33
29
|
}
|
|
34
30
|
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kv-get
|
|
3
|
+
description: 领取与完成排给本工作目录的本地任务(别人通过 kv-submit 委托的、用户在面板/弹窗排队的,都落在「目录名即主题」的队列里)——用 localtask get 取活(默认直接领;项目开启「持续 get」后自动阻塞等人回填)、localtask wait 挂着等人接力、localtask done 标记完成(带时间目标的任务未到点会被拒绝,提示派 sub agent 重提需求)、localtask reopen 把用户的修改反馈送回队列重新执行。触发词:领取本地任务、看看有没有排给我的任务、本地队列、领取委托任务、拿任务、本目录的任务、排队任务、localtask get、localtask wait、标记完成、任务完成、修改反馈、重新执行、kv-get。凡「主动获取排给本目录的任务」以及「把任务标记完成/按反馈重开」的场景都走本 skill。反例:把需求提交/委托给别的目录用 kv-submit;查本机仓库分组与参考仓库用 kv-repo;操作远程 KV 清单(todo)用 nx-kv。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# kv-get — 领取、执行、完成(领取侧)
|
|
7
|
+
|
|
8
|
+
一个 skill 覆盖本机任务的**完整生命周期**:领 → 干 → 标完成 → 按反馈重开。
|
|
9
|
+
细节拆在 references 里,按需读:
|
|
10
|
+
|
|
11
|
+
- [[localget]] — 领取侧:队列管理、单条查看/编辑/删除/调序
|
|
12
|
+
- [[waitloop]] — 等待侧契约:wait 是本轮最后一步,唯一合法出口是 timeout
|
|
13
|
+
- [[timegoal]] — 时间目标:目录级与**任务级**(领取即计时)的 check 门禁
|
|
14
|
+
- [[wait-workflow]] / [[timegoal-workflow]] — 两套循环的细则
|
|
15
|
+
|
|
16
|
+
## 三个动作,三种语义(别混用)
|
|
17
|
+
|
|
18
|
+
| 动作 | 命令 | 语义 |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| **领活** | `nx-kv localtask get --summary "<现状>" --json` | 队列有任务**立即领走**;没有就**立即返回 timeout**(不阻塞、不开窗)——「暂时没活」是正常业务结果 |
|
|
21
|
+
| **等人** | `nx-kv localtask wait --summary "<现状>" --timeout 30 --json` | 阻塞等人回填;**本轮最后一步**,唯一合法出口是 timeout |
|
|
22
|
+
| **挂着领** | 同上,但项目开启了「持续 get」 | `get` 升级为 waitgoal:无任务自动唤起(打开目录页面 + 项目配置的分钟数),期间用户回填就直接领到;领到的交付文本自带「继续 get 直到超时」的项目模板 |
|
|
23
|
+
|
|
24
|
+
「持续 get」是**项目级**开关(设置面板 → 项目级设置,或 `repo update --get-loop on`),
|
|
25
|
+
默认关闭——默认就是「直接 get」。
|
|
26
|
+
|
|
27
|
+
## 领取到的东西必须读全
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
nx-kv localtask get --summary "<本轮现状>" --json
|
|
31
|
+
# → { status:"ok", task:{id,text,...}, instruction:"…" }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- `task.text` = 任务正文(Markdown),**永远读它**;
|
|
35
|
+
- `instruction` = 服务端渲染的指令段,**有则必读**(与 task.text 一起构成这一轮的根指令):
|
|
36
|
+
- **项目组上下文**(领的是组内仓库时):组定位、组介绍、本项目在组里的位置、兄弟成员的角色、组绑定参考文件的**可读路径**——这些路径是磁盘上的真实文件,需要细节就直接读;
|
|
37
|
+
- **收尾指令**(可配置,默认「本轮最后再 wait 一次」);
|
|
38
|
+
- **任务级时间目标的 check 指令**(见下)。
|
|
39
|
+
|
|
40
|
+
## 时间目标:领取即计时,未到点不许标完成
|
|
41
|
+
|
|
42
|
+
发布方可以给单条任务带时长(`localtask add … --duration 2h`)。这种任务被领取时
|
|
43
|
+
**自动起表**,交付文本里带一条固定指令:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
nx-kv timegoal check --task task:<topicKey>:<taskId> --summary "<本轮现状>" --progress "<进展/下一步>"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
每轮推进先跑一次 check(它会原文回显时间目标提示词,防长对话漂移)。
|
|
50
|
+
**时间未到不能标完成**——`localtask done` 会返回业务结果(不是错误):
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{ "status": "blocked", "reason": "goal_not_reached", "remainingSec": 1830,
|
|
54
|
+
"hint": "时间未到,不能标记完成——请派出 sub agent 重新提出新的需求;到点后…再来标完成" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
此时**不要**硬标完成、也不要自己改时间:按提示**派 sub agent 重新提出新的需求**,
|
|
58
|
+
再继续推进;到点(check 返回 `reached:true`)后再 `done`:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
nx-kv localtask done --id <n> --summary "<完成总结>" --json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
没有时间目标的任务直接 done 即可。目录级 timegoal(`timegoal set --cwd …`)是另一回事:
|
|
65
|
+
它是「这个目录整体要跑多久」的预算,见 [[timegoal]]。
|
|
66
|
+
|
|
67
|
+
## 完成与反馈:闭环的两端
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# 标记完成(完成总结必填——它就是下一轮 agent 能看到的「上轮做了什么」)
|
|
71
|
+
nx-kv localtask done --id <n> --summary "<完成总结>" [--progress "<完成度/下一步>"]
|
|
72
|
+
|
|
73
|
+
# 用户看了结果提修改意见 → 任务回到待领取,agent 可再次领取(执行循环继续)
|
|
74
|
+
nx-kv localtask reopen --id <n> [--text "<改后的正文(Markdown)>"] --json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`reopen` 会作废领取时间(新一轮从**再次领取**开始重新计时)、清掉完成标记,
|
|
78
|
+
但**保留上一轮的完成总结**——下一轮接手时 agent 能看到自己上轮做到哪。
|
|
79
|
+
|
|
80
|
+
## 硬规则
|
|
81
|
+
|
|
82
|
+
1. **同一个目录同一时刻只挂一个 wait**(waiters 是进程内注册表,一个 key 只能有一个)。
|
|
83
|
+
2. **timeout 是业务结果,不是错误**(exit 0):按「暂时没活」收尾,**不要**当失败重试。
|
|
84
|
+
3. **wait 是本轮最后一步**:拿到任务或超时之前,不要提前结束本轮。
|
|
85
|
+
4. **instruction 有则必读**:里面的组上下文/时间目标/收尾要求都是硬约束。
|
|
86
|
+
5. **带时间目标的任务不许提前标完成**——被拒绝就按提示派 sub agent 重提需求。
|
|
87
|
+
6. **同一时刻只挂一个 wait**;`get` 与 `wait` 不要并发跑(都在同一队列上抢任务)。
|
|
88
|
+
|
|
89
|
+
## 队列管理(需要时)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
nx-kv localtask list --json # 全部主题:目录、现状、等待中、待领取数
|
|
93
|
+
nx-kv localtask show --id <n> --json # 查看单条(get 已是「领取」动词)
|
|
94
|
+
nx-kv localtask update --id <n> --text "<新内容>" --json # 改正文;--duration 2h 设时间目标、--clear-goal 清除(仅未领取时可改)
|
|
95
|
+
nx-kv localtask remove --id <n> --json # 软删除(CLI restore 可恢复)
|
|
96
|
+
nx-kv localtask reorder --id <n> --before-id <m> --json
|
|
97
|
+
nx-kv localtask topic remove --cwd "<目录>" # 删整个主题(等待中需 --force)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
以上都不传 `--cwd` 时按进程当前目录定位。
|
|
@@ -16,24 +16,41 @@ description: 领取排给本工作目录的本地任务——别人通过 kv-sub
|
|
|
16
16
|
nx-kv localtask list --json
|
|
17
17
|
# → {topics:[{key,cwd,name,summary,waiting,pending,total,tasks:[...]}], waiting, settings}
|
|
18
18
|
|
|
19
|
-
# 2. 有待领取 →
|
|
20
|
-
nx-kv localtask
|
|
19
|
+
# 2. 有待领取 → 取走最早的一条(默认「直接 get」:队列非空立即返回,不开窗不阻塞)
|
|
20
|
+
nx-kv localtask get --summary "<本轮现状,如:空闲,领取新任务>" --json
|
|
21
21
|
# → {status:"ok", queued:true, task:{id,text,...}}
|
|
22
22
|
|
|
23
|
+
# 2b. 想挂着等活(阻塞等人回填)→ 用 wait(kv-waittask 的循环契约)
|
|
24
|
+
nx-kv localtask wait --summary "<本轮现状>" --timeout 30 --json
|
|
25
|
+
|
|
23
26
|
# 3. 执行 task.text(内容永远读 task.text,id 只是编号),产出落在本目录
|
|
27
|
+
|
|
28
|
+
# 4. 干完标记完成(带时间目标的任务:未到点会被拒绝)
|
|
29
|
+
nx-kv localtask done --id <n> --summary "<完成总结>" --json
|
|
24
30
|
```
|
|
25
31
|
|
|
26
32
|
- `queued:true` = 从队列取到任务,直接执行。
|
|
33
|
+
- 返回可能带 `instruction` 字段(收尾指令模板的渲染结果,默认含该目录 timegoal 的
|
|
34
|
+
剩余预算 +「计划最后再 wait 一次」)——有则必读,与 `task.text` 一起构成这一轮的
|
|
35
|
+
根指令;字段缺席 = 已关闭或本轮没有可渲染内容(如模板只有 goal 段而该目录无目标)。
|
|
27
36
|
- `{status:"timeout"}`(exit 0,不是错误)= 时限内没有新任务:想继续等就再
|
|
28
37
|
wait(挂起等待,期间别人提交的会立刻送达),不想等就收工。
|
|
38
|
+
- **get 的两种形态**:默认「直接 get」(没任务立即返回 timeout,不阻塞);项目在设置
|
|
39
|
+
面板里开启「持续 get(waitgoal)」后,get 变成**阻塞唤起**——自动打开对应目录页面、
|
|
40
|
+
等项目配置的分钟数,期间用户回填就直接领到;领到的交付文本自带「继续 get 直到
|
|
41
|
+
超时」的项目模板(不用自己记循环)。
|
|
42
|
+
- **带时间目标的任务**(发布时 `--duration 2h`):领取即计时,交付的 instruction 里
|
|
43
|
+
带 `timegoal check --task …` 指令;**时间未到不许标记完成**——`localtask done`
|
|
44
|
+
会返回 `{status:"blocked", reason:"goal_not_reached"}`,此时应派出 sub agent
|
|
45
|
+
重新提出新的需求再继续,而不是硬标完成。
|
|
29
46
|
- `--timeout <秒>`:阻塞上限(缺省用页面配置 180 秒,最大 600);「查完就走」
|
|
30
47
|
用短超时,「挂着等活」用长超时。
|
|
31
48
|
|
|
32
49
|
## 队列管理(需要时)
|
|
33
50
|
|
|
34
51
|
```bash
|
|
35
|
-
nx-kv localtask
|
|
36
|
-
nx-kv localtask update --id <n> --text "<新内容>" #
|
|
52
|
+
nx-kv localtask show --id <n> # 查看单条(get 已改为领取动作)
|
|
53
|
+
nx-kv localtask update --id <n> --text "<新内容>" # 改写任务内容;--duration/--clear-goal 改时间目标(仅未领取时)
|
|
37
54
|
nx-kv localtask remove --id <n> # 删除单条
|
|
38
55
|
nx-kv localtask reorder --id <n> --before-id <m> # 调整领取顺序(或 --after-id)
|
|
39
56
|
nx-kv localtask topic remove --cwd "<目录>" # 删除整个主题(等待中需 --force)
|
|
@@ -171,10 +171,23 @@ nx-kv timegoal log --cwd <dir> # 回看每
|
|
|
171
171
|
|
|
172
172
|
**没有依赖关系。** timegoal 只做两件事:算时间、回显提示词原文。
|
|
173
173
|
|
|
174
|
-
- 不调用 `localtask wait
|
|
174
|
+
- 不调用 `localtask wait`:等不到任务是别的事,与是否到点有关
|
|
175
|
+
- **两种 timegoal**:目录级(`--cwd`,与目录一对一)与**任务级**(`--task
|
|
176
|
+
task:<topicKey>:<taskId>`,发布时 `localtask add --duration 2h` 随任务携带,
|
|
177
|
+
**领取即计时**)。任务级的 goal key 会随任务交付的 instruction 一起给你,
|
|
178
|
+
直接照抄执行即可;`timegoal check --task <key> --summary … --progress …` 记日志,
|
|
179
|
+
未到点 `localtask done` 会拒绝标记完成。
|
|
175
180
|
- 不阻塞任何东西:可以同时跑人机接力、派任务给别的 agent、外部 cron
|
|
176
181
|
- 不需要登录 KV 后端:纯本机
|
|
177
182
|
|
|
183
|
+
**与 wait 的融合(只读,单向)**:这个目录挂着 timegoal 时,`localtask wait`
|
|
184
|
+
返回的 `instruction` 字段会带上目标状态(默认模板:`〔时间目标「目录名」剩余 X〕`;
|
|
185
|
+
到点后显示「已到点」)——kv-waittask 循环里的 agent 不调 check 也能看到预算。
|
|
186
|
+
融合是**渲染时只读**(`showTimegoal` 只读路径,不写盘、不写 check 日志、不影响
|
|
187
|
+
计时与到点判定),timegoal 自身的命令族与契约完全不变;`check` 的 prompt 原文
|
|
188
|
+
回显仍是防漂移的唯一正式通道。要到 wait 的 instruction 里携带 prompt 原文,
|
|
189
|
+
用 `localtask config --suffix` 自定义模板并写入 `{{goal.prompt}}`。
|
|
190
|
+
|
|
178
191
|
你可以把它当成一个独立计时器 + 便签本:`set` 把便签写进文件,`check` 读出来
|
|
179
192
|
顺便告诉你还剩多少时间。
|
|
180
193
|
|