@fitlab-ai/agent-infra 0.8.4 → 0.9.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 (443) hide show
  1. package/bin/cli.ts +2 -2
  2. package/dist/bin/cli.js +2 -2
  3. package/dist/bin/internal-cli.js +98 -0
  4. package/dist/lib/decide.js +81 -90
  5. package/dist/lib/defaults.json +9 -0
  6. package/dist/lib/git/review-snapshot.js +79 -0
  7. package/dist/lib/git/workflow.js +101 -0
  8. package/dist/lib/init.js +5 -0
  9. package/dist/lib/internal/git-workflow.js +42 -0
  10. package/dist/lib/internal/platform-checks.js +119 -0
  11. package/dist/lib/internal/platform-comment.js +129 -0
  12. package/dist/lib/internal/platform-context.js +46 -0
  13. package/dist/lib/internal/platform-issue.js +142 -0
  14. package/dist/lib/internal/platform-pr.js +146 -0
  15. package/dist/lib/internal/release-workflow.js +217 -0
  16. package/dist/lib/internal/task-artifact.js +67 -0
  17. package/dist/lib/internal/task-context.js +43 -0
  18. package/dist/lib/internal/task-event.js +70 -0
  19. package/dist/lib/internal/task-ledger.js +114 -0
  20. package/dist/lib/internal/task-lifecycle.js +58 -0
  21. package/dist/lib/internal/task-short-id.js +83 -0
  22. package/dist/lib/internal/task-snapshot.js +47 -0
  23. package/dist/lib/internal/task-verify.js +50 -0
  24. package/dist/lib/internal/task-warning.js +74 -0
  25. package/dist/lib/platform/adapters.js +14 -0
  26. package/dist/lib/platform/context.js +146 -0
  27. package/dist/lib/platform/github-client.js +124 -0
  28. package/dist/lib/platform/issue-comments.js +409 -0
  29. package/dist/lib/platform/issue-metadata.js +183 -0
  30. package/dist/lib/platform/issues.js +617 -0
  31. package/dist/lib/platform/metadata-labels.js +28 -0
  32. package/dist/lib/platform/pr-checks.js +216 -0
  33. package/dist/lib/platform/pr-summary.js +88 -0
  34. package/dist/lib/platform/pull-request-metadata.js +38 -0
  35. package/dist/lib/platform/pull-requests.js +338 -0
  36. package/dist/lib/platform/releases.js +82 -0
  37. package/dist/lib/platform/types.js +22 -0
  38. package/dist/lib/platform/verification-required.js +78 -0
  39. package/dist/lib/platform/verification-sync.js +1014 -0
  40. package/dist/lib/platform/verification.js +6 -0
  41. package/dist/lib/release/channels.js +31 -0
  42. package/dist/lib/release/workflow.js +32 -0
  43. package/dist/lib/render.js +3 -2
  44. package/dist/lib/run/index.js +24 -7
  45. package/dist/lib/sandbox/capture.js +25 -3
  46. package/dist/lib/sandbox/commands/create.js +66 -26
  47. package/dist/lib/sandbox/commands/enter.js +34 -11
  48. package/dist/lib/sandbox/commands/list-running.js +10 -8
  49. package/dist/lib/sandbox/commands/show.js +2 -2
  50. package/dist/lib/sandbox/commands/start.js +53 -15
  51. package/dist/lib/sandbox/engine.js +33 -3
  52. package/dist/lib/sandbox/engines/colima.js +2 -2
  53. package/dist/lib/sandbox/index.js +6 -6
  54. package/dist/lib/sandbox/mounts.js +36 -0
  55. package/dist/lib/sandbox/recovery.js +562 -0
  56. package/dist/lib/sandbox/runtimes/base.dockerfile +4 -0
  57. package/dist/lib/sandbox/task-resolver.js +5 -1
  58. package/dist/lib/sandbox/tools.js +19 -0
  59. package/dist/lib/server/daemon.js +9 -0
  60. package/dist/lib/server/process-control.js +66 -73
  61. package/dist/lib/server/process-state.js +168 -0
  62. package/dist/lib/server/protocol.js +5 -5
  63. package/dist/lib/task/activity-log.js +61 -0
  64. package/dist/lib/task/artifact-lifecycle.js +427 -0
  65. package/dist/lib/task/command-options.js +30 -0
  66. package/dist/lib/task/commands/cat.js +36 -6
  67. package/dist/lib/task/commands/decisions.js +80 -46
  68. package/dist/lib/task/commands/files.js +21 -7
  69. package/dist/lib/task/commands/grep.js +55 -7
  70. package/dist/lib/task/commands/issue-body.js +23 -14
  71. package/dist/lib/task/commands/log.js +27 -70
  72. package/dist/lib/task/commands/show.js +20 -7
  73. package/dist/lib/task/commands/status.js +18 -8
  74. package/dist/lib/task/decision-intents.js +154 -0
  75. package/dist/lib/task/decision-items.js +53 -0
  76. package/dist/lib/task/events.js +318 -0
  77. package/dist/lib/task/frontmatter.js +159 -1
  78. package/dist/lib/task/implementation-inputs.js +117 -0
  79. package/dist/lib/task/index.js +12 -9
  80. package/dist/lib/task/issue-form.js +19 -6
  81. package/dist/lib/task/ledger-intents.js +185 -0
  82. package/dist/lib/task/ledger.js +65 -35
  83. package/dist/lib/task/lifecycle.js +484 -0
  84. package/dist/lib/task/resolve-ref.js +152 -32
  85. package/dist/lib/task/review-artifacts.js +101 -0
  86. package/dist/lib/task/review-fingerprint.js +46 -0
  87. package/dist/lib/task/sections.js +358 -4
  88. package/dist/lib/task/short-id.js +292 -7
  89. package/dist/lib/task/snapshot.js +95 -0
  90. package/dist/lib/task/verification-checks.js +8 -0
  91. package/dist/lib/task/verification-config.js +14 -0
  92. package/dist/lib/task/verification-engine.js +906 -0
  93. package/dist/lib/task/verification-review.js +3 -0
  94. package/dist/lib/task/verification-types.js +2 -0
  95. package/dist/lib/task/verification.js +113 -0
  96. package/dist/lib/task/workflow-warning-intents.js +131 -0
  97. package/dist/lib/task/workflow-warnings.js +10 -78
  98. package/dist/lib/task/write.js +241 -0
  99. package/dist/lib/update.js +2 -0
  100. package/lib/decide.ts +57 -97
  101. package/lib/defaults.json +9 -0
  102. package/lib/git/review-snapshot.ts +73 -0
  103. package/lib/git/workflow.ts +101 -0
  104. package/lib/init.ts +9 -0
  105. package/lib/internal/git-workflow.ts +37 -0
  106. package/lib/internal/platform-checks.ts +101 -0
  107. package/lib/internal/platform-comment.ts +99 -0
  108. package/lib/internal/platform-context.ts +33 -0
  109. package/lib/internal/platform-issue.ts +116 -0
  110. package/lib/internal/platform-pr.ts +119 -0
  111. package/lib/internal/release-workflow.ts +186 -0
  112. package/lib/internal/task-artifact.ts +47 -0
  113. package/lib/internal/task-context.ts +35 -0
  114. package/lib/internal/task-event.ts +51 -0
  115. package/lib/internal/task-ledger.ts +86 -0
  116. package/lib/internal/task-lifecycle.ts +41 -0
  117. package/lib/internal/task-short-id.ts +55 -0
  118. package/lib/internal/task-snapshot.ts +32 -0
  119. package/lib/internal/task-verify.ts +33 -0
  120. package/lib/internal/task-warning.ts +50 -0
  121. package/lib/platform/adapters.ts +30 -0
  122. package/lib/platform/context.ts +164 -0
  123. package/lib/platform/github-client.ts +146 -0
  124. package/lib/platform/issue-comments.ts +479 -0
  125. package/lib/platform/issue-metadata.ts +250 -0
  126. package/lib/platform/issues.ts +691 -0
  127. package/lib/platform/metadata-labels.ts +33 -0
  128. package/lib/platform/pr-checks.ts +246 -0
  129. package/lib/platform/pr-summary.ts +90 -0
  130. package/lib/platform/pull-request-metadata.ts +69 -0
  131. package/lib/platform/pull-requests.ts +380 -0
  132. package/lib/platform/releases.ts +71 -0
  133. package/lib/platform/types.ts +74 -0
  134. package/lib/platform/verification-required.ts +83 -0
  135. package/{templates/.agents/scripts/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +221 -363
  136. package/lib/platform/verification.ts +11 -0
  137. package/lib/release/channels.ts +30 -0
  138. package/lib/release/workflow.ts +31 -0
  139. package/lib/render.ts +3 -2
  140. package/lib/run/index.ts +25 -7
  141. package/lib/sandbox/capture.ts +29 -3
  142. package/lib/sandbox/commands/create.ts +75 -28
  143. package/lib/sandbox/commands/enter.ts +38 -11
  144. package/lib/sandbox/commands/list-running.ts +10 -8
  145. package/lib/sandbox/commands/show.ts +2 -2
  146. package/lib/sandbox/commands/start.ts +50 -16
  147. package/lib/sandbox/engine.ts +37 -3
  148. package/lib/sandbox/engines/colima.ts +2 -2
  149. package/lib/sandbox/index.ts +6 -6
  150. package/lib/sandbox/mounts.ts +55 -0
  151. package/lib/sandbox/recovery.ts +828 -0
  152. package/lib/sandbox/runtimes/base.dockerfile +4 -0
  153. package/lib/sandbox/task-resolver.ts +5 -1
  154. package/lib/sandbox/tools.ts +31 -0
  155. package/lib/server/daemon.ts +9 -0
  156. package/lib/server/process-control.ts +70 -71
  157. package/lib/server/process-state.ts +183 -0
  158. package/lib/server/protocol.ts +5 -5
  159. package/lib/task/activity-log.ts +62 -0
  160. package/lib/task/artifact-lifecycle.ts +484 -0
  161. package/lib/task/command-options.ts +32 -0
  162. package/lib/task/commands/cat.ts +22 -9
  163. package/lib/task/commands/decisions.ts +49 -47
  164. package/lib/task/commands/files.ts +14 -6
  165. package/lib/task/commands/grep.ts +34 -7
  166. package/lib/task/commands/issue-body.ts +16 -16
  167. package/lib/task/commands/log.ts +17 -70
  168. package/lib/task/commands/show.ts +14 -6
  169. package/lib/task/commands/status.ts +17 -7
  170. package/lib/task/decision-intents.ts +163 -0
  171. package/lib/task/decision-items.ts +64 -0
  172. package/lib/task/events.ts +320 -0
  173. package/lib/task/frontmatter.ts +202 -2
  174. package/lib/task/implementation-inputs.ts +137 -0
  175. package/lib/task/index.ts +12 -9
  176. package/lib/task/issue-form.ts +20 -6
  177. package/lib/task/ledger-intents.ts +201 -0
  178. package/lib/task/ledger.ts +77 -31
  179. package/lib/task/lifecycle.ts +458 -0
  180. package/lib/task/resolve-ref.ts +197 -36
  181. package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
  182. package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +20 -10
  183. package/lib/task/sections.ts +486 -4
  184. package/lib/task/short-id.ts +403 -9
  185. package/lib/task/snapshot.ts +143 -0
  186. package/lib/task/verification-checks.ts +9 -0
  187. package/lib/task/verification-config.ts +20 -0
  188. package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +257 -451
  189. package/lib/task/verification-review.ts +9 -0
  190. package/lib/task/verification-types.ts +29 -0
  191. package/lib/task/verification.ts +156 -0
  192. package/lib/task/workflow-warning-intents.ts +142 -0
  193. package/lib/task/workflow-warnings.ts +10 -78
  194. package/lib/task/write.ts +468 -0
  195. package/lib/update.ts +6 -0
  196. package/package.json +5 -2
  197. package/templates/.agents/README.en.md +6 -3
  198. package/templates/.agents/README.zh-CN.md +6 -3
  199. package/templates/.agents/rules/README.en.md +6 -5
  200. package/templates/.agents/rules/README.zh-CN.md +6 -5
  201. package/templates/.agents/rules/create-issue.en.md +1 -1
  202. package/templates/.agents/rules/create-issue.github.en.md +5 -184
  203. package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
  204. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  205. package/templates/.agents/rules/human-decision-context.en.md +36 -0
  206. package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
  207. package/templates/.agents/rules/issue-fields.github.en.md +4 -148
  208. package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
  209. package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
  210. package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
  211. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
  212. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
  213. package/templates/.agents/rules/issue-sync.en.md +1 -1
  214. package/templates/.agents/rules/issue-sync.github.en.md +14 -301
  215. package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
  216. package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
  217. package/templates/.agents/rules/milestone-inference.en.md +1 -1
  218. package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
  219. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
  220. package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
  221. package/templates/.agents/rules/next-step-output.en.md +12 -11
  222. package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
  223. package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
  224. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
  225. package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
  226. package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
  227. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
  228. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
  229. package/templates/.agents/rules/pr-sync.en.md +30 -3
  230. package/templates/.agents/rules/pr-sync.github.en.md +12 -115
  231. package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
  232. package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
  233. package/templates/.agents/rules/review-handshake.en.md +13 -9
  234. package/templates/.agents/rules/review-handshake.zh-CN.md +13 -9
  235. package/templates/.agents/rules/task-management.en.md +11 -2
  236. package/templates/.agents/rules/task-management.zh-CN.md +11 -3
  237. package/templates/.agents/rules/task-short-id.en.md +25 -29
  238. package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
  239. package/templates/.agents/scripts/lib/agent-infra-package.js +141 -0
  240. package/templates/.agents/scripts/task-short-id.js +71 -533
  241. package/templates/.agents/skills/analyze-task/SKILL.en.md +22 -55
  242. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +26 -59
  243. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
  244. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
  245. package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
  246. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
  247. package/templates/.agents/skills/block-task/config/verify.json +1 -2
  248. package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
  249. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
  250. package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
  251. package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
  252. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
  253. package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
  254. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
  255. package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
  256. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
  257. package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
  258. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
  259. package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
  260. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
  261. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
  262. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
  263. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
  264. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
  265. package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
  266. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
  267. package/templates/.agents/skills/commit/SKILL.en.md +18 -14
  268. package/templates/.agents/skills/commit/SKILL.zh-CN.md +18 -14
  269. package/templates/.agents/skills/commit/config/verify.json +1 -2
  270. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
  271. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
  272. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
  273. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
  274. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
  275. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
  276. package/templates/.agents/skills/commit/reference/task-status-update.en.md +42 -2
  277. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +42 -2
  278. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
  279. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
  280. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
  281. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
  282. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
  283. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
  284. package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
  285. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
  286. package/templates/.agents/skills/complete-task/config/verify.en.json +11 -6
  287. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -6
  288. package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
  289. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
  290. package/templates/.agents/skills/create-pr/config/verify.json +1 -2
  291. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
  292. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
  293. package/templates/.agents/skills/create-task/SKILL.en.md +12 -13
  294. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +12 -13
  295. package/templates/.agents/skills/create-task/config/verify.json +1 -2
  296. package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
  297. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
  298. package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
  299. package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
  300. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
  301. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
  302. package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
  303. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
  304. package/templates/.agents/skills/import-issue/config/verify.json +1 -2
  305. package/templates/.agents/skills/init-milestones/SKILL.en.md +2 -2
  306. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +2 -2
  307. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +5 -4
  308. package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
  309. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
  310. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
  311. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
  312. package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
  313. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
  314. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  315. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  316. package/templates/.agents/skills/release/SKILL.en.md +16 -163
  317. package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
  318. package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
  319. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
  320. package/templates/.agents/skills/restore-task/config/verify.json +1 -2
  321. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
  322. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
  323. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
  324. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
  325. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
  326. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
  327. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
  328. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
  329. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
  330. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
  331. package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
  332. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
  333. package/templates/.agents/skills/review-code/config/verify.en.json +5 -5
  334. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +5 -5
  335. package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
  336. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
  337. package/templates/.agents/skills/review-code/reference/report-template.en.md +12 -4
  338. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -4
  339. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
  340. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
  341. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
  342. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
  343. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
  344. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
  345. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
  346. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
  347. package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
  348. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
  349. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
  350. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
  351. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +6 -3
  352. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +6 -3
  353. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +177 -151
  354. package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
  355. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
  356. package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
  357. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
  358. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
  359. package/templates/.agents/templates/task.en.md +6 -1
  360. package/templates/.agents/templates/task.zh-CN.md +6 -1
  361. package/templates/.claude/commands/analyze-task.en.md +1 -1
  362. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  363. package/templates/.claude/commands/block-task.en.md +1 -1
  364. package/templates/.claude/commands/block-task.zh-CN.md +1 -1
  365. package/templates/.claude/commands/cancel-task.en.md +1 -1
  366. package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
  367. package/templates/.claude/commands/check-task.en.md +1 -1
  368. package/templates/.claude/commands/check-task.zh-CN.md +1 -1
  369. package/templates/.claude/commands/code-task.en.md +1 -1
  370. package/templates/.claude/commands/code-task.zh-CN.md +1 -1
  371. package/templates/.claude/commands/commit.en.md +1 -0
  372. package/templates/.claude/commands/commit.zh-CN.md +1 -0
  373. package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
  374. package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
  375. package/templates/.claude/commands/complete-task.en.md +1 -1
  376. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  377. package/templates/.claude/commands/create-pr.en.md +1 -1
  378. package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
  379. package/templates/.claude/commands/plan-task.en.md +1 -1
  380. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  381. package/templates/.claude/commands/review-analysis.en.md +1 -1
  382. package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
  383. package/templates/.claude/commands/review-code.en.md +1 -1
  384. package/templates/.claude/commands/review-code.zh-CN.md +1 -1
  385. package/templates/.claude/commands/review-plan.en.md +1 -1
  386. package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
  387. package/templates/.claude/commands/watch-pr.en.md +1 -1
  388. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  389. package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
  390. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
  391. package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
  392. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
  393. package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
  394. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
  395. package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
  396. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
  397. package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
  398. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
  399. package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
  400. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
  401. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
  402. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
  403. package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
  404. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
  405. package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
  406. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
  407. package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
  408. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
  409. package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
  410. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
  411. package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
  412. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
  413. package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
  414. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
  415. package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
  416. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
  417. package/templates/.git-hooks/check-large-files.cjs +92 -0
  418. package/templates/.git-hooks/check-version-format.sh +5 -1
  419. package/templates/.git-hooks/pre-commit +1 -0
  420. package/templates/.opencode/commands/analyze-task.en.md +1 -1
  421. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  422. package/templates/.opencode/commands/check-task.en.md +1 -1
  423. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  424. package/templates/.opencode/commands/code-task.en.md +1 -1
  425. package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
  426. package/templates/.opencode/commands/commit.en.md +2 -0
  427. package/templates/.opencode/commands/commit.zh-CN.md +2 -0
  428. package/templates/.opencode/commands/complete-task.en.md +1 -1
  429. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  430. package/templates/.opencode/commands/plan-task.en.md +1 -1
  431. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  432. package/templates/.opencode/commands/review-analysis.en.md +1 -1
  433. package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
  434. package/templates/.opencode/commands/review-code.en.md +1 -1
  435. package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
  436. package/templates/.opencode/commands/review-plan.en.md +1 -1
  437. package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
  438. package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
  439. package/templates/.agents/scripts/review-diff-fingerprint.js +0 -99
  440. package/templates/.agents/scripts/workflow-warnings.js +0 -290
  441. package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
  442. package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
  443. package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
@@ -13,12 +13,17 @@
13
13
  * Output: JSON report to stdout.
14
14
  */
15
15
 
16
- import childProcess from 'node:child_process';
16
+ import crypto from 'node:crypto';
17
17
  import fs from 'node:fs';
18
18
  import os from 'node:os';
19
19
  import path from 'node:path';
20
20
  import { fileURLToPath } from 'node:url';
21
21
 
22
+ import {
23
+ formatAgentInfraPackageError,
24
+ resolveAgentInfraPackage
25
+ } from '../../../scripts/lib/agent-infra-package.js';
26
+
22
27
  const DEFAULTS = {
23
28
  "platform": {
24
29
  "type": "github"
@@ -63,10 +68,19 @@ const DEFAULTS = {
63
68
  ".claude/commands/",
64
69
  ".codex/hooks.json",
65
70
  ".gemini/commands/",
71
+ ".git-hooks/check-large-files.cjs",
66
72
  ".git-hooks/check-version-format.sh",
67
73
  ".github/scripts/",
74
+ ".github/workflows/metadata-sync.yml",
75
+ ".github/workflows/pr-label.yml",
76
+ ".github/workflows/status-label.yml",
68
77
  ".opencode/commands/"
69
78
  ],
79
+ "guardedManaged": [
80
+ ".github/workflows/metadata-sync.yml",
81
+ ".github/workflows/pr-label.yml",
82
+ ".github/workflows/status-label.yml"
83
+ ],
70
84
  "merged": [
71
85
  "**/post-release.*",
72
86
  "**/release.*",
@@ -88,12 +102,11 @@ const DEFAULTS = {
88
102
  }
89
103
  };
90
104
 
91
- const PACKAGE_NAME = '@fitlab-ai/agent-infra';
92
105
  const AGENT_INFRA_SANDBOX_TOOL = 'agent-infra';
93
106
  const LEGACY_DEFAULT_SANDBOX_TOOLS = ['claude-code', 'codex', 'gemini-cli', 'opencode'];
94
107
  const DEFAULT_SANDBOX_TOOLS = [AGENT_INFRA_SANDBOX_TOOL, ...LEGACY_DEFAULT_SANDBOX_TOOLS];
95
108
  // Add a new identifier here only after shipping matching .{platform}. template variants.
96
- const KNOWN_PLATFORMS = new Set(['github']);
109
+ const KNOWN_PLATFORMS = new Set(['github', 'none']);
97
110
  const KNOWN_LANGUAGES = new Set(['en', 'zh-CN']);
98
111
 
99
112
  // Single source of truth for built-in TUI ids and owned path prefixes.
@@ -151,6 +164,14 @@ function migrateSandboxTools(cfg) {
151
164
 
152
165
  function norm(p) { return p.replace(/\\/g, '/'); }
153
166
 
167
+ function sha256(content) {
168
+ return `sha256:${crypto.createHash('sha256').update(content).digest('hex')}`;
169
+ }
170
+
171
+ function trustedBaseline(value) {
172
+ return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value) ? value : null;
173
+ }
174
+
154
175
  function normDir(p) {
155
176
  return norm(p).replace(/^\.\//, '').replace(/\/+$/, '');
156
177
  }
@@ -839,117 +860,6 @@ function stripLangVariant(relativePath) {
839
860
  return relativePath;
840
861
  }
841
862
 
842
- function isTemplateDir(dir) {
843
- try {
844
- return fs.statSync(dir).isDirectory();
845
- } catch {
846
- return false;
847
- }
848
- }
849
-
850
- function verifyPackageDir(dir) {
851
- const pkgPath = path.join(dir, 'package.json');
852
- if (!fs.existsSync(pkgPath)) {
853
- return { templateRoot: null, reason: `package.json not found at ${pkgPath}` };
854
- }
855
-
856
- let pkg;
857
- try {
858
- pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
859
- } catch {
860
- return { templateRoot: null, reason: `invalid package.json at ${pkgPath}` };
861
- }
862
-
863
- if (pkg.name !== PACKAGE_NAME) {
864
- const packageName = typeof pkg.name === 'string' && pkg.name ? pkg.name : 'an unknown package';
865
- return { templateRoot: null, reason: `${pkgPath} belongs to ${packageName}` };
866
- }
867
-
868
- const templateRoot = path.join(dir, 'templates');
869
- if (!isTemplateDir(templateRoot)) {
870
- return { templateRoot: null, reason: `templates/ not found at ${templateRoot}` };
871
- }
872
-
873
- return { templateRoot, reason: null };
874
- }
875
-
876
- function resolveUnixTemplateRoot(name) {
877
- let linkPath;
878
- try {
879
- linkPath = childProcess.execSync(`command -v ${name}`, {
880
- encoding: 'utf8',
881
- stdio: ['pipe', 'pipe', 'pipe']
882
- }).trim();
883
- } catch {
884
- return { templateRoot: null, reason: 'not found in PATH' };
885
- }
886
-
887
- if (!linkPath) {
888
- return { templateRoot: null, reason: 'not found in PATH' };
889
- }
890
-
891
- let realPath;
892
- try {
893
- realPath = fs.realpathSync(linkPath);
894
- } catch {
895
- return { templateRoot: null, reason: `cannot resolve symlink target for ${linkPath}` };
896
- }
897
-
898
- let dir = path.dirname(realPath);
899
- while (true) {
900
- const pkgPath = path.join(dir, 'package.json');
901
- if (fs.existsSync(pkgPath)) {
902
- return verifyPackageDir(dir);
903
- }
904
-
905
- const parentDir = path.dirname(dir);
906
- if (parentDir === dir) {
907
- break;
908
- }
909
- dir = parentDir;
910
- }
911
-
912
- return { templateRoot: null, reason: `no package.json found above ${realPath}` };
913
- }
914
-
915
- function resolveWindowsTemplateRoot(name) {
916
- let output;
917
- try {
918
- output = childProcess.execSync(`where ${name}`, {
919
- encoding: 'utf8',
920
- stdio: ['pipe', 'pipe', 'pipe']
921
- }).trim();
922
- } catch {
923
- return { templateRoot: null, reason: 'not found in PATH' };
924
- }
925
-
926
- const wrapperPaths = output.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
927
- if (wrapperPaths.length === 0) {
928
- return { templateRoot: null, reason: 'not found in PATH' };
929
- }
930
-
931
- const wrapperPath = wrapperPaths.find(line => /\.cmd$/i.test(line)) || wrapperPaths[0];
932
- const packageDir = path.join(path.dirname(wrapperPath), 'node_modules', '@fitlab-ai', 'agent-infra');
933
- return verifyPackageDir(packageDir);
934
- }
935
-
936
- function resolveTemplateRoot() {
937
- const resolver = process.platform === 'win32'
938
- ? resolveWindowsTemplateRoot
939
- : resolveUnixTemplateRoot;
940
- const errors = [];
941
-
942
- for (const name of ['ai', 'agent-infra']) {
943
- const result = resolver(name);
944
- if (result.templateRoot) {
945
- return result.templateRoot;
946
- }
947
- errors.push({ name, reason: result.reason });
948
- }
949
-
950
- return { templateRoot: null, errors };
951
- }
952
-
953
863
  function isBinary(fp) {
954
864
  const fd = fs.openSync(fp, 'r');
955
865
  const buf = Buffer.alloc(8192);
@@ -960,14 +870,6 @@ function isBinary(fp) {
960
870
  return false;
961
871
  }
962
872
 
963
- function gitUrl(dir) {
964
- try {
965
- return childProcess.execSync('git remote get-url origin', {
966
- cwd: dir, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe']
967
- }).trim();
968
- } catch { return null; }
969
- }
970
-
971
873
  function langSelect(rels, lang, allSet, project) {
972
874
  const sel = new Map();
973
875
 
@@ -1037,25 +939,14 @@ function syncTemplates(projectRoot, templateRootOverride) {
1037
939
  const configPathRel = norm(path.relative(projectRoot, cfgPath));
1038
940
  let templateRoot = templateRootOverride;
1039
941
  if (!templateRoot) {
1040
- const resolvedTemplateRoot = resolveTemplateRoot();
1041
- if (typeof resolvedTemplateRoot === 'string') {
1042
- templateRoot = resolvedTemplateRoot;
942
+ const packageResolution = resolveAgentInfraPackage({
943
+ startPath: path.join(projectRoot, '.agents', 'scripts', 'lib', 'agent-infra-package.js')
944
+ });
945
+ if (packageResolution.templateRoot && fs.existsSync(packageResolution.templateRoot)) {
946
+ templateRoot = packageResolution.templateRoot;
1043
947
  } else {
1044
- const details = resolvedTemplateRoot.errors
1045
- .map(({ name, reason }) => ` - ${name}: ${reason}`)
1046
- .join('\n');
1047
948
  return {
1048
- error: [
1049
- 'Template source not found.',
1050
- '',
1051
- 'Attempted binary lookups:',
1052
- details,
1053
- '',
1054
- 'Please ensure agent-infra is installed and available on PATH.',
1055
- 'If already installed, upgrade to the latest version or reinstall:',
1056
- ' npm install -g @fitlab-ai/agent-infra',
1057
- ' brew upgrade fitlab-ai/agent-infra/agent-infra || brew install fitlab-ai/agent-infra/agent-infra'
1058
- ].join('\n')
949
+ error: formatAgentInfraPackageError(packageResolution)
1059
950
  };
1060
951
  }
1061
952
  }
@@ -1073,6 +964,19 @@ function syncTemplates(projectRoot, templateRootOverride) {
1073
964
  const managed = [...(cfg.files.managed || [])];
1074
965
  const merged = [...(cfg.files.merged || [])];
1075
966
  const ejected = [...(cfg.files.ejected || [])];
967
+ const guardedManaged = new Set((DEFAULTS.files.guardedManaged || []).map(norm));
968
+ const managedBaselines = cfg.files.managedBaselines && typeof cfg.files.managedBaselines === 'object'
969
+ && !Array.isArray(cfg.files.managedBaselines)
970
+ ? { ...cfg.files.managedBaselines }
971
+ : {};
972
+ let baselinesChanged = false;
973
+
974
+ for (const target of Object.keys(managedBaselines)) {
975
+ if (!guardedManaged.has(norm(target))) {
976
+ delete managedBaselines[target];
977
+ baselinesChanged = true;
978
+ }
979
+ }
1076
980
 
1077
981
  const report = {
1078
982
  templateVersion: version,
@@ -1085,7 +989,17 @@ function syncTemplates(projectRoot, templateRootOverride) {
1085
989
  errors: [],
1086
990
  conflicts: []
1087
991
  },
1088
- managed: { written: [], created: [], unchanged: [], skippedMerged: [], skippedPlatform: [], skippedTUI: [], removed: [] },
992
+ managed: {
993
+ written: [],
994
+ created: [],
995
+ unchanged: [],
996
+ protected: [],
997
+ conflicts: [],
998
+ skippedMerged: [],
999
+ skippedPlatform: [],
1000
+ skippedTUI: [],
1001
+ removed: []
1002
+ },
1089
1003
  custom: {
1090
1004
  detected: [],
1091
1005
  generated: [],
@@ -1098,8 +1012,7 @@ function syncTemplates(projectRoot, templateRootOverride) {
1098
1012
  },
1099
1013
  ejected: { created: [], skipped: [] },
1100
1014
  merged: { pending: [] },
1101
- configUpdated: false,
1102
- selfUpdate: false
1015
+ configUpdated: false
1103
1016
  };
1104
1017
  const customTUIs = validateCustomTUIs(projectRoot, customTUIsConfig, report);
1105
1018
  const customTUICommandTargets = buildCustomTUICommandTargets(
@@ -1127,6 +1040,22 @@ function syncTemplates(projectRoot, templateRootOverride) {
1127
1040
  const allRels = mergedRels;
1128
1041
  const allSet = new Set(allRels);
1129
1042
 
1043
+ function renderedTemplate(entry) {
1044
+ const target = norm(renderPathname(entry, project));
1045
+ const selected = platformSelect(
1046
+ langSelect(entryVariantRels(entry, allSet, platformType), lang, allSet, project),
1047
+ platformType,
1048
+ project
1049
+ );
1050
+ const src = selected.get(target);
1051
+ if (!src) return null;
1052
+ const srcRoot = sourceMap.get(src) || templateRoot;
1053
+ const srcFull = path.join(srcRoot, src);
1054
+ return isBinary(srcFull)
1055
+ ? fs.readFileSync(srcFull)
1056
+ : renderContent(fs.readFileSync(srcFull, 'utf8'), vars);
1057
+ }
1058
+
1130
1059
  for (const entry of [...managed, ...merged, ...ejected]) {
1131
1060
  if (!isPathOwnedByOtherPlatform(entry, platformType)) continue;
1132
1061
 
@@ -1135,17 +1064,49 @@ function syncTemplates(projectRoot, templateRootOverride) {
1135
1064
  if (!fs.existsSync(dir)) continue;
1136
1065
 
1137
1066
  for (const filePath of walkDir(dir)) {
1067
+ const relativeFile = norm(path.relative(projectRoot, filePath));
1068
+ if (guardedManaged.has(relativeFile)) continue;
1138
1069
  fs.unlinkSync(filePath);
1139
- report.managed.removed.push(norm(path.relative(projectRoot, filePath)));
1070
+ report.managed.removed.push(relativeFile);
1140
1071
  }
1141
1072
  removeEmptyDirs(dir);
1142
1073
  continue;
1143
1074
  }
1144
1075
 
1145
- const target = path.join(projectRoot, renderPathname(entry, project));
1146
- if (!fs.existsSync(target)) continue;
1147
- fs.unlinkSync(target);
1148
- report.managed.removed.push(norm(path.relative(projectRoot, target)));
1076
+ const renderedTarget = norm(renderPathname(entry, project));
1077
+ const target = path.join(projectRoot, renderedTarget);
1078
+ if (!guardedManaged.has(renderedTarget)) {
1079
+ if (!fs.existsSync(target)) continue;
1080
+ fs.unlinkSync(target);
1081
+ report.managed.removed.push(renderedTarget);
1082
+ continue;
1083
+ }
1084
+
1085
+ const baseline = trustedBaseline(managedBaselines[renderedTarget]);
1086
+ const templateContent = renderedTemplate(entry);
1087
+ const templateHash = templateContent === null ? null : sha256(templateContent);
1088
+ const localHash = fs.existsSync(target) ? sha256(fs.readFileSync(target)) : null;
1089
+ const safeToRemove = localHash !== null && (localHash === baseline || (!baseline && localHash === templateHash));
1090
+
1091
+ if (safeToRemove) {
1092
+ fs.unlinkSync(target);
1093
+ report.managed.removed.push(renderedTarget);
1094
+ if (Object.prototype.hasOwnProperty.call(managedBaselines, renderedTarget)) {
1095
+ delete managedBaselines[renderedTarget];
1096
+ baselinesChanged = true;
1097
+ }
1098
+ continue;
1099
+ }
1100
+
1101
+ if (localHash !== null || baseline !== null) {
1102
+ report.managed.conflicts.push({
1103
+ target: renderedTarget,
1104
+ reason: localHash === null ? 'platform-switch-deleted' : 'platform-switch-modified',
1105
+ baseline,
1106
+ local: localHash,
1107
+ template: templateHash
1108
+ });
1109
+ }
1149
1110
  }
1150
1111
 
1151
1112
  // Cleanup files owned by disabled built-in TUIs. Iterates managed + merged
@@ -1230,6 +1191,68 @@ function syncTemplates(projectRoot, templateRootOverride) {
1230
1191
  : renderContent(fs.readFileSync(srcFull, 'utf8'), vars);
1231
1192
 
1232
1193
  const exists = fs.existsSync(dstFull);
1194
+ if (guardedManaged.has(tgt)) {
1195
+ const rawBaseline = managedBaselines[tgt];
1196
+ const baseline = trustedBaseline(rawBaseline);
1197
+ const templateHash = sha256(content);
1198
+ const localHash = exists ? sha256(fs.readFileSync(dstFull)) : null;
1199
+
1200
+ if (rawBaseline !== undefined && baseline === null) {
1201
+ delete managedBaselines[tgt];
1202
+ baselinesChanged = true;
1203
+ }
1204
+
1205
+ if (baseline === null && localHash !== null && localHash !== templateHash) {
1206
+ report.managed.conflicts.push({
1207
+ target: tgt,
1208
+ reason: 'unknown-origin',
1209
+ baseline: null,
1210
+ local: localHash,
1211
+ template: templateHash
1212
+ });
1213
+ continue;
1214
+ }
1215
+
1216
+ if (baseline !== null && templateHash === baseline && localHash !== baseline) {
1217
+ report.managed.protected.push({
1218
+ target: tgt,
1219
+ reason: localHash === null ? 'user-deleted' : 'user-modified',
1220
+ baseline,
1221
+ local: localHash,
1222
+ template: templateHash
1223
+ });
1224
+ continue;
1225
+ }
1226
+
1227
+ if (baseline !== null && localHash !== baseline && templateHash !== baseline && localHash !== templateHash) {
1228
+ report.managed.conflicts.push({
1229
+ target: tgt,
1230
+ reason: 'both-modified',
1231
+ baseline,
1232
+ local: localHash,
1233
+ template: templateHash
1234
+ });
1235
+ continue;
1236
+ }
1237
+
1238
+ if (localHash === templateHash) {
1239
+ report.managed.unchanged.push(tgt);
1240
+ if (managedBaselines[tgt] !== templateHash) {
1241
+ managedBaselines[tgt] = templateHash;
1242
+ baselinesChanged = true;
1243
+ }
1244
+ continue;
1245
+ }
1246
+
1247
+ const dir = path.dirname(dstFull);
1248
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
1249
+ fs.writeFileSync(dstFull, content);
1250
+ managedBaselines[tgt] = templateHash;
1251
+ baselinesChanged = true;
1252
+ (exists ? report.managed.written : report.managed.created).push(tgt);
1253
+ continue;
1254
+ }
1255
+
1233
1256
  if (exists) {
1234
1257
  const cur = bin ? fs.readFileSync(dstFull) : fs.readFileSync(dstFull, 'utf8');
1235
1258
  if (bin ? content.equals(cur) : content === cur) {
@@ -1333,9 +1356,6 @@ function syncTemplates(projectRoot, templateRootOverride) {
1333
1356
  ([target, template]) => ({ target, template })
1334
1357
  );
1335
1358
 
1336
- const projUrl = gitUrl(projectRoot);
1337
- report.selfUpdate = !!(projUrl && /fitlab-ai\/agent-infra/.test(projUrl));
1338
-
1339
1359
  const hasChanges = (
1340
1360
  report.managed.written.length +
1341
1361
  report.managed.created.length +
@@ -1355,10 +1375,16 @@ function syncTemplates(projectRoot, templateRootOverride) {
1355
1375
  cfg.files.managed = managed;
1356
1376
  cfg.files.merged = merged;
1357
1377
  cfg.files.ejected = ejected;
1378
+ if (Object.keys(managedBaselines).length > 0) {
1379
+ cfg.files.managedBaselines = managedBaselines;
1380
+ } else {
1381
+ if (Object.prototype.hasOwnProperty.call(cfg.files, 'managedBaselines')) baselinesChanged = true;
1382
+ delete cfg.files.managedBaselines;
1383
+ }
1358
1384
  cfg.templateVersion = version;
1359
1385
  delete cfg.templateSource;
1360
1386
 
1361
- report.configUpdated = hasChanges || prevVersion !== version || hadTemplateSource || sandboxToolsMigrated;
1387
+ report.configUpdated = hasChanges || baselinesChanged || prevVersion !== version || hadTemplateSource || sandboxToolsMigrated;
1362
1388
 
1363
1389
  fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
1364
1390
 
@@ -12,16 +12,16 @@ After `create-pr`, continuously watch the PR's required CI checks: when everythi
12
12
  ## Behavior Boundaries / Key Rules
13
13
 
14
14
  - Only watch + self-heal the current PR's required checks; make no changes unrelated to the failing check.
15
- - Self-heal modifies code and `git push`es to the PR branch, but **local tests for the affected area must pass before pushing**; fix attempts have a hard cap (default 2); only self-heal locatable code-layer failures (lint / format / test / type / build), and always route non-code failures (network / permission / external service / flaky) to the help exit.
15
+ - Self-heal publishes through Git workflow intents, but **affected tests must pass first**; the attempt cap and code-layer authorization remain unchanged.
16
16
  - The help exit is "produce-then-stop": end this round, output the blocker explanation, and wait for the user to trigger the next step — **never** ask mid-flow.
17
- - Bare numbers / `#NN` / `TASK-id` arguments are always resolved as task short ids (see `.agents/rules/task-short-id.md`); a PR number is passed only via `--pr <number>` / a PR URL / omission (current branch), never reusing the bare-number syntax.
17
+ - Bare numbers / `NN` / `TASK-id` arguments are always resolved as task short ids (see `.agents/rules/task-short-id.md`); a PR number is passed only via `--pr <number>` / a PR URL / omission (current branch), never reusing the bare-number syntax.
18
18
  - After running this skill (task-anchored path), you must update task.md.
19
19
 
20
20
  Version stamp rule: before creating or updating `task.md` frontmatter, read `.agents/rules/version-stamp.md` and write or refresh `agent_infra_version`.
21
21
 
22
- ## Task Argument Short-ID Alias
22
+ ## Task Context Resolution
23
23
 
24
- > If the `{task-id}` argument matches `^[#]?[0-9]+$` (a bare number or `#`-prefixed), first read the "SKILL argument parsing" section of `.agents/rules/task-short-id.md` to resolve it; subsequent commands treat `{task-id}` as the resolved full `TASK-YYYYMMDD-HHMMSS` form.
24
+ > Keep `--pr <number>` and PR URLs on the existing PR-anchored path. Otherwise, the task path may omit the task ref and also accepts a legacy positional ref or `--task <ref>` / `-t <ref>`. Separate task scope from the full arguments, then call `agent-infra-internal task-context resolve {task-scope}` and bind `{task-id}` to the returned full `taskId`. A PR anchor and task scope are mutually exclusive.
25
25
 
26
26
  ## Step Start: Write the started Marker
27
27
 
@@ -39,22 +39,22 @@ After prerequisites pass and before this round's first artifact action, append a
39
39
 
40
40
  Resolve the target PR number `{pr#}` and an optional `{task-id}` via these deterministic branches:
41
41
 
42
- - Scenario A (argument omitted): use the current branch's PR number per `.agents/rules/pr-checks-commands.md`; then determine `{task-id}` via "Reverse-lookup task" below.
43
- - Scenario B (`#NN` / bare number / `TASK-id`, **task-anchored primary path**): when matching `^[#]?[0-9]+$`, resolve to the full `{task-id}` via "Task Argument Short-ID Alias" (on failure pass through the exit code; do not rewrite error handling); a `TASK-id` is used directly. Read `.agents/workspace/active/{task-id}/task.md` for `pr_number` as `{pr#}`; if `pr_number` is empty, follow "Error Handling" to prompt running `create-pr` first, then stop.
42
+ - Scenario A (argument omitted): reverse-lookup the active task from the current branch, then read its `pr_number`.
43
+ - Scenario B (omitted task ref, positional task ref, or `--task/-t`, **task-anchored primary path**): resolve the full `{task-id}` via "Task Context Resolution" and read `.agents/workspace/active/{task-id}/task.md` for `pr_number` as `{pr#}`; if `pr_number` is empty, follow "Error Handling" to prompt running `create-pr` first, then stop.
44
44
  - Scenario C (`--pr <number>` or a PR URL): use that PR number directly as `{pr#}`; then determine `{task-id}` via "Reverse-lookup task".
45
- - Reverse-lookup task (scenarios A / C): search `.agents/workspace/active/*/task.md` for a task whose `pr_number == {pr#}`; on a hit, take that `{task-id}` (task-anchored); on a miss, enter the "watch-only" degraded path (no `{task-id}`, skip steps 5/6).
45
+ - Reverse-lookup task (scenarios A / C): use task context/query capabilities to find the unique active task bound to `{pr#}`. If none exists, stop and request binding first; the typed checks intent does not create a second taskless state machine.
46
46
 
47
47
  ### 2. Watch Required Checks
48
48
 
49
49
  Before running this step, read `reference/monitor-and-heal.md` and `.agents/rules/pr-checks-commands.md`.
50
50
 
51
- Using the watch command in `.agents/rules/pr-checks-commands.md`, poll `{pr#}`'s required checks (with an overall time cap, default 30 minutes), and classify the outcome per the "Outcome Classification" of `reference/monitor-and-heal.md` into the "all green" / "failure" / "pending" scenarios, routing to step 7 (green exit), step 3 (self-heal), or step 4 (help exit) respectively.
51
+ Initialize the in-memory list `repairCommits=[]` for this run. Run `agent-infra-internal platform-checks watch {task-id} --interval-seconds 30 --deadline-seconds 1800`, then route its structured `checks.state` to the all-green, failure, or pending path.
52
52
 
53
53
  ### 3. Failure Self-Heal Loop
54
54
 
55
55
  Before running this step, read the "Self-Heal Decision Tree" of `reference/monitor-and-heal.md` and "Resolve a Failing Run id and Pull Logs" of `.agents/rules/pr-checks-commands.md`.
56
56
 
57
- For a failing check: first deterministically resolve its failing run and pull the failure logs per the rule, then classify the failure; before making any local fix, read `.agents/rules/debugging-guide.md` and locate the root cause via its four-phase flow, never blindly patching and retrying; only when it is a locatable code-layer failure, make a minimal local fix, run the relevant tests until they pass, then **stage, commit, and push the fix** (`git add` only the related files → `git commit` per `.agents/rules/commit-and-pr.md` → `git push` to the current PR branch, recording the commit SHA), and return to step 2 to re-watch. Count fix attempts; on reaching the hard cap (default 2) or when the run is unlocatable, go to step 4.
57
+ For a locatable code-layer failure, make the minimum fix and run relevant tests. Then call `git-workflow commit` and `git-workflow push`; append only a remotely verified SHA to `repairCommits`.
58
58
 
59
59
  ### 4. Help Exit (Produce-Then-Stop)
60
60
 
@@ -77,7 +77,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
77
77
  - **Do not change** `pr_status` (keep `created`) or `current_step`
78
78
  - **Append** to `## Activity Log` (do not overwrite prior entries; `{N}` = number of existing Watch PR entries for this task + 1):
79
79
  ```
80
- - {YYYY-MM-DD HH:mm:ss±HH:MM} — **Watch PR (Round {N})** by {agent} — {green: all required checks green / blocked: blocked: {summary}}
80
+ - {YYYY-MM-DD HH:mm:ss±HH:MM} — **Watch PR (Round {N})** by {agent} — {green: all required checks green, repair commits: {k} [{SHA summary}] / blocked: blocked: {summary}}
81
81
  ```
82
82
 
83
83
  ### 6. Verification Gate
@@ -87,7 +87,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
87
87
  Run the verification gate:
88
88
 
89
89
  ```bash
90
- node .agents/scripts/validate-artifact.js gate watch-pr .agents/workspace/active/{task-id} --format text
90
+ agent-infra-internal task-verify {task-id} watch-pr.completed --format text
91
91
  ```
92
92
 
93
93
  Handle the result:
@@ -101,10 +101,12 @@ Keep the gate output in your reply as the verification evidence. Without current
101
101
 
102
102
  > On the task-anchored path, execute this step only after the gate passes.
103
103
 
104
- > **IMPORTANT**: All TUI command formats listed below must be output in full. Do not show only the format for the current AI agent. If `.agents/.airc.json` configures custom TUIs (via `customTUIs`), read each tool's `name` and `invoke`, then add the matching command line in the same format (`${skillName}` becomes the skill name and `${projectName}` becomes the project name). Before rendering the final output, read `.agents/rules/next-step-output.md` and apply both of its rules: (1) render `{task-ref}` in the "Next steps" commands as the short id `#NN` (falling back to the full TASK-id when unallocated or released); (2) append the `Completed at` line as the very last line of the user-facing output (this applies to every user-facing output — success, error, and early-return paths alike, not only the success path).
104
+ > **IMPORTANT**: All TUI command formats listed below must be output in full. Do not show only the format for the current AI agent. If `.agents/.airc.json` configures custom TUIs (via `customTUIs`), read each tool's `name` and `invoke`, then add the matching command line in the same format (`${skillName}` becomes the skill name and `${projectName}` becomes the project name). Before rendering the final output, read `.agents/rules/next-step-output.md` and apply both of its rules: (1) render `{task-ref}` in the "Next steps" commands as the short id `NN` (falling back to the full TASK-id when unallocated or released); (2) append the `Completed at` line as the very last line of the user-facing output (this applies to every user-facing output — success, error, and early-return paths alike, not only the success path).
105
105
 
106
106
  Output per scenario:
107
- - "All green" + task-anchored: state that all required checks passed and the PR is ready to merge, then render the next step from the template below (`{task-ref}` becomes the short id):
107
+ - "All green" + task-anchored: state that all required checks passed, then render exactly one exit based on whether this run created repair commits (`{task-ref}` becomes the short id):
108
+
109
+ `repairCommits.length == 0`:
108
110
 
109
111
  ```
110
112
  Next step - Complete and archive the task:
@@ -113,7 +115,15 @@ Output per scenario:
113
115
  - Codex CLI: $complete-task {task-ref}
114
116
  ```
115
117
 
116
- - "All green" + watch-only: state the PR is ready to merge; there is no linked task this run, so run `complete-task` against the relevant task (do not force a short-id command block when no `{task-ref}` is available).
118
+ `repairCommits.length > 0`:
119
+
120
+ ```
121
+ Next step - Re-run code review:
122
+ - Claude Code / OpenCode: /review-code {task-ref}
123
+ - Gemini CLI: /{{project}}:review-code {task-ref}
124
+ - Codex CLI: $review-code {task-ref}
125
+ ```
126
+
117
127
  - "Blocked": output only the step 4 blocker explanation; do not recommend a next-step command.
118
128
 
119
129
  ## Completion Checklist