@fitlab-ai/agent-infra 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/README.md +24 -11
  2. package/README.zh-CN.md +24 -11
  3. package/bin/cli.ts +12 -0
  4. package/dist/bin/cli.js +14 -0
  5. package/dist/bin/internal-cli.js +30 -0
  6. package/dist/lib/agent-client.js +163 -0
  7. package/dist/lib/agent-clients/adapter.js +337 -0
  8. package/dist/lib/agent-clients/adapters/antigravity-cli.js +64 -0
  9. package/dist/lib/agent-clients/adapters/claude-code.js +71 -0
  10. package/dist/lib/agent-clients/adapters/codex-sandbox.js +210 -0
  11. package/dist/lib/agent-clients/adapters/codex.js +63 -0
  12. package/dist/lib/agent-clients/adapters/index.js +20 -0
  13. package/dist/lib/agent-clients/adapters/opencode.js +73 -0
  14. package/dist/lib/agent-clients/config.js +215 -0
  15. package/dist/lib/agent-clients/custom-tuis.js +99 -0
  16. package/dist/lib/agent-clients/invocation.js +9 -0
  17. package/dist/lib/agent-clients/next-steps.js +47 -0
  18. package/dist/lib/agent-clients/project-assets.js +45 -0
  19. package/dist/lib/agent-clients/reconcile.js +236 -0
  20. package/dist/lib/agent-clients/registry.js +78 -0
  21. package/dist/lib/agent-clients/schema.js +75 -0
  22. package/dist/lib/agent-clients/tokens.js +49 -0
  23. package/dist/lib/agent-clients/types.js +29 -0
  24. package/dist/lib/builtin-tuis.js +9 -14
  25. package/dist/lib/defaults.json +85 -73
  26. package/dist/lib/git/review-snapshot.js +25 -10
  27. package/dist/lib/git/reviewed-commit-equivalence.js +110 -0
  28. package/dist/lib/git/workflow.js +54 -1
  29. package/dist/lib/init.js +47 -91
  30. package/dist/lib/internal/agent-client.js +174 -0
  31. package/dist/lib/internal/git-workflow.js +7 -2
  32. package/dist/lib/internal/platform-checks.js +3 -3
  33. package/dist/lib/internal/platform-comment.js +29 -2
  34. package/dist/lib/internal/platform-issue.js +7 -0
  35. package/dist/lib/internal/platform-pr-review.js +132 -0
  36. package/dist/lib/internal/platform-pr.js +20 -2
  37. package/dist/lib/internal/platform-release-notes.js +52 -16
  38. package/dist/lib/internal/pr-review-grade.js +140 -0
  39. package/dist/lib/internal/release-workflow.js +82 -20
  40. package/dist/lib/internal/task-activity.js +73 -0
  41. package/dist/lib/internal/task-event.js +17 -1
  42. package/dist/lib/internal/task-lifecycle.js +7 -0
  43. package/dist/lib/internal/task-orchestration.js +196 -0
  44. package/dist/lib/internal/task-review.js +70 -0
  45. package/dist/lib/merge.js +2 -1
  46. package/dist/lib/platform/adapters.js +45 -1
  47. package/dist/lib/platform/change-request-git-evidence.js +113 -0
  48. package/dist/lib/platform/completion-backfill.js +122 -0
  49. package/dist/lib/platform/issue-comments.js +3 -2
  50. package/dist/lib/platform/merged-pr-equivalence.js +156 -16
  51. package/dist/lib/platform/pr-checks.js +101 -50
  52. package/dist/lib/platform/pr-review.js +166 -0
  53. package/dist/lib/platform/pull-requests.js +432 -7
  54. package/dist/lib/platform/release-notes.js +85 -3
  55. package/dist/lib/platform/releases.js +1 -1
  56. package/dist/lib/platform/verification-required.js +8 -10
  57. package/dist/lib/pr-review/evidence-grading.js +229 -0
  58. package/dist/lib/prompt.js +15 -3
  59. package/dist/lib/release/channels.js +4 -1
  60. package/dist/lib/release/workflow.js +4 -2
  61. package/dist/lib/remove-dir.js +25 -0
  62. package/dist/lib/run/tui.js +11 -7
  63. package/dist/lib/sandbox/agent-client-reconciler.js +234 -0
  64. package/dist/lib/sandbox/clipboard/linux.js +2 -1
  65. package/dist/lib/sandbox/commands/create.js +76 -200
  66. package/dist/lib/sandbox/commands/enter.js +17 -1
  67. package/dist/lib/sandbox/commands/prune.js +2 -2
  68. package/dist/lib/sandbox/commands/rm.js +3 -2
  69. package/dist/lib/sandbox/commands/show.js +1 -1
  70. package/dist/lib/sandbox/config.js +21 -4
  71. package/dist/lib/sandbox/constants.js +3 -0
  72. package/dist/lib/sandbox/dockerfile.js +2 -1
  73. package/dist/lib/sandbox/managed-fs.js +10 -5
  74. package/dist/lib/sandbox/recovery.js +52 -36
  75. package/dist/lib/sandbox/shell.js +1 -1
  76. package/dist/lib/sandbox/tool-types.js +8 -0
  77. package/dist/lib/sandbox/tools.js +2 -126
  78. package/dist/lib/task/activity-intent.js +101 -0
  79. package/dist/lib/task/artifact-lifecycle.js +3 -50
  80. package/dist/lib/task/commands/decisions.js +50 -20
  81. package/dist/lib/task/commands/log.js +15 -14
  82. package/dist/lib/task/delegation-receipts.js +128 -0
  83. package/dist/lib/task/events.js +146 -8
  84. package/dist/lib/task/finalization-artifacts.js +35 -0
  85. package/dist/lib/task/lifecycle-execution.js +46 -0
  86. package/dist/lib/task/orchestration.js +784 -0
  87. package/dist/lib/task/review-artifacts.js +143 -59
  88. package/dist/lib/task/review-finalization.js +186 -0
  89. package/dist/lib/task/review-fingerprint.js +4 -0
  90. package/dist/lib/task/task-execution-lock.js +231 -0
  91. package/dist/lib/task/verification-checks.js +2 -1
  92. package/dist/lib/task/verification-engine.js +372 -28
  93. package/dist/lib/task/verification-review.js +1 -1
  94. package/dist/lib/task/verification.js +5 -2
  95. package/dist/lib/task/workspace-snapshot.js +46 -0
  96. package/dist/lib/update.js +42 -161
  97. package/lib/agent-client.ts +214 -0
  98. package/lib/agent-clients/adapter.ts +534 -0
  99. package/lib/agent-clients/adapters/antigravity-cli.ts +65 -0
  100. package/lib/agent-clients/adapters/claude-code.ts +79 -0
  101. package/lib/agent-clients/adapters/codex-sandbox.ts +245 -0
  102. package/lib/agent-clients/adapters/codex.ts +67 -0
  103. package/lib/agent-clients/adapters/index.ts +27 -0
  104. package/lib/agent-clients/adapters/opencode.ts +75 -0
  105. package/lib/agent-clients/config.ts +323 -0
  106. package/lib/agent-clients/custom-tuis.ts +149 -0
  107. package/lib/agent-clients/invocation.ts +19 -0
  108. package/lib/agent-clients/next-steps.ts +85 -0
  109. package/lib/agent-clients/project-assets.ts +96 -0
  110. package/lib/agent-clients/reconcile.ts +325 -0
  111. package/lib/agent-clients/registry.ts +154 -0
  112. package/lib/agent-clients/schema.ts +80 -0
  113. package/lib/agent-clients/tokens.ts +53 -0
  114. package/lib/agent-clients/types.ts +92 -0
  115. package/lib/benchmark/schemas/v1.0.0/case-manifest.schema.json +120 -0
  116. package/lib/benchmark/schemas/v1.0.0/common.schema.json +109 -0
  117. package/lib/benchmark/schemas/v1.0.0/grader-result.schema.json +160 -0
  118. package/lib/benchmark/schemas/v1.0.0/run-manifest.schema.json +122 -0
  119. package/lib/benchmark/schemas/v1.0.0/subject.schema.json +227 -0
  120. package/lib/builtin-tuis.ts +16 -15
  121. package/lib/defaults.json +24 -12
  122. package/lib/git/review-snapshot.ts +39 -9
  123. package/lib/git/reviewed-commit-equivalence.ts +135 -0
  124. package/lib/git/workflow.ts +66 -2
  125. package/lib/init.ts +53 -121
  126. package/lib/internal/agent-client.ts +186 -0
  127. package/lib/internal/git-workflow.ts +6 -2
  128. package/lib/internal/platform-checks.ts +4 -4
  129. package/lib/internal/platform-comment.ts +17 -2
  130. package/lib/internal/platform-issue.ts +4 -0
  131. package/lib/internal/platform-pr-review.ts +104 -0
  132. package/lib/internal/platform-pr.ts +14 -1
  133. package/lib/internal/platform-release-notes.ts +59 -16
  134. package/lib/internal/pr-review-grade.ts +130 -0
  135. package/lib/internal/release-workflow.ts +79 -20
  136. package/lib/internal/task-activity.ts +55 -0
  137. package/lib/internal/task-event.ts +9 -1
  138. package/lib/internal/task-lifecycle.ts +4 -0
  139. package/lib/internal/task-orchestration.ts +171 -0
  140. package/lib/internal/task-review.ts +70 -0
  141. package/lib/merge.ts +2 -1
  142. package/lib/platform/adapters.ts +169 -3
  143. package/lib/platform/change-request-git-evidence.ts +159 -0
  144. package/lib/platform/completion-backfill.ts +134 -0
  145. package/lib/platform/issue-comments.ts +3 -2
  146. package/lib/platform/merged-pr-equivalence.ts +178 -19
  147. package/lib/platform/pr-checks.ts +121 -66
  148. package/lib/platform/pr-review.ts +201 -0
  149. package/lib/platform/pull-requests.ts +529 -27
  150. package/lib/platform/release-notes.ts +100 -4
  151. package/lib/platform/releases.ts +1 -1
  152. package/lib/platform/verification-required.ts +12 -10
  153. package/lib/pr-review/evidence-grading.ts +318 -0
  154. package/lib/prompt.ts +16 -3
  155. package/lib/release/channels.ts +4 -1
  156. package/lib/release/workflow.ts +4 -3
  157. package/lib/remove-dir.ts +28 -0
  158. package/lib/run/tui.ts +12 -5
  159. package/lib/sandbox/agent-client-reconciler.ts +378 -0
  160. package/lib/sandbox/clipboard/linux.ts +2 -1
  161. package/lib/sandbox/commands/create.ts +111 -212
  162. package/lib/sandbox/commands/enter.ts +23 -1
  163. package/lib/sandbox/commands/prune.ts +2 -2
  164. package/lib/sandbox/commands/rm.ts +3 -2
  165. package/lib/sandbox/commands/show.ts +1 -1
  166. package/lib/sandbox/config.ts +31 -4
  167. package/lib/sandbox/constants.ts +6 -0
  168. package/lib/sandbox/dockerfile.ts +2 -1
  169. package/lib/sandbox/managed-fs.ts +18 -5
  170. package/lib/sandbox/recovery.ts +98 -67
  171. package/lib/sandbox/shell.ts +1 -1
  172. package/lib/sandbox/tool-types.ts +143 -0
  173. package/lib/sandbox/tools.ts +5 -157
  174. package/lib/server/server.schema.json +2 -2
  175. package/lib/task/activity-intent.ts +128 -0
  176. package/lib/task/artifact-lifecycle.ts +3 -39
  177. package/lib/task/commands/decisions.ts +53 -20
  178. package/lib/task/commands/log.ts +15 -14
  179. package/lib/task/delegation-receipts.ts +199 -0
  180. package/lib/task/events.ts +164 -11
  181. package/lib/task/finalization-artifacts.ts +58 -0
  182. package/lib/task/lifecycle-execution.ts +106 -0
  183. package/lib/task/orchestration.ts +1022 -0
  184. package/lib/task/review-artifacts.ts +201 -69
  185. package/lib/task/review-finalization.ts +306 -0
  186. package/lib/task/review-fingerprint.ts +5 -0
  187. package/lib/task/task-execution-lock.ts +296 -0
  188. package/lib/task/verification-checks.ts +2 -1
  189. package/lib/task/verification-engine.ts +424 -28
  190. package/lib/task/verification-review.ts +1 -0
  191. package/lib/task/verification.ts +8 -3
  192. package/lib/task/workspace-snapshot.ts +57 -0
  193. package/lib/update.ts +48 -184
  194. package/package.json +4 -4
  195. package/templates/.agents/QUICKSTART.en.md +25 -8
  196. package/templates/.agents/QUICKSTART.zh-CN.md +25 -8
  197. package/templates/.agents/README.en.md +29 -25
  198. package/templates/.agents/README.zh-CN.md +29 -25
  199. package/templates/.agents/hooks/lifecycle-delegation.js +75 -0
  200. package/templates/.agents/rules/README.en.md +2 -0
  201. package/templates/.agents/rules/README.zh-CN.md +2 -0
  202. package/templates/.agents/rules/commit-and-pr.en.md +1 -0
  203. package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -0
  204. package/templates/.agents/rules/create-issue.github.en.md +4 -2
  205. package/templates/.agents/rules/create-issue.github.zh-CN.md +4 -2
  206. package/templates/.agents/rules/human-decision-context.en.md +14 -12
  207. package/templates/.agents/rules/human-decision-context.zh-CN.md +14 -12
  208. package/templates/.agents/rules/issue-fields.github.en.md +3 -1
  209. package/templates/.agents/rules/issue-fields.github.zh-CN.md +3 -1
  210. package/templates/.agents/rules/issue-pr-commands.en.md +5 -3
  211. package/templates/.agents/rules/issue-pr-commands.github.en.md +5 -3
  212. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +5 -3
  213. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +5 -3
  214. package/templates/.agents/rules/issue-sync.github.en.md +7 -3
  215. package/templates/.agents/rules/issue-sync.github.zh-CN.md +8 -4
  216. package/templates/.agents/rules/lifecycle-orchestration.en.md +24 -0
  217. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +24 -0
  218. package/templates/.agents/rules/milestone-inference.github.en.md +4 -2
  219. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +4 -2
  220. package/templates/.agents/rules/next-step-output.en.md +18 -0
  221. package/templates/.agents/rules/next-step-output.zh-CN.md +18 -0
  222. package/templates/.agents/rules/no-mid-flow-questions.en.md +19 -0
  223. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +19 -0
  224. package/templates/.agents/rules/pr-checks-commands.en.md +3 -3
  225. package/templates/.agents/rules/pr-checks-commands.github.en.md +2 -2
  226. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +2 -2
  227. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +3 -3
  228. package/templates/.agents/rules/pr-sync.en.md +3 -1
  229. package/templates/.agents/rules/pr-sync.github.en.md +11 -1
  230. package/templates/.agents/rules/pr-sync.github.zh-CN.md +11 -1
  231. package/templates/.agents/rules/pr-sync.zh-CN.md +3 -1
  232. package/templates/.agents/rules/release-commands.en.md +1 -1
  233. package/templates/.agents/rules/release-commands.github.en.md +21 -5
  234. package/templates/.agents/rules/release-commands.github.zh-CN.md +21 -5
  235. package/templates/.agents/rules/release-commands.zh-CN.md +1 -1
  236. package/templates/.agents/rules/review-handshake.en.md +4 -4
  237. package/templates/.agents/rules/review-handshake.zh-CN.md +4 -4
  238. package/templates/.agents/rules/review-method.en.md +113 -0
  239. package/templates/.agents/rules/review-method.zh-CN.md +98 -0
  240. package/templates/.agents/rules/task-management.en.md +11 -0
  241. package/templates/.agents/rules/task-management.zh-CN.md +11 -0
  242. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -12
  243. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +15 -12
  244. package/templates/.agents/skills/block-task/SKILL.en.md +11 -9
  245. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +11 -9
  246. package/templates/.agents/skills/cancel-task/SKILL.en.md +10 -8
  247. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +11 -9
  248. package/templates/.agents/skills/check-task/SKILL.en.md +16 -16
  249. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -16
  250. package/templates/.agents/skills/close-codescan/SKILL.en.md +7 -5
  251. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +7 -5
  252. package/templates/.agents/skills/close-dependabot/SKILL.en.md +7 -5
  253. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +7 -5
  254. package/templates/.agents/skills/code-task/SKILL.en.md +10 -7
  255. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +13 -10
  256. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +14 -16
  257. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +14 -16
  258. package/templates/.agents/skills/code-task/reference/output-template.en.md +3 -3
  259. package/templates/.agents/skills/code-task/reference/output-template.zh-CN.md +3 -3
  260. package/templates/.agents/skills/commit/SKILL.en.md +13 -1
  261. package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -1
  262. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -1
  263. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -1
  264. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
  265. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
  266. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +1 -1
  267. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +1 -1
  268. package/templates/.agents/skills/commit/reference/task-status-update.en.md +24 -28
  269. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +24 -28
  270. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +6 -4
  271. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +6 -4
  272. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +1 -1
  273. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +1 -1
  274. package/templates/.agents/skills/complete-task/SKILL.en.md +23 -8
  275. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +23 -8
  276. package/templates/.agents/skills/complete-task/config/verify.en.json +1 -0
  277. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +1 -0
  278. package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +17 -0
  279. package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +17 -0
  280. package/templates/.agents/skills/create-pr/SKILL.en.md +13 -11
  281. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +13 -11
  282. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +1 -1
  283. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +1 -1
  284. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +3 -3
  285. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +3 -3
  286. package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -16
  287. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +17 -16
  288. package/templates/.agents/skills/create-task/SKILL.en.md +16 -14
  289. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -14
  290. package/templates/.agents/skills/import-codescan/SKILL.en.md +5 -5
  291. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +5 -5
  292. package/templates/.agents/skills/import-dependabot/SKILL.en.md +5 -5
  293. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +5 -5
  294. package/templates/.agents/skills/import-issue/SKILL.en.md +10 -8
  295. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -8
  296. package/templates/.agents/skills/init-labels/SKILL.en.md +4 -4
  297. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +4 -4
  298. package/templates/.agents/skills/init-milestones/SKILL.en.md +4 -4
  299. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +4 -4
  300. package/templates/.agents/skills/plan-task/SKILL.en.md +13 -10
  301. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +13 -10
  302. package/templates/.agents/skills/post-release/SKILL.en.md +2 -0
  303. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +2 -0
  304. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  305. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  306. package/templates/.agents/skills/release/SKILL.en.md +16 -10
  307. package/templates/.agents/skills/release/SKILL.zh-CN.md +16 -10
  308. package/templates/.agents/skills/restore-task/SKILL.en.md +4 -1
  309. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +4 -1
  310. package/templates/.agents/skills/review-analysis/SKILL.en.md +18 -4
  311. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +19 -5
  312. package/templates/.agents/skills/review-analysis/config/verify.en.json +6 -0
  313. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +6 -0
  314. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +13 -15
  315. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +13 -15
  316. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +51 -5
  317. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +52 -6
  318. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +25 -22
  319. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +25 -22
  320. package/templates/.agents/skills/review-code/SKILL.en.md +35 -12
  321. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +35 -12
  322. package/templates/.agents/skills/review-code/config/verify.en.json +7 -0
  323. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +7 -0
  324. package/templates/.agents/skills/review-code/reference/concurrency-risks.en.md +25 -0
  325. package/templates/.agents/skills/review-code/reference/concurrency-risks.zh-CN.md +25 -0
  326. package/templates/.agents/skills/review-code/reference/cross-platform-risks.en.md +27 -0
  327. package/templates/.agents/skills/review-code/reference/cross-platform-risks.zh-CN.md +27 -0
  328. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.en.md +13 -0
  329. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.zh-CN.md +13 -0
  330. package/templates/.agents/skills/review-code/reference/migration-risks.en.md +25 -0
  331. package/templates/.agents/skills/review-code/reference/migration-risks.zh-CN.md +25 -0
  332. package/templates/.agents/skills/review-code/reference/output-templates.en.md +22 -24
  333. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +22 -24
  334. package/templates/.agents/skills/review-code/reference/report-template.en.md +54 -7
  335. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +54 -7
  336. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +29 -24
  337. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +29 -24
  338. package/templates/.agents/skills/review-code/reference/security-risks.en.md +25 -0
  339. package/templates/.agents/skills/review-code/reference/security-risks.zh-CN.md +25 -0
  340. package/templates/.agents/skills/review-plan/SKILL.en.md +18 -4
  341. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +19 -5
  342. package/templates/.agents/skills/review-plan/config/verify.en.json +6 -0
  343. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +6 -0
  344. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +13 -15
  345. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +13 -15
  346. package/templates/.agents/skills/review-plan/reference/report-template.en.md +61 -5
  347. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +61 -5
  348. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +21 -24
  349. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +21 -24
  350. package/templates/.agents/skills/review-pr/SKILL.en.md +158 -0
  351. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +158 -0
  352. package/templates/.agents/skills/review-pr/config/verify.en.json +37 -0
  353. package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +37 -0
  354. package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +65 -0
  355. package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +65 -0
  356. package/templates/.agents/skills/review-pr/reference/output-guidance.en.md +18 -0
  357. package/templates/.agents/skills/review-pr/reference/output-guidance.zh-CN.md +18 -0
  358. package/templates/.agents/skills/review-pr/reference/report-template.en.md +85 -0
  359. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +85 -0
  360. package/templates/.agents/skills/run-task/SKILL.en.md +22 -0
  361. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +22 -0
  362. package/templates/.agents/skills/run-task/config/verify.en.json +10 -0
  363. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +10 -0
  364. package/templates/.agents/skills/run-task/reference/host-validation.en.md +20 -0
  365. package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +20 -0
  366. package/templates/.agents/skills/test/SKILL.en.md +4 -4
  367. package/templates/.agents/skills/test/SKILL.zh-CN.md +4 -4
  368. package/templates/.agents/skills/test-integration/SKILL.en.md +4 -4
  369. package/templates/.agents/skills/test-integration/SKILL.zh-CN.md +4 -4
  370. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +5 -5
  371. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +5 -5
  372. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +664 -246
  373. package/templates/.agents/skills/upgrade-dependency/SKILL.en.md +4 -4
  374. package/templates/.agents/skills/upgrade-dependency/SKILL.zh-CN.md +4 -4
  375. package/templates/.agents/skills/watch-pr/SKILL.en.md +21 -21
  376. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +21 -21
  377. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +27 -6
  378. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +26 -5
  379. package/templates/.agents/templates/task.en.md +1 -1
  380. package/templates/.agents/templates/task.zh-CN.md +1 -1
  381. package/templates/.agents/workflows/bug-fix.en.yaml +3 -3
  382. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +3 -3
  383. package/templates/.agents/workflows/code-review.en.yaml +1 -1
  384. package/templates/.agents/workflows/code-review.zh-CN.yaml +1 -1
  385. package/templates/.agents/workflows/feature-development.en.yaml +4 -4
  386. package/templates/.agents/workflows/feature-development.zh-CN.yaml +4 -4
  387. package/templates/.agents/workflows/refactoring.en.yaml +3 -3
  388. package/templates/.agents/workflows/refactoring.zh-CN.yaml +3 -3
  389. package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +6 -0
  390. package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +6 -0
  391. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +6 -0
  392. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +6 -0
  393. package/templates/.claude/commands/post-release.en.md +1 -0
  394. package/templates/.claude/commands/post-release.zh-CN.md +1 -0
  395. package/templates/.claude/commands/review-pr.en.md +8 -0
  396. package/templates/.claude/commands/review-pr.zh-CN.md +8 -0
  397. package/templates/.claude/commands/run-task.en.md +8 -0
  398. package/templates/.claude/commands/run-task.zh-CN.md +8 -0
  399. package/templates/.claude/settings.json +24 -0
  400. package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +3 -0
  401. package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +3 -0
  402. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +3 -0
  403. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +3 -0
  404. package/templates/.gemini/commands/_project_/review-pr.en.toml +10 -0
  405. package/templates/.gemini/commands/_project_/review-pr.zh-CN.toml +10 -0
  406. package/templates/.opencode/commands/post-release.en.md +2 -0
  407. package/templates/.opencode/commands/post-release.zh-CN.md +2 -0
  408. package/templates/.opencode/commands/review-pr.en.md +11 -0
  409. package/templates/.opencode/commands/review-pr.zh-CN.md +11 -0
  410. package/templates/.opencode/commands/run-task.en.md +11 -0
  411. package/templates/.opencode/commands/run-task.zh-CN.md +11 -0
  412. package/templates/.gemini/commands/_project_/analyze-task.en.toml +0 -10
  413. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +0 -10
  414. package/templates/.gemini/commands/_project_/archive-tasks.en.toml +0 -10
  415. package/templates/.gemini/commands/_project_/archive-tasks.zh-CN.toml +0 -10
  416. package/templates/.gemini/commands/_project_/block-task.en.toml +0 -10
  417. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +0 -10
  418. package/templates/.gemini/commands/_project_/cancel-task.en.toml +0 -10
  419. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +0 -10
  420. package/templates/.gemini/commands/_project_/check-task.en.toml +0 -10
  421. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +0 -10
  422. package/templates/.gemini/commands/_project_/close-codescan.en.toml +0 -8
  423. package/templates/.gemini/commands/_project_/close-codescan.zh-CN.toml +0 -8
  424. package/templates/.gemini/commands/_project_/close-dependabot.en.toml +0 -8
  425. package/templates/.gemini/commands/_project_/close-dependabot.zh-CN.toml +0 -8
  426. package/templates/.gemini/commands/_project_/code-task.en.toml +0 -10
  427. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +0 -10
  428. package/templates/.gemini/commands/_project_/commit.en.toml +0 -10
  429. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +0 -10
  430. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +0 -10
  431. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +0 -10
  432. package/templates/.gemini/commands/_project_/complete-task.en.toml +0 -10
  433. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +0 -10
  434. package/templates/.gemini/commands/_project_/create-pr.en.toml +0 -10
  435. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +0 -10
  436. package/templates/.gemini/commands/_project_/create-release-note.en.toml +0 -8
  437. package/templates/.gemini/commands/_project_/create-release-note.zh-CN.toml +0 -8
  438. package/templates/.gemini/commands/_project_/create-task.en.toml +0 -8
  439. package/templates/.gemini/commands/_project_/create-task.zh-CN.toml +0 -8
  440. package/templates/.gemini/commands/_project_/import-codescan.en.toml +0 -8
  441. package/templates/.gemini/commands/_project_/import-codescan.zh-CN.toml +0 -8
  442. package/templates/.gemini/commands/_project_/import-dependabot.en.toml +0 -8
  443. package/templates/.gemini/commands/_project_/import-dependabot.zh-CN.toml +0 -8
  444. package/templates/.gemini/commands/_project_/import-issue.en.toml +0 -8
  445. package/templates/.gemini/commands/_project_/import-issue.zh-CN.toml +0 -8
  446. package/templates/.gemini/commands/_project_/init-labels.en.toml +0 -8
  447. package/templates/.gemini/commands/_project_/init-labels.zh-CN.toml +0 -8
  448. package/templates/.gemini/commands/_project_/init-milestones.en.toml +0 -10
  449. package/templates/.gemini/commands/_project_/init-milestones.zh-CN.toml +0 -10
  450. package/templates/.gemini/commands/_project_/plan-task.en.toml +0 -10
  451. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +0 -10
  452. package/templates/.gemini/commands/_project_/post-release.en.toml +0 -6
  453. package/templates/.gemini/commands/_project_/post-release.zh-CN.toml +0 -6
  454. package/templates/.gemini/commands/_project_/refine-title.en.toml +0 -8
  455. package/templates/.gemini/commands/_project_/refine-title.zh-CN.toml +0 -8
  456. package/templates/.gemini/commands/_project_/release.en.toml +0 -8
  457. package/templates/.gemini/commands/_project_/release.zh-CN.toml +0 -8
  458. package/templates/.gemini/commands/_project_/restore-task.en.toml +0 -8
  459. package/templates/.gemini/commands/_project_/restore-task.zh-CN.toml +0 -8
  460. package/templates/.gemini/commands/_project_/review-analysis.en.toml +0 -10
  461. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +0 -10
  462. package/templates/.gemini/commands/_project_/review-code.en.toml +0 -10
  463. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +0 -10
  464. package/templates/.gemini/commands/_project_/review-plan.en.toml +0 -10
  465. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +0 -10
  466. package/templates/.gemini/commands/_project_/test-integration.en.toml +0 -6
  467. package/templates/.gemini/commands/_project_/test-integration.zh-CN.toml +0 -6
  468. package/templates/.gemini/commands/_project_/test.en.toml +0 -6
  469. package/templates/.gemini/commands/_project_/test.zh-CN.toml +0 -6
  470. package/templates/.gemini/commands/_project_/update-agent-infra.en.toml +0 -6
  471. package/templates/.gemini/commands/_project_/update-agent-infra.zh-CN.toml +0 -6
  472. package/templates/.gemini/commands/_project_/upgrade-dependency.en.toml +0 -8
  473. package/templates/.gemini/commands/_project_/upgrade-dependency.zh-CN.toml +0 -8
  474. package/templates/.gemini/commands/_project_/watch-pr.en.toml +0 -10
  475. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +0 -10
  476. package/templates/.gemini/settings.json +0 -3
@@ -1,4 +1,5 @@
1
1
  import fs from 'node:fs';
2
+ import { classifyAgent } from '../../agent-clients/tokens.js';
2
3
  import { formatTable } from '../../table.js';
3
4
  import { parseTaskScope } from '../command-options.js';
4
5
  import { resolveTaskContext } from '../resolve-ref.js';
@@ -30,11 +31,11 @@ const TABLE_HEADERS = ['#', 'STEP', 'AGENT', 'STARTED', 'DONE', 'NOTE'];
30
31
  // with ` [started]`; the matching done entry carries the identical base action
31
32
  // without the suffix. Pairing therefore keys on the base action (including any
32
33
  // `(Round N)`), so every round and every repeated execution pairs on its own.
33
- // Short agent tokens that actually appear in activity logs for AI executors
34
- // (workflow recommended_agents claude/codex/gemini/cursor + enabled TUI opencode;
35
- // note these differ from the `.airc.json` long names claude-code/gemini-cli).
36
- // Any other executor token (a human name, possibly CJK) is treated as human.
37
- const KNOWN_AI_AGENTS = new Set(['claude', 'codex', 'gemini', 'opencode', 'cursor']);
34
+ // Known AI tokens, long-name mapping, and loose rendering classification live
35
+ // in lib/agent-clients/tokens.ts (single source of truth shared with the
36
+ // write-side internal commands). Any other executor token (a human name,
37
+ // possibly CJK, or an unknown value) is rendered as human with a visible
38
+ // `(unknown)` marker.
38
39
  const REVIEW_STAGE_PREFIXES = [
39
40
  { prefix: 'Review Analysis', stage: 'analysis' },
40
41
  { prefix: 'Review Plan', stage: 'plan' },
@@ -83,12 +84,11 @@ function humanValidationCount(note) {
83
84
  function isHumanCountField(field) {
84
85
  return fieldNumber(field, 'manual-validation') !== undefined || fieldNumber(field, 'human-decision') !== undefined;
85
86
  }
86
- // A step is human-executed when its agent token is not a known AI token. Take
87
- // the first whitespace-delimited token and drop any trailing parenthetical
88
- // annotation (e.g. `张三 (executed on host)` -> `张三`) before the lookup.
89
- function isHumanAgent(agent) {
90
- const token = agent.trim().split(/\s+/)[0]?.replace(/\(.*$/, '') ?? '';
91
- return token !== '' && !KNOWN_AI_AGENTS.has(token);
87
+ // A step is human-executed when its agent token is not a known AI token.
88
+ // Known long names (claude-code -> claude, gemini-cli -> gemini) classify as
89
+ // AI; empty or unknown tokens classify as non-AI (human).
90
+ export function isHumanAgent(agent) {
91
+ return classifyAgent(agent).status !== 'ai';
92
92
  }
93
93
  // Fold the two human counts into a review row's verdict NOTE: comma-joined, right
94
94
  // after the blockers/major/minor list and before the ` → artifact` link, mirroring
@@ -148,8 +148,9 @@ function log(args = []) {
148
148
  const note = stage
149
149
  ? foldHumanCounts(s.note, humanDecisionCounts.get(stage) ?? 0, humanValidationCount(s.note))
150
150
  : s.note;
151
- const human = isHumanAgent(s.agent);
152
- const agent = human ? 'human' : s.agent;
151
+ const { status, display } = classifyAgent(s.agent);
152
+ const human = status !== 'ai';
153
+ const agent = status === 'unknown' ? `${display} (unknown)` : display;
153
154
  const started = s.started || (human ? '-' : '');
154
155
  return [String(idx + 1), s.step, agent, started, s.done || (s.started ? '(in progress)' : ''), note];
155
156
  });
@@ -158,5 +159,5 @@ function log(args = []) {
158
159
  }
159
160
  process.stdout.write(`Total: ${steps.length} steps\n`);
160
161
  }
161
- export { log, isHumanAgent };
162
+ export { log };
162
163
  //# sourceMappingURL=log.js.map
@@ -0,0 +1,128 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ const MANAGED_AGENTS = {
3
+ 'agent-infra-lifecycle-executor': 'executor',
4
+ 'agent-infra-lifecycle-reviewer': 'reviewer'
5
+ };
6
+ function managedDelegationRole(nativeAgent) {
7
+ return MANAGED_AGENTS[nativeAgent] ?? null;
8
+ }
9
+ function fail(code, message) {
10
+ return { ok: false, code, message };
11
+ }
12
+ function prepareDelegation(input, options = {}) {
13
+ return Object.freeze({
14
+ ...input,
15
+ id: (options.id ?? randomUUID)(),
16
+ actualModel: null,
17
+ actualReasoningEffort: null,
18
+ modelFallbackReason: null,
19
+ reasoningEffortFallbackReason: null,
20
+ parentId: null,
21
+ childId: null,
22
+ spawnMode: null,
23
+ agent: null,
24
+ status: 'prepared',
25
+ afterFingerprint: null,
26
+ changedPaths: Object.freeze([]),
27
+ createdAt: (options.now ?? (() => new Date().toISOString()))(),
28
+ activatedAt: null,
29
+ sealedAt: null,
30
+ consumedAt: null
31
+ });
32
+ }
33
+ function activateDelegation(receipt, event, options = {}) {
34
+ const managedRole = managedDelegationRole(event.nativeAgent);
35
+ if (!managedRole)
36
+ return fail('DELEGATION_IGNORED', `subagent '${event.nativeAgent}' is not lifecycle-managed`);
37
+ if (receipt.status !== 'prepared')
38
+ return fail('DELEGATION_STATE_INVALID', `delegation ${receipt.id} is ${receipt.status}, expected prepared`);
39
+ if (managedRole !== receipt.role)
40
+ return fail('DELEGATION_ROLE_MISMATCH', `managed role ${managedRole} does not match ${receipt.role}`);
41
+ if (!event.parentId || (receipt.parentId !== null && event.parentId !== receipt.parentId) || !event.childId || event.childId === event.parentId) {
42
+ return fail('DELEGATION_IDENTITY_INVALID', 'native parent/child identity does not match the prepared delegation');
43
+ }
44
+ if (event.spawnMode !== 'fresh')
45
+ return fail('DELEGATION_FORK_FORBIDDEN', `spawn mode '${event.spawnMode}' is not fresh`);
46
+ const actualModel = event.actualModel;
47
+ if (!actualModel || actualModel.trim() !== actualModel) {
48
+ return fail('DELEGATION_MODEL_IDENTITY_MISSING', 'native start event must provide a non-empty actual model identity');
49
+ }
50
+ if (actualModel !== receipt.requestedModel && (!event.modelFallbackReason || event.modelFallbackReason.trim() === '')) {
51
+ return fail('DELEGATION_MODEL_FALLBACK_UNRECORDED', 'actual model differs from requested model without a fallback reason');
52
+ }
53
+ const actualReasoningEffort = event.actualReasoningEffort;
54
+ if (!actualReasoningEffort || actualReasoningEffort.trim() !== actualReasoningEffort) {
55
+ return fail('DELEGATION_REASONING_EFFORT_MISSING', 'native start event must provide a non-empty actual reasoning effort');
56
+ }
57
+ if (actualReasoningEffort !== receipt.requestedReasoningEffort
58
+ && (!event.reasoningEffortFallbackReason || event.reasoningEffortFallbackReason.trim() === '')) {
59
+ return fail('DELEGATION_REASONING_EFFORT_FALLBACK_UNRECORDED', 'actual reasoning effort differs from requested effort without a fallback reason');
60
+ }
61
+ if (actualModel === receipt.requestedModel && event.modelFallbackReason) {
62
+ return fail('DELEGATION_MODEL_FALLBACK_INVALID', 'model fallback reason is only valid when actual model differs');
63
+ }
64
+ if (actualReasoningEffort === receipt.requestedReasoningEffort && event.reasoningEffortFallbackReason) {
65
+ return fail('DELEGATION_REASONING_EFFORT_FALLBACK_INVALID', 'reasoning-effort fallback reason is only valid when actual effort differs');
66
+ }
67
+ return { ok: true, receipt: Object.freeze({
68
+ ...receipt,
69
+ status: 'activated',
70
+ parentId: event.parentId,
71
+ childId: event.childId,
72
+ spawnMode: event.spawnMode,
73
+ actualModel,
74
+ actualReasoningEffort,
75
+ modelFallbackReason: event.modelFallbackReason ?? null,
76
+ reasoningEffortFallbackReason: event.reasoningEffortFallbackReason ?? null,
77
+ activatedAt: (options.now ?? (() => new Date().toISOString()))()
78
+ }) };
79
+ }
80
+ function completeDelegationStage(receipt, event) {
81
+ if (receipt.status !== 'activated')
82
+ return fail('DELEGATION_STATE_INVALID', `delegation ${receipt.id} is ${receipt.status}, expected activated`);
83
+ if (event.stage !== receipt.stage || event.round !== receipt.round || event.artifact !== receipt.artifact) {
84
+ return fail('DELEGATION_STAGE_MISMATCH', 'stage completion identity does not match the active delegation');
85
+ }
86
+ const acceptedAgents = receipt.client === 'claude-code' ? ['claude', 'claude-code'] : [receipt.client];
87
+ if (!acceptedAgents.includes(event.agent)) {
88
+ return fail('DELEGATION_AGENT_MISMATCH', `stage agent '${event.agent}' does not match client '${receipt.client}'`);
89
+ }
90
+ return { ok: true, receipt: Object.freeze({ ...receipt, status: 'stage-completed', agent: event.agent }) };
91
+ }
92
+ function sealDelegation(receipt, event, options = {}) {
93
+ if (receipt.status !== 'stage-completed')
94
+ return fail('DELEGATION_STATE_INVALID', `delegation ${receipt.id} is ${receipt.status}, expected stage-completed`);
95
+ if (event.childId !== receipt.childId || event.exitCode !== 0)
96
+ return fail('DELEGATION_STOP_INVALID', 'native stop identity or exit status is invalid');
97
+ if (receipt.role === 'reviewer') {
98
+ const taskRoot = `.agents/workspace/active/${receipt.taskId}/`;
99
+ const allowed = new Set([
100
+ `${taskRoot}${receipt.artifact}`,
101
+ `${taskRoot}task.md`,
102
+ `${taskRoot}orchestration.json`
103
+ ]);
104
+ const disallowed = event.changedPaths.find((entry) => !allowed.has(entry));
105
+ if (disallowed)
106
+ return fail('DELEGATION_REVIEWER_WRITE_FORBIDDEN', `reviewer changed forbidden path '${disallowed}'`);
107
+ }
108
+ return { ok: true, receipt: Object.freeze({
109
+ ...receipt,
110
+ status: 'sealed',
111
+ afterFingerprint: event.afterFingerprint,
112
+ changedPaths: Object.freeze([...event.changedPaths]),
113
+ sealedAt: (options.now ?? (() => new Date().toISOString()))()
114
+ }) };
115
+ }
116
+ function consumeDelegation(receipt, options = {}) {
117
+ if (receipt.status === 'consumed')
118
+ return fail('DELEGATION_REPLAY', `delegation ${receipt.id} was already consumed`);
119
+ if (receipt.status !== 'sealed')
120
+ return fail('DELEGATION_STATE_INVALID', `delegation ${receipt.id} is ${receipt.status}, expected sealed`);
121
+ return { ok: true, receipt: Object.freeze({
122
+ ...receipt,
123
+ status: 'consumed',
124
+ consumedAt: (options.now ?? (() => new Date().toISOString()))()
125
+ }) };
126
+ }
127
+ export { activateDelegation, completeDelegationStage, consumeDelegation, managedDelegationRole, prepareDelegation, sealDelegation };
128
+ //# sourceMappingURL=delegation-receipts.js.map
@@ -3,8 +3,13 @@ import { appendActivityEntry, locateActivityLog, pairEntries } from './activity-
3
3
  import { buildArtifactLinkSection, artifactName, parseArtifactName, resolveArtifactContext, validateCompletedArtifact } from './artifact-lifecycle.js';
4
4
  import { parseTypedTaskFrontmatter } from './frontmatter.js';
5
5
  import { consumeImplementationInput, IMPLEMENTATION_INPUT_ALIASES, parseImplementationInputs, renderImplementationInputs } from './implementation-inputs.js';
6
+ import { parseLedger, summarizeLedgerStage, validateLedgerRows } from './ledger.js';
7
+ import { parseReviewSummary } from './review-artifacts.js';
6
8
  import { resolveTaskRef } from './resolve-ref.js';
7
9
  import { findSectionHeading } from './sections.js';
10
+ import { validateLifecycleExecution } from './lifecycle-execution.js';
11
+ import { commitOrchestrationStageCompletion } from './orchestration.js';
12
+ import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-lock.js';
8
13
  import { captureTaskWriteMetadata, writeTask } from './write.js';
9
14
  const eventCatalog = [
10
15
  'analyze.started', 'analyze.awaiting-input', 'analyze.completed',
@@ -19,17 +24,17 @@ const BASE_FIELDS = new Set(['taskRef', 'event', 'agent', 'dryRun']);
19
24
  const SCHEMAS = {
20
25
  'analyze.started': { optional: ['round'] },
21
26
  'analyze.awaiting-input': { required: ['question'] },
22
- 'analyze.completed': { required: ['artifact'], optional: ['round'] },
27
+ 'analyze.completed': { required: ['artifact'], optional: ['round', 'orchestrated'] },
23
28
  'review-analysis.started': { optional: ['round'] },
24
- 'review-analysis.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round'] },
29
+ 'review-analysis.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round', 'orchestrated'] },
25
30
  'plan.started': { optional: ['round'] },
26
- 'plan.completed': { required: ['artifact'], optional: ['round'] },
31
+ 'plan.completed': { required: ['artifact'], optional: ['round', 'orchestrated'] },
27
32
  'review-plan.started': { optional: ['round'] },
28
- 'review-plan.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round'] },
33
+ 'review-plan.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round', 'orchestrated'] },
29
34
  'code.started': { optional: ['round', 'fixFor', 'implementationInput'] },
30
- 'code.completed': { required: ['artifact'], optional: ['round', 'fixFor', 'implementationInput', 'filesModified', 'testsPassed', 'blockers', 'major', 'minor', 'manualValidation'] },
35
+ 'code.completed': { required: ['artifact'], optional: ['round', 'fixFor', 'implementationInput', 'filesModified', 'testsPassed', 'blockers', 'major', 'minor', 'manualValidation', 'orchestrated'] },
31
36
  'review-code.started': { optional: ['round'] },
32
- 'review-code.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round'] },
37
+ 'review-code.completed': { required: ['artifact', 'verdict', 'blockers', 'major', 'minor', 'manualValidation'], optional: ['round', 'orchestrated'] },
33
38
  'manual-validation.started': { optional: ['round'] },
34
39
  'manual-validation.completed': { required: ['artifact', 'summaryResult'], optional: ['round'] }
35
40
  };
@@ -75,12 +80,75 @@ function validateTaskEventRequest(request) {
75
80
  const FAMILY = {
76
81
  analyze: { artifact: 'analysis', started: ['requirement-analysis', 'requirement-analysis-review', 'code'], completed: ['requirement-analysis', 'requirement-analysis-review', 'code'], target: 'requirement-analysis', label: 'Analyze Task' },
77
82
  'review-analysis': { artifact: 'review-analysis', started: ['requirement-analysis', 'requirement-analysis-review'], completed: ['requirement-analysis', 'requirement-analysis-review'], target: 'requirement-analysis-review', label: 'Review Analysis' },
78
- plan: { artifact: 'plan', started: ['requirement-analysis-review', 'technical-design-review'], completed: ['requirement-analysis-review', 'technical-design-review'], target: 'technical-design', label: 'Plan Task' },
83
+ plan: { artifact: 'plan', started: ['requirement-analysis-review', 'technical-design-review', 'commit'], completed: ['requirement-analysis-review', 'technical-design-review', 'commit'], target: 'technical-design', label: 'Plan Task' },
79
84
  'review-plan': { artifact: 'review-plan', started: ['technical-design', 'technical-design-review'], completed: ['technical-design', 'technical-design-review'], target: 'technical-design-review', label: 'Review Plan' },
80
85
  code: { artifact: 'code', started: ['technical-design-review', 'code-review'], completed: ['technical-design-review', 'code-review'], target: 'code', label: 'Code Task' },
81
86
  'review-code': { artifact: 'review-code', started: ['code', 'code-review', 'commit'], completed: ['code', 'code-review', 'commit'], target: 'code-review', label: 'Review Code' },
82
87
  'manual-validation': { artifact: 'manual-validation', started: ['code-review', 'commit'], completed: ['code-review', 'commit'], target: null, label: 'Complete Manual Validation' }
83
88
  };
89
+ const REVIEW_LEDGER_STAGES = {
90
+ 'review-analysis': 'analysis',
91
+ 'review-plan': 'plan',
92
+ 'review-code': 'code'
93
+ };
94
+ function validateReviewFindingCounts(request, content, family, artifactPath) {
95
+ const stage = REVIEW_LEDGER_STAGES[family];
96
+ if (!stage || !artifactPath)
97
+ return null;
98
+ const rows = parseLedger(content);
99
+ const invalid = validateLedgerRows(rows);
100
+ if (invalid)
101
+ return { code: 'TASK_DOCUMENT_INVALID', message: `${invalid.code}: ${invalid.message}` };
102
+ const expected = summarizeLedgerStage(rows, stage).unresolvedFindingCounts;
103
+ const payload = {
104
+ blocker: request.blockers,
105
+ major: request.major,
106
+ minor: request.minor
107
+ };
108
+ let reportContent;
109
+ try {
110
+ reportContent = fs.readFileSync(artifactPath, 'utf8');
111
+ }
112
+ catch (error) {
113
+ return { code: 'EVENT_FINDING_COUNT_MISMATCH', message: String(error) };
114
+ }
115
+ const parsed = parseReviewSummary(reportContent);
116
+ if (!parsed.ok || !parsed.summary.counts) {
117
+ return {
118
+ code: 'EVENT_FINDING_COUNT_MISMATCH',
119
+ message: parsed.ok ? 'review summary finding counts are not finalized' : parsed.message
120
+ };
121
+ }
122
+ const report = parsed.summary.counts;
123
+ const reportVerdict = parsed.summary.verdict === 'Approved'
124
+ ? 'approved'
125
+ : parsed.summary.verdict === 'Changes Requested' ? 'changes-requested' : 'rejected';
126
+ const fields = [
127
+ ['blocker', 'blockers'],
128
+ ['major', 'major'],
129
+ ['minor', 'minor']
130
+ ];
131
+ const differences = fields.flatMap(([severity, cliField]) => {
132
+ const values = [
133
+ expected[severity] === payload[severity]
134
+ ? null
135
+ : `${cliField} ledger ${expected[severity]}, payload ${payload[severity]}`,
136
+ expected[severity] === report[severity]
137
+ ? null
138
+ : `${cliField} ledger ${expected[severity]}, report ${report[severity]}`
139
+ ];
140
+ return values.filter((value) => value !== null);
141
+ });
142
+ if (request.verdict !== reportVerdict) {
143
+ differences.push(`verdict report ${reportVerdict}, payload ${request.verdict}`);
144
+ }
145
+ if (differences.length === 0)
146
+ return null;
147
+ return {
148
+ code: 'EVENT_FINDING_COUNT_MISMATCH',
149
+ message: `review summary, payload, and ${stage} ledger do not match: ${differences.join('; ')}`
150
+ };
151
+ }
84
152
  function eventParts(event) {
85
153
  const [family, suffix] = event.split('.');
86
154
  return { family, phase: suffix === 'started' ? 'started' : suffix === 'awaiting-input' ? 'waiting' : 'completed' };
@@ -163,7 +231,7 @@ function openStartedIdentity(rows, family) {
163
231
  });
164
232
  return matches.length === 1 ? matches[0] : matches.length > 1 ? { conflict: true } : null;
165
233
  }
166
- function applyTaskEvent(request, options = {}) {
234
+ function applyTaskEventUnlocked(request, options = {}) {
167
235
  const invalid = validateTaskEventRequest(request);
168
236
  if (invalid)
169
237
  return failed(request, invalid);
@@ -257,6 +325,31 @@ function applyTaskEvent(request, options = {}) {
257
325
  const allowed = FAMILY[eventIdentity.family][eventIdentity.phase === 'started' ? 'started' : 'completed'];
258
326
  if (!allowed.includes(currentStep))
259
327
  return failed(normalized, { code: 'EVENT_TRANSITION_INVALID', message: `${normalized.event} is not allowed from '${currentStep}'` }, { taskId: resolved.taskId, taskMdPath: resolved.taskMdPath, fromStep: currentStep, toStep: currentStep, action: eventIdentity.action, phase: eventIdentity.phase });
328
+ const findingCountError = validateReviewFindingCounts(normalized, content, eventIdentity.family, completedArtifact?.path ?? null);
329
+ if (findingCountError)
330
+ return failed(normalized, findingCountError, { taskId: resolved.taskId, taskMdPath: resolved.taskMdPath, fromStep: currentStep, toStep: currentStep, action: eventIdentity.action, phase: eventIdentity.phase });
331
+ let orchestrationCompletion = null;
332
+ if (eventIdentity.phase === 'completed' && eventIdentity.family !== 'manual-validation') {
333
+ const orchestrationStage = eventIdentity.family === 'analyze' ? 'analysis' : eventIdentity.family;
334
+ const execution = validateLifecycleExecution(normalized.taskRef, {
335
+ mode: normalized.orchestrated ? 'orchestrated' : 'standalone',
336
+ identity: {
337
+ stage: orchestrationStage,
338
+ round: normalized.round,
339
+ artifact: normalized.artifact,
340
+ role: eventIdentity.family.startsWith('review-') ? 'reviewer' : 'executor'
341
+ },
342
+ agent: normalized.agent,
343
+ dryRun: normalized.dryRun
344
+ }, { repoRoot: options.repoRoot });
345
+ if (!execution.ok) {
346
+ return failed(normalized, {
347
+ code: 'EVENT_TRANSITION_INVALID',
348
+ message: `${execution.error?.code ?? 'ORCHESTRATION_PROVENANCE_MISMATCH'}: ${execution.error?.message ?? 'orchestration provenance validation failed'}`
349
+ }, { taskId: resolved.taskId, taskMdPath: resolved.taskMdPath, fromStep: currentStep, toStep: currentStep, action: eventIdentity.action, phase: eventIdentity.phase, artifactContext });
350
+ }
351
+ orchestrationCompletion = execution.completionPlan;
352
+ }
260
353
  let metadata;
261
354
  try {
262
355
  metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
@@ -295,6 +388,28 @@ function applyTaskEvent(request, options = {}) {
295
388
  const result = writeTask({ taskRef: normalized.taskRef, expectedState: 'active', dryRun: normalized.dryRun, mutations }, { ...options, metadataProvider: () => metadata });
296
389
  if (result.status === 'failed')
297
390
  return failed(normalized, result.error, { taskId: result.taskId, taskMdPath: result.taskMdPath, fromStep: currentStep, toStep: step, action: eventIdentity.action, phase: eventIdentity.phase, timestamp: result.timestamp, agentInfraVersion: result.agentInfraVersion, operations: result.operations, artifactContext });
391
+ if (!normalized.dryRun && orchestrationCompletion) {
392
+ try {
393
+ (options.commitOrchestrationCompletion ?? commitOrchestrationStageCompletion)(orchestrationCompletion);
394
+ }
395
+ catch (error) {
396
+ return failed(normalized, {
397
+ code: 'EVENT_ORCHESTRATION_COMMIT_FAILED',
398
+ message: `task.md was written but orchestration completion could not be persisted; manual recovery is required: ${error instanceof Error ? error.message : String(error)}`
399
+ }, {
400
+ taskId: result.taskId,
401
+ taskMdPath: result.taskMdPath,
402
+ fromStep: currentStep,
403
+ toStep: step,
404
+ action: eventIdentity.action,
405
+ phase: eventIdentity.phase,
406
+ timestamp: result.timestamp,
407
+ agentInfraVersion: result.agentInfraVersion,
408
+ operations: result.operations,
409
+ artifactContext
410
+ });
411
+ }
412
+ }
298
413
  return {
299
414
  status: result.status, changed: result.changed, event: normalized.event,
300
415
  requestRef: normalized.taskRef, taskId: result.taskId, taskMdPath: result.taskMdPath,
@@ -305,6 +420,29 @@ function applyTaskEvent(request, options = {}) {
305
420
  agentInfraVersion: result.agentInfraVersion, operations: result.operations, error: null
306
421
  };
307
422
  }
423
+ function applyTaskEvent(request, options = {}) {
424
+ const invalid = validateTaskEventRequest(request);
425
+ if (invalid)
426
+ return failed(request, invalid);
427
+ const parts = eventParts(request.event);
428
+ if (request.dryRun || parts.phase !== 'completed' || parts.family === 'manual-validation') {
429
+ return applyTaskEventUnlocked(request, options);
430
+ }
431
+ const resolved = resolveTaskRef(request.taskRef, { repoRoot: options.repoRoot });
432
+ if (!resolved.ok)
433
+ return applyTaskEventUnlocked(request, options);
434
+ try {
435
+ return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-event.${request.event}`, () => applyTaskEventUnlocked(request, options));
436
+ }
437
+ catch (error) {
438
+ if (!(error instanceof TaskExecutionLockError))
439
+ throw error;
440
+ return failed(request, {
441
+ code: 'EVENT_TRANSITION_INVALID',
442
+ message: `${error.code}: ${error.message}`
443
+ }, { taskId: resolved.taskId, taskMdPath: resolved.taskMdPath });
444
+ }
445
+ }
308
446
  function successNoOp(request, taskId, taskMdPath, currentStep, eventIdentity, timestamp, frontmatter, artifactContext) {
309
447
  return {
310
448
  ...failed(request, { code: 'EVENT_LOG_CONFLICT', message: '' }), status: 'no-op', error: null,
@@ -0,0 +1,35 @@
1
+ import { assertWritableInventory, inspectTaskArtifacts } from './artifact-lifecycle.js';
2
+ const COMPLETION_BACKFILL_FAMILIES = [
3
+ 'analysis',
4
+ 'review-analysis',
5
+ 'plan',
6
+ 'review-plan',
7
+ 'code',
8
+ 'review-code',
9
+ 'manual-validation'
10
+ ];
11
+ function inspectCompletionArtifacts(taskRef, options = {}) {
12
+ const artifacts = [];
13
+ let taskId = null;
14
+ let taskDir = null;
15
+ for (const family of COMPLETION_BACKFILL_FAMILIES) {
16
+ const inventory = inspectTaskArtifacts(taskRef, family, options);
17
+ taskId = inventory.taskId ?? taskId;
18
+ taskDir = inventory.taskDir ?? taskDir;
19
+ if (inventory.status === 'failed') {
20
+ return { status: 'failed', changed: false, taskId, taskDir, artifacts: [], error: inventory.error };
21
+ }
22
+ const writableError = assertWritableInventory(inventory);
23
+ const brokenReference = inventory.diagnostics.find((item) => item.code === 'BROKEN_REFERENCE');
24
+ const error = writableError ?? (brokenReference ? {
25
+ code: 'ARTIFACT_REFERENCE_INVALID',
26
+ message: brokenReference.message
27
+ } : null);
28
+ if (error)
29
+ return { status: 'failed', changed: false, taskId, taskDir, artifacts: [], error };
30
+ artifacts.push(...inventory.artifacts);
31
+ }
32
+ return { status: 'ready', changed: false, taskId, taskDir, artifacts, error: null };
33
+ }
34
+ export { COMPLETION_BACKFILL_FAMILIES, inspectCompletionArtifacts };
35
+ //# sourceMappingURL=finalization-artifacts.js.map
@@ -0,0 +1,46 @@
1
+ import { inspectOrchestrationStage, pauseOrchestration, planOrchestrationStageCompletion, readRun } from './orchestration.js';
2
+ import { resolveTaskRef } from './resolve-ref.js';
3
+ function failure(mode, code, message) {
4
+ return { ok: false, mode, completionPlan: null, error: { code, message } };
5
+ }
6
+ function inspectLifecycleExecution(taskRef, request, options = {}) {
7
+ const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
8
+ if (!resolved.ok)
9
+ return failure(request.mode, resolved.code, resolved.message);
10
+ if (request.mode === 'standalone') {
11
+ try {
12
+ const run = readRun(resolved.taskDir);
13
+ if (run?.pendingDelegation) {
14
+ return failure(request.mode, 'ORCHESTRATION_STANDALONE_BUSY', 'standalone lifecycle execution is blocked by a pending orchestration delegation');
15
+ }
16
+ return { ok: true, mode: request.mode, completionPlan: null, error: null };
17
+ }
18
+ catch (error) {
19
+ return failure(request.mode, 'ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error));
20
+ }
21
+ }
22
+ if (request.agent) {
23
+ const planned = planOrchestrationStageCompletion(taskRef, {
24
+ ...request.identity,
25
+ agent: request.agent
26
+ }, options);
27
+ if (planned.plan) {
28
+ return { ok: true, mode: request.mode, completionPlan: planned.plan, error: null };
29
+ }
30
+ return failure(request.mode, planned.result.error?.code ?? 'ORCHESTRATION_PROVENANCE_MISMATCH', planned.result.error?.message ?? 'orchestration provenance validation failed');
31
+ }
32
+ const inspected = inspectOrchestrationStage(taskRef, request.identity, options);
33
+ if (inspected.status !== 'failed') {
34
+ return { ok: true, mode: request.mode, completionPlan: null, error: null };
35
+ }
36
+ return failure(request.mode, inspected.error?.code ?? 'ORCHESTRATION_PROVENANCE_MISMATCH', inspected.error?.message ?? 'orchestration provenance validation failed');
37
+ }
38
+ function validateLifecycleExecution(taskRef, request, options = {}) {
39
+ const inspected = inspectLifecycleExecution(taskRef, request, options);
40
+ if (inspected.ok || request.mode === 'standalone' || request.dryRun)
41
+ return inspected;
42
+ const paused = pauseOrchestration(taskRef, inspected.error?.code ?? 'ORCHESTRATION_PROVENANCE_MISMATCH', inspected.error?.message ?? 'orchestration provenance validation failed', true, options);
43
+ return failure(request.mode, paused.run?.pause?.code ?? inspected.error?.code ?? 'ORCHESTRATION_PROVENANCE_MISMATCH', paused.run?.pause?.message ?? inspected.error?.message ?? 'orchestration provenance validation failed');
44
+ }
45
+ export { inspectLifecycleExecution, validateLifecycleExecution };
46
+ //# sourceMappingURL=lifecycle-execution.js.map