@skrupellose/code-helper 0.1.0 → 0.1.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 +83 -14
- package/dist/checks.js +2 -1
- package/dist/checks.js.map +1 -1
- package/dist/cli.d.ts +54 -0
- package/dist/cli.js +1181 -141
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +42 -0
- package/dist/completion.js +226 -0
- package/dist/completion.js.map +1 -0
- package/dist/constants.js +14 -7
- package/dist/constants.js.map +1 -1
- package/dist/hooks.d.ts +35 -0
- package/dist/hooks.js +400 -0
- package/dist/hooks.js.map +1 -0
- package/dist/init.d.ts +6 -0
- package/dist/init.js +77 -18
- package/dist/init.js.map +1 -1
- package/dist/skills.d.ts +45 -5
- package/dist/skills.js +300 -21
- package/dist/skills.js.map +1 -1
- package/dist/templates.d.ts +3 -2
- package/dist/templates.js +201 -33
- package/dist/templates.js.map +1 -1
- package/dist/terminal-ui.d.ts +5 -0
- package/dist/terminal-ui.js +21 -4
- package/dist/terminal-ui.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/workflows.js +50 -8
- package/dist/workflows.js.map +1 -1
- package/package.json +1 -1
package/dist/templates.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export function renderEntryBlock(config) {
|
|
6
6
|
const enabledRules = [
|
|
7
7
|
config.features.memoryTuning.enabled
|
|
8
|
-
? `- 项目记忆规则优化:整理或更新 \`AGENTS.md\` / \`CLAUDE.md\` 时,读取 \`${config.directories.userRules}/项目记忆规则优化.md\`。`
|
|
8
|
+
? `- 项目记忆规则优化:整理或更新 \`AGENTS.md\` / \`CLAUDE.md\` / \`.github/copilot-instructions.md\` 时,读取 \`${config.directories.userRules}/项目记忆规则优化.md\`。`
|
|
9
9
|
: undefined,
|
|
10
10
|
config.features.planWorkbench.enabled
|
|
11
11
|
? `- 项目计划优化:开始大型需求、迁移、重构或多阶段任务时,读取 \`${config.directories.userRules}/项目计划管理规范.md\`。`
|
|
@@ -19,11 +19,17 @@ export function renderEntryBlock(config) {
|
|
|
19
19
|
config.features.documentArchive.enabled
|
|
20
20
|
? `- 文档归档:功能完成或手动移动到 archive 后,任务视为已结束,读取 \`${config.directories.userRules}/文档归档规范.md\`。`
|
|
21
21
|
: undefined,
|
|
22
|
+
config.features.completionReview.enabled
|
|
23
|
+
? `- 功能完成检查:完成小节点、识别到功能变更、准备最终回复或切换任务前,读取 \`${config.directories.userRules}/功能完成检查规范.md\`,并按需运行 \`npx @skrupellose/code-helper finish\`。`
|
|
24
|
+
: undefined,
|
|
22
25
|
config.features.checks.enabled
|
|
23
26
|
? "- 规则检查:提交或阶段结束前运行 `npx @skrupellose/code-helper check`,确认协作文档结构仍完整。"
|
|
24
27
|
: undefined,
|
|
28
|
+
config.features.agentHooks.enabled
|
|
29
|
+
? "- Agent hooks:需要在 agent 生命周期中提醒完成检查时,参考 `.code-helper/hooks/` 下的 agent hook 模板。"
|
|
30
|
+
: undefined,
|
|
25
31
|
config.features.skillRegistration.enabled
|
|
26
|
-
? "- Skills 管理:需要让 Codex 或
|
|
32
|
+
? "- Skills 管理:需要让 Codex、Claude Code 或 GitHub Copilot 在当前项目自动发现 code-helper skills 时,执行 `npx @skrupellose/code-helper skills register`。"
|
|
27
33
|
: undefined
|
|
28
34
|
].filter((line) => line !== undefined);
|
|
29
35
|
return `## code-helper 协作入口
|
|
@@ -33,6 +39,7 @@ export function renderEntryBlock(config) {
|
|
|
33
39
|
1. 开始新需求、迁移、重构或反馈修复前,先读取本区块索引到的专题规则。
|
|
34
40
|
2. 长期规则写入 \`${config.directories.userRules}/\`,短期过程写入 \`${config.directories.resultDoc}/\`,当前状态记录写入 \`${config.directories.statusDoc}/\`。
|
|
35
41
|
3. 不把一次性调试过程、临时失败细节或大段实现流水写进入口文档。
|
|
42
|
+
4. 主会话只做管理、分配、审阅和结果同步;具体执行任务必须交给子代理。当前 agent 工具没有子代理能力时,先说明限制并等待用户确认,再由主会话执行。
|
|
36
43
|
|
|
37
44
|
### 专题规则索引
|
|
38
45
|
|
|
@@ -43,7 +50,8 @@ ${enabledRules.join("\n")}
|
|
|
43
50
|
- 入口文档只保留轻量索引和核心约束。
|
|
44
51
|
- 专题规则文档必须包含“功能描述 / 调用时机 / 调用入口文件 / 规则”四个小节。
|
|
45
52
|
- 计划、状态、结果和测试文档必须使用中文命名与中文总结。
|
|
46
|
-
-
|
|
53
|
+
- agent 识别到功能变更、项目结构变化、稳定规则变化或小节点完成时,必须主动判断是否需要更新过程文档、询问更新长期记忆、询问归档或继续当前节点。
|
|
54
|
+
- 新功能或重构形成稳定规则后,先询问用户是否更新项目记忆,不自动把短期任务状态写入长期记忆。`;
|
|
47
55
|
}
|
|
48
56
|
/**
|
|
49
57
|
* 返回内置专题规则模板。
|
|
@@ -52,7 +60,8 @@ ${enabledRules.join("\n")}
|
|
|
52
60
|
export function getRuleTemplates(config) {
|
|
53
61
|
const entryFiles = [
|
|
54
62
|
config.entryFiles.agents ? "`AGENTS.md`" : undefined,
|
|
55
|
-
config.entryFiles.claude ? "`CLAUDE.md`" : undefined
|
|
63
|
+
config.entryFiles.claude ? "`CLAUDE.md`" : undefined,
|
|
64
|
+
config.entryFiles.copilot ? "`.github/copilot-instructions.md`" : undefined
|
|
56
65
|
].filter((value) => value !== undefined);
|
|
57
66
|
return [
|
|
58
67
|
{
|
|
@@ -68,7 +77,7 @@ export function getRuleTemplates(config) {
|
|
|
68
77
|
- 用户要求更新记忆、优化记忆、整理 AGENTS.md 或 CLAUDE.md
|
|
69
78
|
- 用户要求同步 AGENTS.md 和 CLAUDE.md
|
|
70
79
|
- 用户要求沉淀规则、把当前变更写入记忆、拆分项目规则文档
|
|
71
|
-
-
|
|
80
|
+
- agent 识别到功能变更、项目结构变化、测试策略变化、发布流程变化或稳定协作规则后
|
|
72
81
|
- 入口文档变长、重复或混入短期任务状态时
|
|
73
82
|
|
|
74
83
|
## 调用入口文件
|
|
@@ -85,10 +94,10 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
85
94
|
6. 入口文档只保留项目概览、核心规则、常用命令、专题规则索引和文档维护规则。
|
|
86
95
|
7. 具体规则默认写入 \`${config.directories.userRules}/\`,不要把完整规范塞进入口文档。
|
|
87
96
|
8. 专题规则文档必须包含“功能描述 / 调用时机 / 调用入口文件 / 规则”四个小节。
|
|
88
|
-
9.
|
|
97
|
+
9. 当 agent 判断可能需要更新记忆,或用户明确要求更新记忆时,先查看当前变更范围,再只更新相关专题文档。
|
|
89
98
|
10. 如新增主题不存在,新增对应专题文档;如入口索引缺失,再更新已存在的入口文件。
|
|
90
99
|
11. 不整份覆盖所有文档,不重复创建相似专题,不把一次性任务状态、临时调试过程、完整命令输出或短期计划写进长期记忆。
|
|
91
|
-
12.
|
|
100
|
+
12. 新功能、小节点或重构形成稳定规则后,agent 必须主动询问用户是否更新记忆;用户确认前不自动写入长期记忆。
|
|
92
101
|
|
|
93
102
|
## 输出格式
|
|
94
103
|
|
|
@@ -130,20 +139,23 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
130
139
|
3. 执行记录写入 \`${config.directories.resultDoc}/<中文功能名>/实施记录.md\`。
|
|
131
140
|
4. 当前状态写入 \`${config.directories.statusDoc}/<中文功能名>-状态.md\`。
|
|
132
141
|
5. 需要人工验收时,手工测试或验收文档写入 \`${config.directories.resultDoc}/<中文功能名>/手工测试.md\`。
|
|
133
|
-
6.
|
|
134
|
-
7.
|
|
135
|
-
8.
|
|
136
|
-
9.
|
|
137
|
-
10.
|
|
138
|
-
11.
|
|
139
|
-
12.
|
|
140
|
-
13.
|
|
141
|
-
14.
|
|
142
|
-
15.
|
|
143
|
-
16.
|
|
144
|
-
17.
|
|
145
|
-
18.
|
|
146
|
-
19.
|
|
142
|
+
6. status-doc 必须包含“当前执行节点”,写清当前子计划、状态、执行目标、进入条件、完成定义和验证方式。
|
|
143
|
+
7. status-doc 必须包含“子计划队列”,按顺序列出基础能力、核心实现、集成验收和完成整理等后续节点。
|
|
144
|
+
8. agent 每次继续任务时先读 status-doc,只推进当前执行节点;完成后同步更新 result-doc、plan-doc 和 status-doc 的下一个执行节点。
|
|
145
|
+
9. 最终计划必须同时具备总纲、分层顺序、模块或能力拆分、依赖与集成计划、验收标准、状态记录、阻塞点、后续检查点和下一步建议。
|
|
146
|
+
10. 生成顺序必须是:目标与约束、P0/P1 总纲、依赖顺序、目录或模块策略、基础阶段计划、核心实现计划、集成验收计划、执行计划。
|
|
147
|
+
11. 不要一开始直接写细表;先给总纲和阶段边界,再逐步细化。
|
|
148
|
+
12. 必须按依赖链路重排顺序,不按需求文档顺序、界面直觉或个人偏好排序。
|
|
149
|
+
13. 推荐依赖顺序:目标和范围、现状和影响面、基础结构、数据模型或接口契约、核心业务规则、关键模块或服务、集成链路、验证方案、发布和交接整理。
|
|
150
|
+
14. 不预设任务一定是前端页面或组件;应按实际需求拆成功能模块、领域能力、接口、命令、任务、作业、页面、组件、数据流或服务单元。
|
|
151
|
+
15. 集成和验收计划必须包含前置依赖、执行任务、验证方式、验收标准、完成定义和后续检查点。
|
|
152
|
+
16. 所有总览表和明细表统一使用“子任务 / 已完成 / 未完成 / 备注”四列。
|
|
153
|
+
17. 备注第一句必须写 \`状态:未开始\`、\`状态:进行中\`、\`状态:部分完成\`、\`状态:被阻塞\` 或 \`状态:已完成\`。
|
|
154
|
+
18. 备注必须说明阻塞点、依赖后续流程、后续检查点,以及是否允许跳过继续推进。
|
|
155
|
+
19. 文档前部必须包含“下一步建议”,明确现在先做什么、下一步接什么、第一个核心模块或能力何时开始、第一个集成或验收环节何时开始、当前默认执行主线是什么。
|
|
156
|
+
20. 验证计划必须按任务类型选择;纯逻辑、数据转换、接口契约、CLI 命令、权限规则和后端服务优先规划可自动执行的单元测试或集成测试。
|
|
157
|
+
21. 页面、可视化、组件交互、视觉和真实浏览器链路只生成严格手工测试文档;工具自身只执行纯逻辑测试。
|
|
158
|
+
22. 文档只有满足可直接推进、可记录阻塞、可恢复上下文、便于后续复查时,才算完整。`
|
|
147
159
|
},
|
|
148
160
|
{
|
|
149
161
|
fileName: "执行结果总结规范.md",
|
|
@@ -226,6 +238,41 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
226
238
|
6. 如果同一中文功能名同时存在 active 文档和 archived 文档,状态为 mixed,必须人工确认是否有遗漏文档需要继续归档。
|
|
227
239
|
7. 新功能开始时不要复用已归档中文功能名;需要返工时,新建后续中文功能名或明确从 archive 恢复。
|
|
228
240
|
8. status-doc 是当前状态记录,归档后不再作为当前任务入口。`
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
fileName: "功能完成检查规范.md",
|
|
244
|
+
content: `# 功能完成检查规范
|
|
245
|
+
|
|
246
|
+
## 功能描述
|
|
247
|
+
|
|
248
|
+
约束 agent 在完成小节点、识别到功能变更、准备最终回复或切换任务前,主动判断当前功能是否真正完成,并据此更新过程文档、询问是否更新长期记忆、询问是否归档或继续当前节点。
|
|
249
|
+
|
|
250
|
+
## 调用时机
|
|
251
|
+
|
|
252
|
+
- 完成一个小节点、阶段任务、反馈修复或功能开发后
|
|
253
|
+
- 修改了功能行为、项目结构、配置、测试策略、发布流程、CLI 交互、初始化逻辑或协作文档生成逻辑后
|
|
254
|
+
- 准备最终回复用户、提交代码、归档文档或切换到下一个任务前
|
|
255
|
+
- 用户表达“这个逻辑以后都这样”“沉淀为规则”“功能完成了”“继续下一个任务”等意图时
|
|
256
|
+
- agent hook 或用户手动执行 \`npx @skrupellose/code-helper finish\` 时
|
|
257
|
+
|
|
258
|
+
## 调用入口文件
|
|
259
|
+
|
|
260
|
+
${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
261
|
+
|
|
262
|
+
## 规则
|
|
263
|
+
|
|
264
|
+
1. 完成检查不是只在固定节点触发;只要 agent 识别到功能变更、项目改变或稳定规则变化,就必须主动判断是否需要进入完成检查。
|
|
265
|
+
2. 每次完成检查先读取 \`${config.directories.statusDoc}/<中文功能名>-状态.md\`,再读取对应 plan-doc 和 result-doc。
|
|
266
|
+
3. status-doc 是当前执行入口,必须能看出当前执行节点、子计划队列、完成定义、验证方式和下一步。
|
|
267
|
+
4. 当前小节点未完成时,不询问归档,不引导新任务;继续当前节点,或在 status-doc 记录阻塞原因和恢复条件。
|
|
268
|
+
5. 当前小节点完成但功能整体未完成时,更新 \`${config.directories.resultDoc}/<中文功能名>/实施记录.md\`、plan-doc 对应任务状态和 status-doc 的下一个执行节点。
|
|
269
|
+
6. 小节点完成后必须主动判断是否形成长期规则;如果形成稳定协作规范、项目约束、测试策略、发布流程或工具使用偏好,询问用户是否更新项目记忆。
|
|
270
|
+
7. 如果只是一次性实现细节、临时失败过程或短期调试状态,不写入长期记忆。
|
|
271
|
+
8. 功能整体完成时,先确认过程文档和验证结论已更新,再询问用户是否更新长期记忆、是否归档文档、是否选择下一个活动任务。
|
|
272
|
+
9. 更新长期记忆和归档文档都需要用户确认,不自动执行。
|
|
273
|
+
10. agent hook 只做提醒和检查,不替代 agent 判断;Git hook 只做提交前兜底。
|
|
274
|
+
11. 推荐运行 \`npx @skrupellose/code-helper finish <中文功能名> --check-only\` 作为收尾检查,不让检查命令直接修改项目文件。
|
|
275
|
+
12. 如果 \`finish\` 输出仍有未开始、进行中、部分完成或被阻塞节点,agent 必须继续当前功能,而不是切换新任务。`
|
|
229
276
|
},
|
|
230
277
|
{
|
|
231
278
|
fileName: "Agent协作规范.md",
|
|
@@ -239,6 +286,7 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
239
286
|
|
|
240
287
|
- 新 agent 接手项目或恢复上下文
|
|
241
288
|
- 开始新任务、拆分计划、记录阶段结果或检查规则
|
|
289
|
+
- 完成小节点、识别到功能变更、准备最终回复或切换任务前
|
|
242
290
|
- 多人或多 agent 交替推进同一项目时
|
|
243
291
|
|
|
244
292
|
## 调用入口文件
|
|
@@ -251,7 +299,16 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
251
299
|
2. 大任务先生成计划文档,再进入实现。
|
|
252
300
|
3. 小节点完成后写结果总结,避免只把结论留在对话里。
|
|
253
301
|
4. 当前仍影响决策的信息写入 status-doc,历史细节写入 result-doc。
|
|
254
|
-
5.
|
|
302
|
+
5. 不覆盖用户已有规则;确需重写时先说明变更范围和原因。
|
|
303
|
+
6. 主会话定位为协调者,只负责理解目标、拆分任务、分配子代理、审阅结果、同步过程文档和向用户汇报,不直接执行具体实现、调试、测试、文件修改或资料整理。
|
|
304
|
+
7. 任何需要读取大量代码、修改文件、运行命令、排查问题、生成文档、执行测试或整理数据的任务,都必须由子代理执行。
|
|
305
|
+
8. 派发子代理时,主会话必须写清任务目标、允许修改的范围、必须读取的规则、禁止触碰的内容、预期产物和验证方式,避免子代理扩大范围。
|
|
306
|
+
9. 子代理返回后,主会话必须审阅变更、验证结论、风险和未完成项;发现范围外改动、验证不足或结论不清时,继续派发补充任务或要求修正。
|
|
307
|
+
10. 主会话只汇总已审阅的子代理结果,并负责同步 status-doc、result-doc、长期记忆更新询问和最终回复。
|
|
308
|
+
11. 如果当前 agent 工具没有子代理能力,主会话必须先明确说明“当前工具不支持子代理执行”,列出原本应交给子代理的任务和由主会话执行的影响,等待用户确认后才能继续执行;用户未确认时不得擅自开始具体任务。
|
|
309
|
+
12. 完成小节点、识别到功能变更、准备最终回复或切换任务前,必须执行功能完成检查,判断是否继续当前节点、更新过程文档、询问更新长期记忆、询问归档或选择下一任务。
|
|
310
|
+
13. agent 识别到稳定规则、项目结构变化、测试策略变化、发布流程变化或长期协作偏好时,应主动询问用户是否更新项目记忆;用户确认前不自动写入长期规则。
|
|
311
|
+
14. Agent hooks 只作为完成检查提醒和兜底,不替代 agent 自己判断;Git hooks 只做提交前检查。`
|
|
255
312
|
}
|
|
256
313
|
];
|
|
257
314
|
}
|
|
@@ -265,7 +322,7 @@ export function getSkillTemplates() {
|
|
|
265
322
|
fileName: "memory-tuning.SKILL.md",
|
|
266
323
|
content: `---
|
|
267
324
|
name: code-helper-memory-tuning
|
|
268
|
-
description: 当用户要求“更新记忆”“优化记忆”“沉淀规则”“整理 AGENTS.md”“整理 CLAUDE.md”“同步 AGENTS.md 和 CLAUDE.md
|
|
325
|
+
description: 当用户要求“更新记忆”“优化记忆”“沉淀规则”“整理 AGENTS.md”“整理 CLAUDE.md”“同步 AGENTS.md 和 CLAUDE.md”“拆分项目规则文档”“把当前变更写入记忆”,或 agent 识别到功能变更、项目结构变化、测试策略变化、发布流程变化、稳定协作规则变化并需要询问是否更新长期记忆时必须使用。该 skill 同时识别 AGENTS.md 与 CLAUDE.md,把项目记忆维护为轻量入口文档 + code-helper-docs/user-rules/ 专题规则文档;如果 code-helper-docs/ 或 code-helper-docs/user-rules/ 不存在则按需创建,避免整份覆盖、重复建档或把入口文件写成大而全的长文档。
|
|
269
326
|
---
|
|
270
327
|
|
|
271
328
|
# Code Helper Memory Tuning
|
|
@@ -279,8 +336,8 @@ description: 当用户要求“更新记忆”“优化记忆”“沉淀规则
|
|
|
279
336
|
3. 具体规则默认拆分到 code-helper-docs/user-rules/ 下的专题文档。
|
|
280
337
|
4. 如果 code-helper-docs/ 或 code-helper-docs/user-rules/ 不存在,写入时先创建目录。
|
|
281
338
|
5. 每份专题文档统一包含“功能描述 / 调用时机 / 调用入口文件 / 规则”。
|
|
282
|
-
6.
|
|
283
|
-
7.
|
|
339
|
+
6. 用户确认更新记忆时,根据当前项目变更定向更新对应专题文档。
|
|
340
|
+
7. 新功能、小节点或重构形成稳定规则后,agent 主动询问用户是否更新记忆;用户确认前不自动写入长期记忆。
|
|
284
341
|
|
|
285
342
|
## 使用场景
|
|
286
343
|
|
|
@@ -382,7 +439,7 @@ AGENTS.md 和 CLAUDE.md 都只保留以下内容:
|
|
|
382
439
|
|
|
383
440
|
### 5. 定向更新记忆
|
|
384
441
|
|
|
385
|
-
|
|
442
|
+
当 agent 主动判断需要更新记忆,或用户明确触发“更新记忆”时:
|
|
386
443
|
|
|
387
444
|
1. 先查看当前项目变更。
|
|
388
445
|
2. 判断变更影响哪个专题。
|
|
@@ -394,13 +451,13 @@ AGENTS.md 和 CLAUDE.md 都只保留以下内容:
|
|
|
394
451
|
8. 不整份覆盖所有文档。
|
|
395
452
|
9. 不把短期任务状态写进长期记忆。
|
|
396
453
|
|
|
397
|
-
### 6.
|
|
454
|
+
### 6. 新功能、小节点或重构后的固定判断
|
|
398
455
|
|
|
399
|
-
|
|
456
|
+
如果刚完成新功能、小节点或重构,先判断是否形成稳定规则。
|
|
400
457
|
|
|
401
|
-
|
|
458
|
+
如果这次变更形成了新的项目规则、协作约束、测试策略、发布流程或长期偏好,必须询问用户是否更新记忆。
|
|
402
459
|
|
|
403
|
-
|
|
460
|
+
只有用户确认后,才根据当前 diff 或用户描述定向更新专题文档。
|
|
404
461
|
|
|
405
462
|
### 7. 校验
|
|
406
463
|
|
|
@@ -650,9 +707,10 @@ description: 当用户提供完整需求文档,并要求拆分开发计划、
|
|
|
650
707
|
|
|
651
708
|
- plan-doc:计划文档,记录阶段、依赖、任务表和验收标准。
|
|
652
709
|
- result-doc:实施记录,使用中文总结实际改动、验证结论、临时失败、风险和后续。
|
|
653
|
-
- status-doc
|
|
710
|
+
- status-doc:当前执行入口,只保留当前状态、当前执行节点、子计划队列、下一步、阶段进度、关键结论、关键索引、仍影响判断的风险点、最近一次更新。
|
|
654
711
|
|
|
655
712
|
状态文档不是流水账,不写完整命令输出、大段实现过程或已解决的旧风险。
|
|
713
|
+
状态文档必须让 agent 在恢复任务时直接知道“现在只推进哪一个子计划”,不能只写泛泛的任务摘要。
|
|
656
714
|
|
|
657
715
|
## 完成标准
|
|
658
716
|
|
|
@@ -721,21 +779,131 @@ description: 当用户要求归档功能文档、结束一个功能、查看当
|
|
|
721
779
|
- 已归档 status-doc 不再作为当前任务入口。
|
|
722
780
|
- 新功能不要复用已归档中文功能名。
|
|
723
781
|
- 需要返工时,优先新建后续中文功能名,或明确从 archive 恢复后再继续。`
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
fileName: "completion-review.SKILL.md",
|
|
785
|
+
content: `---
|
|
786
|
+
name: code-helper-completion-review
|
|
787
|
+
description: 当 agent 完成小节点、识别到功能变更或项目结构变化、准备最终回复、提交前检查、切换任务、询问是否归档、询问是否更新记忆,或用户要求“检查是否完成”“继续下一个任务”“功能收尾”时必须使用。该 skill 要读取 status-doc、plan-doc、result-doc,判断当前节点是否完成、是否需要继续当前功能、是否需要询问更新长期记忆、是否需要询问归档,并引导选择下一步任务。
|
|
788
|
+
---
|
|
789
|
+
|
|
790
|
+
# Code Helper 完成检查
|
|
791
|
+
|
|
792
|
+
## 目标
|
|
793
|
+
|
|
794
|
+
在每次功能开发或小节点推进后,避免 agent 直接进入总结或切换任务。先判断当前工作是否真的完成,再决定继续开发、更新过程文档、询问更新记忆、询问归档或选择下一个任务。
|
|
795
|
+
|
|
796
|
+
## 固定流程
|
|
797
|
+
|
|
798
|
+
1. 先读取 code-helper-docs/status-doc/<中文功能名>-状态.md,确认当前执行节点、完成定义、验证方式和子计划队列。
|
|
799
|
+
2. 再读取 code-helper-docs/plan-doc/<中文功能名>.md 和 code-helper-docs/result-doc/<中文功能名>/实施记录.md。
|
|
800
|
+
3. 当前节点未完成时,继续当前功能;不要询问归档,不要引导新任务。
|
|
801
|
+
4. 当前节点完成但功能整体未完成时,更新实施记录、计划文档状态和 status-doc 的下一个执行节点。
|
|
802
|
+
5. 识别到功能变更、项目结构变化、测试策略变化、发布流程变化或稳定协作规则时,主动询问用户是否更新长期记忆。
|
|
803
|
+
6. 只有功能整体完成并经用户确认后,才询问是否归档文档。
|
|
804
|
+
7. 归档后再查看活动任务,并引导用户选择下一步。
|
|
805
|
+
|
|
806
|
+
## 命令辅助
|
|
807
|
+
|
|
808
|
+
- 使用 \`npx @skrupellose/code-helper finish <中文功能名> --check-only\` 做收尾检查。
|
|
809
|
+
- 该命令只输出判断和建议,不自动更新记忆、不自动归档、不自动提交。
|
|
810
|
+
- 如果缺少功能名,优先从活动任务列表选择,不要求用户凭记忆输入。
|
|
811
|
+
|
|
812
|
+
## 用户确认边界
|
|
813
|
+
|
|
814
|
+
- 可以自动更新 result-doc、plan-doc 和 status-doc 中属于当前任务过程的内容。
|
|
815
|
+
- 更新长期记忆前必须询问用户。
|
|
816
|
+
- 文档归档前必须询问用户。
|
|
817
|
+
- git commit、npm publish 等外部动作前必须询问用户。
|
|
818
|
+
|
|
819
|
+
## 判断原则
|
|
820
|
+
|
|
821
|
+
- 长期记忆只记录稳定规则,不记录一次性实现细节。
|
|
822
|
+
- 页面、可视化和真实浏览器链路仍只生成手工测试文档。
|
|
823
|
+
- Agent hooks 只作为提醒和兜底检查,不替代 agent 自己判断。
|
|
824
|
+
- Git hooks 只做提交前检查,不承担对话完成判断。`
|
|
724
825
|
}
|
|
725
826
|
];
|
|
726
827
|
}
|
|
727
828
|
/**
|
|
728
|
-
* 返回可选
|
|
729
|
-
*
|
|
829
|
+
* 返回可选 hook 模板。
|
|
830
|
+
* Git hooks 和 Agent hooks 分别受不同功能开关控制,避免概念混用。
|
|
730
831
|
*/
|
|
731
832
|
export function getHookTemplates() {
|
|
732
833
|
return [
|
|
733
834
|
{
|
|
734
835
|
fileName: "pre-commit.sample",
|
|
836
|
+
feature: "gitHooks",
|
|
735
837
|
content: `#!/bin/sh
|
|
736
838
|
# code-helper 可选 pre-commit 模板。
|
|
737
839
|
# 启用方式:复制到 .git/hooks/pre-commit 并添加可执行权限。
|
|
840
|
+
# code-helper:managed-pre-commit
|
|
738
841
|
npx @skrupellose/code-helper check
|
|
842
|
+
`
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
fileName: "agent-finish-check.mjs.sample",
|
|
846
|
+
feature: "agentHooks",
|
|
847
|
+
content: `#!/usr/bin/env node
|
|
848
|
+
/**
|
|
849
|
+
* code-helper Agent hook 示例。
|
|
850
|
+
* 适合接到 Codex / Claude Code 等 agent 的 Stop、收尾或提交前生命周期事件中。
|
|
851
|
+
* 该脚本只运行完成检查,不自动修改文件、不归档、不更新长期记忆。
|
|
852
|
+
*/
|
|
853
|
+
import { spawnSync } from "node:child_process";
|
|
854
|
+
|
|
855
|
+
const command = process.platform === "win32" ? "npx.cmd" : "npx";
|
|
856
|
+
const result = spawnSync(command, ["@skrupellose/code-helper", "finish", "--check-only"], {
|
|
857
|
+
cwd: process.cwd(),
|
|
858
|
+
encoding: "utf8"
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
if (result.stdout.trim() !== "") {
|
|
862
|
+
console.log(result.stdout.trim());
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
if (result.stderr.trim() !== "") {
|
|
866
|
+
console.error(result.stderr.trim());
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
process.exit(result.status ?? 0);
|
|
870
|
+
`
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
fileName: "agent-hooks.md.sample",
|
|
874
|
+
feature: "agentHooks",
|
|
875
|
+
content: `# code-helper Agent hooks 模板
|
|
876
|
+
|
|
877
|
+
## 用途
|
|
878
|
+
|
|
879
|
+
Agent hooks 用于在 agent 准备最终回复、停止任务、提交前检查或切换任务前,提醒运行完成检查。
|
|
880
|
+
|
|
881
|
+
## 推荐命令
|
|
882
|
+
|
|
883
|
+
\`\`\`bash
|
|
884
|
+
node .code-helper/hooks/agent-finish-check.mjs
|
|
885
|
+
\`\`\`
|
|
886
|
+
|
|
887
|
+
如果所在 agent 工具支持分别配置 macOS/Linux 和 Windows 命令,Windows 可以使用:
|
|
888
|
+
|
|
889
|
+
\`\`\`powershell
|
|
890
|
+
node .code-helper\\hooks\\agent-finish-check.mjs
|
|
891
|
+
\`\`\`
|
|
892
|
+
|
|
893
|
+
## 行为边界
|
|
894
|
+
|
|
895
|
+
- hook 只运行 \`code-helper finish --check-only\`。
|
|
896
|
+
- hook 不自动更新长期记忆。
|
|
897
|
+
- hook 不自动归档文档。
|
|
898
|
+
- hook 不自动提交代码。
|
|
899
|
+
- agent 仍需要根据输出主动询问用户是否更新记忆、归档或选择下一任务。
|
|
900
|
+
|
|
901
|
+
## code-helper 安装命令
|
|
902
|
+
|
|
903
|
+
\`\`\`bash
|
|
904
|
+
npx @skrupellose/code-helper hooks install codex
|
|
905
|
+
npx @skrupellose/code-helper hooks install claudecode
|
|
906
|
+
\`\`\`
|
|
739
907
|
`
|
|
740
908
|
}
|
|
741
909
|
];
|
package/dist/templates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,YAAY,GAAG;QACnB,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO;YAClC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/terminal-ui.d.ts
CHANGED
|
@@ -6,6 +6,11 @@ import type { ReadStream, WriteStream } from "node:tty";
|
|
|
6
6
|
export interface SelectOption<T extends string> {
|
|
7
7
|
value: T;
|
|
8
8
|
label: string;
|
|
9
|
+
/**
|
|
10
|
+
* disabled 用于展示不可选的分组标题。
|
|
11
|
+
* 单选菜单会跳过这些项,避免用户把分组标题当成功能动作确认。
|
|
12
|
+
*/
|
|
13
|
+
disabled?: boolean;
|
|
9
14
|
}
|
|
10
15
|
/**
|
|
11
16
|
* 多选菜单项。
|
package/dist/terminal-ui.js
CHANGED
|
@@ -11,7 +11,7 @@ export function canUseInteractiveKeys(input, output) {
|
|
|
11
11
|
* 该函数不依赖第三方包,便于 code-helper 保持轻量安装体积。
|
|
12
12
|
*/
|
|
13
13
|
export async function promptSelect(input, output, title, options) {
|
|
14
|
-
let selectedIndex =
|
|
14
|
+
let selectedIndex = findNextEnabledOptionIndex(options, -1, 1);
|
|
15
15
|
return withRawMode(input, output, () => {
|
|
16
16
|
return new Promise((resolve) => {
|
|
17
17
|
/**
|
|
@@ -24,7 +24,7 @@ export async function promptSelect(input, output, title, options) {
|
|
|
24
24
|
output.write(`${title}\n`);
|
|
25
25
|
output.write("使用 ↑/↓ 移动,空格或回车确认,Ctrl+C 退出。\n\n");
|
|
26
26
|
for (const [index, option] of options.entries()) {
|
|
27
|
-
const pointer = index === selectedIndex ? ">" : " ";
|
|
27
|
+
const pointer = !option.disabled && index === selectedIndex ? ">" : " ";
|
|
28
28
|
output.write(`${pointer} ${option.label}\n`);
|
|
29
29
|
}
|
|
30
30
|
};
|
|
@@ -38,17 +38,21 @@ export async function promptSelect(input, output, title, options) {
|
|
|
38
38
|
process.exit(130);
|
|
39
39
|
}
|
|
40
40
|
if (key.name === "up" || key.name === "k") {
|
|
41
|
-
selectedIndex = (selectedIndex -
|
|
41
|
+
selectedIndex = findNextEnabledOptionIndex(options, selectedIndex, -1);
|
|
42
42
|
render();
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
if (key.name === "down" || key.name === "j") {
|
|
46
|
-
selectedIndex = (selectedIndex
|
|
46
|
+
selectedIndex = findNextEnabledOptionIndex(options, selectedIndex, 1);
|
|
47
47
|
render();
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
if (key.name === "return" || key.name === "space") {
|
|
51
51
|
const selectedValue = options[selectedIndex]?.value;
|
|
52
|
+
if (selectedValue === undefined || options[selectedIndex]?.disabled) {
|
|
53
|
+
render();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
52
56
|
cleanup();
|
|
53
57
|
resolve(selectedValue);
|
|
54
58
|
}
|
|
@@ -65,6 +69,19 @@ export async function promptSelect(input, output, title, options) {
|
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* 查找下一个可选菜单项。
|
|
74
|
+
* 分组标题等 disabled 项只参与展示,不参与方向键停留和确认。
|
|
75
|
+
*/
|
|
76
|
+
function findNextEnabledOptionIndex(options, currentIndex, direction) {
|
|
77
|
+
for (let step = 1; step <= options.length; step += 1) {
|
|
78
|
+
const candidateIndex = (currentIndex + direction * step + options.length) % options.length;
|
|
79
|
+
if (!options[candidateIndex]?.disabled) {
|
|
80
|
+
return candidateIndex;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
68
85
|
/**
|
|
69
86
|
* 渲染多选菜单。
|
|
70
87
|
* 空格切换当前项,回车保存所有选择,适合功能开关批量修改。
|
package/dist/terminal-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-ui.js","sourceRoot":"","sources":["../src/terminal-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-ui.js","sourceRoot":"","sources":["../src/terminal-ui.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* code-helper 支持的功能开关名称。
|
|
3
3
|
* 这些 key 会直接写入 `.code-helper/config.json`,因此需要保持稳定。
|
|
4
4
|
*/
|
|
5
|
-
export type FeatureKey = "memoryTuning" | "planWorkbench" | "resultSummary" | "testingPolicy" | "documentArchive" | "checks" | "gitHooks" | "skillRegistration";
|
|
5
|
+
export type FeatureKey = "memoryTuning" | "planWorkbench" | "resultSummary" | "testingPolicy" | "documentArchive" | "completionReview" | "checks" | "gitHooks" | "agentHooks" | "skillRegistration";
|
|
6
6
|
/**
|
|
7
7
|
* 单个功能开关的配置。
|
|
8
8
|
* 使用对象而不是布尔值,是为了后续能无破坏扩展更多元数据。
|
|
@@ -19,6 +19,7 @@ export interface CodeHelperConfig {
|
|
|
19
19
|
entryFiles: {
|
|
20
20
|
agents: boolean;
|
|
21
21
|
claude: boolean;
|
|
22
|
+
copilot: boolean;
|
|
22
23
|
};
|
|
23
24
|
directories: {
|
|
24
25
|
workspace: string;
|
package/dist/workflows.js
CHANGED
|
@@ -122,8 +122,10 @@ function renderPlanDocument(featureName, requirementPath, requirement) {
|
|
|
122
122
|
|
|
123
123
|
1. 先确认目标、阶段边界和验收标准。
|
|
124
124
|
2. 再按依赖顺序拆分基础能力、核心实现、集成验收和复查任务。
|
|
125
|
-
3.
|
|
126
|
-
4.
|
|
125
|
+
3. 将当前要执行的第一个子计划同步到 \`code-helper-docs/status-doc/${featureName}-状态.md\` 的“当前执行节点”。
|
|
126
|
+
4. 每完成一个子计划,都更新实施记录、计划状态和状态记录,再进入下一个子计划。
|
|
127
|
+
5. 涉及页面、可视化或浏览器链路时,只生成手工测试文档,由用户执行。
|
|
128
|
+
6. 工具执行测试时只运行纯逻辑测试,例如函数单元测试或非浏览器集成测试。
|
|
127
129
|
|
|
128
130
|
## 需求摘要
|
|
129
131
|
|
|
@@ -164,6 +166,7 @@ ${excerpt}
|
|
|
164
166
|
- 当前状态文件:\`code-helper-docs/status-doc/${featureName}-状态.md\`
|
|
165
167
|
- 执行记录目录:\`code-helper-docs/result-doc/${featureName}/\`
|
|
166
168
|
- 手工测试文档:\`code-helper-docs/result-doc/${featureName}/${MANUAL_TEST_FILE_NAME}\`
|
|
169
|
+
- 推进要求:每个子计划开始前先更新状态记录的“当前执行节点”,完成后再写入下一节点。
|
|
167
170
|
`;
|
|
168
171
|
}
|
|
169
172
|
/**
|
|
@@ -204,22 +207,60 @@ function renderStatusDocument(featureName) {
|
|
|
204
207
|
|
|
205
208
|
## 当前状态
|
|
206
209
|
|
|
207
|
-
1.
|
|
210
|
+
1. 状态:未开始;已创建计划文档,当前等待确认第一个可执行子计划。
|
|
211
|
+
|
|
212
|
+
## 当前执行节点
|
|
213
|
+
|
|
214
|
+
| 字段 | 内容 |
|
|
215
|
+
|---|---|
|
|
216
|
+
| 当前子计划 | 计划细化与第一个执行节点确认 |
|
|
217
|
+
| 当前状态 | 未开始 |
|
|
218
|
+
| 执行目标 | 从计划文档中确认依赖最少、可独立验证的第一个小节点 |
|
|
219
|
+
| 进入条件 | 已阅读执行计划、需求摘要和验收标准 |
|
|
220
|
+
| 完成定义 | 已在计划文档标记第一个子计划,并把下一步写回本状态记录 |
|
|
221
|
+
| 验证方式 | 检查计划文档、实施记录和本状态记录是否互相指向一致 |
|
|
208
222
|
|
|
209
223
|
## 下一步
|
|
210
224
|
|
|
211
|
-
1.
|
|
212
|
-
2.
|
|
213
|
-
3.
|
|
225
|
+
1. 阅读执行计划,确认基础能力、核心实现、集成验收的真实依赖顺序。
|
|
226
|
+
2. 在本文件“当前执行节点”中写清楚当前子计划、完成定义和验证方式。
|
|
227
|
+
3. 只推进当前执行节点,不同时展开多个无依赖关系不明确的子计划。
|
|
228
|
+
4. 当前节点完成后,同步更新实施记录、计划文档状态和本文件的下一个执行节点。
|
|
214
229
|
|
|
215
230
|
## 阶段进度
|
|
216
231
|
|
|
217
|
-
|
|
232
|
+
| 阶段 | 当前状态 | 下一步 |
|
|
233
|
+
|---|---|---|
|
|
234
|
+
| 计划初始化 | 已创建 | 确认第一个执行节点 |
|
|
235
|
+
| 基础能力 | 未开始 | 等待依赖顺序确认 |
|
|
236
|
+
| 核心实现 | 未开始 | 等待基础能力完成或明确可并行 |
|
|
237
|
+
| 集成验收 | 未开始 | 等待核心实现具备可验证链路 |
|
|
238
|
+
| 完成整理 | 未开始 | 等待验证结论和归档条件明确 |
|
|
239
|
+
|
|
240
|
+
## 子计划队列
|
|
241
|
+
|
|
242
|
+
| 顺序 | 子计划 | 当前状态 | 推进规则 |
|
|
243
|
+
|---|---|---|---|
|
|
244
|
+
| 1 | 计划细化与执行节点确认 | 未开始 | 先把大计划拆成可交接小节点,并选定第一个节点 |
|
|
245
|
+
| 2 | 基础能力或前置依赖 | 未开始 | 优先处理会阻塞后续实现的目录、配置、类型、协议或公共能力 |
|
|
246
|
+
| 3 | 核心实现 | 未开始 | 按依赖顺序逐个推进模块、服务、命令、页面、数据流或业务规则 |
|
|
247
|
+
| 4 | 集成验收 | 未开始 | 串起调用链路、验证方案、人工验收和发布检查 |
|
|
248
|
+
| 5 | 完成整理 | 未开始 | 汇总结论、更新长期规则、确认是否归档 |
|
|
249
|
+
|
|
250
|
+
## Agent 推进规则
|
|
251
|
+
|
|
252
|
+
1. 每次继续任务时,先读本状态记录,再读计划文档中当前节点对应的内容。
|
|
253
|
+
2. 一次只推进“当前执行节点”;如需切换节点,先在本文件说明原因。
|
|
254
|
+
3. 小节点完成后,必须把完成内容和验证结论写入 \`${RESULT_RECORD_FILE_NAME}\`。
|
|
255
|
+
4. 小节点完成后,必须把计划文档对应行改为已完成或部分完成。
|
|
256
|
+
5. 小节点完成后,必须把本文件“当前执行节点”更新为下一个子计划。
|
|
257
|
+
6. 遇到阻塞时,保持当前节点不变,并在“仍会影响后续判断的风险点”写清阻塞原因和恢复条件。
|
|
218
258
|
|
|
219
259
|
## 关键结论
|
|
220
260
|
|
|
221
261
|
- 页面、可视化和浏览器链路只生成手工测试文档。
|
|
222
262
|
- 工具只执行纯逻辑测试。
|
|
263
|
+
- status-doc 是 agent 恢复任务的当前入口,不保存完整历史;历史细节写入 result-doc。
|
|
223
264
|
|
|
224
265
|
## 关键索引
|
|
225
266
|
|
|
@@ -229,7 +270,8 @@ function renderStatusDocument(featureName) {
|
|
|
229
270
|
|
|
230
271
|
## 仍会影响后续判断的风险点
|
|
231
272
|
|
|
232
|
-
1.
|
|
273
|
+
1. 大计划尚未同步出明确的当前执行节点,agent 可能无法稳定按步骤推进。
|
|
274
|
+
2. 如果后续修改计划文档,必须同步更新本状态记录中的当前节点和子计划队列。
|
|
233
275
|
|
|
234
276
|
## 最近一次更新
|
|
235
277
|
|