@fitlab-ai/agent-infra 0.9.13 → 0.9.15

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 (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -0,0 +1,322 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { locateActivityLog, pairEntries } from '../task/activity-log.js';
4
+ import { resolveTaskRef } from '../task/resolve-ref.js';
5
+ import { applyTaskEvent } from '../task/events.js';
6
+ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
7
+ import { normalizeAgentToken } from '../agent-clients/tokens.js';
8
+ import { createManualValidationReceipt, manualValidationFinalSummaryDigest, manualValidationFinalSummaryProjectionMatches, readManualValidationReceipt, writeManualValidationReceiptAtomic } from '../task/manual-validation-receipt.js';
9
+ import { archiveManualValidationGeneration, createManualValidationTransaction, readManualValidationTransaction, retryManualValidationTransaction, summaryPreimageDigest, transitionManualValidationTransaction, validateManualValidationGenerationArchive, writeManualValidationTransactionAtomic } from '../task/manual-validation-transaction.js';
10
+ import { sha256File } from '../task/artifact-receipts.js';
11
+ import { summaryCommentState, syncPullRequestSummary } from '../platform/pr-summary.js';
12
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
13
+ const USAGE = `Usage: agent-infra-internal manual-validation transaction <task-ref> --prepare --artifact <artifact> --summary-file <path> --agent <agent> [--cwd <path>]
14
+ agent-infra-internal manual-validation transaction <task-ref> --artifact <artifact> --summary-file <path> --change-report-file <path> --agent <agent> [--result pr_created|pr_reused|no_op] [--cwd <path>]`;
15
+ function result(status, error = null, extra = {}) {
16
+ return { status, changed: false, error, ...extra };
17
+ }
18
+ function printFailure(format, error) {
19
+ if (format === 'json')
20
+ process.stdout.write(`${JSON.stringify(result('failed', error))}\n`);
21
+ else
22
+ process.stderr.write(`${error.code}: ${error.message}\n`);
23
+ process.exitCode = 1;
24
+ }
25
+ function manualSummaryBody(body, phase, transactionId, receiptDigest = '', evidenceDigest = '', prHeadSha = '') {
26
+ const withoutPrevious = body
27
+ .replace(/^###\s+✅\s+(?:Manual Validation Passed|人工验证已通过)\s*$/gmu, '')
28
+ .replace(/^###\s+⏳\s+(?:Manual Validation Pending|人工验证待收尾)\s*$/gmu, '')
29
+ .replace(/Manual validation passed(?:\s+→)?/giu, 'Manual validation pending');
30
+ const section = phase === 'pending'
31
+ ? `### ⏳ Manual Validation Pending\n\nManual validation evidence is staged; transaction ${transactionId} is awaiting final promotion.`
32
+ : `### ✅ Manual Validation Passed\n\nManual validation passed; transaction=${transactionId}; receipt=${receiptDigest}; evidence=${evidenceDigest}; head=${prHeadSha}.`;
33
+ return `${withoutPrevious.replace(/\s+$/u, '')}\n\n${section}\n`;
34
+ }
35
+ function openManualValidationStarted(taskMdPath) {
36
+ let content;
37
+ try {
38
+ content = fs.readFileSync(taskMdPath, 'utf8');
39
+ }
40
+ catch {
41
+ return { present: false, transactionId: null };
42
+ }
43
+ const section = locateActivityLog(content);
44
+ if (!section)
45
+ return { present: false, transactionId: null };
46
+ const row = pairEntries(section.entries)
47
+ .filter((item) => item.step === 'Complete Manual Validation' && item.started && !item.done)
48
+ .at(-1);
49
+ if (!row)
50
+ return { present: false, transactionId: null };
51
+ return {
52
+ present: true,
53
+ transactionId: /(?:^|;\s*)transaction=([A-Za-z0-9][A-Za-z0-9._-]{0,127})(?:;|$)/u.exec(row.note)?.[1] ?? null
54
+ };
55
+ }
56
+ async function executeManualValidationTransaction(taskRef, values, cwd, options = {}) {
57
+ const prepareOnly = values.prepare === 'true';
58
+ const required = prepareOnly
59
+ ? ['artifact', 'summaryFile', 'agent']
60
+ : ['artifact', 'summaryFile', 'changeReportFile', 'agent'];
61
+ const missing = required.find((key) => !values[key]);
62
+ if (missing)
63
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_ARGS_INVALID', message: `transaction requires --${missing.replace(/[A-Z]/gu, (letter) => `-${letter.toLowerCase()}`)}` });
64
+ const agent = normalizeAgentToken(values.agent);
65
+ if (!agent)
66
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_ARGS_INVALID', message: 'transaction agent is invalid' });
67
+ const primaryResult = values.result ?? 'no_op';
68
+ if (!['pr_created', 'pr_reused', 'no_op'].includes(primaryResult))
69
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_ARGS_INVALID', message: '--result must be pr_created, pr_reused, or no_op' });
70
+ const resolved = resolveTaskRef(taskRef, { repoRoot: cwd });
71
+ if (!resolved.ok)
72
+ return result('failed', { code: resolved.code, message: resolved.message });
73
+ try {
74
+ return await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `manual-validation:${taskRef}`, () => executeManualValidationTransactionLocked(taskRef, values, cwd, resolved, agent, primaryResult, prepareOnly, options));
75
+ }
76
+ catch (error) {
77
+ if (error instanceof TaskExecutionLockError)
78
+ return result('failed', { code: error.code, message: error.message });
79
+ throw error;
80
+ }
81
+ }
82
+ async function executeManualValidationTransactionLocked(taskRef, values, cwd, resolved, agent, primaryResult, prepareOnly, options) {
83
+ const artifactPath = path.resolve(resolved.taskDir, values.artifact);
84
+ if (!prepareOnly && !fs.existsSync(artifactPath))
85
+ return result('failed', { code: 'MANUAL_VALIDATION_ARTIFACT_MISSING', message: `manual-validation artifact is missing: ${values.artifact}` });
86
+ const currentState = await summaryCommentState(taskRef, { cwd, client: options.client });
87
+ if (!currentState.pullRequest)
88
+ return result('failed', { code: 'MANUAL_VALIDATION_PR_REQUIRED', message: 'canonical pull-request head is unavailable' });
89
+ const pullRequest = currentState.pullRequest;
90
+ const preimageBody = currentState.comment?.body ?? '';
91
+ const preimage = { commentId: currentState.comment?.id ?? null, body: preimageBody, digest: summaryPreimageDigest(preimageBody) };
92
+ const evidenceDigest = sha256File(path.resolve(cwd, values.summaryFile));
93
+ const archiveGeneration = options.archiveGeneration ?? archiveManualValidationGeneration;
94
+ let transactionResult = readManualValidationTransaction(resolved.taskDir, { taskId: resolved.taskId, prNumber: pullRequest.number, prHeadSha: pullRequest.head.sha, evidenceDigest, artifact: values.artifact });
95
+ let previousTransaction = null;
96
+ if (!transactionResult.ok && transactionResult.error.code === 'MANUAL_VALIDATION_TRANSACTION_IDENTITY_MISMATCH') {
97
+ const existing = readManualValidationTransaction(resolved.taskDir);
98
+ if (!existing.ok)
99
+ return result('failed', existing.error);
100
+ if (!['aborted', 'recovery-required', 'committed'].includes(existing.value.phase))
101
+ return result('failed', transactionResult.error);
102
+ try {
103
+ validateManualValidationGenerationArchive(resolved.taskDir, existing.value, existing.value.phase === 'committed');
104
+ }
105
+ catch (error) {
106
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: error instanceof Error ? error.message : String(error) });
107
+ }
108
+ previousTransaction = existing.value;
109
+ transactionResult = { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_MISSING', message: 'previous failed transaction was archived for a new pull-request head' } };
110
+ }
111
+ if (!transactionResult.ok && transactionResult.error.code !== 'MANUAL_VALIDATION_TRANSACTION_MISSING')
112
+ return result('failed', transactionResult.error);
113
+ if (transactionResult.ok && transactionResult.value.phase === 'committed')
114
+ return result('applied', null, { transaction: transactionResult.value, receipt: transactionResult.value.committedReceipt, idempotent: true });
115
+ const openStarted = transactionResult.ok ? { present: false, transactionId: null } : openManualValidationStarted(resolved.taskMdPath);
116
+ if (openStarted.present && !openStarted.transactionId) {
117
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: 'open manual-validation started event has no recoverable transactionId' });
118
+ }
119
+ if (previousTransaction && openStarted.transactionId === previousTransaction.transactionId) {
120
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: 'previous manual-validation generation is still open; retry the existing transaction before starting a new generation' });
121
+ }
122
+ const transactionId = transactionResult.ok
123
+ ? transactionResult.value.transactionId
124
+ : (openStarted.transactionId ?? values.transactionId ?? `mv-${Date.now()}`);
125
+ const finalBodyWithoutReceipt = fs.readFileSync(path.resolve(cwd, values.summaryFile), 'utf8');
126
+ const pendingBody = manualSummaryBody(finalBodyWithoutReceipt, 'pending', transactionId);
127
+ const createTransaction = () => createManualValidationTransaction({
128
+ transactionId,
129
+ taskId: resolved.taskId,
130
+ prNumber: pullRequest.number,
131
+ prHeadSha: pullRequest.head.sha,
132
+ evidenceDigest,
133
+ summaryPreimage: preimage,
134
+ pendingSummaryDigest: summaryPreimageDigest(pendingBody),
135
+ finalSummaryDigest: manualValidationFinalSummaryDigest(manualSummaryBody(finalBodyWithoutReceipt, 'final', transactionId, '<receipt>', evidenceDigest, pullRequest.head.sha)),
136
+ artifact: values.artifact,
137
+ attempt: 1,
138
+ createdAt: new Date().toISOString(),
139
+ updatedAt: new Date().toISOString()
140
+ });
141
+ let transaction;
142
+ const idempotent = transactionResult.ok;
143
+ let startedEventApplied = false;
144
+ if (!transactionResult.ok) {
145
+ transaction = createTransaction();
146
+ const started = applyTaskEvent({ taskRef, event: 'manual-validation.started', agent, initiator: 'model', requestId: transactionId, reasonCode: 'user-request', transactionId }, { lockAlreadyHeld: true, repoRoot: cwd });
147
+ if (started.status === 'failed')
148
+ return result('failed', started.error ?? { code: 'MANUAL_VALIDATION_TRANSACTION_FAILED', message: 'manual-validation started event failed' });
149
+ startedEventApplied = true;
150
+ if (previousTransaction) {
151
+ try {
152
+ archiveGeneration(resolved.taskDir, previousTransaction, previousTransaction.phase === 'committed');
153
+ }
154
+ catch (error) {
155
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: error instanceof Error ? error.message : String(error) });
156
+ }
157
+ }
158
+ writeManualValidationTransactionAtomic(resolved.taskDir, transaction);
159
+ }
160
+ else {
161
+ transaction = transactionResult.value;
162
+ if (['aborted', 'recovery-required'].includes(transaction.phase)) {
163
+ const retried = retryManualValidationTransaction(transaction);
164
+ if (!retried.ok)
165
+ return result('failed', retried.error);
166
+ transaction = retried.value;
167
+ writeManualValidationTransactionAtomic(resolved.taskDir, transaction);
168
+ }
169
+ }
170
+ if (transaction.phase === 'prepared' && !startedEventApplied) {
171
+ const started = applyTaskEvent({ taskRef, event: 'manual-validation.started', agent, initiator: 'model', requestId: transaction.transactionId, reasonCode: 'user-request', transactionId: transaction.transactionId }, { lockAlreadyHeld: true, repoRoot: cwd });
172
+ if (started.status === 'failed')
173
+ return result('failed', started.error ?? { code: 'MANUAL_VALIDATION_TRANSACTION_FAILED', message: 'manual-validation started event failed' });
174
+ }
175
+ if (prepareOnly)
176
+ return result('applied', null, { transaction, prepared: true, idempotent });
177
+ const transactionFailure = (failure) => {
178
+ throw new Error(`${failure.code}: ${failure.message}`);
179
+ };
180
+ const transitionAndPersist = (phase, patch = {}) => {
181
+ const next = transitionManualValidationTransaction(transaction, phase, patch);
182
+ if (!next.ok)
183
+ throw new Error(`${next.error.code}: ${next.error.message}`);
184
+ transaction = next.value;
185
+ writeManualValidationTransactionAtomic(resolved.taskDir, transaction);
186
+ };
187
+ try {
188
+ if (transaction.phase === 'prepared') {
189
+ const staged = await syncPullRequestSummary(taskRef, {
190
+ cwd, client: options.client, agent, body: pendingBody, changeReportFile: path.resolve(cwd, values.changeReportFile), primaryResult: primaryResult, strict: true,
191
+ manualValidation: { phase: 'pending' }, lockAlreadyHeld: true
192
+ });
193
+ if (!['applied', 'no-op'].includes(staged.status))
194
+ transactionFailure(staged.error ?? { code: 'MANUAL_VALIDATION_TRANSACTION_FAILED', message: 'pending summary staging failed' });
195
+ transitionAndPersist('summary-staged');
196
+ }
197
+ let receiptResult = readManualValidationReceipt(resolved.taskDir, {
198
+ transactionId: transaction.transactionId,
199
+ taskId: resolved.taskId,
200
+ prNumber: pullRequest.number,
201
+ prHeadSha: pullRequest.head.sha,
202
+ evidenceDigest: transaction.evidenceDigest,
203
+ artifact: values.artifact
204
+ });
205
+ if (!receiptResult.ok && receiptResult.error.code !== 'MANUAL_VALIDATION_RECEIPT_MISSING')
206
+ transactionFailure(receiptResult.error);
207
+ let receipt;
208
+ if (receiptResult.ok) {
209
+ receipt = receiptResult.value;
210
+ }
211
+ else {
212
+ receipt = createManualValidationReceipt({
213
+ transactionId: transaction.transactionId,
214
+ taskId: resolved.taskId,
215
+ prNumber: pullRequest.number,
216
+ prHeadSha: pullRequest.head.sha,
217
+ evidenceDigest: transaction.evidenceDigest,
218
+ artifact: values.artifact,
219
+ artifactSha256: sha256File(artifactPath),
220
+ pendingSummaryDigest: transaction.pendingSummaryDigest,
221
+ finalSummaryDigest: transaction.finalSummaryDigest,
222
+ committedAt: new Date().toISOString()
223
+ });
224
+ writeManualValidationReceiptAtomic(resolved.taskDir, receipt);
225
+ }
226
+ if (transaction.phase === 'summary-staged') {
227
+ transitionAndPersist('receipt-committed', { committedReceipt: receipt.receiptDigest });
228
+ }
229
+ if (transaction.phase === 'receipt-committed' && !transaction.eventAppended) {
230
+ const completed = applyTaskEvent({ taskRef, event: 'manual-validation.completed', agent, initiator: 'model', requestId: transaction.transactionId, reasonCode: 'user-request', artifact: values.artifact, summaryResult: 'human-confirmed validation and committed receipt', transactionId: transaction.transactionId, receiptDigest: receipt.receiptDigest, prHeadSha: receipt.prHeadSha }, { lockAlreadyHeld: true, repoRoot: cwd });
231
+ if (completed.status === 'failed')
232
+ transactionFailure(completed.error ?? { code: 'MANUAL_VALIDATION_TRANSACTION_FAILED', message: 'manual-validation completion event failed' });
233
+ transitionAndPersist('receipt-committed', { eventAppended: true });
234
+ }
235
+ if (transaction.phase === 'receipt-committed') {
236
+ transitionAndPersist('final-promotion-in-progress');
237
+ }
238
+ const promoted = await syncPullRequestSummary(taskRef, {
239
+ cwd, client: options.client, agent, body: manualSummaryBody(finalBodyWithoutReceipt, 'final', transaction.transactionId, receipt.receiptDigest, receipt.evidenceDigest, receipt.prHeadSha), changeReportFile: path.resolve(cwd, values.changeReportFile), primaryResult, strict: true,
240
+ manualValidation: { phase: 'final', transactionId: transaction.transactionId, receiptDigest: receipt.receiptDigest, prHeadSha: receipt.prHeadSha, authority: 'coordinator' }, lockAlreadyHeld: true
241
+ });
242
+ if (!['applied', 'no-op'].includes(promoted.status))
243
+ transactionFailure(promoted.error ?? { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: 'final summary promotion failed' });
244
+ const postWrite = await summaryCommentState(taskRef, { cwd, client: options.client });
245
+ if (!postWrite.comment?.body.includes('### ✅ Manual Validation Passed') || postWrite.pullRequest?.head.sha !== receipt.prHeadSha || !manualValidationFinalSummaryProjectionMatches(postWrite.comment.body, receipt))
246
+ transactionFailure({ code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message: 'final summary post-write verification failed' });
247
+ transitionAndPersist('committed', { postWriteVerified: true });
248
+ return result('applied', null, { transaction, receipt, idempotent: false });
249
+ }
250
+ catch (error) {
251
+ const message = error instanceof Error ? error.message : String(error);
252
+ if (transaction.phase === 'final-promotion-in-progress') {
253
+ try {
254
+ await syncPullRequestSummary(taskRef, {
255
+ cwd, client: options.client, agent, body: pendingBody, changeReportFile: path.resolve(cwd, values.changeReportFile), primaryResult: primaryResult, strict: true,
256
+ manualValidation: { phase: 'pending' }, lockAlreadyHeld: true
257
+ });
258
+ }
259
+ catch {
260
+ // Preserve recovery-required when pending compensation cannot be confirmed.
261
+ }
262
+ }
263
+ const failedTransaction = transitionManualValidationTransaction(transaction, 'recovery-required', { error: message.slice(0, 400) });
264
+ if (failedTransaction.ok)
265
+ writeManualValidationTransactionAtomic(resolved.taskDir, failedTransaction.value);
266
+ return result('failed', { code: 'MANUAL_VALIDATION_TRANSACTION_RECOVERY_REQUIRED', message });
267
+ }
268
+ }
269
+ function parse(args, start) {
270
+ const values = {};
271
+ for (let index = start; index < args.length; index += 1) {
272
+ const flag = args[index];
273
+ if (flag === '--prepare') {
274
+ if (values.prepare)
275
+ return { values, error: `duplicate option '${flag}'` };
276
+ values.prepare = 'true';
277
+ continue;
278
+ }
279
+ if (!['--format', '--cwd', '--artifact', '--summary-file', '--change-report-file', '--agent', '--result'].includes(flag))
280
+ return { values, error: `unknown option '${flag}'` };
281
+ const value = args[++index];
282
+ if (!value || value.startsWith('--'))
283
+ return { values, error: `option '${flag}' requires a value` };
284
+ const key = flag.slice(2).replace(/-([a-z])/gu, (_, letter) => letter.toUpperCase());
285
+ if (values[key])
286
+ return { values, error: `duplicate option '${flag}'` };
287
+ values[key] = value;
288
+ }
289
+ return { values };
290
+ }
291
+ async function manualValidation(args = []) {
292
+ if (!ensureInternalHandlerRoute('manual-validation', args))
293
+ return;
294
+ if (args[0] === '--help' || args[0] === '-h') {
295
+ process.stdout.write(`${USAGE}\n`);
296
+ return;
297
+ }
298
+ const operation = args[0];
299
+ const isTransaction = operation === 'transaction' && internalHandlerRoute('manual-validation', 'transaction', operation);
300
+ if (!isTransaction) {
301
+ printFailure('json', { code: 'MANUAL_VALIDATION_ARGS_INVALID', message: 'transaction operation is required' });
302
+ return;
303
+ }
304
+ const taskRef = args[1];
305
+ if (!taskRef || taskRef.startsWith('--')) {
306
+ printFailure('json', { code: 'MANUAL_VALIDATION_ARGS_INVALID', message: 'task ref is required' });
307
+ return;
308
+ }
309
+ const parsed = parse(args, 2);
310
+ if (parsed.error) {
311
+ printFailure('json', { code: 'MANUAL_VALIDATION_ARGS_INVALID', message: parsed.error });
312
+ return;
313
+ }
314
+ const values = parsed.values;
315
+ const format = values.format === 'text' ? 'text' : 'json';
316
+ const output = await executeManualValidationTransaction(taskRef, values, path.resolve(values.cwd ?? process.cwd()));
317
+ process.stdout.write(format === 'json' ? `${JSON.stringify(output)}\n` : `${output.status === 'applied' ? 'Manual validation transaction committed.' : `${output.error?.code}: ${output.error?.message}`}\n`);
318
+ if (output.status === 'failed')
319
+ process.exitCode = 1;
320
+ }
321
+ export { executeManualValidationTransaction, manualValidation };
322
+ //# sourceMappingURL=manual-validation.js.map
@@ -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,11 +83,11 @@ async function platformChecks(args = []) {
75
83
  fail(`${operation} does not accept --${unexpected}`);
76
84
  return;
77
85
  }
78
- if (operation === 'inspect') {
86
+ if (internalHandlerRoute('platform-checks', 'inspect', operation)) {
79
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;
@@ -87,7 +95,7 @@ async function platformChecks(args = []) {
87
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) {
@@ -97,6 +105,10 @@ async function platformChecks(args = []) {
97
105
  finish(await fetchPlatformCheckLogs(taskRef, { cwd, run, job: job || undefined }));
98
106
  return;
99
107
  }
108
+ if (!internalHandlerRoute('platform-checks', 'watch', operation)) {
109
+ fail('operation is not registered');
110
+ return;
111
+ }
100
112
  const intervalSeconds = positive(values.intervalSeconds);
101
113
  const deadlineSeconds = positive(values.deadlineSeconds);
102
114
  if (!intervalSeconds || !deadlineSeconds) {
@@ -3,6 +3,7 @@ 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
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
6
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>]
@@ -48,12 +49,19 @@ function readBodyFile(value, cwd) {
48
49
  return fs.readFileSync(path.resolve(cwd, value), 'utf8');
49
50
  }
50
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,7 +77,7 @@ async 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') {
80
+ if (internalHandlerRoute('platform-comment', 'list', operation)) {
73
81
  const issue = parsed.values.issue;
74
82
  if (typeof issue !== 'string' || !issue) {
75
83
  fail('list requires --issue <token>');
@@ -83,7 +91,7 @@ async function platformComment(args = []) {
83
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}'`);
@@ -92,7 +100,7 @@ async function platformComment(args = []) {
92
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}'`);
@@ -111,6 +119,10 @@ async function platformComment(args = []) {
111
119
  finish(await backfillCompletionComments(taskRef, { cwd, agent: normalizedAgent }));
112
120
  return;
113
121
  }
122
+ if (!internalHandlerRoute('platform-comment', 'sync', operation)) {
123
+ fail('operation is not registered');
124
+ return;
125
+ }
114
126
  const kind = parsed.values.kind;
115
127
  const agent = parsed.values.agent;
116
128
  if (!['task', 'artifact', 'summary', 'cancel'].includes(String(kind))) {
@@ -1,5 +1,6 @@
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`);
@@ -7,11 +8,13 @@ function fail(message) {
7
8
  process.exitCode = 1;
8
9
  }
9
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
  }
@@ -1,6 +1,7 @@
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
7
  agent-infra-internal platform-issue bind <task-ref> --issue <token> --agent <agent> [--dry-run] [--cwd <path>]
@@ -55,12 +56,19 @@ function oneOf(values, name, allowed) {
55
56
  return value;
56
57
  }
57
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,7 +93,7 @@ async function platformIssue(args = []) {
85
93
  fail(`${operation} does not accept --${unexpected}`);
86
94
  return;
87
95
  }
88
- if (operation === 'inspect') {
96
+ if (internalHandlerRoute('platform-issue', 'inspect', operation)) {
89
97
  finish(await inspectPlatformIssue(taskRef, { cwd }));
90
98
  return;
91
99
  }
@@ -99,11 +107,11 @@ async function platformIssue(args = []) {
99
107
  return;
100
108
  }
101
109
  values.agent = agent;
102
- if (operation === 'create') {
110
+ if (internalHandlerRoute('platform-issue', 'create', operation)) {
103
111
  finish(await createPlatformIssue(taskRef, { cwd, agent: values.agent, dryRun: values.dryRun === true }));
104
112
  return;
105
113
  }
106
- if (operation === 'bind') {
114
+ if (internalHandlerRoute('platform-issue', 'bind', operation)) {
107
115
  if (typeof values.issue !== 'string' || !values.issue) {
108
116
  fail('bind requires --issue <token>');
109
117
  return;
@@ -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