@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
@@ -6,6 +6,7 @@ import {
6
6
  import type { ConsumeHumanOverrideRequest, HumanOverrideRequest } from '../task/human-override.ts';
7
7
  import { resolveTaskRef } from '../task/resolve-ref.ts';
8
8
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
9
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
9
10
 
10
11
  const USAGE = `Usage: agent-infra-internal task-override <task-ref> <diagnose|issue|consume> [options]
11
12
 
@@ -38,9 +39,14 @@ function usageFailure(message: string): void {
38
39
  }
39
40
 
40
41
  async function taskOverride(args: string[] = []): Promise<void> {
42
+ if (!ensureInternalHandlerRoute('task-override', args)) return;
41
43
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
42
44
  const [taskRef, operation] = args;
43
- if (!taskRef || !operation || !['diagnose', 'issue', 'consume'].includes(operation)) {
45
+ if (!taskRef || !operation || ![
46
+ internalHandlerRoute('task-override', 'diagnose', operation ?? ''),
47
+ internalHandlerRoute('task-override', 'issue', operation ?? ''),
48
+ internalHandlerRoute('task-override', 'consume', operation ?? '')
49
+ ].some(Boolean)) {
44
50
  usageFailure('task ref and a valid operation are required');
45
51
  return;
46
52
  }
@@ -75,13 +81,13 @@ async function taskOverride(args: string[] = []): Promise<void> {
75
81
 
76
82
  let result;
77
83
  try {
78
- if (operation === 'diagnose') {
84
+ if (internalHandlerRoute('task-override', 'diagnose', operation)) {
79
85
  result = await diagnoseHumanOverrideForTask(
80
86
  taskRef,
81
87
  values.failureId ? String(values.failureId) : undefined,
82
88
  values.target ? String(values.target) : undefined
83
89
  );
84
- } else if (operation === 'issue') {
90
+ } else if (internalHandlerRoute('task-override', 'issue', operation)) {
85
91
  result = await withTaskExecutionLock(
86
92
  resolved.repoRoot,
87
93
  resolved.taskId,
@@ -0,0 +1,61 @@
1
+ import fs from 'node:fs';
2
+
3
+ import { applyQualificationConfirmation } from '../task/qualification-confirmation.ts';
4
+ import type { QualificationConfirmationRequest } from '../task/qualification-confirmation.ts';
5
+ import { applyQualificationProposal } from '../task/qualification-intents.ts';
6
+ import type { QualificationProposalRequest } from '../task/qualification-intents.ts';
7
+ import { resolveTaskRef } from '../task/resolve-ref.ts';
8
+ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
9
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
10
+
11
+ const USAGE = `Usage: agent-infra-internal task-qualification <task-ref> <proposal|confirm|supersede|revoke> --input <json-file> [--dry-run]\n`;
12
+
13
+ function fail(message: string, code = 'QUALIFICATION_PROPOSAL_INVALID'): void {
14
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code, message } })}\n`);
15
+ process.stderr.write(USAGE);
16
+ process.exitCode = 1;
17
+ }
18
+
19
+ async function taskQualification(args: string[] = []): Promise<void> {
20
+ const [taskRef, operation] = args;
21
+ const registered = [
22
+ internalHandlerRoute('task-qualification', 'proposal', operation ?? ''),
23
+ internalHandlerRoute('task-qualification', 'confirm', operation ?? ''),
24
+ internalHandlerRoute('task-qualification', 'supersede', operation ?? ''),
25
+ internalHandlerRoute('task-qualification', 'revoke', operation ?? '')
26
+ ].some(Boolean);
27
+ if (!registered) {
28
+ fail('task ref and a valid qualification operation are required');
29
+ return;
30
+ }
31
+ if (!ensureInternalHandlerRoute('task-qualification', args)) return;
32
+ if (!taskRef || !['proposal', 'confirm', 'supersede', 'revoke'].includes(operation ?? '')) { fail('task ref and a valid qualification operation are required'); return; }
33
+ let inputPath = '';
34
+ let dryRun = false;
35
+ for (let index = 2; index < args.length; index += 1) {
36
+ const arg = args[index]!;
37
+ if (arg === '--dry-run') { if (dryRun) { fail('duplicate option --dry-run'); return; } dryRun = true; continue; }
38
+ if (arg !== '--input' || inputPath) { fail(`unknown or duplicate option '${arg}'`); return; }
39
+ inputPath = args[++index] ?? '';
40
+ if (!inputPath || inputPath.startsWith('--')) { fail("option '--input' requires a value"); return; }
41
+ }
42
+ if (!inputPath) { fail("option '--input' is required"); return; }
43
+ let payload: unknown;
44
+ try { payload = JSON.parse(fs.readFileSync(inputPath, 'utf8')); }
45
+ catch (error) { fail(`cannot read qualification input: ${error instanceof Error ? error.message : String(error)}`); return; }
46
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) { fail('qualification input must be an object'); return; }
47
+ const resolved = resolveTaskRef(taskRef);
48
+ if (!resolved.ok) { fail(resolved.message, resolved.code); return; }
49
+ try {
50
+ const result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-qualification.${operation}`, () => operation === 'proposal'
51
+ ? applyQualificationProposal({ ...(payload as Record<string, unknown>), taskRef: resolved.taskId, dryRun } as QualificationProposalRequest, { repoRoot: resolved.repoRoot })
52
+ : applyQualificationConfirmation({ ...(payload as Record<string, unknown>), taskRef: resolved.taskId, operation, dryRun } as QualificationConfirmationRequest, { repoRoot: resolved.repoRoot }));
53
+ process.stdout.write(`${JSON.stringify(result)}\n`);
54
+ if (result.status === 'failed') process.exitCode = 1;
55
+ } catch (error) {
56
+ if (error instanceof TaskExecutionLockError) fail(`${error.code}: ${error.message}`, error.code);
57
+ else throw error;
58
+ }
59
+ }
60
+
61
+ export { taskQualification };
@@ -1,7 +1,9 @@
1
+ import { parseReviewCommand } from '../task/review-command.ts';
1
2
  import { finalizeReviewSummary } from '../task/review-finalization.ts';
2
3
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.ts';
3
4
  import { resolveTaskRef } from '../task/resolve-ref.ts';
4
5
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
6
+ import { ensureInternalHandlerRoute } from './cli-route-inventory.ts';
5
7
 
6
8
  const USAGE = 'Usage: agent-infra-internal task-review <task-ref> finalize-summary --stage <analysis|plan|code> --artifact <review-*.md> [--orchestrated] [--dry-run] [--override-ticket <ticket> --override-target <target> --override-scope <scope>]\n';
7
9
 
@@ -17,60 +19,15 @@ function failUsage(message: string): void {
17
19
  }
18
20
 
19
21
  async function taskReview(args: string[] = []): Promise<void> {
22
+ if (!ensureInternalHandlerRoute('task-review', args)) return;
20
23
  if (args[0] === '--help' || args[0] === '-h') {
21
24
  process.stdout.write(USAGE);
22
25
  return;
23
26
  }
24
- if (args.length < 2) {
25
- failUsage('task ref and intent are required');
26
- return;
27
- }
28
- if (args[1] !== 'finalize-summary') {
29
- failUsage(`unknown intent '${args[1]}'`);
30
- return;
31
- }
32
- let stage = '';
33
- let artifact = '';
34
- let dryRun = false;
35
- let orchestrated = false;
36
- let overrideTicket = '';
37
- let overrideTarget = '';
38
- let overrideScope = '';
39
- const seen = new Set<string>();
40
- for (let index = 2; index < args.length; index += 1) {
41
- const flag = args[index]!;
42
- if (!['--stage', '--artifact', '--orchestrated', '--dry-run', '--override-ticket', '--override-target', '--override-scope'].includes(flag)) {
43
- failUsage(`unknown option '${flag}'`);
44
- return;
45
- }
46
- if (seen.has(flag)) {
47
- failUsage(`duplicate option '${flag}'`);
48
- return;
49
- }
50
- seen.add(flag);
51
- if (flag === '--dry-run') {
52
- dryRun = true;
53
- continue;
54
- }
55
- if (flag === '--orchestrated') {
56
- orchestrated = true;
57
- continue;
58
- }
59
- const value = args[++index];
60
- if (!value || value.startsWith('--')) {
61
- failUsage(`option '${flag}' requires a value`);
62
- return;
63
- }
64
- if (flag === '--stage') stage = value;
65
- else if (flag === '--artifact') artifact = value;
66
- else if (flag === '--override-ticket') overrideTicket = value;
67
- else if (flag === '--override-target') overrideTarget = value;
68
- else if (flag === '--override-scope') overrideScope = value;
69
- }
70
- if (!stage || !artifact) {
71
- failUsage("options '--stage' and '--artifact' are required");
72
- return;
73
- }
27
+ let request;
28
+ try { request = parseReviewCommand(args); }
29
+ catch (error) { failUsage(error instanceof Error ? error.message : String(error)); return; }
30
+ const { stage, artifact, dryRun, orchestrated, overrideTicket, overrideTarget, overrideScope } = request;
74
31
  const dryRunConflict = overrideDryRunConflict({ dryRun, overrideTicket, overrideTarget, overrideScope });
75
32
  if (dryRunConflict) { failUsage(dryRunConflict.message); return; }
76
33
  const resolved = resolveTaskRef(args[0]!);
@@ -2,6 +2,7 @@ import path from 'node:path';
2
2
 
3
3
  import { detectRepoRoot } from '../task/resolve-ref.ts';
4
4
  import { configuredShortIdLength, executeShortIdCommand } from '../task/short-id.ts';
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
5
6
 
6
7
  const USAGE = `Usage: agent-infra-internal task-short-id <alloc|release|resolve|list> [argument] [--active-dir <path>] [--short-id-length <N>] [--verify]\n`;
7
8
 
@@ -12,9 +13,17 @@ function failure(message: string): void {
12
13
  }
13
14
 
14
15
  function taskShortId(args: string[] = []): void {
16
+ if (!ensureInternalHandlerRoute('task-short-id', args)) return;
15
17
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
16
18
  const operation = args[0];
17
- if (!operation || !['alloc', 'release', 'resolve', 'list'].includes(operation)) { failure('a valid short-id operation is required'); return; }
19
+ const route = operation === 'list' && args.includes('--verify') ? 'list-verify' : operation ?? '';
20
+ if (!operation || ![
21
+ internalHandlerRoute('task-short-id', 'alloc', route),
22
+ internalHandlerRoute('task-short-id', 'release', route),
23
+ internalHandlerRoute('task-short-id', 'resolve', route),
24
+ internalHandlerRoute('task-short-id', 'list', route),
25
+ internalHandlerRoute('task-short-id', 'list-verify', route)
26
+ ].some(Boolean)) { failure('a valid short-id operation is required'); return; }
18
27
  const positional: string[] = [];
19
28
  let activeDir: string | null = null;
20
29
  let shortIdLength: number | null = null;
@@ -1,4 +1,5 @@
1
1
  import { collectTaskSnapshot } from '../task/snapshot.ts';
2
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
2
3
 
3
4
  const USAGE = 'Usage: agent-infra-internal task-snapshot <N | TASK-id> [--format json|text]\n';
4
5
 
@@ -9,8 +10,9 @@ function fail(message: string): void {
9
10
  }
10
11
 
11
12
  function taskSnapshot(args: string[] = []): void {
13
+ if (!ensureInternalHandlerRoute('task-snapshot', args)) return;
12
14
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
13
- if (!args[0] || args[0].startsWith('--')) { fail('task ref is required'); return; }
15
+ if (!args[0] || args[0].startsWith('--') || !internalHandlerRoute('task-snapshot', 'snapshot', 'snapshot')) { fail('task ref is required'); return; }
14
16
  let format: 'json' | 'text' = 'json';
15
17
  let seenFormat = false;
16
18
  for (let index = 1; index < args.length; index += 1) {
@@ -24,8 +24,12 @@ import {
24
24
  } from '../sandbox/control/protocol.ts';
25
25
  import { getProcessStartTime } from '../server/process-state.ts';
26
26
  import { assertGitWorktreeBinding } from '../git/worktree-identity.ts';
27
+ import { createManualValidationEvidence, manualValidationEvidenceSummary } from '../task/manual-validation-evidence.ts';
28
+ import type { ManualValidationCleanup } from '../task/manual-validation-evidence.ts';
29
+ import { writeJsonAtomic } from '../task/manual-validation-shared.ts';
30
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
27
31
 
28
- const USAGE = `Usage: agent-infra-internal task-validate <branch | TASK-id | N> [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command> [args...]`;
32
+ const USAGE = `Usage: agent-infra-internal task-validate <branch | TASK-id | N> [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] [--evidence-file <path>] -- <command> [args...]`;
29
33
  const MAX_TIMEOUT_MS = 60 * 60 * 1000;
30
34
  const RECOVERY_GRACE_MS = 30_000;
31
35
 
@@ -34,13 +38,14 @@ type ValidateOptions = {
34
38
  scope: 'snapshot' | 'inplace';
35
39
  timeoutMs: number;
36
40
  format: 'text' | 'json';
41
+ evidenceFile: string | null;
37
42
  command: string[];
38
43
  help: boolean;
39
44
  };
40
45
 
41
46
  export function parseValidateArgs(args: string[]): ValidateOptions {
42
47
  if (args.includes('--help') || args.includes('-h')) {
43
- return { target: '', scope: 'snapshot', timeoutMs: 300_000, format: 'text', command: [], help: true };
48
+ return { target: '', scope: 'snapshot', timeoutMs: 300_000, format: 'text', evidenceFile: null, command: [], help: true };
44
49
  }
45
50
  const separator = args.indexOf('--');
46
51
  if (separator < 0) throw new Error(`${USAGE}\nA literal -- must separate validation options from the command.`);
@@ -49,6 +54,7 @@ export function parseValidateArgs(args: string[]): ValidateOptions {
49
54
  let scope: ValidateOptions['scope'] = 'snapshot';
50
55
  let timeoutMs = 300_000;
51
56
  let format: ValidateOptions['format'] = 'text';
57
+ let evidenceFile: string | null = null;
52
58
  const positionals: string[] = [];
53
59
  for (let index = 0; index < optionArgs.length; index += 1) {
54
60
  const arg = optionArgs[index]!;
@@ -64,6 +70,10 @@ export function parseValidateArgs(args: string[]): ValidateOptions {
64
70
  const value = optionArgs[++index];
65
71
  if (value !== 'text' && value !== 'json') throw new Error('validate --format must be text or json');
66
72
  format = value;
73
+ } else if (arg === '--evidence-file') {
74
+ const value = optionArgs[++index];
75
+ if (!value || value.startsWith('-')) throw new Error('validate --evidence-file requires a path');
76
+ evidenceFile = value;
67
77
  } else if (arg.startsWith('-')) {
68
78
  throw new Error(`Unknown option: ${arg}`);
69
79
  } else {
@@ -71,7 +81,7 @@ export function parseValidateArgs(args: string[]): ValidateOptions {
71
81
  }
72
82
  }
73
83
  if (positionals.length !== 1 || command.length === 0) throw new Error(USAGE);
74
- return { target: positionals[0]!, scope, timeoutMs, format, command, help: false };
84
+ return { target: positionals[0]!, scope, timeoutMs, format, evidenceFile, command, help: false };
75
85
  }
76
86
 
77
87
  function runValidationCommand(command: string[], cwd: string, scope: string, timeoutMs: number, json: boolean) {
@@ -271,6 +281,7 @@ function sniffFormat(args: string[]): 'text' | 'json' {
271
281
  }
272
282
 
273
283
  function taskValidate(args: string[]): void {
284
+ if (!ensureInternalHandlerRoute('task-validate', args)) return;
274
285
  let options: ValidateOptions;
275
286
  try {
276
287
  options = parseValidateArgs(args);
@@ -287,26 +298,35 @@ function taskValidate(args: string[]): void {
287
298
  const target = resolveSandboxTarget(options.target, config.repoRoot);
288
299
  const commit = git(config.repoRoot, ['rev-parse', target.branch]);
289
300
  const startedAt = new Date().toISOString();
290
- const result = options.scope === 'snapshot'
301
+ const result = internalHandlerRoute('task-validate', 'snapshot', options.scope)
291
302
  ? snapshotValidation(config.repoRoot, commit, options)
292
- : inplaceValidation(config, target, options);
293
- const evidence = {
294
- version: 1,
303
+ : internalHandlerRoute('task-validate', 'inplace', options.scope)
304
+ ? inplaceValidation(config, target, options)
305
+ : (() => { throw new Error('TASK_VALIDATE_SCOPE_UNREGISTERED'); })();
306
+ const cleanup = result.cleanup() as ManualValidationCleanup;
307
+ const evidence = createManualValidationEvidence({
308
+ mode: target.workspace.mode,
295
309
  taskId: target.workspace.mode === 'task-bound' ? target.workspace.taskId : null,
296
310
  branch: target.branch,
297
- scope: options.scope,
298
311
  commit,
312
+ recoverable: target.workspace.mode === 'task-bound',
313
+ scope: options.scope,
299
314
  command: path.basename(options.command[0]!),
300
315
  startedAt,
301
316
  completedAt: new Date().toISOString(),
302
317
  exitCode: result.exitCode,
303
318
  signal: result.signal,
304
- cleanup: result.cleanup()
305
- };
319
+ cleanup
320
+ });
321
+ if (options.evidenceFile) {
322
+ try { writeJsonAtomic(path.resolve(options.evidenceFile), evidence); }
323
+ catch (error) { throw new Error(`MANUAL_VALIDATION_EVIDENCE_WRITE_FAILED: ${error instanceof Error ? error.message : String(error)}`); }
324
+ }
325
+ const evidenceSummary = manualValidationEvidenceSummary(evidence);
306
326
  if (options.format === 'json') {
307
- process.stdout.write(`${JSON.stringify({ status: 'applied', changed: false, evidence, error: null })}\n`);
327
+ process.stdout.write(`${JSON.stringify({ status: 'applied', changed: false, evidence: evidenceSummary, evidenceFile: options.evidenceFile, error: null })}\n`);
308
328
  } else {
309
- process.stdout.write(`Validation ${result.exitCode === 0 ? 'passed' : 'failed'} (${options.scope}, ${evidence.command}, cleanup=${evidence.cleanup}).\n`);
329
+ process.stdout.write(`Validation ${result.exitCode === 0 ? 'passed' : 'failed'} (${options.scope}, ${evidenceSummary.command}, cleanup=${evidenceSummary.cleanup}).\n`);
310
330
  }
311
331
  process.exitCode = result.exitCode;
312
332
  } catch (error) {
@@ -2,6 +2,7 @@ import { renderTaskVerification, verifyTaskEvent } from '../task/verification.ts
2
2
  import { consumeHumanOverride, failureId } from '../task/human-override.ts';
3
3
  import { resolveTaskRef } from '../task/resolve-ref.ts';
4
4
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
5
6
 
6
7
  const USAGE = 'Usage: agent-infra-internal task-verify <N | TASK-id> <verification-event> [--artifact <canonical.md>] [--format json|text] [--override-ticket <ticket> --override-target <target> --override-scope <scope>]\n';
7
8
 
@@ -12,8 +13,10 @@ function fail(message: string): void {
12
13
  }
13
14
 
14
15
  async function taskVerify(args: string[] = []): Promise<void> {
16
+ if (!ensureInternalHandlerRoute('task-verify', args)) return;
15
17
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
16
- if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')) { fail('task ref and verification event are required'); return; }
18
+ if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')
19
+ || !internalHandlerRoute('task-verify', 'event', args[1] ? 'event' : '')) { fail('task ref and verification event are required'); return; }
17
20
  const taskRef = args[0];
18
21
  const event = args[1];
19
22
  let artifact: string | undefined;
@@ -3,6 +3,7 @@ import type { WorkflowWarningIntent } from '../task/workflow-warning-intents.ts'
3
3
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.ts';
4
4
  import { resolveTaskRef } from '../task/resolve-ref.ts';
5
5
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
6
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
6
7
 
7
8
  const USAGE = `Usage: agent-infra-internal task-warning <task-ref> <add|set-status|list> [intent flags] [--dry-run]\n`;
8
9
  const FLAGS: Record<string, string> = {
@@ -18,9 +19,14 @@ function usageFailure(message: string): void {
18
19
  }
19
20
 
20
21
  async function taskWarning(args: string[] = []): Promise<void> {
22
+ if (!ensureInternalHandlerRoute('task-warning', args)) return;
21
23
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
22
24
  const [taskRef, kind] = args;
23
- if (!taskRef || !kind || !['add', 'set-status', 'list'].includes(kind)) { usageFailure('task ref and a valid intent are required'); return; }
25
+ if (!taskRef || !kind || ![
26
+ internalHandlerRoute('task-warning', 'add', kind ?? ''),
27
+ internalHandlerRoute('task-warning', 'set-status', kind ?? ''),
28
+ internalHandlerRoute('task-warning', 'list', kind ?? '')
29
+ ].some(Boolean)) { usageFailure('task ref and a valid intent are required'); return; }
24
30
  const values: Record<string, unknown> = { kind, taskRef };
25
31
  const seen = new Set<string>();
26
32
  for (let index = 2; index < args.length; index += 1) {
@@ -0,0 +1,26 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ // Inspect descendants without following symlinks. The caller supplies the trusted root.
5
+ export function inspectOwnedPath(rootInput: string, targetInput: string, expect: 'file' | 'directory'): fs.Stats | null {
6
+ const root = path.resolve(rootInput);
7
+ const target = path.resolve(targetInput);
8
+ const relative = path.relative(root, target);
9
+ if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) return null;
10
+ try {
11
+ const rootStat = fs.lstatSync(root);
12
+ if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) return null;
13
+ let current = root;
14
+ for (const segment of relative.split(path.sep)) {
15
+ current = path.join(current, segment);
16
+ const stat = fs.lstatSync(current);
17
+ if (stat.isSymbolicLink()) return null;
18
+ if (process.platform !== 'win32' && typeof process.getuid === 'function' && stat.uid !== process.getuid()) return null;
19
+ if (current === target) return (expect === 'file' ? stat.isFile() : stat.isDirectory()) ? stat : null;
20
+ if (!stat.isDirectory()) return null;
21
+ }
22
+ } catch {
23
+ return null;
24
+ }
25
+ return null;
26
+ }
@@ -0,0 +1,9 @@
1
+ import type { PlatformCheckSnapshot } from './snapshots.ts';
2
+
3
+ export function checkStatusBucket(status: string): PlatformCheckSnapshot['bucket'] {
4
+ const value = status.toLowerCase();
5
+ if (['pass', 'success', 'successful', 'neutral'].includes(value)) return 'pass';
6
+ if (['fail', 'failure', 'failed', 'error', 'timed_out', 'action_required'].includes(value)) return 'fail';
7
+ if (['cancel', 'cancelled', 'canceled', 'skipped', 'stale'].includes(value)) return 'cancel';
8
+ return 'pending';
9
+ }