@fitlab-ai/agent-infra 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +11 -11
  2. package/README.zh-CN.md +11 -11
  3. package/bin/cli.ts +26 -9
  4. package/dist/bin/cli.js +173 -157
  5. package/dist/bin/internal-cli.js +66 -40
  6. package/dist/lib/agent-client.js +5 -0
  7. package/dist/lib/agent-clients/next-steps.js +6 -1
  8. package/dist/lib/decide.js +3 -3
  9. package/dist/lib/internal/agent-client.js +5 -2
  10. package/dist/lib/internal/cli-route-inventory.js +152 -0
  11. package/dist/lib/internal/codex-lifecycle.js +9 -6
  12. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  13. package/dist/lib/internal/git-workflow.js +10 -6
  14. package/dist/lib/internal/platform-checks.js +19 -7
  15. package/dist/lib/internal/platform-comment.js +25 -13
  16. package/dist/lib/internal/platform-context.js +6 -3
  17. package/dist/lib/internal/platform-issue.js +20 -13
  18. package/dist/lib/internal/platform-metadata.js +88 -0
  19. package/dist/lib/internal/platform-pr-review.js +26 -13
  20. package/dist/lib/internal/platform-pr.js +84 -31
  21. package/dist/lib/internal/platform-release-notes.js +9 -6
  22. package/dist/lib/internal/platform-security.js +93 -0
  23. package/dist/lib/internal/pr-review-grade.js +25 -12
  24. package/dist/lib/internal/release-workflow.js +23 -9
  25. package/dist/lib/internal/sandbox-control.js +50 -7
  26. package/dist/lib/internal/task-activity.js +16 -7
  27. package/dist/lib/internal/task-artifact.js +235 -24
  28. package/dist/lib/internal/task-context.js +4 -1
  29. package/dist/lib/internal/task-create.js +50 -17
  30. package/dist/lib/internal/task-delivery.js +4 -1
  31. package/dist/lib/internal/task-event.js +10 -4
  32. package/dist/lib/internal/task-finalization.js +6 -3
  33. package/dist/lib/internal/task-invalidation.js +63 -0
  34. package/dist/lib/internal/task-ledger.js +20 -6
  35. package/dist/lib/internal/task-lifecycle.js +6 -3
  36. package/dist/lib/internal/task-operation-registry.js +421 -0
  37. package/dist/lib/internal/task-orchestration.js +12 -0
  38. package/dist/lib/internal/task-override.js +14 -7
  39. package/dist/lib/internal/task-qualification.js +90 -0
  40. package/dist/lib/internal/task-review.js +7 -4
  41. package/dist/lib/internal/task-short-id.js +11 -1
  42. package/dist/lib/internal/task-snapshot.js +4 -1
  43. package/dist/lib/internal/task-validate.js +7 -2
  44. package/dist/lib/internal/task-verify.js +11 -7
  45. package/dist/lib/internal/task-warning.js +11 -4
  46. package/dist/lib/platform/adapters.js +1 -3
  47. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  48. package/dist/lib/platform/comment-safety.js +226 -0
  49. package/dist/lib/platform/completion-backfill.js +6 -5
  50. package/dist/lib/platform/context.js +70 -130
  51. package/dist/lib/platform/github-client.js +1 -1
  52. package/dist/lib/platform/github-provider.js +1130 -0
  53. package/dist/lib/platform/in-label-sync.js +143 -0
  54. package/dist/lib/platform/issue-comments.js +237 -72
  55. package/dist/lib/platform/issues.js +335 -189
  56. package/dist/lib/platform/metadata-labels.js +6 -2
  57. package/dist/lib/platform/none-provider.js +28 -0
  58. package/dist/lib/platform/pr-change-report.js +545 -0
  59. package/dist/lib/platform/pr-checks.js +119 -104
  60. package/dist/lib/platform/pr-review.js +88 -72
  61. package/dist/lib/platform/pr-summary.js +541 -50
  62. package/dist/lib/platform/provider-bridge.js +45 -0
  63. package/dist/lib/platform/provider-contract.d.ts +553 -0
  64. package/dist/lib/platform/provider-contract.js +99 -0
  65. package/dist/lib/platform/provider-loader.js +251 -0
  66. package/dist/lib/platform/provider-validation.js +577 -0
  67. package/dist/lib/platform/pull-request-metadata.js +8 -6
  68. package/dist/lib/platform/pull-requests.js +734 -543
  69. package/dist/lib/platform/release-notes.js +78 -55
  70. package/dist/lib/platform/releases.js +79 -50
  71. package/dist/lib/platform/repository-metadata.js +377 -0
  72. package/dist/lib/platform/resource-identity.d.ts +26 -0
  73. package/dist/lib/platform/resource-identity.js +92 -0
  74. package/dist/lib/platform/security-alerts.js +155 -0
  75. package/dist/lib/platform/task-identities.js +31 -0
  76. package/dist/lib/platform/verification-required.js +11 -12
  77. package/dist/lib/platform/verification-sync.js +129 -248
  78. package/dist/lib/pr-review/evidence-grading.js +19 -6
  79. package/dist/lib/process-data/index.js +7 -0
  80. package/dist/lib/run/index.js +68 -23
  81. package/dist/lib/sandbox/commands/control-status.js +22 -0
  82. package/dist/lib/sandbox/commands/create.js +32 -6
  83. package/dist/lib/sandbox/commands/ls.js +5 -0
  84. package/dist/lib/sandbox/commands/rm.js +827 -120
  85. package/dist/lib/sandbox/commands/show.js +16 -0
  86. package/dist/lib/sandbox/control/client.js +174 -19
  87. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  88. package/dist/lib/sandbox/control/container-identity.js +28 -31
  89. package/dist/lib/sandbox/control/executor.js +151 -16
  90. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  91. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  92. package/dist/lib/sandbox/control/protocol.js +77 -0
  93. package/dist/lib/sandbox/control/server.js +677 -34
  94. package/dist/lib/sandbox/control/state.js +209 -4
  95. package/dist/lib/sandbox/control/task-view.js +183 -0
  96. package/dist/lib/sandbox/engines/authority.js +289 -0
  97. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  98. package/dist/lib/sandbox/index.js +5 -0
  99. package/dist/lib/sandbox/recovery.js +21 -1
  100. package/dist/lib/sandbox/workspace-view.js +2 -1
  101. package/dist/lib/sandbox/worktree-safety.js +4 -1
  102. package/dist/lib/server/index.js +8 -0
  103. package/dist/lib/server/protocol.js +38 -1
  104. package/dist/lib/task/activity-log.js +8 -1
  105. package/dist/lib/task/artifact-lifecycle.js +75 -18
  106. package/dist/lib/task/artifact-operations.js +520 -0
  107. package/dist/lib/task/artifact-repair-intent.js +59 -0
  108. package/dist/lib/task/artifact-schema.js +135 -0
  109. package/dist/lib/task/capabilities.js +310 -0
  110. package/dist/lib/task/commands/status.js +32 -0
  111. package/dist/lib/task/commit-operation.js +12 -1
  112. package/dist/lib/task/control-authority.js +12 -5
  113. package/dist/lib/task/create-service.js +111 -12
  114. package/dist/lib/task/create.js +25 -0
  115. package/dist/lib/task/current-contract.js +5 -1
  116. package/dist/lib/task/decision-details.js +1 -1
  117. package/dist/lib/task/events.js +416 -17
  118. package/dist/lib/task/finalization.js +37 -13
  119. package/dist/lib/task/human-override.js +58 -36
  120. package/dist/lib/task/index.js +11 -3
  121. package/dist/lib/task/invalidation-command.js +86 -0
  122. package/dist/lib/task/invalidation.js +260 -0
  123. package/dist/lib/task/ledger-intents.js +37 -0
  124. package/dist/lib/task/local-artifact-finalization.js +299 -0
  125. package/dist/lib/task/orchestration.js +240 -144
  126. package/dist/lib/task/pr-delivery-fact.js +102 -101
  127. package/dist/lib/task/qualification-audit.js +490 -0
  128. package/dist/lib/task/qualification-confirmation.js +109 -0
  129. package/dist/lib/task/qualification-intents.js +148 -0
  130. package/dist/lib/task/review-artifacts.js +22 -23
  131. package/dist/lib/task/review-finalization.js +121 -4
  132. package/dist/lib/task/review-fingerprint.js +24 -2
  133. package/dist/lib/task/rework-intent.js +138 -0
  134. package/dist/lib/task/sections.js +6 -4
  135. package/dist/lib/task/skill-scope.js +23 -0
  136. package/dist/lib/task/task-execution-lock.js +27 -17
  137. package/dist/lib/task/verification-config.js +11 -0
  138. package/dist/lib/task/verification-engine.js +93 -16
  139. package/dist/lib/task/verification.js +3 -3
  140. package/dist/lib/task/workflow-warning-intents.js +1 -1
  141. package/dist/lib/task/write.js +11 -0
  142. package/dist/lib/version.js +11 -1
  143. package/dist/lifecycle-build-manifest.json +3 -3
  144. package/lib/agent-client.ts +9 -0
  145. package/lib/agent-clients/next-steps.ts +6 -1
  146. package/lib/decide.ts +3 -3
  147. package/lib/init.ts +1 -1
  148. package/lib/internal/agent-client.ts +4 -2
  149. package/lib/internal/cli-route-inventory.ts +140 -0
  150. package/lib/internal/codex-lifecycle.ts +8 -6
  151. package/lib/internal/codex-sandbox-controller.ts +7 -2
  152. package/lib/internal/git-workflow.ts +9 -6
  153. package/lib/internal/platform-checks.ts +14 -6
  154. package/lib/internal/platform-comment.ts +20 -12
  155. package/lib/internal/platform-context.ts +5 -3
  156. package/lib/internal/platform-issue.ts +17 -11
  157. package/lib/internal/platform-metadata.ts +70 -0
  158. package/lib/internal/platform-pr-review.ts +23 -12
  159. package/lib/internal/platform-pr.ts +65 -27
  160. package/lib/internal/platform-release-notes.ts +8 -6
  161. package/lib/internal/platform-security.ts +83 -0
  162. package/lib/internal/pr-review-grade.ts +20 -11
  163. package/lib/internal/release-workflow.ts +21 -9
  164. package/lib/internal/sandbox-control.ts +44 -6
  165. package/lib/internal/task-activity.ts +15 -7
  166. package/lib/internal/task-artifact.ts +204 -22
  167. package/lib/internal/task-context.ts +3 -1
  168. package/lib/internal/task-create.ts +78 -17
  169. package/lib/internal/task-delivery.ts +3 -1
  170. package/lib/internal/task-event.ts +9 -4
  171. package/lib/internal/task-finalization.ts +6 -4
  172. package/lib/internal/task-invalidation.ts +41 -0
  173. package/lib/internal/task-ledger.ts +21 -8
  174. package/lib/internal/task-lifecycle.ts +5 -3
  175. package/lib/internal/task-operation-registry.ts +482 -0
  176. package/lib/internal/task-orchestration.ts +12 -0
  177. package/lib/internal/task-override.ts +15 -9
  178. package/lib/internal/task-qualification.ts +61 -0
  179. package/lib/internal/task-review.ts +6 -4
  180. package/lib/internal/task-short-id.ts +10 -1
  181. package/lib/internal/task-snapshot.ts +3 -1
  182. package/lib/internal/task-validate.ts +6 -2
  183. package/lib/internal/task-verify.ts +10 -7
  184. package/lib/internal/task-warning.ts +10 -4
  185. package/lib/platform/adapters.ts +3 -2
  186. package/lib/platform/change-request-git-evidence.ts +36 -9
  187. package/lib/platform/comment-safety.ts +250 -0
  188. package/lib/platform/completion-backfill.ts +9 -8
  189. package/lib/platform/context.ts +97 -134
  190. package/lib/platform/github-client.ts +2 -2
  191. package/lib/platform/github-provider.ts +1132 -0
  192. package/lib/platform/in-label-sync.ts +208 -0
  193. package/lib/platform/issue-comments.ts +255 -80
  194. package/lib/platform/issues.ts +344 -174
  195. package/lib/platform/metadata-labels.ts +5 -2
  196. package/lib/platform/none-provider.ts +35 -0
  197. package/lib/platform/pr-change-report.ts +639 -0
  198. package/lib/platform/pr-checks.ts +126 -106
  199. package/lib/platform/pr-review.ts +88 -85
  200. package/lib/platform/pr-summary.ts +581 -53
  201. package/lib/platform/provider-bridge.ts +82 -0
  202. package/lib/platform/provider-contract.ts +611 -0
  203. package/lib/platform/provider-loader.ts +307 -0
  204. package/lib/platform/provider-validation.ts +611 -0
  205. package/lib/platform/pull-request-metadata.ts +10 -7
  206. package/lib/platform/pull-requests.ts +781 -550
  207. package/lib/platform/release-notes.ts +76 -59
  208. package/lib/platform/releases.ts +77 -43
  209. package/lib/platform/repository-metadata.ts +453 -0
  210. package/lib/platform/resource-identity.ts +121 -0
  211. package/lib/platform/security-alerts.ts +191 -0
  212. package/lib/platform/task-identities.ts +40 -0
  213. package/lib/platform/types.ts +4 -2
  214. package/lib/platform/verification-required.ts +11 -13
  215. package/lib/platform/verification-sync.ts +128 -304
  216. package/lib/pr-review/evidence-grading.ts +25 -8
  217. package/lib/process-data/index.ts +7 -0
  218. package/lib/run/index.ts +62 -22
  219. package/lib/sandbox/commands/control-status.ts +26 -0
  220. package/lib/sandbox/commands/create.ts +46 -6
  221. package/lib/sandbox/commands/ls.ts +7 -0
  222. package/lib/sandbox/commands/rm.ts +1000 -87
  223. package/lib/sandbox/commands/show.ts +16 -0
  224. package/lib/sandbox/control/client.ts +203 -19
  225. package/lib/sandbox/control/completed-reentry.ts +98 -0
  226. package/lib/sandbox/control/container-identity.ts +27 -43
  227. package/lib/sandbox/control/executor.ts +180 -15
  228. package/lib/sandbox/control/lifecycle.ts +629 -17
  229. package/lib/sandbox/control/native-file-lock.ts +209 -0
  230. package/lib/sandbox/control/protocol.ts +118 -2
  231. package/lib/sandbox/control/server.ts +724 -34
  232. package/lib/sandbox/control/state.ts +257 -4
  233. package/lib/sandbox/control/task-view.ts +240 -0
  234. package/lib/sandbox/engines/authority.ts +365 -0
  235. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  236. package/lib/sandbox/index.ts +7 -0
  237. package/lib/sandbox/recovery.ts +21 -1
  238. package/lib/sandbox/workspace-view.ts +9 -3
  239. package/lib/sandbox/worktree-safety.ts +4 -1
  240. package/lib/server/index.ts +10 -0
  241. package/lib/server/protocol.ts +36 -1
  242. package/lib/task/activity-log.ts +8 -0
  243. package/lib/task/artifact-lifecycle.ts +70 -22
  244. package/lib/task/artifact-operations.ts +626 -0
  245. package/lib/task/artifact-repair-intent.ts +71 -0
  246. package/lib/task/artifact-schema.ts +192 -0
  247. package/lib/task/capabilities.ts +331 -0
  248. package/lib/task/commands/status.ts +38 -0
  249. package/lib/task/commit-operation.ts +12 -1
  250. package/lib/task/control-authority.ts +22 -9
  251. package/lib/task/create-service.ts +139 -14
  252. package/lib/task/create.ts +27 -0
  253. package/lib/task/current-contract.ts +6 -1
  254. package/lib/task/decision-details.ts +6 -2
  255. package/lib/task/events.ts +392 -16
  256. package/lib/task/finalization.ts +50 -14
  257. package/lib/task/human-override.ts +70 -46
  258. package/lib/task/index.ts +16 -3
  259. package/lib/task/invalidation-command.ts +86 -0
  260. package/lib/task/invalidation.ts +332 -0
  261. package/lib/task/ledger-intents.ts +35 -1
  262. package/lib/task/local-artifact-finalization.ts +432 -0
  263. package/lib/task/orchestration.ts +223 -133
  264. package/lib/task/pr-delivery-fact.ts +131 -148
  265. package/lib/task/qualification-audit.ts +599 -0
  266. package/lib/task/qualification-confirmation.ts +117 -0
  267. package/lib/task/qualification-intents.ts +150 -0
  268. package/lib/task/review-artifacts.ts +21 -22
  269. package/lib/task/review-finalization.ts +133 -4
  270. package/lib/task/review-fingerprint.ts +23 -2
  271. package/lib/task/rework-intent.ts +165 -0
  272. package/lib/task/sections.ts +6 -4
  273. package/lib/task/skill-scope.ts +24 -0
  274. package/lib/task/task-execution-lock.ts +23 -14
  275. package/lib/task/verification-config.ts +12 -0
  276. package/lib/task/verification-engine.ts +103 -17
  277. package/lib/task/verification.ts +4 -4
  278. package/lib/task/workflow-warning-intents.ts +1 -1
  279. package/lib/task/write.ts +19 -0
  280. package/lib/update.ts +1 -1
  281. package/lib/version.ts +15 -1
  282. package/package.json +12 -1
  283. package/templates/.agents/rules/README.en.md +3 -1
  284. package/templates/.agents/rules/README.zh-CN.md +3 -1
  285. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  286. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  287. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  288. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  289. package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
  290. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  291. package/templates/.agents/rules/issue-sync.en.md +2 -0
  292. package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
  293. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  294. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  295. package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
  296. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
  297. package/templates/.agents/rules/pr-sync.en.md +10 -4
  298. package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
  299. package/templates/.agents/rules/security-alerts.en.md +8 -8
  300. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  301. package/templates/.agents/rules/task-short-id.en.md +1 -4
  302. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  303. package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
  304. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
  305. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  306. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  307. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  308. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  309. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  310. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  311. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
  314. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
  315. package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
  316. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
  317. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  318. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  319. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  320. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  321. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  322. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  323. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  324. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  325. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  326. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  327. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
  328. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
  329. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
  330. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
  331. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  332. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  333. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
  334. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
  335. package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
  336. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
  337. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
  338. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
  339. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  340. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  341. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  342. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  343. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  344. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  345. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  346. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  347. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  348. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  349. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  350. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  351. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  352. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  353. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  354. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  355. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  356. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  357. package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
  358. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
  359. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  360. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  361. package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
  362. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
  363. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  364. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  365. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  366. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  367. package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
  368. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
  369. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  370. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  371. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  372. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  373. package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
  374. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
  375. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  376. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  377. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  378. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  379. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  380. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  381. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  382. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  383. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
  384. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
  385. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  386. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  387. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  388. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  389. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  390. package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
  391. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
  392. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  393. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  394. package/templates/.agents/templates/task.en.md +24 -1
  395. package/templates/.agents/templates/task.zh-CN.md +24 -1
  396. package/templates/.github/workflows/pr-label.yml +7 -26
  397. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  398. package/templates/.agents/scripts/security-alerts.sh +0 -31
  399. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  400. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  401. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  402. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -160,6 +160,25 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
160
160
  };
161
161
  const serialized = `${JSON.stringify(owner)}\n`;
162
162
  let ownsFixed = false;
163
+ let deferRelease = false;
164
+ const release = () => {
165
+ try {
166
+ unlinkIfPresent(candidate);
167
+ }
168
+ catch {
169
+ // Candidate cleanup is best-effort and must not replace the primary result.
170
+ }
171
+ if (ownsFixed) {
172
+ try {
173
+ const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
174
+ if (current.token === token)
175
+ unlinkIfPresent(fixed);
176
+ }
177
+ catch {
178
+ // A missing or replaced fixed lock is not owned by this invocation.
179
+ }
180
+ }
181
+ };
163
182
  try {
164
183
  fs.mkdirSync(lockRoot, { recursive: true });
165
184
  cleanStaleCandidates(lockRoot, key, options.identityMatches ?? processIdentityMatches);
@@ -202,7 +221,12 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
202
221
  throw new TaskExecutionLockError('ORCHESTRATION_LOCK_BUSY', 'lifecycle task lock could not be acquired after stale recovery', { operation: 'acquire', errno: 'EEXIST', key });
203
222
  }
204
223
  unlinkIfPresent(candidate);
205
- return callback();
224
+ const value = callback();
225
+ if (value && typeof value.then === 'function') {
226
+ deferRelease = true;
227
+ return value.finally(release);
228
+ }
229
+ return value;
206
230
  }
207
231
  catch (error) {
208
232
  if (error instanceof TaskExecutionLockError)
@@ -212,22 +236,8 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
212
236
  throw new TaskExecutionLockError('ORCHESTRATION_LOCK_FAILED', 'lifecycle task lock operation failed', { operation: ownsFixed ? 'callback' : 'acquire', errno: errno(error), key });
213
237
  }
214
238
  finally {
215
- try {
216
- unlinkIfPresent(candidate);
217
- }
218
- catch {
219
- // Candidate cleanup is best-effort and must not replace the primary result.
220
- }
221
- if (ownsFixed) {
222
- try {
223
- const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
224
- if (current.token === token)
225
- unlinkIfPresent(fixed);
226
- }
227
- catch {
228
- // A missing or replaced fixed lock is not owned by this invocation.
229
- }
230
- }
239
+ if (!deferRelease)
240
+ release();
231
241
  }
232
242
  }
233
243
  function withRepositoryMutationLock(repoRoot, callback, options = {}) {
@@ -1,5 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { getArtifactSchema } from './artifact-schema.js';
3
4
  function loadVerificationConfig(repositoryRoot, skillName) {
4
5
  const verifyPath = path.join(repositoryRoot, '.agents', 'skills', skillName, 'config', 'verify.json');
5
6
  if (!fs.existsSync(verifyPath))
@@ -8,6 +9,16 @@ function loadVerificationConfig(repositoryRoot, skillName) {
8
9
  if (!parsed.checks || typeof parsed.checks !== 'object' || Array.isArray(parsed.checks)) {
9
10
  throw new Error(`config/verify.json has invalid checks for skill '${skillName}'`);
10
11
  }
12
+ const artifact = parsed.checks.artifact;
13
+ if (artifact && typeof artifact === 'object' && !Array.isArray(artifact)) {
14
+ const schema = artifact.schema;
15
+ if (schema !== undefined && (typeof schema !== 'string' || !getArtifactSchema(schema))) {
16
+ throw new Error(`config/verify.json has unknown artifact schema '${String(schema)}' for skill '${skillName}'`);
17
+ }
18
+ if (schema !== undefined && 'required_patterns' in artifact) {
19
+ throw new Error(`config/verify.json must not duplicate required_patterns for schema '${String(schema)}' in skill '${skillName}'`);
20
+ }
21
+ }
11
22
  return { ...(parsed.skill ? { skill: parsed.skill } : {}), checks: parsed.checks };
12
23
  }
13
24
  export { loadVerificationConfig };
@@ -21,6 +21,10 @@ import { snapshotReview } from "../git/review-snapshot.js";
21
21
  import { OrchestrationStateError, readRun } from "./orchestration.js";
22
22
  import { resolveDeliveryTarget } from "./delivery-target.js";
23
23
  import { readPrDeliveryFact } from "./pr-delivery-fact.js";
24
+ import { validateLocalArtifact } from "./local-artifact-finalization.js";
25
+ import { validateQualificationAudit } from "./qualification-audit.js";
26
+ import { getArtifactSchema } from "./artifact-schema.js";
27
+ import { inspectArtifactContract } from "./artifact-operations.js";
24
28
  const TASK_ENUMS = {
25
29
  type: ["feature", "bugfix", "refactor", "docs", "chore"],
26
30
  workflow: ["feature-development", "bug-fix", "refactoring"],
@@ -69,7 +73,7 @@ const scriptPath = fileURLToPath(import.meta.url);
69
73
  let repoRoot = path.resolve(path.dirname(scriptPath), "..", "..");
70
74
  const PLATFORM_ADAPTERS = {
71
75
  "platform-sync": checkPlatformSync,
72
- "platform-sync-preflight": (context, shared) => ({ ...checkPlatformSync(context, shared), type: "platform-sync-preflight" }),
76
+ "platform-sync-preflight": async (context, shared) => ({ ...await checkPlatformSync(context, shared), type: "platform-sync-preflight" }),
73
77
  "required-checks": checkRequiredChecks
74
78
  };
75
79
  const OPTIONAL_PLATFORM_CHECKS = new Set(["platform-sync"]);
@@ -86,7 +90,7 @@ const sharedUtils = {
86
90
  parseIssueNumber,
87
91
  parsePrNumber
88
92
  };
89
- function runCheck(type, context, shared) {
93
+ async function runCheck(type, context, shared) {
90
94
  switch (type) {
91
95
  case "task-meta":
92
96
  return checkTaskMeta(context);
@@ -124,7 +128,7 @@ function runCheck(type, context, shared) {
124
128
  }
125
129
  return failResult(type, `Unsupported check type '${type}'.`);
126
130
  }
127
- return adapter(context, shared);
131
+ return await adapter(context, shared);
128
132
  }
129
133
  }
130
134
  }
@@ -419,7 +423,7 @@ function checkTaskMeta({ taskDir, config }) {
419
423
  const warningSuffix = warnings.length > 0 ? `; warnings: ${warnings.join("; ")}` : "";
420
424
  return passResult("task-meta", `Task metadata valid (${requiredFields.length} required fields checked${warningSuffix})`, warnings);
421
425
  }
422
- function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
426
+ async function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
423
427
  const task = loadTask(taskDir);
424
428
  if (!task.ok)
425
429
  return failResult('required-pr-delivery', task.message);
@@ -438,10 +442,11 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
438
442
  return failResult('required-pr-delivery', factRead.error.message);
439
443
  const fact = factRead.status === 'valid' ? factRead.fact : null;
440
444
  const status = fact?.state || 'unbound';
441
- const prNumber = fact?.state === 'bound' ? fact.identity.number : null;
445
+ const prIdentity = fact?.state === 'bound' ? fact.identity.resource : null;
446
+ const prNumber = prIdentity?.kind === 'number' ? prIdentity.value : null;
442
447
  if (flow === 'disabled')
443
448
  return passResult('required-pr-delivery', 'Pull request delivery is disabled by project policy');
444
- if (flow === 'required' && (status !== 'bound' || prNumber === null)) {
449
+ if (flow === 'required' && (status !== 'bound' || !prIdentity)) {
445
450
  return failResult('required-pr-delivery', 'Project policy requires a bound pull request before completion');
446
451
  }
447
452
  if (flow !== 'required' && status === 'unbound') {
@@ -451,7 +456,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
451
456
  if (mode === 'gate') {
452
457
  return passResult('required-pr-delivery', 'Bound pull request shape is valid; merged-state inspection is reserved for hard preflight');
453
458
  }
454
- const inspected = inspectPlatformPullRequest(task.metadata.id, { cwd: repositoryRoot });
459
+ const inspected = await inspectPlatformPullRequest(task.metadata.id, { cwd: repositoryRoot });
455
460
  if (inspected.status === 'blocked') {
456
461
  return blockedResult('required-pr-delivery', inspected.error?.message || 'Unable to inspect the required pull request', inspected.error?.code || 'PR_INSPECTION_BLOCKED');
457
462
  }
@@ -459,7 +464,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
459
464
  const repository = inspected.platform.repository?.toLowerCase() || '';
460
465
  const taskBranch = String(task.metadata.branch || '').trim();
461
466
  const deliveryBaseRef = String(task.metadata.delivery_base_ref || projectConfig.delivery?.baseRef || '').trim();
462
- if (inspected.status !== 'no-op' || !pullRequest || pullRequest.number !== prNumber) {
467
+ if (inspected.status !== 'no-op' || !pullRequest) {
463
468
  return failResult('required-pr-delivery', 'Bound pull request identity could not be verified');
464
469
  }
465
470
  if (!repository
@@ -472,7 +477,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
472
477
  if (pullRequest.state !== 'closed' || !pullRequest.mergedAt || !pullRequest.mergeCommitSha) {
473
478
  return failResult('required-pr-delivery', 'Project policy requires the bound pull request to be merged');
474
479
  }
475
- return passResult('required-pr-delivery', `Pull request delivery policy satisfied (merged PR #${prNumber})`);
480
+ return passResult('required-pr-delivery', `Pull request delivery policy satisfied (merged PR ${prNumber === null ? 'identity' : `#${prNumber}`})`);
476
481
  }
477
482
  return passResult('required-pr-delivery', `Pull request delivery policy satisfied (${status})`);
478
483
  }
@@ -504,7 +509,7 @@ function loadProjectName() {
504
509
  return "";
505
510
  }
506
511
  }
507
- function checkArtifact({ taskDir, config, artifactFile }) {
512
+ function checkArtifact({ taskDir, config, artifactFile, skillName }) {
508
513
  const resolvedArtifact = resolveArtifactPath(taskDir, config.file_pattern, artifactFile);
509
514
  if (!resolvedArtifact.ok) {
510
515
  return failResult("artifact", resolvedArtifact.message);
@@ -518,6 +523,56 @@ function checkArtifact({ taskDir, config, artifactFile }) {
518
523
  return failResult("artifact", `Artifact is empty: ${path.basename(artifactPath)}`);
519
524
  }
520
525
  const content = fs.readFileSync(artifactPath, "utf8");
526
+ let taskContent = "";
527
+ const taskPath = path.join(taskDir, "task.md");
528
+ if (fs.existsSync(taskPath)) {
529
+ try {
530
+ taskContent = fs.readFileSync(taskPath, "utf8");
531
+ }
532
+ catch (error) {
533
+ return failResult("artifact", `Cannot read task qualification contract: ${error instanceof Error ? error.message : String(error)}`);
534
+ }
535
+ }
536
+ if (taskContent && /^review-(?:analysis|plan|code)$/.test(skillName)) {
537
+ const qualification = validateQualificationAudit(taskContent, content, { artifact: path.basename(artifactPath) });
538
+ if (!qualification.ok)
539
+ return failResult("artifact", `${path.basename(artifactPath)} has qualification audit errors: ${qualification.code}: ${qualification.message}`);
540
+ }
541
+ const schemaFamily = skillName === "analyze-task"
542
+ ? "analysis"
543
+ : skillName === "review-analysis"
544
+ ? "review-analysis"
545
+ : skillName === "plan-task"
546
+ ? "plan"
547
+ : skillName === "review-plan"
548
+ ? "review-plan"
549
+ : skillName === "code-task"
550
+ ? "code"
551
+ : skillName === "review-code" ? "review-code" : null;
552
+ const schema = schemaFamily ? getArtifactSchema(schemaFamily) : null;
553
+ const localFamily = skillName === "analyze-task"
554
+ ? "analysis"
555
+ : skillName === "plan-task" ? "plan" : skillName === "code-task" ? "code" : null;
556
+ if (schema) {
557
+ const structure = inspectArtifactContract(content, schema);
558
+ if (!structure.ok && !localFamily) {
559
+ return failResult("artifact", `${path.basename(artifactPath)} has shared structural errors: ${structure.diagnostics.map((item) => `${item.code}: ${item.message}`).join('; ')}`);
560
+ }
561
+ }
562
+ if (localFamily) {
563
+ const local = validateLocalArtifact(content, {
564
+ family: localFamily,
565
+ ...(taskContent ? { taskContent } : {}),
566
+ artifact: path.basename(artifactPath)
567
+ });
568
+ if (!local.ok) {
569
+ return failResult("artifact", `${path.basename(artifactPath)} has local structural errors: ${local.diagnostics.map((item) => `${item.code}: ${item.message}`).join('; ')}`);
570
+ }
571
+ return passResult("artifact", `${path.basename(artifactPath)} passed (${schema?.sections.length ?? 0} sections)`);
572
+ }
573
+ if (schema) {
574
+ return passResult("artifact", `${path.basename(artifactPath)} passed (${schema.sections.length} sections)`);
575
+ }
521
576
  const requiredSections = config.required_sections || [];
522
577
  const missingSections = requiredSections.filter((section) => !new RegExp(`^##\\s+${escapeRegExp(section)}\\s*$`, "m").test(content));
523
578
  if (missingSections.length > 0) {
@@ -670,6 +725,7 @@ function checkActivityLog({ taskDir, config }) {
670
725
  let previousTimestamp = "";
671
726
  let latestAction = "";
672
727
  let latestTimestamp = "";
728
+ const doneActions = [];
673
729
  for (const entry of entries) {
674
730
  const match = entry.match(ACTIVITY_LOG_PATTERN);
675
731
  if (!match) {
@@ -686,6 +742,16 @@ function checkActivityLog({ taskDir, config }) {
686
742
  if (!ACTIVITY_LOG_STARTED_RE.test(action)) {
687
743
  latestTimestamp = timestamp;
688
744
  latestAction = action;
745
+ doneActions.push(action);
746
+ }
747
+ }
748
+ if (config.expected_action_pattern && !new RegExp(config.expected_action_pattern).test(latestAction)) {
749
+ const expected = new RegExp(config.expected_action_pattern);
750
+ let index = doneActions.length - 1;
751
+ while (index >= 0 && doneActions[index] === 'Commit' && !expected.test(doneActions[index]))
752
+ index -= 1;
753
+ if (index >= 0 && expected.test(doneActions[index])) {
754
+ latestAction = doneActions[index];
689
755
  }
690
756
  }
691
757
  if (config.expected_action_pattern && !new RegExp(config.expected_action_pattern).test(latestAction)) {
@@ -902,6 +968,8 @@ function checkManualValidation({ taskDir }) {
902
968
  // 1. Latest review-code artifact; none -> pass (no review, check not applicable).
903
969
  const review = findAuthoritativeReviewCodeArtifact(taskDir);
904
970
  if (!review.ok) {
971
+ if (review.error)
972
+ return failResult("manual-validation", `Review-code artifact is unavailable: ${review.error}`);
905
973
  return passResult("manual-validation", "No review-code artifact; manual validation not applicable");
906
974
  }
907
975
  // 2. Parse the numeric manual-validation count; unparseable/null -> fail closed
@@ -953,9 +1021,11 @@ function checkManualValidation({ taskDir }) {
953
1021
  }
954
1022
  return passResult("manual-validation", `Manual validation completed → ${artifactName}`);
955
1023
  }
956
- function checkPostReviewCommit({ taskDir, config }) {
1024
+ async function checkPostReviewCommit({ taskDir, config }) {
957
1025
  const reviewArtifact = findAuthoritativeReviewCodeArtifact(taskDir);
958
1026
  if (!reviewArtifact.ok) {
1027
+ if (reviewArtifact.error)
1028
+ return failResult("post-review-commit", `Review-code artifact is unavailable: ${reviewArtifact.error}`);
959
1029
  return passResult("post-review-commit", "No review-code artifact; check inactive");
960
1030
  }
961
1031
  let gitRoot;
@@ -977,7 +1047,7 @@ function checkPostReviewCommit({ taskDir, config }) {
977
1047
  const hasPullRequest = fact?.state === 'bound';
978
1048
  let inspected = null;
979
1049
  if (hasPullRequest) {
980
- inspected = inspectPlatformPullRequest(task.metadata.id, { cwd: gitRoot });
1050
+ inspected = await inspectPlatformPullRequest(task.metadata.id, { cwd: gitRoot });
981
1051
  if (!inspected.pullRequest) {
982
1052
  const message = inspected.error?.message || "PR merge snapshot is unavailable";
983
1053
  const code = inspected.error?.code || "PR_INSPECTION_INVALID";
@@ -988,7 +1058,7 @@ function checkPostReviewCommit({ taskDir, config }) {
988
1058
  if (inspected.pullRequest.state === "closed" &&
989
1059
  inspected.pullRequest.mergedAt &&
990
1060
  inspected.pullRequest.mergeCommitSha) {
991
- const relation = resolveMaterializedReviewedHeadRelation({
1061
+ const relation = await resolveMaterializedReviewedHeadRelation({
992
1062
  cwd: gitRoot,
993
1063
  platformType: inspected.platform.type,
994
1064
  lastReviewedCommit,
@@ -1124,6 +1194,13 @@ function checkReviewFact({ taskDir, artifactFile }) {
1124
1194
  if (!resolvedArtifact.ok) {
1125
1195
  return failResult("review-fact", resolvedArtifact.message);
1126
1196
  }
1197
+ const authoritative = findAuthoritativeReviewCodeArtifact(taskDir);
1198
+ if (!authoritative.ok) {
1199
+ return failResult("review-fact", authoritative.error ?? "No active review-code artifact is available");
1200
+ }
1201
+ if (path.basename(resolvedArtifact.path) !== authoritative.fileName) {
1202
+ return failResult("review-fact", `review-code artifact ${path.basename(resolvedArtifact.path)} is not the current active artifact ${authoritative.fileName}; re-run review-code`);
1203
+ }
1127
1204
  const task = loadTask(taskDir);
1128
1205
  if (!task.ok) {
1129
1206
  return failResult("review-fact", task.message);
@@ -1401,7 +1478,7 @@ function escapeRegExp(value) {
1401
1478
  function isBlank(value) {
1402
1479
  return value === undefined || value === null || String(value).trim() === "";
1403
1480
  }
1404
- function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: requestedChecks, repositoryRoot }) {
1481
+ async function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: requestedChecks, repositoryRoot }) {
1405
1482
  if (repositoryRoot)
1406
1483
  repoRoot = path.resolve(repositoryRoot);
1407
1484
  else {
@@ -1418,7 +1495,7 @@ function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: reque
1418
1495
  for (const [type, checkConfig] of Object.entries(verifyConfig.checks || {})) {
1419
1496
  if (checkConfig === null)
1420
1497
  continue;
1421
- const result = runCheck(type, {
1498
+ const result = await runCheck(type, {
1422
1499
  mode,
1423
1500
  skillName,
1424
1501
  taskDir: path.resolve(taskDir),
@@ -1441,7 +1518,7 @@ function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: reque
1441
1518
  return { skill: skillName, ...passResult(type, `Check '${type}' is disabled for skill '${skillName}'.`) };
1442
1519
  return {
1443
1520
  skill: skillName,
1444
- ...runCheck(type, {
1521
+ ...await runCheck(type, {
1445
1522
  skillName,
1446
1523
  taskDir: path.resolve(taskDir),
1447
1524
  artifactFile,
@@ -41,7 +41,7 @@ function failure(request, code, message, extra = {}) {
41
41
  artifact: request.artifact ?? null, invocations: [], error: { code, message }, ...extra
42
42
  };
43
43
  }
44
- function verifyTaskEvent(request, options = {}) {
44
+ async function verifyTaskEvent(request, options = {}) {
45
45
  const spec = VERIFICATION_CATALOG[request.event];
46
46
  if (!spec)
47
47
  return failure(request, 'VERIFY_EVENT_UNKNOWN', `unknown verification event '${request.event}'`);
@@ -66,7 +66,7 @@ function verifyTaskEvent(request, options = {}) {
66
66
  const invocations = [];
67
67
  const engine = options.engine ?? verifyInProcess;
68
68
  if (spec.mode === 'gate') {
69
- const payload = engine({ mode: 'gate', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [], repositoryRoot: resolved.repoRoot });
69
+ const payload = await engine({ mode: 'gate', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [], repositoryRoot: resolved.repoRoot });
70
70
  const status = payload.gate;
71
71
  if (status !== 'pass' && allowsManualOverride(options.manualOverride, 'verification-engine', status === 'blocked' ? 'CHECK_BLOCKED' : 'CHECK_FAILED')) {
72
72
  invocations.push({ status: 'pass', exitCode: 0, payload: { ...payload, gate: 'pass', humanOverride: 'human-approved', originalGate: status } });
@@ -79,7 +79,7 @@ function verifyTaskEvent(request, options = {}) {
79
79
  }
80
80
  else {
81
81
  for (const check of spec.checks ?? []) {
82
- const payload = engine({ mode: 'checks', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [check], repositoryRoot: resolved.repoRoot });
82
+ const payload = await engine({ mode: 'checks', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [check], repositoryRoot: resolved.repoRoot });
83
83
  const status = payload.status;
84
84
  if (status !== 'pass' && allowsManualOverride(options.manualOverride, 'verification-engine', status === 'blocked' ? 'CHECK_BLOCKED' : 'CHECK_FAILED')) {
85
85
  invocations.push({ status: 'pass', exitCode: 0, payload: { ...payload, status: 'pass', humanOverride: 'human-approved', originalStatus: status } });
@@ -38,7 +38,7 @@ function sectionMutation(content) {
38
38
  const english = /^##\s+Activity Log\s*$/m.test(content);
39
39
  return [{
40
40
  kind: 'section', aliases: WORKFLOW_WARNING_HEADINGS, heading: english ? 'Workflow Warnings' : '工作流告警',
41
- body: `| ${WORKFLOW_WARNING_COLUMNS.join(' | ')} |\n|----|------|------|----------|------|--------|--------|---------|--------|-------------|------------|`
41
+ body: `| ${WORKFLOW_WARNING_COLUMNS.join(' | ')} |\n|----|------|------|----------|------|--------|---------|--------|-------------|------------|------------|`
42
42
  }];
43
43
  }
44
44
  function rowMutation(row) {
@@ -6,6 +6,7 @@ import { resolveTaskRef } from './resolve-ref.js';
6
6
  import { allowsManualOverride } from './guard-override.js';
7
7
  import { mutateTableRow, upsertSection } from './sections.js';
8
8
  import { validateCurrentTaskContract } from './current-contract.js';
9
+ import { invalidationBlocks, parseInvalidationDocument } from './invalidation.js';
9
10
  const DEFAULT_FILE_SYSTEM = {
10
11
  readFileSync: (file) => fs.readFileSync(file, 'utf8'),
11
12
  statModeSync: (file) => fs.statSync(file).mode,
@@ -90,6 +91,16 @@ function writeTask(request, options = {}) {
90
91
  if (!contract.ok) {
91
92
  return failure(request, identity, contract.code, contract.message);
92
93
  }
94
+ if (invalidationBlocks(contract.invalidation)
95
+ && options.invalidationContext !== 'source-completion'
96
+ && options.invalidationContext !== 'reconcile') {
97
+ return failure(request, identity, 'TASK_INVALIDATION_BLOCKED', 'task has an incomplete artifact invalidation operation; reconcile it before writing downstream state');
98
+ }
99
+ }
100
+ else {
101
+ const invalidation = parseInvalidationDocument(original);
102
+ if (!invalidation.ok)
103
+ return failure(request, identity, 'TASK_INVALIDATION_INVALID', invalidation.message);
93
104
  }
94
105
  let candidate = original;
95
106
  const operations = [];
@@ -1,4 +1,5 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
+ import semver from 'semver';
2
3
  const packageJsonUrl = [
3
4
  new URL('../package.json', import.meta.url),
4
5
  new URL('../../package.json', import.meta.url),
@@ -9,8 +10,17 @@ if (!packageJsonUrl) {
9
10
  const { version } = JSON.parse(readFileSync(packageJsonUrl, 'utf8'));
10
11
  const VERSION = `v${version}`;
11
12
  const AGENT_INFRA_VERSION_PATTERN = /^v\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
13
+ const LEGACY_COMPATIBILITY_CUTOFF_VERSION = '1.0.0';
12
14
  function isValidAgentInfraVersion(value) {
13
15
  return typeof value === 'string' && AGENT_INFRA_VERSION_PATTERN.test(value);
14
16
  }
15
- export { VERSION, isValidAgentInfraVersion };
17
+ function isLegacyCompatibilityEnabled(runtimeVersion = VERSION) {
18
+ const normalized = runtimeVersion.startsWith('v') ? runtimeVersion.slice(1) : runtimeVersion;
19
+ const parsed = semver.valid(normalized);
20
+ return parsed !== null && semver.lt(parsed, LEGACY_COMPATIBILITY_CUTOFF_VERSION);
21
+ }
22
+ function legacyCompatibilityError(resource, runtimeVersion = VERSION) {
23
+ return Object.assign(new Error(`PLATFORM_IDENTITY_LEGACY_UNSUPPORTED: ${resource} requires migration to the current schema before v${LEGACY_COMPATIBILITY_CUTOFF_VERSION} runtime ${runtimeVersion}`), { code: 'PLATFORM_IDENTITY_LEGACY_UNSUPPORTED' });
24
+ }
25
+ export { LEGACY_COMPATIBILITY_CUTOFF_VERSION, VERSION, isLegacyCompatibilityEnabled, isValidAgentInfraVersion, legacyCompatibilityError };
16
26
  //# sourceMappingURL=version.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "protocolVersion": 3,
3
- "packageVersion": "0.9.12",
4
- "sourceInputHash": "5e1b341aad5fe825884f4dbdbd01d0752ca66107d1ccb4b0fe4d8d3aae49120d",
5
- "internalExecutableBuildHash": "39bf2c60e3a9b834d4a24ab3088f108583d15ee2bdc77e6376e517921be47c80"
3
+ "packageVersion": "0.9.14",
4
+ "sourceInputHash": "a3cf306ad6576904e6ef7d962e51245c6684540bd41358beaebf8209c00f3cfc",
5
+ "internalExecutableBuildHash": "14773c26aea5022af695f2e3ca4a39bed3c87c1eab04347aeded028745d8ded1"
6
6
  }
@@ -11,6 +11,9 @@ import { AGENT_CLIENT_IDS, isAgentClientId } from './agent-clients/types.ts';
11
11
  import type { AgentClientState } from './agent-clients/types.ts';
12
12
  import { closePrompt, multiSelect } from './prompt.ts';
13
13
  import { resolveTemplateDir } from './paths.ts';
14
+ import { PUBLIC_CLI_ROUTE_SELECTORS } from './internal/cli-route-inventory.ts';
15
+
16
+ const AGENT_CLIENT_OPERATIONS = PUBLIC_CLI_ROUTE_SELECTORS['agent-client'];
14
17
 
15
18
  const USAGE = `Usage: ai agent-client <operation>
16
19
 
@@ -107,6 +110,12 @@ async function cmdAgentClient(args: string[]): Promise<number> {
107
110
  process.stdout.write(USAGE);
108
111
  return 0;
109
112
  }
113
+ if (!AGENT_CLIENT_OPERATIONS.includes(operation as typeof AGENT_CLIENT_OPERATIONS[number])) {
114
+ throw new AgentClientCommandError(
115
+ 'AGENT_CLIENT_OPERATION_INVALID',
116
+ `Unknown operation '${operation}'`
117
+ );
118
+ }
110
119
 
111
120
  if (operation === 'list') {
112
121
  if (args.length !== 1) {
@@ -1,6 +1,7 @@
1
1
  import { listEnabledAgentClientAdapters } from './registry.ts';
2
2
  import { renderAgentClientInvocation } from './invocation.ts';
3
3
  import semver from 'semver';
4
+ import { isTaskScopeSkill } from '../task/skill-scope.ts';
4
5
  import type { CustomTUI } from './custom-tuis.ts';
5
6
  import type { AgentClientId, AgentClientState } from './types.ts';
6
7
 
@@ -45,7 +46,11 @@ function renderNextStepCommands(
45
46
  }
46
47
 
47
48
  const args = [
48
- ...(input.taskRef === undefined ? [] : [input.taskRef]),
49
+ ...(input.taskRef === undefined
50
+ ? []
51
+ : isTaskScopeSkill(input.skillName)
52
+ ? ['--task', input.taskRef]
53
+ : [input.taskRef]),
49
54
  ...(input.version === undefined ? [] : [input.version])
50
55
  ];
51
56
 
package/lib/decide.ts CHANGED
@@ -79,11 +79,11 @@ export async function decide(args: string[], options: DecideOptions = {}): Promi
79
79
  metadataProvider: () => ({ timestamp: now, agentInfraVersion: options.version ?? VERSION })
80
80
  };
81
81
  let result;
82
- const execute = () => {
82
+ const execute = async () => {
83
83
  let current = applyHumanDecision(request, writeOptions);
84
84
  if (current.status !== 'failed' || !parsedDecision.overrideTicket) return current;
85
85
  if (!parsedDecision.overrideTarget || !parsedDecision.overrideScope) throw new Error('override ticket requires --override-target and --override-scope');
86
- const consumed = consumeHumanOverride({
86
+ const consumed = await consumeHumanOverride({
87
87
  taskRef: resolved.taskId,
88
88
  ticketId: parsedDecision.overrideTicket,
89
89
  failureId: failureId('decision-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
@@ -102,7 +102,7 @@ export async function decide(args: string[], options: DecideOptions = {}): Promi
102
102
  if (consumed.status === 'failed') throw new Error(consumed.error.message);
103
103
  return current;
104
104
  };
105
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-decision', execute);
105
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-decision', execute);
106
106
  if (result.error) throw new Error(result.error.message);
107
107
  return 0;
108
108
  } catch (error) {
package/lib/init.ts CHANGED
@@ -40,7 +40,7 @@ type AgentConfig = {
40
40
  project: string;
41
41
  org: string;
42
42
  language: string;
43
- platform: { type: string };
43
+ platform: { type: string; providers?: Record<string, unknown> };
44
44
  templateVersion: string;
45
45
  sandbox: Record<string, unknown>;
46
46
  task: { shortIdLength: number };
@@ -9,6 +9,7 @@ import { normalizeCustomTUIs } from '../agent-clients/custom-tuis.ts';
9
9
  import { renderNextStepCommands } from '../agent-clients/next-steps.ts';
10
10
  import { getAgentClientModelSelection } from '../agent-clients/registry.ts';
11
11
  import { isAgentClientId } from '../agent-clients/types.ts';
12
+ import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
12
13
 
13
14
  const USAGE = 'Usage: agent-infra-internal agent-client <next-steps|model-selection> [options]\n';
14
15
 
@@ -35,7 +36,7 @@ function parseArgs(args: string[]): ParsedArgs | null {
35
36
  process.stdout.write(USAGE);
36
37
  return null;
37
38
  }
38
- if (args[0] !== 'next-steps') {
39
+ if (!internalHandlerRoute('agent-client', 'next-steps', args[0] ?? '')) {
39
40
  failure('AGENT_CLIENT_PAYLOAD_INVALID', "operation must be 'next-steps'");
40
41
  return null;
41
42
  }
@@ -84,7 +85,8 @@ function parseArgs(args: string[]): ParsedArgs | null {
84
85
  }
85
86
 
86
87
  function agentClient(args: string[] = []): void {
87
- if (args[0] === 'model-selection') {
88
+ if (!ensureInternalHandlerRoute('agent-client', args)) return;
89
+ if (internalHandlerRoute('agent-client', 'model-selection', args[0] ?? '')) {
88
90
  const values: Record<string, string> = {};
89
91
  const seen = new Set<string>();
90
92
  for (let index = 1; index < args.length; index += 1) {