agentic-flow-kit 1.7.0 → 1.7.15
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 +40 -6
- package/modules/gates/README.md +1 -0
- package/modules/gates/test-protect/README.md +23 -0
- package/modules/gates/test-protect/check-test-protect.mjs +64 -0
- package/modules/gates/test-protect/local-pre-commit.line +1 -0
- package/modules/hosts/README.md +57 -0
- package/modules/hosts/claude/commands/wf-build.md +5 -24
- package/modules/hosts/claude/commands/wf-deploy.md +1 -0
- package/modules/hosts/claude/commands/wf-design.md +2 -2
- package/modules/hosts/claude/commands/wf-gate-checklist.md +1 -3
- package/modules/hosts/claude/commands/wf-plan.md +1 -1
- package/modules/hosts/claude/commands/wf-source-sync-check.md +1 -3
- package/modules/hosts/claude/commands/wf-sync-hosts.md +1 -3
- package/modules/hosts/claude/commands/wf-test.md +5 -4
- package/modules/hosts/codex/commands/wf-build.md +5 -24
- package/modules/hosts/codex/commands/wf-deploy.md +1 -0
- package/modules/hosts/codex/commands/wf-design.md +2 -2
- package/modules/hosts/codex/commands/wf-gate-checklist.md +1 -3
- package/modules/hosts/codex/commands/wf-plan.md +1 -1
- package/modules/hosts/codex/commands/wf-source-sync-check.md +1 -3
- package/modules/hosts/codex/commands/wf-sync-hosts.md +1 -3
- package/modules/hosts/codex/commands/wf-test.md +5 -4
- package/modules/hosts/cursor/commands/wf-build.md +5 -24
- package/modules/hosts/cursor/commands/wf-deploy.md +1 -0
- package/modules/hosts/cursor/commands/wf-design.md +2 -2
- package/modules/hosts/cursor/commands/wf-gate-checklist.md +1 -3
- package/modules/hosts/cursor/commands/wf-plan.md +1 -1
- package/modules/hosts/cursor/commands/wf-source-sync-check.md +1 -3
- package/modules/hosts/cursor/commands/wf-sync-hosts.md +1 -3
- package/modules/hosts/cursor/commands/wf-test.md +5 -4
- package/modules/hosts/opencode/commands/wf-build.md +5 -24
- package/modules/hosts/opencode/commands/wf-deploy.md +1 -0
- package/modules/hosts/opencode/commands/wf-design.md +2 -2
- package/modules/hosts/opencode/commands/wf-gate-checklist.md +1 -3
- package/modules/hosts/opencode/commands/wf-plan.md +1 -1
- package/modules/hosts/opencode/commands/wf-source-sync-check.md +1 -3
- package/modules/hosts/opencode/commands/wf-sync-hosts.md +1 -3
- package/modules/hosts/opencode/commands/wf-test.md +5 -4
- package/modules/hosts/trae/commands/wf-build.md +5 -24
- package/modules/hosts/trae/commands/wf-deploy.md +1 -0
- package/modules/hosts/trae/commands/wf-design.md +2 -2
- package/modules/hosts/trae/commands/wf-gate-checklist.md +1 -3
- package/modules/hosts/trae/commands/wf-plan.md +1 -1
- package/modules/hosts/trae/commands/wf-source-sync-check.md +1 -3
- package/modules/hosts/trae/commands/wf-sync-hosts.md +1 -3
- package/modules/hosts/trae/commands/wf-test.md +5 -4
- package/package.json +2 -2
- package/src/add-gate.mjs +25 -1
- package/src/add-gate.test.mjs +103 -0
- package/src/cli.mjs +17 -2
- package/src/doctor.mjs +99 -11
- package/src/gates.test.mjs +17 -0
- package/src/init.mjs +7 -1
- package/src/init.test.mjs +19 -0
- package/src/instance-ref.test.mjs +62 -0
- package/src/jscpd-drift.test.mjs +144 -0
- package/src/render.mjs +5 -0
- package/src/rule-budget.test.mjs +103 -0
- package/src/sync-hosts.mjs +4 -2
- package/src/trae-hooks.test.mjs +15 -3
- package/src/validate.mjs +72 -0
- package/src/validate.test.mjs +95 -0
- package/templates/AGENTS.md +1 -0
- package/templates/_agents/commands/build.md +5 -24
- package/templates/_agents/commands/deploy.md +1 -0
- package/templates/_agents/commands/design.md +2 -2
- package/templates/_agents/commands/gate-checklist.md +1 -3
- package/templates/_agents/commands/plan.md +1 -1
- package/templates/_agents/commands/source-sync-check.md +1 -3
- package/templates/_agents/commands/sync-hosts.md +1 -3
- package/templates/_agents/commands/test.md +5 -4
- package/templates/_agents/control-surfaces.txt +53 -0
- package/templates/_agents/scripts/agg-delegations.cjs +51 -6
- package/templates/_agents/scripts/agg-delegations.test.mjs +79 -1
- package/templates/_agents/scripts/check-engine-integrity.mjs +288 -0
- package/templates/_agents/scripts/check-engine-integrity.test.mjs +227 -0
- package/templates/_agents/scripts/check-lane-surface.mjs +7 -2
- package/templates/_agents/scripts/check-ledger.test.mjs +2 -0
- package/templates/_agents/scripts/check-loop.mjs +206 -4
- package/templates/_agents/scripts/check-loop.test.mjs +312 -2
- package/templates/_agents/scripts/confirm-doc.mjs +14 -1
- package/templates/_agents/scripts/confirm-doc.test.mjs +59 -0
- package/templates/_agents/scripts/doctor.test.mjs +251 -1
- package/templates/_agents/scripts/draft-sediment.mjs +178 -0
- package/templates/_agents/scripts/draft-sediment.test.mjs +272 -0
- package/templates/_agents/scripts/gate-checklist.mjs +10 -2
- package/templates/_agents/scripts/gate-checklist.test.mjs +7 -1
- package/templates/_agents/scripts/gen-wiki-board.mjs +61 -6
- package/templates/_agents/scripts/gen-wiki-board.test.mjs +74 -1
- package/templates/_agents/scripts/gen-workflow-dashboard.mjs +2 -2
- package/templates/_agents/scripts/gen-workflow-metrics.mjs +11 -5
- package/templates/_agents/scripts/kb-search.mjs +87 -12
- package/templates/_agents/scripts/kb-search.test.mjs +83 -0
- package/templates/_agents/scripts/pipeline-run.mjs +1 -1
- package/templates/_agents/scripts/solidify-task.mjs +1 -1
- package/templates/_agents/scripts/source-sync-check.test.mjs +9 -4
- package/templates/_agents/scripts/stage-gates.mjs +48 -1
- package/templates/_agents/scripts/stage-gates.test.mjs +105 -0
- package/templates/_agents/scripts/verify-wiki-consistency.mjs +34 -0
- package/templates/_agents/scripts/verify-wiki-consistency.test.mjs +44 -2
- package/templates/_agents/scripts/verify.mjs +1 -1
- package/templates/_agents/scripts-test-exempt.txt +3 -1
- package/templates/_agents/skills/wiki/SKILL.md +5 -3
- package/templates/wiki/INDEX.md +44 -1
- package/templates/wiki//347/237/245/350/257/206/346/262/211/346/267/200/346/200/273/350/247/210.html +22 -1
- package/templates/workflow/delegations.md +5 -4
- package/templates/workflow/incidents/_TEMPLATE.md +2 -0
- package/templates/workflow/intents/_TEMPLATE.md +3 -0
- package/templates/workflow/plans/_TEMPLATE.md +4 -0
- package/templates/workflow/specs/_TEMPLATE.md +23 -0
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
AI-Native 闭环工作流 + wiki 知识层脚手架。`flow-kit init` 一条命令为新项目装好整套项目级 AI 工作流引擎:8 个阶段命令、3 个子智能体角色契约、git 门禁钩子(闭环配对 / 敏感信息扫描 / 条件构建 / 规则面预算)、kb 跨语料检索、workflow 实时看板、intents→specs→plans→incidents 文档闭环、wiki 知识库三件套。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**装完本地可跑**:日常闭环(门禁钩子 / check-loop / fill-* / confirm-doc / kb 检索 / 看板)走项目内 `.agents/scripts/`,零 npm 运行时依赖,Node ≥ 18 即可跑;升级 / 体检 / 装门禁(`sync` / `doctor` / `add-host` / `add-gate`)走 `npx agentic-flow-kit`。clone 后只差 `git config core.hooksPath .githooks`——init 会自动挂好。
|
|
6
6
|
|
|
7
7
|
## English
|
|
8
8
|
|
|
9
|
-
agentic-flow-kit installs a
|
|
9
|
+
agentic-flow-kit installs a project-level AI workflow into a repository: stage commands, role contracts, git hooks, and an intent → spec → plan → incident trail. After `init`, day-to-day loop work (hooks, check-loop, confirm-doc, retrieval) runs from the in-repo `.agents/scripts/` with zero npm runtime dependencies; Node ≥ 18 is enough. Lifecycle operations — `sync` / `doctor` / `add-host` / `add-gate` — go through `npx agentic-flow-kit`.
|
|
10
10
|
|
|
11
|
-
The product is the hook, not another prompt pack. Five
|
|
11
|
+
The product is the hook, not another prompt pack. Five blocking surfaces, split across tools: check-loop blocks unpaired docs, unchecked acceptance criteria, missing confirmation trace, and release-time unclosed docs; secret scanning sits in pre-commit; the managed/owned ledger and dual-source drift are checked by `doctor` / `sync`, not by the push gate. Other hygiene checks are warnings, and a fresh install sets `audit: false` so only the blocking set stays in the way. Omit `audit` on an older ledger and the full check set stays on. The Chinese section above is the single source of truth for this split.
|
|
12
12
|
|
|
13
13
|
Hosts: `zcode`, `opencode`, `trae`, `omp`, `claude`, `cursor`, `codex`. Claude Code loads `.claude/commands` and `.claude/agents`. Cursor loads `.cursor/commands`. Codex reads the repo `AGENTS.md` and `.codex/skills/flow-kit`; the `.codex/commands` files are the same thin forwards for explicit reference.
|
|
14
14
|
|
|
@@ -21,6 +21,7 @@ npx agentic-flow-kit doctor
|
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
23
|
npx agentic-flow-kit init --stack node --hosts claude
|
|
24
|
+
git add -A && git commit -m "feat: bootstrap——安装 agentic-flow-kit 工作流引擎" # 先入库装户产物:此刻无活跃入口,泳道门仅 advisory
|
|
24
25
|
# 按 .agents/commands/plan.md 写一份 L1 intent 与同名 plan(状态先保持 draft)
|
|
25
26
|
node .agents/scripts/confirm-doc.mjs workflow/intents/<文件>.md # 终端里键入「可以」
|
|
26
27
|
# 改代码,git add,然后提交。配对没齐、验收没勾、确认指纹对不上,钩子会拒绝这次提交。
|
|
@@ -28,11 +29,15 @@ node .agents/scripts/confirm-doc.mjs workflow/intents/<文件>.md # 终端里
|
|
|
28
29
|
|
|
29
30
|
## 五条硬规则
|
|
30
31
|
|
|
31
|
-
新装的 `kit.json` 写 `audit: false` 与 `policyVersion: 2`:check-loop 只阻断配对、验收勾验、确认留痕,外加发版提交树上仍未收口的文档。敏感信息在 pre-commit,双源和台账在 doctor / sync。`audit`
|
|
32
|
+
新装的 `kit.json` 写 `audit: false` 与 `policyVersion: 2`:check-loop 只阻断配对、验收勾验、确认留痕,外加发版提交树上仍未收口的文档。敏感信息在 pre-commit,双源和台账在 doctor / sync。`audit` 缺省(升级来的旧台账)保持全量卫生警告;自己装一份 dogfood 时可显式置 `audit: true`。豁免日期只在 `.agents/scripts/policy.mjs` 的 `policyVersion` 表里改。
|
|
32
33
|
|
|
33
|
-
可选红线用 `add-gate`:`dotnet-ca`、`node-layer`、`py-import`、`generated-readonly`。约定见 `modules/gates/README.md`。
|
|
34
|
+
可选红线用 `add-gate`:`dotnet-ca`、`node-layer`、`py-import`、`generated-readonly`、`test-protect`。约定见 `modules/gates/README.md`。
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
**门禁信任档**(`.agents/kit.json` 的 `gateTrust`):默认 `project` —— gate 安装锚失配只 WARN(装户对门有最终所有权,锚只提供可见性)。多仓或组织场景改成 `org`,失配即 `doctor` FAIL(exit 1),对齐托管策略的组织级强制。缺键或非法值一律回退 `project`,不会因写错而变严。
|
|
37
|
+
|
|
38
|
+
**待澄清标记**:起草 spec / plan 时不确定的地方照实写一行 `- 待澄清:<你卡在哪>`,不要猜——「我不知道」是负责,猜是失职(与检查 2 的模板占位符语义相反:占位符是忘了填)。起草门不拦(零阻塞),但 `draft→approved` 确认时仍挂着未澄清项会被 `confirm-doc` 拒绝落账。解决后把行首改成 `- 已澄清:`(保留行,留痕曾不清楚过)或删行。
|
|
39
|
+
|
|
40
|
+
**关于「确认门」的诚实边界**:确认门是**留痕机制,不是防伪机制**。`confirm-doc.mjs` 把确认事件写进 `.agents/confirmations.jsonl`(append-only,入 git),check-loop 据此对账——但台账是本地可写文件,**刻意手改台账仍可伪造**。门禁的实际作用是把「顺手绕过」抬到「主动伪造」(两者性质不同、可事后对质),而非关闭通道。引擎注释对此有完整声明(见包源 `templates/_agents/scripts/stage-gates.mjs` 头部信任边界段;装户径同份在 `.agents/scripts/stage-gates.mjs`)。委托代录(`--delegated`)的台账行如实记 `source` 与用户原话供事后对质,永不伪装 TTY 确认。
|
|
36
41
|
|
|
37
42
|
## 快速开始
|
|
38
43
|
|
|
@@ -45,6 +50,9 @@ npx agentic-flow-kit init --stack node --hosts zcode,opencode
|
|
|
45
50
|
# 体检(布局 / git 钩子 / managed 台账 / 索引漂移 / check-loop)
|
|
46
51
|
npx agentic-flow-kit doctor
|
|
47
52
|
|
|
53
|
+
# 只读校验(包内置 check-loop 引擎跑闭环结构检查;--strict 把 advisory 也判红,--json 机器可读)
|
|
54
|
+
npx agentic-flow-kit validate
|
|
55
|
+
|
|
48
56
|
# 包出新版后升级(未改动→覆盖;本地已改→跳过并报告,--force 才覆盖;owned 永不触碰)
|
|
49
57
|
npx agentic-flow-kit sync
|
|
50
58
|
|
|
@@ -76,6 +84,32 @@ modules/gates/ 可选门禁模块(dotnet-ca:Clean Architecture 参考
|
|
|
76
84
|
|
|
77
85
|
**两态文件模型**:`.agents/kit.json` 记录 managed(引擎件,随包升级)与 owned(项目内容,永不覆盖)清单及 sha256;`doctor` 会校验漂移。已存在的文件 init 保守跳过(`--force` 覆盖)。
|
|
78
86
|
|
|
87
|
+
## CI 远端门与离线安装
|
|
88
|
+
|
|
89
|
+
**CI 远端门**:init 已把 `.github/workflows/kit-ci.yml` 写进装户仓(GitHub Actions:checkout 后复跑 `node .agents/scripts/verify.mjs`——测试【有根 package.json 才跑】+ 闭环校验,任一非零即红)。本地 git 钩子可被 `--no-verify` 绕过,远端门兜底;该文件归装户自持(owned),`flow-kit sync` 永不覆盖,非 GitHub 装户可删。其他 CI(GitLab / Jenkins / Azure DevOps…)等价接入 = 同一入口命令 + 服务端分支策略:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
node .agents/scripts/verify.mjs # 远端门本体(工程在子目录时加 --test-cmd "<项目测试命令>")
|
|
93
|
+
npx agentic-flow-kit validate --strict --json # 可选加一道:包内置引擎只读结构校验(warning 也判红,stdout 机器可读)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
真正的「门」在服务端分支保护(Settings → Branches:要求 PR + 状态检查绿才可合并)——该配置带不进仓库文件,一次性人工动作,机器不校验。
|
|
97
|
+
|
|
98
|
+
**离线 / 内网安装**:本包零运行时依赖(package.json 无 `dependencies`),tarball 自包含,离线装机不拖依赖树:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 外网机取包(或从 npm 镜像站直接下载 tgz)
|
|
102
|
+
npm pack agentic-flow-kit@<版本> # 产出 agentic-flow-kit-<版本>.tgz
|
|
103
|
+
|
|
104
|
+
# 内网机安装(二选一)
|
|
105
|
+
npm install -g ./agentic-flow-kit-<版本>.tgz # 全局:之后直接用 flow-kit 命令
|
|
106
|
+
npm install ./agentic-flow-kit-<版本>.tgz # 项目内:之后用 npx flow-kit init
|
|
107
|
+
|
|
108
|
+
# 批量内网:tgz publish 进内网 registry(verdaccio / nexus…),之后照常 npx agentic-flow-kit init
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`npx <tgz 路径>` 直跑不经安装在部分 npm 版本有子进程 stdio 不回显的问题(实测 exit 0 但无输出),离线场景请走上述安装后调用。
|
|
112
|
+
|
|
79
113
|
**升级语义(sync)**:managed 文件三方比对(台账 sha / 磁盘 sha / 新版渲染 sha)——未改动 → 直接覆盖新版;本地已改 → 跳过并报告(`--force` 才覆盖,git diff 自查差异;跳过件的台账保持包侧基线,后续每次 sync 持续报告,不会在下次升级被静默覆盖——消除报告的办法:`--force` 覆盖,或把本地内容改回与新版一致);改动恰好等于新版 → 视为已最新。包内新增文件自动安装;包内已删文件仅报告不删盘;缺失的 managed 文件自动恢复。INDEX / wiki 看板等生成器目标不比对 sha,收尾重跑生成器走锚点重写。门禁模块(add-gate 装入)归项目所有,sync 永不覆盖。add-host 对已存在的宿主文件保守跳过且不入台账——后续 sync 不升级(仅报告「已存在未入台账」),要纳入包管理用 `--force` 覆盖。owned 件归项目所有、sync 永不覆盖;其台账哈希仅记账不约束,sync 每次按盘面自愈刷新(手改后无须手工对账),add-gate 接线 local-pre-commit 后同步刷新其记账。
|
|
80
114
|
|
|
81
115
|
## 设计原则
|
package/modules/gates/README.md
CHANGED
|
@@ -20,5 +20,6 @@
|
|
|
20
20
|
| `node-layer` | `src/` 引用 `tests/`、`test/`、`__tests__/` |
|
|
21
21
|
| `py-import` | 业务 `.py` 引用 `tests` / `test` 包 |
|
|
22
22
|
| `generated-readonly` | 手改 `GENERATED:BEGIN` 与 `GENERATED:END` 之间的行 |
|
|
23
|
+
| `test-protect` | fix/调试提交里测试文件与被测代码同框改动(豁免:`FLOW_KIT_ALLOW_TEST_EDIT=1`) |
|
|
23
24
|
|
|
24
25
|
项目自己的红线复制其中一个目录,改判断,再用 `add-gate` 装上。
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# test-protect
|
|
2
|
+
|
|
3
|
+
暂存 diff 若同时包含「测试文件」与「非测试文件」(即测试与代码同框改动),提交失败。
|
|
4
|
+
|
|
5
|
+
fix/调试任务中,测试是「bug 已修」的证据;证据与结论同一次改动 = 自证,闭环失去意义。此门禁把
|
|
6
|
+
「fix 不得改测试」从提示语变成机器红线,不依赖 agent 客户端自觉。
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
npx agentic-flow-kit add-gate test-protect
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**测试文件识别**(脚本头部 CONFIG 可按项目扩展):
|
|
13
|
+
|
|
14
|
+
- 目录面:`tests/`、`__tests__/`、`test/`、`spec/`(任意层级)
|
|
15
|
+
- 文件面:`*.test.*`、`*.spec.*`、`_test_*.py`(python pytest 风格)
|
|
16
|
+
|
|
17
|
+
**豁免**(不是漏洞,是显式语义):
|
|
18
|
+
|
|
19
|
+
- 纯测试提交(只改测试文件,无代码同框)——新增/修正测试本身合法。
|
|
20
|
+
- 显式声明 `FLOW_KIT_ALLOW_TEST_EDIT=1 git commit`——对应 plan 中显式标注「本次需同步演进测试」
|
|
21
|
+
(测试先行 / 行为断言变更)。门禁只判暂存面事实,语义归显式声明,不读任务元数据。
|
|
22
|
+
|
|
23
|
+
**不拦截**:merge 提交无暂存 diff;工作区未暂存改动(提交面之外)。
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// test-protect — 防 agent 自证清白时弱化测试(2026-10-10 调研 P1 test-protect)。
|
|
3
|
+
// 语义:fix/调试任务中,同一提交不得既改被测代码又改它的测试文件——测试是「bug 已修」的证据,
|
|
4
|
+
// 证据与结论同一次改动 = 自证,闭环失去意义(Anthropic playbook Stage 4:fix 任务禁止改测试文件)。
|
|
5
|
+
// 判定范围:本次提交的暂存 diff(git diff --cached --name-only),只拦「测试文件」与「非测试文件」同框出现。
|
|
6
|
+
// 豁免:
|
|
7
|
+
// - 显式声明 `FLOW_KIT_ALLOW_TEST_EDIT=1 git commit`(对应 plan 中显式标注「本次需同步改测试」——测试先行、行为断言变更属于合法测试演进)。
|
|
8
|
+
// - 纯测试提交(只改测试文件,无被测代码同框)——新增/修正测试本身合法。
|
|
9
|
+
// - 测试文件自身之间的改动(如 fixture、helper 互改)。
|
|
10
|
+
// 设计(对照调研 P1):独立 add-gate 模块,不进 check-loop 核心检查面(20 项纪律);pre-commit 挂载点走 local-pre-commit,
|
|
11
|
+
// 不依赖 agent 客户端自觉。本脚本不读任务元数据(plan 状态 / frontmatter)——门禁只判暂存面事实,语义归环境变量显式声明。
|
|
12
|
+
// 实现零依赖、纯 Node ≥18。
|
|
13
|
+
|
|
14
|
+
import { spawnSync } from 'node:child_process';
|
|
15
|
+
|
|
16
|
+
// 测试文件识别:常见测试目录/文件命名。装户可按项目在脚本头部 CONFIG 扩展。
|
|
17
|
+
// 目录面:tests/、__tests__/、test/、spec/(仓库根或任意层级);文件面:*.test.*、*.spec.*、_test.*(python pytest 风格)。
|
|
18
|
+
const TEST_DIR_RE = /(^|\/)(tests?|__tests__|spec|test)\//i;
|
|
19
|
+
const TEST_FILE_RE = /\.(test|spec)\.[^.]+$/i;
|
|
20
|
+
const PYTEST_FILE_RE = /(^|\/)_?test_[^/]+\.py$/i;
|
|
21
|
+
|
|
22
|
+
function isTestFile(rel) {
|
|
23
|
+
const n = rel.replace(/\\/g, '/');
|
|
24
|
+
if (TEST_DIR_RE.test(n)) return true;
|
|
25
|
+
if (TEST_FILE_RE.test(n)) return true;
|
|
26
|
+
if (PYTEST_FILE_RE.test(n)) return true;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function git(args, cwd) {
|
|
31
|
+
const p = spawnSync('git', args, { cwd, encoding: 'utf8' });
|
|
32
|
+
return { exit: p.status ?? 1, stdout: p.stdout || '', stderr: p.stderr || '' };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function main() {
|
|
36
|
+
const root = process.env.FLOW_KIT_GIT_ROOT || process.cwd();
|
|
37
|
+
// 只判暂存 diff(提交面);工作区未暂存改动不拦(与 generated-readonly / node-layer 同口径:暂存面即提交意图)
|
|
38
|
+
const r = git(['diff', '--cached', '--name-only', '--diff-filter=ACMR'], root);
|
|
39
|
+
if (r.exit !== 0) {
|
|
40
|
+
console.error('❌ test-protect:git diff --cached 失败(' + (r.stderr.trim() || '未知错误') + ')');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const files = r.stdout.split(/\r?\n/).map((s) => s.trim()).filter(Boolean);
|
|
44
|
+
if (!files.length) return; // 无暂存改动(如 merge 提交)不拦
|
|
45
|
+
|
|
46
|
+
const tests = files.filter(isTestFile);
|
|
47
|
+
const nonTests = files.filter((f) => !isTestFile(f));
|
|
48
|
+
if (!tests.length || !nonTests.length) return; // 纯测试提交 / 纯代码提交都合法
|
|
49
|
+
|
|
50
|
+
if (process.env.FLOW_KIT_ALLOW_TEST_EDIT === '1') {
|
|
51
|
+
console.log('ℹ️ test-protect:FLOW_KIT_ALLOW_TEST_EDIT=1 显式放行(测试与代码同框改动)');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sample = tests.slice(0, 5).join('、') + (tests.length > 5 ? ` 等 ${tests.length} 个` : '');
|
|
56
|
+
const codeSample = nonTests.slice(0, 3).join('、') + (nonTests.length > 3 ? ` 等 ${nonTests.length} 个` : '');
|
|
57
|
+
console.error(`❌ test-protect:提交同时改动测试与代码——「测试文件」${sample} 与「非测试文件」${codeSample} 同框。`);
|
|
58
|
+
console.error(' fix/调试任务中,测试是 bug 已修的证据;证据与结论同一次改动 = 自证,闭环失去意义。');
|
|
59
|
+
console.error(' 若本提交确实需要同步演进测试(测试先行 / 行为断言变更),显式声明后重试:');
|
|
60
|
+
console.error(' FLOW_KIT_ALLOW_TEST_EDIT=1 git commit');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node .agents/hooks/check-test-protect.mjs
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 宿主适配层
|
|
2
|
+
|
|
3
|
+
七个宿主的薄适配层。`flow-kit init --hosts <列表>` / `flow-kit add-host <宿主>` 把对应目录铺进装户仓,
|
|
4
|
+
`sync` 随包升级。权威源是 `templates/_agents/{commands,roles}/*.md`,本目录是**纯转发薄层**——
|
|
5
|
+
换宿主不换流程。
|
|
6
|
+
|
|
7
|
+
## 约定
|
|
8
|
+
|
|
9
|
+
每个宿主目录两子层:
|
|
10
|
+
|
|
11
|
+
| 层 | 文件 | 说明 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| `agents/` | `<角色>.md` | 角色契约薄适配(全宿主无前缀,文件名 = 权威源文件名) |
|
|
14
|
+
| `commands/` | `<prefix><命令>.md` | 命令层薄适配,文件名统一带宿主前缀(见下),避免裸占宿主顶层命名空间 |
|
|
15
|
+
|
|
16
|
+
`commandPrefix`(`src/profiles.mjs#HOSTS` 单源):opencode / trae / claude / cursor / codex 用 `wf-`;
|
|
17
|
+
zcode / omp 无该字段——只有角色层适配,不参与 commands 权威源映射。
|
|
18
|
+
|
|
19
|
+
## 现有宿主
|
|
20
|
+
|
|
21
|
+
| 宿主 | 装户目录 | commands 层 | 宿主怎么读 |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| `zcode` | `.zcode/` | 无(仅角色) | `.zcode/agents/*.md` |
|
|
24
|
+
| `opencode` | `.opencode/` | `wf-*` | `.opencode/{agents,commands}/*.md` |
|
|
25
|
+
| `trae` | `.trae/` | `wf-*` | `.trae/{agents,commands}/*.md` |
|
|
26
|
+
| `omp` | `.omp/` | 无(仅角色) | `.omp/agents/*.md` |
|
|
27
|
+
| `claude` | `.claude/` | `wf-*` | `.claude/commands` + `.claude/agents` |
|
|
28
|
+
| `cursor` | `.cursor/` | `wf-*` | `.cursor/commands` |
|
|
29
|
+
| `codex` | `.codex/` | `wf-*` | 仓库根 `AGENTS.md` + `.codex/skills/`;`.codex/commands` 是同形薄转发,供显式引用 |
|
|
30
|
+
|
|
31
|
+
> codex 另有 `skills/` 子层(宿主级技能辅助),见 `modules/hosts/codex/skills/`。
|
|
32
|
+
|
|
33
|
+
七个宿主一律入库(2026-10-05 起撤销 localOnly)——换宿主不丢文件、CI 克隆面一致。zcode 的会话级
|
|
34
|
+
液态草稿(`.zcode/drafts/`、`.zcode/plans/`)是本机态、不该入库,init 不自动写这条规则,装户自行加进
|
|
35
|
+
`.gitignore`。
|
|
36
|
+
|
|
37
|
+
## 对账
|
|
38
|
+
|
|
39
|
+
权威源改一处,要同步到 N 份薄适配——人工 grep 易漏:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
flow-kit sync-hosts --diff # 权威源 vs 薄适配漂移报告(默认,不改盘面)
|
|
43
|
+
flow-kit sync-hosts --apply # 单向同步:权威源 → 薄适配(不反向,避免污染权威源)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
包源仓(含 `templates/_agents` + `modules/hosts`)与装户仓(含 `.agents`)两种布局都可用——
|
|
47
|
+
同一命令两处口径一致。装户侧等价体检在 `flow-kit doctor`(跨宿主薄适配正文段漂移校验)。
|
|
48
|
+
|
|
49
|
+
## 加一个新宿主
|
|
50
|
+
|
|
51
|
+
1. 在 `src/profiles.mjs#HOSTS` 注册:`dir`(装户目录名,带点)、`commandPrefix`(有命令层才填)。
|
|
52
|
+
2. 建 `modules/hosts/<宿主>/`:`agents/*.md` 三角色薄适配(从现有宿主拷一份改 frontmatter/调用约定);
|
|
53
|
+
有命令层再加 `commands/<prefix>*.md`。
|
|
54
|
+
3. 权威源(`templates/_agents/{commands,roles}/`)不动——薄适配只转发,不复刻判据。
|
|
55
|
+
4. 跑 `flow-kit sync-hosts --diff` 自查新增薄适配与权威源对齐;`npm test`(含 sync-hosts 套件与
|
|
56
|
+
doctor 跨宿主校验回归)。
|
|
57
|
+
5. README「现有宿主」表与 `cli.mjs` HELP 的宿主清单随动。
|
|
@@ -12,7 +12,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
12
12
|
|
|
13
13
|
起草 intent / spec / plan 任一件后,**在输出草稿全文前先给三件要点总览**(各一件:目标 / 关键取舍 /
|
|
14
14
|
验收判据 diff,合计 ≤12 行)——用户一次看整体再逐件拍板,省三次盲确认的上下文切换。
|
|
15
|
-
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc`
|
|
15
|
+
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc` 代录(禁并录;摘要可复用——分辨力由 scope+指纹承担,2026-10-09 起)。本阶段总览侧重:plan 任务拆解与两道确认门位置。
|
|
16
16
|
|
|
17
17
|
## 1. 执行
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
23
23
|
- 复制 `workflow/plans/_TEMPLATE.md` → `workflow/plans/YYYY-MM-DD-<主题>.md`(与入口文档同名)
|
|
24
24
|
- L2/L3 按 4 节填写:改动方案 / 任务拆解(每个任务有判据) / 执行顺序 / 验证计划(与 fill-plan.mjs 单源一致)
|
|
25
25
|
- L1 使用 Quick-Plan 极简三节:改动方案 / 约束与风险(原 Spec 核心) / 验证计划;多文件多步骤时可补任务拆解/执行顺序
|
|
26
|
-
3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)
|
|
26
|
+
3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件代录**:`--delegated "<授权摘要>"` 每件单独一次——摘要为人类可读留痕,复用同句不削弱判据(分辨力由落账自动记录的改动面 `scope{files,sha256}` 与文档指纹承担,2026-10-09 起)。
|
|
27
27
|
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 一次一份多份并录被拒 / 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
28
28
|
4. 确认后 → plan 状态 draft → approved,并在 plan 内补「确认与复核」节(确认结果 + 日期)。确认环节须在文档留痕:`approved` 是确认的机器可见态,`done` 只在关单出现,禁从 `draft` 直跳 `done`;确认后立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)。
|
|
29
29
|
|
|
@@ -33,7 +33,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
33
33
|
- **先拉同模块历史坑**:按入口文档 `模块:` 跑 `node .agents/scripts/kb-search.mjs --scope workflow --module <token> "<关键词>"`——命中 incident 的根因 / 防复发条目列入改动自查
|
|
34
34
|
- 列改动文件清单(读后改 vs 新建)
|
|
35
35
|
- 列步骤(改 X 文件做 Y → 改 Z 文件做 W)
|
|
36
|
-
- **owned 文件同步**:kit.owned 列表文件(AGENTS.md / workflow 模板等)sync
|
|
36
|
+
- **owned 文件同步**:kit.owned 列表文件(AGENTS.md / workflow 模板等)sync 不动,须列「手动同步装副本」步骤(仅包源/dogfood 双形态仓适用;纯装户仓 owned 即项目自有文件,无此步)
|
|
37
37
|
- 标注触达红线(对照根 `AGENTS.md` 红线/约束相关节(如「项目适配区」「门禁与提交」)+ 改动域目录级 `AGENTS.md`(如有))
|
|
38
38
|
6. 停下,等用户确认改动清单。
|
|
39
39
|
|
|
@@ -56,32 +56,13 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
56
56
|
|
|
57
57
|
- 红线(架构 / 数据 / 安全等)正文与豁免见根与目录级 `AGENTS.md`(如有)——已由 pre-commit 机器门强制的部分以钩子为准,写代码前先过一遍目录级 AGENTS
|
|
58
58
|
|
|
59
|
-
## 4.
|
|
60
|
-
|
|
61
|
-
- 改 `templates/_agents/{commands,roles}/*.md` 正文后跑 `node bin/flow-kit.mjs sync-hosts --diff` → 拍板 → `--apply` 单向同步(只动正文段,frontmatter 不动);口径与边界详见 `.agents/commands/sync-hosts.md`
|
|
62
|
-
- 改根 `AGENTS.md`(owned 常驻面)后跑 `node .agents/scripts/edit-face-check.mjs`——工作树面快检(阶段索引/引用/预算 advisory),别等提交门才发觉砍坏(2026-10-09 B2)
|
|
63
|
-
|
|
64
|
-
## 5. 改 doctor / check-loop 后必跑(三处口径对账)
|
|
65
|
-
|
|
66
|
-
- 改 `src/doctor.mjs` 加新 § 检查项 → 跑 `node .agents/scripts/gate-checklist.mjs --diff` 看 doctor ↔ check-loop 对照表
|
|
67
|
-
- 改 `.agents/scripts/check-loop.sh` 加新 § 检查项 → 同上
|
|
68
|
-
- 任一处有而另一边无 → 工具报"缺点",由用户拍板是否补齐(不自动同步,B-b 决策);详见 `.agents/commands/gate-checklist.md`
|
|
69
|
-
|
|
70
|
-
## 6. 改包源后必跑(装户面同步一致性)
|
|
71
|
-
|
|
72
|
-
- 改 `templates/_agents/*` 包源后 → 跑 `node .agents/scripts/source-sync-check.mjs --diff` 看装副本 `.agents/` 是否同步(缺失 / 孤儿 / 漂移三类差异)
|
|
73
|
-
- 漂移说明包源改了装副本未跟;缺失说明新增文件 init 未执行;孤儿说明装副本独有(可能是装户配置,不删)
|
|
74
|
-
- **新增 managed 类文件须经 init/sync 登记,禁手动双写绕过台账**——手工同时写 `templates/_agents/` 与 `.agents/` 会绕过台账登记,使该文件永远不被 sync 升级(`doctor` 台账覆盖率检查会拦;见 incidents/2026-09-26-managed-ledger-adopt 复盘)
|
|
75
|
-
- 门禁边界(pre-commit 双源一致性):比较工作树非暂存区——两侧改好、分两笔提交不拦(最终一致即可);包源删除文件退化为「孤儿」只报告不拦,删包源须手动清理装副本残件(复核 P2-2 声明,2026-09-27 gate-hardening-p2-batch)
|
|
76
|
-
- B-b 决策「只报告不修复」;详见 `.agents/commands/source-sync-check.md`
|
|
77
|
-
|
|
78
|
-
## 7. 子代理调用约定
|
|
59
|
+
## 4. 子代理调用约定
|
|
79
60
|
|
|
80
61
|
- plan 起草、风险判断、改动清单与两道确认门由主智能体负责;仅两道确认后范围明确的工作包可委派 `implementer`,公共接口 / Schema / 依赖 / 安全 / 权限 / 破坏性操作不得委派。
|
|
81
62
|
- 多工作包并行 / 链式推进:编排机制(声明随 plan 草稿一并确认;确认后读 `.agents/workflows/` 按机制文档执行,`steps/` 为项目自定义步骤扩展点);详见 `.agents/workflows/_TEMPLATE.md`。
|
|
82
63
|
- 子智能体返回后,主智能体须检查 diff 与授权文件范围、确认未覆盖既有修改并重跑相关验证;不支持子智能体时 `fallback: main`,验收标准不变。
|
|
83
64
|
|
|
84
|
-
##
|
|
65
|
+
## 5. 确认后
|
|
85
66
|
|
|
86
67
|
- plan 状态 → done(实现完成;intent / spec 关单在 test)
|
|
87
68
|
- commit:L1+ 入口文档 / spec / plan 随代码同一提交(Conventional Commits 中文 feat/fix/refactor/perf);docs 豁免与 bootstrap 可单独 `docs(*)`
|
|
@@ -41,6 +41,7 @@ description: Deploy 阶段:prod 上线清单(静态门 + 配对检查 + 回归 +
|
|
|
41
41
|
## 6. 上线后观察(用户观察,Maintain 阶段接手)
|
|
42
42
|
|
|
43
43
|
- 观察期:上线后 24h;由用户观察错误率 / 延迟 / 关键业务流(无监控时人工看)
|
|
44
|
+
- 异常判据(观察期退出规则):项目口径填 `workflow/regression-checklist.md`——无监控时的最低判据:错误日志 / 异常告警 / 关键业务流失败**任一出现即触发 §5 回滚预案,不等 24h**;无异常满 24h 方可闭环
|
|
44
45
|
- 闭环宣告:用户确认无异常后才算闭环;AI 不得自行宣告
|
|
45
46
|
- 异常回落:超阈值 → 生成 `workflow/incidents/YYYY-MM-DD-<主题>.md`,进 `maintain.md`(止血方案用户拍板,见 maintain.md §0)
|
|
46
47
|
- 事故响应:单用途账号 + 最小权限;不得跨智能体协作推送修复(参考 Anthropic 教训)
|
|
@@ -10,7 +10,7 @@ description: Design 阶段:起 spec(L2/L3 强制,L1 可省略)
|
|
|
10
10
|
|
|
11
11
|
起草 intent / spec / plan 任一件后,**在输出草稿全文前先给三件要点总览**(各一件:目标 / 关键取舍 /
|
|
12
12
|
验收判据 diff,合计 ≤12 行)——用户一次看整体再逐件拍板,省三次盲确认的上下文切换。
|
|
13
|
-
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc`
|
|
13
|
+
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc` 代录(禁并录;摘要可复用——分辨力由 scope+指纹承担,2026-10-09 起)。本阶段总览侧重:spec 方案取舍与 L3 复核安排。
|
|
14
14
|
|
|
15
15
|
## 1. 执行
|
|
16
16
|
|
|
@@ -43,6 +43,6 @@ description: Design 阶段:起 spec(L2/L3 强制,L1 可省略)
|
|
|
43
43
|
## 4. 确认后
|
|
44
44
|
|
|
45
45
|
- spec 状态 draft → approved
|
|
46
|
-
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 /
|
|
46
|
+
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
47
47
|
- 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
|
|
48
48
|
- 进 `next: .agents/commands/build.md`
|
|
@@ -74,6 +74,4 @@ npm test # 含 gate-checklist 套件
|
|
|
74
74
|
|
|
75
75
|
## 6. 相关留痕
|
|
76
76
|
|
|
77
|
-
-
|
|
78
|
-
- intent(工具首建):`workflow/intents/2026-09-25-gate-checklist.md`
|
|
79
|
-
- 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(owned 漂移未对账,催生本工具)
|
|
77
|
+
- 立法出处:2026-09-25(登记表重写 + 工具首建;父事件 = owned 漂移未对账,催生本工具)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -20,7 +20,7 @@ description: Plan 阶段:立 intent(需求来源 / 目标 / 约束 / 触达红
|
|
|
20
20
|
- 红线勾选对照根 `AGENTS.md` 红线/约束相关节(如「项目适配区」「门禁与提交」)+ 改动域目录级 `AGENTS.md`(如有);**没触及就全不勾**,不要硬填
|
|
21
21
|
3. 写不出可测试判据 = 还没想清楚 → 反问澄清,不要硬填。
|
|
22
22
|
4. 起草后停下,输出草稿全文给用户过目,一句"可以"即确认。
|
|
23
|
-
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 /
|
|
23
|
+
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
24
24
|
|
|
25
25
|
## 2. 技能辅助(可选,宿主级 skills)
|
|
26
26
|
|
|
@@ -86,6 +86,4 @@ flow-kit doctor # 10/0/0
|
|
|
86
86
|
|
|
87
87
|
## 6. 相关留痕
|
|
88
88
|
|
|
89
|
-
-
|
|
90
|
-
- plan:`workflow/plans/2026-09-25-source-sync-check.md`
|
|
91
|
-
- 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(包源改了装副本未同步——本工具预防性体检)
|
|
89
|
+
- 立法出处:2026-09-25 source-sync-check(intent/plan;父事件 = 包源改了装副本未同步,本工具预防性体检)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -67,6 +67,4 @@ sh .agents/scripts/check-loop.sh # Windows 无 sh 时 doctor 已
|
|
|
67
67
|
|
|
68
68
|
## 5. 相关留痕
|
|
69
69
|
|
|
70
|
-
-
|
|
71
|
-
- plan:`workflow/plans/2026-09-25-cross-host-sync.md`(含 B-b 方案拍板)
|
|
72
|
-
- incident:`workflow/incidents/2026-09-25-wf-runtime.md`(双源纪律教训,规范 §7.x 包源环境跳过)
|
|
70
|
+
- 立法出处:2026-09-25 cross-host-sync(intent/plan,含 B-b 方案拍板;父事件 = wf-runtime 双源纪律教训,规范 §7.x 包源环境跳过)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -16,7 +16,7 @@ description: Test 阶段:静态门(架构红线 + build + test)+ UI 实测(headl
|
|
|
16
16
|
项目测试命令 # 自动化测试
|
|
17
17
|
项目类型检查命令 # 前端类型检查/构建(涉及前端时跑)
|
|
18
18
|
node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1 即先修台账再继续:跑 gen-wiki-board.mjs 补索引/看板;pre-commit 已按增量自动拦,此行用于改完即验)
|
|
19
|
-
|
|
19
|
+
npx agentic-flow-kit doctor # §6.5 delegations + §6.6 owned 漂移 + §6.7 跨宿主薄适配正文漂移(装户环境;包源环境 §6.7 skipped)
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
> **环境注记**:本地服务占用构建产物导致编译失败、多会话并行时「谁跑静态门 / 提交谁先停服务」等约定——如有,见项目注记 `.agents/notes/runtime-env.md` §2,跑静态门前先过一眼。
|
|
@@ -55,11 +55,12 @@ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 o
|
|
|
55
55
|
|
|
56
56
|
- 输出测试报告(通过项 / 失败项);失败项已修复并复测通过。
|
|
57
57
|
- **关单**(日常闭环点,不依赖是否上 prod):
|
|
58
|
-
- 关单前一键过门:`node .agents/scripts/verify.mjs --doc workflow/intents/<本单>.md`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单);**`--doc` 把测试绿凭证绑到本单**——不带它落下的绿行不给任何单背书,confirm-doc 前置与检查 8 对账只认带本单 `--doc` 的绿行(仅 v6+ 生效);**装户仓**(根目录无 `package.json`,工程在子目录)默认 `npm test` 不可跑 → 脚本**显式跳过步骤 1 且不落测试绿凭证**(防假绿)并提示;此时按项目口径手工跑测试,或带 `--test-cmd "<项目测试命令>"`
|
|
58
|
+
- 关单前一键过门:`node .agents/scripts/verify.mjs --doc workflow/intents/<本单>.md`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单);**`--doc` 把测试绿凭证绑到本单**——不带它落下的绿行不给任何单背书,confirm-doc 前置与检查 8 对账只认带本单 `--doc` 的绿行(仅 v6+ 生效);**装户仓**(根目录无 `package.json`,工程在子目录)默认 `npm test` 不可跑 → 脚本**显式跳过步骤 1 且不落测试绿凭证**(防假绿)并提示;此时按项目口径手工跑测试,或带 `--test-cmd "<项目测试命令>"` 指定
|
|
59
59
|
- 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」(例如:粘贴 CI 运行结果、UI 截图路径、或具体的 commit SHA),intent → done;同名 spec/Quick-Plan(若有)仍 approved → done。**注意:勾选但缺证据会被 check-loop 拦截(hard-block)**
|
|
60
|
-
- **approved
|
|
61
|
-
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(两形态 /
|
|
60
|
+
- **approved 留痕提交**:done 确认前确认**本次关单文档**的 approved 态已进 git 历史(越早越好——approved 后即应提交;若尚未,先补提交再 done;门为逐份校验,三件套均关单时逐份各自满足)——confirm-doc 的 done 前置门硬校验(历史未出现「状态: approved」→ 拒绝落账);done 后再提交 done 态与其余改动
|
|
61
|
+
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ done 内容绑定(关单编辑先于 done 确认、confirm-doc 是最后一次写入)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
62
62
|
- 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
|
|
63
|
+
- **沉淀草稿**:intent done / incident closed 后跑 `node .agents/scripts/draft-sediment.mjs workflow/<intents|incidents>/<本单>.md`——自动抽高价值节(intent:影响面/触达红线;incident:影响面/根因/为什么之前没拦住/复盘三件套)落 `wiki/drafts-archive/<日期-主题>/` 草稿、回写源文件 `沉淀` 字段、重跑 gen-wiki-board(归档计数随动,否则 verify-wiki-consistency 拦提交)。全占位单拒抽(正常,无沉淀价值)。`--dry-run` 先预览。草稿是**中间态**:人工读一遍归类到 `wiki/<主题>/`(补主题与用途、保留 `来源` 字段)后跑 gen-wiki-board + verify-wiki-consistency。沉淀是人工判断——机器只代抽与登记,值不值得入库由人定;不沉淀写 `沉淀: 无` 显式豁免(check-loop 的 `[WARN 未沉淀]` 随之消除)
|
|
63
64
|
- **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
|
|
64
65
|
- 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
|
|
65
66
|
- **委派快照回写**:关单后若 `workflow/delegations.md` §月度聚合快照缺当月行或 doctor §6.5 报陈旧 → 跑 `node .agents/scripts/agg-delegations.cjs` 并回贴当月快照行
|
|
@@ -12,7 +12,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
12
12
|
|
|
13
13
|
起草 intent / spec / plan 任一件后,**在输出草稿全文前先给三件要点总览**(各一件:目标 / 关键取舍 /
|
|
14
14
|
验收判据 diff,合计 ≤12 行)——用户一次看整体再逐件拍板,省三次盲确认的上下文切换。
|
|
15
|
-
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc`
|
|
15
|
+
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc` 代录(禁并录;摘要可复用——分辨力由 scope+指纹承担,2026-10-09 起)。本阶段总览侧重:plan 任务拆解与两道确认门位置。
|
|
16
16
|
|
|
17
17
|
## 1. 执行
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
23
23
|
- 复制 `workflow/plans/_TEMPLATE.md` → `workflow/plans/YYYY-MM-DD-<主题>.md`(与入口文档同名)
|
|
24
24
|
- L2/L3 按 4 节填写:改动方案 / 任务拆解(每个任务有判据) / 执行顺序 / 验证计划(与 fill-plan.mjs 单源一致)
|
|
25
25
|
- L1 使用 Quick-Plan 极简三节:改动方案 / 约束与风险(原 Spec 核心) / 验证计划;多文件多步骤时可补任务拆解/执行顺序
|
|
26
|
-
3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)
|
|
26
|
+
3. 停下,输出 plan 草稿全文给用户过目,一句"可以"即确认。**逐件确认**:入口文档 / spec / plan 各自的确认点不得并作一次,plan 草稿须全文过目(不接受摘要代替)。**逐件代录**:`--delegated "<授权摘要>"` 每件单独一次——摘要为人类可读留痕,复用同句不削弱判据(分辨力由落账自动记录的改动面 `scope{files,sha256}` 与文档指纹承担,2026-10-09 起)。
|
|
27
27
|
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 一次一份多份并录被拒 / 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
28
28
|
4. 确认后 → plan 状态 draft → approved,并在 plan 内补「确认与复核」节(确认结果 + 日期)。确认环节须在文档留痕:`approved` 是确认的机器可见态,`done` 只在关单出现,禁从 `draft` 直跳 `done`;确认后立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)。
|
|
29
29
|
|
|
@@ -33,7 +33,7 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
33
33
|
- **先拉同模块历史坑**:按入口文档 `模块:` 跑 `node .agents/scripts/kb-search.mjs --scope workflow --module <token> "<关键词>"`——命中 incident 的根因 / 防复发条目列入改动自查
|
|
34
34
|
- 列改动文件清单(读后改 vs 新建)
|
|
35
35
|
- 列步骤(改 X 文件做 Y → 改 Z 文件做 W)
|
|
36
|
-
- **owned 文件同步**:kit.owned 列表文件(AGENTS.md / workflow 模板等)sync
|
|
36
|
+
- **owned 文件同步**:kit.owned 列表文件(AGENTS.md / workflow 模板等)sync 不动,须列「手动同步装副本」步骤(仅包源/dogfood 双形态仓适用;纯装户仓 owned 即项目自有文件,无此步)
|
|
37
37
|
- 标注触达红线(对照根 `AGENTS.md` 红线/约束相关节(如「项目适配区」「门禁与提交」)+ 改动域目录级 `AGENTS.md`(如有))
|
|
38
38
|
6. 停下,等用户确认改动清单。
|
|
39
39
|
|
|
@@ -56,32 +56,13 @@ description: Build 阶段:起 plan + 实现代码 + 自验(确认后才动代码
|
|
|
56
56
|
|
|
57
57
|
- 红线(架构 / 数据 / 安全等)正文与豁免见根与目录级 `AGENTS.md`(如有)——已由 pre-commit 机器门强制的部分以钩子为准,写代码前先过一遍目录级 AGENTS
|
|
58
58
|
|
|
59
|
-
## 4.
|
|
60
|
-
|
|
61
|
-
- 改 `templates/_agents/{commands,roles}/*.md` 正文后跑 `node bin/flow-kit.mjs sync-hosts --diff` → 拍板 → `--apply` 单向同步(只动正文段,frontmatter 不动);口径与边界详见 `.agents/commands/sync-hosts.md`
|
|
62
|
-
- 改根 `AGENTS.md`(owned 常驻面)后跑 `node .agents/scripts/edit-face-check.mjs`——工作树面快检(阶段索引/引用/预算 advisory),别等提交门才发觉砍坏(2026-10-09 B2)
|
|
63
|
-
|
|
64
|
-
## 5. 改 doctor / check-loop 后必跑(三处口径对账)
|
|
65
|
-
|
|
66
|
-
- 改 `src/doctor.mjs` 加新 § 检查项 → 跑 `node .agents/scripts/gate-checklist.mjs --diff` 看 doctor ↔ check-loop 对照表
|
|
67
|
-
- 改 `.agents/scripts/check-loop.sh` 加新 § 检查项 → 同上
|
|
68
|
-
- 任一处有而另一边无 → 工具报"缺点",由用户拍板是否补齐(不自动同步,B-b 决策);详见 `.agents/commands/gate-checklist.md`
|
|
69
|
-
|
|
70
|
-
## 6. 改包源后必跑(装户面同步一致性)
|
|
71
|
-
|
|
72
|
-
- 改 `templates/_agents/*` 包源后 → 跑 `node .agents/scripts/source-sync-check.mjs --diff` 看装副本 `.agents/` 是否同步(缺失 / 孤儿 / 漂移三类差异)
|
|
73
|
-
- 漂移说明包源改了装副本未跟;缺失说明新增文件 init 未执行;孤儿说明装副本独有(可能是装户配置,不删)
|
|
74
|
-
- **新增 managed 类文件须经 init/sync 登记,禁手动双写绕过台账**——手工同时写 `templates/_agents/` 与 `.agents/` 会绕过台账登记,使该文件永远不被 sync 升级(`doctor` 台账覆盖率检查会拦;见 incidents/2026-09-26-managed-ledger-adopt 复盘)
|
|
75
|
-
- 门禁边界(pre-commit 双源一致性):比较工作树非暂存区——两侧改好、分两笔提交不拦(最终一致即可);包源删除文件退化为「孤儿」只报告不拦,删包源须手动清理装副本残件(复核 P2-2 声明,2026-09-27 gate-hardening-p2-batch)
|
|
76
|
-
- B-b 决策「只报告不修复」;详见 `.agents/commands/source-sync-check.md`
|
|
77
|
-
|
|
78
|
-
## 7. 子代理调用约定
|
|
59
|
+
## 4. 子代理调用约定
|
|
79
60
|
|
|
80
61
|
- plan 起草、风险判断、改动清单与两道确认门由主智能体负责;仅两道确认后范围明确的工作包可委派 `implementer`,公共接口 / Schema / 依赖 / 安全 / 权限 / 破坏性操作不得委派。
|
|
81
62
|
- 多工作包并行 / 链式推进:编排机制(声明随 plan 草稿一并确认;确认后读 `.agents/workflows/` 按机制文档执行,`steps/` 为项目自定义步骤扩展点);详见 `.agents/workflows/_TEMPLATE.md`。
|
|
82
63
|
- 子智能体返回后,主智能体须检查 diff 与授权文件范围、确认未覆盖既有修改并重跑相关验证;不支持子智能体时 `fallback: main`,验收标准不变。
|
|
83
64
|
|
|
84
|
-
##
|
|
65
|
+
## 5. 确认后
|
|
85
66
|
|
|
86
67
|
- plan 状态 → done(实现完成;intent / spec 关单在 test)
|
|
87
68
|
- commit:L1+ 入口文档 / spec / plan 随代码同一提交(Conventional Commits 中文 feat/fix/refactor/perf);docs 豁免与 bootstrap 可单独 `docs(*)`
|
|
@@ -41,6 +41,7 @@ description: Deploy 阶段:prod 上线清单(静态门 + 配对检查 + 回归 +
|
|
|
41
41
|
## 6. 上线后观察(用户观察,Maintain 阶段接手)
|
|
42
42
|
|
|
43
43
|
- 观察期:上线后 24h;由用户观察错误率 / 延迟 / 关键业务流(无监控时人工看)
|
|
44
|
+
- 异常判据(观察期退出规则):项目口径填 `workflow/regression-checklist.md`——无监控时的最低判据:错误日志 / 异常告警 / 关键业务流失败**任一出现即触发 §5 回滚预案,不等 24h**;无异常满 24h 方可闭环
|
|
44
45
|
- 闭环宣告:用户确认无异常后才算闭环;AI 不得自行宣告
|
|
45
46
|
- 异常回落:超阈值 → 生成 `workflow/incidents/YYYY-MM-DD-<主题>.md`,进 `maintain.md`(止血方案用户拍板,见 maintain.md §0)
|
|
46
47
|
- 事故响应:单用途账号 + 最小权限;不得跨智能体协作推送修复(参考 Anthropic 教训)
|
|
@@ -10,7 +10,7 @@ description: Design 阶段:起 spec(L2/L3 强制,L1 可省略)
|
|
|
10
10
|
|
|
11
11
|
起草 intent / spec / plan 任一件后,**在输出草稿全文前先给三件要点总览**(各一件:目标 / 关键取舍 /
|
|
12
12
|
验收判据 diff,合计 ≤12 行)——用户一次看整体再逐件拍板,省三次盲确认的上下文切换。
|
|
13
|
-
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc`
|
|
13
|
+
确认纪律不变:逐件过目全文 + 逐件 `confirm-doc` 代录(禁并录;摘要可复用——分辨力由 scope+指纹承担,2026-10-09 起)。本阶段总览侧重:spec 方案取舍与 L3 复核安排。
|
|
14
14
|
|
|
15
15
|
## 1. 执行
|
|
16
16
|
|
|
@@ -43,6 +43,6 @@ description: Design 阶段:起 spec(L2/L3 强制,L1 可省略)
|
|
|
43
43
|
## 4. 确认后
|
|
44
44
|
|
|
45
45
|
- spec 状态 draft → approved
|
|
46
|
-
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 /
|
|
46
|
+
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
47
47
|
- 立即 `docs(workflow)` 单独提交留痕(根 `AGENTS.md` 提交约定;check-loop 检查 14 口径)
|
|
48
48
|
- 进 `next: .agents/commands/build.md`
|
|
@@ -74,6 +74,4 @@ npm test # 含 gate-checklist 套件
|
|
|
74
74
|
|
|
75
75
|
## 6. 相关留痕
|
|
76
76
|
|
|
77
|
-
-
|
|
78
|
-
- intent(工具首建):`workflow/intents/2026-09-25-gate-checklist.md`
|
|
79
|
-
- 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(owned 漂移未对账,催生本工具)
|
|
77
|
+
- 立法出处:2026-09-25(登记表重写 + 工具首建;父事件 = owned 漂移未对账,催生本工具)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -20,7 +20,7 @@ description: Plan 阶段:立 intent(需求来源 / 目标 / 约束 / 触达红
|
|
|
20
20
|
- 红线勾选对照根 `AGENTS.md` 红线/约束相关节(如「项目适配区」「门禁与提交」)+ 改动域目录级 `AGENTS.md`(如有);**没触及就全不勾**,不要硬填
|
|
21
21
|
3. 写不出可测试判据 = 还没想清楚 → 反问澄清,不要硬填。
|
|
22
22
|
4. 起草后停下,输出草稿全文给用户过目,一句"可以"即确认。
|
|
23
|
-
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 /
|
|
23
|
+
**确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(draft→approved / approved→done;TTY 两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
24
24
|
|
|
25
25
|
## 2. 技能辅助(可选,宿主级 skills)
|
|
26
26
|
|
|
@@ -86,6 +86,4 @@ flow-kit doctor # 10/0/0
|
|
|
86
86
|
|
|
87
87
|
## 6. 相关留痕
|
|
88
88
|
|
|
89
|
-
-
|
|
90
|
-
- plan:`workflow/plans/2026-09-25-source-sync-check.md`
|
|
91
|
-
- 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(包源改了装副本未同步——本工具预防性体检)
|
|
89
|
+
- 立法出处:2026-09-25 source-sync-check(intent/plan;父事件 = 包源改了装副本未同步,本工具预防性体检)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -67,6 +67,4 @@ sh .agents/scripts/check-loop.sh # Windows 无 sh 时 doctor 已
|
|
|
67
67
|
|
|
68
68
|
## 5. 相关留痕
|
|
69
69
|
|
|
70
|
-
-
|
|
71
|
-
- plan:`workflow/plans/2026-09-25-cross-host-sync.md`(含 B-b 方案拍板)
|
|
72
|
-
- incident:`workflow/incidents/2026-09-25-wf-runtime.md`(双源纪律教训,规范 §7.x 包源环境跳过)
|
|
70
|
+
- 立法出处:2026-09-25 cross-host-sync(intent/plan,含 B-b 方案拍板;父事件 = wf-runtime 双源纪律教训,规范 §7.x 包源环境跳过)——留痕在包源仓 git 历史与 CHANGELOG,装户径不引实例路径
|
|
@@ -16,7 +16,7 @@ description: Test 阶段:静态门(架构红线 + build + test)+ UI 实测(headl
|
|
|
16
16
|
项目测试命令 # 自动化测试
|
|
17
17
|
项目类型检查命令 # 前端类型检查/构建(涉及前端时跑)
|
|
18
18
|
node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1 即先修台账再继续:跑 gen-wiki-board.mjs 补索引/看板;pre-commit 已按增量自动拦,此行用于改完即验)
|
|
19
|
-
|
|
19
|
+
npx agentic-flow-kit doctor # §6.5 delegations + §6.6 owned 漂移 + §6.7 跨宿主薄适配正文漂移(装户环境;包源环境 §6.7 skipped)
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
> **环境注记**:本地服务占用构建产物导致编译失败、多会话并行时「谁跑静态门 / 提交谁先停服务」等约定——如有,见项目注记 `.agents/notes/runtime-env.md` §2,跑静态门前先过一眼。
|
|
@@ -55,11 +55,12 @@ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 o
|
|
|
55
55
|
|
|
56
56
|
- 输出测试报告(通过项 / 失败项);失败项已修复并复测通过。
|
|
57
57
|
- **关单**(日常闭环点,不依赖是否上 prod):
|
|
58
|
-
- 关单前一键过门:`node .agents/scripts/verify.mjs --doc workflow/intents/<本单>.md`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单);**`--doc` 把测试绿凭证绑到本单**——不带它落下的绿行不给任何单背书,confirm-doc 前置与检查 8 对账只认带本单 `--doc` 的绿行(仅 v6+ 生效);**装户仓**(根目录无 `package.json`,工程在子目录)默认 `npm test` 不可跑 → 脚本**显式跳过步骤 1 且不落测试绿凭证**(防假绿)并提示;此时按项目口径手工跑测试,或带 `--test-cmd "<项目测试命令>"`
|
|
58
|
+
- 关单前一键过门:`node .agents/scripts/verify.mjs --doc workflow/intents/<本单>.md`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单);**`--doc` 把测试绿凭证绑到本单**——不带它落下的绿行不给任何单背书,confirm-doc 前置与检查 8 对账只认带本单 `--doc` 的绿行(仅 v6+ 生效);**装户仓**(根目录无 `package.json`,工程在子目录)默认 `npm test` 不可跑 → 脚本**显式跳过步骤 1 且不落测试绿凭证**(防假绿)并提示;此时按项目口径手工跑测试,或带 `--test-cmd "<项目测试命令>"` 指定
|
|
59
59
|
- 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」(例如:粘贴 CI 运行结果、UI 截图路径、或具体的 commit SHA),intent → done;同名 spec/Quick-Plan(若有)仍 approved → done。**注意:勾选但缺证据会被 check-loop 拦截(hard-block)**
|
|
60
|
-
- **approved
|
|
61
|
-
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(两形态 /
|
|
60
|
+
- **approved 留痕提交**:done 确认前确认**本次关单文档**的 approved 态已进 git 历史(越早越好——approved 后即应提交;若尚未,先补提交再 done;门为逐份校验,三件套均关单时逐份各自满足)——confirm-doc 的 done 前置门硬校验(历史未出现「状态: approved」→ 拒绝落账);done 后再提交 done 态与其余改动
|
|
61
|
+
- **确认落态**:唯一入口 `node .agents/scripts/confirm-doc.mjs <path>`(两形态 / 逐件代录(摘要可复用——分辨力由 scope+指纹承担)/ done 内容绑定(关单编辑先于 done 确认、confirm-doc 是最后一次写入)/ 台账对质全口径见根 `AGENTS.md` §1.3 确认门)。
|
|
62
62
|
- 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
|
|
63
|
+
- **沉淀草稿**:intent done / incident closed 后跑 `node .agents/scripts/draft-sediment.mjs workflow/<intents|incidents>/<本单>.md`——自动抽高价值节(intent:影响面/触达红线;incident:影响面/根因/为什么之前没拦住/复盘三件套)落 `wiki/drafts-archive/<日期-主题>/` 草稿、回写源文件 `沉淀` 字段、重跑 gen-wiki-board(归档计数随动,否则 verify-wiki-consistency 拦提交)。全占位单拒抽(正常,无沉淀价值)。`--dry-run` 先预览。草稿是**中间态**:人工读一遍归类到 `wiki/<主题>/`(补主题与用途、保留 `来源` 字段)后跑 gen-wiki-board + verify-wiki-consistency。沉淀是人工判断——机器只代抽与登记,值不值得入库由人定;不沉淀写 `沉淀: 无` 显式豁免(check-loop 的 `[WARN 未沉淀]` 随之消除)
|
|
63
64
|
- **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
|
|
64
65
|
- 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
|
|
65
66
|
- **委派快照回写**:关单后若 `workflow/delegations.md` §月度聚合快照缺当月行或 doctor §6.5 报陈旧 → 跑 `node .agents/scripts/agg-delegations.cjs` 并回贴当月快照行
|