@fitlab-ai/agent-infra 0.9.12 → 0.9.14

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 (402) hide show
  1. package/README.md +11 -11
  2. package/README.zh-CN.md +11 -11
  3. package/bin/cli.ts +26 -9
  4. package/dist/bin/cli.js +173 -157
  5. package/dist/bin/internal-cli.js +66 -40
  6. package/dist/lib/agent-client.js +5 -0
  7. package/dist/lib/agent-clients/next-steps.js +6 -1
  8. package/dist/lib/decide.js +3 -3
  9. package/dist/lib/internal/agent-client.js +5 -2
  10. package/dist/lib/internal/cli-route-inventory.js +152 -0
  11. package/dist/lib/internal/codex-lifecycle.js +9 -6
  12. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  13. package/dist/lib/internal/git-workflow.js +10 -6
  14. package/dist/lib/internal/platform-checks.js +19 -7
  15. package/dist/lib/internal/platform-comment.js +25 -13
  16. package/dist/lib/internal/platform-context.js +6 -3
  17. package/dist/lib/internal/platform-issue.js +20 -13
  18. package/dist/lib/internal/platform-metadata.js +88 -0
  19. package/dist/lib/internal/platform-pr-review.js +26 -13
  20. package/dist/lib/internal/platform-pr.js +84 -31
  21. package/dist/lib/internal/platform-release-notes.js +9 -6
  22. package/dist/lib/internal/platform-security.js +93 -0
  23. package/dist/lib/internal/pr-review-grade.js +25 -12
  24. package/dist/lib/internal/release-workflow.js +23 -9
  25. package/dist/lib/internal/sandbox-control.js +50 -7
  26. package/dist/lib/internal/task-activity.js +16 -7
  27. package/dist/lib/internal/task-artifact.js +235 -24
  28. package/dist/lib/internal/task-context.js +4 -1
  29. package/dist/lib/internal/task-create.js +50 -17
  30. package/dist/lib/internal/task-delivery.js +4 -1
  31. package/dist/lib/internal/task-event.js +10 -4
  32. package/dist/lib/internal/task-finalization.js +6 -3
  33. package/dist/lib/internal/task-invalidation.js +63 -0
  34. package/dist/lib/internal/task-ledger.js +20 -6
  35. package/dist/lib/internal/task-lifecycle.js +6 -3
  36. package/dist/lib/internal/task-operation-registry.js +421 -0
  37. package/dist/lib/internal/task-orchestration.js +12 -0
  38. package/dist/lib/internal/task-override.js +14 -7
  39. package/dist/lib/internal/task-qualification.js +90 -0
  40. package/dist/lib/internal/task-review.js +7 -4
  41. package/dist/lib/internal/task-short-id.js +11 -1
  42. package/dist/lib/internal/task-snapshot.js +4 -1
  43. package/dist/lib/internal/task-validate.js +7 -2
  44. package/dist/lib/internal/task-verify.js +11 -7
  45. package/dist/lib/internal/task-warning.js +11 -4
  46. package/dist/lib/platform/adapters.js +1 -3
  47. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  48. package/dist/lib/platform/comment-safety.js +226 -0
  49. package/dist/lib/platform/completion-backfill.js +6 -5
  50. package/dist/lib/platform/context.js +70 -130
  51. package/dist/lib/platform/github-client.js +1 -1
  52. package/dist/lib/platform/github-provider.js +1130 -0
  53. package/dist/lib/platform/in-label-sync.js +143 -0
  54. package/dist/lib/platform/issue-comments.js +237 -72
  55. package/dist/lib/platform/issues.js +335 -189
  56. package/dist/lib/platform/metadata-labels.js +6 -2
  57. package/dist/lib/platform/none-provider.js +28 -0
  58. package/dist/lib/platform/pr-change-report.js +545 -0
  59. package/dist/lib/platform/pr-checks.js +119 -104
  60. package/dist/lib/platform/pr-review.js +88 -72
  61. package/dist/lib/platform/pr-summary.js +541 -50
  62. package/dist/lib/platform/provider-bridge.js +45 -0
  63. package/dist/lib/platform/provider-contract.d.ts +553 -0
  64. package/dist/lib/platform/provider-contract.js +99 -0
  65. package/dist/lib/platform/provider-loader.js +251 -0
  66. package/dist/lib/platform/provider-validation.js +577 -0
  67. package/dist/lib/platform/pull-request-metadata.js +8 -6
  68. package/dist/lib/platform/pull-requests.js +734 -543
  69. package/dist/lib/platform/release-notes.js +78 -55
  70. package/dist/lib/platform/releases.js +79 -50
  71. package/dist/lib/platform/repository-metadata.js +377 -0
  72. package/dist/lib/platform/resource-identity.d.ts +26 -0
  73. package/dist/lib/platform/resource-identity.js +92 -0
  74. package/dist/lib/platform/security-alerts.js +155 -0
  75. package/dist/lib/platform/task-identities.js +31 -0
  76. package/dist/lib/platform/verification-required.js +11 -12
  77. package/dist/lib/platform/verification-sync.js +129 -248
  78. package/dist/lib/pr-review/evidence-grading.js +19 -6
  79. package/dist/lib/process-data/index.js +7 -0
  80. package/dist/lib/run/index.js +68 -23
  81. package/dist/lib/sandbox/commands/control-status.js +22 -0
  82. package/dist/lib/sandbox/commands/create.js +32 -6
  83. package/dist/lib/sandbox/commands/ls.js +5 -0
  84. package/dist/lib/sandbox/commands/rm.js +827 -120
  85. package/dist/lib/sandbox/commands/show.js +16 -0
  86. package/dist/lib/sandbox/control/client.js +174 -19
  87. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  88. package/dist/lib/sandbox/control/container-identity.js +28 -31
  89. package/dist/lib/sandbox/control/executor.js +151 -16
  90. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  91. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  92. package/dist/lib/sandbox/control/protocol.js +77 -0
  93. package/dist/lib/sandbox/control/server.js +677 -34
  94. package/dist/lib/sandbox/control/state.js +209 -4
  95. package/dist/lib/sandbox/control/task-view.js +183 -0
  96. package/dist/lib/sandbox/engines/authority.js +289 -0
  97. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  98. package/dist/lib/sandbox/index.js +5 -0
  99. package/dist/lib/sandbox/recovery.js +21 -1
  100. package/dist/lib/sandbox/workspace-view.js +2 -1
  101. package/dist/lib/sandbox/worktree-safety.js +4 -1
  102. package/dist/lib/server/index.js +8 -0
  103. package/dist/lib/server/protocol.js +38 -1
  104. package/dist/lib/task/activity-log.js +8 -1
  105. package/dist/lib/task/artifact-lifecycle.js +75 -18
  106. package/dist/lib/task/artifact-operations.js +520 -0
  107. package/dist/lib/task/artifact-repair-intent.js +59 -0
  108. package/dist/lib/task/artifact-schema.js +135 -0
  109. package/dist/lib/task/capabilities.js +310 -0
  110. package/dist/lib/task/commands/status.js +32 -0
  111. package/dist/lib/task/commit-operation.js +12 -1
  112. package/dist/lib/task/control-authority.js +12 -5
  113. package/dist/lib/task/create-service.js +111 -12
  114. package/dist/lib/task/create.js +25 -0
  115. package/dist/lib/task/current-contract.js +5 -1
  116. package/dist/lib/task/decision-details.js +1 -1
  117. package/dist/lib/task/events.js +416 -17
  118. package/dist/lib/task/finalization.js +37 -13
  119. package/dist/lib/task/human-override.js +58 -36
  120. package/dist/lib/task/index.js +11 -3
  121. package/dist/lib/task/invalidation-command.js +86 -0
  122. package/dist/lib/task/invalidation.js +260 -0
  123. package/dist/lib/task/ledger-intents.js +37 -0
  124. package/dist/lib/task/local-artifact-finalization.js +299 -0
  125. package/dist/lib/task/orchestration.js +240 -144
  126. package/dist/lib/task/pr-delivery-fact.js +102 -101
  127. package/dist/lib/task/qualification-audit.js +490 -0
  128. package/dist/lib/task/qualification-confirmation.js +109 -0
  129. package/dist/lib/task/qualification-intents.js +148 -0
  130. package/dist/lib/task/review-artifacts.js +22 -23
  131. package/dist/lib/task/review-finalization.js +121 -4
  132. package/dist/lib/task/review-fingerprint.js +24 -2
  133. package/dist/lib/task/rework-intent.js +138 -0
  134. package/dist/lib/task/sections.js +6 -4
  135. package/dist/lib/task/skill-scope.js +23 -0
  136. package/dist/lib/task/task-execution-lock.js +27 -17
  137. package/dist/lib/task/verification-config.js +11 -0
  138. package/dist/lib/task/verification-engine.js +93 -16
  139. package/dist/lib/task/verification.js +3 -3
  140. package/dist/lib/task/workflow-warning-intents.js +1 -1
  141. package/dist/lib/task/write.js +11 -0
  142. package/dist/lib/version.js +11 -1
  143. package/dist/lifecycle-build-manifest.json +3 -3
  144. package/lib/agent-client.ts +9 -0
  145. package/lib/agent-clients/next-steps.ts +6 -1
  146. package/lib/decide.ts +3 -3
  147. package/lib/init.ts +1 -1
  148. package/lib/internal/agent-client.ts +4 -2
  149. package/lib/internal/cli-route-inventory.ts +140 -0
  150. package/lib/internal/codex-lifecycle.ts +8 -6
  151. package/lib/internal/codex-sandbox-controller.ts +7 -2
  152. package/lib/internal/git-workflow.ts +9 -6
  153. package/lib/internal/platform-checks.ts +14 -6
  154. package/lib/internal/platform-comment.ts +20 -12
  155. package/lib/internal/platform-context.ts +5 -3
  156. package/lib/internal/platform-issue.ts +17 -11
  157. package/lib/internal/platform-metadata.ts +70 -0
  158. package/lib/internal/platform-pr-review.ts +23 -12
  159. package/lib/internal/platform-pr.ts +65 -27
  160. package/lib/internal/platform-release-notes.ts +8 -6
  161. package/lib/internal/platform-security.ts +83 -0
  162. package/lib/internal/pr-review-grade.ts +20 -11
  163. package/lib/internal/release-workflow.ts +21 -9
  164. package/lib/internal/sandbox-control.ts +44 -6
  165. package/lib/internal/task-activity.ts +15 -7
  166. package/lib/internal/task-artifact.ts +204 -22
  167. package/lib/internal/task-context.ts +3 -1
  168. package/lib/internal/task-create.ts +78 -17
  169. package/lib/internal/task-delivery.ts +3 -1
  170. package/lib/internal/task-event.ts +9 -4
  171. package/lib/internal/task-finalization.ts +6 -4
  172. package/lib/internal/task-invalidation.ts +41 -0
  173. package/lib/internal/task-ledger.ts +21 -8
  174. package/lib/internal/task-lifecycle.ts +5 -3
  175. package/lib/internal/task-operation-registry.ts +482 -0
  176. package/lib/internal/task-orchestration.ts +12 -0
  177. package/lib/internal/task-override.ts +15 -9
  178. package/lib/internal/task-qualification.ts +61 -0
  179. package/lib/internal/task-review.ts +6 -4
  180. package/lib/internal/task-short-id.ts +10 -1
  181. package/lib/internal/task-snapshot.ts +3 -1
  182. package/lib/internal/task-validate.ts +6 -2
  183. package/lib/internal/task-verify.ts +10 -7
  184. package/lib/internal/task-warning.ts +10 -4
  185. package/lib/platform/adapters.ts +3 -2
  186. package/lib/platform/change-request-git-evidence.ts +36 -9
  187. package/lib/platform/comment-safety.ts +250 -0
  188. package/lib/platform/completion-backfill.ts +9 -8
  189. package/lib/platform/context.ts +97 -134
  190. package/lib/platform/github-client.ts +2 -2
  191. package/lib/platform/github-provider.ts +1132 -0
  192. package/lib/platform/in-label-sync.ts +208 -0
  193. package/lib/platform/issue-comments.ts +255 -80
  194. package/lib/platform/issues.ts +344 -174
  195. package/lib/platform/metadata-labels.ts +5 -2
  196. package/lib/platform/none-provider.ts +35 -0
  197. package/lib/platform/pr-change-report.ts +639 -0
  198. package/lib/platform/pr-checks.ts +126 -106
  199. package/lib/platform/pr-review.ts +88 -85
  200. package/lib/platform/pr-summary.ts +581 -53
  201. package/lib/platform/provider-bridge.ts +82 -0
  202. package/lib/platform/provider-contract.ts +611 -0
  203. package/lib/platform/provider-loader.ts +307 -0
  204. package/lib/platform/provider-validation.ts +611 -0
  205. package/lib/platform/pull-request-metadata.ts +10 -7
  206. package/lib/platform/pull-requests.ts +781 -550
  207. package/lib/platform/release-notes.ts +76 -59
  208. package/lib/platform/releases.ts +77 -43
  209. package/lib/platform/repository-metadata.ts +453 -0
  210. package/lib/platform/resource-identity.ts +121 -0
  211. package/lib/platform/security-alerts.ts +191 -0
  212. package/lib/platform/task-identities.ts +40 -0
  213. package/lib/platform/types.ts +4 -2
  214. package/lib/platform/verification-required.ts +11 -13
  215. package/lib/platform/verification-sync.ts +128 -304
  216. package/lib/pr-review/evidence-grading.ts +25 -8
  217. package/lib/process-data/index.ts +7 -0
  218. package/lib/run/index.ts +62 -22
  219. package/lib/sandbox/commands/control-status.ts +26 -0
  220. package/lib/sandbox/commands/create.ts +46 -6
  221. package/lib/sandbox/commands/ls.ts +7 -0
  222. package/lib/sandbox/commands/rm.ts +1000 -87
  223. package/lib/sandbox/commands/show.ts +16 -0
  224. package/lib/sandbox/control/client.ts +203 -19
  225. package/lib/sandbox/control/completed-reentry.ts +98 -0
  226. package/lib/sandbox/control/container-identity.ts +27 -43
  227. package/lib/sandbox/control/executor.ts +180 -15
  228. package/lib/sandbox/control/lifecycle.ts +629 -17
  229. package/lib/sandbox/control/native-file-lock.ts +209 -0
  230. package/lib/sandbox/control/protocol.ts +118 -2
  231. package/lib/sandbox/control/server.ts +724 -34
  232. package/lib/sandbox/control/state.ts +257 -4
  233. package/lib/sandbox/control/task-view.ts +240 -0
  234. package/lib/sandbox/engines/authority.ts +365 -0
  235. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  236. package/lib/sandbox/index.ts +7 -0
  237. package/lib/sandbox/recovery.ts +21 -1
  238. package/lib/sandbox/workspace-view.ts +9 -3
  239. package/lib/sandbox/worktree-safety.ts +4 -1
  240. package/lib/server/index.ts +10 -0
  241. package/lib/server/protocol.ts +36 -1
  242. package/lib/task/activity-log.ts +8 -0
  243. package/lib/task/artifact-lifecycle.ts +70 -22
  244. package/lib/task/artifact-operations.ts +626 -0
  245. package/lib/task/artifact-repair-intent.ts +71 -0
  246. package/lib/task/artifact-schema.ts +192 -0
  247. package/lib/task/capabilities.ts +331 -0
  248. package/lib/task/commands/status.ts +38 -0
  249. package/lib/task/commit-operation.ts +12 -1
  250. package/lib/task/control-authority.ts +22 -9
  251. package/lib/task/create-service.ts +139 -14
  252. package/lib/task/create.ts +27 -0
  253. package/lib/task/current-contract.ts +6 -1
  254. package/lib/task/decision-details.ts +6 -2
  255. package/lib/task/events.ts +392 -16
  256. package/lib/task/finalization.ts +50 -14
  257. package/lib/task/human-override.ts +70 -46
  258. package/lib/task/index.ts +16 -3
  259. package/lib/task/invalidation-command.ts +86 -0
  260. package/lib/task/invalidation.ts +332 -0
  261. package/lib/task/ledger-intents.ts +35 -1
  262. package/lib/task/local-artifact-finalization.ts +432 -0
  263. package/lib/task/orchestration.ts +223 -133
  264. package/lib/task/pr-delivery-fact.ts +131 -148
  265. package/lib/task/qualification-audit.ts +599 -0
  266. package/lib/task/qualification-confirmation.ts +117 -0
  267. package/lib/task/qualification-intents.ts +150 -0
  268. package/lib/task/review-artifacts.ts +21 -22
  269. package/lib/task/review-finalization.ts +133 -4
  270. package/lib/task/review-fingerprint.ts +23 -2
  271. package/lib/task/rework-intent.ts +165 -0
  272. package/lib/task/sections.ts +6 -4
  273. package/lib/task/skill-scope.ts +24 -0
  274. package/lib/task/task-execution-lock.ts +23 -14
  275. package/lib/task/verification-config.ts +12 -0
  276. package/lib/task/verification-engine.ts +103 -17
  277. package/lib/task/verification.ts +4 -4
  278. package/lib/task/workflow-warning-intents.ts +1 -1
  279. package/lib/task/write.ts +19 -0
  280. package/lib/update.ts +1 -1
  281. package/lib/version.ts +15 -1
  282. package/package.json +12 -1
  283. package/templates/.agents/rules/README.en.md +3 -1
  284. package/templates/.agents/rules/README.zh-CN.md +3 -1
  285. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  286. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  287. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  288. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  289. package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
  290. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  291. package/templates/.agents/rules/issue-sync.en.md +2 -0
  292. package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
  293. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  294. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  295. package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
  296. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
  297. package/templates/.agents/rules/pr-sync.en.md +10 -4
  298. package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
  299. package/templates/.agents/rules/security-alerts.en.md +8 -8
  300. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  301. package/templates/.agents/rules/task-short-id.en.md +1 -4
  302. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  303. package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
  304. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
  305. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  306. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  307. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  308. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  309. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  310. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  311. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
  314. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
  315. package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
  316. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
  317. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  318. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  319. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  320. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  321. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  322. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  323. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  324. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  325. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  326. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  327. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
  328. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
  329. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
  330. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
  331. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  332. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  333. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
  334. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
  335. package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
  336. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
  337. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
  338. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
  339. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  340. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  341. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  342. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  343. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  344. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  345. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  346. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  347. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  348. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  349. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  350. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  351. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  352. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  353. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  354. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  355. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  356. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  357. package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
  358. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
  359. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  360. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  361. package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
  362. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
  363. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  364. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  365. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  366. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  367. package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
  368. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
  369. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  370. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  371. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  372. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  373. package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
  374. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
  375. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  376. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  377. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  378. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  379. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  380. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  381. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  382. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  383. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
  384. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
  385. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  386. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  387. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  388. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  389. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  390. package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
  391. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
  392. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  393. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  394. package/templates/.agents/templates/task.en.md +24 -1
  395. package/templates/.agents/templates/task.zh-CN.md +24 -1
  396. package/templates/.github/workflows/pr-label.yml +7 -26
  397. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  398. package/templates/.agents/scripts/security-alerts.sh +0 -31
  399. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  400. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  401. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  402. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -1,5 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { fetchPlatformCheckLogs, inspectPullRequestReadiness, resolvePlatformCheckRun, watchPullRequestReadiness } from '../platform/pr-checks.js';
3
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
3
4
  const USAGE = `Usage: agent-infra-internal platform-checks inspect <task-ref> [--cwd <path>]
4
5
  agent-infra-internal platform-checks watch <task-ref> --interval-seconds <N> --deadline-seconds <N> [--cwd <path>]
5
6
  agent-infra-internal platform-checks resolve-run <task-ref> --check-name <name> [--details-url <url>] [--cwd <path>]
@@ -43,12 +44,19 @@ function positive(value) {
43
44
  return Number.isFinite(number) && number > 0 ? number : null;
44
45
  }
45
46
  async function platformChecks(args = []) {
47
+ if (!ensureInternalHandlerRoute('platform-checks', args))
48
+ return;
46
49
  if (args[0] === '--help' || args[0] === '-h') {
47
50
  process.stdout.write(USAGE);
48
51
  return;
49
52
  }
50
53
  const operation = args[0];
51
- if (!operation || !['inspect', 'watch', 'resolve-run', 'logs'].includes(operation)) {
54
+ if (!operation || ![
55
+ internalHandlerRoute('platform-checks', 'inspect', operation),
56
+ internalHandlerRoute('platform-checks', 'watch', operation),
57
+ internalHandlerRoute('platform-checks', 'resolve-run', operation),
58
+ internalHandlerRoute('platform-checks', 'logs', operation)
59
+ ].some(Boolean)) {
52
60
  fail('a valid operation is required');
53
61
  return;
54
62
  }
@@ -75,26 +83,30 @@ async function platformChecks(args = []) {
75
83
  fail(`${operation} does not accept --${unexpected}`);
76
84
  return;
77
85
  }
78
- if (operation === 'inspect') {
79
- finish(inspectPullRequestReadiness(taskRef, { cwd }));
86
+ if (internalHandlerRoute('platform-checks', 'inspect', operation)) {
87
+ finish(await inspectPullRequestReadiness(taskRef, { cwd }));
80
88
  return;
81
89
  }
82
- if (operation === 'resolve-run') {
90
+ if (internalHandlerRoute('platform-checks', 'resolve-run', operation)) {
83
91
  if (!values.checkName) {
84
92
  fail('resolve-run requires --check-name');
85
93
  return;
86
94
  }
87
- finish(resolvePlatformCheckRun(taskRef, { cwd, checkName: values.checkName, detailsUrl: values.detailsUrl }));
95
+ finish(await resolvePlatformCheckRun(taskRef, { cwd, checkName: values.checkName, detailsUrl: values.detailsUrl }));
88
96
  return;
89
97
  }
90
- if (operation === 'logs') {
98
+ if (internalHandlerRoute('platform-checks', 'logs', operation)) {
91
99
  const run = positive(values.run);
92
100
  const job = values.job === undefined ? undefined : positive(values.job);
93
101
  if (!run || values.job !== undefined && !job) {
94
102
  fail('logs requires a positive --run and optional positive --job');
95
103
  return;
96
104
  }
97
- finish(fetchPlatformCheckLogs(taskRef, { cwd, run, job: job || undefined }));
105
+ finish(await fetchPlatformCheckLogs(taskRef, { cwd, run, job: job || undefined }));
106
+ return;
107
+ }
108
+ if (!internalHandlerRoute('platform-checks', 'watch', operation)) {
109
+ fail('operation is not registered');
98
110
  return;
99
111
  }
100
112
  const intervalSeconds = positive(values.intervalSeconds);
@@ -3,7 +3,8 @@ import path from 'node:path';
3
3
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
4
4
  import { checkPlatformCommentOwner, listPlatformComments, syncPlatformComment } from '../platform/issue-comments.js';
5
5
  import { backfillCompletionComments } from '../platform/completion-backfill.js';
6
- const USAGE = `Usage: agent-infra-internal platform-comment list --issue <N> [--cwd <path>]
6
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
7
+ const USAGE = `Usage: agent-infra-internal platform-comment list --issue <token> [--cwd <path>]
7
8
  agent-infra-internal platform-comment owner <task-ref> [--cwd <path>]
8
9
  agent-infra-internal platform-comment backfill <task-ref> --agent <agent> [--cwd <path>]
9
10
  agent-infra-internal platform-comment sync <task-ref> --kind <kind> --agent <agent> [--artifact <file>] [--body-file <path|->] [--status-label <label>] [--backfill] [--cwd <path>]
@@ -47,13 +48,20 @@ function readBodyFile(value, cwd) {
47
48
  return fs.readFileSync(0, 'utf8');
48
49
  return fs.readFileSync(path.resolve(cwd, value), 'utf8');
49
50
  }
50
- function platformComment(args = []) {
51
+ async function platformComment(args = []) {
52
+ if (!ensureInternalHandlerRoute('platform-comment', args))
53
+ return;
51
54
  if (args[0] === '--help' || args[0] === '-h') {
52
55
  process.stdout.write(USAGE);
53
56
  return;
54
57
  }
55
58
  const operation = args[0];
56
- if (!operation || !['list', 'owner', 'backfill', 'sync'].includes(operation)) {
59
+ if (!operation || ![
60
+ internalHandlerRoute('platform-comment', 'list', operation),
61
+ internalHandlerRoute('platform-comment', 'owner', operation),
62
+ internalHandlerRoute('platform-comment', 'backfill', operation),
63
+ internalHandlerRoute('platform-comment', 'sync', operation)
64
+ ].some(Boolean)) {
57
65
  fail('a valid operation is required');
58
66
  return;
59
67
  }
@@ -69,10 +77,10 @@ function platformComment(args = []) {
69
77
  return;
70
78
  }
71
79
  const cwd = path.resolve(typeof parsed.values.cwd === 'string' ? parsed.values.cwd : process.cwd());
72
- if (operation === 'list') {
73
- const issue = Number(parsed.values.issue);
74
- if (!Number.isInteger(issue) || issue <= 0) {
75
- fail('list requires a positive --issue');
80
+ if (internalHandlerRoute('platform-comment', 'list', operation)) {
81
+ const issue = parsed.values.issue;
82
+ if (typeof issue !== 'string' || !issue) {
83
+ fail('list requires --issue <token>');
76
84
  return;
77
85
  }
78
86
  const unexpected = Object.keys(parsed.values).find((key) => !['issue', 'cwd'].includes(key));
@@ -80,19 +88,19 @@ function platformComment(args = []) {
80
88
  fail(`list does not accept '--${unexpected}'`);
81
89
  return;
82
90
  }
83
- finish(listPlatformComments(issue, cwd));
91
+ finish(await listPlatformComments(issue, cwd));
84
92
  return;
85
93
  }
86
- if (operation === 'owner') {
94
+ if (internalHandlerRoute('platform-comment', 'owner', operation)) {
87
95
  const unexpected = Object.keys(parsed.values).find((key) => key !== 'cwd');
88
96
  if (unexpected) {
89
97
  fail(`owner does not accept '--${unexpected}'`);
90
98
  return;
91
99
  }
92
- finish(checkPlatformCommentOwner(taskRef, { cwd }));
100
+ finish(await checkPlatformCommentOwner(taskRef, { cwd }));
93
101
  return;
94
102
  }
95
- if (operation === 'backfill') {
103
+ if (internalHandlerRoute('platform-comment', 'backfill', operation)) {
96
104
  const unexpected = Object.keys(parsed.values).find((key) => !['cwd', 'agent'].includes(key));
97
105
  if (unexpected) {
98
106
  fail(`backfill does not accept '--${unexpected}'`);
@@ -108,7 +116,11 @@ function platformComment(args = []) {
108
116
  fail(`invalid --agent '${agent}': ${AGENT_USAGE_HINT}`);
109
117
  return;
110
118
  }
111
- finish(backfillCompletionComments(taskRef, { cwd, agent: normalizedAgent }));
119
+ finish(await backfillCompletionComments(taskRef, { cwd, agent: normalizedAgent }));
120
+ return;
121
+ }
122
+ if (!internalHandlerRoute('platform-comment', 'sync', operation)) {
123
+ fail('operation is not registered');
112
124
  return;
113
125
  }
114
126
  const kind = parsed.values.kind;
@@ -143,7 +155,7 @@ function platformComment(args = []) {
143
155
  fail(`unable to read body file: ${error instanceof Error ? error.message : String(error)}`);
144
156
  return;
145
157
  }
146
- finish(syncPlatformComment(taskRef, {
158
+ finish(await syncPlatformComment(taskRef, {
147
159
  kind: kind,
148
160
  agent: normalizedAgent,
149
161
  artifact: typeof parsed.values.artifact === 'string' ? parsed.values.artifact : undefined,
@@ -1,17 +1,20 @@
1
1
  import path from 'node:path';
2
2
  import { resolvePlatformContext } from '../platform/context.js';
3
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
3
4
  const USAGE = 'Usage: agent-infra-internal platform-context resolve [--cwd <path>]\n';
4
5
  function fail(message) {
5
6
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'PLATFORM_PAYLOAD_INVALID', message } })}\n`);
6
7
  process.stderr.write(USAGE);
7
8
  process.exitCode = 1;
8
9
  }
9
- function platformContext(args = []) {
10
+ async function platformContext(args = []) {
11
+ if (!ensureInternalHandlerRoute('platform-context', args))
12
+ return;
10
13
  if (args[0] === '--help' || args[0] === '-h') {
11
14
  process.stdout.write(USAGE);
12
15
  return;
13
16
  }
14
- if (args[0] !== 'resolve') {
17
+ if (!internalHandlerRoute('platform-context', 'resolve', args[0] ?? '')) {
15
18
  fail("operation must be 'resolve'");
16
19
  return;
17
20
  }
@@ -35,7 +38,7 @@ function platformContext(args = []) {
35
38
  seen.add(flag);
36
39
  cwd = path.resolve(value);
37
40
  }
38
- const result = resolvePlatformContext({ cwd });
41
+ const result = await resolvePlatformContext({ cwd });
39
42
  process.stdout.write(`${JSON.stringify(result)}\n`);
40
43
  if (result.status === 'failed')
41
44
  process.exitCode = 1;
@@ -1,9 +1,10 @@
1
1
  import path from 'node:path';
2
2
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
3
3
  import { bindPlatformIssue, createPlatformIssue, inspectPlatformIssue, syncPlatformIssue } from '../platform/issues.js';
4
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
4
5
  const USAGE = `Usage: agent-infra-internal platform-issue inspect <task-ref> [--cwd <path>]
5
6
  agent-infra-internal platform-issue create <task-ref> --agent <agent> [--dry-run] [--cwd <path>]
6
- agent-infra-internal platform-issue bind <task-ref> --issue <N> --agent <agent> [--dry-run] [--cwd <path>]
7
+ agent-infra-internal platform-issue bind <task-ref> --issue <token> --agent <agent> [--dry-run] [--cwd <path>]
7
8
  agent-infra-internal platform-issue sync <task-ref> --agent <agent> [--status <suffix|none>] [--assignees current|none] [--milestone initial|specific|none] [--issue-type] [--fields] [--requirements] [--in-labels from-diff|none] [--base <branch>] [--state open|closed] [--close-reason completed|not_planned] [--dry-run] [--cwd <path>]
8
9
  `;
9
10
  const BOOLEAN_FLAGS = new Set(['--dry-run', '--issue-type', '--fields', '--requirements']);
@@ -54,13 +55,20 @@ function oneOf(values, name, allowed) {
54
55
  throw new Error(`--${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)} must be one of ${allowed.join('|')}`);
55
56
  return value;
56
57
  }
57
- function platformIssue(args = []) {
58
+ async function platformIssue(args = []) {
59
+ if (!ensureInternalHandlerRoute('platform-issue', args))
60
+ return;
58
61
  if (args[0] === '--help' || args[0] === '-h') {
59
62
  process.stdout.write(USAGE);
60
63
  return;
61
64
  }
62
65
  const operation = args[0];
63
- if (!operation || !['inspect', 'create', 'bind', 'sync'].includes(operation)) {
66
+ if (!operation || ![
67
+ internalHandlerRoute('platform-issue', 'inspect', operation),
68
+ internalHandlerRoute('platform-issue', 'create', operation),
69
+ internalHandlerRoute('platform-issue', 'bind', operation),
70
+ internalHandlerRoute('platform-issue', 'sync', operation)
71
+ ].some(Boolean)) {
64
72
  fail('a valid operation is required');
65
73
  return;
66
74
  }
@@ -85,8 +93,8 @@ function platformIssue(args = []) {
85
93
  fail(`${operation} does not accept --${unexpected}`);
86
94
  return;
87
95
  }
88
- if (operation === 'inspect') {
89
- finish(inspectPlatformIssue(taskRef, { cwd }));
96
+ if (internalHandlerRoute('platform-issue', 'inspect', operation)) {
97
+ finish(await inspectPlatformIssue(taskRef, { cwd }));
90
98
  return;
91
99
  }
92
100
  if (typeof values.agent !== 'string' || !values.agent) {
@@ -99,17 +107,16 @@ function platformIssue(args = []) {
99
107
  return;
100
108
  }
101
109
  values.agent = agent;
102
- if (operation === 'create') {
103
- finish(createPlatformIssue(taskRef, { cwd, agent: values.agent, dryRun: values.dryRun === true }));
110
+ if (internalHandlerRoute('platform-issue', 'create', operation)) {
111
+ finish(await createPlatformIssue(taskRef, { cwd, agent: values.agent, dryRun: values.dryRun === true }));
104
112
  return;
105
113
  }
106
- if (operation === 'bind') {
107
- const issue = Number(values.issue);
108
- if (!Number.isInteger(issue) || issue <= 0) {
109
- fail('bind requires a positive --issue');
114
+ if (internalHandlerRoute('platform-issue', 'bind', operation)) {
115
+ if (typeof values.issue !== 'string' || !values.issue) {
116
+ fail('bind requires --issue <token>');
110
117
  return;
111
118
  }
112
- finish(bindPlatformIssue(taskRef, { cwd, agent: values.agent, issue, dryRun: values.dryRun === true }));
119
+ finish(await bindPlatformIssue(taskRef, { cwd, agent: values.agent, issue: values.issue, dryRun: values.dryRun === true }));
113
120
  return;
114
121
  }
115
122
  try {
@@ -127,7 +134,7 @@ function platformIssue(args = []) {
127
134
  const desiredKeys = ['status', 'assignees', 'milestone', 'issueType', 'fields', 'requirements', 'inLabels', 'state'];
128
135
  if (!desiredKeys.some((name) => values[name] !== undefined))
129
136
  throw new Error('sync requires at least one desired-state option');
130
- finish(syncPlatformIssue(taskRef, {
137
+ finish(await syncPlatformIssue(taskRef, {
131
138
  cwd, agent: values.agent, dryRun: values.dryRun === true,
132
139
  status: typeof values.status === 'string' ? values.status : undefined,
133
140
  assignees: assignees,
@@ -0,0 +1,88 @@
1
+ import path from 'node:path';
2
+ import { initializeLabels, initializeMilestones } from '../platform/repository-metadata.js';
3
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
4
+ const USAGE = `Usage: agent-infra-internal platform-metadata init-labels [--cleanup-stale-in] [--cwd <path>]
5
+ agent-infra-internal platform-metadata init-milestones [--history] [--cwd <path>]
6
+ `;
7
+ function fail(message) {
8
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'METADATA_INPUT_INVALID', message, retryable: false } })}\n`);
9
+ process.stderr.write(USAGE);
10
+ process.exitCode = 1;
11
+ }
12
+ function finish(result, preserveMilestoneFallback = false) {
13
+ if (preserveMilestoneFallback && result.error && typeof result.error === 'object'
14
+ && result.error.code === 'PLATFORM_CAPABILITY_UNSUPPORTED') {
15
+ process.stderr.write('Milestone initialization skipped for unsupported platform.\n');
16
+ process.exitCode = 0;
17
+ return;
18
+ }
19
+ process.stdout.write(`${JSON.stringify(result)}\n`);
20
+ process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
21
+ }
22
+ function parseOptions(args) {
23
+ let cwd = process.cwd();
24
+ let cleanup = false;
25
+ let history = false;
26
+ const seen = new Set();
27
+ for (let index = 0; index < args.length; index += 1) {
28
+ const flag = args[index];
29
+ if (seen.has(flag))
30
+ return null;
31
+ seen.add(flag);
32
+ if (flag === '--cleanup-stale-in') {
33
+ cleanup = true;
34
+ continue;
35
+ }
36
+ if (flag === '--history') {
37
+ history = true;
38
+ continue;
39
+ }
40
+ if (flag === '--cwd') {
41
+ const value = args[++index];
42
+ if (!value || value.startsWith('--'))
43
+ return null;
44
+ cwd = path.resolve(value);
45
+ continue;
46
+ }
47
+ return null;
48
+ }
49
+ return { cwd: path.resolve(cwd), cleanup, history };
50
+ }
51
+ async function platformMetadata(args = []) {
52
+ if (!ensureInternalHandlerRoute('platform-metadata', args))
53
+ return;
54
+ if (args[0] === '--help' || args[0] === '-h') {
55
+ process.stdout.write(USAGE);
56
+ return;
57
+ }
58
+ const action = args[0];
59
+ if (!internalHandlerRoute('platform-metadata', 'init-labels', action ?? '')
60
+ && !internalHandlerRoute('platform-metadata', 'init-milestones', action ?? '')) {
61
+ fail('a valid operation is required');
62
+ return;
63
+ }
64
+ if (action !== 'init-labels' && action !== 'init-milestones') {
65
+ fail('a valid operation is required');
66
+ return;
67
+ }
68
+ const parsed = parseOptions(args.slice(1));
69
+ if (!parsed) {
70
+ fail('invalid metadata options');
71
+ return;
72
+ }
73
+ if (action === 'init-labels' && parsed.history) {
74
+ fail('init-labels does not accept --history');
75
+ return;
76
+ }
77
+ if (action === 'init-milestones' && parsed.cleanup) {
78
+ fail('init-milestones does not accept --cleanup-stale-in');
79
+ return;
80
+ }
81
+ if (action === 'init-labels') {
82
+ finish(await initializeLabels({ cleanupStaleIn: parsed.cleanup }, { cwd: parsed.cwd }));
83
+ return;
84
+ }
85
+ finish(await initializeMilestones({ history: parsed.history }, { cwd: parsed.cwd }), true);
86
+ }
87
+ export { platformMetadata };
88
+ //# sourceMappingURL=platform-metadata.js.map
@@ -2,9 +2,10 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { inspectPlatformPullRequestByNumber } from '../platform/pull-requests.js';
4
4
  import { listPrReviews, publishPrReview } from '../platform/pr-review.js';
5
- const USAGE = `Usage: agent-infra-internal platform-pr-review inspect --pr <N> [--cwd <path>]
6
- agent-infra-internal platform-pr-review list --pr <N> [--cwd <path>]
7
- agent-infra-internal platform-pr-review publish --pr <N> --scope <taskId|pr{N}> --round <N> --commit <sha> --event <COMMENT|APPROVE|REQUEST_CHANGES> --body-file <path|-> [--dry-run] [--cwd <path>]
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
6
+ const USAGE = `Usage: agent-infra-internal platform-pr-review inspect --pr <token> [--cwd <path>]
7
+ agent-infra-internal platform-pr-review list --pr <token> [--cwd <path>]
8
+ agent-infra-internal platform-pr-review publish --pr <token> --scope <taskId|pr{N}> --round <N> --commit <sha> --event <COMMENT|APPROVE|REQUEST_CHANGES> --body-file <path|-> [--dry-run] [--cwd <path>]
8
9
  `;
9
10
  const BOOLEAN_FLAGS = new Set(['--dry-run']);
10
11
  const VALUE_FLAGS = new Set(['--cwd', '--pr', '--scope', '--round', '--commit', '--event', '--body-file']);
@@ -47,13 +48,19 @@ function parse(args, start) {
47
48
  function readBodyFile(value, cwd) {
48
49
  return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
49
50
  }
50
- function platformPrReview(args = []) {
51
+ async function platformPrReview(args = []) {
52
+ if (!ensureInternalHandlerRoute('platform-pr-review', args))
53
+ return;
51
54
  if (args[0] === '--help' || args[0] === '-h') {
52
55
  process.stdout.write(USAGE);
53
56
  return;
54
57
  }
55
58
  const operation = args[0];
56
- if (!operation || !['inspect', 'list', 'publish'].includes(operation)) {
59
+ if (!operation || ![
60
+ internalHandlerRoute('platform-pr-review', 'inspect', operation),
61
+ internalHandlerRoute('platform-pr-review', 'list', operation),
62
+ operation === 'publish'
63
+ ].some(Boolean)) {
57
64
  fail('a valid operation is required');
58
65
  return;
59
66
  }
@@ -74,20 +81,21 @@ function platformPrReview(args = []) {
74
81
  fail(`${operation} does not accept --${unexpected}`);
75
82
  return;
76
83
  }
77
- const pr = Number(values.pr);
78
- if (!Number.isInteger(pr) || pr <= 0) {
79
- fail(`${operation} requires a positive --pr`);
84
+ const pr = values.pr;
85
+ if (typeof pr !== 'string' || !pr) {
86
+ fail(`${operation} requires --pr <token>`);
80
87
  return;
81
88
  }
82
- if (operation === 'inspect') {
83
- finish(inspectPlatformPullRequestByNumber(pr, { cwd }));
89
+ if (internalHandlerRoute('platform-pr-review', 'inspect', operation)) {
90
+ finish(await inspectPlatformPullRequestByNumber(pr, { cwd }));
84
91
  return;
85
92
  }
86
- if (operation === 'list') {
87
- finish(listPrReviews(pr, { cwd }));
93
+ if (internalHandlerRoute('platform-pr-review', 'list', operation)) {
94
+ finish(await listPrReviews(pr, { cwd }));
88
95
  return;
89
96
  }
90
97
  const scope = typeof values.scope === 'string' ? values.scope : '';
98
+ const publishSelector = /^TASK-\d{8}-\d{6}$/u.test(scope) ? 'publish-task' : /^pr\d+$/u.test(scope) ? 'publish-pr' : '';
91
99
  const round = Number(values.round);
92
100
  const commit = typeof values.commit === 'string' ? values.commit : '';
93
101
  const event = values.event;
@@ -95,6 +103,11 @@ function platformPrReview(args = []) {
95
103
  fail('publish requires --scope <taskId|pr{N}>');
96
104
  return;
97
105
  }
106
+ if (!internalHandlerRoute('platform-pr-review', 'publish-task', publishSelector)
107
+ && !internalHandlerRoute('platform-pr-review', 'publish-pr', publishSelector)) {
108
+ fail('publish scope is not registered');
109
+ return;
110
+ }
98
111
  if (!Number.isInteger(round) || round <= 0) {
99
112
  fail('publish requires a positive --round');
100
113
  return;
@@ -119,7 +132,7 @@ function platformPrReview(args = []) {
119
132
  fail(`unable to read body file: ${error instanceof Error ? error.message : String(error)}`);
120
133
  return;
121
134
  }
122
- finish(publishPrReview({
135
+ finish(await publishPrReview({
123
136
  cwd,
124
137
  prNumber: pr,
125
138
  identity: { scope, round, commitSha: commit },
@@ -1,19 +1,22 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
4
- import { bindPlatformPullRequest, createPlatformPullRequest, inspectPlatformPullRequest, resolveExternalPullRequest, skipPlatformPullRequestFact, syncPlatformPullRequest } from '../platform/pull-requests.js';
5
- import { summaryContext, syncPullRequestSummary } from '../platform/pr-summary.js';
4
+ import { bindPlatformPullRequest, createPlatformPullRequest, inspectPlatformPullRequest, resolveExternalPullRequest, skipPlatformPullRequestFact, syncPlatformPullRequest, syncPlatformPullRequestInLabels } from '../platform/pull-requests.js';
5
+ import { reportWrite, summaryContext, syncPullRequestSummary } from '../platform/pr-summary.js';
6
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
6
7
  const USAGE = `Usage: agent-infra-internal platform-pr inspect <task-ref> [--cwd <path>]
7
- agent-infra-internal platform-pr resolve-external <task-ref> --agent <agent> [--pr <N>] [--dry-run] [--cwd <path>]
8
+ agent-infra-internal platform-pr resolve-external <task-ref> --agent <agent> [--pr <token>] [--dry-run] [--cwd <path>]
8
9
  agent-infra-internal platform-pr create <task-ref> --agent <agent> --base <branch> --head <branch> --title-file <path|-> --body-file <path|-> [--draft] [--dry-run] [--cwd <path>]
9
- agent-infra-internal platform-pr bind <task-ref> --pr <N> --agent <agent> [--dry-run] [--cwd <path>]
10
+ agent-infra-internal platform-pr bind <task-ref> --pr <token> --agent <agent> [--dry-run] [--cwd <path>]
10
11
  agent-infra-internal platform-pr skip <task-ref> --agent <agent> [--dry-run] [--cwd <path>]
11
12
  agent-infra-internal platform-pr sync <task-ref> --agent <agent> [--metadata] [--closing-issue] --result <pr_created|pr_reused|no_op> [--dry-run] [--cwd <path>]
13
+ agent-infra-internal platform-pr sync-in-labels --pr <N> [--dry-run] [--cwd <path>]
12
14
  agent-infra-internal platform-pr summary-context <task-ref> [--cwd <path>]
13
- agent-infra-internal platform-pr summary-sync <task-ref> --agent <agent> --body-file <path|-> --result <pr_created|pr_reused|no_op> [--dry-run] [--cwd <path>]
15
+ agent-infra-internal platform-pr change-report <task-ref> --agent <agent> --mechanical-file <path> --precheck-file <path> [--dry-run] [--cwd <path>]
16
+ agent-infra-internal platform-pr summary-sync <task-ref> --agent <agent> --body-file <path|-> --change-report-file <path> --result <pr_created|pr_reused|no_op> [--strict] [--dry-run] [--cwd <path>]
14
17
  `;
15
- const BOOLEAN_FLAGS = new Set(['--draft', '--dry-run', '--metadata', '--closing-issue']);
16
- const VALUE_FLAGS = new Set(['--cwd', '--agent', '--base', '--head', '--title-file', '--body-file', '--pr', '--result']);
18
+ const BOOLEAN_FLAGS = new Set(['--draft', '--dry-run', '--metadata', '--closing-issue', '--strict']);
19
+ const VALUE_FLAGS = new Set(['--cwd', '--agent', '--base', '--head', '--title-file', '--body-file', '--change-report-file', '--mechanical-file', '--precheck-file', '--pr', '--result']);
17
20
  function key(flag) {
18
21
  return flag.slice(2).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
19
22
  }
@@ -53,16 +56,50 @@ function parse(args, start) {
53
56
  function readFile(value, cwd) {
54
57
  return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
55
58
  }
56
- function platformPr(args = []) {
59
+ async function platformPr(args = []) {
60
+ if (!ensureInternalHandlerRoute('platform-pr', args))
61
+ return;
57
62
  if (args[0] === '--help' || args[0] === '-h') {
58
63
  process.stdout.write(USAGE);
59
64
  return;
60
65
  }
61
66
  const operation = args[0];
62
- if (!operation || !['inspect', 'resolve-external', 'create', 'bind', 'skip', 'sync', 'summary-context', 'summary-sync'].includes(operation)) {
67
+ if (!operation || ![
68
+ internalHandlerRoute('platform-pr', 'inspect', operation),
69
+ internalHandlerRoute('platform-pr', 'resolve-external', operation),
70
+ internalHandlerRoute('platform-pr', 'create', operation),
71
+ internalHandlerRoute('platform-pr', 'bind', operation),
72
+ internalHandlerRoute('platform-pr', 'skip', operation),
73
+ internalHandlerRoute('platform-pr', 'sync', operation),
74
+ internalHandlerRoute('platform-pr', 'sync-in-labels', operation),
75
+ internalHandlerRoute('platform-pr', 'summary-context', operation),
76
+ internalHandlerRoute('platform-pr', 'change-report', operation),
77
+ internalHandlerRoute('platform-pr', 'summary-sync', operation)
78
+ ].some(Boolean)) {
63
79
  fail('a valid operation is required');
64
80
  return;
65
81
  }
82
+ if (internalHandlerRoute('platform-pr', 'sync-in-labels', operation)) {
83
+ const parsed = parse(args, 1);
84
+ if (parsed.error) {
85
+ fail(parsed.error);
86
+ return;
87
+ }
88
+ const values = parsed.values;
89
+ const unexpected = Object.keys(values).find((name) => !['cwd', 'pr', 'dryRun'].includes(name));
90
+ if (unexpected) {
91
+ fail(`sync-in-labels does not accept --${unexpected}`);
92
+ return;
93
+ }
94
+ const pr = Number(values.pr);
95
+ if (!Number.isInteger(pr) || pr <= 0) {
96
+ fail('sync-in-labels requires a positive --pr');
97
+ return;
98
+ }
99
+ const cwd = path.resolve(typeof values.cwd === 'string' ? values.cwd : process.cwd());
100
+ finish(await syncPlatformPullRequestInLabels(pr, { cwd, dryRun: values.dryRun === true }));
101
+ return;
102
+ }
66
103
  const taskRef = args[1];
67
104
  if (!taskRef || taskRef.startsWith('--')) {
68
105
  fail(`${operation} requires a task ref`);
@@ -82,20 +119,22 @@ function platformPr(args = []) {
82
119
  bind: ['cwd', 'agent', 'pr', 'dryRun'],
83
120
  skip: ['cwd', 'agent', 'dryRun'],
84
121
  sync: ['cwd', 'agent', 'metadata', 'closingIssue', 'result', 'dryRun'],
122
+ 'sync-in-labels': ['cwd', 'pr', 'dryRun'],
85
123
  'summary-context': ['cwd'],
86
- 'summary-sync': ['cwd', 'agent', 'bodyFile', 'result', 'dryRun']
124
+ 'change-report': ['cwd', 'agent', 'mechanicalFile', 'precheckFile', 'dryRun'],
125
+ 'summary-sync': ['cwd', 'agent', 'bodyFile', 'changeReportFile', 'result', 'dryRun', 'strict']
87
126
  };
88
127
  const unexpected = Object.keys(values).find((name) => !allowed[operation].includes(name));
89
128
  if (unexpected) {
90
129
  fail(`${operation} does not accept --${unexpected}`);
91
130
  return;
92
131
  }
93
- if (operation === 'inspect') {
94
- finish(inspectPlatformPullRequest(taskRef, { cwd }));
132
+ if (internalHandlerRoute('platform-pr', 'inspect', operation)) {
133
+ finish(await inspectPlatformPullRequest(taskRef, { cwd }));
95
134
  return;
96
135
  }
97
- if (operation === 'summary-context') {
98
- finish(summaryContext(taskRef, { cwd }));
136
+ if (internalHandlerRoute('platform-pr', 'summary-context', operation)) {
137
+ finish(await summaryContext(taskRef, { cwd }));
99
138
  return;
100
139
  }
101
140
  if (typeof values.agent !== 'string' || !values.agent) {
@@ -108,8 +147,18 @@ function platformPr(args = []) {
108
147
  return;
109
148
  }
110
149
  values.agent = agent;
111
- if (operation === 'skip') {
112
- finish(skipPlatformPullRequestFact(taskRef, { cwd, agent, dryRun: values.dryRun === true }));
150
+ if (internalHandlerRoute('platform-pr', 'change-report', operation)) {
151
+ if (typeof values.mechanicalFile !== 'string' || typeof values.precheckFile !== 'string') {
152
+ fail('change-report requires --mechanical-file and --precheck-file');
153
+ return;
154
+ }
155
+ finish(await reportWrite(taskRef, {
156
+ cwd, agent: values.agent, mechanicalFile: values.mechanicalFile, precheckFile: values.precheckFile, dryRun: values.dryRun === true
157
+ }));
158
+ return;
159
+ }
160
+ if (internalHandlerRoute('platform-pr', 'skip', operation)) {
161
+ finish(await skipPlatformPullRequestFact(taskRef, { cwd, agent, dryRun: values.dryRun === true }));
113
162
  return;
114
163
  }
115
164
  const primaryResult = values.result === undefined ? undefined : values.result;
@@ -117,25 +166,25 @@ function platformPr(args = []) {
117
166
  fail('--result must be pr_created, pr_reused, or no_op');
118
167
  return;
119
168
  }
120
- if (operation === 'resolve-external') {
121
- const pr = values.pr === undefined ? undefined : Number(values.pr);
122
- if (pr !== undefined && (!Number.isInteger(pr) || pr <= 0)) {
123
- fail('resolve-external requires a positive --pr');
169
+ if (internalHandlerRoute('platform-pr', 'resolve-external', operation)) {
170
+ const pr = values.pr === undefined ? undefined : values.pr;
171
+ if (pr !== undefined && (typeof pr !== 'string' || !pr)) {
172
+ fail('resolve-external requires --pr <token>');
124
173
  return;
125
174
  }
126
- finish(resolveExternalPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
175
+ finish(await resolveExternalPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
127
176
  return;
128
177
  }
129
- if (operation === 'bind') {
130
- const pr = Number(values.pr);
131
- if (!Number.isInteger(pr) || pr <= 0) {
132
- fail('bind requires a positive --pr');
178
+ if (internalHandlerRoute('platform-pr', 'bind', operation)) {
179
+ const pr = values.pr;
180
+ if (typeof pr !== 'string' || !pr) {
181
+ fail('bind requires --pr <token>');
133
182
  return;
134
183
  }
135
- finish(bindPlatformPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
184
+ finish(await bindPlatformPullRequest(taskRef, { cwd, agent: values.agent, pr, dryRun: values.dryRun === true }));
136
185
  return;
137
186
  }
138
- if (operation === 'sync') {
187
+ if (internalHandlerRoute('platform-pr', 'sync', operation)) {
139
188
  if (values.metadata !== true && values.closingIssue !== true) {
140
189
  fail('sync requires --metadata or --closing-issue');
141
190
  return;
@@ -144,20 +193,24 @@ function platformPr(args = []) {
144
193
  fail('sync requires --result pr_created, pr_reused, or no_op');
145
194
  return;
146
195
  }
147
- finish(syncPlatformPullRequest(taskRef, { cwd, agent: values.agent, metadata: values.metadata === true, closingIssue: values.closingIssue === true, primaryResult: primaryResult, dryRun: values.dryRun === true }));
196
+ finish(await syncPlatformPullRequest(taskRef, { cwd, agent: values.agent, metadata: values.metadata === true, closingIssue: values.closingIssue === true, primaryResult: primaryResult, dryRun: values.dryRun === true }));
148
197
  return;
149
198
  }
150
- if (operation === 'summary-sync') {
199
+ if (internalHandlerRoute('platform-pr', 'summary-sync', operation)) {
151
200
  if (typeof values.bodyFile !== 'string') {
152
201
  fail('summary-sync requires --body-file');
153
202
  return;
154
203
  }
204
+ if (typeof values.changeReportFile !== 'string') {
205
+ fail('summary-sync requires --change-report-file');
206
+ return;
207
+ }
155
208
  if (!primaryResult) {
156
209
  fail('summary-sync requires --result pr_created, pr_reused, or no_op');
157
210
  return;
158
211
  }
159
212
  try {
160
- finish(syncPullRequestSummary(taskRef, { cwd, agent: values.agent, body: readFile(values.bodyFile, cwd), primaryResult: primaryResult, dryRun: values.dryRun === true }));
213
+ finish(await syncPullRequestSummary(taskRef, { cwd, agent: values.agent, body: readFile(values.bodyFile, cwd), changeReportFile: values.changeReportFile, primaryResult: primaryResult, dryRun: values.dryRun === true, strict: values.strict === true }));
161
214
  }
162
215
  catch (error) {
163
216
  fail(`unable to read body file: ${error instanceof Error ? error.message : String(error)}`);
@@ -169,7 +222,7 @@ function platformPr(args = []) {
169
222
  return;
170
223
  }
171
224
  try {
172
- finish(createPlatformPullRequest(taskRef, {
225
+ finish(await createPlatformPullRequest(taskRef, {
173
226
  cwd, agent: values.agent, base: values.base, head: values.head,
174
227
  title: readFile(values.titleFile, cwd), body: readFile(values.bodyFile, cwd),
175
228
  draft: values.draft === true, dryRun: values.dryRun === true