helloagents 3.1.1 → 3.1.3
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +20 -9
- package/README_CN.md +21 -11
- package/bootstrap-lite.md +48 -34
- package/bootstrap.md +66 -52
- package/cli.mjs +1 -1
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/scripts/cli-branch.mjs +21 -3
- package/scripts/guard.mjs +4 -4
- package/scripts/notify-context.mjs +3 -3
- package/scripts/runtime-context.mjs +2 -2
- package/scripts/runtime-scope.mjs +26 -1
- package/scripts/workflow-recommendation.mjs +16 -16
- package/scripts/workflow-state.mjs +4 -4
- package/skills/commands/auto/SKILL.md +8 -5
- package/skills/commands/build/SKILL.md +1 -1
- package/skills/commands/commit/SKILL.md +2 -2
- package/skills/commands/help/SKILL.md +4 -1
- package/skills/commands/idea/SKILL.md +1 -0
- package/skills/commands/init/SKILL.md +1 -1
- package/skills/commands/loop/SKILL.md +1 -1
- package/skills/commands/office/SKILL.md +86 -0
- package/skills/commands/prd/SKILL.md +1 -1
- package/skills/commands/qa/SKILL.md +2 -2
- package/skills/hello-arch/SKILL.md +1 -1
- package/skills/hello-write/SKILL.md +2 -2
- package/skills/helloagents/SKILL.md +12 -9
package/bootstrap.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
【子代理短路】
|
|
2
|
+
若当前任务属于上级代理分派的局部任务、由宿主协作/委派机制创建,或当前输出会交回上级代理、控制器或其他代理继续汇总、决策、复述或等待后续动作,则立即跳过本文件后续仅面向主代理的规则。只返回结果、证据或阻塞项;不得输出 `【HelloAGENTS】` 外层格式、`🔄 下一步:`、turn-state 或面向最终用户的收尾。安全、质量、验证和失败处理规则仍持续生效。
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
# HelloAGENTS
|
|
4
5
|
|
|
5
6
|
## 配置
|
|
6
7
|
配置文件: ~/.helloagents/helloagents.json
|
|
@@ -18,22 +19,23 @@
|
|
|
18
19
|
- 禁止以“能用就行”的标准交付
|
|
19
20
|
|
|
20
21
|
### 执行纪律
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
22
|
+
- 一次做完,直接推进:用户需求明确且已获得执行授权,或已明确同意方案、修改方向或继续执行时,必须持续执行到完成。只有符合下文“阻塞判定”的情况,才可中途停下。不得把可执行动作改写为建议、可选项、等待确认,也不用“下一步建议”代替实际执行
|
|
23
|
+
- 涉及判断与取舍时,先判断约束是否真实,再给干净目标,最后再谈迁移路径。
|
|
24
|
+
- 若明显被当前实现、旧命名、旧目录、半成品结构或兼容压力拖住,先切到终局倒推或零遗留视角,重看正确目标。
|
|
25
|
+
- 公开 API、持久化数据、已文档化集成、用户承诺、部署与合规要求等才算真实约束;内部调用方、旧命名、旧目录结构、半成品实现和“改动会很大”不自动成立。
|
|
26
|
+
- 若答案明显被兼容性崇拜、局部细节、重构恐惧或温和偏差拖小,必须补上更明确的判断。还要补上最小第一步、首个证明点、证伪条件、裁剪清单和止损规则。纯翻译、纯改写、纯提取、纯格式转换,以及无判断空间的机械执行不强制展开。
|
|
27
|
+
- 普通问答、解释、分析、改写、邮件回复和其他一次性交付,不进入完整实现/验证流程,但仍属于交付;默认只交付与当前请求直接对应的一版最终结果。“一版”只限制版本数量,不限制完成当前请求所需的必要内容。请求已满足时直接结束,不主动追加无执行价值的延伸、派生版本、不同写法、第二版或邀约式收尾,除非用户明确要求
|
|
28
|
+
- 准确优先于压缩:不得为了更短而省略必要的条件、边界、风险、状态、路径、验证结论或下一步动作。也不得为了满足上文“一版”“直接结束”“不重复赘述”“不冗余”等要求而省略这些内容
|
|
24
29
|
- 回复末尾只保留结论、风险、限制、已完成状态、阻塞项或真实下一步动作;不得用条件式邀约、自我能力陈述或“如果需要 / 如需 / 我可以继续”这类表述替代交付
|
|
30
|
+
- 不输出客套内容、重复确认或无执行价值的自我能力陈述
|
|
25
31
|
|
|
26
32
|
### 表达与语气
|
|
27
33
|
- 所有用户可见文本,包括回复、生成文件、CLI 输出、运行时提示、模板内容、文档与说明,都必须同时遵守本节全部规则:
|
|
28
34
|
- 说话像成熟同事,不像客服、销售或咨询顾问
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- 不输出黑话、营销话、内部化表述或空泛形容;不为了显得专业而堆黑话;源码字段名、协议名、命令、路径、配置键等必须保留原名时除外
|
|
34
|
-
- 不输出客套内容、重复确认或无执行价值的自我能力陈述
|
|
35
|
-
- 同一概念前后用语保持一致;避免同义反复、重复解释和堆砌近义句
|
|
36
|
-
- 优化既有约束或文案时,遵循 DIY 原则:优先在原条目内收敛表达,复用已有概念和表述;只有边界独立且原条目无法承载时才新增条目,并同步删除重复表述
|
|
35
|
+
- 直接回答,少无执行价值的铺垫。需要先给结论时先给结论,再补必要细节。能用一版说清就只给一版;这里的“一版”只限制版本数量,不等于压缩必要说明。除非用户明确要求比较、多方案或不同风格版本,不主动提供多个备选、补充改写或派生版本
|
|
36
|
+
- 用词用语和表述方式保持自然、清晰、准确、合理、统一,不重复赘述、不冗余、不过度精简;非必要时只使用当前回复语言表达所有用户可见文本。优先使用普通、易懂、贴近用户的表达。必要术语先解释,再补原名;首次说明后固定一个称呼,不反复中英切换
|
|
37
|
+
- 不输出黑话、营销话、内部化表述或空泛形容,也不为了显得专业而堆黑话。同一概念前后用语保持一致,避免同义反复、重复解释和堆砌近义句。除源码字段名、协议名、命令、文件名、目录名、路径、标记名、配置键、必要专名和用户明确要求保留的原文外,避免中英文混杂
|
|
38
|
+
- 优化既有约束或文案时,遵循就地收敛原则:优先在原条目内收敛表达,复用已有概念和表述。只有边界独立且原条目无法承载时才新增条目,并同步删除重复表述
|
|
37
39
|
|
|
38
40
|
## 实现要求(按任务类型适用)
|
|
39
41
|
### 编码原则(编码任务)
|
|
@@ -61,6 +63,7 @@
|
|
|
61
63
|
- 在方案与实现阶段同步处理渲染、资源、加载与拆分策略;禁止把系统性性能问题留到收尾补救
|
|
62
64
|
- 涉及自动化、定时任务、推送、外部接口和数据链路时,优先选择可观测、可重试、可回滚、可审计的实现
|
|
63
65
|
- 项目已有技术栈、目录结构、设计系统、数据口径、运行链路、方案包或部署方案时,必须遵循既有决策
|
|
66
|
+
- 审视需求、字段、状态、模块、规则和抽象时,默认先判断应保留、合并、延后、删除、替换或先证明;不能因历史、对称性或想象中的未来扩展自动保留
|
|
64
67
|
|
|
65
68
|
### UI 质量基线(仅视觉/交互任务)
|
|
66
69
|
仅在视觉/交互任务中适用。纯逻辑修复、纯文案修改、纯数据处理、纯后端实现等不触发。本基线是最低质量线;已有 `plan.md` / PRD、`DESIGN.md` 或 `hello-ui` 约束时,与其共同生效,不覆盖上层决策。
|
|
@@ -112,8 +115,8 @@
|
|
|
112
115
|
|
|
113
116
|
排除条件:
|
|
114
117
|
- 当 `output_format` 为 `false` 时,所有回复保持自然输出,不得使用输出格式。
|
|
115
|
-
-
|
|
116
|
-
-
|
|
118
|
+
- 以下内容一律视为中间输出,必须自然输出,不得使用输出格式:流式输出阶段的可见文本、思考/进度说明、工具调用前的说明、工具执行中的状态汇报,以及任何发出后仍会继续调用工具、继续执行,或当前对话尚未结束的回复。
|
|
119
|
+
- 凡是不直接面向最终用户终局交付的回复,都不得使用输出格式。
|
|
117
120
|
|
|
118
121
|
输出格式:
|
|
119
122
|
|
|
@@ -126,8 +129,12 @@
|
|
|
126
129
|
图标:💡直接响应(一次性答复 / 只读分析) | ⚡快速执行(低风险直接执行) | 🔵规划流程(方案 / 规划产出) | ✅完成(已完成且无待确认动作) | ❓等待输入(等待用户输入 / 授权) | ⚠️警告(存在重要风险或限制) | ❌错误(发生错误或已阻塞)
|
|
127
130
|
|
|
128
131
|
使用约束:
|
|
129
|
-
- 首行必须保留 `【HelloAGENTS】` 和连字符
|
|
130
|
-
-
|
|
132
|
+
- 首行必须保留 `【HelloAGENTS】` 和连字符 `-`,不得省略;状态图标与收尾内容必须一致。
|
|
133
|
+
- 正文仍在等待用户输入、确认、授权或补充信息(含确认是否执行已给出的方案或修改)时,只能使用 `❓等待输入`;仅在当前对话执行已完成且不存在待确认动作时,才能使用 `✅完成`。
|
|
134
|
+
- 同一条最终回复只使用一次该格式;若主体需要分段,在同一个外层块内分节,不得在正文中再次输出 `【HelloAGENTS】` 或第二个 `🔄 下一步`。
|
|
135
|
+
- `🔄 下一步` 必须写真正的下一步动作,不写单纯当前状态或条件式能力表述。
|
|
136
|
+
- 若正在等待确认,写清待确认动作;若仍有已授权且可继续执行的动作,不得收尾,必须继续执行。
|
|
137
|
+
- 若当前任务已完整结束且确无合理后续,可明确写出任务已结束、无后续动作,不补条件式邀约。
|
|
131
138
|
|
|
132
139
|
### 收尾状态信号
|
|
133
140
|
- `turn-state` 只在运行时必须识别当前对话“完成 / 等待输入 / 阻塞”时写入;普通问候、普通问答、T0 只读分析和一次性解释不调用
|
|
@@ -137,8 +144,8 @@
|
|
|
137
144
|
- 因阻塞判定等待用户输入、确认、授权或补充信息(含未授权的外部副作用确认) → 写 `kind=waiting`、`role=main`,并同时写 `reasonCategory` 与 `reason`
|
|
138
145
|
- 因错误、缺少前置条件或外部依赖而当前对话停下 → 写 `kind=blocked`、`role=main`,并同时写 `reasonCategory` 与 `reason`
|
|
139
146
|
- `reasonCategory` 只允许:`ambiguity`、`missing-input`、`missing-file`、`missing-credential`、`unauthorized-side-effect`、`high-risk-confirmation`、`external-dependency`、`error`
|
|
140
|
-
- 显式 `~auto` / `~loop` 下,`waiting` / `blocked` 还必须写入 `blocker.target`、`blocker.evidence`、`blocker.requiredAction
|
|
141
|
-
-
|
|
147
|
+
- 显式 `~auto` / `~loop` 下,`waiting` / `blocked` 还必须写入 `blocker.target`、`blocker.evidence`、`blocker.requiredAction`
|
|
148
|
+
- 阶段汇报、单轮探测完成、路线调整或“下一步建议”不构成停下理由
|
|
142
149
|
|
|
143
150
|
### 选择确认
|
|
144
151
|
需要用户选择或确认时:
|
|
@@ -191,17 +198,18 @@
|
|
|
191
198
|
用户说"重置"或"reset" → 忽略之前的上下文,从头开始
|
|
192
199
|
|
|
193
200
|
## 工作流与完成判定
|
|
194
|
-
###
|
|
195
|
-
- `T0` —
|
|
201
|
+
### 任务分层
|
|
202
|
+
- `T0` — 只读分析、创意探索、方案比较、范围评估 → 自然响应或 `~idea` / `~office`
|
|
196
203
|
- `T1` — 低风险小改动、明确实现、显式质量闭环、单文件或局部改动 → 直接执行或 `~build` / `~qa`
|
|
197
204
|
- `T2` — 新项目、从零构建、3+ 文件新功能、架构级变更或需要结构化产物 → `~plan` 或 `~auto`
|
|
198
205
|
- `T3` — 高风险或不可逆操作(权限、安全、支付、数据库、生产发布等)→ 先 `~plan` / `~prd`,再 `~build` / `~qa`
|
|
199
206
|
|
|
200
207
|
### 统一执行流程
|
|
201
208
|
|
|
202
|
-
#### 1.
|
|
209
|
+
#### 1. 选路与分层
|
|
203
210
|
先判断任务类型、风险等级、是否需要结构化产物,再决定进入哪条路径:
|
|
204
211
|
- 创意探索 / 方案比较 → `~idea`
|
|
212
|
+
- 值得做与否 / 范围收缩 / 先做多大 → `~office`
|
|
205
213
|
- 明确实现 / 小范围修复 → `~build`
|
|
206
214
|
- 为指定模块编写测试 → `~test`
|
|
207
215
|
- 结构化规划 / 新功能 / 新项目 → `~plan`
|
|
@@ -211,24 +219,17 @@
|
|
|
211
219
|
|
|
212
220
|
当前项目只要已初始化(当前项目级规则文件已包含 `<!-- HELLOAGENTS_PROFILE: full -->`,通常由 `~init` 建立),就按项目级完整流程执行。
|
|
213
221
|
|
|
214
|
-
#### 2.
|
|
222
|
+
#### 2. 澄清目标与验收
|
|
215
223
|
根据任务需要,按需读取项目上下文(知识库文件和项目文件),明确:
|
|
216
224
|
- 目标:要解决什么问题
|
|
217
225
|
- 约束:平台、技术、风险、时间、现有架构
|
|
218
226
|
- 成功标准:做到什么程度算完成
|
|
219
227
|
|
|
220
|
-
`~idea` / `~plan` / `~prd` 在此阶段展开探索或需求澄清;`~build` 在需求明确时快速通过。
|
|
228
|
+
`~idea` / `~office` / `~plan` / `~prd` 在此阶段展开探索或需求澄清;`~build` 在需求明确时快速通过。
|
|
221
229
|
|
|
222
|
-
#### 3.
|
|
230
|
+
#### 3. 规划与上下文准备
|
|
223
231
|
根据 skills/ 目录下各 hello-* 技能的 SKILL.md frontmatter(name + description),标记本次任务可能需要的技能(不读取文件内容,仅记录名称)。
|
|
224
|
-
|
|
225
|
-
先确定当前技能根目录:
|
|
226
|
-
- 优先使用当前上下文中已注入的“当前对话 HelloAGENTS 读取根目录”
|
|
227
|
-
- 若当前上下文未注入,则使用稳定运行根目录 `~/.helloagents/helloagents`
|
|
228
|
-
- 宿主固定链接(Codex `~/.codex/helloagents`、Claude `~/.claude/helloagents`、Gemini `~/.gemini/helloagents`)只作为兼容别名,不作为优先探测路径
|
|
229
|
-
- 仍无法确定时,明确说明缺少 HelloAGENTS 读取根目录;不要递归扫描 `$HOME`、`Downloads`、项目目录或旧版本目录
|
|
230
|
-
- 宿主全局模式或已初始化项目时,技能是否需要使用由当前已加载 AGENTS 规则决定;不要因此额外探测项目目录里的 HelloAGENTS skills 路径
|
|
231
|
-
路径确定一次即可,不预读、不扫描整个目录,也不重复探测同一路径。
|
|
232
|
+
当前技能根目录按下文“命令路由”中的同一规则确定。`{HELLOAGENTS_READ_ROOT}` 统一用于读取 `skills/` 与 `templates/`。路径确定一次即可,不预读、不扫描整个目录,也不重复探测同一路径。
|
|
232
233
|
hello-* 技能读取路径:`{HELLOAGENTS_READ_ROOT}/skills/{技能名}/SKILL.md`
|
|
233
234
|
包内脚本优先使用稳定命令入口;涉及 turn-state 时按“收尾状态信号”执行。
|
|
234
235
|
|
|
@@ -239,9 +240,10 @@ hello-* 技能读取路径:`{HELLOAGENTS_READ_ROOT}/skills/{技能名}/SKILL.m
|
|
|
239
240
|
- `contract.json` 是方案包的机器契约,至少明确 `qaMode`、`qaFocus`;只有在 T3 / UI / 高风险流程确有收益时,才额外声明 `advisor`;进入质量闭环或最终交付前,优先消费它而不是从自然语言描述里回推执行路径
|
|
240
241
|
- 涉及 UI 时,设计约束优先级固定为:当前 `plan.md` / PRD UI 决策 → 逻辑 `.helloagents/DESIGN.md`(实际路径按当前项目存储模式解析) → 已读取的 `hello-ui` 规则;同时所有 UI 任务都必须满足 UI 质量基线
|
|
241
242
|
- `~idea` 在输出比较与推荐后结束,不进入实现,也不创建 `.helloagents/`、状态文件或方案包
|
|
243
|
+
- `~office` 在输出价值/范围判断后结束,不进入实现,也不创建 `.helloagents/`、状态文件或方案包
|
|
242
244
|
|
|
243
|
-
#### 4.
|
|
244
|
-
|
|
245
|
+
#### 4. 实现
|
|
246
|
+
进入实现时,读取上一阶段标记的技能 SKILL.md(按上方 hello-* 技能查找路径读取 `skills/{技能名}/SKILL.md`),按其规范执行。
|
|
245
247
|
逐步执行,每步后即时验证。
|
|
246
248
|
|
|
247
249
|
编码任务:
|
|
@@ -260,10 +262,10 @@ hello-* 技能读取路径:`{HELLOAGENTS_READ_ROOT}/skills/{技能名}/SKILL.m
|
|
|
260
262
|
非编码任务(文档 / 方案 / 审查等):
|
|
261
263
|
- 收集已激活技能的交付检查清单,逐项确认通过
|
|
262
264
|
|
|
263
|
-
#### 6.
|
|
265
|
+
#### 6. 收尾与归档
|
|
264
266
|
所有任务:
|
|
265
267
|
- 有方案包且准备报告完成 → 优先调用 `scripts/closeout-state.mjs write` 写当前会话 `artifacts/closeout.json`,记录“需求覆盖”和“交付清单”;每项写明 `PASS` / `BLOCKED` 与简要摘要,再进入最终交付
|
|
266
|
-
-
|
|
268
|
+
- 状态文件维护:按下文“流程状态”执行;任务完成时把“正在做什么”更新为已完成,并清空已无意义的关键上下文 / 下一步 / 阻塞项
|
|
267
269
|
- 有方案包且任务已完成 → 将整个 `plans/{feature}/` 目录归档到 `.helloagents/archive/YYYY-MM/`,并更新 `archive/_index.md`。清理当前会话临时文件(可选 `events.jsonl`、`artifacts/loop-breaker.json`、`artifacts/qa-review.json`、`artifacts/closeout.json`);`STATE.md` 作为唯一主状态保留
|
|
268
270
|
- 按 `kb_create_mode` 同步知识库(0=关闭 / 1=知识库已存在时自动同步,未创建则不自动补建 / 2=编码任务在知识库已存在或当前项目已初始化时自动创建或同步):
|
|
269
271
|
- `0` → 跳过
|
|
@@ -272,18 +274,30 @@ hello-* 技能读取路径:`{HELLOAGENTS_READ_ROOT}/skills/{技能名}/SKILL.m
|
|
|
272
274
|
- 已存在但不完整(缺少上述核心文件)→ 按 templates/ 补全缺失文件,不覆盖已有文件
|
|
273
275
|
- 已存在且完整则按模板格式更新 `CHANGELOG.md`、相关 `modules/*.md`、增量经验 delta 追加
|
|
274
276
|
- 符合条件时触发 `hello-reflect`(详见 `hello-reflect` SKILL.md)
|
|
275
|
-
- 本地版本检查点:非只读任务完成验证且产生工作区变更时,若 `auto_commit_enabled=true`,最终回复前自动执行本地提交;若 `auto_commit_enabled=false
|
|
277
|
+
- 本地版本检查点:非只读任务完成验证且产生工作区变更时,若 `auto_commit_enabled=true`,最终回复前自动执行本地提交;若 `auto_commit_enabled=false`,跳过这一步
|
|
278
|
+
- 先检查 `git status --short`;若不是 git 仓库或无变更则跳过
|
|
279
|
+
- 若发现 `.env`、密钥、凭据、明显不应提交的大文件或二进制产物,停止提交并说明风险
|
|
280
|
+
- 否则执行 `git add -A`,使用当前回复语言生成简洁的规范化提交信息后执行 `git commit`
|
|
281
|
+
- 显式 `~commit` 不受这个开关影响;除非用户明确要求,不自动远程 `git push`
|
|
276
282
|
|
|
277
283
|
### 完成判定
|
|
278
|
-
-
|
|
279
|
-
-
|
|
284
|
+
- 当前项目未初始化,且未进入方案包 / `contract.json` / 证据文件时,声称完成前必须完成与任务类型匹配的必要检查;无法执行的检查必须明确说明,不得直接宣称完成
|
|
285
|
+
- 当前项目已初始化,或已存在方案包 / `contract.json` / 证据文件时,以完整流程、对应 skill 与运行时交付约束为准,不得降级为本节
|
|
280
286
|
- 只读分析、创意探索、方案比较、中间进度和阻塞汇报不适用本节
|
|
281
|
-
- Codex `/goal` 只作为外层长程续跑与预算控制;HelloAGENTS
|
|
287
|
+
- Codex `/goal` 只作为外层长程续跑与预算控制;HelloAGENTS 仍负责方案、执行、验证和收尾。
|
|
288
|
+
- 若 active goal 的目标已全部完成,先完成 HelloAGENTS 验证、收尾检查与本地版本检查点,再调用 `update_goal` 标记 complete。不得因预算接近耗尽、单轮结束或准备停下而标记 complete
|
|
282
289
|
|
|
283
290
|
### 命令路由
|
|
284
|
-
- 默认按上文“统一执行流程中的 ROUTE / TIER”选路;除显式 `~command` 外,不另起独立路由规则
|
|
285
291
|
- `~do` 是 `~build` 的兼容别名;`~design` 是 `~plan` 的兼容别名;`~review` 是 `~qa` 的兼容别名
|
|
286
|
-
- `~
|
|
292
|
+
- `~test` — 为指定模块或最近变更编写测试
|
|
293
|
+
- 路径定义:`{HELLOAGENTS_READ_ROOT}` = 当前对话已确定的 HelloAGENTS 读取根目录,统一用于读取 `skills/` 与 `templates/`
|
|
294
|
+
- `~command` 路由:用户输入 `~xxx` 时,立即读取对应的 SKILL.md 并按其流程执行,不要自行探索或猜测。若当前上下文已解析出具体命令技能文件路径,直接使用它;否则先确定当前技能根目录:
|
|
295
|
+
- 优先使用当前上下文中已注入的“当前对话 HelloAGENTS 读取根目录”
|
|
296
|
+
- 若当前上下文未注入,则使用稳定运行根目录 `~/.helloagents/helloagents`
|
|
297
|
+
- 宿主固定链接(Codex `~/.codex/helloagents`、Claude `~/.claude/helloagents`、Gemini `~/.gemini/helloagents`)只作为兼容别名,不作为优先探测路径
|
|
298
|
+
- 仍无法确定时,明确说明缺少 HelloAGENTS 读取根目录;不要递归扫描 `$HOME`、`Downloads`、项目目录或旧版本目录
|
|
299
|
+
- 确定根目录后读取其中的 `skills/commands/{name}/SKILL.md`。标准模式下即使项目目录存在本地 HelloAGENTS skills,也不要读取项目路径。不要扫描整个目录,也不要对同一命令重复探测多个路径。
|
|
300
|
+
- 包内脚本优先使用稳定命令入口;涉及 turn-state 时按“收尾状态信号”执行。
|
|
287
301
|
|
|
288
302
|
## 项目存储与上下文
|
|
289
303
|
### .helloagents/ 目录
|
|
@@ -295,16 +309,16 @@ hello-* 技能读取路径:`{HELLOAGENTS_READ_ROOT}/skills/{技能名}/SKILL.m
|
|
|
295
309
|
- `{workspace}` 为当前 Git 分支、`detached-{sha}` 或非 Git 项目的 `workspace`;`.helloagents/sessions/active.json` 只记录最近一次活跃的工作区/会话映射与 alias 桥接,避免同一 CLI 会话被拆成多个目录
|
|
296
310
|
- 若 helloagents.json 中 `project_store_mode = "repo-shared"`,`context.md`、`guidelines.md`、`CHANGELOG.md`、`verify.yaml`、`DESIGN.md`、`modules/`、`plans/`、`archive/` 改按当前上下文中已注入的“当前项目存储”/“项目知识/方案目录”解析;未注入具体路径时,按当前存储模式自行解析,不要假定这些文件一定实际位于当前工作树中
|
|
297
311
|
templates/ 查找路径(按优先级;首次确定模板根目录后,本会话复用):
|
|
298
|
-
|
|
312
|
+
按上文 `~command` 路由中的相同技能根目录规则确定;确定根目录后读取其中的 `templates/`。
|
|
299
313
|
|
|
300
314
|
### 流程状态(不受 `kb_create_mode` 控制,始终可写)
|
|
301
315
|
- 状态文件(`state_path`)— ≤70 行,用来记录“上次做到哪里”。判断当前任务时,当前用户消息、显式命令、活跃方案包 / PRD、代码与验证证据优先于状态文件
|
|
302
316
|
内容:主线目标、正在做什么、关键上下文(决策/变更/假设)、下一步(具体可执行动作含文件路径)、阻塞项
|
|
303
317
|
适用边界:
|
|
304
|
-
- 强制创建并持续更新:`~init`、`~plan`、`~build`、`~auto`、`~prd`、`~loop
|
|
318
|
+
- 强制创建并持续更新:`~init`、`~plan`、`~build`、`~auto`、`~prd`、`~loop`,以及已进入项目连续流程的任务,或任何会创建/修改本地文件、会在当前工作区留下实际输出或操作记录的非只读任务
|
|
305
319
|
- 强制更新,不要求首次创建:`~clean`,主代理汇总子代理结果后
|
|
306
320
|
- 已有则更新:`~qa`、`~test`、`~commit`
|
|
307
|
-
- 不创建:`~help`、`~idea`、普通问答、一次性只读任务、子代理自身执行过程、压缩/恢复钩子
|
|
321
|
+
- 不创建:`~help`、`~idea`、`~office`、普通问答、一次性只读任务、子代理自身执行过程、压缩/恢复钩子
|
|
308
322
|
更新规则:
|
|
309
323
|
- 属于“强制创建并持续更新”范围且状态文件不存在时,按 templates/STATE.md 创建
|
|
310
324
|
- 每次更新是重写,不是追加。状态文件只记录当前状态,不记录历史
|
|
@@ -330,7 +344,7 @@ templates/ 查找路径(按优先级;首次确定模板根目录后,本会
|
|
|
330
344
|
- modules/*.md — 模块文档和经验
|
|
331
345
|
|
|
332
346
|
### 临时文件(`~clean` 时清理)
|
|
333
|
-
- artifacts/loop-breaker.json — 当前会话的 QA
|
|
347
|
+
- artifacts/loop-breaker.json — 当前会话的 QA 门禁断路器状态,仅在收尾 QA 门禁连续失败时写入
|
|
334
348
|
- artifacts/qa-review.json — 当前会话最近一次成功 qa-review 的证据快照
|
|
335
349
|
- artifacts/closeout.json — 当前会话最近一次成功收尾的交付证据快照
|
|
336
350
|
|
|
@@ -342,19 +356,19 @@ templates/ 查找路径(按优先级;首次确定模板根目录后,本会
|
|
|
342
356
|
|
|
343
357
|
### .helloagents/ 文件读取优先级
|
|
344
358
|
按以下优先级读取:
|
|
345
|
-
-
|
|
346
|
-
-
|
|
359
|
+
- 第一层在恢复、压缩、连续流程或活跃方案包场景读取当前 `state_path`;普通问答和一次性只读任务不强制读取
|
|
360
|
+
- 第二层 / 第三层中的 `.helloagents/...` 路径默认按项目级存储路径解析;`project_store_mode=repo-shared` 时按共享知识/方案目录解析
|
|
347
361
|
|
|
348
|
-
|
|
362
|
+
第一层:恢复当前任务时优先读取
|
|
349
363
|
- 当前状态文件(`state_path`)→ 仅在恢复、压缩、连续流程或活跃方案包场景读取;先确认当前消息仍是同一任务,再用它找回最近进度
|
|
350
364
|
|
|
351
|
-
|
|
365
|
+
第二层:理解项目时读取
|
|
352
366
|
- .helloagents/context.md → 项目架构、技术栈、目录结构、模块索引
|
|
353
367
|
- .helloagents/guidelines.md → 编码约定(仅含非显而易见的约定)
|
|
354
368
|
- .helloagents/DESIGN.md → 设计系统(仅 UI 项目)
|
|
355
369
|
- .helloagents/verify.yaml → 验证命令
|
|
356
370
|
|
|
357
|
-
|
|
371
|
+
第三层:深入特定模块时读取
|
|
358
372
|
- .helloagents/modules/*.md → 模块文档和经验
|
|
359
373
|
- .helloagents/CHANGELOG.md → 变更历史
|
|
360
374
|
- .helloagents/archive/ → 历史方案归档
|
package/cli.mjs
CHANGED
|
@@ -185,7 +185,7 @@ if (cmd === 'codex-notify') {
|
|
|
185
185
|
}
|
|
186
186
|
} else if (cmd === 'preuninstall') {
|
|
187
187
|
runSafely(() => {
|
|
188
|
-
const cleanupArgs = argv.length > 1 ? argv.slice(1) :
|
|
188
|
+
const cleanupArgs = argv.length > 1 ? argv.slice(1) : ['--all']
|
|
189
189
|
runScopedLifecycle('cleanup', cleanupArgs)
|
|
190
190
|
if (cleanupArgs.includes('--all')) removeRuntimeRoot(RUNTIME_ROOT)
|
|
191
191
|
})
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "helloagents",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "HelloAGENTS — The orchestration kernel that makes any AI CLI smarter. Adds intelligent routing, unified QA gates, safety guards, and notifications.",
|
|
6
6
|
"author": "HelloWind",
|
package/scripts/cli-branch.mjs
CHANGED
|
@@ -2,12 +2,29 @@ import { normalizeHost } from './cli-lifecycle.mjs'
|
|
|
2
2
|
import { spawnCommandSync } from './cli-process.mjs'
|
|
3
3
|
|
|
4
4
|
const DEFAULT_REPO_ARCHIVE_BASE = 'https://github.com/hellowind777/helloagents/archive/refs/heads'
|
|
5
|
+
const BRANCH_CHILD_ENV_KEYS = [
|
|
6
|
+
'HELLOAGENTS',
|
|
7
|
+
'HELLOAGENTS_ACTION',
|
|
8
|
+
'HELLOAGENTS_TARGET',
|
|
9
|
+
'HELLOAGENTS_HOST',
|
|
10
|
+
'HELLOAGENTS_MODE',
|
|
11
|
+
'HELLOAGENTS_BRANCH',
|
|
12
|
+
'HELLOAGENTS_PACKAGE',
|
|
13
|
+
'HELLOAGENTS_DEPLOY',
|
|
14
|
+
]
|
|
5
15
|
|
|
6
|
-
function
|
|
16
|
+
function buildBranchChildEnv(baseEnv = process.env) {
|
|
17
|
+
const env = { ...baseEnv }
|
|
18
|
+
for (const key of BRANCH_CHILD_ENV_KEYS) delete env[key]
|
|
19
|
+
return env
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function runCommand(command, args, options = {}) {
|
|
7
23
|
const result = spawnCommandSync(command, args, {
|
|
8
24
|
encoding: 'utf-8',
|
|
9
25
|
errors: 'replace',
|
|
10
26
|
stdio: 'inherit',
|
|
27
|
+
env: options.env,
|
|
11
28
|
windowsHide: true,
|
|
12
29
|
})
|
|
13
30
|
if (result.error) throw result.error
|
|
@@ -78,8 +95,9 @@ function buildSyncArgs({ host, mode }) {
|
|
|
78
95
|
export function runBranchSwitch(args, options = {}) {
|
|
79
96
|
const parsed = parseBranchArgs(args)
|
|
80
97
|
const npmCommand = options.npmCommand || process.env.HELLOAGENTS_NPM_CMD || getDefaultNpmCommand()
|
|
98
|
+
const childEnv = buildBranchChildEnv(options.env || process.env)
|
|
81
99
|
|
|
82
100
|
const packageSpec = buildPackageSpec(parsed.branch)
|
|
83
|
-
runCommand(npmCommand, ['install', '-g', packageSpec])
|
|
84
|
-
runCommand(npmCommand, buildSyncArgs(parsed))
|
|
101
|
+
runCommand(npmCommand, ['install', '-g', packageSpec], { env: childEnv })
|
|
102
|
+
runCommand(npmCommand, buildSyncArgs(parsed), { env: childEnv })
|
|
85
103
|
}
|
package/scripts/guard.mjs
CHANGED
|
@@ -76,7 +76,7 @@ function buildHighRiskGate(matches, cwd, payload = {}) {
|
|
|
76
76
|
if (!recommendation) return null
|
|
77
77
|
if (matches.some((match) => match.gate === 'post-verify')) {
|
|
78
78
|
return {
|
|
79
|
-
reason: `[HelloAGENTS Guard] 已阻止 T3
|
|
79
|
+
reason: `[HelloAGENTS Guard] 已阻止 T3 命令:当前工作流尚未进入质量闭环 / 收尾与归档。\n当前工作流:${recommendation.summary}\n处理路径:${recommendation.nextPath}\n${recommendation.guidance}`,
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
if (matches.some((match) => match.gate === 'plan-first') && recommendation.nextCommand === 'plan') {
|
|
@@ -88,7 +88,7 @@ function buildHighRiskGate(matches, cwd, payload = {}) {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function buildIdeaBoundaryReason(kind) {
|
|
91
|
-
return `[HelloAGENTS Guard]
|
|
91
|
+
return `[HelloAGENTS Guard] 已阻止只读探索命令中的${kind}。\n当前路由:~idea / ~office 都是只读探索;先停留在比较或范围判断。若要写文件、改代码、创建知识库或执行有副作用的命令,请先升级到 ~plan / ~build / ~prd / ~auto。`
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
function detectIdeaBoundaryContext(data) {
|
|
@@ -116,7 +116,7 @@ function emitIdeaBoundaryBlock(data, kind, target) {
|
|
|
116
116
|
{
|
|
117
117
|
command: kind === '有副作用命令' ? target.replace(/^命令:\s*/, '') : '',
|
|
118
118
|
target: kind === '写入操作' ? target.replace(/^目标:\s*/, '') : '',
|
|
119
|
-
guardType: kind === '写入操作' ? '
|
|
119
|
+
guardType: kind === '写入操作' ? 'readonly-write-boundary' : 'readonly-command-boundary',
|
|
120
120
|
},
|
|
121
121
|
data,
|
|
122
122
|
)
|
|
@@ -133,7 +133,7 @@ function buildPostWriteWarnings(data) {
|
|
|
133
133
|
const filePath = data.tool_input?.file_path || ''
|
|
134
134
|
return [
|
|
135
135
|
...(detectIdeaBoundaryContext(data)?.zeroSideEffect
|
|
136
|
-
? ['~idea 当前任务要求只读探索;检测到写入文件的工具调用,请回到探索输出,或升级到 ~plan / ~build / ~prd / ~auto 后再修改文件']
|
|
136
|
+
? ['~idea / ~office 当前任务要求只读探索;检测到写入文件的工具调用,请回到探索输出,或升级到 ~plan / ~build / ~prd / ~auto 后再修改文件']
|
|
137
137
|
: []),
|
|
138
138
|
...scanUnrequestedFiles(filePath, data.tool_name),
|
|
139
139
|
...(content ? [...scanForSecrets(content), ...scanDangerousPackages(content, filePath)] : []),
|
|
@@ -55,7 +55,7 @@ function buildAliasRouteNote(skillName) {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function buildDelegatedTaskHint() {
|
|
58
|
-
return '
|
|
58
|
+
return '若当前任务由上级代理、控制器或宿主协作/委派机制创建,或本次输出会交回上级代理继续汇总、决策或复述,请先触发子代理短路:立即跳过主代理专用的输出格式、交互确认、统一执行流程、命令路由和 turn-state;只返回结果、证据或阻塞项。'
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export function buildCompactionContext({ payload, pkgRoot, settings, bootstrapFile, host }) {
|
|
@@ -164,8 +164,8 @@ export function buildSemanticRouteInstruction(cwd, payload = {}) {
|
|
|
164
164
|
'当前消息未使用 ~command。',
|
|
165
165
|
'请根据用户请求的真实意图选路,不依赖关键词表。',
|
|
166
166
|
buildDelegatedTaskHint(),
|
|
167
|
-
'
|
|
168
|
-
'路由映射:~idea
|
|
167
|
+
'任务分层:T0=探索/比较;T1=低风险小改动或显式验证;T2=多文件功能/新项目/需要结构化产物;T3=高风险或不可逆操作。',
|
|
168
|
+
'路由映射:~idea=只读探索与方向比较,不创建文件;~office=只读价值/范围评估,不创建文件;~build=明确实现;~qa=统一质量审查/验证/修复/收尾;~plan=结构化规划;~prd=重型规格;~auto=自动选择并继续执行后续阶段。',
|
|
169
169
|
'若判定为 T3,默认先走 ~plan / ~prd;纯质量审查、验真或收尾请求才优先 ~qa。',
|
|
170
170
|
`涉及 UI 任务时,设计决策优先级:当前活跃 plan / PRD → ${describeProjectStoreFile(cwd, 'DESIGN.md')} → 已读取的 hello-ui 规则;同时所有 UI 任务都必须满足 UI 质量基线。`,
|
|
171
171
|
projectStorageHint,
|
|
@@ -78,13 +78,13 @@ export function clearRouteContext(options = {}) {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export function writeRouteContext({ cwd, skillName, sourceSkillName = skillName, payload = {}, env, ppid }) {
|
|
81
|
-
const shouldEnsureProjectLocal = skillName !== 'idea' && skillName !== 'help'
|
|
81
|
+
const shouldEnsureProjectLocal = skillName !== 'idea' && skillName !== 'office' && skillName !== 'help'
|
|
82
82
|
const scope = getRuntimeScope(cwd, { payload, env, ppid, ensureProjectLocal: shouldEnsureProjectLocal })
|
|
83
83
|
const context = {
|
|
84
84
|
cwd: normalizePath(cwd),
|
|
85
85
|
skillName,
|
|
86
86
|
sourceSkillName,
|
|
87
|
-
zeroSideEffect: skillName === 'idea',
|
|
87
|
+
zeroSideEffect: skillName === 'idea' || skillName === 'office',
|
|
88
88
|
identity: extractPayloadIdentity(payload),
|
|
89
89
|
source: routeSource(payload),
|
|
90
90
|
promptHash: hashPrompt(payload.prompt),
|
|
@@ -33,6 +33,26 @@ const gitShortHeadCache = new Map()
|
|
|
33
33
|
const workspaceNameCache = new Map()
|
|
34
34
|
let userRuntimeCleanupDone = false
|
|
35
35
|
|
|
36
|
+
function wait(ms) {
|
|
37
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function retryTransientRename(operation) {
|
|
41
|
+
let lastError
|
|
42
|
+
for (let attempt = 0; attempt < 6; attempt += 1) {
|
|
43
|
+
try {
|
|
44
|
+
return operation()
|
|
45
|
+
} catch (error) {
|
|
46
|
+
lastError = error
|
|
47
|
+
if (!['EPERM', 'EBUSY', 'ENOTEMPTY'].includes(error?.code) || attempt === 5) {
|
|
48
|
+
throw error
|
|
49
|
+
}
|
|
50
|
+
wait(40 * (attempt + 1))
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw lastError
|
|
54
|
+
}
|
|
55
|
+
|
|
36
56
|
function normalizePath(filePath = '') {
|
|
37
57
|
return filePath ? normalize(resolve(filePath)) : ''
|
|
38
58
|
}
|
|
@@ -724,7 +744,12 @@ export function writeJsonFileAtomic(filePath, value) {
|
|
|
724
744
|
mkdirSync(dirname(filePath), { recursive: true })
|
|
725
745
|
const tmpPath = join(dirname(filePath), `.${Date.now()}-${randomUUID()}.tmp`)
|
|
726
746
|
writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8')
|
|
727
|
-
|
|
747
|
+
try {
|
|
748
|
+
retryTransientRename(() => renameSync(tmpPath, filePath))
|
|
749
|
+
} catch (error) {
|
|
750
|
+
rmSync(tmpPath, { force: true })
|
|
751
|
+
throw error
|
|
752
|
+
}
|
|
728
753
|
}
|
|
729
754
|
|
|
730
755
|
export function removeRuntimeFile(filePath) {
|
|
@@ -81,7 +81,7 @@ function buildQaAction(plan, qaMode) {
|
|
|
81
81
|
if (visualRequirement.required) {
|
|
82
82
|
extraChecks.push('完成视觉验收并写入当前会话 `artifacts/visual.json`')
|
|
83
83
|
}
|
|
84
|
-
const gateSuffix = extraChecks.length > 0 ? ` ${extraChecks.join(',')}
|
|
84
|
+
const gateSuffix = extraChecks.length > 0 ? ` ${extraChecks.join(',')},再进入收尾与归档。` : ''
|
|
85
85
|
|
|
86
86
|
if (qaMode.mode === 'metadata-first') {
|
|
87
87
|
return {
|
|
@@ -89,8 +89,8 @@ function buildQaAction(plan, qaMode) {
|
|
|
89
89
|
mode: qaMode.mode,
|
|
90
90
|
routeHint: qaMode.guidance,
|
|
91
91
|
gateHint: plan.contractIssues.length > 0
|
|
92
|
-
? '
|
|
93
|
-
: '
|
|
92
|
+
? '交付把关:当前还不能进入收尾与归档;先补齐 `contract.json` 中的 `qaMode` 与 `qaFocus`,再进入 ~qa。'
|
|
93
|
+
: '交付把关:当前还不能进入收尾与归档;先补齐 tasks.md 中每个任务的“涉及文件”“完成标准”和“验证方式”,再进入 ~qa。',
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -98,7 +98,7 @@ function buildQaAction(plan, qaMode) {
|
|
|
98
98
|
phase: 'qa',
|
|
99
99
|
mode: qaMode.mode,
|
|
100
100
|
routeHint: qaMode.guidance,
|
|
101
|
-
gateHint:
|
|
101
|
+
gateHint: `交付把关:进入收尾与归档前,必须完成 qa-review 全量质量闭环,并留下最新 qa-review 证据。${gateSuffix}`.trim(),
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
@@ -188,9 +188,9 @@ function buildClosedRecommendation(scopeLabel, plan, cwd, options = {}) {
|
|
|
188
188
|
plan,
|
|
189
189
|
status: 'closed',
|
|
190
190
|
nextCommand: 'qa',
|
|
191
|
-
nextPath: '~qa ->
|
|
191
|
+
nextPath: '~qa -> 收尾与归档',
|
|
192
192
|
summary: `${scopeLabel} "${plan.planName}" 的任务已闭合,但当前 UI 契约仍要求独立 advisor 复查与视觉验收。`,
|
|
193
|
-
guidance: '先在 ~qa 阶段完成独立 advisor / style advisor 复查,并写入当前会话 `artifacts/advisor.json`;再完成视觉验收并写入当前会话 `artifacts/visual.json`,记录 reason、tooling、screensChecked、statesChecked、status 与 summary
|
|
193
|
+
guidance: '先在 ~qa 阶段完成独立 advisor / style advisor 复查,并写入当前会话 `artifacts/advisor.json`;再完成视觉验收并写入当前会话 `artifacts/visual.json`,记录 reason、tooling、screensChecked、statesChecked、status 与 summary;两项都通过后再进入收尾与归档。',
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -200,9 +200,9 @@ function buildClosedRecommendation(scopeLabel, plan, cwd, options = {}) {
|
|
|
200
200
|
plan,
|
|
201
201
|
status: 'closed',
|
|
202
202
|
nextCommand: 'qa',
|
|
203
|
-
nextPath: '~qa ->
|
|
203
|
+
nextPath: '~qa -> 收尾与归档',
|
|
204
204
|
summary: `${scopeLabel} "${plan.planName}" 的任务已闭合,但当前契约仍要求独立 advisor 复查。`,
|
|
205
|
-
guidance: '先在 ~qa 阶段完成独立 advisor / style advisor 复查,并写入当前会话 `artifacts/advisor.json` 记录复查原因、focus、来源与结论;advisor
|
|
205
|
+
guidance: '先在 ~qa 阶段完成独立 advisor / style advisor 复查,并写入当前会话 `artifacts/advisor.json` 记录复查原因、focus、来源与结论;advisor 通过后再进入收尾与归档。',
|
|
206
206
|
}
|
|
207
207
|
}
|
|
208
208
|
|
|
@@ -212,9 +212,9 @@ function buildClosedRecommendation(scopeLabel, plan, cwd, options = {}) {
|
|
|
212
212
|
plan,
|
|
213
213
|
status: 'closed',
|
|
214
214
|
nextCommand: 'qa',
|
|
215
|
-
nextPath: '~qa ->
|
|
215
|
+
nextPath: '~qa -> 收尾与归档',
|
|
216
216
|
summary: `${scopeLabel} "${plan.planName}" 的任务已闭合,但当前 UI 契约仍要求视觉验收。`,
|
|
217
|
-
guidance: '先在 ~qa 阶段完成视觉验收,并写入当前会话 `artifacts/visual.json` 记录 reason、tooling、screensChecked、statesChecked、status 与 summary
|
|
217
|
+
guidance: '先在 ~qa 阶段完成视觉验收,并写入当前会话 `artifacts/visual.json` 记录 reason、tooling、screensChecked、statesChecked、status 与 summary;视觉验收通过后再进入收尾与归档。',
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
220
|
|
|
@@ -226,13 +226,13 @@ function buildClosedRecommendation(scopeLabel, plan, cwd, options = {}) {
|
|
|
226
226
|
stage: 'consolidate',
|
|
227
227
|
mode: closedPlanEvidence.closeoutReady ? 'ready' : 'closeout-pending',
|
|
228
228
|
nextCommand: 'qa',
|
|
229
|
-
nextPath: '
|
|
229
|
+
nextPath: '收尾与归档',
|
|
230
230
|
summary: closedPlanEvidence.closeoutReady
|
|
231
231
|
? `${scopeLabel} "${plan.planName}" 的任务与交付证据已闭合。`
|
|
232
232
|
: `${scopeLabel} "${plan.planName}" 的任务与 qa-review 已闭合。`,
|
|
233
233
|
guidance: closedPlanEvidence.closeoutReady
|
|
234
|
-
? '
|
|
235
|
-
: '
|
|
234
|
+
? '当前进入收尾与归档:更新 `state_path`、知识文件并归档方案后即可交付;不要无故重开新的方案包或重新跑一遍无关验证。'
|
|
235
|
+
: '当前进入收尾与归档:先写当前会话 `artifacts/closeout.json` 记录需求覆盖与交付清单,再更新 `state_path` 并归档后交付。',
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
238
|
|
|
@@ -241,9 +241,9 @@ function buildClosedRecommendation(scopeLabel, plan, cwd, options = {}) {
|
|
|
241
241
|
plan,
|
|
242
242
|
status: 'closed',
|
|
243
243
|
nextCommand: 'qa',
|
|
244
|
-
nextPath: '~qa ->
|
|
244
|
+
nextPath: '~qa -> 收尾与归档',
|
|
245
245
|
summary: `${scopeLabel} "${plan.planName}" 的任务已全部闭合。`,
|
|
246
|
-
guidance: '若用户是在做收尾、验真、复查或准备交付,优先走 ~qa
|
|
246
|
+
guidance: '若用户是在做收尾、验真、复查或准备交付,优先走 ~qa 或收尾与归档;不要无故重开新的方案包。',
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
249
|
|
|
@@ -320,7 +320,7 @@ export function buildOrchestrationHintFromSnapshot(snapshot, cwd, recommendation
|
|
|
320
320
|
if (recommendation.stage === 'consolidate') {
|
|
321
321
|
const action = buildDeliveryActionFromSnapshot(snapshot, cwd, recommendation)
|
|
322
322
|
if (action?.phase === 'consolidate') {
|
|
323
|
-
return
|
|
323
|
+
return `编排提示:当前已进入收尾与归档;${[action.routeHint, action.gateHint].filter(Boolean).join(' ')}`
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
326
|
return ''
|
|
@@ -49,7 +49,7 @@ export function buildWorkflowRouteHint(cwd, options = {}) {
|
|
|
49
49
|
|
|
50
50
|
const suffix = [stateRoleHint, stateSyncHint, orchestrationHint, uiContractHint].filter(Boolean).join(' ')
|
|
51
51
|
if (recommendation.stage === 'consolidate') {
|
|
52
|
-
return `${recommendation.summary}
|
|
52
|
+
return `${recommendation.summary} 当前应直接进入收尾与归档。执行路径:${recommendation.nextPath}。${recommendation.guidance}${suffix ? ` ${suffix}` : ''}`
|
|
53
53
|
}
|
|
54
54
|
return `${recommendation.summary} 当前应执行 ~${recommendation.nextCommand}。执行路径:${recommendation.nextPath}。${recommendation.guidance}${suffix ? ` ${suffix}` : ''}`
|
|
55
55
|
}
|
|
@@ -65,7 +65,7 @@ function buildCommandRouteMessage(skillName, recommendation, qaFocusHint) {
|
|
|
65
65
|
}
|
|
66
66
|
if (skillName === 'plan') {
|
|
67
67
|
if (recommendation.stage === 'consolidate') {
|
|
68
|
-
return `当前工作流约束:${recommendation.summary} 当前不该重开 ~plan
|
|
68
|
+
return `当前工作流约束:${recommendation.summary} 当前不该重开 ~plan;除非用户明确要求重规划、改方向或新增范围,否则直接进入收尾与归档。`
|
|
69
69
|
}
|
|
70
70
|
return recommendation.nextCommand === 'plan'
|
|
71
71
|
? `当前工作流约束:${recommendation.summary} 当前应执行 ~plan。${recommendation.guidance}`
|
|
@@ -73,7 +73,7 @@ function buildCommandRouteMessage(skillName, recommendation, qaFocusHint) {
|
|
|
73
73
|
}
|
|
74
74
|
if (skillName === 'build') {
|
|
75
75
|
if (recommendation.stage === 'consolidate') {
|
|
76
|
-
return `当前工作流约束:${recommendation.summary} 当前不该继续 ~build
|
|
76
|
+
return `当前工作流约束:${recommendation.summary} 当前不该继续 ~build;除非用户明确提出新增实现范围,否则直接进入收尾与归档。`
|
|
77
77
|
}
|
|
78
78
|
return recommendation.nextCommand === 'build'
|
|
79
79
|
? `当前工作流约束:${recommendation.summary} 当前应执行 ~build。${recommendation.guidance}`
|
|
@@ -81,7 +81,7 @@ function buildCommandRouteMessage(skillName, recommendation, qaFocusHint) {
|
|
|
81
81
|
}
|
|
82
82
|
if (skillName === 'qa') {
|
|
83
83
|
if (recommendation.stage === 'consolidate') {
|
|
84
|
-
return `当前工作流约束:${recommendation.summary}
|
|
84
|
+
return `当前工作流约束:${recommendation.summary} 当前应直接进入收尾与归档。${recommendation.guidance}`
|
|
85
85
|
}
|
|
86
86
|
return recommendation.nextCommand === 'qa'
|
|
87
87
|
? `当前工作流约束:${recommendation.summary} 当前应执行 ~qa。${recommendation.guidance}`
|