@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
@@ -41,22 +41,37 @@ function projectStaged(repoRoot, baseline, globs, env) {
41
41
  });
42
42
  }
43
43
  }
44
- function snapshotReview(input) {
45
- const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
46
- const resolvedBaseline = String(git(repoRoot, ['rev-parse', '--verify', `${input.baseline}^{commit}`])).trim();
47
- return withTemporaryIndex(repoRoot, resolvedBaseline, (env) => {
48
- if (input.mode === 'worktree')
49
- projectWorktree(repoRoot, resolvedBaseline, input.globs, env);
44
+ function projectSnapshot(repoRoot, mode, baseline, globs) {
45
+ return withTemporaryIndex(repoRoot, baseline, (env) => {
46
+ if (mode === 'worktree')
47
+ projectWorktree(repoRoot, baseline, globs, env);
50
48
  else
51
- projectStaged(repoRoot, resolvedBaseline, input.globs, env);
52
- const diff = execFileSync('git', ['diff', '--cached', '--binary', resolvedBaseline, '--', ...input.globs], { cwd: repoRoot, encoding: 'buffer', env });
49
+ projectStaged(repoRoot, baseline, globs, env);
53
50
  return {
54
- baseline: resolvedBaseline,
55
- fingerprint: `sha256:${crypto.createHash('sha256').update(diff).digest('hex')}`,
51
+ diff: execFileSync('git', ['diff', '--cached', '--binary', baseline, '--', ...globs], {
52
+ cwd: repoRoot,
53
+ encoding: 'buffer',
54
+ env
55
+ }),
56
56
  tree: String(git(repoRoot, ['write-tree'], { env })).trim()
57
57
  };
58
58
  });
59
59
  }
60
+ function snapshotReview(input) {
61
+ const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
62
+ const resolvedBaseline = String(git(repoRoot, ['rev-parse', '--verify', `${input.baseline}^{commit}`])).trim();
63
+ const resolvedDiffBase = String(git(repoRoot, ['rev-parse', '--verify', `${input.diffBase || resolvedBaseline}^{commit}`])).trim();
64
+ const reviewed = projectSnapshot(repoRoot, input.mode, resolvedBaseline, input.globs);
65
+ const fingerprintSource = resolvedDiffBase === resolvedBaseline
66
+ ? reviewed.diff
67
+ : projectSnapshot(repoRoot, input.mode, resolvedDiffBase, input.globs).diff;
68
+ return {
69
+ baseline: resolvedBaseline,
70
+ diffBase: resolvedDiffBase,
71
+ fingerprint: `sha256:${crypto.createHash('sha256').update(fingerprintSource).digest('hex')}`,
72
+ tree: reviewed.tree
73
+ };
74
+ }
60
75
  function compareReviewTrees(input) {
61
76
  const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
62
77
  git(repoRoot, ['rev-parse', '--verify', `${input.expected}^{tree}`]);
@@ -0,0 +1,110 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+ const SHA_PATTERN = /^[0-9a-f]{40}$/i;
3
+ function git(cwd, args) {
4
+ return execFileSync("git", args, { cwd, encoding: "utf8", maxBuffer: 32 * 1024 * 1024 });
5
+ }
6
+ function commitExists(gitRoot, sha) {
7
+ try {
8
+ git(gitRoot, ["cat-file", "-e", `${sha}^{commit}`]);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function isAncestor(gitRoot, ancestor, descendant) {
16
+ const result = spawnSync("git", ["merge-base", "--is-ancestor", ancestor, descendant], {
17
+ cwd: gitRoot,
18
+ encoding: "utf8"
19
+ });
20
+ if (result.status === 0)
21
+ return true;
22
+ if (result.status === 1)
23
+ return false;
24
+ return null;
25
+ }
26
+ export function resolveLocalReviewedCommitRelation(input) {
27
+ const { gitRoot, localHead, lastReviewedCommit, rewrittenCommit, pathspecs } = input;
28
+ const shas = [localHead, lastReviewedCommit, rewrittenCommit];
29
+ if (shas.some((sha) => !SHA_PATTERN.test(sha) || !commitExists(gitRoot, sha))) {
30
+ return {
31
+ status: "blocked",
32
+ code: "LOCAL_REWRITE_OBJECT_MISSING",
33
+ message: "Required local rewrite Git objects are unavailable"
34
+ };
35
+ }
36
+ const ancestor = isAncestor(gitRoot, rewrittenCommit, localHead);
37
+ if (ancestor === false) {
38
+ return {
39
+ status: "failed",
40
+ code: "LOCAL_REWRITE_TOPOLOGY_INVALID",
41
+ message: "Local rewritten commit is not in the current HEAD history"
42
+ };
43
+ }
44
+ if (ancestor === null) {
45
+ return {
46
+ status: "blocked",
47
+ code: "LOCAL_REWRITE_GIT_EVIDENCE_UNAVAILABLE",
48
+ message: "Unable to verify local rewrite ancestry"
49
+ };
50
+ }
51
+ try {
52
+ const parents = git(gitRoot, ["rev-parse", `${rewrittenCommit}^@`])
53
+ .split(/\r?\n/)
54
+ .filter((line) => line.trim() !== "");
55
+ if (parents.length !== 1) {
56
+ return {
57
+ status: "failed",
58
+ code: "LOCAL_REWRITE_TOPOLOGY_INVALID",
59
+ message: "Local rewritten commit is not a single-parent commit"
60
+ };
61
+ }
62
+ const reviewedTree = git(gitRoot, ["rev-parse", `${lastReviewedCommit}^{tree}`]).trim();
63
+ const rewrittenTree = git(gitRoot, ["rev-parse", `${rewrittenCommit}^{tree}`]).trim();
64
+ if (reviewedTree !== rewrittenTree) {
65
+ const protectedDiff = git(gitRoot, [
66
+ "diff",
67
+ "--no-renames",
68
+ "--binary",
69
+ "--full-index",
70
+ lastReviewedCommit,
71
+ rewrittenCommit,
72
+ "--",
73
+ ...pathspecs
74
+ ]);
75
+ if (protectedDiff !== "") {
76
+ return {
77
+ status: "failed",
78
+ code: "LOCAL_REWRITE_CONTENT_MISMATCH",
79
+ message: "Local rewritten commit differs from the reviewed protected content"
80
+ };
81
+ }
82
+ }
83
+ const postRewrite = git(gitRoot, [
84
+ "rev-list",
85
+ `${rewrittenCommit}..${localHead}`,
86
+ "--",
87
+ ...pathspecs
88
+ ]).trim();
89
+ if (postRewrite) {
90
+ return {
91
+ status: "failed",
92
+ code: "POST_LOCAL_REWRITE_CHANGES",
93
+ message: "Protected paths changed after the equivalent local rewrite"
94
+ };
95
+ }
96
+ }
97
+ catch {
98
+ return {
99
+ status: "blocked",
100
+ code: "LOCAL_REWRITE_GIT_EVIDENCE_UNAVAILABLE",
101
+ message: "Unable to verify local rewrite topology or content"
102
+ };
103
+ }
104
+ return {
105
+ status: "local-equivalent",
106
+ reviewedHead: lastReviewedCommit,
107
+ rewrittenCommit
108
+ };
109
+ }
110
+ //# sourceMappingURL=reviewed-commit-equivalence.js.map
@@ -1,4 +1,6 @@
1
1
  import { spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
2
4
  const defaultRunner = (args, cwd) => {
3
5
  const result = spawnSync('git', [...args], { cwd, encoding: 'utf8' });
4
6
  return { status: result.status, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
@@ -10,6 +12,9 @@ function value(runner, cwd, args, trim = true) {
10
12
  const result = run(runner, cwd, args);
11
13
  return result.status === 0 ? (trim ? result.stdout.trim() : result.stdout.replace(/\n$/, '')) : null;
12
14
  }
15
+ function cleanMessage(message) {
16
+ return message.replace(/(https?:\/\/)[^\s/@:]+(?::[^\s/@]*)?@/gi, '$1***@').trim();
17
+ }
13
18
  function inspectGitWorkflow(cwd, runner = defaultRunner, remoteInput) {
14
19
  const head = value(runner, cwd, ['rev-parse', 'HEAD']);
15
20
  const branch = value(runner, cwd, ['branch', '--show-current']);
@@ -97,5 +102,53 @@ function pushGitRefs(input, runner = defaultRunner) {
97
102
  const failures = operations.filter((item) => item.status === 'failed').length;
98
103
  return { status: failures === 0 ? 'applied' : failures === operations.length ? 'failed' : 'degraded', changed: failures < operations.length, snapshot: inspectGitWorkflow(input.cwd, runner).snapshot, operations, error: failures ? { code: 'GIT_PUSH_PARTIAL', message: `${failures} ref push operation(s) failed` } : null };
99
104
  }
100
- export { commitExplicitPaths, inspectGitWorkflow, pushGitRefs };
105
+ function pushRebasedBranch(input, runner = defaultRunner) {
106
+ const sha = /^[0-9a-f]{40}$/i;
107
+ const refName = /^(?!-)(?!.*\.\.)(?!.*(?:^|\/)\.)(?!.*[~^:?*\[\\\s])(?:[A-Za-z0-9._-]+\/)*[A-Za-z0-9._-]+$/;
108
+ if (!input.remote || !refName.test(input.remote) || !refName.test(input.branch) || !refName.test(input.baseBranch) ||
109
+ !sha.test(input.expectedOldHead) || !sha.test(input.newHead) || !sha.test(input.expectedBaseHead)) {
110
+ return { status: 'failed', changed: false, snapshot: null, operations: [], error: { code: 'GIT_REBASED_INPUT_INVALID', message: 'Remote, branches, and full 40-character SHAs are required' } };
111
+ }
112
+ const snapshot = inspectGitWorkflow(input.cwd, runner).snapshot;
113
+ if (!snapshot)
114
+ return { status: 'failed', changed: false, snapshot: null, operations: [], error: { code: 'GIT_INSPECT_FAILED', message: 'Unable to inspect Git repository' } };
115
+ if (snapshot.branch !== input.branch || snapshot.head !== input.newHead) {
116
+ return { status: 'failed', changed: false, snapshot, operations: [], error: { code: 'GIT_LOCAL_IDENTITY_MISMATCH', message: 'Current branch or HEAD does not match the rebased intent' } };
117
+ }
118
+ const rebasePaths = ['rebase-merge', 'rebase-apply']
119
+ .map((name) => value(runner, input.cwd, ['rev-parse', '--git-path', name]))
120
+ .filter((candidate) => Boolean(candidate));
121
+ if (snapshot.worktree.length > 0 || snapshot.staged.length > 0 ||
122
+ run(runner, input.cwd, ['rev-parse', '-q', '--verify', 'REBASE_HEAD']).status === 0 ||
123
+ rebasePaths.some((candidate) => fs.existsSync(path.isAbsolute(candidate) ? candidate : path.join(input.cwd, candidate)))) {
124
+ return { status: 'failed', changed: false, snapshot, operations: [], error: { code: 'GIT_LOCAL_STATE_UNSAFE', message: 'Working tree must be clean with no rebase in progress' } };
125
+ }
126
+ const remoteRef = `refs/heads/${input.branch}`;
127
+ const baseRef = `refs/heads/${input.baseBranch}`;
128
+ const remoteHead = value(runner, input.cwd, ['ls-remote', '--exit-code', input.remote, remoteRef])?.split(/\s+/)[0] ?? null;
129
+ if (remoteHead !== input.expectedOldHead) {
130
+ return { status: 'failed', changed: false, snapshot, operations: [], error: { code: 'GIT_REMOTE_HEAD_MISMATCH', message: `Expected remote head ${input.expectedOldHead}, received ${remoteHead ?? 'unavailable'}` } };
131
+ }
132
+ const baseHead = value(runner, input.cwd, ['ls-remote', '--exit-code', input.remote, baseRef])?.split(/\s+/)[0] ?? null;
133
+ if (baseHead !== input.expectedBaseHead) {
134
+ return { status: 'failed', changed: false, snapshot, operations: [], error: { code: 'GIT_REMOTE_BASE_MISMATCH', message: `Expected base head ${input.expectedBaseHead}, received ${baseHead ?? 'unavailable'}` } };
135
+ }
136
+ if (run(runner, input.cwd, ['merge-base', '--is-ancestor', input.expectedBaseHead, input.newHead]).status !== 0) {
137
+ return { status: 'failed', changed: false, snapshot, operations: [], error: { code: 'GIT_REBASED_ANCESTOR_MISMATCH', message: 'Rebased head does not contain the expected base head' } };
138
+ }
139
+ const pushed = run(runner, input.cwd, [
140
+ 'push', `--force-with-lease=${remoteRef}:${input.expectedOldHead}`,
141
+ input.remote, `${input.newHead}:${remoteRef}`
142
+ ]);
143
+ if (pushed.status !== 0) {
144
+ const message = cleanMessage(pushed.stderr) || 'Rebased branch push was rejected';
145
+ return { status: 'failed', changed: false, snapshot: inspectGitWorkflow(input.cwd, runner).snapshot, operations: [{ name: 'push-rebased', status: 'failed', ref: input.branch, message }], error: { code: 'GIT_REBASED_PUSH_REJECTED', message } };
146
+ }
147
+ const verified = value(runner, input.cwd, ['ls-remote', '--exit-code', input.remote, remoteRef])?.split(/\s+/)[0] ?? null;
148
+ if (verified !== input.newHead) {
149
+ return { status: 'failed', changed: true, snapshot: inspectGitWorkflow(input.cwd, runner).snapshot, operations: [{ name: 'push-rebased', status: 'failed', ref: input.branch, message: 'Remote ref verification failed' }], error: { code: 'GIT_REBASED_VERIFY_FAILED', message: `Expected pushed head ${input.newHead}, received ${verified ?? 'unavailable'}` } };
150
+ }
151
+ return { status: 'applied', changed: true, snapshot: inspectGitWorkflow(input.cwd, runner).snapshot, operations: [{ name: 'push-rebased', status: 'applied', ref: input.branch }], error: null };
152
+ }
153
+ export { commitExplicitPaths, inspectGitWorkflow, pushGitRefs, pushRebasedBranch };
101
154
  //# sourceMappingURL=workflow.js.map
package/dist/lib/init.js CHANGED
@@ -8,30 +8,15 @@ import { resolveTemplateDir } from './paths.js';
8
8
  import { renderFile, copySkillDir, KNOWN_PLATFORMS } from './render.js';
9
9
  import { enginesForPlatform } from './sandbox/engines/index.js';
10
10
  import { VERSION } from './version.js';
11
- import { BUILTIN_TUI_IDS, BUILTIN_TUI_DISPLAY, isPathOwnedByDisabledTUI, resolveEnabledTUIs } from './builtin-tuis.js';
11
+ import { listAgentClientAdapters } from './agent-clients/registry.js';
12
+ import { serializeAgentClients } from './agent-clients/config.js';
13
+ import { applyAgentClientReconciliation, planAgentClientReconciliation } from './agent-clients/reconcile.js';
12
14
  const defaults = JSON.parse(fs.readFileSync(new URL('./defaults.json', import.meta.url), 'utf8'));
13
15
  const PLATFORM_DEFAULT_ENGINES = Object.freeze({
14
16
  linux: 'native',
15
17
  darwin: 'colima',
16
18
  win32: 'wsl2'
17
19
  });
18
- function isPathOwnedByOtherPlatform(relativePath, platformType) {
19
- const top = String(relativePath || '').replace(/\\/g, '/').replace(/^\.\//, '').split('/')[0] ?? '';
20
- if (!top.startsWith('.'))
21
- return false;
22
- const candidate = top.slice(1);
23
- if (!KNOWN_PLATFORMS.has(candidate))
24
- return false;
25
- return candidate !== platformType;
26
- }
27
- function buildDefaultFiles(platformType, enabledTUIs) {
28
- const ownedByDisabled = (entry) => isPathOwnedByDisabledTUI(entry, enabledTUIs);
29
- return {
30
- managed: (defaults.files.managed || []).filter((entry) => !isPathOwnedByOtherPlatform(entry, platformType) && !ownedByDisabled(entry)),
31
- merged: (defaults.files.merged || []).filter((entry) => !isPathOwnedByOtherPlatform(entry, platformType) && !ownedByDisabled(entry)),
32
- ejected: structuredClone(defaults.files.ejected || [])
33
- };
34
- }
35
20
  function detectProjectName() {
36
21
  try {
37
22
  const url = execSync('git remote get-url origin', { stdio: ['pipe', 'pipe', 'pipe'] })
@@ -158,9 +143,10 @@ async function cmdInit() {
158
143
  info(`Custom platform '${platformType}' selected. Built-in templates are only complete for github;`
159
144
  + ` provide matching '.${platformType}.' or generic templates before running update-agent-infra.`);
160
145
  }
161
- let enabledTUIs;
146
+ const adapters = listAgentClientAdapters();
147
+ let enabledClientIds;
162
148
  try {
163
- enabledTUIs = await multiSelect('Built-in TUI command files to install/manage', BUILTIN_TUI_IDS.map((id) => ({ id, label: BUILTIN_TUI_DISPLAY[id] })));
149
+ enabledClientIds = await multiSelect('Agent Client project integrations to enable', adapters.map((adapter) => ({ id: adapter.id, label: adapter.displayName })));
164
150
  }
165
151
  catch (e) {
166
152
  err(e instanceof Error ? e.message : String(e));
@@ -168,53 +154,19 @@ async function cmdInit() {
168
154
  process.exitCode = 1;
169
155
  return;
170
156
  }
171
- const enabledTUISet = resolveEnabledTUIs(enabledTUIs);
157
+ const enabledClientSet = new Set(enabledClientIds);
172
158
  const templateSources = parseLocalSources(await prompt('Template sources (optional, comma-separated local paths, e.g. ~/my-templates; Enter to skip)', ''));
173
159
  const skillSources = parseLocalSources(await prompt('Skill sources (optional, comma-separated local paths, e.g. ~/my-skills; Enter to skip)', ''));
174
160
  closePrompt();
175
161
  const project = projectName;
176
162
  const replacements = { project, org: orgName };
177
- console.log('');
178
- if (orgName) {
179
- info(`Installing update-agent-infra seed command for: ${projectName} (${orgName})`);
180
- }
181
- else {
182
- info(`Installing update-agent-infra seed command for: ${projectName}`);
183
- }
184
- console.log('');
185
- // select language-specific template filenames
186
- let claudeSrc, geminiSrc, opencodeSrc;
187
- if (language === 'zh-CN') {
188
- claudeSrc = 'update-agent-infra.zh-CN.md';
189
- geminiSrc = 'update-agent-infra.zh-CN.toml';
190
- opencodeSrc = 'update-agent-infra.zh-CN.md';
191
- }
192
- else {
193
- claudeSrc = 'update-agent-infra.en.md';
194
- geminiSrc = 'update-agent-infra.en.toml';
195
- opencodeSrc = 'update-agent-infra.en.md';
196
- }
197
- // install skill
198
- copySkillDir(path.join(templateDir, '.agents', 'skills', 'update-agent-infra'), path.join('.agents', 'skills', 'update-agent-infra'), replacements, language, platformType);
199
- ok('Installed .agents/skills/update-agent-infra/');
200
- renderFile(path.join(templateDir, '.agents', 'scripts', 'lib', 'agent-infra-package.js'), path.join('.agents', 'scripts', 'lib', 'agent-infra-package.js'), replacements);
201
- ok('Installed .agents/scripts/lib/agent-infra-package.js');
202
- // install Claude command (only if enabled)
203
- if (enabledTUISet.has('claude-code')) {
204
- renderFile(path.join(templateDir, '.claude', 'commands', claudeSrc), path.join('.claude', 'commands', 'update-agent-infra.md'), replacements);
205
- ok('Installed .claude/commands/update-agent-infra.md');
206
- }
207
- // install Gemini command (only if enabled)
208
- if (enabledTUISet.has('gemini-cli')) {
209
- renderFile(path.join(templateDir, '.gemini', 'commands', '_project_', geminiSrc), path.join('.gemini', 'commands', project, 'update-agent-infra.toml'), replacements);
210
- ok(`Installed .gemini/commands/${project}/update-agent-infra.toml`);
211
- }
212
- // install OpenCode command (only if enabled)
213
- if (enabledTUISet.has('opencode')) {
214
- renderFile(path.join(templateDir, '.opencode', 'commands', opencodeSrc), path.join('.opencode', 'commands', 'update-agent-infra.md'), replacements);
215
- ok('Installed .opencode/commands/update-agent-infra.md');
216
- }
217
- // generate .agents/.airc.json
163
+ const defaultState = Object.fromEntries(defaults.agentClients.map((entry) => [
164
+ entry.id,
165
+ {
166
+ enabled: enabledClientSet.has(entry.id),
167
+ installInSandbox: entry.installInSandbox
168
+ }
169
+ ]));
218
170
  const config = {
219
171
  project: projectName,
220
172
  org: orgName,
@@ -224,24 +176,39 @@ async function cmdInit() {
224
176
  sandbox: structuredClone(defaults.sandbox),
225
177
  task: structuredClone(defaults.task),
226
178
  labels: structuredClone(defaults.labels),
227
- files: buildDefaultFiles(platformType, enabledTUISet),
228
- tuis: enabledTUIs
179
+ files: { managed: [], merged: [], ejected: [] },
180
+ agentClients: serializeAgentClients(defaultState)
229
181
  };
230
- if (sandboxEngine) {
182
+ if (sandboxEngine)
231
183
  config.sandbox.engine = sandboxEngine;
184
+ if (templateSources.length > 0)
185
+ config.templates = { sources: templateSources };
186
+ if (skillSources.length > 0)
187
+ config.skills = { sources: skillSources };
188
+ const workflowPlan = planAgentClientReconciliation({
189
+ config: config,
190
+ mutation: { type: 'none' },
191
+ projectRoot: process.cwd(),
192
+ templateRoot: templateDir,
193
+ platformType,
194
+ language
195
+ });
196
+ console.log('');
197
+ if (orgName) {
198
+ info(`Installing update-agent-infra seed command for: ${projectName} (${orgName})`);
232
199
  }
233
- if (templateSources.length > 0) {
234
- config.templates = {
235
- sources: templateSources
236
- };
237
- }
238
- if (skillSources.length > 0) {
239
- config.skills = {
240
- sources: skillSources
241
- };
200
+ else {
201
+ info(`Installing update-agent-infra seed command for: ${projectName}`);
242
202
  }
243
- fs.mkdirSync(path.dirname(configPath), { recursive: true });
244
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
203
+ console.log('');
204
+ // install skill
205
+ copySkillDir(path.join(templateDir, '.agents', 'skills', 'update-agent-infra'), path.join('.agents', 'skills', 'update-agent-infra'), replacements, language, platformType);
206
+ ok('Installed .agents/skills/update-agent-infra/');
207
+ renderFile(path.join(templateDir, '.agents', 'scripts', 'lib', 'agent-infra-package.js'), path.join('.agents', 'scripts', 'lib', 'agent-infra-package.js'), replacements);
208
+ ok('Installed .agents/scripts/lib/agent-infra-package.js');
209
+ const reconcileResult = applyAgentClientReconciliation(workflowPlan);
210
+ for (const target of reconcileResult.applied)
211
+ ok(`Installed ${target}`);
245
212
  ok(`Generated ${configPath}`);
246
213
  // done
247
214
  console.log('');
@@ -250,27 +217,16 @@ async function cmdInit() {
250
217
  console.log(' If this init used npx, install agent-infra persistently before update or validation:');
251
218
  console.log(' npm install -g @fitlab-ai/agent-infra');
252
219
  console.log('');
253
- if (enabledTUISet.size === 0) {
254
- console.log(' No built-in TUI selected.');
220
+ if (workflowPlan.nextSteps.length === 0) {
221
+ console.log(' No Agent Client project integration enabled.');
255
222
  console.log(` Configure "customTUIs" in ${configPath} before running update-agent-infra.`);
256
223
  console.log('');
257
224
  }
258
225
  else {
259
226
  console.log(' Next step: open this project in any AI TUI and run:');
260
227
  console.log('');
261
- const claudeOrOpencode = [];
262
- if (enabledTUISet.has('claude-code'))
263
- claudeOrOpencode.push('Claude Code');
264
- if (enabledTUISet.has('opencode'))
265
- claudeOrOpencode.push('OpenCode');
266
- if (claudeOrOpencode.length > 0) {
267
- console.log(` ${claudeOrOpencode.join(' / ')}: /update-agent-infra`);
268
- }
269
- if (enabledTUISet.has('gemini-cli')) {
270
- console.log(` Gemini CLI: /${project}:update-agent-infra`);
271
- }
272
- if (enabledTUISet.has('codex')) {
273
- console.log(' Codex CLI: $update-agent-infra');
228
+ for (const nextStep of workflowPlan.nextSteps) {
229
+ console.log(` ${nextStep.displayName}: ${nextStep.command}`);
274
230
  }
275
231
  console.log('');
276
232
  console.log(' This will render all templates and set up the full');
@@ -0,0 +1,174 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { AgentClientConfigError, normalizeAgentClients } from '../agent-clients/config.js';
4
+ import { normalizeCustomTUIs } from '../agent-clients/custom-tuis.js';
5
+ import { renderNextStepCommands } from '../agent-clients/next-steps.js';
6
+ import { getAgentClientModelSelection } from '../agent-clients/registry.js';
7
+ import { isAgentClientId } from '../agent-clients/types.js';
8
+ const USAGE = 'Usage: agent-infra-internal agent-client <next-steps|model-selection> [options]\n';
9
+ function failure(code, message) {
10
+ process.stdout.write(`${JSON.stringify({
11
+ status: 'failed',
12
+ changed: false,
13
+ commands: [],
14
+ diagnostics: [],
15
+ error: { code, message }
16
+ })}\n`);
17
+ process.exitCode = 1;
18
+ }
19
+ function parseArgs(args) {
20
+ if (args[0] === '--help' || args[0] === '-h') {
21
+ process.stdout.write(USAGE);
22
+ return null;
23
+ }
24
+ if (args[0] !== 'next-steps') {
25
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', "operation must be 'next-steps'");
26
+ return null;
27
+ }
28
+ let skillName;
29
+ let taskRef;
30
+ let version;
31
+ let format = 'text';
32
+ const seen = new Set();
33
+ for (let index = 1; index < args.length; index += 1) {
34
+ const flag = args[index];
35
+ if (!['--skill', '--task-ref', '--version', '--format'].includes(flag)) {
36
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', `unknown option '${flag}'`);
37
+ return null;
38
+ }
39
+ if (seen.has(flag)) {
40
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', `duplicate option '${flag}'`);
41
+ return null;
42
+ }
43
+ const value = args[++index];
44
+ if (!value || value.startsWith('--')) {
45
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', `option '${flag}' requires a value`);
46
+ return null;
47
+ }
48
+ seen.add(flag);
49
+ if (flag === '--skill')
50
+ skillName = value;
51
+ if (flag === '--task-ref')
52
+ taskRef = value;
53
+ if (flag === '--version')
54
+ version = value;
55
+ if (flag === '--format') {
56
+ if (value !== 'text' && value !== 'json') {
57
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', "format must be 'text' or 'json'");
58
+ return null;
59
+ }
60
+ format = value;
61
+ }
62
+ }
63
+ if (!skillName) {
64
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', "option '--skill' is required");
65
+ return null;
66
+ }
67
+ return {
68
+ skillName,
69
+ ...(taskRef ? { taskRef } : {}),
70
+ ...(version ? { version } : {}),
71
+ format
72
+ };
73
+ }
74
+ function agentClient(args = []) {
75
+ if (args[0] === 'model-selection') {
76
+ const values = {};
77
+ const seen = new Set();
78
+ for (let index = 1; index < args.length; index += 1) {
79
+ const flag = args[index];
80
+ if (!['--client', '--format'].includes(flag) || seen.has(flag)) {
81
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', `invalid or duplicate option '${flag}'`);
82
+ return;
83
+ }
84
+ const value = args[++index];
85
+ if (!value || value.startsWith('--')) {
86
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', `option '${flag}' requires a value`);
87
+ return;
88
+ }
89
+ seen.add(flag);
90
+ values[flag] = value;
91
+ }
92
+ const client = values['--client'];
93
+ const format = values['--format'] ?? 'text';
94
+ if (!isAgentClientId(client) || !['text', 'json'].includes(format)) {
95
+ failure('AGENT_CLIENT_PAYLOAD_INVALID', 'model-selection requires a known --client and text|json format');
96
+ return;
97
+ }
98
+ const context = getAgentClientModelSelection(client);
99
+ if (format === 'json') {
100
+ process.stdout.write(`${JSON.stringify({
101
+ status: 'resolved', changed: false, client, context, error: null
102
+ })}\n`);
103
+ return;
104
+ }
105
+ if (context.kind === 'interactive-only') {
106
+ process.stdout.write(`Model selection: interactive-only\nCommand: ${context.command}\n${context.guidance}\n`);
107
+ }
108
+ else {
109
+ process.stdout.write(`Model selection: ${context.completeness} catalog\nSource: ${context.source}\n`);
110
+ for (const model of context.models) {
111
+ const efforts = model.reasoningEfforts?.length
112
+ ? ` (${model.reasoningEfforts.join(', ')})`
113
+ : '';
114
+ process.stdout.write(`- ${model.id}${efforts}\n`);
115
+ }
116
+ if (context.guidance)
117
+ process.stdout.write(`${context.guidance}\n`);
118
+ }
119
+ return;
120
+ }
121
+ const parsed = parseArgs(args);
122
+ if (!parsed || process.exitCode)
123
+ return;
124
+ let config;
125
+ try {
126
+ const configPath = path.join(process.cwd(), '.agents', '.airc.json');
127
+ const raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
128
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
129
+ throw new Error('configuration root must be an object');
130
+ }
131
+ config = raw;
132
+ }
133
+ catch (error) {
134
+ failure('AGENT_CLIENT_CONFIG_INVALID', String(error));
135
+ return;
136
+ }
137
+ try {
138
+ const clients = normalizeAgentClients(config);
139
+ const custom = normalizeCustomTUIs(process.cwd(), config.customTUIs ?? []);
140
+ const commands = renderNextStepCommands({
141
+ projectName: String(config.project ?? ''),
142
+ state: clients.state,
143
+ customTUIs: custom.items,
144
+ skillName: parsed.skillName,
145
+ ...(parsed.taskRef ? { taskRef: parsed.taskRef } : {}),
146
+ ...(parsed.version ? { version: parsed.version } : {})
147
+ });
148
+ if (parsed.format === 'json') {
149
+ process.stdout.write(`${JSON.stringify({
150
+ status: 'rendered',
151
+ changed: false,
152
+ commands,
153
+ diagnostics: custom.diagnostics,
154
+ error: null
155
+ })}\n`);
156
+ return;
157
+ }
158
+ for (const command of commands) {
159
+ process.stdout.write(` - ${command.displayName}: ${command.command}\n`);
160
+ }
161
+ for (const diagnostic of custom.diagnostics) {
162
+ process.stderr.write(`${diagnostic.code} at ${diagnostic.path}\n`);
163
+ }
164
+ }
165
+ catch (error) {
166
+ if (error instanceof AgentClientConfigError) {
167
+ failure(error.code, error.message);
168
+ return;
169
+ }
170
+ failure('AGENT_CLIENT_RENDER_INVALID', error instanceof Error ? error.message : String(error));
171
+ }
172
+ }
173
+ export { agentClient };
174
+ //# sourceMappingURL=agent-client.js.map
@@ -1,5 +1,5 @@
1
1
  import fs from 'node:fs';
2
- import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/workflow.js';
2
+ import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs, pushRebasedBranch } from '../git/workflow.js';
3
3
  import { compareReviewTrees, snapshotReview } from '../git/review-snapshot.js';
4
4
  import { resolvePostReviewGlobs } from '../task/review-fingerprint.js';
5
5
  function output(value) { process.stdout.write(`${JSON.stringify(value)}\n`); }
@@ -23,13 +23,18 @@ function gitWorkflow(args = []) {
23
23
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
24
24
  result = input ? pushGitRefs({ cwd: cwd ?? process.cwd(), ...input }) : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
25
25
  }
26
+ else if (action === 'push-rebased') {
27
+ const inputIndex = rest.indexOf('--input');
28
+ const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
29
+ result = input ? pushRebasedBranch({ cwd: cwd ?? process.cwd(), ...input }) : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
30
+ }
26
31
  else if (action === 'snapshot' || action === 'compare-trees') {
27
32
  const inputIndex = rest.indexOf('--input');
28
33
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
29
34
  if (!input)
30
35
  result = { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
31
36
  else if (action === 'snapshot')
32
- result = { status: 'no-op', changed: false, snapshot: snapshotReview({ cwd: cwd ?? process.cwd(), mode: input.mode, baseline: input.baseline, globs: input.globs ?? resolvePostReviewGlobs({}, {}) }), error: null };
37
+ result = { status: 'no-op', changed: false, snapshot: snapshotReview({ cwd: cwd ?? process.cwd(), mode: input.mode, baseline: input.baseline, diffBase: input.diffBase, globs: input.globs ?? resolvePostReviewGlobs({}, {}) }), error: null };
33
38
  else
34
39
  result = { status: 'no-op', changed: false, comparison: compareReviewTrees({ cwd: cwd ?? process.cwd(), expected: input.expected, actual: input.actual }), error: null };
35
40
  }
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { fetchPlatformCheckLogs, inspectRequiredChecks, resolvePlatformCheckRun, watchPlatformChecks } from '../platform/pr-checks.js';
2
+ import { fetchPlatformCheckLogs, inspectPullRequestReadiness, resolvePlatformCheckRun, watchPullRequestReadiness } from '../platform/pr-checks.js';
3
3
  const USAGE = `Usage: agent-infra-internal platform-checks inspect <task-ref> [--cwd <path>]
4
4
  agent-infra-internal platform-checks watch <task-ref> --interval-seconds <N> --deadline-seconds <N> [--cwd <path>]
5
5
  agent-infra-internal platform-checks resolve-run <task-ref> --check-name <name> [--details-url <url>] [--cwd <path>]
@@ -76,7 +76,7 @@ async function platformChecks(args = []) {
76
76
  return;
77
77
  }
78
78
  if (operation === 'inspect') {
79
- finish(inspectRequiredChecks(taskRef, { cwd }));
79
+ finish(inspectPullRequestReadiness(taskRef, { cwd }));
80
80
  return;
81
81
  }
82
82
  if (operation === 'resolve-run') {
@@ -108,7 +108,7 @@ async function platformChecks(args = []) {
108
108
  process.once('SIGINT', abort);
109
109
  process.once('SIGTERM', abort);
110
110
  try {
111
- finish(await watchPlatformChecks(taskRef, { cwd, intervalSeconds, deadlineSeconds, signal: controller.signal }));
111
+ finish(await watchPullRequestReadiness(taskRef, { cwd, intervalSeconds, deadlineSeconds, signal: controller.signal }));
112
112
  }
113
113
  finally {
114
114
  process.removeListener('SIGINT', abort);