@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,10 +1,10 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { execFileSync } from "node:child_process";
4
+ import { hasPlatformCapability } from "./adapters.js";
4
5
  import { inspectRequiredChecks } from "./pr-checks.js";
5
6
  import { resolvePlatformContext } from "./context.js";
6
7
  import { resolveReviewedHeadRelation } from "./merged-pr-equivalence.js";
7
- import { loadPostReviewConfig, resolvePostReviewGlobs } from "../task/review-fingerprint.js";
8
8
  const CHECK_TYPE = "required-checks";
9
9
  const SHA_PATTERN = /^[0-9a-f]{7,40}$/i;
10
10
  function validPrNumber(value) {
@@ -50,10 +50,9 @@ export function evaluateRequiredChecks(context, shared) {
50
50
  const relation = context.relation || (context.gitRoot && inspection.pullRequest?.head
51
51
  ? resolveReviewedHeadRelation({
52
52
  gitRoot: context.gitRoot,
53
- localHead,
53
+ comparisonHead: localHead,
54
54
  lastReviewedCommit: reviewedHead,
55
- pullRequest: inspection.pullRequest,
56
- pathspecs: context.pathspecs || [":/"]
55
+ pullRequest: inspection.pullRequest
57
56
  })
58
57
  : localHead === reviewedHead && localHead === prHead
59
58
  ? { status: "strict" }
@@ -78,14 +77,14 @@ export function check({ taskDir }, shared) {
78
77
  const task = shared.loadTask(taskDir);
79
78
  if (!task.ok)
80
79
  return shared.failResult(CHECK_TYPE, task.message);
81
- const platform = resolvePlatformContext({ cwd: shared.repoRoot });
82
- if (platform.platform.type !== "github") {
83
- return shared.passResult(CHECK_TYPE, "Skipped: this code platform does not provide required checks");
84
- }
85
80
  const prFlow = readPrFlow(shared.repoRoot);
86
81
  if (prFlow === "disabled" || task.metadata.pr_status === "skipped" || !validPrNumber(task.metadata.pr_number)) {
87
82
  return evaluateRequiredChecks({ metadata: task.metadata, localHead: null, inspection: null, prFlow }, shared);
88
83
  }
84
+ const platform = resolvePlatformContext({ cwd: shared.repoRoot });
85
+ if (!hasPlatformCapability(platform.platform.type, "required-checks")) {
86
+ return shared.blockedResult(CHECK_TYPE, `Platform '${platform.platform.type || "none"}' does not provide required-checks inspection`, "dependency_error");
87
+ }
89
88
  const localHead = readHead(shared.repoRoot);
90
89
  if (!localHead)
91
90
  return evaluateRequiredChecks({ metadata: task.metadata, localHead, inspection: null, prFlow }, shared);
@@ -95,8 +94,7 @@ export function check({ taskDir }, shared) {
95
94
  localHead,
96
95
  inspection,
97
96
  prFlow,
98
- gitRoot: shared.repoRoot,
99
- pathspecs: resolvePostReviewGlobs({}, loadPostReviewConfig(shared.repoRoot))
97
+ gitRoot: shared.repoRoot
100
98
  }, shared);
101
99
  }
102
100
  //# sourceMappingURL=verification-required.js.map
@@ -0,0 +1,229 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseTaskFrontmatter } from '../task/frontmatter.js';
4
+ export class HostResolutionError extends Error {
5
+ code;
6
+ constructor(code, message) {
7
+ super(message);
8
+ this.name = 'HostResolutionError';
9
+ this.code = code;
10
+ }
11
+ }
12
+ function toPositiveNumber(value) {
13
+ const n = Number(value);
14
+ return Number.isInteger(n) && n > 0 ? n : null;
15
+ }
16
+ /**
17
+ * Parse the PR body for closing-issue references. Handles the conventional
18
+ * `Closes #1` / `Fixes: #2, #3` shapes (case-insensitive, comma/space
19
+ * separated, optional keyword list on the same logical line).
20
+ */
21
+ export function extractClosingIssueNumbers(body) {
22
+ const result = [];
23
+ const seen = new Set();
24
+ const linePattern = /(?:^|\n)[^\n]*\b(?:close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\b[^\n]*/gi;
25
+ let lineMatch;
26
+ while ((lineMatch = linePattern.exec(body)) !== null) {
27
+ const line = lineMatch[0];
28
+ for (const numMatch of line.matchAll(/#(\d+)/g)) {
29
+ const n = Number(numMatch[1]);
30
+ if (Number.isInteger(n) && n > 0 && !seen.has(n)) {
31
+ seen.add(n);
32
+ result.push(n);
33
+ }
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ /**
39
+ * Scan `.agents/workspace/active/{task-id}/task.md` files for tasks bound to the
40
+ * PR number or to one of the PR's closing issues. A task is emitted at most once;
41
+ * a direct `pr_number` hit takes priority over the issue-number reverse lookup.
42
+ */
43
+ export function collectHostCandidates(input) {
44
+ const activeRoot = path.join(input.workspaceRoot, '.agents', 'workspace', 'active');
45
+ const candidates = [];
46
+ let entries;
47
+ try {
48
+ entries = fs.readdirSync(activeRoot, { withFileTypes: true });
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ for (const entry of entries) {
54
+ if (!entry.isDirectory())
55
+ continue;
56
+ const taskDir = path.join(activeRoot, entry.name);
57
+ const taskMdPath = path.join(taskDir, 'task.md');
58
+ let content;
59
+ try {
60
+ content = fs.readFileSync(taskMdPath, 'utf8');
61
+ }
62
+ catch {
63
+ continue;
64
+ }
65
+ const frontmatter = parseTaskFrontmatter(content);
66
+ const issueNumber = toPositiveNumber(frontmatter.issue_number);
67
+ const prNumber = toPositiveNumber(frontmatter.pr_number);
68
+ if (prNumber === input.prNumber) {
69
+ candidates.push({ taskId: entry.name, taskDir, issueNumber, prNumber });
70
+ }
71
+ else if (issueNumber !== null && input.closingIssues.includes(issueNumber)) {
72
+ candidates.push({ taskId: entry.name, taskDir, issueNumber, prNumber });
73
+ }
74
+ }
75
+ return candidates;
76
+ }
77
+ /**
78
+ * Collapse a candidate list into a typed HostResolution. Zero candidates ->
79
+ * none; exactly one -> unique; more than one (no stable selection rule) ->
80
+ * ambiguous (fail closed, AN-6).
81
+ */
82
+ export function resolveHostFromCandidates(candidates) {
83
+ if (candidates.length === 0)
84
+ return { kind: 'none' };
85
+ if (candidates.length === 1) {
86
+ const candidate = candidates[0];
87
+ return {
88
+ kind: 'unique',
89
+ taskId: candidate.taskId,
90
+ taskDir: candidate.taskDir,
91
+ issueNumber: candidate.issueNumber ?? 0,
92
+ prNumber: candidate.prNumber ?? 0
93
+ };
94
+ }
95
+ return {
96
+ kind: 'ambiguous',
97
+ candidates: candidates.map((candidate) => ({ taskId: candidate.taskId, issueNumber: candidate.issueNumber ?? 0 }))
98
+ };
99
+ }
100
+ function hasNoLifecycleArtifacts(presence) {
101
+ return !presence.hasAnalysis && !presence.hasPlan && !presence.hasCode &&
102
+ !presence.hasReviewAnalysis && !presence.hasReviewPlan && !presence.hasReviewCode &&
103
+ !presence.hasPriorPrReview;
104
+ }
105
+ function hasFullArtifacts(presence) {
106
+ return presence.hasAnalysis && presence.hasPlan && presence.hasCode &&
107
+ presence.hasReviewAnalysis && presence.hasReviewPlan && presence.hasReviewCode;
108
+ }
109
+ function isTrusted(head) {
110
+ return head.issueNumberBound && head.taskIssueMatches && (!head.prNumberBound || head.taskPrMatches);
111
+ }
112
+ /**
113
+ * Derive the S1(a) trust factor `taskIssueMatches` (PL-3) mechanically from
114
+ * resolved data: a unique host is trusted on the issue dimension only when the
115
+ * task's bound issue_number is among the PR's closing issues. Ambiguous/none
116
+ * hosts and tasks without a positive issue_number cannot be confirmed -> false
117
+ * (fail closed to S2/audit). `resolve-host` emits this value so the prompt layer
118
+ * does not derive the trust factor ad hoc (CD-2).
119
+ */
120
+ export function deriveTaskIssueMatches(host, closingIssues) {
121
+ return host.kind === 'unique' && host.issueNumber > 0 && closingIssues.includes(host.issueNumber);
122
+ }
123
+ /**
124
+ * S1 -> S2 -> S3 classification (analysis §6.1). The ambiguous host is rejected
125
+ * before classification (AN-6 fail closed). S3(a) is host.kind === 'none';
126
+ * S3(b) is a unique task with no lifecycle artifacts and no prior pr-review
127
+ * (PL-5/PL-9 symmetric: any review-only task falls to S2).
128
+ */
129
+ export function classifyScenario(host, presence, head) {
130
+ if (host.kind === 'ambiguous') {
131
+ throw new HostResolutionError('HOST_AMBIGUOUS', 'multiple candidate hosts; resolve before evidence classification');
132
+ }
133
+ if (host.kind === 'none')
134
+ return 'S3';
135
+ if (hasNoLifecycleArtifacts(presence))
136
+ return 'S3';
137
+ const priorHeadMatches = presence.hasPriorPrReview && head.priorHeadSha !== null && head.priorHeadSha === head.currentHeadSha;
138
+ if (hasFullArtifacts(presence) && priorHeadMatches && isTrusted(head))
139
+ return 'S1';
140
+ return 'S2';
141
+ }
142
+ /**
143
+ * Freshness is benchmarked against the prior `pr-review*` reviewed head SHA
144
+ * (analysis §6.2, AN-7). No prior review -> n/a/n/a (first-review special case).
145
+ */
146
+ export function evaluateHead(head) {
147
+ if (head.priorHeadSha === null)
148
+ return { freshness: 'n/a', alignment: 'n/a' };
149
+ const freshness = head.priorHeadSha === head.currentHeadSha ? 'fresh' : 'stale';
150
+ const aligned = freshness === 'fresh' && isTrusted(head);
151
+ return { freshness, alignment: aligned ? 'aligned' : 'misaligned' };
152
+ }
153
+ /**
154
+ * Pure-evidence risk aggregation (analysis §6.3, AN-5): any priority factor
155
+ * (sensitivity / sourceCredibility) HIGH -> HIGH; otherwise any HIGH -> MEDIUM;
156
+ * all LOW -> LOW. Identity factors are structurally absent from the input type.
157
+ */
158
+ export function gradeRisk(factors) {
159
+ const priority = [factors.sensitivity, factors.sourceCredibility];
160
+ if (priority.includes('HIGH'))
161
+ return 'HIGH';
162
+ const values = Object.values(factors);
163
+ if (values.includes('HIGH'))
164
+ return 'MEDIUM';
165
+ return 'LOW';
166
+ }
167
+ /**
168
+ * verify / audit / reconstruct selection matrix (analysis §6.4). S3 ->
169
+ * reconstruct; S2 -> audit; S1 fresh+aligned -> verify (LOW/MEDIUM risk) or
170
+ * audit (HIGH risk); any other S1 combination falls back to audit.
171
+ */
172
+ export function selectMode(scenario, freshness, alignment, risk) {
173
+ if (scenario === 'S3')
174
+ return 'reconstruct';
175
+ if (scenario === 'S2')
176
+ return 'audit';
177
+ if (freshness === 'fresh' && alignment === 'aligned') {
178
+ return risk === 'HIGH' ? 'audit' : 'verify';
179
+ }
180
+ return 'audit';
181
+ }
182
+ function buildReason(input) {
183
+ const pieces = [];
184
+ if (input.firstReview)
185
+ pieces.push('first review (no prior pr-review head)');
186
+ if (input.hasPriorPrReview)
187
+ pieces.push(`prior head ${input.freshness}`);
188
+ if (input.freshness === 'fresh')
189
+ pieces.push(`alignment ${input.alignment}`);
190
+ pieces.push(`evidence scenario ${input.scenario}`);
191
+ pieces.push(`risk ${input.risk}`);
192
+ pieces.push(`mode ${input.mode}`);
193
+ return pieces.join('; ');
194
+ }
195
+ /**
196
+ * Full decision pipeline: classify -> freshness/alignment -> risk -> mode,
197
+ * producing a traceable DecisionRecord (AC3). Ambiguous hosts are rejected
198
+ * before any classification runs (AN-6).
199
+ */
200
+ export function decide(input) {
201
+ if (input.host.kind === 'ambiguous') {
202
+ throw new HostResolutionError('HOST_AMBIGUOUS', 'ambiguous host; resolve before evidence classification');
203
+ }
204
+ const scenario = classifyScenario(input.host, input.presence, input.head);
205
+ const { freshness, alignment } = evaluateHead(input.head);
206
+ const risk = gradeRisk(input.riskFactors);
207
+ const mode = selectMode(scenario, freshness, alignment, risk);
208
+ const firstReview = !input.presence.hasPriorPrReview;
209
+ return {
210
+ host: input.host,
211
+ scenario,
212
+ freshness,
213
+ alignment,
214
+ risk,
215
+ mode,
216
+ firstReview,
217
+ reason: buildReason({
218
+ scenario,
219
+ freshness,
220
+ alignment,
221
+ risk,
222
+ mode,
223
+ firstReview,
224
+ hasPriorPrReview: input.presence.hasPriorPrReview
225
+ })
226
+ };
227
+ }
228
+ export { hasFullArtifacts, hasNoLifecycleArtifacts, isTrusted };
229
+ //# sourceMappingURL=evidence-grading.js.map
@@ -74,18 +74,30 @@ async function select(question, choices, defaultValue) {
74
74
  }
75
75
  return trimmed;
76
76
  }
77
- async function multiSelect(question, choices) {
77
+ async function multiSelect(question, choices, defaultIds = choices.map((choice) => choice.id)) {
78
+ const choiceIds = new Set(choices.map((choice) => choice.id));
79
+ if (defaultIds.some((id) => !choiceIds.has(id))) {
80
+ throw new Error('Default selection contains an unknown id');
81
+ }
82
+ const normalizedDefaults = choices
83
+ .map((choice) => choice.id)
84
+ .filter((id) => defaultIds.includes(id));
78
85
  process.stdout.write(` ${question}:\n`);
79
86
  const idWidth = Math.max(...choices.map((c) => c.id.length));
80
87
  choices.forEach((c, i) => {
81
88
  process.stdout.write(` ${i + 1}) ${c.id.padEnd(idWidth)} (${c.label})\n`);
82
89
  });
83
- ask('Enter comma-separated numbers or ids to keep, or "none" to select nothing [default: all]: ');
90
+ const defaultLabel = normalizedDefaults.length === choices.length
91
+ ? 'all'
92
+ : normalizedDefaults.length === 0
93
+ ? 'none'
94
+ : normalizedDefaults.join(',');
95
+ ask(`Enter comma-separated numbers or ids to keep, or "none" to select nothing [default: ${defaultLabel}]: `);
84
96
  setupInterface();
85
97
  const line = await nextLine();
86
98
  // Strictly distinguish bare Enter (null/empty string) from whitespace input.
87
99
  if (line === null || line === '')
88
- return choices.map((c) => c.id);
100
+ return normalizedDefaults;
89
101
  // Explicit empty selection: "none" means deliberately zero built-in choices.
90
102
  if (line.trim().toLowerCase() === 'none')
91
103
  return [];
@@ -21,7 +21,10 @@ async function inspectHomebrewChannel(url, version, fetcher = fetch) {
21
21
  return { status: 'blocked', published: null, version, error: { code: 'HOMEBREW_UNAVAILABLE', message: `formula endpoint returned ${response.status}` } };
22
22
  const formula = await response.text();
23
23
  const escaped = version.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
24
- return { status: 'no-op', published: new RegExp(`(?:version\\s+["']${escaped}["']|/v?${escaped}\\.)`).test(formula), version, error: null };
24
+ const formulaUrl = /^\s*url\s+["']([^"']+)["']\s*$/m.exec(formula)?.[1] ?? '';
25
+ const npmTarball = new RegExp(`^https://registry\\.npmjs\\.org/.+/-/[^/]+-${escaped}\\.tgz$`).test(formulaUrl);
26
+ const bottle = /^\s*bottle do\s*$/m.test(formula);
27
+ return { status: 'no-op', published: npmTarball && bottle, version, error: null };
25
28
  }
26
29
  catch (error) {
27
30
  return { status: 'blocked', published: null, version, error: { code: 'HOMEBREW_UNAVAILABLE', message: error instanceof Error ? error.message : String(error) } };
@@ -1,5 +1,5 @@
1
1
  function deriveReleasePhase(facts) {
2
- if (!facts.localTag)
2
+ if (!facts.localTag && !facts.localTagAncestor)
3
3
  return 'unprepared';
4
4
  if (!facts.remoteBranch && !facts.remoteTag)
5
5
  return 'prepared';
@@ -18,8 +18,10 @@ async function runReleaseAction(input) {
18
18
  const before = releaseSnapshot(input.version, await input.inspect());
19
19
  if (input.action === 'inspect')
20
20
  return { status: 'no-op', changed: false, before, snapshot: before, error: null };
21
+ if (before.facts.localTagConflict)
22
+ return { status: 'failed', changed: false, before, snapshot: before, error: { code: 'GIT_TAG_CONFLICT', message: `Tag ${before.tag} is not reachable from HEAD` } };
21
23
  const allowed = input.action === 'prepare' ? before.phase === 'unprepared'
22
- : input.action === 'publish' ? ['prepared', 'partially-published'].includes(before.phase)
24
+ : input.action === 'publish' ? before.facts.localTag && ['prepared', 'partially-published'].includes(before.phase)
23
25
  : ['published', 'post-pending'].includes(before.phase);
24
26
  if (!allowed)
25
27
  return { status: before.phase === 'complete' ? 'no-op' : 'failed', changed: false, before, snapshot: before, error: before.phase === 'complete' ? null : { code: 'RELEASE_PHASE_INVALID', message: `Cannot ${input.action} from ${before.phase}` } };
@@ -0,0 +1,25 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ export function removeDirRecursive(dir) {
4
+ if (!fs.existsSync(dir)) {
5
+ return;
6
+ }
7
+ const pending = [dir];
8
+ const directories = [];
9
+ while (pending.length > 0) {
10
+ const current = pending.pop();
11
+ const stat = fs.lstatSync(current);
12
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
13
+ fs.unlinkSync(current);
14
+ continue;
15
+ }
16
+ directories.push(current);
17
+ for (const entry of fs.readdirSync(current)) {
18
+ pending.push(path.join(current, entry));
19
+ }
20
+ }
21
+ for (const directory of directories.reverse()) {
22
+ fs.rmdirSync(directory);
23
+ }
24
+ }
25
+ //# sourceMappingURL=remove-dir.js.map
@@ -1,4 +1,6 @@
1
- const TUI_NAMES = new Set(['claude', 'codex', 'gemini', 'opencode']);
1
+ import { renderAgentClientInvocation } from '../agent-clients/invocation.js';
2
+ import { getAgentClientAdapter } from '../agent-clients/registry.js';
3
+ const TUI_NAMES = new Set(['claude', 'codex', 'antigravity', 'opencode']);
2
4
  function isTuiName(value) {
3
5
  return typeof value === 'string' && TUI_NAMES.has(value);
4
6
  }
@@ -17,17 +19,19 @@ export function selectTui(skill, options) {
17
19
  }
18
20
  export function renderPrompt(params) {
19
21
  const suffix = [params.skill, ...params.args].join(' ').trim();
20
- if (params.tui === 'codex')
21
- return `$${suffix}`;
22
- if (params.tui === 'gemini')
23
- return `/agent-infra:${suffix}`;
22
+ if (params.tui === 'codex') {
23
+ return renderAgentClientInvocation(getAgentClientAdapter('codex').invocation, {
24
+ skillName: params.skill,
25
+ args: params.args
26
+ });
27
+ }
24
28
  return `/${suffix}`;
25
29
  }
26
30
  export function buildTuiCommand(tui, prompt) {
27
31
  if (tui === 'claude')
28
32
  return ['claude', ['--dangerously-skip-permissions', '--print', prompt]];
29
- if (tui === 'gemini')
30
- return ['gemini', ['--approval-mode', 'yolo', '--prompt', prompt]];
33
+ if (tui === 'antigravity')
34
+ return ['agy', ['--dangerously-skip-permissions', '--print', prompt]];
31
35
  if (tui === 'opencode')
32
36
  return ['opencode', ['run', '--dangerously-skip-permissions', prompt]];
33
37
  return ['codex', ['exec', '--dangerously-bypass-approvals-and-sandbox', prompt]];
@@ -0,0 +1,234 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { execFile } from 'node:child_process';
3
+ import { isAgentClientId } from '../agent-clients/types.js';
4
+ import { listAgentClientAdapters, listInstalledAgentClientAdapters } from '../agent-clients/registry.js';
5
+ import { hostJoin } from './engines/wsl2-paths.js';
6
+ const DEFAULT_SANDBOX_HOOK_TIMEOUT_MS = 30_000;
7
+ function agentInfraTool(home) {
8
+ return {
9
+ id: 'agent-infra',
10
+ name: 'agent-infra CLI',
11
+ install: { type: 'npm', cmd: '@fitlab-ai/agent-infra@latest' },
12
+ sandboxBase: hostJoin(home, '.agent-infra', 'sandboxes', 'agent-infra'),
13
+ containerMount: '/home/devuser/.agent-infra-cli',
14
+ versionCmd: 'ai version --raw',
15
+ setupHint: 'Provides the ai and agent-infra CLI commands inside the sandbox.'
16
+ };
17
+ }
18
+ function compatAgentClientState(tools) {
19
+ return Object.fromEntries(listAgentClientAdapters().map((adapter) => [
20
+ adapter.id,
21
+ {
22
+ enabled: true,
23
+ installInSandbox: tools.includes(adapter.id)
24
+ }
25
+ ]));
26
+ }
27
+ function stableValue(value) {
28
+ if (Array.isArray(value)) {
29
+ return value.map(stableValue);
30
+ }
31
+ if (value && typeof value === 'object') {
32
+ return Object.fromEntries(Object.entries(value)
33
+ .sort(([left], [right]) => left.localeCompare(right))
34
+ .map(([key, nested]) => [key, stableValue(nested)]));
35
+ }
36
+ return value;
37
+ }
38
+ function runtimeToolProjection(tool) {
39
+ return stableValue({
40
+ id: tool.id,
41
+ install: tool.install,
42
+ containerMount: tool.containerMount,
43
+ versionCmd: tool.versionCmd,
44
+ envVars: tool.envVars ?? {},
45
+ hostPreSeedFiles: (tool.hostPreSeedFiles ?? []).map(({ sandboxName }) => ({ sandboxName })),
46
+ hostPreSeedDirs: (tool.hostPreSeedDirs ?? []).map(({ sandboxSubdir }) => ({ sandboxSubdir })),
47
+ pathRewriteFiles: tool.pathRewriteFiles ?? [],
48
+ hostLiveMounts: (tool.hostLiveMounts ?? []).map(({ containerSubpath }) => ({ containerSubpath })),
49
+ postSetupCmds: tool.postSetupCmds ?? [],
50
+ tmpfs: tool.tmpfs ?? null
51
+ });
52
+ }
53
+ function hash(value) {
54
+ return createHash('sha256').update(JSON.stringify(stableValue(value))).digest('hex');
55
+ }
56
+ function assertUniqueTools(tools) {
57
+ const seen = new Set();
58
+ for (const tool of tools) {
59
+ if (seen.has(tool.id)) {
60
+ throw new Error(`Duplicate sandbox tool id "${tool.id}"`);
61
+ }
62
+ seen.add(tool.id);
63
+ }
64
+ }
65
+ function hooksByPhase(adapters) {
66
+ const phases = [
67
+ 'prepare',
68
+ 'before-container-create',
69
+ 'after-container-start',
70
+ 'before-enter'
71
+ ];
72
+ return Object.freeze(Object.fromEntries(phases.map((phase) => [
73
+ phase,
74
+ Object.freeze(adapters.flatMap((adapter) => adapter.sandbox.hooks.filter((hook) => hook.phase === phase)))
75
+ ])));
76
+ }
77
+ function createSandboxCapabilityPlan(config) {
78
+ const state = config.agentClientState ?? compatAgentClientState(config.tools);
79
+ const selectedAgentClients = listInstalledAgentClientAdapters(state);
80
+ const context = { home: config.home, project: config.project };
81
+ const selectedTools = selectedAgentClients.map((adapter) => adapter.sandbox.createTool(context));
82
+ const allClientTools = listAgentClientAdapters().map((adapter) => adapter.sandbox.createTool(context));
83
+ const customById = new Map((config.customTools ?? []).map((tool) => [tool.id, tool]));
84
+ if (customById.size !== (config.customTools ?? []).length) {
85
+ throw new Error('Duplicate sandbox tool id in customTools');
86
+ }
87
+ for (const id of customById.keys()) {
88
+ if (id === 'agent-infra' || isAgentClientId(id)) {
89
+ throw new Error(`Custom sandbox tool id "${id}" collides with a built-in tool`);
90
+ }
91
+ }
92
+ const nonClientTools = [];
93
+ const selectedCustomTools = [];
94
+ for (const id of config.tools) {
95
+ if (isAgentClientId(id))
96
+ continue;
97
+ if (id === 'agent-infra') {
98
+ if (!nonClientTools.some((tool) => tool.id === id)) {
99
+ nonClientTools.push(agentInfraTool(config.home));
100
+ }
101
+ continue;
102
+ }
103
+ const custom = customById.get(id);
104
+ if (!custom) {
105
+ throw new Error(`Unknown sandbox tool: ${id}`);
106
+ }
107
+ selectedCustomTools.push(custom);
108
+ }
109
+ const tools = Object.freeze([...nonClientTools, ...selectedTools, ...selectedCustomTools]);
110
+ assertUniqueTools(tools);
111
+ const phaseHooks = hooksByPhase(selectedAgentClients);
112
+ const hookProjection = selectedAgentClients.flatMap((adapter) => adapter.sandbox.hooks.map((hook) => ({
113
+ adapterId: adapter.id,
114
+ id: hook.id,
115
+ phase: hook.phase,
116
+ timeoutMs: hook.timeoutMs ?? DEFAULT_SANDBOX_HOOK_TIMEOUT_MS
117
+ })));
118
+ const recoveryChecks = Object.freeze(selectedAgentClients.flatMap((adapter) => (adapter.sandbox.recoveryChecks ?? []).map((check) => Object.freeze({
119
+ adapterId: adapter.id,
120
+ check
121
+ }))));
122
+ const recoveryCheckProjection = Object.freeze(recoveryChecks.map(({ adapterId, check }) => Object.freeze({
123
+ adapterId,
124
+ id: check.id,
125
+ ...(check.when === undefined ? {} : { when: check.when }),
126
+ probe: check.probe,
127
+ finding: Object.freeze({
128
+ repairKind: check.finding.repairKind,
129
+ ...(check.finding.path === undefined ? {} : { path: check.finding.path })
130
+ }),
131
+ ...(check.repair === undefined ? {} : { repair: check.repair })
132
+ })));
133
+ const runtimeProjection = Object.freeze({
134
+ tools: Object.freeze(tools.map(runtimeToolProjection)),
135
+ selectedAgentClients: Object.freeze(selectedAgentClients.map((adapter) => adapter.id)),
136
+ hooks: Object.freeze(hookProjection),
137
+ recoveryChecks: recoveryCheckProjection
138
+ });
139
+ const cleanupInventory = Object.freeze([
140
+ agentInfraTool(config.home),
141
+ ...allClientTools,
142
+ ...customById.values()
143
+ ]);
144
+ assertUniqueTools(cleanupInventory);
145
+ return Object.freeze({
146
+ tools,
147
+ selectedAgentClients,
148
+ hooksByPhase: phaseHooks,
149
+ recoveryChecks,
150
+ aliases: Object.freeze(listAgentClientAdapters().flatMap((adapter) => adapter.sandbox.aliases)),
151
+ imageSignature: hash(tools.map(({ id, install }) => ({ id, install }))),
152
+ runtimeSignature: hash(runtimeProjection),
153
+ runtimeProjection,
154
+ cleanupInventory
155
+ });
156
+ }
157
+ function timeoutStatus(phase) {
158
+ if (phase === 'before-enter')
159
+ return 'warning';
160
+ return 'fatal';
161
+ }
162
+ async function runSandboxHooks({ hooks, phase, context, runCommand = async () => {
163
+ throw new Error('Sandbox hook command runner is unavailable');
164
+ }, scheduleTimeout = (callback, timeoutMs) => setTimeout(callback, timeoutMs), clearScheduledTimeout = (handle) => clearTimeout(handle) }) {
165
+ const results = [];
166
+ for (const hook of hooks) {
167
+ if (hook.phase !== phase)
168
+ continue;
169
+ const timeoutMs = hook.timeoutMs ?? DEFAULT_SANDBOX_HOOK_TIMEOUT_MS;
170
+ const controller = new AbortController();
171
+ let timedOut = false;
172
+ let timer;
173
+ const timeout = new Promise((resolve) => {
174
+ timer = scheduleTimeout(() => {
175
+ timedOut = true;
176
+ controller.abort();
177
+ resolve({
178
+ status: timeoutStatus(phase),
179
+ message: `Sandbox hook '${hook.id}' timed out after ${timeoutMs}ms.`
180
+ });
181
+ }, timeoutMs);
182
+ });
183
+ let result;
184
+ try {
185
+ const execution = Promise.resolve().then(() => hook.run({
186
+ ...context,
187
+ signal: controller.signal,
188
+ runCommand: (command) => runCommand(command, {
189
+ signal: controller.signal,
190
+ timeoutMs
191
+ })
192
+ }));
193
+ result = await Promise.race([execution, timeout]);
194
+ }
195
+ catch (error) {
196
+ result = {
197
+ status: timeoutStatus(phase),
198
+ message: error instanceof Error ? error.message : String(error)
199
+ };
200
+ }
201
+ finally {
202
+ clearScheduledTimeout(timer);
203
+ }
204
+ results.push({
205
+ hookId: hook.id,
206
+ phase,
207
+ status: result.status,
208
+ ...(result.message ? { message: result.message } : {})
209
+ });
210
+ if (timedOut || result.status === 'fatal' || result.status === 'hard-failure') {
211
+ break;
212
+ }
213
+ }
214
+ return results;
215
+ }
216
+ function runBoundedSandboxHookCommand(command, options) {
217
+ return new Promise((resolve, reject) => {
218
+ execFile(command.command, [...(command.args ?? [])], {
219
+ cwd: command.cwd,
220
+ env: command.env,
221
+ encoding: 'utf8',
222
+ signal: options.signal,
223
+ timeout: options.timeoutMs
224
+ }, (error, stdout) => {
225
+ if (error) {
226
+ reject(error);
227
+ return;
228
+ }
229
+ resolve({ stdout: stdout.trim() });
230
+ });
231
+ });
232
+ }
233
+ export { DEFAULT_SANDBOX_HOOK_TIMEOUT_MS, createSandboxCapabilityPlan, runBoundedSandboxHookCommand, runSandboxHooks };
234
+ //# sourceMappingURL=agent-client-reconciler.js.map
@@ -2,10 +2,11 @@ import { execFileSync } from 'node:child_process';
2
2
  import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
+ import { removeDirRecursive } from '../../remove-dir.js';
5
6
  const PROBE_TIMEOUT_MS = 2_000;
6
7
  const READ_IMAGE_TIMEOUT_MS = 5_000;
7
8
  const PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
8
- export function createLinuxClipboardAdapter({ env = process.env, execFn = execFileSync, execToFileFn = execToFile, mkdtempFn = fs.mkdtempSync, readFileFn = fs.readFileSync, rmFn = fs.rmSync } = {}) {
9
+ export function createLinuxClipboardAdapter({ env = process.env, execFn = execFileSync, execToFileFn = execToFile, mkdtempFn = fs.mkdtempSync, readFileFn = fs.readFileSync, rmFn = removeDirRecursive } = {}) {
9
10
  return {
10
11
  available() {
11
12
  const backend = selectBackend(env);