@skrupellose/code-helper 0.1.0 → 0.1.2
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 +114 -14
- package/dist/archive.d.ts +8 -1
- package/dist/archive.js +39 -6
- package/dist/archive.js.map +1 -1
- package/dist/checks.d.ts +4 -2
- package/dist/checks.js +71 -5
- package/dist/checks.js.map +1 -1
- package/dist/cli.d.ts +54 -0
- package/dist/cli.js +1255 -148
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +43 -0
- package/dist/completion.js +289 -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 +36 -0
- package/dist/hooks.js +401 -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 +305 -21
- package/dist/skills.js.map +1 -1
- package/dist/templates.d.ts +3 -2
- package/dist/templates.js +312 -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 +70 -16
- package/dist/workflows.js.map +1 -1
- package/package.json +8 -2
package/dist/templates.js
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export function renderEntryBlock(config) {
|
|
6
6
|
const enabledRules = [
|
|
7
|
+
"- Agent 协作规范:开始新需求、迁移、重构或反馈修复时,读取 `code-helper-docs/user-rules/Agent协作规范.md`;主会话只做协调、分配、审阅和同步,具体执行任务必须交给子代理。",
|
|
7
8
|
config.features.memoryTuning.enabled
|
|
8
|
-
? `- 项目记忆规则优化:整理或更新 \`AGENTS.md\` / \`CLAUDE.md\` 时,读取 \`${config.directories.userRules}/项目记忆规则优化.md\`。`
|
|
9
|
+
? `- 项目记忆规则优化:整理或更新 \`AGENTS.md\` / \`CLAUDE.md\` / \`.github/copilot-instructions.md\` 时,读取 \`${config.directories.userRules}/项目记忆规则优化.md\`。`
|
|
9
10
|
: undefined,
|
|
10
11
|
config.features.planWorkbench.enabled
|
|
11
12
|
? `- 项目计划优化:开始大型需求、迁移、重构或多阶段任务时,读取 \`${config.directories.userRules}/项目计划管理规范.md\`。`
|
|
@@ -19,11 +20,17 @@ export function renderEntryBlock(config) {
|
|
|
19
20
|
config.features.documentArchive.enabled
|
|
20
21
|
? `- 文档归档:功能完成或手动移动到 archive 后,任务视为已结束,读取 \`${config.directories.userRules}/文档归档规范.md\`。`
|
|
21
22
|
: undefined,
|
|
23
|
+
config.features.completionReview.enabled
|
|
24
|
+
? `- 功能完成检查:完成小节点、识别到功能变更、准备最终回复或切换任务前,读取 \`${config.directories.userRules}/功能完成检查规范.md\`,并按需运行 \`npx @skrupellose/code-helper finish\`。`
|
|
25
|
+
: undefined,
|
|
22
26
|
config.features.checks.enabled
|
|
23
27
|
? "- 规则检查:提交或阶段结束前运行 `npx @skrupellose/code-helper check`,确认协作文档结构仍完整。"
|
|
24
28
|
: undefined,
|
|
29
|
+
config.features.agentHooks.enabled
|
|
30
|
+
? "- Agent hooks:需要在 agent 生命周期中提醒完成检查时,参考 `.code-helper/hooks/` 下的 agent hook 模板。"
|
|
31
|
+
: undefined,
|
|
25
32
|
config.features.skillRegistration.enabled
|
|
26
|
-
? "- Skills 管理:需要让 Codex 或
|
|
33
|
+
? "- Skills 管理:需要让 Codex、Claude Code 或 GitHub Copilot 在当前项目自动发现 code-helper skills 时,执行 `npx @skrupellose/code-helper skills register`。"
|
|
27
34
|
: undefined
|
|
28
35
|
].filter((line) => line !== undefined);
|
|
29
36
|
return `## code-helper 协作入口
|
|
@@ -33,6 +40,7 @@ export function renderEntryBlock(config) {
|
|
|
33
40
|
1. 开始新需求、迁移、重构或反馈修复前,先读取本区块索引到的专题规则。
|
|
34
41
|
2. 长期规则写入 \`${config.directories.userRules}/\`,短期过程写入 \`${config.directories.resultDoc}/\`,当前状态记录写入 \`${config.directories.statusDoc}/\`。
|
|
35
42
|
3. 不把一次性调试过程、临时失败细节或大段实现流水写进入口文档。
|
|
43
|
+
4. 主会话只做管理、分配、审阅和结果同步;具体执行任务必须交给子代理。当前 agent 工具没有子代理能力时,先说明限制并等待用户确认,再由主会话执行。
|
|
36
44
|
|
|
37
45
|
### 专题规则索引
|
|
38
46
|
|
|
@@ -43,7 +51,8 @@ ${enabledRules.join("\n")}
|
|
|
43
51
|
- 入口文档只保留轻量索引和核心约束。
|
|
44
52
|
- 专题规则文档必须包含“功能描述 / 调用时机 / 调用入口文件 / 规则”四个小节。
|
|
45
53
|
- 计划、状态、结果和测试文档必须使用中文命名与中文总结。
|
|
46
|
-
-
|
|
54
|
+
- agent 识别到功能变更、项目结构变化、稳定规则变化或小节点完成时,必须主动判断是否需要更新过程文档、询问更新长期记忆、询问归档或继续当前节点。
|
|
55
|
+
- 新功能或重构形成稳定规则后,先询问用户是否更新项目记忆,不自动把短期任务状态写入长期记忆。`;
|
|
47
56
|
}
|
|
48
57
|
/**
|
|
49
58
|
* 返回内置专题规则模板。
|
|
@@ -52,7 +61,8 @@ ${enabledRules.join("\n")}
|
|
|
52
61
|
export function getRuleTemplates(config) {
|
|
53
62
|
const entryFiles = [
|
|
54
63
|
config.entryFiles.agents ? "`AGENTS.md`" : undefined,
|
|
55
|
-
config.entryFiles.claude ? "`CLAUDE.md`" : undefined
|
|
64
|
+
config.entryFiles.claude ? "`CLAUDE.md`" : undefined,
|
|
65
|
+
config.entryFiles.copilot ? "`.github/copilot-instructions.md`" : undefined
|
|
56
66
|
].filter((value) => value !== undefined);
|
|
57
67
|
return [
|
|
58
68
|
{
|
|
@@ -68,7 +78,7 @@ export function getRuleTemplates(config) {
|
|
|
68
78
|
- 用户要求更新记忆、优化记忆、整理 AGENTS.md 或 CLAUDE.md
|
|
69
79
|
- 用户要求同步 AGENTS.md 和 CLAUDE.md
|
|
70
80
|
- 用户要求沉淀规则、把当前变更写入记忆、拆分项目规则文档
|
|
71
|
-
-
|
|
81
|
+
- agent 识别到功能变更、项目结构变化、测试策略变化、发布流程变化或稳定协作规则后
|
|
72
82
|
- 入口文档变长、重复或混入短期任务状态时
|
|
73
83
|
|
|
74
84
|
## 调用入口文件
|
|
@@ -85,10 +95,10 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
85
95
|
6. 入口文档只保留项目概览、核心规则、常用命令、专题规则索引和文档维护规则。
|
|
86
96
|
7. 具体规则默认写入 \`${config.directories.userRules}/\`,不要把完整规范塞进入口文档。
|
|
87
97
|
8. 专题规则文档必须包含“功能描述 / 调用时机 / 调用入口文件 / 规则”四个小节。
|
|
88
|
-
9.
|
|
98
|
+
9. 当 agent 判断可能需要更新记忆,或用户明确要求更新记忆时,先查看当前变更范围,再只更新相关专题文档。
|
|
89
99
|
10. 如新增主题不存在,新增对应专题文档;如入口索引缺失,再更新已存在的入口文件。
|
|
90
100
|
11. 不整份覆盖所有文档,不重复创建相似专题,不把一次性任务状态、临时调试过程、完整命令输出或短期计划写进长期记忆。
|
|
91
|
-
12.
|
|
101
|
+
12. 新功能、小节点或重构形成稳定规则后,agent 必须主动询问用户是否更新记忆;用户确认前不自动写入长期记忆。
|
|
92
102
|
|
|
93
103
|
## 输出格式
|
|
94
104
|
|
|
@@ -130,20 +140,23 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
130
140
|
3. 执行记录写入 \`${config.directories.resultDoc}/<中文功能名>/实施记录.md\`。
|
|
131
141
|
4. 当前状态写入 \`${config.directories.statusDoc}/<中文功能名>-状态.md\`。
|
|
132
142
|
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.
|
|
143
|
+
6. status-doc 必须包含“当前执行节点”,写清当前子计划、状态、执行目标、进入条件、完成定义和验证方式。
|
|
144
|
+
7. status-doc 必须包含“子计划队列”,按顺序列出基础能力、核心实现、集成验收和完成整理等后续节点。
|
|
145
|
+
8. agent 每次继续任务时先读 status-doc,只推进当前执行节点;完成后同步更新 result-doc、plan-doc 和 status-doc 的下一个执行节点。
|
|
146
|
+
9. 最终计划必须同时具备总纲、分层顺序、模块或能力拆分、依赖与集成计划、验收标准、状态记录、阻塞点、后续检查点和下一步建议。
|
|
147
|
+
10. 生成顺序必须是:目标与约束、P0/P1 总纲、依赖顺序、目录或模块策略、基础阶段计划、核心实现计划、集成验收计划、执行计划。
|
|
148
|
+
11. 不要一开始直接写细表;先给总纲和阶段边界,再逐步细化。
|
|
149
|
+
12. 必须按依赖链路重排顺序,不按需求文档顺序、界面直觉或个人偏好排序。
|
|
150
|
+
13. 推荐依赖顺序:目标和范围、现状和影响面、基础结构、数据模型或接口契约、核心业务规则、关键模块或服务、集成链路、验证方案、发布和交接整理。
|
|
151
|
+
14. 不预设任务一定是前端页面或组件;应按实际需求拆成功能模块、领域能力、接口、命令、任务、作业、页面、组件、数据流或服务单元。
|
|
152
|
+
15. 集成和验收计划必须包含前置依赖、执行任务、验证方式、验收标准、完成定义和后续检查点。
|
|
153
|
+
16. 所有总览表和明细表统一使用“子任务 / 已完成 / 未完成 / 备注”四列。
|
|
154
|
+
17. 备注第一句必须写 \`状态:未开始\`、\`状态:进行中\`、\`状态:部分完成\`、\`状态:被阻塞\` 或 \`状态:已完成\`。
|
|
155
|
+
18. 备注必须说明阻塞点、依赖后续流程、后续检查点,以及是否允许跳过继续推进。
|
|
156
|
+
19. 文档前部必须包含“下一步建议”,明确现在先做什么、下一步接什么、第一个核心模块或能力何时开始、第一个集成或验收环节何时开始、当前默认执行主线是什么。
|
|
157
|
+
20. 验证计划必须按任务类型选择;纯逻辑、数据转换、接口契约、CLI 命令、权限规则和后端服务优先规划可自动执行的单元测试或集成测试。
|
|
158
|
+
21. 页面、可视化、组件交互、视觉和真实浏览器链路只生成严格手工测试文档;工具自身只执行纯逻辑测试。
|
|
159
|
+
22. 文档只有满足可直接推进、可记录阻塞、可恢复上下文、便于后续复查时,才算完整。`
|
|
147
160
|
},
|
|
148
161
|
{
|
|
149
162
|
fileName: "执行结果总结规范.md",
|
|
@@ -226,6 +239,43 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
226
239
|
6. 如果同一中文功能名同时存在 active 文档和 archived 文档,状态为 mixed,必须人工确认是否有遗漏文档需要继续归档。
|
|
227
240
|
7. 新功能开始时不要复用已归档中文功能名;需要返工时,新建后续中文功能名或明确从 archive 恢复。
|
|
228
241
|
8. status-doc 是当前状态记录,归档后不再作为当前任务入口。`
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
fileName: "功能完成检查规范.md",
|
|
245
|
+
content: `# 功能完成检查规范
|
|
246
|
+
|
|
247
|
+
## 功能描述
|
|
248
|
+
|
|
249
|
+
约束 agent 在完成小节点、识别到功能变更、准备最终回复或切换任务前,主动判断当前功能是否真正完成,并据此更新过程文档、询问是否更新长期记忆、询问是否归档或继续当前节点。
|
|
250
|
+
|
|
251
|
+
## 调用时机
|
|
252
|
+
|
|
253
|
+
- 完成一个小节点、阶段任务、反馈修复或功能开发后
|
|
254
|
+
- 修改了功能行为、项目结构、配置、测试策略、发布流程、CLI 交互、初始化逻辑或协作文档生成逻辑后
|
|
255
|
+
- 准备最终回复用户、提交代码、归档文档或切换到下一个任务前
|
|
256
|
+
- 用户表达“这个逻辑以后都这样”“沉淀为规则”“功能完成了”“继续下一个任务”等意图时
|
|
257
|
+
- agent hook 或用户手动执行 \`npx @skrupellose/code-helper finish\` 时
|
|
258
|
+
|
|
259
|
+
## 调用入口文件
|
|
260
|
+
|
|
261
|
+
${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
262
|
+
|
|
263
|
+
## 规则
|
|
264
|
+
|
|
265
|
+
1. 完成检查不是只在固定节点触发;只要 agent 识别到功能变更、项目改变或稳定规则变化,就必须主动判断是否需要进入完成检查。
|
|
266
|
+
2. 每次完成检查先读取 \`${config.directories.statusDoc}/<中文功能名>-状态.md\`,再读取对应 plan-doc 和 result-doc。
|
|
267
|
+
3. status-doc 是当前执行入口,必须能看出当前执行节点、子计划队列、完成定义、验证方式和下一步。
|
|
268
|
+
4. 当前小节点未完成时,不询问归档,不引导新任务;继续当前节点,或在 status-doc 记录阻塞原因和恢复条件。
|
|
269
|
+
5. 当前小节点完成但功能整体未完成时,更新 \`${config.directories.resultDoc}/<中文功能名>/实施记录.md\`、plan-doc 对应任务状态和 status-doc 的下一个执行节点。
|
|
270
|
+
6. 小节点完成后必须主动判断是否形成长期规则;如果形成稳定协作规范、项目约束、测试策略、发布流程或工具使用偏好,询问用户是否更新项目记忆。
|
|
271
|
+
7. 如果只是一次性实现细节、临时失败过程或短期调试状态,不写入长期记忆。
|
|
272
|
+
8. 功能整体完成时,先确认过程文档和验证结论已更新,再询问用户是否更新长期记忆、是否归档文档、是否选择下一个活动任务。
|
|
273
|
+
9. 更新长期记忆和归档文档都需要用户确认,不自动执行。
|
|
274
|
+
10. agent hook 只做提醒和检查,不替代 agent 判断;Git hook 只做提交前兜底。
|
|
275
|
+
11. 推荐运行 \`npx @skrupellose/code-helper finish <中文功能名> --check-only\` 作为收尾检查,不让检查命令直接修改项目文件。
|
|
276
|
+
12. 如果 \`finish\` 输出仍有未开始、进行中、部分完成或被阻塞节点,agent 必须继续当前功能,而不是切换新任务。
|
|
277
|
+
13. \`finish\` 输出的“必须确认事项”是强制收尾清单;最终回复前必须逐项处理或明确询问用户,不能只总结已完成内容。
|
|
278
|
+
14. 如果“必须确认事项”包含更新长期记忆、归档文档或选择下一个任务,agent 必须在最终回复中明确提出对应问题;用户确认前不得自动执行。`
|
|
229
279
|
},
|
|
230
280
|
{
|
|
231
281
|
fileName: "Agent协作规范.md",
|
|
@@ -239,6 +289,7 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
239
289
|
|
|
240
290
|
- 新 agent 接手项目或恢复上下文
|
|
241
291
|
- 开始新任务、拆分计划、记录阶段结果或检查规则
|
|
292
|
+
- 完成小节点、识别到功能变更、准备最终回复或切换任务前
|
|
242
293
|
- 多人或多 agent 交替推进同一项目时
|
|
243
294
|
|
|
244
295
|
## 调用入口文件
|
|
@@ -251,7 +302,16 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
251
302
|
2. 大任务先生成计划文档,再进入实现。
|
|
252
303
|
3. 小节点完成后写结果总结,避免只把结论留在对话里。
|
|
253
304
|
4. 当前仍影响决策的信息写入 status-doc,历史细节写入 result-doc。
|
|
254
|
-
5.
|
|
305
|
+
5. 不覆盖用户已有规则;确需重写时先说明变更范围和原因。
|
|
306
|
+
6. 主会话定位为协调者,只负责理解目标、拆分任务、分配子代理、审阅结果、同步过程文档和向用户汇报,不直接执行具体实现、调试、测试、文件修改或资料整理。
|
|
307
|
+
7. 任何需要读取大量代码、修改文件、运行命令、排查问题、生成文档、执行测试或整理数据的任务,都必须由子代理执行。
|
|
308
|
+
8. 派发子代理时,主会话必须写清任务目标、允许修改的范围、必须读取的规则、禁止触碰的内容、预期产物和验证方式,避免子代理扩大范围。
|
|
309
|
+
9. 子代理返回后,主会话必须审阅变更、验证结论、风险和未完成项;发现范围外改动、验证不足或结论不清时,继续派发补充任务或要求修正。
|
|
310
|
+
10. 主会话只汇总已审阅的子代理结果,并负责同步 status-doc、result-doc、长期记忆更新询问和最终回复。
|
|
311
|
+
11. 如果当前 agent 工具没有子代理能力,主会话必须先明确说明“当前工具不支持子代理执行”,列出原本应交给子代理的任务和由主会话执行的影响,等待用户确认后才能继续执行;用户未确认时不得擅自开始具体任务。
|
|
312
|
+
12. 完成小节点、识别到功能变更、准备最终回复或切换任务前,必须执行功能完成检查,判断是否继续当前节点、更新过程文档、询问更新长期记忆、询问归档或选择下一任务。
|
|
313
|
+
13. agent 识别到稳定规则、项目结构变化、测试策略变化、发布流程变化或长期协作偏好时,应主动询问用户是否更新项目记忆;用户确认前不自动写入长期规则。
|
|
314
|
+
14. Agent hooks 只作为完成检查提醒和兜底,不替代 agent 自己判断;Git hooks 只做提交前检查。`
|
|
255
315
|
}
|
|
256
316
|
];
|
|
257
317
|
}
|
|
@@ -261,11 +321,117 @@ ${entryFiles.map((file) => `- ${file}`).join("\n")}
|
|
|
261
321
|
*/
|
|
262
322
|
export function getSkillTemplates() {
|
|
263
323
|
return [
|
|
324
|
+
{
|
|
325
|
+
fileName: "agent-collaboration.SKILL.md",
|
|
326
|
+
content: `---
|
|
327
|
+
name: code-helper-agent-collaboration
|
|
328
|
+
description: 当开始新需求、迁移、重构、反馈修复、多人或多 agent 协作任务时必须使用。该 skill 约束主会话只负责理解目标、拆分任务、派发子代理、审阅结果、同步状态和最终汇报;具体读取代码、修改文件、运行命令、测试验证、资料整理或文档产出交给子代理。若当前工具没有子代理能力,必须先说明限制、列出影响并等待用户确认。
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
# Code Helper Agent 协作
|
|
332
|
+
|
|
333
|
+
## 目标
|
|
334
|
+
|
|
335
|
+
在同一项目中统一主会话与子代理的职责边界,避免主会话直接吞下所有具体执行细节,也避免子代理越权修改无关文件。
|
|
336
|
+
|
|
337
|
+
核心目标:
|
|
338
|
+
|
|
339
|
+
1. 主会话只做协调、分配、审阅、状态同步和最终汇报。
|
|
340
|
+
2. 具体读取、修改、测试、整理、排查和文档产出交给子代理执行。
|
|
341
|
+
3. 每次派发子代理都限定清晰范围,避免扩大影响面。
|
|
342
|
+
4. 子代理返回后,主会话必须审阅结果、验证结论和风险。
|
|
343
|
+
5. 当前工具没有子代理能力时,先说明限制并等待用户确认。
|
|
344
|
+
|
|
345
|
+
## 使用场景
|
|
346
|
+
|
|
347
|
+
当用户表达以下意图时,使用本 skill:
|
|
348
|
+
|
|
349
|
+
- 开始新需求、新功能、迁移、重构或反馈修复
|
|
350
|
+
- 需要读取大量代码或多份文档
|
|
351
|
+
- 需要修改文件、运行命令、执行测试或整理资料
|
|
352
|
+
- 多人或多 agent 交替推进同一项目
|
|
353
|
+
- 用户提醒“你不是独自工作”或要求按 Agent 协作规范执行
|
|
354
|
+
- 准备把任务拆给不同执行者并汇总结果
|
|
355
|
+
|
|
356
|
+
## 工作流
|
|
357
|
+
|
|
358
|
+
### 1. 主会话确认目标和边界
|
|
359
|
+
|
|
360
|
+
主会话先确认用户目标、必须遵守的入口规则、禁止触碰的目录、允许修改的文件范围、验证要求和交付格式。
|
|
361
|
+
|
|
362
|
+
如果任务涉及项目规则,还要先读取 AGENTS.md、CLAUDE.md 或项目中已声明的专题规则索引。
|
|
363
|
+
|
|
364
|
+
### 2. 拆分并派发子代理
|
|
365
|
+
|
|
366
|
+
凡是具体执行任务,默认交给子代理:
|
|
367
|
+
|
|
368
|
+
- 读取代码、搜索引用或梳理现状
|
|
369
|
+
- 修改源码、测试、配置或文档
|
|
370
|
+
- 运行构建、单测、检查或脚本
|
|
371
|
+
- 排查错误、复现问题或分析日志
|
|
372
|
+
- 整理资料、生成过程文档或验收文档
|
|
373
|
+
|
|
374
|
+
派发子代理时必须写清:
|
|
375
|
+
|
|
376
|
+
- 任务目标
|
|
377
|
+
- 允许读取和修改的范围
|
|
378
|
+
- 必须读取的规则或上下文
|
|
379
|
+
- 禁止触碰的文件、目录和命令
|
|
380
|
+
- 预期产物
|
|
381
|
+
- 必须返回的验证方式、风险和未完成项
|
|
382
|
+
|
|
383
|
+
不要把宽泛任务交给子代理,例如“看看哪里有问题”或“顺手修一下”。必须把范围收窄到可审阅、可验证的边界内。
|
|
384
|
+
|
|
385
|
+
### 3. 主会话审阅返回结果
|
|
386
|
+
|
|
387
|
+
子代理返回后,主会话必须审阅:
|
|
388
|
+
|
|
389
|
+
- 是否只处理了派发范围内的任务
|
|
390
|
+
- 是否存在范围外改动
|
|
391
|
+
- 变更是否满足用户目标
|
|
392
|
+
- 验证命令、测试结论或未验证原因是否充分
|
|
393
|
+
- 风险、阻塞和后续事项是否说明清楚
|
|
394
|
+
- 是否需要继续派发补充任务
|
|
395
|
+
|
|
396
|
+
主会话不能直接转述未经审阅的子代理结论。发现验证不足、范围扩大或结论不清时,应继续派发修正任务或向用户说明风险。
|
|
397
|
+
|
|
398
|
+
### 4. 同步状态并最终汇报
|
|
399
|
+
|
|
400
|
+
主会话只汇总已审阅的结果,并负责:
|
|
401
|
+
|
|
402
|
+
- 同步必要的 status-doc 或 result-doc
|
|
403
|
+
- 判断是否需要询问更新长期记忆
|
|
404
|
+
- 判断是否需要询问归档
|
|
405
|
+
- 向用户说明改动文件、验证结论、风险和建议下一步
|
|
406
|
+
|
|
407
|
+
如果用户明确禁止更新过程文档、归档、运行同步命令或提交代码,必须遵守用户约束。
|
|
408
|
+
|
|
409
|
+
## 无子代理能力时
|
|
410
|
+
|
|
411
|
+
如果当前 agent 工具没有可调用的子代理能力,主会话必须先停止具体执行,并向用户说明:
|
|
412
|
+
|
|
413
|
+
1. 当前工具不支持子代理执行。
|
|
414
|
+
2. 原本应交给子代理的任务清单。
|
|
415
|
+
3. 改由主会话执行会带来的影响,例如审阅隔离降低、并行度降低或需要更严格限定范围。
|
|
416
|
+
4. 需要用户确认后,主会话才可以继续执行具体读取、修改、测试或整理任务。
|
|
417
|
+
|
|
418
|
+
用户未确认前,不得擅自开始读取大量代码、修改文件、运行命令或生成过程文档。
|
|
419
|
+
|
|
420
|
+
## 边界规则
|
|
421
|
+
|
|
422
|
+
- 主会话只协调,不直接执行具体实现、调试、测试、资料整理或文档生成任务。
|
|
423
|
+
- 子代理不得扩大派发范围,不得触碰明确禁止的文件、目录、命令或生成产物。
|
|
424
|
+
- 派发任务必须限定范围、输入、产出和验证方式。
|
|
425
|
+
- 返回结果必须被主会话审阅后才能用于最终结论。
|
|
426
|
+
- 没有子代理能力时,必须说明限制并等待用户确认。
|
|
427
|
+
- 不回滚他人改动;如果发现无关改动,保留并在必要时说明。
|
|
428
|
+
- 用户明确给出的本轮约束优先,例如不运行同步命令、不改生成产物、不提交代码。`
|
|
429
|
+
},
|
|
264
430
|
{
|
|
265
431
|
fileName: "memory-tuning.SKILL.md",
|
|
266
432
|
content: `---
|
|
267
433
|
name: code-helper-memory-tuning
|
|
268
|
-
description: 当用户要求“更新记忆”“优化记忆”“沉淀规则”“整理 AGENTS.md”“整理 CLAUDE.md”“同步 AGENTS.md 和 CLAUDE.md
|
|
434
|
+
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
435
|
---
|
|
270
436
|
|
|
271
437
|
# Code Helper Memory Tuning
|
|
@@ -279,8 +445,8 @@ description: 当用户要求“更新记忆”“优化记忆”“沉淀规则
|
|
|
279
445
|
3. 具体规则默认拆分到 code-helper-docs/user-rules/ 下的专题文档。
|
|
280
446
|
4. 如果 code-helper-docs/ 或 code-helper-docs/user-rules/ 不存在,写入时先创建目录。
|
|
281
447
|
5. 每份专题文档统一包含“功能描述 / 调用时机 / 调用入口文件 / 规则”。
|
|
282
|
-
6.
|
|
283
|
-
7.
|
|
448
|
+
6. 用户确认更新记忆时,根据当前项目变更定向更新对应专题文档。
|
|
449
|
+
7. 新功能、小节点或重构形成稳定规则后,agent 主动询问用户是否更新记忆;用户确认前不自动写入长期记忆。
|
|
284
450
|
|
|
285
451
|
## 使用场景
|
|
286
452
|
|
|
@@ -382,7 +548,7 @@ AGENTS.md 和 CLAUDE.md 都只保留以下内容:
|
|
|
382
548
|
|
|
383
549
|
### 5. 定向更新记忆
|
|
384
550
|
|
|
385
|
-
|
|
551
|
+
当 agent 主动判断需要更新记忆,或用户明确触发“更新记忆”时:
|
|
386
552
|
|
|
387
553
|
1. 先查看当前项目变更。
|
|
388
554
|
2. 判断变更影响哪个专题。
|
|
@@ -394,13 +560,13 @@ AGENTS.md 和 CLAUDE.md 都只保留以下内容:
|
|
|
394
560
|
8. 不整份覆盖所有文档。
|
|
395
561
|
9. 不把短期任务状态写进长期记忆。
|
|
396
562
|
|
|
397
|
-
### 6.
|
|
563
|
+
### 6. 新功能、小节点或重构后的固定判断
|
|
398
564
|
|
|
399
|
-
|
|
565
|
+
如果刚完成新功能、小节点或重构,先判断是否形成稳定规则。
|
|
400
566
|
|
|
401
|
-
|
|
567
|
+
如果这次变更形成了新的项目规则、协作约束、测试策略、发布流程或长期偏好,必须询问用户是否更新记忆。
|
|
402
568
|
|
|
403
|
-
|
|
569
|
+
只有用户确认后,才根据当前 diff 或用户描述定向更新专题文档。
|
|
404
570
|
|
|
405
571
|
### 7. 校验
|
|
406
572
|
|
|
@@ -650,9 +816,10 @@ description: 当用户提供完整需求文档,并要求拆分开发计划、
|
|
|
650
816
|
|
|
651
817
|
- plan-doc:计划文档,记录阶段、依赖、任务表和验收标准。
|
|
652
818
|
- result-doc:实施记录,使用中文总结实际改动、验证结论、临时失败、风险和后续。
|
|
653
|
-
- status-doc
|
|
819
|
+
- status-doc:当前执行入口,只保留当前状态、当前执行节点、子计划队列、下一步、阶段进度、关键结论、关键索引、仍影响判断的风险点、最近一次更新。
|
|
654
820
|
|
|
655
821
|
状态文档不是流水账,不写完整命令输出、大段实现过程或已解决的旧风险。
|
|
822
|
+
状态文档必须让 agent 在恢复任务时直接知道“现在只推进哪一个子计划”,不能只写泛泛的任务摘要。
|
|
656
823
|
|
|
657
824
|
## 完成标准
|
|
658
825
|
|
|
@@ -721,21 +888,133 @@ description: 当用户要求归档功能文档、结束一个功能、查看当
|
|
|
721
888
|
- 已归档 status-doc 不再作为当前任务入口。
|
|
722
889
|
- 新功能不要复用已归档中文功能名。
|
|
723
890
|
- 需要返工时,优先新建后续中文功能名,或明确从 archive 恢复后再继续。`
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
fileName: "completion-review.SKILL.md",
|
|
894
|
+
content: `---
|
|
895
|
+
name: code-helper-completion-review
|
|
896
|
+
description: 当 agent 完成小节点、识别到功能变更或项目结构变化、准备最终回复、提交前检查、切换任务、询问是否归档、询问是否更新记忆,或用户要求“检查是否完成”“继续下一个任务”“功能收尾”时必须使用。该 skill 要读取 status-doc、plan-doc、result-doc,判断当前节点是否完成、是否需要继续当前功能、是否需要询问更新长期记忆、是否需要询问归档,并引导选择下一步任务。
|
|
897
|
+
---
|
|
898
|
+
|
|
899
|
+
# Code Helper 完成检查
|
|
900
|
+
|
|
901
|
+
## 目标
|
|
902
|
+
|
|
903
|
+
在每次功能开发或小节点推进后,避免 agent 直接进入总结或切换任务。先判断当前工作是否真的完成,再决定继续开发、更新过程文档、询问更新记忆、询问归档或选择下一个任务。
|
|
904
|
+
|
|
905
|
+
## 固定流程
|
|
906
|
+
|
|
907
|
+
1. 先读取 code-helper-docs/status-doc/<中文功能名>-状态.md,确认当前执行节点、完成定义、验证方式和子计划队列。
|
|
908
|
+
2. 再读取 code-helper-docs/plan-doc/<中文功能名>.md 和 code-helper-docs/result-doc/<中文功能名>/实施记录.md。
|
|
909
|
+
3. 当前节点未完成时,继续当前功能;不要询问归档,不要引导新任务。
|
|
910
|
+
4. 当前节点完成但功能整体未完成时,更新实施记录、计划文档状态和 status-doc 的下一个执行节点。
|
|
911
|
+
5. 识别到功能变更、项目结构变化、测试策略变化、发布流程变化或稳定协作规则时,主动询问用户是否更新长期记忆。
|
|
912
|
+
6. 只有功能整体完成并经用户确认后,才询问是否归档文档。
|
|
913
|
+
7. 归档后再查看活动任务,并引导用户选择下一步。
|
|
914
|
+
|
|
915
|
+
## 命令辅助
|
|
916
|
+
|
|
917
|
+
- 使用 \`npx @skrupellose/code-helper finish <中文功能名> --check-only\` 做收尾检查。
|
|
918
|
+
- 该命令只输出判断和建议,不自动更新记忆、不自动归档、不自动提交。
|
|
919
|
+
- 如果缺少功能名,优先从活动任务列表选择,不要求用户凭记忆输入。
|
|
920
|
+
- 命令输出中的“必须确认事项”是最终回复前必须处理的强制清单,不能被普通总结覆盖。
|
|
921
|
+
|
|
922
|
+
## 用户确认边界
|
|
923
|
+
|
|
924
|
+
- 可以自动更新 result-doc、plan-doc 和 status-doc 中属于当前任务过程的内容。
|
|
925
|
+
- 更新长期记忆前必须询问用户。
|
|
926
|
+
- 文档归档前必须询问用户。
|
|
927
|
+
- 需要选择下一任务时,必须先列出活动任务并询问用户。
|
|
928
|
+
- git commit、npm publish 等外部动作前必须询问用户。
|
|
929
|
+
|
|
930
|
+
## 判断原则
|
|
931
|
+
|
|
932
|
+
- 长期记忆只记录稳定规则,不记录一次性实现细节。
|
|
933
|
+
- 页面、可视化和真实浏览器链路仍只生成手工测试文档。
|
|
934
|
+
- Agent hooks 只作为提醒和兜底检查,不替代 agent 自己判断。
|
|
935
|
+
- Git hooks 只做提交前检查,不承担对话完成判断。`
|
|
724
936
|
}
|
|
725
937
|
];
|
|
726
938
|
}
|
|
727
939
|
/**
|
|
728
|
-
* 返回可选
|
|
729
|
-
*
|
|
940
|
+
* 返回可选 hook 模板。
|
|
941
|
+
* Git hooks 和 Agent hooks 分别受不同功能开关控制,避免概念混用。
|
|
730
942
|
*/
|
|
731
943
|
export function getHookTemplates() {
|
|
732
944
|
return [
|
|
733
945
|
{
|
|
734
946
|
fileName: "pre-commit.sample",
|
|
947
|
+
feature: "gitHooks",
|
|
735
948
|
content: `#!/bin/sh
|
|
736
949
|
# code-helper 可选 pre-commit 模板。
|
|
737
950
|
# 启用方式:复制到 .git/hooks/pre-commit 并添加可执行权限。
|
|
951
|
+
# code-helper:managed-pre-commit
|
|
738
952
|
npx @skrupellose/code-helper check
|
|
953
|
+
`
|
|
954
|
+
},
|
|
955
|
+
{
|
|
956
|
+
fileName: "agent-finish-check.mjs.sample",
|
|
957
|
+
feature: "agentHooks",
|
|
958
|
+
content: `#!/usr/bin/env node
|
|
959
|
+
/**
|
|
960
|
+
* code-helper Agent hook 示例。
|
|
961
|
+
* 适合接到 Codex / Claude Code 等 agent 的 Stop、收尾或提交前生命周期事件中。
|
|
962
|
+
* 该脚本只运行完成检查,不自动修改文件、不归档、不更新长期记忆。
|
|
963
|
+
*/
|
|
964
|
+
import { spawnSync } from "node:child_process";
|
|
965
|
+
|
|
966
|
+
const command = process.platform === "win32" ? "npx.cmd" : "npx";
|
|
967
|
+
const result = spawnSync(command, ["@skrupellose/code-helper", "finish", "--check-only"], {
|
|
968
|
+
cwd: process.cwd(),
|
|
969
|
+
encoding: "utf8"
|
|
970
|
+
});
|
|
971
|
+
|
|
972
|
+
if (result.stdout.trim() !== "") {
|
|
973
|
+
console.log(result.stdout.trim());
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
if (result.stderr.trim() !== "") {
|
|
977
|
+
console.error(result.stderr.trim());
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
process.exit(result.status ?? 0);
|
|
981
|
+
`
|
|
982
|
+
},
|
|
983
|
+
{
|
|
984
|
+
fileName: "agent-hooks.md.sample",
|
|
985
|
+
feature: "agentHooks",
|
|
986
|
+
content: `# code-helper Agent hooks 模板
|
|
987
|
+
|
|
988
|
+
## 用途
|
|
989
|
+
|
|
990
|
+
Agent hooks 用于在 agent 准备最终回复、停止任务、提交前检查或切换任务前,提醒运行完成检查。
|
|
991
|
+
|
|
992
|
+
## 推荐命令
|
|
993
|
+
|
|
994
|
+
\`\`\`bash
|
|
995
|
+
node .code-helper/hooks/agent-finish-check.mjs
|
|
996
|
+
\`\`\`
|
|
997
|
+
|
|
998
|
+
如果所在 agent 工具支持分别配置 macOS/Linux 和 Windows 命令,Windows 可以使用:
|
|
999
|
+
|
|
1000
|
+
\`\`\`powershell
|
|
1001
|
+
node .code-helper\\hooks\\agent-finish-check.mjs
|
|
1002
|
+
\`\`\`
|
|
1003
|
+
|
|
1004
|
+
## 行为边界
|
|
1005
|
+
|
|
1006
|
+
- hook 只运行 \`code-helper finish --check-only\`。
|
|
1007
|
+
- hook 不自动更新长期记忆。
|
|
1008
|
+
- hook 不自动归档文档。
|
|
1009
|
+
- hook 不自动提交代码。
|
|
1010
|
+
- agent 仍需要根据输出主动询问用户是否更新记忆、归档或选择下一任务。
|
|
1011
|
+
|
|
1012
|
+
## code-helper 安装命令
|
|
1013
|
+
|
|
1014
|
+
\`\`\`bash
|
|
1015
|
+
npx @skrupellose/code-helper hooks install codex
|
|
1016
|
+
npx @skrupellose/code-helper hooks install claudecode
|
|
1017
|
+
\`\`\`
|
|
739
1018
|
`
|
|
740
1019
|
}
|
|
741
1020
|
];
|
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;
|