@fitlab-ai/agent-infra 0.9.13 → 0.9.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -0,0 +1,90 @@
1
+ import fs from 'node:fs';
2
+ import { applyQualificationConfirmation } from '../task/qualification-confirmation.js';
3
+ import { applyQualificationProposal } from '../task/qualification-intents.js';
4
+ import { resolveTaskRef } from '../task/resolve-ref.js';
5
+ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
6
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
7
+ const USAGE = `Usage: agent-infra-internal task-qualification <task-ref> <proposal|confirm|supersede|revoke> --input <json-file> [--dry-run]\n`;
8
+ function fail(message, code = 'QUALIFICATION_PROPOSAL_INVALID') {
9
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code, message } })}\n`);
10
+ process.stderr.write(USAGE);
11
+ process.exitCode = 1;
12
+ }
13
+ async function taskQualification(args = []) {
14
+ const [taskRef, operation] = args;
15
+ const registered = [
16
+ internalHandlerRoute('task-qualification', 'proposal', operation ?? ''),
17
+ internalHandlerRoute('task-qualification', 'confirm', operation ?? ''),
18
+ internalHandlerRoute('task-qualification', 'supersede', operation ?? ''),
19
+ internalHandlerRoute('task-qualification', 'revoke', operation ?? '')
20
+ ].some(Boolean);
21
+ if (!registered) {
22
+ fail('task ref and a valid qualification operation are required');
23
+ return;
24
+ }
25
+ if (!ensureInternalHandlerRoute('task-qualification', args))
26
+ return;
27
+ if (!taskRef || !['proposal', 'confirm', 'supersede', 'revoke'].includes(operation ?? '')) {
28
+ fail('task ref and a valid qualification operation are required');
29
+ return;
30
+ }
31
+ let inputPath = '';
32
+ let dryRun = false;
33
+ for (let index = 2; index < args.length; index += 1) {
34
+ const arg = args[index];
35
+ if (arg === '--dry-run') {
36
+ if (dryRun) {
37
+ fail('duplicate option --dry-run');
38
+ return;
39
+ }
40
+ dryRun = true;
41
+ continue;
42
+ }
43
+ if (arg !== '--input' || inputPath) {
44
+ fail(`unknown or duplicate option '${arg}'`);
45
+ return;
46
+ }
47
+ inputPath = args[++index] ?? '';
48
+ if (!inputPath || inputPath.startsWith('--')) {
49
+ fail("option '--input' requires a value");
50
+ return;
51
+ }
52
+ }
53
+ if (!inputPath) {
54
+ fail("option '--input' is required");
55
+ return;
56
+ }
57
+ let payload;
58
+ try {
59
+ payload = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
60
+ }
61
+ catch (error) {
62
+ fail(`cannot read qualification input: ${error instanceof Error ? error.message : String(error)}`);
63
+ return;
64
+ }
65
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
66
+ fail('qualification input must be an object');
67
+ return;
68
+ }
69
+ const resolved = resolveTaskRef(taskRef);
70
+ if (!resolved.ok) {
71
+ fail(resolved.message, resolved.code);
72
+ return;
73
+ }
74
+ try {
75
+ const result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-qualification.${operation}`, () => operation === 'proposal'
76
+ ? applyQualificationProposal({ ...payload, taskRef: resolved.taskId, dryRun }, { repoRoot: resolved.repoRoot })
77
+ : applyQualificationConfirmation({ ...payload, taskRef: resolved.taskId, operation, dryRun }, { repoRoot: resolved.repoRoot }));
78
+ process.stdout.write(`${JSON.stringify(result)}\n`);
79
+ if (result.status === 'failed')
80
+ process.exitCode = 1;
81
+ }
82
+ catch (error) {
83
+ if (error instanceof TaskExecutionLockError)
84
+ fail(`${error.code}: ${error.message}`, error.code);
85
+ else
86
+ throw error;
87
+ }
88
+ }
89
+ export { taskQualification };
90
+ //# sourceMappingURL=task-qualification.js.map
@@ -1,7 +1,9 @@
1
+ import { parseReviewCommand } from '../task/review-command.js';
1
2
  import { finalizeReviewSummary } from '../task/review-finalization.js';
2
3
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.js';
3
4
  import { resolveTaskRef } from '../task/resolve-ref.js';
4
5
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
6
+ import { ensureInternalHandlerRoute } from './cli-route-inventory.js';
5
7
  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';
6
8
  function failUsage(message) {
7
9
  process.stdout.write(`${JSON.stringify({
@@ -14,65 +16,21 @@ function failUsage(message) {
14
16
  process.exitCode = 2;
15
17
  }
16
18
  async function taskReview(args = []) {
19
+ if (!ensureInternalHandlerRoute('task-review', args))
20
+ return;
17
21
  if (args[0] === '--help' || args[0] === '-h') {
18
22
  process.stdout.write(USAGE);
19
23
  return;
20
24
  }
21
- if (args.length < 2) {
22
- failUsage('task ref and intent are required');
23
- return;
24
- }
25
- if (args[1] !== 'finalize-summary') {
26
- failUsage(`unknown intent '${args[1]}'`);
27
- return;
28
- }
29
- let stage = '';
30
- let artifact = '';
31
- let dryRun = false;
32
- let orchestrated = false;
33
- let overrideTicket = '';
34
- let overrideTarget = '';
35
- let overrideScope = '';
36
- const seen = new Set();
37
- for (let index = 2; index < args.length; index += 1) {
38
- const flag = args[index];
39
- if (!['--stage', '--artifact', '--orchestrated', '--dry-run', '--override-ticket', '--override-target', '--override-scope'].includes(flag)) {
40
- failUsage(`unknown option '${flag}'`);
41
- return;
42
- }
43
- if (seen.has(flag)) {
44
- failUsage(`duplicate option '${flag}'`);
45
- return;
46
- }
47
- seen.add(flag);
48
- if (flag === '--dry-run') {
49
- dryRun = true;
50
- continue;
51
- }
52
- if (flag === '--orchestrated') {
53
- orchestrated = true;
54
- continue;
55
- }
56
- const value = args[++index];
57
- if (!value || value.startsWith('--')) {
58
- failUsage(`option '${flag}' requires a value`);
59
- return;
60
- }
61
- if (flag === '--stage')
62
- stage = value;
63
- else if (flag === '--artifact')
64
- artifact = value;
65
- else if (flag === '--override-ticket')
66
- overrideTicket = value;
67
- else if (flag === '--override-target')
68
- overrideTarget = value;
69
- else if (flag === '--override-scope')
70
- overrideScope = value;
25
+ let request;
26
+ try {
27
+ request = parseReviewCommand(args);
71
28
  }
72
- if (!stage || !artifact) {
73
- failUsage("options '--stage' and '--artifact' are required");
29
+ catch (error) {
30
+ failUsage(error instanceof Error ? error.message : String(error));
74
31
  return;
75
32
  }
33
+ const { stage, artifact, dryRun, orchestrated, overrideTicket, overrideTarget, overrideScope } = request;
76
34
  const dryRunConflict = overrideDryRunConflict({ dryRun, overrideTicket, overrideTarget, overrideScope });
77
35
  if (dryRunConflict) {
78
36
  failUsage(dryRunConflict.message);
@@ -1,6 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import { detectRepoRoot } from '../task/resolve-ref.js';
3
3
  import { configuredShortIdLength, executeShortIdCommand } from '../task/short-id.js';
4
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
4
5
  const USAGE = `Usage: agent-infra-internal task-short-id <alloc|release|resolve|list> [argument] [--active-dir <path>] [--short-id-length <N>] [--verify]\n`;
5
6
  function failure(message) {
6
7
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, output: '', error: { code: 'SHORT_ID_PAYLOAD_INVALID', message } })}\n`);
@@ -8,12 +9,21 @@ function failure(message) {
8
9
  process.exitCode = 1;
9
10
  }
10
11
  function taskShortId(args = []) {
12
+ if (!ensureInternalHandlerRoute('task-short-id', args))
13
+ return;
11
14
  if (args[0] === '--help' || args[0] === '-h') {
12
15
  process.stdout.write(USAGE);
13
16
  return;
14
17
  }
15
18
  const operation = args[0];
16
- if (!operation || !['alloc', 'release', 'resolve', 'list'].includes(operation)) {
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)) {
17
27
  failure('a valid short-id operation is required');
18
28
  return;
19
29
  }
@@ -1,4 +1,5 @@
1
1
  import { collectTaskSnapshot } from '../task/snapshot.js';
2
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
2
3
  const USAGE = 'Usage: agent-infra-internal task-snapshot <N | TASK-id> [--format json|text]\n';
3
4
  function fail(message) {
4
5
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'SNAPSHOT_PAYLOAD_INVALID', message } })}\n`);
@@ -6,11 +7,13 @@ function fail(message) {
6
7
  process.exitCode = 1;
7
8
  }
8
9
  function taskSnapshot(args = []) {
10
+ if (!ensureInternalHandlerRoute('task-snapshot', args))
11
+ return;
9
12
  if (args[0] === '--help' || args[0] === '-h') {
10
13
  process.stdout.write(USAGE);
11
14
  return;
12
15
  }
13
- if (!args[0] || args[0].startsWith('--')) {
16
+ if (!args[0] || args[0].startsWith('--') || !internalHandlerRoute('task-snapshot', 'snapshot', 'snapshot')) {
14
17
  fail('task ref is required');
15
18
  return;
16
19
  }
@@ -16,12 +16,15 @@ import { readSandboxControlManifest } from '../sandbox/control/lifecycle.js';
16
16
  import { SANDBOX_CONTROL_FUTURE_SKEW_MS, SANDBOX_CONTROL_STATUS_STALE_MS } from '../sandbox/control/protocol.js';
17
17
  import { getProcessStartTime } from '../server/process-state.js';
18
18
  import { assertGitWorktreeBinding } from '../git/worktree-identity.js';
19
- const USAGE = `Usage: agent-infra-internal task-validate <branch | TASK-id | N> [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command> [args...]`;
19
+ import { createManualValidationEvidence, manualValidationEvidenceSummary } from '../task/manual-validation-evidence.js';
20
+ import { writeJsonAtomic } from '../task/manual-validation-shared.js';
21
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
22
+ 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...]`;
20
23
  const MAX_TIMEOUT_MS = 60 * 60 * 1000;
21
24
  const RECOVERY_GRACE_MS = 30_000;
22
25
  export function parseValidateArgs(args) {
23
26
  if (args.includes('--help') || args.includes('-h')) {
24
- return { target: '', scope: 'snapshot', timeoutMs: 300_000, format: 'text', command: [], help: true };
27
+ return { target: '', scope: 'snapshot', timeoutMs: 300_000, format: 'text', evidenceFile: null, command: [], help: true };
25
28
  }
26
29
  const separator = args.indexOf('--');
27
30
  if (separator < 0)
@@ -31,6 +34,7 @@ export function parseValidateArgs(args) {
31
34
  let scope = 'snapshot';
32
35
  let timeoutMs = 300_000;
33
36
  let format = 'text';
37
+ let evidenceFile = null;
34
38
  const positionals = [];
35
39
  for (let index = 0; index < optionArgs.length; index += 1) {
36
40
  const arg = optionArgs[index];
@@ -52,6 +56,12 @@ export function parseValidateArgs(args) {
52
56
  throw new Error('validate --format must be text or json');
53
57
  format = value;
54
58
  }
59
+ else if (arg === '--evidence-file') {
60
+ const value = optionArgs[++index];
61
+ if (!value || value.startsWith('-'))
62
+ throw new Error('validate --evidence-file requires a path');
63
+ evidenceFile = value;
64
+ }
55
65
  else if (arg.startsWith('-')) {
56
66
  throw new Error(`Unknown option: ${arg}`);
57
67
  }
@@ -61,7 +71,7 @@ export function parseValidateArgs(args) {
61
71
  }
62
72
  if (positionals.length !== 1 || command.length === 0)
63
73
  throw new Error(USAGE);
64
- return { target: positionals[0], scope, timeoutMs, format, command, help: false };
74
+ return { target: positionals[0], scope, timeoutMs, format, evidenceFile, command, help: false };
65
75
  }
66
76
  function runValidationCommand(command, cwd, scope, timeoutMs, json) {
67
77
  const [file, ...args] = command;
@@ -273,6 +283,8 @@ function sniffFormat(args) {
273
283
  return index >= 0 && args[index + 1] === 'json' ? 'json' : 'text';
274
284
  }
275
285
  function taskValidate(args) {
286
+ if (!ensureInternalHandlerRoute('task-validate', args))
287
+ return;
276
288
  let options;
277
289
  try {
278
290
  options = parseValidateArgs(args);
@@ -290,27 +302,40 @@ function taskValidate(args) {
290
302
  const target = resolveSandboxTarget(options.target, config.repoRoot);
291
303
  const commit = git(config.repoRoot, ['rev-parse', target.branch]);
292
304
  const startedAt = new Date().toISOString();
293
- const result = options.scope === 'snapshot'
305
+ const result = internalHandlerRoute('task-validate', 'snapshot', options.scope)
294
306
  ? snapshotValidation(config.repoRoot, commit, options)
295
- : inplaceValidation(config, target, options);
296
- const evidence = {
297
- version: 1,
307
+ : internalHandlerRoute('task-validate', 'inplace', options.scope)
308
+ ? inplaceValidation(config, target, options)
309
+ : (() => { throw new Error('TASK_VALIDATE_SCOPE_UNREGISTERED'); })();
310
+ const cleanup = result.cleanup();
311
+ const evidence = createManualValidationEvidence({
312
+ mode: target.workspace.mode,
298
313
  taskId: target.workspace.mode === 'task-bound' ? target.workspace.taskId : null,
299
314
  branch: target.branch,
300
- scope: options.scope,
301
315
  commit,
316
+ recoverable: target.workspace.mode === 'task-bound',
317
+ scope: options.scope,
302
318
  command: path.basename(options.command[0]),
303
319
  startedAt,
304
320
  completedAt: new Date().toISOString(),
305
321
  exitCode: result.exitCode,
306
322
  signal: result.signal,
307
- cleanup: result.cleanup()
308
- };
323
+ cleanup
324
+ });
325
+ if (options.evidenceFile) {
326
+ try {
327
+ writeJsonAtomic(path.resolve(options.evidenceFile), evidence);
328
+ }
329
+ catch (error) {
330
+ throw new Error(`MANUAL_VALIDATION_EVIDENCE_WRITE_FAILED: ${error instanceof Error ? error.message : String(error)}`);
331
+ }
332
+ }
333
+ const evidenceSummary = manualValidationEvidenceSummary(evidence);
309
334
  if (options.format === 'json') {
310
- process.stdout.write(`${JSON.stringify({ status: 'applied', changed: false, evidence, error: null })}\n`);
335
+ process.stdout.write(`${JSON.stringify({ status: 'applied', changed: false, evidence: evidenceSummary, evidenceFile: options.evidenceFile, error: null })}\n`);
311
336
  }
312
337
  else {
313
- process.stdout.write(`Validation ${result.exitCode === 0 ? 'passed' : 'failed'} (${options.scope}, ${evidence.command}, cleanup=${evidence.cleanup}).\n`);
338
+ process.stdout.write(`Validation ${result.exitCode === 0 ? 'passed' : 'failed'} (${options.scope}, ${evidenceSummary.command}, cleanup=${evidenceSummary.cleanup}).\n`);
314
339
  }
315
340
  process.exitCode = result.exitCode;
316
341
  }
@@ -2,6 +2,7 @@ import { renderTaskVerification, verifyTaskEvent } from '../task/verification.js
2
2
  import { consumeHumanOverride, failureId } from '../task/human-override.js';
3
3
  import { resolveTaskRef } from '../task/resolve-ref.js';
4
4
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
5
6
  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';
6
7
  function fail(message) {
7
8
  process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'VERIFY_PAYLOAD_INVALID', message } })}\n`);
@@ -9,11 +10,14 @@ function fail(message) {
9
10
  process.exitCode = 1;
10
11
  }
11
12
  async function taskVerify(args = []) {
13
+ if (!ensureInternalHandlerRoute('task-verify', args))
14
+ return;
12
15
  if (args[0] === '--help' || args[0] === '-h') {
13
16
  process.stdout.write(USAGE);
14
17
  return;
15
18
  }
16
- if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')) {
19
+ if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')
20
+ || !internalHandlerRoute('task-verify', 'event', args[1] ? 'event' : '')) {
17
21
  fail('task ref and verification event are required');
18
22
  return;
19
23
  }
@@ -2,6 +2,7 @@ import { applyWorkflowWarningIntent } from '../task/workflow-warning-intents.js'
2
2
  import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.js';
3
3
  import { resolveTaskRef } from '../task/resolve-ref.js';
4
4
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
5
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
5
6
  const USAGE = `Usage: agent-infra-internal task-warning <task-ref> <add|set-status|list> [intent flags] [--dry-run]\n`;
6
7
  const FLAGS = {
7
8
  '--step': 'step', '--severity': 'severity', '--code': 'code', '--target': 'target',
@@ -14,12 +15,18 @@ function usageFailure(message) {
14
15
  process.exitCode = 1;
15
16
  }
16
17
  async function taskWarning(args = []) {
18
+ if (!ensureInternalHandlerRoute('task-warning', args))
19
+ return;
17
20
  if (args[0] === '--help' || args[0] === '-h') {
18
21
  process.stdout.write(USAGE);
19
22
  return;
20
23
  }
21
24
  const [taskRef, kind] = args;
22
- if (!taskRef || !kind || !['add', 'set-status', 'list'].includes(kind)) {
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)) {
23
30
  usageFailure('task ref and a valid intent are required');
24
31
  return;
25
32
  }
@@ -0,0 +1,33 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ // Inspect descendants without following symlinks. The caller supplies the trusted root.
4
+ export function inspectOwnedPath(rootInput, targetInput, expect) {
5
+ const root = path.resolve(rootInput);
6
+ const target = path.resolve(targetInput);
7
+ const relative = path.relative(root, target);
8
+ if (!relative || relative.startsWith('..') || path.isAbsolute(relative))
9
+ return null;
10
+ try {
11
+ const rootStat = fs.lstatSync(root);
12
+ if (rootStat.isSymbolicLink() || !rootStat.isDirectory())
13
+ return null;
14
+ let current = root;
15
+ for (const segment of relative.split(path.sep)) {
16
+ current = path.join(current, segment);
17
+ const stat = fs.lstatSync(current);
18
+ if (stat.isSymbolicLink())
19
+ return null;
20
+ if (process.platform !== 'win32' && typeof process.getuid === 'function' && stat.uid !== process.getuid())
21
+ return null;
22
+ if (current === target)
23
+ return (expect === 'file' ? stat.isFile() : stat.isDirectory()) ? stat : null;
24
+ if (!stat.isDirectory())
25
+ return null;
26
+ }
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ return null;
32
+ }
33
+ //# sourceMappingURL=owned-path.js.map
@@ -0,0 +1,11 @@
1
+ export function checkStatusBucket(status) {
2
+ const value = status.toLowerCase();
3
+ if (['pass', 'success', 'successful', 'neutral'].includes(value))
4
+ return 'pass';
5
+ if (['fail', 'failure', 'failed', 'error', 'timed_out', 'action_required'].includes(value))
6
+ return 'fail';
7
+ if (['cancel', 'cancelled', 'canceled', 'skipped', 'stale'].includes(value))
8
+ return 'cancel';
9
+ return 'pending';
10
+ }
11
+ //# sourceMappingURL=check-status.js.map
@@ -0,0 +1,229 @@
1
+ const CONTROL_MARKER_PATTERN = /<!--\s*(?:sync-issue|sync-pr|last-commit)\b[\s\S]*?-->|<!--\s*canonical-pr-change-report\s*-->/gi;
2
+ function ok(value) {
3
+ return { ok: true, value };
4
+ }
5
+ function invalid(message, offset) {
6
+ return { ok: false, error: { code: 'COMMENT_DOCUMENT_INVALID', message, offset } };
7
+ }
8
+ function normalized(value) {
9
+ return value.replace(/\r\n?/g, '\n');
10
+ }
11
+ function linesOf(value) {
12
+ const lines = [];
13
+ let start = 0;
14
+ while (start < value.length) {
15
+ const newline = value.indexOf('\n', start);
16
+ const end = newline === -1 ? value.length : newline;
17
+ lines.push({ start, end: newline === -1 ? end : newline + 1, text: value.slice(start, end) });
18
+ start = newline === -1 ? value.length : newline + 1;
19
+ }
20
+ if (value.length === 0)
21
+ lines.push({ start: 0, end: 0, text: '' });
22
+ return lines;
23
+ }
24
+ function openingFence(line) {
25
+ const match = line.match(/^ {0,3}(`{3,}|~{3,})(.*)$/);
26
+ if (!match)
27
+ return null;
28
+ const character = match[1][0];
29
+ const info = match[2];
30
+ if (character === '`' && info.includes('`'))
31
+ return 'invalid';
32
+ return { character, length: match[1].length };
33
+ }
34
+ function closesFence(line, fence) {
35
+ const escaped = fence.character === '`' ? '`' : '~';
36
+ return new RegExp(`^ {0,3}${escaped}{${fence.length},}[ \\t]*$`).test(line);
37
+ }
38
+ function fenceRanges(value) {
39
+ const ranges = [];
40
+ let fence = null;
41
+ for (const line of linesOf(value)) {
42
+ if (!fence) {
43
+ const opening = openingFence(line.text);
44
+ if (opening === 'invalid')
45
+ return invalid('fenced code info string is invalid', line.start);
46
+ if (opening)
47
+ fence = { ...opening, start: line.start, openingEnd: line.end };
48
+ continue;
49
+ }
50
+ if (closesFence(line.text, fence)) {
51
+ ranges.push({
52
+ start: fence.start,
53
+ end: line.end,
54
+ openingEnd: fence.openingEnd,
55
+ closingStart: line.start,
56
+ character: fence.character,
57
+ opening: value.slice(fence.start, fence.openingEnd),
58
+ closing: value.slice(line.start, line.end)
59
+ });
60
+ fence = null;
61
+ }
62
+ }
63
+ if (fence)
64
+ return invalid('fenced code block is not closed', fence.start);
65
+ return ok(ranges);
66
+ }
67
+ function escapeHtml(value) {
68
+ return value
69
+ .replace(/&/g, '&amp;')
70
+ .replace(/</g, '&lt;')
71
+ .replace(/>/g, '&gt;')
72
+ .replace(/"/g, '&quot;')
73
+ .replace(/'/g, '&#39;');
74
+ }
75
+ function escapeHtmlText(value) {
76
+ return escapeHtml(value);
77
+ }
78
+ function escapeHtmlAttribute(value) {
79
+ return escapeHtml(value);
80
+ }
81
+ function escapeMarkdownLiteral(value) {
82
+ return value.replace(/[\\`*_{}\[\]()#+.!|<>-]/g, '\\$&');
83
+ }
84
+ function markerSafe(value, markers) {
85
+ let result = value;
86
+ for (const marker of markers) {
87
+ const flags = marker.flags.includes('g') ? marker.flags : `${marker.flags}g`;
88
+ const pattern = new RegExp(marker.source, flags);
89
+ result = result.replace(pattern, (match) => escapeHtmlText(match));
90
+ }
91
+ return result;
92
+ }
93
+ function tagEnd(value, start) {
94
+ let quote = null;
95
+ for (let index = start + 1; index < value.length; index += 1) {
96
+ const character = value[index];
97
+ if (quote) {
98
+ if (character === quote)
99
+ quote = null;
100
+ }
101
+ else if (character === '"' || character === "'") {
102
+ quote = character;
103
+ }
104
+ else if (character === '>') {
105
+ return index;
106
+ }
107
+ }
108
+ return -1;
109
+ }
110
+ function isMarkdownAutolink(value, start) {
111
+ const end = value.indexOf('>', start + 1);
112
+ if (end === -1)
113
+ return false;
114
+ const target = value.slice(start + 1, end);
115
+ return /^(?:https?:\/\/|mailto:)[^<>\s]+$/i.test(target)
116
+ || /^[^<>\s@]+@[^<>\s@]+\.[^<>\s@]+$/.test(target);
117
+ }
118
+ function sanitizeOutside(value, baseOffset) {
119
+ let result = '';
120
+ let index = 0;
121
+ while (index < value.length) {
122
+ if (value.startsWith('<!--', index)) {
123
+ const end = value.indexOf('-->', index + 4);
124
+ if (end === -1)
125
+ return invalid('HTML comment is not closed', baseOffset + index);
126
+ const token = value.slice(index, end + 3);
127
+ result += escapeHtmlText(token);
128
+ index = end + 3;
129
+ continue;
130
+ }
131
+ if (value[index] === '<' && isMarkdownAutolink(value, index)) {
132
+ const end = value.indexOf('>', index + 1);
133
+ result += value.slice(index, end + 1);
134
+ index = end + 1;
135
+ continue;
136
+ }
137
+ if (value[index] === '<' && /[\\/!?A-Za-z]/.test(value[index + 1] || '')) {
138
+ const end = tagEnd(value, index);
139
+ if (end === -1)
140
+ return invalid('HTML-like tag is not closed', baseOffset + index);
141
+ result += escapeHtmlText(value.slice(index, end + 1));
142
+ index = end + 1;
143
+ continue;
144
+ }
145
+ result += value[index];
146
+ index += 1;
147
+ }
148
+ return ok(result);
149
+ }
150
+ function sanitizeMarkdownDocument(value, options = {}) {
151
+ const source = normalized(value);
152
+ const ranges = fenceRanges(source);
153
+ if (!ranges.ok)
154
+ return ranges;
155
+ const markers = options.reservedMarkers || [];
156
+ let result = '';
157
+ let cursor = 0;
158
+ for (const range of ranges.value) {
159
+ const outside = sanitizeOutside(source.slice(cursor, range.start), cursor);
160
+ if (!outside.ok)
161
+ return outside;
162
+ result += outside.value;
163
+ result += markerSafe(source.slice(range.start, range.end), markers);
164
+ cursor = range.end;
165
+ }
166
+ const tail = sanitizeOutside(source.slice(cursor), cursor);
167
+ if (!tail.ok)
168
+ return tail;
169
+ return ok(result + tail.value);
170
+ }
171
+ function canonicalizeCommentBody(value) {
172
+ return sanitizeMarkdownDocument(value, { reservedMarkers: [CONTROL_MARKER_PATTERN] });
173
+ }
174
+ function renderSafeCodeFence(value, language = '', reservedMarkers = [CONTROL_MARKER_PATTERN]) {
175
+ const content = markerSafe(normalized(value), reservedMarkers);
176
+ const longestRun = Math.max(0, ...(content.match(/`+/g) || []).map((run) => run.length));
177
+ const delimiter = '`'.repeat(Math.max(3, longestRun + 1));
178
+ const suffix = content.endsWith('\n') ? '' : '\n';
179
+ return `${delimiter}${language}\n${content}${suffix}${delimiter}`;
180
+ }
181
+ function commentRangesOutsideFences(source, ranges) {
182
+ const comments = [];
183
+ let cursor = 0;
184
+ for (const fence of [...ranges, { start: source.length, end: source.length }]) {
185
+ const segment = source.slice(cursor, fence.start);
186
+ let index = 0;
187
+ while (index < segment.length) {
188
+ const opening = segment.indexOf('<!--', index);
189
+ if (opening === -1)
190
+ break;
191
+ const absoluteStart = cursor + opening;
192
+ const closing = segment.indexOf('-->', opening + 4);
193
+ if (closing === -1)
194
+ return invalid('HTML comment is not closed', absoluteStart);
195
+ comments.push({ start: absoluteStart, end: cursor + closing + 3 });
196
+ index = closing + 3;
197
+ }
198
+ cursor = fence.end;
199
+ }
200
+ return ok(comments);
201
+ }
202
+ function splitDocumentPlaceholder(value, placeholder) {
203
+ const source = normalized(value);
204
+ const ranges = fenceRanges(source);
205
+ if (!ranges.ok)
206
+ return ranges;
207
+ const positions = [];
208
+ let cursor = source.indexOf(placeholder);
209
+ while (cursor !== -1) {
210
+ positions.push(cursor);
211
+ cursor = source.indexOf(placeholder, cursor + placeholder.length);
212
+ }
213
+ if (positions.length !== 1)
214
+ return invalid('document must contain exactly one placeholder', positions[1] ?? positions[0] ?? source.length);
215
+ const position = positions[0];
216
+ if (ranges.value.some((range) => position >= range.start && position < range.end)) {
217
+ return invalid('placeholder must be outside fenced code', position);
218
+ }
219
+ const comments = commentRangesOutsideFences(source, ranges.value);
220
+ if (!comments.ok)
221
+ return comments;
222
+ const containing = comments.value.find((comment) => position >= comment.start && position < comment.end);
223
+ if (containing && (containing.start !== position || containing.end !== position + placeholder.length)) {
224
+ return invalid('placeholder must not be nested in another HTML comment', position);
225
+ }
226
+ return ok({ prefix: source.slice(0, position), suffix: source.slice(position + placeholder.length) });
227
+ }
228
+ export { CONTROL_MARKER_PATTERN, escapeHtmlAttribute, escapeHtmlText, escapeMarkdownLiteral, fenceRanges, renderSafeCodeFence, canonicalizeCommentBody, sanitizeMarkdownDocument, splitDocumentPlaceholder };
229
+ //# sourceMappingURL=comment-safety.js.map