@fitlab-ai/agent-infra 0.9.13 → 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 (280) hide show
  1. package/bin/cli.ts +26 -9
  2. package/dist/bin/cli.js +173 -157
  3. package/dist/bin/internal-cli.js +42 -21
  4. package/dist/lib/agent-client.js +5 -0
  5. package/dist/lib/internal/agent-client.js +5 -2
  6. package/dist/lib/internal/cli-route-inventory.js +152 -0
  7. package/dist/lib/internal/codex-lifecycle.js +9 -6
  8. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  9. package/dist/lib/internal/git-workflow.js +10 -6
  10. package/dist/lib/internal/platform-checks.js +16 -4
  11. package/dist/lib/internal/platform-comment.js +16 -4
  12. package/dist/lib/internal/platform-context.js +4 -1
  13. package/dist/lib/internal/platform-issue.js +12 -4
  14. package/dist/lib/internal/platform-metadata.js +88 -0
  15. package/dist/lib/internal/platform-pr-review.js +16 -3
  16. package/dist/lib/internal/platform-pr.js +24 -10
  17. package/dist/lib/internal/platform-release-notes.js +6 -3
  18. package/dist/lib/internal/platform-security.js +93 -0
  19. package/dist/lib/internal/pr-review-grade.js +14 -3
  20. package/dist/lib/internal/release-workflow.js +19 -5
  21. package/dist/lib/internal/sandbox-control.js +22 -5
  22. package/dist/lib/internal/task-activity.js +13 -4
  23. package/dist/lib/internal/task-artifact.js +186 -27
  24. package/dist/lib/internal/task-context.js +4 -1
  25. package/dist/lib/internal/task-create.js +48 -15
  26. package/dist/lib/internal/task-delivery.js +4 -1
  27. package/dist/lib/internal/task-event.js +4 -1
  28. package/dist/lib/internal/task-finalization.js +4 -1
  29. package/dist/lib/internal/task-invalidation.js +4 -1
  30. package/dist/lib/internal/task-ledger.js +12 -1
  31. package/dist/lib/internal/task-lifecycle.js +4 -1
  32. package/dist/lib/internal/task-operation-registry.js +421 -0
  33. package/dist/lib/internal/task-orchestration.js +12 -0
  34. package/dist/lib/internal/task-override.js +10 -3
  35. package/dist/lib/internal/task-qualification.js +90 -0
  36. package/dist/lib/internal/task-review.js +4 -1
  37. package/dist/lib/internal/task-short-id.js +11 -1
  38. package/dist/lib/internal/task-snapshot.js +4 -1
  39. package/dist/lib/internal/task-validate.js +7 -2
  40. package/dist/lib/internal/task-verify.js +5 -1
  41. package/dist/lib/internal/task-warning.js +8 -1
  42. package/dist/lib/platform/comment-safety.js +226 -0
  43. package/dist/lib/platform/github-provider.js +233 -6
  44. package/dist/lib/platform/issue-comments.js +146 -34
  45. package/dist/lib/platform/pr-change-report.js +6 -12
  46. package/dist/lib/platform/pr-summary.js +28 -7
  47. package/dist/lib/platform/provider-contract.d.ts +67 -1
  48. package/dist/lib/platform/provider-contract.js +6 -2
  49. package/dist/lib/platform/provider-validation.js +76 -3
  50. package/dist/lib/platform/pull-requests.js +115 -170
  51. package/dist/lib/platform/repository-metadata.js +377 -0
  52. package/dist/lib/platform/security-alerts.js +155 -0
  53. package/dist/lib/platform/verification-sync.js +33 -26
  54. package/dist/lib/process-data/index.js +7 -0
  55. package/dist/lib/run/index.js +5 -0
  56. package/dist/lib/sandbox/commands/control-status.js +22 -0
  57. package/dist/lib/sandbox/commands/create.js +32 -6
  58. package/dist/lib/sandbox/commands/ls.js +5 -0
  59. package/dist/lib/sandbox/commands/rm.js +827 -120
  60. package/dist/lib/sandbox/commands/show.js +16 -0
  61. package/dist/lib/sandbox/control/client.js +83 -9
  62. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  63. package/dist/lib/sandbox/control/container-identity.js +28 -31
  64. package/dist/lib/sandbox/control/executor.js +149 -14
  65. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  66. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  67. package/dist/lib/sandbox/control/server.js +305 -35
  68. package/dist/lib/sandbox/control/state.js +5 -3
  69. package/dist/lib/sandbox/control/task-view.js +183 -0
  70. package/dist/lib/sandbox/engines/authority.js +289 -0
  71. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  72. package/dist/lib/sandbox/index.js +5 -0
  73. package/dist/lib/sandbox/recovery.js +21 -1
  74. package/dist/lib/sandbox/workspace-view.js +2 -1
  75. package/dist/lib/sandbox/worktree-safety.js +4 -1
  76. package/dist/lib/server/index.js +8 -0
  77. package/dist/lib/task/artifact-lifecycle.js +42 -13
  78. package/dist/lib/task/artifact-operations.js +520 -0
  79. package/dist/lib/task/artifact-repair-intent.js +59 -0
  80. package/dist/lib/task/artifact-schema.js +135 -0
  81. package/dist/lib/task/capabilities.js +72 -1
  82. package/dist/lib/task/control-authority.js +4 -0
  83. package/dist/lib/task/create-service.js +103 -4
  84. package/dist/lib/task/create.js +25 -0
  85. package/dist/lib/task/events.js +186 -67
  86. package/dist/lib/task/index.js +11 -3
  87. package/dist/lib/task/local-artifact-finalization.js +75 -150
  88. package/dist/lib/task/orchestration.js +192 -52
  89. package/dist/lib/task/qualification-audit.js +490 -0
  90. package/dist/lib/task/qualification-confirmation.js +109 -0
  91. package/dist/lib/task/qualification-intents.js +148 -0
  92. package/dist/lib/task/review-artifacts.js +22 -23
  93. package/dist/lib/task/review-finalization.js +121 -4
  94. package/dist/lib/task/sections.js +6 -4
  95. package/dist/lib/task/verification-config.js +11 -0
  96. package/dist/lib/task/verification-engine.js +54 -4
  97. package/dist/lifecycle-build-manifest.json +3 -3
  98. package/lib/agent-client.ts +9 -0
  99. package/lib/internal/agent-client.ts +4 -2
  100. package/lib/internal/cli-route-inventory.ts +140 -0
  101. package/lib/internal/codex-lifecycle.ts +8 -6
  102. package/lib/internal/codex-sandbox-controller.ts +7 -2
  103. package/lib/internal/git-workflow.ts +9 -6
  104. package/lib/internal/platform-checks.ts +12 -4
  105. package/lib/internal/platform-comment.ts +12 -4
  106. package/lib/internal/platform-context.ts +3 -1
  107. package/lib/internal/platform-issue.ts +11 -4
  108. package/lib/internal/platform-metadata.ts +70 -0
  109. package/lib/internal/platform-pr-review.ts +14 -3
  110. package/lib/internal/platform-pr.ts +23 -10
  111. package/lib/internal/platform-release-notes.ts +5 -3
  112. package/lib/internal/platform-security.ts +83 -0
  113. package/lib/internal/pr-review-grade.ts +10 -3
  114. package/lib/internal/release-workflow.ts +17 -5
  115. package/lib/internal/sandbox-control.ts +19 -5
  116. package/lib/internal/task-activity.ts +12 -4
  117. package/lib/internal/task-artifact.ts +164 -25
  118. package/lib/internal/task-context.ts +3 -1
  119. package/lib/internal/task-create.ts +76 -15
  120. package/lib/internal/task-delivery.ts +3 -1
  121. package/lib/internal/task-event.ts +3 -1
  122. package/lib/internal/task-finalization.ts +3 -1
  123. package/lib/internal/task-invalidation.ts +3 -1
  124. package/lib/internal/task-ledger.ts +11 -1
  125. package/lib/internal/task-lifecycle.ts +3 -1
  126. package/lib/internal/task-operation-registry.ts +482 -0
  127. package/lib/internal/task-orchestration.ts +12 -0
  128. package/lib/internal/task-override.ts +9 -3
  129. package/lib/internal/task-qualification.ts +61 -0
  130. package/lib/internal/task-review.ts +3 -1
  131. package/lib/internal/task-short-id.ts +10 -1
  132. package/lib/internal/task-snapshot.ts +3 -1
  133. package/lib/internal/task-validate.ts +6 -2
  134. package/lib/internal/task-verify.ts +4 -1
  135. package/lib/internal/task-warning.ts +7 -1
  136. package/lib/platform/comment-safety.ts +250 -0
  137. package/lib/platform/github-provider.ts +229 -7
  138. package/lib/platform/issue-comments.ts +160 -35
  139. package/lib/platform/pr-change-report.ts +6 -12
  140. package/lib/platform/pr-summary.ts +27 -6
  141. package/lib/platform/provider-contract.ts +78 -3
  142. package/lib/platform/provider-validation.ts +85 -3
  143. package/lib/platform/pull-requests.ts +126 -178
  144. package/lib/platform/repository-metadata.ts +453 -0
  145. package/lib/platform/security-alerts.ts +191 -0
  146. package/lib/platform/verification-sync.ts +32 -28
  147. package/lib/process-data/index.ts +7 -0
  148. package/lib/run/index.ts +5 -0
  149. package/lib/sandbox/commands/control-status.ts +26 -0
  150. package/lib/sandbox/commands/create.ts +46 -6
  151. package/lib/sandbox/commands/ls.ts +7 -0
  152. package/lib/sandbox/commands/rm.ts +1000 -87
  153. package/lib/sandbox/commands/show.ts +16 -0
  154. package/lib/sandbox/control/client.ts +103 -9
  155. package/lib/sandbox/control/completed-reentry.ts +98 -0
  156. package/lib/sandbox/control/container-identity.ts +27 -43
  157. package/lib/sandbox/control/executor.ts +177 -12
  158. package/lib/sandbox/control/lifecycle.ts +629 -17
  159. package/lib/sandbox/control/native-file-lock.ts +209 -0
  160. package/lib/sandbox/control/protocol.ts +5 -2
  161. package/lib/sandbox/control/server.ts +319 -37
  162. package/lib/sandbox/control/state.ts +6 -3
  163. package/lib/sandbox/control/task-view.ts +240 -0
  164. package/lib/sandbox/engines/authority.ts +365 -0
  165. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  166. package/lib/sandbox/index.ts +7 -0
  167. package/lib/sandbox/recovery.ts +21 -1
  168. package/lib/sandbox/workspace-view.ts +9 -3
  169. package/lib/sandbox/worktree-safety.ts +4 -1
  170. package/lib/server/index.ts +10 -0
  171. package/lib/task/artifact-lifecycle.ts +38 -16
  172. package/lib/task/artifact-operations.ts +626 -0
  173. package/lib/task/artifact-repair-intent.ts +71 -0
  174. package/lib/task/artifact-schema.ts +192 -0
  175. package/lib/task/capabilities.ts +70 -1
  176. package/lib/task/control-authority.ts +11 -1
  177. package/lib/task/create-service.ts +131 -6
  178. package/lib/task/create.ts +27 -0
  179. package/lib/task/events.ts +161 -65
  180. package/lib/task/index.ts +16 -3
  181. package/lib/task/local-artifact-finalization.ts +87 -218
  182. package/lib/task/orchestration.ts +172 -49
  183. package/lib/task/qualification-audit.ts +599 -0
  184. package/lib/task/qualification-confirmation.ts +117 -0
  185. package/lib/task/qualification-intents.ts +150 -0
  186. package/lib/task/review-artifacts.ts +21 -22
  187. package/lib/task/review-finalization.ts +133 -4
  188. package/lib/task/sections.ts +6 -4
  189. package/lib/task/verification-config.ts +12 -0
  190. package/lib/task/verification-engine.ts +55 -4
  191. package/package.json +6 -1
  192. package/templates/.agents/rules/README.en.md +2 -0
  193. package/templates/.agents/rules/README.zh-CN.md +2 -0
  194. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  195. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  196. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  197. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  198. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  199. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  200. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  201. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  202. package/templates/.agents/rules/security-alerts.en.md +8 -8
  203. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  204. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  205. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  206. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  207. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  208. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  209. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  210. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  211. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  212. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  213. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  214. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  215. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  216. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  217. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  218. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  219. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  220. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  221. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  222. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  223. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  224. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +5 -1
  225. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
  226. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  227. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  228. package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
  229. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
  230. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  231. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  232. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  233. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  234. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  235. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  236. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  237. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  238. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  239. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  240. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  241. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  242. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  243. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  244. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  245. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  246. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  247. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  248. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  249. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  250. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  251. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  252. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  253. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  254. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  255. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  256. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  257. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  258. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  259. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  260. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  261. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  262. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  263. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  264. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  265. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  266. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -1
  267. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
  268. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  269. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  270. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  271. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  272. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  273. package/templates/.agents/templates/task.en.md +6 -0
  274. package/templates/.agents/templates/task.zh-CN.md +6 -0
  275. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  276. package/templates/.agents/scripts/security-alerts.sh +0 -31
  277. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  278. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  279. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  280. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -0,0 +1,152 @@
1
+ export const PUBLIC_CLI_COMMAND_ALIASES = Object.freeze({
2
+ '': 'help',
3
+ s: 'sandbox',
4
+ t: 'task',
5
+ '--version': 'version',
6
+ '-v': 'version'
7
+ });
8
+ export const PUBLIC_CLI_SELECTOR_ALIASES = Object.freeze({
9
+ task: Object.freeze({ d: 'decisions' })
10
+ });
11
+ export const PUBLIC_CLI_ROUTE_SELECTORS = Object.freeze({
12
+ 'agent-client': ['list', 'status', 'enable', 'disable', 'configure'],
13
+ cp: ['cp'],
14
+ data: ['capture', 'verify', 'audit', 'repair', 'export'],
15
+ decide: ['decide'],
16
+ help: ['help'],
17
+ init: ['init'],
18
+ merge: ['merge'],
19
+ run: ['create-task', 'task-skill', 'recreate'],
20
+ sandbox: ['create', 'exec', 'ls', 'show', 'prune', 'rebuild', 'refresh', 'rm', 'start', 'vm'],
21
+ server: ['start', 'stop', 'status', 'logs', '__daemon'],
22
+ task: ['cat', 'decisions', 'files', 'grep', 'issue-body', 'log', 'ls', 'show', 'status'],
23
+ sync: ['sync'],
24
+ update: ['update'],
25
+ version: ['version']
26
+ });
27
+ /**
28
+ * The selector definitions consumed by every internal handler. Keep this
29
+ * module free of handler imports so the pre-import task-view guard remains
30
+ * effective.
31
+ */
32
+ export const INTERNAL_HANDLER_ROUTE_SELECTORS = Object.freeze({
33
+ 'task-create': ['input'],
34
+ 'task-qualification': ['proposal', 'confirm', 'supersede', 'revoke'],
35
+ 'sandbox-control': ['serve', 'execute', 'recover', 'client'],
36
+ 'agent-client': ['next-steps', 'model-selection'],
37
+ 'codex-lifecycle': ['preflight', 'capability-arm', 'hook-event', 'resolve-start', 'resolve-stop', 'consume'],
38
+ 'codex-sandbox-controller': ['verify-context', 'run'],
39
+ 'git-workflow': ['inspect', 'preview-tree', 'snapshot', 'compare-trees', 'commit', 'push-rebased'],
40
+ 'task-delivery': ['deliver'],
41
+ 'release-workflow': ['inspect', 'prepare', 'publish', 'post-prepare', 'post-publish'],
42
+ 'platform-release-notes': ['context', 'stage', 'publish'],
43
+ 'platform-security': ['read', 'dismiss'],
44
+ 'platform-metadata': ['init-labels', 'init-milestones'],
45
+ 'platform-context': ['resolve'],
46
+ 'platform-comment': ['list', 'owner', 'backfill', 'sync'],
47
+ 'platform-issue': ['inspect', 'create', 'bind', 'sync'],
48
+ 'platform-pr': ['inspect', 'summary-context', 'resolve-external', 'create', 'bind', 'skip', 'sync', 'change-report', 'summary-sync', 'sync-in-labels'],
49
+ 'platform-pr-review': ['inspect', 'list', 'publish-pr', 'publish-task'],
50
+ 'pr-review-grade': ['decide', 'resolve-host', 'verify-artifact'],
51
+ 'platform-checks': ['inspect', 'watch', 'resolve-run', 'logs'],
52
+ 'task-context': ['resolve'],
53
+ 'task-ledger': ['decision-next-id', 'stage-status', 'finding-upsert', 'finding-respond', 'finding-review', 'decision-upsert', 'rework-intent-upsert'],
54
+ 'task-warning': ['list', 'add', 'set-status'],
55
+ 'task-activity': ['pr-review-inspect', 'pr-review-start', 'pr-review-complete', 'pr-review-terminate'],
56
+ 'task-artifact': ['inspect', 'init', 'repair', 'finalize-local'],
57
+ 'task-orchestration': ['status', 'progress'],
58
+ 'task-review': ['finalize-summary'],
59
+ 'task-event': ['event'],
60
+ 'task-invalidation': ['reconcile'],
61
+ 'task-override': ['diagnose', 'issue', 'consume'],
62
+ 'task-lifecycle': ['intent'],
63
+ 'task-finalization': ['complete'],
64
+ 'task-short-id': ['list', 'list-verify', 'alloc', 'release', 'resolve'],
65
+ 'task-snapshot': ['snapshot'],
66
+ 'task-verify': ['event'],
67
+ 'task-validate': ['snapshot', 'inplace']
68
+ });
69
+ export const INTERNAL_CLI_ROUTE_SELECTORS = INTERNAL_HANDLER_ROUTE_SELECTORS;
70
+ function first(args) {
71
+ return args[0] ?? '';
72
+ }
73
+ function optionValue(args, name) {
74
+ const index = args.indexOf(name);
75
+ if (index >= 0)
76
+ return args[index + 1];
77
+ const prefix = `${name}=`;
78
+ return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);
79
+ }
80
+ export function internalRouteSelector(command, args) {
81
+ if (command === 'sandbox-control')
82
+ return first(args);
83
+ if (command === 'task-create')
84
+ return 'input';
85
+ if (command === 'task-qualification')
86
+ return args[1] ?? '';
87
+ if (command === 'task-lifecycle')
88
+ return args[1] ? 'intent' : '';
89
+ if (command === 'task-finalization')
90
+ return args[1] === 'complete' ? 'complete' : '';
91
+ if (command === 'task-event')
92
+ return args[1] ? 'event' : '';
93
+ if (command === 'task-verify')
94
+ return args[0] && args[1] ? 'event' : '';
95
+ if (command === 'task-snapshot')
96
+ return 'snapshot';
97
+ if (command === 'task-validate')
98
+ return optionValue(args, '--scope') ?? 'snapshot';
99
+ if (command === 'task-short-id')
100
+ return first(args) === 'list' && args.includes('--verify') ? 'list-verify' : first(args);
101
+ if (command === 'task-orchestration')
102
+ return args[1] === 'status' ? 'status' : args[1] ? 'progress' : '';
103
+ if (command === 'task-review')
104
+ return args[1] ?? '';
105
+ if (command === 'task-invalidation')
106
+ return args[1] ?? '';
107
+ if (command === 'task-override')
108
+ return args[1] ?? '';
109
+ if (command === 'task-artifact')
110
+ return args[1] ?? '';
111
+ if (command === 'platform-pr-review' && first(args) === 'publish') {
112
+ const scope = optionValue(args, '--scope') ?? '';
113
+ return /^TASK-\d{8}-\d{6}$/u.test(scope) ? 'publish-task' : /^pr\d+$/u.test(scope) ? 'publish-pr' : '';
114
+ }
115
+ if (['task-ledger', 'task-warning', 'task-activity'].includes(command))
116
+ return args[1] ?? '';
117
+ if (command === 'task-delivery')
118
+ return args[1] ?? '';
119
+ if (command === 'task-context')
120
+ return first(args);
121
+ return first(args);
122
+ }
123
+ export function isInternalHandlerRoute(command, args) {
124
+ if (args[0] === '--help' || args[0] === '-h')
125
+ return true;
126
+ const selector = internalRouteSelector(command, args);
127
+ const selectors = INTERNAL_HANDLER_ROUTE_SELECTORS[command];
128
+ return Boolean(selector && selectors?.some((candidate) => candidate === selector));
129
+ }
130
+ /**
131
+ * Marks a selector at the handler's actual dispatch branch.
132
+ *
133
+ * The call is intentionally side-effect free so the top-level task-view guard
134
+ * can still run before a handler module is imported. Route coverage tests read
135
+ * these branch markers independently from the pre-import inventory.
136
+ */
137
+ export function internalHandlerRoute(command, selector, actualSelector) {
138
+ return command.length > 0 && selector === actualSelector;
139
+ }
140
+ export function ensureInternalHandlerRoute(command, args) {
141
+ if (isInternalHandlerRoute(command, args))
142
+ return true;
143
+ const selector = internalRouteSelector(command, args);
144
+ process.stdout.write(`${JSON.stringify({
145
+ status: 'failed',
146
+ changed: false,
147
+ error: { code: 'INTERNAL_ROUTE_UNREGISTERED', message: `operation '${command} ${selector || first(args)}' is not registered` }
148
+ })}\n`);
149
+ process.exitCode = 1;
150
+ return false;
151
+ }
152
+ //# sourceMappingURL=cli-route-inventory.js.map
@@ -10,6 +10,7 @@ import { verifyCodexSandboxControllerContextWithWarnings } from '../agent-client
10
10
  import { resolveTaskRef } from '../task/resolve-ref.js';
11
11
  import { hasSealableOrchestrationDelegation } from '../task/orchestration.js';
12
12
  import { activateCodexOrchestrationDelegation, activateCodexSpawnDelegation, reconcileCodexOrchestrationDelegation, sealCodexOrchestrationDelegation, sealCodexParentDelegation } from '../task/codex-orchestration.js';
13
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
13
14
  const USAGE = 'Usage: agent-infra-internal codex-lifecycle <capability-arm|hook-event|resolve-start|resolve-stop|preflight|consume> [options]\n';
14
15
  const MANAGED_AGENT = /^agent-infra-lifecycle-(executor|reviewer)$/;
15
16
  function output(value) {
@@ -144,11 +145,13 @@ function payloadText(payload, key) {
144
145
  : '';
145
146
  }
146
147
  async function codexLifecycle(args = []) {
148
+ if (!ensureInternalHandlerRoute('codex-lifecycle', args))
149
+ return;
147
150
  const parsed = parse(args);
148
151
  if (!parsed || process.exitCode)
149
152
  return;
150
153
  try {
151
- if (parsed.operation === 'preflight') {
154
+ if (internalHandlerRoute('codex-lifecycle', 'preflight', parsed.operation)) {
152
155
  const format = parsed.values['--format'] ?? 'json';
153
156
  if (!['text', 'json'].includes(format))
154
157
  throw new Error("format must be 'text' or 'json'");
@@ -173,7 +176,7 @@ async function codexLifecycle(args = []) {
173
176
  output({ status: 'ready', changed: false, evidence: result, diagnostics: result.diagnostics, error: null });
174
177
  return;
175
178
  }
176
- if (parsed.operation === 'capability-arm') {
179
+ if (internalHandlerRoute('codex-lifecycle', 'capability-arm', parsed.operation)) {
177
180
  const taskId = parsed.values['--task-id'];
178
181
  if (!taskId)
179
182
  throw new Error('capability-arm requires --task-id');
@@ -197,7 +200,7 @@ async function codexLifecycle(args = []) {
197
200
  return;
198
201
  }
199
202
  const store = createCodexLifecycleStore({ cliVersion: cliVersion() });
200
- if (parsed.operation === 'hook-event') {
203
+ if (internalHandlerRoute('codex-lifecycle', 'hook-event', parsed.operation)) {
201
204
  const phase = parsed.values['--event'];
202
205
  if (!phase || !['pre-tool', 'subagent-start', 'post-tool', 'subagent-stop'].includes(phase)) {
203
206
  throw new Error('hook-event requires a known --event');
@@ -337,7 +340,7 @@ async function codexLifecycle(args = []) {
337
340
  const childThreadId = parsed.values['--child-id'];
338
341
  if (!childThreadId)
339
342
  throw new Error(`operation '${parsed.operation}' requires --child-id`);
340
- if (parsed.operation === 'resolve-start') {
343
+ if (internalHandlerRoute('codex-lifecycle', 'resolve-start', parsed.operation)) {
341
344
  if (store.read(childThreadId).state.spawn?.hookDefinitionHash !== hookDefinitionHash()) {
342
345
  throw new Error('Codex lifecycle hook definition hash is stale');
343
346
  }
@@ -351,7 +354,7 @@ async function codexLifecycle(args = []) {
351
354
  process.exitCode = 1;
352
355
  return;
353
356
  }
354
- if (parsed.operation === 'resolve-stop') {
357
+ if (internalHandlerRoute('codex-lifecycle', 'resolve-stop', parsed.operation)) {
355
358
  const stopTurnId = store.read(childThreadId).state.stop?.turnId;
356
359
  if (!stopTurnId)
357
360
  throw new Error('Codex lifecycle stop hook is not available');
@@ -363,7 +366,7 @@ async function codexLifecycle(args = []) {
363
366
  output({ status: latest.state.status, changed: true, evidence: latest.state.stopEvidence, diagnostics: [], error: latest.state.error });
364
367
  return;
365
368
  }
366
- if (parsed.operation === 'consume') {
369
+ if (internalHandlerRoute('codex-lifecycle', 'consume', parsed.operation)) {
367
370
  const consumer = parsed.values['--consumer'];
368
371
  if (!consumer)
369
372
  throw new Error('consume requires --consumer');
@@ -1,4 +1,5 @@
1
1
  import { runCodexSandboxController, verifyCodexSandboxControllerContextWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
2
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
2
3
  const USAGE = 'Usage: agent-infra-internal codex-sandbox-controller <run|verify-context> [options]\n';
3
4
  function fail(code, message, exitCode = 1) {
4
5
  process.stdout.write(`${JSON.stringify({
@@ -14,7 +15,10 @@ function parse(args) {
14
15
  return null;
15
16
  }
16
17
  const operation = args[0];
17
- if (!operation || !['run', 'verify-context'].includes(operation)) {
18
+ if (!operation || ![
19
+ internalHandlerRoute('codex-sandbox-controller', 'run', operation),
20
+ internalHandlerRoute('codex-sandbox-controller', 'verify-context', operation)
21
+ ].some(Boolean)) {
18
22
  process.stderr.write(USAGE);
19
23
  fail('CODEX_SANDBOX_CONTROLLER_PAYLOAD_INVALID', 'operation must be run or verify-context', 2);
20
24
  return null;
@@ -44,11 +48,13 @@ function parse(args) {
44
48
  return { operation, values };
45
49
  }
46
50
  async function codexSandboxController(args = []) {
51
+ if (!ensureInternalHandlerRoute('codex-sandbox-controller', args))
52
+ return;
47
53
  const parsed = parse(args);
48
54
  if (!parsed || process.exitCode)
49
55
  return;
50
56
  try {
51
- if (parsed.operation === 'verify-context') {
57
+ if (internalHandlerRoute('codex-sandbox-controller', 'verify-context', parsed.operation)) {
52
58
  const contextPath = parsed.values['--context']
53
59
  ?? process.env.AGENT_INFRA_CODEX_CONTROLLER_CONTEXT;
54
60
  if (!contextPath)
@@ -3,42 +3,46 @@ import { inspectGitWorkflow, previewCommitTree, pushRebasedBranch } from '../git
3
3
  import { compareReviewTrees, snapshotReview } from '../git/review-snapshot.js';
4
4
  import { resolvePostReviewGlobs } from '../task/review-fingerprint.js';
5
5
  import { executeCommitOperation } from '../task/commit-operation.js';
6
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
6
7
  function output(value) { process.stdout.write(`${JSON.stringify(value)}\n`); }
7
8
  function gitWorkflow(args = []) {
9
+ if (!ensureInternalHandlerRoute('git-workflow', args))
10
+ return;
8
11
  const [action, ...rest] = args;
9
12
  const cwdIndex = rest.indexOf('--cwd');
10
13
  const cwd = cwdIndex >= 0 ? rest[cwdIndex + 1] : process.cwd();
11
14
  let result;
12
- if (action === 'inspect') {
15
+ if (internalHandlerRoute('git-workflow', 'inspect', action ?? '')) {
13
16
  const inputIndex = rest.indexOf('--input');
14
17
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
15
18
  result = inspectGitWorkflow(cwd ?? process.cwd(), undefined, input?.remote && input.refs ? { remote: input.remote, refs: input.refs } : undefined);
16
19
  }
17
- else if (action === 'commit') {
20
+ else if (internalHandlerRoute('git-workflow', 'commit', action ?? '')) {
18
21
  const inputIndex = rest.indexOf('--input');
19
22
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
20
23
  result = input
21
24
  ? executeCommitOperation({ cwd: cwd ?? process.cwd(), ...input })
22
25
  : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
23
26
  }
24
- else if (action === 'push-rebased') {
27
+ else if (internalHandlerRoute('git-workflow', 'push-rebased', action ?? '')) {
25
28
  const inputIndex = rest.indexOf('--input');
26
29
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
27
30
  result = input ? pushRebasedBranch({ cwd: cwd ?? process.cwd(), ...input }) : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
28
31
  }
29
- else if (action === 'preview-tree') {
32
+ else if (internalHandlerRoute('git-workflow', 'preview-tree', action ?? '')) {
30
33
  const inputIndex = rest.indexOf('--input');
31
34
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
32
35
  result = input
33
36
  ? previewCommitTree({ cwd: cwd ?? process.cwd(), paths: input.paths, expectedHead: input.expectedHead })
34
37
  : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
35
38
  }
36
- else if (action === 'snapshot' || action === 'compare-trees') {
39
+ else if (internalHandlerRoute('git-workflow', 'snapshot', action ?? '')
40
+ || internalHandlerRoute('git-workflow', 'compare-trees', action ?? '')) {
37
41
  const inputIndex = rest.indexOf('--input');
38
42
  const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1], 'utf8')) : null;
39
43
  if (!input)
40
44
  result = { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
41
- else if (action === 'snapshot')
45
+ else if (internalHandlerRoute('git-workflow', 'snapshot', action ?? ''))
42
46
  result = { status: 'no-op', changed: false, snapshot: snapshotReview({ cwd: cwd ?? process.cwd(), mode: input.mode, baseline: input.baseline, diffBase: input.diffBase, globs: input.globs ?? resolvePostReviewGlobs({}, {}) }), error: null };
43
47
  else
44
48
  result = { status: 'no-op', changed: false, comparison: compareReviewTrees({ cwd: cwd ?? process.cwd(), expected: input.expected, actual: input.actual }), error: null };
@@ -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