@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
@@ -12,6 +12,9 @@ import { parseActivityLog, pairEntries, startedBackedRows } from '../activity-lo
12
12
  import { readRun, type OrchestrationRun } from '../orchestration.ts';
13
13
  import type { DelegationReceipt } from '../delegation-receipts.ts';
14
14
  import { statusCard, type DisplayMessage } from '../../server/display.ts';
15
+ import { invalidationBlocks, parseInvalidationDocument } from '../invalidation.ts';
16
+ import { parseReworkIntentDocument } from '../rework-intent.ts';
17
+ import { buildLifecycleFacts, recommendNext } from '../capabilities.ts';
15
18
 
16
19
  const USAGE = `Usage: ai task status [--task <ref> | -t <ref>]
17
20
 
@@ -381,6 +384,8 @@ type StatusModel = {
381
384
  workflow: WorkflowInfo;
382
385
  runtime: RuntimeInfo;
383
386
  orchestration: OrchestrationInfo;
387
+ invalidation?: { status: string; processed: number; total: number; pendingIntents: number };
388
+ recommendation?: string;
384
389
  git: GitInfo;
385
390
  };
386
391
 
@@ -429,6 +434,18 @@ function renderStatus(model: StatusModel): string[] {
429
434
  lines.push(...renderPairs(model.artifacts.groups.map((group) => [group.stage, group.files.join(', ')])));
430
435
  }
431
436
 
437
+ lines.push(
438
+ '',
439
+ 'Invalidation',
440
+ ...renderPairs([
441
+ ['status', model.invalidation?.status ?? 'unknown'],
442
+ ['processed', `${model.invalidation?.processed ?? 0}/${model.invalidation?.total ?? 0}`],
443
+ ['pending_intents', String(model.invalidation?.pendingIntents ?? 0)]
444
+ ])
445
+ );
446
+
447
+ lines.push('', 'Recommendation', ...renderPairs([['action', model.recommendation ?? DASH]]));
448
+
432
449
  lines.push(
433
450
  '',
434
451
  'Orchestration',
@@ -494,6 +511,8 @@ function renderStatus(model: StatusModel): string[] {
494
511
  }
495
512
 
496
513
  function modelTone(model: StatusModel): 'info' | 'success' | 'warning' | 'danger' | 'running' {
514
+ if (model.invalidation?.status === 'invalid') return 'danger';
515
+ if (model.invalidation?.status === 'pending' || model.invalidation?.status === 'in-progress') return 'warning';
497
516
  if (model.orchestration.status === 'paused') return 'warning';
498
517
  if (model.orchestration.status === 'running') return 'running';
499
518
  if (model.orchestration.status === 'completed') return 'success';
@@ -511,6 +530,23 @@ function buildFromResolved(input: BuildStatusModelInput): StatusModel {
511
530
  const run = input.run ?? makeRunner(input.repoRoot);
512
531
  const artifacts = enumerateArtifacts(input.taskDir);
513
532
  const workflow = collectWorkflow(content, input.now);
533
+ const invalidation = parseInvalidationDocument(content);
534
+ const rework = parseReworkIntentDocument(content);
535
+ const pendingIntents = rework.ok ? rework.intents.filter((intent) => intent.status === 'pending').length : 0;
536
+ const invalidationInfo = !invalidation.ok
537
+ ? { status: 'invalid', processed: 0, total: 0, pendingIntents }
538
+ : {
539
+ status: invalidation.present
540
+ ? invalidationBlocks(invalidation.document)
541
+ ? invalidation.document.operations.some((operation) => operation.status === 'in-progress') ? 'in-progress' : 'pending'
542
+ : 'completed'
543
+ : 'none',
544
+ processed: invalidation.document.operations.reduce((sum, operation) => sum + operation.processed, 0),
545
+ total: invalidation.document.operations.reduce((sum, operation) => sum + operation.total, 0),
546
+ pendingIntents
547
+ };
548
+ const facts = buildLifecycleFacts(input.taskDir, content, fm.status ?? 'active');
549
+ const recommendation = facts.ok ? (recommendNext(facts.facts).action ?? DASH) : DASH;
514
550
 
515
551
  return {
516
552
  taskId: input.taskId,
@@ -522,6 +558,8 @@ function buildFromResolved(input: BuildStatusModelInput): StatusModel {
522
558
  workflow,
523
559
  runtime: collectRuntime(input.taskDir, workflow, run),
524
560
  orchestration: collectOrchestration(input.taskDir),
561
+ invalidation: invalidationInfo,
562
+ recommendation,
525
563
  git: collectGit(fm.branch ?? '', run)
526
564
  };
527
565
  }
@@ -210,7 +210,18 @@ function syncTaskCommit(
210
210
  );
211
211
  const metadata = captureTaskWriteMetadata();
212
212
  const commitNote = gitText(task.repoRoot, ['show', '-s', '--format=%h %s', committedHead]);
213
- const alreadyLogged = activity.entries.some((entry) => entry.step === 'Commit' && entry.note === commitNote);
213
+ let matchingCommitIndex = -1;
214
+ for (let index = activity.entries.length - 1; index >= 0; index -= 1) {
215
+ const entry = activity.entries[index]!;
216
+ if (entry.step === 'Commit' && entry.note === commitNote) {
217
+ matchingCommitIndex = index;
218
+ break;
219
+ }
220
+ }
221
+ const reviewedAfterCommit = matchingCommitIndex >= 0 && activity.entries
222
+ .slice(matchingCommitIndex + 1)
223
+ .some((entry) => /^Review Code \(Round \d+\)$/.test(entry.step));
224
+ const alreadyLogged = matchingCommitIndex >= 0 && !reviewedAfterCommit;
214
225
  const mutations: TaskMutation[] = [];
215
226
  if (!alreadyLogged) mutations.push({
216
227
  kind: 'section',
@@ -20,7 +20,11 @@ import {
20
20
  sealOrchestrationDelegation,
21
21
  statusOrchestration
22
22
  } from './orchestration.ts';
23
- import type { OrchestrationOptions, OrchestrationResult } from './orchestration.ts';
23
+ import type {
24
+ OrchestrationDiagnosticLogger,
25
+ OrchestrationOptions,
26
+ OrchestrationResult
27
+ } from './orchestration.ts';
24
28
  import { prepareCodexOrchestrationDelegation } from './codex-orchestration.ts';
25
29
  import {
26
30
  applyTaskFinalization,
@@ -60,6 +64,7 @@ export type TaskControlExecutionContext =
60
64
  generation: string;
61
65
  manifestPath: string;
62
66
  requestId: string;
67
+ diagnosticLog?: OrchestrationDiagnosticLogger;
63
68
  controllerBinding?: TaskControlControllerBinding | null;
64
69
  }>;
65
70
 
@@ -134,6 +139,7 @@ export function createSandboxExecutorExecutionContext(params: Readonly<{
134
139
  generation: string;
135
140
  manifestPath: string;
136
141
  requestId: string;
142
+ diagnosticLog?: OrchestrationDiagnosticLogger;
137
143
  controllerBinding?: TaskControlControllerBinding | null;
138
144
  }>): TaskControlExecutionContext {
139
145
  if (!/^TASK-\d{8}-\d{6}$/u.test(params.taskId) || !params.generation || !params.requestId) {
@@ -153,6 +159,7 @@ export function createSandboxExecutorExecutionContext(params: Readonly<{
153
159
  generation: params.generation,
154
160
  manifestPath: absolute('manifestPath', params.manifestPath),
155
161
  requestId: params.requestId,
162
+ ...(params.diagnosticLog === undefined ? {} : { diagnosticLog: params.diagnosticLog }),
156
163
  ...(params.controllerBinding === undefined ? {} : { controllerBinding: binding(params.controllerBinding) })
157
164
  };
158
165
  }
@@ -192,6 +199,9 @@ function domainOptions(
192
199
  return {
193
200
  ...options,
194
201
  repoRoot: context.repoRoot,
202
+ ...(context.source === 'sandbox-executor' && context.diagnosticLog !== undefined
203
+ ? { diagnosticLog: context.diagnosticLog }
204
+ : {}),
195
205
  ...(context.source === 'sandbox-executor' ? { gitWorktreeRoot: context.worktreeRoot } : {})
196
206
  };
197
207
  }
@@ -206,15 +216,15 @@ function lifecycleTaskId(request: TaskLifecycleControlRequest, repoRoot: string)
206
216
  }
207
217
  }
208
218
 
209
- function applyLifecycleWithAuthority(
219
+ async function applyLifecycleWithAuthority(
210
220
  context: TaskControlExecutionContext,
211
221
  request: TaskLifecycleControlRequest
212
- ): TaskLifecycleResult & { humanOverride?: unknown } {
222
+ ): Promise<TaskLifecycleResult & { humanOverride?: unknown }> {
213
223
  const conflict = overrideDryRunConflict(request as unknown as Record<string, unknown>);
214
224
  if (conflict) {
215
225
  return taskLifecycleFailure(request, { code: 'LIFECYCLE_PAYLOAD_INVALID', message: conflict.message });
216
226
  }
217
- const execute = (): TaskLifecycleResult & { humanOverride?: unknown } => {
227
+ const execute = async (): Promise<TaskLifecycleResult & { humanOverride?: unknown }> => {
218
228
  const lifecycleResult = applyTaskLifecycle(request, { repoRoot: context.repoRoot });
219
229
  if (lifecycleResult.status !== 'failed' || !request.overrideTicket) return lifecycleResult;
220
230
  if (!request.overrideTarget || !request.overrideScope) {
@@ -223,7 +233,7 @@ function applyLifecycleWithAuthority(
223
233
  error: { code: 'OVERRIDE_PAYLOAD_INVALID', message: 'override ticket requires --override-target and --override-scope' }
224
234
  };
225
235
  }
226
- const override = consumeHumanOverride({
236
+ const override = await consumeHumanOverride({
227
237
  taskRef: request.taskRef,
228
238
  ticketId: request.overrideTicket,
229
239
  failureId: failureId('lifecycle.apply', lifecycleResult.error?.code ?? 'LIFECYCLE_FAILED'),
@@ -238,9 +248,9 @@ function applyLifecycleWithAuthority(
238
248
  return { ...lifecycleResult, ...override, humanOverride: override, error: null };
239
249
  };
240
250
  const taskId = lifecycleTaskId(request, context.repoRoot);
241
- if (!taskId) return execute();
251
+ if (!taskId) return await execute();
242
252
  try {
243
- return withTaskExecutionLock(
253
+ return await withTaskExecutionLock(
244
254
  context.repoRoot,
245
255
  taskId,
246
256
  `task-lifecycle.${request.intent}`,
@@ -322,11 +332,11 @@ function orchestrationFailure(error: unknown): OrchestrationResult {
322
332
  export function dispatchTaskControlOperation(
323
333
  context: TaskControlExecutionContext,
324
334
  operation: Extract<TaskControlOperation, { family: 'task-lifecycle' }>
325
- ): TaskLifecycleResult;
335
+ ): Promise<TaskLifecycleResult & { humanOverride?: unknown }>;
326
336
  export function dispatchTaskControlOperation(
327
337
  context: TaskControlExecutionContext,
328
338
  operation: Extract<TaskControlOperation, { family: 'task-finalization' }>
329
- ): TaskFinalizationResult;
339
+ ): Promise<TaskFinalizationResult>;
330
340
  export function dispatchTaskControlOperation(
331
341
  context: TaskControlExecutionContext,
332
342
  operation: Extract<TaskControlOperation, { family: 'task-orchestration' }>
@@ -345,6 +355,9 @@ export function dispatchTaskControlOperation(
345
355
  operationTaskId(context, operation.request.taskRef);
346
356
  return applyTaskFinalization(operation.request, {
347
357
  repoRoot: context.repoRoot,
358
+ ...(context.source === 'sandbox-executor' ? {
359
+ controlBinding: { generation: context.generation, requestId: context.requestId }
360
+ } : {}),
348
361
  preflight: (request, options) => verifyTaskEvent(
349
362
  { ...request, event: 'complete-task.hard-preflight' }, options
350
363
  )
@@ -12,6 +12,13 @@ import { verifyTaskEvent } from './verification.ts';
12
12
  type TaskCreateStatus = 'applied' | 'no-op' | 'degraded' | 'failed' | 'blocked';
13
13
  type TaskCreateOperation = { name: string; status: string; reasonCode: string | null };
14
14
  type TaskCreateWarning = { code: string; severity: string; action: string };
15
+ type TaskCreateRecovery = 'none' | 'same-request-id' | 'new-request-id' | 'inspect-domain-state';
16
+ type TaskCreateControl = Readonly<{
17
+ requestId: string | null;
18
+ accepted: boolean;
19
+ recovery: TaskCreateRecovery;
20
+ }>;
21
+ type TaskCreateError = { code: string; message: string; retryable: boolean };
15
22
  type TaskCreateResult = Readonly<{
16
23
  status: TaskCreateStatus;
17
24
  changed: boolean;
@@ -19,7 +26,8 @@ type TaskCreateResult = Readonly<{
19
26
  issue: { number: number; url: string } | null;
20
27
  operations: readonly TaskCreateOperation[];
21
28
  warnings: readonly TaskCreateWarning[];
22
- error: { code: string; message: string; retryable: boolean } | null;
29
+ error: TaskCreateError | null;
30
+ control?: TaskCreateControl;
23
31
  }>;
24
32
 
25
33
  type CreateTaskOptions = Readonly<{
@@ -42,8 +50,118 @@ const DEFAULT_DEPENDENCIES: TaskCreateDependencies = {
42
50
  addWarning: applyWorkflowWarningIntent
43
51
  };
44
52
 
45
- function verifyCreatedTask(repoRoot: string, taskId: string): { operation: TaskCreateOperation; error: TaskCreateResult['error'] } {
46
- const verification = verifyTaskEvent(
53
+ function invalidTaskCreateResult(): never {
54
+ throw new Error('TASK_CREATE_RESULT_INVALID');
55
+ }
56
+
57
+ function exactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {
58
+ return Object.keys(value).sort().join(',') === [...expected].sort().join(',');
59
+ }
60
+
61
+ function validTaskReference(value: unknown): boolean {
62
+ return value === null || (typeof value === 'string' && value.length > 0);
63
+ }
64
+
65
+ function validTaskCreateError(value: unknown): value is TaskCreateError {
66
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
67
+ const error = value as Record<string, unknown>;
68
+ return exactKeys(error, ['code', 'message', 'retryable'])
69
+ && typeof error.code === 'string' && /^[A-Z][A-Z0-9_]+$/u.test(error.code)
70
+ && typeof error.message === 'string'
71
+ && typeof error.retryable === 'boolean';
72
+ }
73
+
74
+ function validTaskCreateControl(value: unknown): value is TaskCreateControl {
75
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
76
+ const control = value as Record<string, unknown>;
77
+ return exactKeys(control, ['accepted', 'recovery', 'requestId'])
78
+ && validTaskReference(control.requestId)
79
+ && typeof control.accepted === 'boolean'
80
+ && ['none', 'same-request-id', 'new-request-id', 'inspect-domain-state'].includes(control.recovery as string);
81
+ }
82
+
83
+ export function parseTaskCreateResult(value: unknown): TaskCreateResult {
84
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return invalidTaskCreateResult();
85
+ const result = value as Record<string, unknown>;
86
+ if (!exactKeys(result, ['changed', 'control', 'error', 'issue', 'operations', 'status', 'task', 'warnings'])
87
+ && !exactKeys(result, ['changed', 'error', 'issue', 'operations', 'status', 'task', 'warnings'])) {
88
+ return invalidTaskCreateResult();
89
+ }
90
+ if (!['applied', 'no-op', 'degraded', 'failed', 'blocked'].includes(result.status as string)
91
+ || typeof result.changed !== 'boolean'
92
+ || !result.task || typeof result.task !== 'object' || Array.isArray(result.task)
93
+ || !exactKeys(result.task as Record<string, unknown>, ['id', 'shortId'])
94
+ || !validTaskReference((result.task as { id?: unknown }).id)
95
+ || !validTaskReference((result.task as { shortId?: unknown }).shortId)
96
+ || !Array.isArray(result.operations)
97
+ || !result.operations.every((operation) => {
98
+ if (!operation || typeof operation !== 'object' || Array.isArray(operation)) return false;
99
+ const value = operation as Record<string, unknown>;
100
+ return exactKeys(value, ['name', 'reasonCode', 'status'])
101
+ && typeof value.name === 'string' && typeof value.status === 'string'
102
+ && (value.reasonCode === null || typeof value.reasonCode === 'string');
103
+ })
104
+ || !Array.isArray(result.warnings)
105
+ || !result.warnings.every((warning) => {
106
+ if (!warning || typeof warning !== 'object' || Array.isArray(warning)) return false;
107
+ const value = warning as Record<string, unknown>;
108
+ return exactKeys(value, ['action', 'code', 'severity'])
109
+ && typeof value.action === 'string' && typeof value.code === 'string' && typeof value.severity === 'string';
110
+ })
111
+ || (result.issue !== null && (
112
+ !result.issue || typeof result.issue !== 'object' || Array.isArray(result.issue)
113
+ || !exactKeys(result.issue as Record<string, unknown>, ['number', 'url'])
114
+ || !Number.isSafeInteger((result.issue as { number?: unknown }).number)
115
+ || ((result.issue as { number: number }).number) <= 0
116
+ || typeof (result.issue as { url?: unknown }).url !== 'string'
117
+ ))
118
+ || (result.error !== null && !validTaskCreateError(result.error))
119
+ || ('control' in result && !validTaskCreateControl(result.control))) {
120
+ return invalidTaskCreateResult();
121
+ }
122
+ if (result.status === 'blocked' && !(result.error as TaskCreateError | null)?.retryable) return invalidTaskCreateResult();
123
+ if (result.status === 'failed' && !(result.error as TaskCreateError | null)) return invalidTaskCreateResult();
124
+ return result as unknown as TaskCreateResult;
125
+ }
126
+
127
+ export function projectTaskCreateResult(result: TaskCreateResult, control: TaskCreateControl): TaskCreateResult {
128
+ return { ...result, control };
129
+ }
130
+
131
+ export function taskCreateExitCode(result: Pick<TaskCreateResult, 'status'>): number {
132
+ return result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
133
+ }
134
+
135
+ export function taskCreateFailure(
136
+ error: TaskCreateError,
137
+ control?: TaskCreateControl
138
+ ): TaskCreateResult {
139
+ return {
140
+ status: error.retryable ? 'blocked' : 'failed',
141
+ changed: false,
142
+ task: { id: null, shortId: null },
143
+ issue: null,
144
+ operations: [],
145
+ warnings: [],
146
+ error,
147
+ ...(control ? { control } : {})
148
+ };
149
+ }
150
+
151
+ export function taskCreateOutputUnavailableResult(requestId: string): TaskCreateResult {
152
+ return taskCreateFailure({
153
+ code: 'SANDBOX_CONTROL_OUTPUT_UNAVAILABLE',
154
+ message: 'SANDBOX_CONTROL_OUTPUT_UNAVAILABLE: task-create result output was not retained; inspect domain state before retrying',
155
+ retryable: false
156
+ }, {
157
+ requestId,
158
+ accepted: true,
159
+ recovery: 'inspect-domain-state'
160
+ });
161
+ }
162
+
163
+ async function verifyCreatedTask(repoRoot: string, taskId: string): Promise<{ operation: TaskCreateOperation; error: TaskCreateResult['error'] }> {
164
+ const verification = await verifyTaskEvent(
47
165
  { taskRef: taskId, event: 'create-task.completed' },
48
166
  { repoRoot }
49
167
  );
@@ -78,7 +196,7 @@ function issueFromTask(repoRoot: string, taskId: string): { number: number; url:
78
196
  return match ? { number: Number(match[1]), url: '' } : null;
79
197
  }
80
198
 
81
- function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResult {
199
+ async function createTask(value: unknown, options: CreateTaskOptions): Promise<TaskCreateResult> {
82
200
  const dependencies = { ...DEFAULT_DEPENDENCIES, ...options.dependencies };
83
201
  let candidate: TaskCreateCandidateV1;
84
202
  let local;
@@ -91,23 +209,20 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
91
209
  } catch (error) {
92
210
  const message = error instanceof Error ? error.message : String(error);
93
211
  const code = /^([A-Z][A-Z0-9_]+)/.exec(message)?.[1] ?? 'TASK_CREATE_FAILED';
94
- return {
95
- status: 'failed', changed: false, task: { id: null, shortId: null }, issue: null,
96
- operations: [], warnings: [], error: { code, message, retryable: code === 'TASK_CREATE_LOCK_TIMEOUT' }
97
- };
212
+ return taskCreateFailure({ code, message, retryable: code === 'TASK_CREATE_LOCK_TIMEOUT' });
98
213
  }
99
214
 
100
215
  const operations: TaskCreateOperation[] = [{
101
216
  name: 'task:local', status: local.status, reasonCode: null
102
217
  }];
103
218
  let issue = issueFromTask(options.repoRoot, local.task.id);
104
- const created = dependencies.createIssue(local.task.id, { cwd: options.repoRoot, agent: candidate.agent });
219
+ const created = await dependencies.createIssue(local.task.id, { cwd: options.repoRoot, agent: candidate.agent });
105
220
  operations.push(...platformOperations('platform-create', created.operations));
106
221
  if (created.issue) issue = { number: created.issue.number, url: created.issue.url };
107
222
 
108
223
  let platformFailure: PlatformResult | null = created.status === 'failed' || created.status === 'blocked' ? created : null;
109
224
  if (!platformFailure && (created.task.issueNumber || issue)) {
110
- const synced = dependencies.syncIssue(local.task.id, {
225
+ const synced = await dependencies.syncIssue(local.task.id, {
111
226
  cwd: options.repoRoot,
112
227
  agent: candidate.agent,
113
228
  status: 'waiting-for-triage',
@@ -120,7 +235,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
120
235
  if (synced.issue) issue = { number: synced.issue.number, url: synced.issue.url };
121
236
  if (synced.status === 'failed' || synced.status === 'blocked') platformFailure = synced;
122
237
  if (!platformFailure) {
123
- const commented = dependencies.syncComment(local.task.id, { cwd: options.repoRoot, kind: 'task', agent: candidate.agent });
238
+ const commented = await dependencies.syncComment(local.task.id, { cwd: options.repoRoot, kind: 'task', agent: candidate.agent });
124
239
  operations.push(...platformOperations('platform-comment', commented.operations));
125
240
  if (commented.status === 'failed' || commented.status === 'blocked') platformFailure = commented;
126
241
  }
@@ -133,7 +248,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
133
248
  code: 'ISSUE_CREATE_FAILED', target: 'issue', message: `${error.code}: ${error.message}`,
134
249
  action: 'Fix platform authentication or connectivity, then retry Issue creation for this task.'
135
250
  }, { repoRoot: options.repoRoot });
136
- const verified = verifyCreatedTask(options.repoRoot, local.task.id);
251
+ const verified = await verifyCreatedTask(options.repoRoot, local.task.id);
137
252
  operations.push(verified.operation);
138
253
  if (verified.error) return {
139
254
  status: verified.error.retryable ? 'blocked' : 'failed', changed: local.changed,
@@ -150,7 +265,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
150
265
  };
151
266
  }
152
267
 
153
- const verified = verifyCreatedTask(options.repoRoot, local.task.id);
268
+ const verified = await verifyCreatedTask(options.repoRoot, local.task.id);
154
269
  operations.push(verified.operation);
155
270
  if (verified.error) return {
156
271
  status: verified.error.retryable ? 'blocked' : 'failed', changed: local.changed,
@@ -168,4 +283,14 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
168
283
  }
169
284
 
170
285
  export { createTask };
171
- export type { CreateTaskOptions, TaskCreateDependencies, TaskCreateOperation, TaskCreateResult, TaskCreateStatus, TaskCreateWarning };
286
+ export type {
287
+ CreateTaskOptions,
288
+ TaskCreateControl,
289
+ TaskCreateDependencies,
290
+ TaskCreateError,
291
+ TaskCreateOperation,
292
+ TaskCreateRecovery,
293
+ TaskCreateResult,
294
+ TaskCreateStatus,
295
+ TaskCreateWarning
296
+ };
@@ -7,6 +7,7 @@ import { loadShortIdByTaskId, mutateShortIdRegistry } from './short-id.ts';
7
7
  import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-lock.ts';
8
8
  import { readDeliveryDefaults, validateBaseRef, validateRemote } from './delivery-target.ts';
9
9
  import { buildUnboundFact, encodePrDeliveryFact } from './pr-delivery-fact.ts';
10
+ import { CANDIDATE_COLUMNS, CONSTRAINT_COLUMNS } from './qualification-audit.ts';
10
11
 
11
12
  const AGENTS = ['claude', 'codex', 'antigravity', 'opencode', 'cursor'] as const;
12
13
  const TYPES = ['feature', 'bugfix', 'refactor', 'docs', 'chore'] as const;
@@ -178,6 +179,25 @@ function renderList(items: readonly string[]): string {
178
179
  return items.map((item) => `- ${item}`).join('\n');
179
180
  }
180
181
 
182
+ function tableCell(value: string): string {
183
+ return value.replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/[\r\n]/g, ' ');
184
+ }
185
+
186
+ function renderTable(columns: readonly string[], rows: readonly (readonly string[])[]): string {
187
+ return [
188
+ `| ${columns.join(' | ')} |`,
189
+ `| ${columns.map(() => '---').join(' | ')} |`,
190
+ ...rows.map((row) => `| ${row.map(tableCell).join(' | ')} |`)
191
+ ].join('\n');
192
+ }
193
+
194
+ function appendCanonicalRows(content: string, columns: readonly string[], rows: readonly (readonly string[])[]): string {
195
+ if (rows.length === 0) return content;
196
+ const table = renderTable(columns, rows);
197
+ const separator = `| ${columns.map(() => '---').join(' | ')} |`;
198
+ return content.replace(separator, `${separator}\n${table.split('\n').slice(2).join('\n')}`);
199
+ }
200
+
181
201
  function replaceEmptySubsection(content: string, heading: string, items: readonly string[]): string {
182
202
  if (items.length === 0) return content;
183
203
  return content.replace(`${heading}\n`, `${heading}\n\n${renderList(items)}\n`);
@@ -231,6 +251,13 @@ function renderTask(params: Readonly<{
231
251
  ['### 验收标准', 'acceptanceCriteria'], ['### 未决事项', 'openQuestions']
232
252
  ];
233
253
  for (const [heading, key] of sections) content = replaceEmptySubsection(content, heading, candidate.taskInput[key]);
254
+ const constraintIds = candidate.taskInput.constraints.map((_, index) => `C-${index + 1}`);
255
+ content = appendCanonicalRows(content, CONSTRAINT_COLUMNS, candidate.taskInput.constraints.map((statement, index) => [
256
+ constraintIds[index]!, statement, 'assumption', 'create-task', 'taskInput', 'create-task input', '', ''
257
+ ]));
258
+ content = appendCanonicalRows(content, CANDIDATE_COLUMNS, candidate.taskInput.alternatives.map((statement, index) => [
259
+ String.fromCharCode(65 + index), statement, 'pending', constraintIds.join(','), 'requires qualification', 'create-task input'
260
+ ]));
234
261
  content = content.replace('- **关联 Issue**:#XXX', '- **关联 Issue**:N/A');
235
262
  content = content.replace('- **关联 PR**:#XXX', '- **关联 PR**:N/A');
236
263
  content = content.replace('- **分支**:`feature/xxx`', `- **分支**:\`${branch}\``);
@@ -2,6 +2,8 @@ import { isValidAgentInfraVersion } from '../version.ts';
2
2
  import { parseTypedTaskFrontmatter } from './frontmatter.ts';
3
3
  import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, parseLedgerDocument, validateLedgerRows } from './ledger.ts';
4
4
  import type { LedgerDocument } from './ledger.ts';
5
+ import { parseInvalidationDocument } from './invalidation.ts';
6
+ import type { InvalidationDocument } from './invalidation.ts';
5
7
 
6
8
  type CurrentTaskContractErrorCode = 'TASK_DOCUMENT_INVALID' | 'TASK_CURRENT_CONTRACT_INVALID';
7
9
  type CurrentTaskContractResult =
@@ -9,6 +11,7 @@ type CurrentTaskContractResult =
9
11
  ok: true;
10
12
  metadata: ReturnType<typeof parseTypedTaskFrontmatter>;
11
13
  ledger: LedgerDocument;
14
+ invalidation: InvalidationDocument;
12
15
  }
13
16
  | {
14
17
  ok: false;
@@ -42,7 +45,9 @@ function validateCurrentTaskContract(content: string): CurrentTaskContractResult
42
45
  }
43
46
  const invalid = validateLedgerRows(ledger.rows);
44
47
  if (invalid) return { ok: false, code: 'TASK_CURRENT_CONTRACT_INVALID', message: `${invalid.code}: ${invalid.message}` };
45
- return { ok: true, metadata, ledger };
48
+ const invalidation = parseInvalidationDocument(content);
49
+ if (!invalidation.ok) return { ok: false, code: 'TASK_CURRENT_CONTRACT_INVALID', message: `${invalidation.code}: ${invalidation.message}` };
50
+ return { ok: true, metadata, ledger, invalidation: invalidation.document };
46
51
  }
47
52
 
48
53
  export { validateCurrentTaskContract };
@@ -270,11 +270,15 @@ export {
270
270
  normalizeDecisionDetailForDisplay,
271
271
  parseDecisionDetailBlocks,
272
272
  parseDecisionEvidence,
273
- resolveDecisionDetail
273
+ resolveDecisionDetail,
274
+ scanVisibleMarkdown
274
275
  };
275
276
  export type {
276
277
  DecisionDetailBlock,
277
278
  DecisionDetailDuplicate,
278
279
  DecisionDetailInspection,
279
- DecisionDetailResolution
280
+ DecisionDetailResolution,
281
+ SourceLine,
282
+ VisibleHeading,
283
+ VisibleMarkdown
280
284
  };