agentic-flow-kit 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +3 -0
  2. package/modules/gates/dotnet-ca/check-architecture.sh +23 -5
  3. package/modules/hosts/omp/agents/implementer.md +47 -6
  4. package/modules/hosts/omp/agents/independent-reviewer.md +44 -5
  5. package/modules/hosts/omp/agents/ui-verifier.md +43 -6
  6. package/modules/hosts/opencode/agents/implementer.md +47 -1
  7. package/modules/hosts/opencode/agents/independent-reviewer.md +44 -1
  8. package/modules/hosts/opencode/agents/ui-verifier.md +43 -1
  9. package/modules/hosts/opencode/commands/build.md +74 -7
  10. package/modules/hosts/opencode/commands/deploy.md +51 -6
  11. package/modules/hosts/opencode/commands/design.md +36 -6
  12. package/modules/hosts/opencode/commands/gate-checklist.md +77 -0
  13. package/modules/hosts/opencode/commands/maintain.md +70 -6
  14. package/modules/hosts/opencode/commands/new-task.md +59 -6
  15. package/modules/hosts/opencode/commands/plan.md +35 -6
  16. package/modules/hosts/opencode/commands/review.md +41 -6
  17. package/modules/hosts/opencode/commands/source-sync-check.md +89 -0
  18. package/modules/hosts/opencode/commands/sync-hosts.md +66 -0
  19. package/modules/hosts/opencode/commands/test.md +58 -8
  20. package/modules/hosts/trae/agents/implementer.md +46 -2
  21. package/modules/hosts/trae/agents/independent-reviewer.md +44 -1
  22. package/modules/hosts/trae/agents/ui-verifier.md +41 -3
  23. package/modules/hosts/trae/commands/wf-build.md +74 -7
  24. package/modules/hosts/trae/commands/wf-deploy.md +51 -6
  25. package/modules/hosts/trae/commands/wf-design.md +36 -6
  26. package/modules/hosts/trae/commands/wf-gate-checklist.md +78 -0
  27. package/modules/hosts/trae/commands/wf-maintain.md +70 -6
  28. package/modules/hosts/trae/commands/wf-new-task.md +59 -6
  29. package/modules/hosts/trae/commands/wf-plan.md +35 -6
  30. package/modules/hosts/trae/commands/wf-review.md +41 -6
  31. package/modules/hosts/trae/commands/wf-source-sync-check.md +90 -0
  32. package/modules/hosts/trae/commands/wf-sync-hosts.md +67 -0
  33. package/modules/hosts/trae/commands/wf-test.md +58 -7
  34. package/modules/hosts/trae/hooks/post-edit-check.cjs +3 -2
  35. package/modules/hosts/trae/hooks/pre-shell-check.cjs +40 -9
  36. package/modules/hosts/trae/hooks.json +1 -1
  37. package/modules/hosts/zcode/agents/implementer.md +47 -6
  38. package/modules/hosts/zcode/agents/independent-reviewer.md +44 -5
  39. package/modules/hosts/zcode/agents/ui-verifier.md +43 -5
  40. package/package.json +6 -3
  41. package/src/add-gate.mjs +5 -3
  42. package/src/cli.mjs +15 -2
  43. package/src/doctor.mjs +245 -15
  44. package/src/gate-dotnet-ca.test.mjs +124 -0
  45. package/src/init.mjs +79 -17
  46. package/src/init.test.mjs +84 -2
  47. package/src/pack.test.mjs +24 -0
  48. package/src/render.mjs +64 -4
  49. package/src/run-tests.mjs +7 -11
  50. package/src/sync-hosts.mjs +194 -0
  51. package/src/sync-hosts.test.mjs +170 -0
  52. package/src/sync.mjs +65 -20
  53. package/src/sync.test.mjs +52 -0
  54. package/src/trae-hooks.test.mjs +115 -0
  55. package/templates/AGENTS.md +2 -1
  56. package/templates/_agents/board/index.html +32 -3
  57. package/templates/_agents/commands/build.md +22 -1
  58. package/templates/_agents/commands/design.md +2 -0
  59. package/templates/_agents/commands/gate-checklist.md +91 -0
  60. package/templates/_agents/commands/maintain.md +2 -3
  61. package/templates/_agents/commands/plan.md +4 -1
  62. package/templates/_agents/commands/review.md +1 -0
  63. package/templates/_agents/commands/source-sync-check.md +103 -0
  64. package/templates/_agents/commands/sync-hosts.md +79 -0
  65. package/templates/_agents/commands/test.md +4 -2
  66. package/templates/_agents/hooks/check-pairing-incremental.sh +20 -7
  67. package/templates/_agents/notes/runtime-env.md +1 -1
  68. package/templates/_agents/roles/implementer.md +2 -0
  69. package/templates/_agents/roles/independent-reviewer.md +2 -0
  70. package/templates/_agents/roles/ui-verifier.md +2 -0
  71. package/templates/_agents/rule-budgets.txt +1 -1
  72. package/templates/_agents/scripts/agg-delegations.cjs +39 -30
  73. package/templates/_agents/scripts/agg-delegations.test.mjs +32 -0
  74. package/templates/_agents/scripts/check-loop.mjs +763 -0
  75. package/templates/_agents/scripts/check-loop.sh +5 -808
  76. package/templates/_agents/scripts/check-loop.test.mjs +1102 -0
  77. package/templates/_agents/scripts/confirm-doc.mjs +228 -0
  78. package/templates/_agents/scripts/confirm-doc.test.mjs +321 -0
  79. package/templates/_agents/scripts/doctor.test.mjs +371 -0
  80. package/templates/_agents/scripts/ensure-board.mjs +30 -3
  81. package/templates/_agents/scripts/fill-intent.mjs +59 -0
  82. package/templates/_agents/scripts/fill-intent.test.mjs +73 -0
  83. package/templates/_agents/scripts/fill-plan.mjs +60 -0
  84. package/templates/_agents/scripts/fill-plan.test.mjs +67 -0
  85. package/templates/_agents/scripts/fill-spec.mjs +52 -0
  86. package/templates/_agents/scripts/fill-spec.test.mjs +61 -0
  87. package/templates/_agents/scripts/gate-checklist.mjs +194 -0
  88. package/templates/_agents/scripts/gate-checklist.test.mjs +204 -0
  89. package/templates/_agents/scripts/gen-wiki-board.mjs +38 -24
  90. package/templates/_agents/scripts/gen-wiki-board.test.mjs +18 -0
  91. package/templates/_agents/scripts/gen-workflow-index.mjs +4 -2
  92. package/templates/_agents/scripts/gen-workflow-metrics.mjs +12 -3
  93. package/templates/_agents/scripts/kb-search.mjs +25 -9
  94. package/templates/_agents/scripts/kb-search.test.mjs +38 -8
  95. package/templates/_agents/scripts/source-sync-check.mjs +145 -0
  96. package/templates/_agents/scripts/source-sync-check.test.mjs +244 -0
  97. package/templates/_agents/scripts/verify-wiki-consistency.mjs +46 -23
  98. package/templates/_agents/scripts/verify.mjs +8 -10
  99. package/templates/_agents/scripts/verify.test.mjs +13 -1
  100. package/templates/_agents/scripts/wf-journal.mjs +158 -0
  101. package/templates/_agents/scripts/wf-journal.test.mjs +150 -0
  102. package/templates/_agents/scripts/workflow-board-server.mjs +73 -17
  103. package/templates/_agents/scripts/workflow-board-server.test.mjs +136 -0
  104. package/templates/_agents/scripts/workflow-enums.mjs +70 -0
  105. package/templates/_agents/scripts/workflow-enums.test.mjs +110 -0
  106. package/templates/_agents/scripts/workflows-check.mjs +260 -0
  107. package/templates/_agents/scripts/workflows-check.test.mjs +267 -0
  108. package/templates/_agents/workflow-enums.txt +19 -0
  109. package/templates/_agents/workflows/_TEMPLATE.md +75 -0
  110. package/templates/_agents/workflows/pipeline-closing.md +29 -0
  111. package/templates/_agents/workflows/source-sync-repair.md +30 -0
  112. package/templates/_agents/workflows/steps//347/244/272/344/276/213-/351/203/250/347/275/262/351/252/214/350/257/201.md +10 -0
  113. package/templates/_agents/workflows//347/244/272/344/276/213-/345/271/266/350/241/214/345/256/236/347/216/260/350/257/204/345/256/241.md +16 -0
  114. package/templates/_githooks/pre-commit +16 -1
  115. package/templates/workflow/README.md +1 -1
  116. package/templates/_agents/cache/kb-index.json +0 -1
  117. package/templates/_agents/scripts/check-loop.test.sh +0 -1042
@@ -3,11 +3,46 @@ name: wf-review
3
3
  description: Review · 代码评审(横切,合入前使用;P0/P1/P2 分级清单 + 用户定性与合入时机)
4
4
  ---
5
5
 
6
- 严格按 AGENTS.md 与 .agents/commands/review.md 执行:Review · 代码评审(横切,合入前使用;P0/P1/P2 分级清单 + 用户定性与合入时机)。
6
+ # Review
7
7
 
8
- 先完整读取上述两个文件并完全遵循,读不到即停下报告阻塞;本文件不内联步骤副本,避免与权威版本漂移。
8
+ > 参考 Anthropic REVIEW.md 做法。宗旨是**用户决策 + AI 协作**:AI 跑机器门禁、自查、出分级清单与建议;用户确认问题定性与合入。把"该机器兜底"与"靠 AI 自查"分开列明,避免注意力耗在机械逐行上。
9
+ > 本文件为通用骨架;项目专属红线 / 命名 / 组件约定的具体口径在项目适配区(目录级 `AGENTS.md` 与 `.agents/hooks/`)补充。
9
10
 
10
- 【Trae 宿主注记】
11
- - 顺序:机器门禁自动拦 → independent-reviewer 复核(L2/L3 强制独立,子智能体未开启时另开新会话)→ 分级清单交用户定性与决定合入时机。
12
- - 确认门:P0/P1 未清回 wf-build;清零且用户确认后才可合入。
13
- - finding 报告门(防误报)与机器兜底清单以权威文件为准。
11
+ ## P0 必拦(优先机器兜底,hook 覆盖不到的靠 AI 自查)
12
+
13
+ - **架构红线**:分层依赖方向约束(如领域 / 应用层禁直接引用基础设施实现;豁免清单见目录级 `AGENTS.md` / 项目适配区)
14
+ - 机器兜底:项目自有架构门禁(如有,`.agents/hooks/`)
15
+ - **审计字段**:项目约定的公共审计字段必须由统一基础设施自动写入,禁业务代码手工补写
16
+ - 机器兜底:项目自有门禁(如有,比对新增审计赋值;统一基础设施与初始化写入合法)
17
+ - **删除拦截**:删除前必须查子级 / 业务引用,被引用时按项目统一口径报错拒绝;无数据库外键兜底的引用(值引用 / 跨模块单据引用)必须服务层显式查
18
+ - 机器兜底:项目自有门禁(如有,删除调用点与 allowlist 比对) + AI 自查守卫正确性(每个调用点核对删前查引用)
19
+ - **入参校验**:必填字符串判空,范围型字段范围校验,非法输入按项目统一错误口径拒绝
20
+ - 机器兜底:项目验证测试覆盖(如有) + AI 自查
21
+ - **L2 / L3 改动无 spec**:拒收,先回 `workflow/specs/` 立 spec 确认通过
22
+
23
+ ## P1 应拦(自查重点)
24
+
25
+ - **DB 命名与迁移**:遵循项目表 / 字段 / 外键命名规范与 schema 变更流程(见目录级 `AGENTS.md`);不得擅自引入项目未采用的迁移机制
26
+ - **前端形态**:新增 / 编辑与大数据量选择等交互遵循项目组件约定(弹层 vs 跳页、选择器形态、表格与样式统一等)
27
+ - **表单**:可选字段空值按项目约定归一化后再提交;禁改后端 DTO 规避校验
28
+ - **状态管理**:遵循项目状态管理模式;store 调 API,组件只调 store
29
+ - **API 入参边界**:写操作禁 `[FromBody]` 绑定领域实体(一律 DTO);入参 DTO 禁含主键与审计字段
30
+ - **导入信任边界**:导入执行端点服务端全量复验,禁信任客户端校验结果;解析失败进错误行汇总,禁静默丢弃
31
+ - **Create/Update 校验同口径**:Create 已有校验 Update 必须同口径;被引用的标识符字段禁改
32
+ - **查询分页与状态语义**:分页参数范围校验 + 服务层钳制;非法状态与不存在分离(按项目统一错误口径,如 400 / 404)
33
+ - **spec 承诺的断言落地**:spec §测试列出的用例 / 断言须真落到测试或验证脚本;「写进 spec」不等于「跑得起来」,且常驻断言禁写成随时间增长的行数常量
34
+ - **跨宿主薄适配正文漂移**:改 `templates/_agents/{commands,roles}/*.md` 后必须跑 `flow-kit sync-hosts --apply` 单向同步 4 宿主薄适配(`modules/hosts/<h>/{agents,commands}/*.md`);装户视角由 `flow-kit doctor` §6.7 检查(包源环境 §6.7 skipped)
35
+
36
+ ## P2 建议(提醒,不拦合入)
37
+
38
+ - 样式统一性(深色 / 浅色主题、卡片样式)
39
+ - 注释完整性(复杂逻辑处补注释,AGENTS.md 已说的不重复)
40
+ - Conventional Commits 中文(feat / fix / docs / style / refactor / perf)
41
+ - 历史同类 incident 的复盘三件套是否补齐
42
+
43
+ ## 审查分工(用户决策 + AI 协作)
44
+
45
+ - **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
46
+ - **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法参考 `code-review` 技能(Standards×Spec 双轴);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
47
+ - **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L0 / L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
48
+ - **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: wf-source-sync-check
3
+ description: 装户面同步一致性检查(包源 templates/_agents/ vs 装副本 .agents/ 三类差异:缺失 / 孤儿 / 漂移;横向工具)
4
+ ---
5
+
6
+ # Source-Sync-Check · 装户面同步一致性
7
+
8
+ > `templates/_agents/` 包源 vs `.agents/` 装副本——三类差异报告:缺失 / 孤儿 / 漂移。
9
+ > managed 文件由 `flow-kit sync` 跟踪;owned 文件由 `flow-kit doctor` §6.6 校验——本工具补"两者都没扫"的真空地带(结构级差异)。
10
+
11
+ ## 何时跑
12
+
13
+ - 改 `templates/_agents/*` 包源后
14
+ - 怀疑装副本未跟包源更新
15
+ - 体检装副本完整性(清理前 / 发版前)
16
+ - 不跑:仅改装副本 `.agents/*`(B-b 决策「只报告」+ 不反向同步)
17
+
18
+ ## 怎么跑
19
+
20
+ ### 默认 `--diff`(仅报告)
21
+
22
+ ```
23
+ node .agents/scripts/source-sync-check.mjs --diff
24
+ node .agents/scripts/source-sync-check.mjs --json # 机器可读
25
+ node .agents/scripts/source-sync-check.mjs --pkg-root <path> --target <path> # 自定义路径
26
+ ```
27
+
28
+ 输出三类:
29
+ - **缺失**(missing)——包源有 / 装副本无(如新增文件 init 未执行)
30
+ - **孤儿**(orphan)——包源无 / 装副本有(如历史残留 / 用户本地添加)
31
+ - **漂移**(drift)——两者都有但 sha 不一致(如包源改了装副本未跟)
32
+
33
+ **排除**:
34
+ - `templates/_agents/cache/`(运行时缓存,与 `flow-kit sync` 既有约定一致)
35
+ - `.agents/kit.json` / `.agents/settings.json`(init 渲染产物,不属双源)
36
+
37
+ ### 输出示例
38
+
39
+ ```
40
+ ▶ flow-kit source-sync-check --diff
41
+ 包源 (templates/_agents/) 49 份 | 装副本 (.agents/) 49 份
42
+ 缺失(包源有 / 装副本 无)1:
43
+ - scripts/source-sync-check.mjs
44
+ 孤儿(包源无 / 装副本 有)1:
45
+ - hooks/commit-check.config.json
46
+ 漂移(包源装副本都有但 sha 不一致)3:
47
+ - commands/maintain.md pkg=3782b695… tgt=26203f7b…
48
+ - notes/runtime-env.md pkg=aedde1ba… tgt=ad08441e…
49
+ - scripts/ensure-board.mjs pkg=e66653b0… tgt=b6f3cc9b…
50
+ ```
51
+
52
+ ### 自验
53
+
54
+ ```
55
+ node .agents/scripts/source-sync-check.test.mjs # 11 场景全过
56
+ npm test # 含 source-sync-check 套件
57
+ flow-kit doctor # 10/0/0
58
+ ```
59
+
60
+ ## 边界(不要做)
61
+
62
+ - 不要自动化同步(B-b 决策「只报告不修复」——与 `gate-checklist` 同源)
63
+ - 不改 managed 台账跟踪逻辑(`sync.mjs` 不动)
64
+ - 不改 owned 漂移校验(`doctor.mjs` §6.6 不动)
65
+ - 不反向同步——装副本独自有文件(如 hooks/commit-check.config.json)可能是装户配置,不应被删
66
+ - 不检查 4 宿主 `modules/hosts/` 薄适配漂移(那是 `flow-kit sync-hosts` 范围)
67
+
68
+ ## 当前已识别的真实漂点(首次实测,2026-09-25)
69
+
70
+ - **缺失**:本工具写完后未同步装副本(预期内——随本次 commit 解决)
71
+ - **孤儿**:`.agents/hooks/commit-check.config.json`(装副本独有,疑似装户配置)
72
+ - **漂移**:`commands/maintain.md` / `notes/runtime-env.md` / `scripts/ensure-board.mjs`
73
+
74
+ 修复留后续 incident / intent 跟踪(不在本次范围)。
75
+
76
+ ## 与既有工具的关系
77
+
78
+ | 工具 | 作用域 | 算法 |
79
+ |---|---|---|
80
+ | `flow-kit sync` | managed 文件(kit.json 台账跟踪)| 三态覆盖 + 加新 + 报错缺 |
81
+ | `flow-kit doctor` §6.6 | owned 文件(kit.owned 哈希比对)| 盘面 sha vs 台账哈希 |
82
+ | **`flow-kit source-sync-check`** | **所有文件结构(包源 ↔ 装副本全集)** | **sha 全量比对 + 缺失/孤儿分类** |
83
+
84
+ 三者互补,不重叠。
85
+
86
+ ## 相关留痕
87
+
88
+ - intent:`workflow/intents/2026-09-25-source-sync-check.md`
89
+ - plan:`workflow/plans/2026-09-25-source-sync-check.md`
90
+ - 父 incident:`workflow/incidents/2026-09-25-wf-runtime.md`(包源改了装副本未同步——本工具预防性体检)
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: wf-sync-hosts
3
+ description: 跨宿主适配层同步(正文段 sha 比对 + 用户拍板 + 单向 apply;frontmatter 不动;横向工具)
4
+ ---
5
+
6
+ # Sync-Hosts · 跨宿主适配层正文段同步
7
+
8
+ > 改权威源(`templates/_agents/{commands,roles}/*.md`)后薄适配(`modules/hosts/<h>/{agents,commands}/*.md`)要同步——薄适配正文 = 权威源正文,frontmatter 各自保留宿主特化(trae commands 加 `name: wf-X`、opencode/zcode/omp 各自原描述)。
9
+ > 装户视角:`flow-kit doctor` §7.x 跑同名检查(仅装户,包源环境跳过——包源下永远是 drift)。
10
+
11
+ ## 何时跑
12
+
13
+ - 改 `templates/_agents/commands/*.md` 正文后(8 个 commands 文件)
14
+ - 改 `templates/_agents/roles/*.md` 正文后(3 个 roles 文件)
15
+ - 装户跑 `flow-kit doctor` 报"跨宿主薄适配正文漂移 N 对" WARN 时
16
+ - 不跑:仅改 frontmatter;改 trae 钩子/规则;改包源其他文件
17
+
18
+ ## 怎么跑
19
+
20
+ ### 默认 `--diff`(仅报告)
21
+
22
+ ```
23
+ node bin/flow-kit.mjs sync-hosts --diff
24
+ node bin/flow-kit.mjs sync-hosts --json # 机器可读
25
+ ```
26
+
27
+ 输出三类:
28
+ - **正文对齐 N 对** — sha 一致,无需处理
29
+ - **正文段漂移 N(权威源 vs 薄适配 sha 不一致)** — `--apply` 同步方向;不区分"权威源改了"或"薄适配手改了",由用户拍板
30
+ - **⚠️ 权威源声明但薄适配缺失** — `add-host <h>` 接管后跑 `--apply` 才会装(apply 不自动创建)
31
+ - **⚠️ 孤儿薄适配(权威源无对应文件)** — 历史残留或宿主特化,apply 不删
32
+
33
+ ### `--apply` 单向同步
34
+
35
+ ```
36
+ node bin/flow-kit.mjs sync-hosts --apply
37
+ ```
38
+
39
+ 按权威源正文覆盖薄适配正文段;薄适配原 frontmatter 保留(trae name: wf-X、opencode 描述、zcode/omp 中文风格各自不动)。apply 不反向同步——薄适配手改了正文也会被覆盖(这是设计选择,避免漂移方向歧义)。
40
+
41
+ ### 自验
42
+
43
+ ```
44
+ npm test # 含 sync-hosts.test.mjs 8 场景
45
+ node bin/flow-kit.mjs doctor # 装户跑 §7.x PASS;包源跑 §7.x skipped
46
+ sh .agents/scripts/check-loop.sh # Windows 无 sh 时 doctor 已探测分流
47
+ ```
48
+
49
+ ## 边界(不要做)
50
+
51
+ - 不要 `--apply` 反向同步(写权威源):权威源是真相,薄适配手改会被覆盖——这是设计,apply 前先看 `--diff`
52
+ - 不要删除孤儿薄适配:可能是宿主特化或历史残留,apply 不动
53
+ - 不要改 frontmatter 让 sha 凑齐:frontmatter 是宿主特化字段(trae name: wf-X 等),工具不参与
54
+ - 不要把「避免与权威版本漂移」明文加回去——这是旧契约的指针风格,已被 B-b 正文副本取代
55
+ - 装了新宿主后跑 `--apply`:新宿主目录空白,apply 不会自动创建薄适配(薄适配须经 `add-host <h>` 接管)
56
+
57
+ ## 不在本次同步范围
58
+
59
+ - trae 钩子(`modules/hosts/trae/hooks/*.cjs`)— 独立演进的工程件
60
+ - trae 规则(`modules/hosts/trae/rules/*.md`)— 同上
61
+ - 包源 .agents/scripts/*.cjs(pre-commit 等钩子)— 同步由 `flow-kit sync` 走 managed 台账负责
62
+
63
+ ## 相关留痕
64
+
65
+ - intent:`workflow/intents/2026-09-25-cross-host-sync.md`
66
+ - plan:`workflow/plans/2026-09-25-cross-host-sync.md`(含 B-b 方案拍板)
67
+ - incident:`workflow/incidents/2026-09-25-wf-runtime.md`(双源纪律教训,规范 §7.x 包源环境跳过)
@@ -3,12 +3,63 @@ name: wf-test
3
3
  description: Test 阶段 · 静态门 + 切库冒烟 + UI 实测 + L2/L3 独立复核(关单在本阶段)
4
4
  ---
5
5
 
6
- 严格按 AGENTS.md 与 .agents/commands/test.md 执行:Test 阶段 · 静态门全过 + 切库冒烟(如触发)+ UI 实测 + L2/L3 独立复核。
6
+ # Test · 静态门 + UI 实测
7
7
 
8
- 先完整读取上述两个文件并完全遵循,读不到即停下报告阻塞;本文件不内联步骤副本,避免与权威版本漂移。
8
+ > 两道闸:静态门全过 + 涉及 UI 走浏览器实测。失败不放过。
9
9
 
10
- 【Trae 宿主注记】
11
- - 确认门:全过后用户确认才关单;**关单在本阶段**(勾验收 / incident 状态 / 委派留痕的口径以权威文件为准)。
12
- - UI 实测委派 ui-verifier(.trae/agents/ui-verifier.md);L2/L3 独立复核委派 independent-reviewer,子智能体未开启时另开新会话。
13
- - 失败项修复仍回 wf-build,不在本阶段顺手改代码。
14
- - L1 到此结束;L2/L3 仅当用户确认要上 prod 才进 wf-deploy。
10
+ ## 1. 静态门(代码改动后必跑)
11
+
12
+ ```bash
13
+ # 项目自有门禁脚本(如有;清单以 .agents/hooks/ 与目录级 AGENTS.md 头部注释为准)
14
+ 项目构建命令 # 编译
15
+ 项目测试命令 # 自动化测试
16
+ 项目类型检查命令 # 前端类型检查/构建(涉及前端时跑)
17
+ node .agents/scripts/verify-wiki-consistency.mjs # 触及 wiki/ 时跑(exit 1 即先修台账再继续:跑 gen-wiki-board.mjs 补索引/看板;pre-commit 已按增量自动拦,此行用于改完即验)
18
+ node bin/flow-kit.mjs doctor # §6.5 delegations + §6.6 owned 漂移 + §6.7 跨宿主薄适配正文漂移(装户环境;包源环境 §6.7 skipped)
19
+ ```
20
+
21
+ > **环境注记**:本地服务占用构建产物导致编译失败、多会话并行时「谁跑静态门 / 提交谁先停服务」等约定——如有,见项目注记 `.agents/notes/runtime-env.md` §2,跑静态门前先过一眼。
22
+
23
+ > **Windows / PowerShell 取码**:`bash` / `sh` 不在 PATH、命令不存在时 `$LASTEXITCODE` 保持旧值(假绿)——调法与取真码姿势见 `.agents/notes/runtime-env.md` §1(如有),断言「通过」前先确认命令真的跑了。
24
+
25
+ 任一失败 → 不进 UI 实测,回 `build.md` 修复;失败难复现(偶发/跨层)时先用 `diagnosing-bugs` 技能走诊断循环(红→最小化→假设→插桩→修复→回归),修复仍回 `build.md`。
26
+
27
+ > **门禁 / 看板 / wiki 脚本改动**(`.agents/scripts/`、`.agents/hooks/`、`.agents/board/`):按改动对象跑对应 fixture 回归,须全绿——闭环门禁 `node .agents/scripts/check-loop.test.mjs`、wiki 生成器 `node .agents/scripts/gen-wiki-board.test.mjs`、提交前 hook 测试(如有);涉及看板告警规则时,用同批 workflow fixture 双跑 `check-loop`(经 shim 或 .mjs 直跑)与看板 `/api/board`,断言 hard-block 集合被看板告警覆盖(防口径分叉)。
28
+
29
+ ## 2. 切库冒烟(切换 / 新增目标库后必跑)
30
+
31
+ 改了项目数据库连接配置(或新增目标库)时,静态门不足以保证库-代码一致(编译 / 类型检查不连库;自动化测试覆盖受既有用例限制),必须额外两步:
32
+
33
+ 1. **schema 比对**:代码期望的表与列 vs 目标库实际 schema。范围 = 近期 schema 变更脚本涉及对象 + 项目基础 / 平台只读表(如有)
34
+ 2. **接口探活**:跑项目自有冒烟脚本(如有,脚本路径登记于根 `AGENTS.md`「项目适配区」;脚本不可用再手工逐个 GET 关键端点),任一非 200 即判库未同步,**停在此步,不部署**
35
+
36
+ 防复发条目的断言增量登记在 `workflow/regression-checklist.md`(如有)。
37
+
38
+ ## 3. UI 实测(涉及前端改动时)
39
+
40
+ 调用项目 UI 实测技能 `.agents/skills/verify-ui/SKILL.md`(如有);环境细节(服务起法 / headless Chrome 参数 / CDP 注入 / 进程生命周期)见该技能与项目注记 `.agents/notes/runtime-env.md`(如有)。
41
+
42
+ ## 4. 独立复核(L2/L3 强制)
43
+
44
+ - L2/L3 改动必须由 `independent-reviewer` 在独立上下文复核;宿主不支持子智能体时另开新会话,避免沿用原修改思路盲区
45
+ - 复核者读入口文档(intent / incident) + spec + plan + diff,判断变更意图与风险
46
+ - 复核意见交用户定性(采纳 / 驳回);采纳项回 `build.md` 修改
47
+
48
+ ## 子代理调用约定
49
+
50
+ - 静态门不委派;UI 实测委派 `ui-verifier`(静态门通过后)、独立复核委派 `independent-reviewer`,均要求读取对应 `.agents/roles/*.md`;宿主不支持时按 frontmatter `fallback`(reviewer 必须另开新会话,不得主智能体自查冒充)。
51
+ - 子智能体只返回证据与结论——失败项修复仍回 `build.md`,不得在 Test 阶段顺手改代码;修复后重跑本阶段,全过后用户确认再关单。
52
+
53
+ ## 确认后
54
+
55
+ - 输出测试报告(通过项 / 失败项)
56
+ - 失败项已修复并复测通过
57
+ - **关单**(日常闭环点,不依赖是否上 prod):
58
+ - 关单前一键过门:`node .agents/scripts/verify.mjs`(npm test + check-loop 固定编排,任一失败非零退出,非绿不关单)
59
+ - 新需求:逐条勾验入口 intent「验收标准」,每条补「证据:」,intent → done;同名 spec(若有)仍 approved → done
60
+ **确认落态唯一入口**(2026-09-27 起):用户在终端跑 `node .agents/scripts/confirm-doc.mjs <path>` 键入「可以」(draft→approved / approved→done;对话内明确确认后 AI 可 `--delegated "<原话>"` 代录,台账如实记 source/quote——**逐件调用 + 逐件原话**(一次一份,build.md「逐件确认」口径;多份并录被 confirm-doc 拒绝。--delegated 每次传当次实际放行的措辞,不复用同句——复用同句使台账 quote 失去分辨力,且相邻同 quote 连跑会触发并录告警))。check-loop 15 如实口径:缺记录/指纹不配对 → hard-block 拦截;伪造台账本地不可机器防,留痕供事后对质;done 内容绑定(2026-09-28 起)——**关单编辑(勾验/回填确认结果)先于 done 确认、confirm-doc 是最后一次写入**,此后修订走 superseded 或新 intent。
61
+ - 修复:防复发验证已落地,incident → closed(经确认门 confirm-doc:open→fixed / fixed→closed 两跳、无单跳;2026-09-28 起 check-loop 15 对账——关单编辑先于 closed 确认,口径同 done 内容绑定)
62
+ - **同族收尾**:入口置终态时,同名 plan 一并置 `done`(spec 见上条),不留 `approved` 孤儿(口径同看板「入口已 done,本 plan 未终态」告警)
63
+ - 主智能体自做的 L1+ 新需求在 `workflow/delegations.md`「自做任务结果表」记一行(修复类不重复记)
64
+ - L1:本阶段结束,不进 deploy
65
+ - L2/L3:仅当用户确认要上 prod 时进 `.agents/commands/deploy.md`
@@ -75,8 +75,9 @@ try {
75
75
  }));
76
76
  process.exit(0);
77
77
  }
78
- // 门禁脚本未装(未跑 add-gate dotnet-ca)≠ 发现违例——区分口径,对齐 pre-shell-check 的 ENOENT 处理(2026-09-24)
79
- if (e.code === 'ENOENT') {
78
+ // 门禁脚本未装(未跑 add-gate dotnet-ca)≠ 发现违例——区分口径,对齐 pre-shell-check 的 ENOENT 处理(2026-09-24);
79
+ // status 127 同义(2026-09-27 host-gates-p1 P2-B4:存在的 bash 跑缺失脚本返回 127 而非 ENOENT,实测原分支不可达)
80
+ if (e.code === 'ENOENT' || e.status === 127) {
80
81
  console.log(JSON.stringify({
81
82
  hookSpecificOutput: {
82
83
  hookEventName: 'PostToolUse',
@@ -76,11 +76,10 @@ function ask(reason) {
76
76
  }
77
77
 
78
78
  // ── 1) deny/ask 命令门禁 ──────────────────────────────
79
+ // 清单权威源 = .agents/settings.json(p2-batch2 对齐:旧清单多抄了一项 'dotnet ef' 造成双源漂移——
80
+ // settings.json 无此项;EF Migrations 禁令属 dotnet-ca 门禁域,如需恢复请先加进 settings.json 再同步此处)
79
81
  const denyList = [
80
- { pat: 'dotnet ef', reason: '禁 EF Migrations,Schema 由人工 SQL 维护' },
81
82
  { pat: 'git reset --hard', reason: '禁破坏性重置' },
82
- { pat: 'git push --force', reason: '禁强制推送' },
83
- { pat: 'git push -f', reason: '禁强制推送' },
84
83
  { pat: 'drop database', reason: '禁删库' }
85
84
  ];
86
85
  const askList = [
@@ -90,16 +89,46 @@ const askList = [
90
89
  { pat: 'rm -rf', reason: '可能递归删除文件' }
91
90
  ];
92
91
 
93
- // gateMatch:比裸 includes 收紧两处(2026-09-24)——
94
- // ① token 边界:'git push --force' 不再误拦 '--force-with-lease'、'git commit' 不再误吃 'git commit-msg'
95
- // ② 剥离 git 全局参 -c <k=v> 与 -m <msg> 后以剥后文本为准——堵 'git -c x=y push --force' 绕过,
96
- // 也免得消息字样误触发;剥不出(norm===cmd)再按原文匹配
92
+ // stripMessages:剥 -c/-m 的值(含引号整段)——deny/ask 门与强推检测共用,防 commit 消息字样误触发
93
+ function stripMessages(cmd) {
94
+ return cmd
95
+ .replace(/(^|\s)-[cm]\s+"[^"]*"(?=\s|$)/g, ' ')
96
+ .replace(/(^|\s)-[cm]\s+'[^']*'(?=\s|$)/g, ' ')
97
+ .replace(/(^|\s)-[cm]\s+\S+(?=\s|$)/g, ' ')
98
+ .replace(/\s+/g, ' ').trim();
99
+ }
100
+
101
+ // 强推检测 token 化(2026-09-27 host-gates-p1 P1-B2):子串模式 'git push --force' 挡不住换序
102
+ // (git push origin main --force)与 +refspec 变体(git push origin +main)——改为 token 级判定。
103
+ // 复核 P2 收窄(同日):①按 &&/||/;/| 分段,--force 只在 push 段内计数(dotnet build --force 不误并);
104
+ // ②组合短旗标(-vf)与 -f 同为 force;③--force-with-lease 是带尾巴的独立 token 不匹配。
105
+ // p2-batch2 补:先剥 commit 消息(引号感知)再分段——"git commit -m "修 push --force"" 曾被误拦。
106
+ // 本钩子是 core.hooksPath 漏配时的主要强推执行点,语义必须完整。
107
+ function isForcePush(cmd) {
108
+ const stripped = stripMessages(cmd);
109
+ return stripped.split(/&&|\|\||;|\|/).some((seg) => {
110
+ const tokens = seg.replace(/\s+/g, ' ').trim().split(' ').filter(Boolean);
111
+ if (!tokens.includes('push')) return false;
112
+ return tokens.some((t) => t === '--force'
113
+ || (t.startsWith('-') && !t.startsWith('--') && /^-[a-zA-Z]*f/.test(t))
114
+ || (t.startsWith('+') && t.length > 1));
115
+ });
116
+ }
117
+
118
+ // gateMatch:比裸 includes 收紧三处(2026-09-24;p2-batch2 补 ③)——
119
+ // ① token 边界:'git checkout' 不再误吃 'git commit-msg'
120
+ // ② 剥离 git 全局参 -c <k=v> 与 -m <msg> 后以剥后文本为准——堵 'git -c x=y reset --hard' 绕过
121
+ // ③ 消息字样误触(p2-batch2):带引号多词消息(-m "修 git push --force 误拦")单 token 剥不净——
122
+ // 剥离逻辑收敛到 stripMessages 单源(引号感知)
97
123
  function gateMatch(cmd, pat) {
98
124
  const re = new RegExp(pat.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '(?![\\w-])');
99
- const norm = cmd.replace(/(^|\s)-[cm]\s+\S+(?=\s|$)/g, ' ').replace(/\s+/g, ' ').trim();
125
+ const norm = stripMessages(cmd);
100
126
  return norm !== cmd ? re.test(norm) : re.test(cmd);
101
127
  }
102
128
 
129
+ if (isForcePush(command)) {
130
+ deny('禁止执行: git push 强制推送(--force / -f / +refspec;项目红线:禁强制推送)');
131
+ }
103
132
  for (const d of denyList) {
104
133
  if (gateMatch(command, d.pat)) {
105
134
  deny(`禁止执行: ${d.pat}(项目红线:${d.reason})`);
@@ -125,6 +154,8 @@ if (!shellBin) {
125
154
  }
126
155
 
127
156
  // runGate:把 .githooks/ 门禁原始输出透传给 AI;未执行(脚本缺失)与判定失败分开报,避免把 ENOENT 误报成代码违例
157
+ // 127 分支(2026-09-27 host-gates-p1 P2-B4):shell 报 127 = 脚本未装(二进制已在 resolveShell 预检排除)——
158
+ // 实测 ENOENT 分支不可达(execFileSync 对存在的 bash 跑缺失脚本返回 status 127 而非 e.code ENOENT)
128
159
  function runGate(scriptRelPath, label, budgetMs) {
129
160
  try {
130
161
  execFileSync(shellBin, [scriptRelPath], {
@@ -136,7 +167,7 @@ function runGate(scriptRelPath, label, budgetMs) {
136
167
  if (e.code === 'ETIMEDOUT') {
137
168
  deny(`${label}超时(${scriptRelPath},${Math.round(budgetMs / 1000)} 秒未完成)——检查 dotnet build / npm run build 是否卡住`);
138
169
  }
139
- if (e.code === 'ENOENT') {
170
+ if (e.code === 'ENOENT' || e.status === 127) {
140
171
  deny(`门禁未执行(${label}):${scriptRelPath} 不可达——确认仓库完整后重试`);
141
172
  }
142
173
  const err = String((e.stdout || '') + (e.stderr || '')).slice(0, 1200);
@@ -8,7 +8,7 @@
8
8
  {
9
9
  "type": "command",
10
10
  "command": "node .trae/hooks/pre-shell-check.cjs",
11
- "timeout": 480
11
+ "timeout": 800
12
12
  }
13
13
  ]
14
14
  }
@@ -2,10 +2,51 @@
2
2
  name: implementer
3
3
  description: 在已批准且边界明确的工作包内实现改动或补测试;超出授权文件范围即停
4
4
  ---
5
- 开工前读项目根 `AGENTS.md` 与 `.agents/roles/implementer.md`,并**完全遵循**该角色契约(必需输入 / 授权文件 / 验收与停止条件)。
5
+ # Implementer
6
+
7
+ > 公共角色契约(本文件):`.agents/roles/implementer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/implementer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
+
9
+ ## 职责
10
+
11
+ 执行已经由主智能体和用户确认、范围明确的实现任务。适用范围仅限:
12
+
13
+ - 单文件或边界清晰的局部实现
14
+ - 有明确复现路径的 bug 修复
15
+ - 编写或调整任务直接要求的测试
16
+ - 修复与任务直接相关的编译错误
17
+
18
+ ## 必需输入
19
+
20
+ 开始前必须获得:
21
+
22
+ - 一句话任务目标
23
+ - 必须读取的入口文档、spec 或 plan
24
+ - 允许修改的文件清单
25
+ - 可执行的验收条件
26
+
27
+ 任一输入缺失或相互冲突时,停止并向主智能体报告,不自行扩大范围。
28
+
29
+ ## 行为边界
30
+
31
+ - 只修改明确授权的文件;若必须触及其他文件,先停止并说明原因。
32
+ - 仓库可能有其他智能体或用户同时工作;保留现有改动,不回退、不覆盖无关修改。
33
+ - 复用现有实现、标准库和已安装依赖,保持最小工作 diff。
34
+ - 不修改公共接口、数据 Schema、依赖、构建步骤、安全或权限策略。
35
+ - 不执行提交、推送、发布、数据迁移或破坏性操作。
36
+ - 不顺手重构、格式化或清理与任务无关的代码。
37
+
38
+ ## 验证
39
+
40
+ - 运行任务指定的最小相关检查。
41
+ - 检查失败时只修复由本次改动引起且仍在授权范围内的问题。
42
+ - 同一验证连续失败三次,或继续需要猜测需求时,停止并报告阻塞。
43
+
44
+ ## 输出
45
+
46
+ 返回给主智能体:
47
+
48
+ 1. 修改文件清单
49
+ 2. 每个文件的改动摘要
50
+ 3. 已运行的验证及结果
51
+ 4. 未解决的阻塞或剩余风险
6
52
 
7
- 宿主适配说明(本机 ZCode):
8
- - 只改派单**授权文件**范围内的内容;需偏离(改公共接口 / 动未列文件 / 引新依赖 / 改验收判据)→ **停下报 blocker**,不自行扩大范围。
9
- - **禁** `git commit` / `git push` / `git reset --hard`;提交与推送由主智能体在复核后执行。
10
- - 不跑全量静态门(构建 / 测试 / 类型检查,命令见 `.agents/commands/test.md` 项目适配区)——由主智能体在改动面收敛后统一跑;本角色只做与工作包直接相关的最小验证。
11
- - 派单缺授权文件清单或可执行验收判据时,**返回 blocker 且不动文件**。
@@ -2,9 +2,48 @@
2
2
  name: independent-reviewer
3
3
  description: 只读独立复核(spec 或实现 diff);不改动文件、不替用户批准
4
4
  ---
5
- 开工前读项目根 `AGENTS.md` 与 `.agents/roles/independent-reviewer.md`,并**完全遵循**该角色契约(输入 / 只读约束 / 产出格式 / 停止条件)。
5
+ # Independent Reviewer
6
6
 
7
- 宿主适配说明(本机 ZCode):
8
- - 只读复核:**不改任何文件**、不跑写操作命令;结论按角色契约的分级清单(P0/P1/P2 + 位置 + 触发条件 + 影响)回报。
9
- - 不替用户批准——复核结论交主智能体汇总,由用户对话内拍板。
10
- - 复核范围内引用不到的必读材料(spec / diff / 关联实现)→ 报 blocker,不猜。
7
+ > 公共角色契约(本文件):`.agents/roles/independent-reviewer.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/independent-reviewer.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
+
9
+ ## 职责
10
+
11
+ 在独立上下文中对 spec、plan 或代码 diff 做只读复核,发现原作者可能遗漏的正确性、契约、架构、数据安全和回归风险。
12
+
13
+ ## 必需输入
14
+
15
+ 开始前必须获得:
16
+
17
+ - 复核对象及固定基准(文件路径、提交或 diff 范围)
18
+ - 对应入口文档、spec、plan(按任务级别提供)
19
+ - 项目根目录 `AGENTS.md` + 改动域对应的目录级 `AGENTS.md`(如有)
20
+ - 期望的复核结论或验收标准
21
+
22
+ 输入不足以确定范围时,停止并向主智能体报告。
23
+
24
+ ## 行为边界
25
+
26
+ - 只读,不修改任何仓库文件。
27
+ - 不替用户决定问题定性、方案取舍、合入或上线。
28
+ - 不继承或猜测原作者未写入输入材料的推理。
29
+ - 只报告能用具体文件、行号、行为或契约证明的问题。
30
+ - 不把样式偏好、假设性风险或既有无关问题包装成缺陷。
31
+ - 无法验证的事项明确标为未验证,不声称已经通过。
32
+
33
+ ## 复核重点
34
+
35
+ 1. 实现是否满足入口文档和验收标准
36
+ 2. 是否违反根 `AGENTS.md` 与改动域目录级 `AGENTS.md` 的架构、数据和所在域红线
37
+ 3. 是否改变未批准的公共契约或范围
38
+ 4. 是否缺少能防止回归的验证
39
+ 5. 是否存在数据丢失、安全、权限或发布风险
40
+
41
+ ## 输出
42
+
43
+ 按严重度输出问题清单:
44
+
45
+ - `P0`:数据、安全、权限或必然阻断交付的问题
46
+ - `P1`:功能错误、明确回归或违反项目硬约束
47
+ - `P2`:非阻断但有证据的维护性问题
48
+
49
+ 每项必须包含:位置、问题、证据、建议。没有发现时明确输出“未发现阻断问题”,并列出未验证范围。
@@ -2,9 +2,47 @@
2
2
  name: ui-verifier
3
3
  description: 浏览器实测 UI 改动(只读验证、不留脏数据);结论按页面/步骤/证据回报
4
4
  ---
5
- 开工前读项目根 `AGENTS.md` 与 `.agents/roles/ui-verifier.md`,并**完全遵循**该角色契约(输入 / 验证步骤 / 不留脏数据约束 / 产出格式)。
5
+ # UI Verifier
6
6
 
7
- 宿主适配说明(本机 ZCode):
8
- - 只做只读验证与既定步骤操作;**不保存/提交业务数据**,验证产生的临时数据按契约清理。
9
- - 不修代码——发现缺陷记录「页面 / 步骤 / 期望 vs 实际 / 截图或报文证据」,交主智能体定性。
10
- - 验证完成后关闭起动的本地进程(按 `.agents/notes/runtime-env.md` §2 的进程清单)。
7
+ > 公共角色契约(本文件):`.agents/roles/ui-verifier.md`。宿主薄适配(`.opencode/` / `.trae/` / `.zcode/` 下 `agents/ui-verifier.md`)正文段同源本文件,frontmatter 各自保留宿主特化字段(check-loop 检查项 6 按本引用校验适配层不断线)。
8
+
9
+ ## 职责
10
+
11
+ 对已经实现的 UI 改动执行浏览器实测并收集可复核证据。只验证,不修复。
12
+
13
+ ## 必需输入
14
+
15
+ 开始前必须获得:
16
+
17
+ - 待验证页面或路由
18
+ - 用户操作步骤
19
+ - 每一步的预期结果
20
+ - 涉及的改动文件或 diff 范围
21
+
22
+ 缺少可观察的预期结果时,停止并向主智能体报告。
23
+
24
+ ## 执行
25
+
26
+ 1. 读取项目根目录 `AGENTS.md`,以及改动域目录级 `AGENTS.md`(如有,前端改动域)。
27
+ 2. 读取并遵循项目 UI 实测技能 `.agents/skills/verify-ui/SKILL.md`(如有)。
28
+ 3. 启动该技能指定的 API、前端和浏览器验证环境。
29
+ 4. 按输入步骤验证页面行为;布局类问题优先使用可重复的 DOM 几何数据。
30
+ 5. 收集控制台、网络请求、DOM 数据或截图等证据。
31
+ 6. 结束时关闭本次启动的后台进程。
32
+
33
+ ## 行为边界
34
+
35
+ - 不修改代码、配置、测试数据或工作流文档。
36
+ - 不自行修复发现的问题;将失败证据交还主智能体。
37
+ - 不使用生产环境或真实业务数据。
38
+ - 无法启动环境或完成关键路径时,报告阻塞,不把部分验证标记为通过。
39
+
40
+ ## 输出
41
+
42
+ 返回:
43
+
44
+ 1. 验证环境与页面路由
45
+ 2. 逐项通过/失败结果
46
+ 3. 失败的复现步骤和证据
47
+ 4. 控制台或网络异常
48
+ 5. 未验证范围与阻塞项
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "agentic-flow-kit",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "AI-Native 闭环工作流 + wiki 知识层脚手架——flow-kit init 一条命令为新项目装好 .agents 工作流引擎(阶段命令/角色契约/门禁钩子/kb 检索/看板/规则面预算)+ workflow 文档闭环 + wiki 知识库,装完自包含、零运行时依赖",
5
5
  "type": "module",
6
6
  "scripts": {
7
- "test": "node src/run-tests.mjs"
7
+ "test": "node src/run-tests.mjs",
8
+ "prepack": "node -e \"require('fs').rmSync('templates/_agents/cache',{recursive:true,force:true})\" && node scripts/check-pack-eol.mjs"
8
9
  },
9
10
  "bin": {
10
11
  "flow-kit": "bin/flow-kit.mjs"
@@ -14,7 +15,9 @@
14
15
  "src",
15
16
  "templates",
16
17
  "modules",
17
- "README.md"
18
+ "README.md",
19
+ "!templates/_agents/cache",
20
+ "!templates/_agents/cache/**"
18
21
  ],
19
22
  "engines": {
20
23
  "node": ">=18.0.0"
package/src/add-gate.mjs CHANGED
@@ -73,15 +73,17 @@ export function addGate(args, pkgRoot) {
73
73
  }
74
74
 
75
75
  // owned 台账补记(归项目所有,sync 永不覆盖)。接线改写了 local-pre-commit(init 时按模板态记账)——
76
- // 须同步刷新其 owned 哈希,否则台账停在模板态(Shipyard 回流发现的漂移根因,2026-09-24)
76
+ // 须同步刷新其 owned 哈希,否则台账停在模板态(Shipyard 回流发现的漂移根因,2026-09-24)。
77
+ // 记账一律 LF 归一(init-p1-batch P1-4 rider):与 doctor §6.6 / sync ownedSha 同口径,跨 checkout 字节稳定
78
+ const shaText = (p) => sha256(Buffer.from(fs.readFileSync(p, 'utf8').replace(/\r\n/g, '\n'), 'utf8'));
77
79
  const ownedLedger = new Map((kit.owned || []).map((f) => [f.rel, f]));
78
80
  for (const name of installed) {
79
81
  const rel = `.agents/hooks/${name}`;
80
- ownedLedger.set(rel, { rel, sha256: sha256(fs.readFileSync(path.join(hooksDir, name))) });
82
+ ownedLedger.set(rel, { rel, sha256: shaText(path.join(hooksDir, name)) });
81
83
  }
82
84
  if (wiredLp) {
83
85
  const lpRel = '.agents/hooks/local-pre-commit';
84
- ownedLedger.set(lpRel, { rel: lpRel, sha256: sha256(fs.readFileSync(path.join(hooksDir, 'local-pre-commit'))) });
86
+ ownedLedger.set(lpRel, { rel: lpRel, sha256: shaText(path.join(hooksDir, 'local-pre-commit')) });
85
87
  }
86
88
  kit.owned = [...ownedLedger.values()].sort((a, b) => a.rel.localeCompare(b.rel));
87
89
  fs.writeFileSync(kitPath, `${JSON.stringify(kit, null, 2)}\n`);