@fitlab-ai/agent-infra 0.9.11 → 0.9.13

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 (356) hide show
  1. package/README.md +13 -13
  2. package/README.zh-CN.md +13 -13
  3. package/dist/bin/internal-cli.js +29 -19
  4. package/dist/lib/agent-clients/adapters/codex-lifecycle/build-identity.js +71 -10
  5. package/dist/lib/agent-clients/next-steps.js +6 -1
  6. package/dist/lib/decide.js +3 -3
  7. package/dist/lib/defaults.json +4 -0
  8. package/dist/lib/git/workflow.js +43 -1
  9. package/dist/lib/init.js +1 -0
  10. package/dist/lib/internal/git-workflow.js +8 -1
  11. package/dist/lib/internal/platform-checks.js +3 -3
  12. package/dist/lib/internal/platform-comment.js +9 -9
  13. package/dist/lib/internal/platform-context.js +2 -2
  14. package/dist/lib/internal/platform-issue.js +8 -9
  15. package/dist/lib/internal/platform-pr-review.js +10 -10
  16. package/dist/lib/internal/platform-pr.js +68 -23
  17. package/dist/lib/internal/platform-release-notes.js +3 -3
  18. package/dist/lib/internal/pr-review-grade.js +11 -9
  19. package/dist/lib/internal/release-workflow.js +4 -4
  20. package/dist/lib/internal/sandbox-control.js +30 -4
  21. package/dist/lib/internal/task-activity.js +3 -3
  22. package/dist/lib/internal/task-artifact.js +76 -24
  23. package/dist/lib/internal/task-create.js +2 -2
  24. package/dist/lib/internal/task-delivery.js +59 -0
  25. package/dist/lib/internal/task-event.js +6 -3
  26. package/dist/lib/internal/task-finalization.js +2 -2
  27. package/dist/lib/internal/task-invalidation.js +60 -0
  28. package/dist/lib/internal/task-ledger.js +9 -6
  29. package/dist/lib/internal/task-lifecycle.js +2 -2
  30. package/dist/lib/internal/task-override.js +4 -4
  31. package/dist/lib/internal/task-review.js +3 -3
  32. package/dist/lib/internal/task-verify.js +6 -6
  33. package/dist/lib/internal/task-warning.js +3 -3
  34. package/dist/lib/platform/adapters.js +1 -3
  35. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  36. package/dist/lib/platform/completion-backfill.js +6 -5
  37. package/dist/lib/platform/context.js +70 -130
  38. package/dist/lib/platform/github-client.js +8 -2
  39. package/dist/lib/platform/github-provider.js +903 -0
  40. package/dist/lib/platform/in-label-sync.js +143 -0
  41. package/dist/lib/platform/issue-comments.js +94 -41
  42. package/dist/lib/platform/issues.js +335 -189
  43. package/dist/lib/platform/metadata-labels.js +6 -2
  44. package/dist/lib/platform/none-provider.js +28 -0
  45. package/dist/lib/platform/pr-change-report.js +551 -0
  46. package/dist/lib/platform/pr-checks.js +124 -106
  47. package/dist/lib/platform/pr-review.js +88 -72
  48. package/dist/lib/platform/pr-summary.js +523 -49
  49. package/dist/lib/platform/provider-bridge.js +45 -0
  50. package/dist/lib/platform/provider-contract.d.ts +487 -0
  51. package/dist/lib/platform/provider-contract.js +95 -0
  52. package/dist/lib/platform/provider-loader.js +251 -0
  53. package/dist/lib/platform/provider-validation.js +504 -0
  54. package/dist/lib/platform/pull-request-metadata.js +8 -6
  55. package/dist/lib/platform/pull-requests.js +1050 -502
  56. package/dist/lib/platform/release-notes.js +78 -55
  57. package/dist/lib/platform/releases.js +79 -50
  58. package/dist/lib/platform/resource-identity.d.ts +26 -0
  59. package/dist/lib/platform/resource-identity.js +92 -0
  60. package/dist/lib/platform/task-identities.js +31 -0
  61. package/dist/lib/platform/verification-required.js +22 -12
  62. package/dist/lib/platform/verification-sync.js +118 -239
  63. package/dist/lib/pr-review/evidence-grading.js +30 -9
  64. package/dist/lib/run/index.js +63 -23
  65. package/dist/lib/sandbox/config.js +5 -0
  66. package/dist/lib/sandbox/control/client.js +96 -15
  67. package/dist/lib/sandbox/control/executor.js +3 -3
  68. package/dist/lib/sandbox/control/lifecycle.js +29 -7
  69. package/dist/lib/sandbox/control/protocol.js +77 -0
  70. package/dist/lib/sandbox/control/server.js +398 -25
  71. package/dist/lib/sandbox/control/state.js +204 -1
  72. package/dist/lib/server/process-state.js +2 -2
  73. package/dist/lib/server/protocol.js +38 -1
  74. package/dist/lib/task/activity-log.js +8 -1
  75. package/dist/lib/task/artifact-lifecycle.js +35 -7
  76. package/dist/lib/task/capabilities.js +239 -0
  77. package/dist/lib/task/commands/status.js +32 -0
  78. package/dist/lib/task/commit-intent.js +100 -0
  79. package/dist/lib/task/commit-operation.js +207 -102
  80. package/dist/lib/task/control-authority.js +8 -5
  81. package/dist/lib/task/create-service.js +8 -8
  82. package/dist/lib/task/create.js +33 -7
  83. package/dist/lib/task/current-contract.js +5 -1
  84. package/dist/lib/task/decision-details.js +3 -48
  85. package/dist/lib/task/delivery-target.js +97 -0
  86. package/dist/lib/task/delivery.js +153 -0
  87. package/dist/lib/task/events.js +297 -17
  88. package/dist/lib/task/finalization.js +37 -13
  89. package/dist/lib/task/human-override.js +61 -36
  90. package/dist/lib/task/invalidation-command.js +86 -0
  91. package/dist/lib/task/invalidation.js +260 -0
  92. package/dist/lib/task/ledger-intents.js +37 -0
  93. package/dist/lib/task/lifecycle.js +106 -9
  94. package/dist/lib/task/local-artifact-finalization.js +374 -0
  95. package/dist/lib/task/orchestration.js +100 -151
  96. package/dist/lib/task/pr-delivery-fact.js +183 -0
  97. package/dist/lib/task/review-finalization.js +4 -8
  98. package/dist/lib/task/review-fingerprint.js +32 -2
  99. package/dist/lib/task/rework-intent.js +138 -0
  100. package/dist/lib/task/skill-scope.js +23 -0
  101. package/dist/lib/task/task-execution-lock.js +27 -17
  102. package/dist/lib/task/verification-engine.js +89 -38
  103. package/dist/lib/task/verification-review.js +1 -1
  104. package/dist/lib/task/verification.js +3 -3
  105. package/dist/lib/task/workflow-warning-intents.js +1 -1
  106. package/dist/lib/task/write.js +11 -0
  107. package/dist/lib/update.js +9 -0
  108. package/dist/lib/version.js +11 -1
  109. package/dist/lifecycle-build-manifest.json +3 -3
  110. package/lib/agent-clients/adapters/codex-lifecycle/build-identity.ts +105 -10
  111. package/lib/agent-clients/adapters/codex-lifecycle/manifest-files.json +12 -1
  112. package/lib/agent-clients/next-steps.ts +6 -1
  113. package/lib/decide.ts +3 -3
  114. package/lib/defaults.json +4 -0
  115. package/lib/git/workflow.ts +38 -1
  116. package/lib/init.ts +4 -1
  117. package/lib/internal/git-workflow.ts +7 -1
  118. package/lib/internal/platform-checks.ts +3 -3
  119. package/lib/internal/platform-comment.ts +8 -8
  120. package/lib/internal/platform-context.ts +2 -2
  121. package/lib/internal/platform-issue.ts +7 -8
  122. package/lib/internal/platform-pr-review.ts +9 -9
  123. package/lib/internal/platform-pr.ts +53 -21
  124. package/lib/internal/platform-release-notes.ts +3 -3
  125. package/lib/internal/pr-review-grade.ts +10 -8
  126. package/lib/internal/release-workflow.ts +4 -4
  127. package/lib/internal/sandbox-control.ts +27 -3
  128. package/lib/internal/task-activity.ts +3 -3
  129. package/lib/internal/task-artifact.ts +65 -22
  130. package/lib/internal/task-create.ts +2 -2
  131. package/lib/internal/task-delivery.ts +53 -0
  132. package/lib/internal/task-event.ts +6 -3
  133. package/lib/internal/task-finalization.ts +3 -3
  134. package/lib/internal/task-invalidation.ts +39 -0
  135. package/lib/internal/task-ledger.ts +11 -8
  136. package/lib/internal/task-lifecycle.ts +2 -2
  137. package/lib/internal/task-override.ts +6 -6
  138. package/lib/internal/task-review.ts +3 -3
  139. package/lib/internal/task-verify.ts +6 -6
  140. package/lib/internal/task-warning.ts +3 -3
  141. package/lib/platform/adapters.ts +3 -2
  142. package/lib/platform/change-request-git-evidence.ts +36 -9
  143. package/lib/platform/completion-backfill.ts +9 -8
  144. package/lib/platform/context.ts +97 -134
  145. package/lib/platform/github-client.ts +10 -3
  146. package/lib/platform/github-provider.ts +910 -0
  147. package/lib/platform/in-label-sync.ts +208 -0
  148. package/lib/platform/issue-comments.ts +97 -47
  149. package/lib/platform/issues.ts +344 -174
  150. package/lib/platform/metadata-labels.ts +5 -2
  151. package/lib/platform/none-provider.ts +35 -0
  152. package/lib/platform/pr-change-report.ts +645 -0
  153. package/lib/platform/pr-checks.ts +129 -107
  154. package/lib/platform/pr-review.ts +88 -85
  155. package/lib/platform/pr-summary.ts +562 -52
  156. package/lib/platform/provider-bridge.ts +82 -0
  157. package/lib/platform/provider-contract.ts +536 -0
  158. package/lib/platform/provider-loader.ts +307 -0
  159. package/lib/platform/provider-validation.ts +529 -0
  160. package/lib/platform/pull-request-metadata.ts +10 -7
  161. package/lib/platform/pull-requests.ts +1126 -505
  162. package/lib/platform/release-notes.ts +76 -59
  163. package/lib/platform/releases.ts +77 -43
  164. package/lib/platform/resource-identity.ts +121 -0
  165. package/lib/platform/task-identities.ts +40 -0
  166. package/lib/platform/types.ts +4 -2
  167. package/lib/platform/verification-required.ts +21 -13
  168. package/lib/platform/verification-sync.ts +118 -293
  169. package/lib/pr-review/evidence-grading.ts +31 -11
  170. package/lib/run/index.ts +57 -22
  171. package/lib/sandbox/config.ts +7 -0
  172. package/lib/sandbox/control/client.ts +105 -15
  173. package/lib/sandbox/control/executor.ts +4 -4
  174. package/lib/sandbox/control/lifecycle.ts +30 -8
  175. package/lib/sandbox/control/protocol.ts +113 -0
  176. package/lib/sandbox/control/server.ts +431 -23
  177. package/lib/sandbox/control/state.ts +251 -1
  178. package/lib/server/process-state.ts +2 -2
  179. package/lib/server/protocol.ts +36 -1
  180. package/lib/task/activity-log.ts +8 -0
  181. package/lib/task/artifact-lifecycle.ts +34 -8
  182. package/lib/task/capabilities.ts +262 -0
  183. package/lib/task/commands/status.ts +38 -0
  184. package/lib/task/commit-intent.ts +137 -0
  185. package/lib/task/commit-operation.ts +186 -88
  186. package/lib/task/control-authority.ts +11 -8
  187. package/lib/task/create-service.ts +8 -8
  188. package/lib/task/create.ts +34 -9
  189. package/lib/task/current-contract.ts +6 -1
  190. package/lib/task/decision-details.ts +8 -64
  191. package/lib/task/delivery-target.ts +130 -0
  192. package/lib/task/delivery.ts +160 -0
  193. package/lib/task/events.ts +296 -16
  194. package/lib/task/finalization.ts +50 -14
  195. package/lib/task/human-override.ts +73 -46
  196. package/lib/task/invalidation-command.ts +86 -0
  197. package/lib/task/invalidation.ts +332 -0
  198. package/lib/task/ledger-intents.ts +35 -1
  199. package/lib/task/lifecycle.ts +93 -4
  200. package/lib/task/local-artifact-finalization.ts +563 -0
  201. package/lib/task/orchestration.ts +110 -146
  202. package/lib/task/pr-delivery-fact.ts +237 -0
  203. package/lib/task/review-finalization.ts +4 -14
  204. package/lib/task/review-fingerprint.ts +33 -2
  205. package/lib/task/rework-intent.ts +165 -0
  206. package/lib/task/skill-scope.ts +24 -0
  207. package/lib/task/task-execution-lock.ts +23 -14
  208. package/lib/task/verification-engine.ts +95 -43
  209. package/lib/task/verification-review.ts +2 -0
  210. package/lib/task/verification.ts +4 -4
  211. package/lib/task/workflow-warning-intents.ts +1 -1
  212. package/lib/task/write.ts +19 -0
  213. package/lib/update.ts +11 -1
  214. package/lib/version.ts +15 -1
  215. package/package.json +7 -1
  216. package/templates/.agents/rules/README.en.md +4 -2
  217. package/templates/.agents/rules/README.zh-CN.md +4 -2
  218. package/templates/.agents/rules/create-issue.en.md +11 -2
  219. package/templates/.agents/rules/create-issue.zh-CN.md +24 -2
  220. package/templates/.agents/rules/issue-pr-commands.en.md +4 -17
  221. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  222. package/templates/.agents/rules/issue-sync.en.md +28 -5
  223. package/templates/.agents/rules/issue-sync.zh-CN.md +64 -5
  224. package/templates/.agents/rules/label-milestone-setup.en.md +15 -2
  225. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +15 -2
  226. package/templates/.agents/rules/local-artifact-repair.en.md +53 -0
  227. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +53 -0
  228. package/templates/.agents/rules/milestone-inference.en.md +12 -2
  229. package/templates/.agents/rules/milestone-inference.zh-CN.md +25 -3
  230. package/templates/.agents/rules/pr-sync.en.md +28 -13
  231. package/templates/.agents/rules/pr-sync.zh-CN.md +39 -5
  232. package/templates/.agents/rules/release-commands.en.md +42 -3
  233. package/templates/.agents/rules/release-commands.zh-CN.md +42 -3
  234. package/templates/.agents/rules/security-alerts.en.md +17 -2
  235. package/templates/.agents/rules/security-alerts.zh-CN.md +17 -2
  236. package/templates/.agents/rules/sync-content-generation.en.md +8 -0
  237. package/templates/.agents/rules/sync-content-generation.zh-CN.md +8 -0
  238. package/templates/.agents/rules/task-management.en.md +1 -1
  239. package/templates/.agents/rules/task-management.zh-CN.md +1 -1
  240. package/templates/.agents/rules/task-short-id.en.md +1 -4
  241. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  242. package/templates/.agents/scripts/security-alerts.github.sh +151 -0
  243. package/templates/.agents/scripts/security-alerts.sh +31 -0
  244. package/templates/.agents/skills/analyze-task/SKILL.en.md +14 -3
  245. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +11 -3
  246. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  247. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  248. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  249. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  250. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  251. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  252. package/templates/.agents/skills/code-task/SKILL.en.md +32 -10
  253. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +35 -13
  254. package/templates/.agents/skills/code-task/config/verify.en.json +1 -0
  255. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +1 -0
  256. package/templates/.agents/skills/commit/SKILL.en.md +3 -3
  257. package/templates/.agents/skills/commit/SKILL.zh-CN.md +3 -3
  258. package/templates/.agents/skills/commit/config/verify.json +1 -1
  259. package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +3 -3
  260. package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +3 -3
  261. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  262. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  263. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +4 -4
  264. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +4 -4
  265. package/templates/.agents/skills/commit/reference/task-status-update.en.md +2 -2
  266. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +2 -2
  267. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +7 -4
  268. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +7 -4
  269. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  270. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  271. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +5 -4
  272. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +5 -4
  273. package/templates/.agents/skills/complete-task/SKILL.en.md +31 -13
  274. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +30 -13
  275. package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +2 -2
  276. package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +2 -2
  277. package/templates/.agents/skills/create-pr/SKILL.en.md +11 -10
  278. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +11 -11
  279. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  280. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  281. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  282. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  283. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  284. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  285. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  286. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  287. package/templates/.agents/skills/create-task/SKILL.en.md +1 -0
  288. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +1 -0
  289. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  290. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  291. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  292. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  293. package/templates/.agents/skills/init-labels/SKILL.en.md +9 -10
  294. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +9 -10
  295. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +57 -1
  296. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +27 -1
  297. package/templates/.agents/skills/init-milestones/SKILL.en.md +3 -5
  298. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +3 -5
  299. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -3
  300. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +11 -3
  301. package/templates/.agents/skills/review-analysis/SKILL.en.md +6 -5
  302. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +6 -5
  303. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +18 -0
  304. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +18 -0
  305. package/templates/.agents/skills/review-code/SKILL.en.md +10 -9
  306. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +10 -9
  307. package/templates/.agents/skills/review-code/reference/output-templates.en.md +19 -1
  308. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +19 -1
  309. package/templates/.agents/skills/review-code/reference/report-template.en.md +4 -2
  310. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +4 -2
  311. package/templates/.agents/skills/review-plan/SKILL.en.md +6 -5
  312. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +6 -5
  313. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +18 -0
  314. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +18 -0
  315. package/templates/.agents/skills/review-pr/SKILL.en.md +1 -0
  316. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +1 -0
  317. package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +2 -2
  318. package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +2 -2
  319. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -2
  320. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -2
  321. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  322. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  323. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +4 -0
  324. package/templates/.agents/skills/watch-pr/SKILL.en.md +6 -6
  325. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +6 -6
  326. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  327. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  328. package/templates/.agents/templates/task.en.md +23 -2
  329. package/templates/.agents/templates/task.zh-CN.md +23 -2
  330. package/templates/.agents/workflows/bug-fix.en.yaml +9 -8
  331. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +9 -8
  332. package/templates/.agents/workflows/feature-development.en.yaml +9 -8
  333. package/templates/.agents/workflows/feature-development.zh-CN.yaml +9 -8
  334. package/templates/.agents/workflows/refactoring.en.yaml +9 -8
  335. package/templates/.agents/workflows/refactoring.zh-CN.yaml +9 -8
  336. package/templates/.github/workflows/pr-label.yml +7 -26
  337. package/templates/.agents/rules/create-issue.github.en.md +0 -14
  338. package/templates/.agents/rules/create-issue.github.zh-CN.md +0 -27
  339. package/templates/.agents/rules/issue-pr-commands.github.en.md +0 -34
  340. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +0 -49
  341. package/templates/.agents/rules/issue-sync.github.en.md +0 -40
  342. package/templates/.agents/rules/issue-sync.github.zh-CN.md +0 -76
  343. package/templates/.agents/rules/label-milestone-setup.github.en.md +0 -60
  344. package/templates/.agents/rules/label-milestone-setup.github.zh-CN.md +0 -60
  345. package/templates/.agents/rules/milestone-inference.github.en.md +0 -15
  346. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +0 -27
  347. package/templates/.agents/rules/pr-checks-commands.github.en.md +0 -18
  348. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +0 -34
  349. package/templates/.agents/rules/pr-sync.github.en.md +0 -43
  350. package/templates/.agents/rules/pr-sync.github.zh-CN.md +0 -69
  351. package/templates/.agents/rules/release-commands.github.en.md +0 -44
  352. package/templates/.agents/rules/release-commands.github.zh-CN.md +0 -44
  353. package/templates/.agents/rules/security-alerts.github.en.md +0 -43
  354. package/templates/.agents/rules/security-alerts.github.zh-CN.md +0 -43
  355. /package/templates/.agents/rules/{issue-fields.github.en.md → issue-fields.en.md} +0 -0
  356. /package/templates/.agents/rules/{issue-fields.github.zh-CN.md → issue-fields.zh-CN.md} +0 -0
@@ -0,0 +1,39 @@
1
+ import { reconcileTaskInvalidation } from '../task/invalidation-command.ts';
2
+ import { resolveTaskRef } from '../task/resolve-ref.ts';
3
+ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
4
+
5
+ const USAGE = 'Usage: agent-infra-internal task-invalidation <task-ref> reconcile [--max-targets <n>] [--dry-run]\n';
6
+
7
+ function taskInvalidation(args: string[] = []): void {
8
+ if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
9
+ const taskRef = args[0];
10
+ if (!taskRef || args[1] !== 'reconcile') {
11
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'INVALIDATION_PAYLOAD_INVALID', message: 'task ref and reconcile are required' } })}\n`);
12
+ process.stderr.write(USAGE);
13
+ process.exitCode = 1;
14
+ return;
15
+ }
16
+ let maxTargets: number | undefined;
17
+ let dryRun = false;
18
+ for (let index = 2; index < args.length; index += 1) {
19
+ const flag = args[index]!;
20
+ if (flag === '--dry-run') { if (dryRun) { process.exitCode = 1; return; } dryRun = true; continue; }
21
+ if (flag !== '--max-targets') { process.exitCode = 1; return; }
22
+ const value = Number(args[++index]);
23
+ if (!Number.isInteger(value) || value < 1 || maxTargets !== undefined) { process.exitCode = 1; return; }
24
+ maxTargets = value;
25
+ }
26
+ const resolved = resolveTaskRef(taskRef);
27
+ if (!resolved.ok) { process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: resolved.code, message: resolved.message } })}\n`); process.exitCode = 1; return; }
28
+ try {
29
+ const result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-invalidation.reconcile', () => reconcileTaskInvalidation(taskRef, { ...(maxTargets === undefined ? {} : { maxTargets }), dryRun }));
30
+ process.stdout.write(`${JSON.stringify(result)}\n`);
31
+ if (result.status === 'failed') process.exitCode = 1;
32
+ } catch (error) {
33
+ if (!(error instanceof TaskExecutionLockError)) throw error;
34
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: error.code, message: error.message } })}\n`);
35
+ process.exitCode = 1;
36
+ }
37
+ }
38
+
39
+ export { taskInvalidation };
@@ -7,12 +7,14 @@ import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, isReviewSt
7
7
  import { resolveTaskRef } from '../task/resolve-ref.ts';
8
8
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
9
9
 
10
- const USAGE = `Usage: agent-infra-internal task-ledger <task-ref> <intent> [intent flags] [--dry-run]\n\nIntents: finding-upsert, finding-respond, finding-review, decision-next-id, decision-upsert, stage-status\n`;
10
+ const USAGE = `Usage: agent-infra-internal task-ledger <task-ref> <intent> [intent flags] [--dry-run]\n\nIntents: finding-upsert, finding-respond, finding-review, decision-next-id, decision-upsert, rework-intent-upsert, stage-status\n`;
11
11
  const FLAGS: Record<string, string> = {
12
12
  '--stage': 'stage', '--review-artifact': 'reviewArtifact', '--ordinal': 'ordinal',
13
13
  '--severity': 'severity', '--evidence': 'evidence', '--id': 'id', '--round': 'round',
14
- '--status': 'status', '--artifact': 'artifact', '--needs-implementation': 'needsImplementation'
15
- , '--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
14
+ '--status': 'status', '--artifact': 'artifact', '--needs-implementation': 'needsImplementation',
15
+ '--intent-id': 'intentId', '--finding-id': 'findingId', '--source-artifact': 'sourceArtifact',
16
+ '--source-sha256': 'sourceSha256', '--target': 'target',
17
+ '--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
16
18
  };
17
19
  const NUMERIC = new Set(['ordinal', 'round']);
18
20
  const BOOLEAN = new Set(['needsImplementation']);
@@ -23,11 +25,11 @@ function usageFailure(message: string): void {
23
25
  process.exitCode = 1;
24
26
  }
25
27
 
26
- function taskLedger(args: string[] = []): void {
28
+ async function taskLedger(args: string[] = []): Promise<void> {
27
29
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
28
30
  const [taskRef, kind] = args;
29
31
  if (!taskRef || !kind) { usageFailure('task ref and intent are required'); return; }
30
- if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'stage-status'].includes(kind)) {
32
+ if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'rework-intent-upsert', 'stage-status'].includes(kind)) {
31
33
  usageFailure(`unknown ledger intent '${kind}'`); return;
32
34
  }
33
35
  const values: Record<string, unknown> = { kind, taskRef };
@@ -55,13 +57,14 @@ function taskLedger(args: string[] = []): void {
55
57
  'finding-review': ['id', 'status', 'evidence'],
56
58
  'decision-next-id': [],
57
59
  'decision-upsert': ['id', 'stage', 'artifact'],
60
+ 'rework-intent-upsert': ['intentId', 'findingId', 'sourceArtifact', 'sourceSha256', 'target'],
58
61
  'stage-status': ['stage']
59
62
  };
60
63
  const optional: Record<string, string[]> = {
61
64
  'finding-review': ['needsImplementation'],
62
65
  'decision-upsert': ['needsImplementation']
63
66
  };
64
- const overrideFields = kind === 'stage-status' || kind === 'decision-next-id'
67
+ const overrideFields = kind === 'stage-status' || kind === 'decision-next-id' || kind === 'rework-intent-upsert'
65
68
  ? []
66
69
  : ['overrideTicket', 'overrideTarget', 'overrideScope'];
67
70
  const allowed = new Set(['kind', 'taskRef', 'dryRun', ...required[kind]!, ...(optional[kind] ?? []), ...overrideFields]);
@@ -106,11 +109,11 @@ function taskLedger(args: string[] = []): void {
106
109
  let result;
107
110
  let humanOverride: unknown = null;
108
111
  try {
109
- result = withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, () => {
112
+ result = await withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, async () => {
110
113
  let current = applyLedgerIntent(values as LedgerIntent);
111
114
  if (current.status !== 'failed' || !values.overrideTicket) return current;
112
115
  if (!values.overrideTarget || !values.overrideScope) { usageFailure('override ticket requires target and scope'); return current; }
113
- const consumed = consumeHumanOverride({
116
+ const consumed = await consumeHumanOverride({
114
117
  taskRef,
115
118
  ticketId: String(values.overrideTicket),
116
119
  failureId: failureId('ledger-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
@@ -21,7 +21,7 @@ function parseFailure(error: unknown): string {
21
21
  return message.replace(/^TASK_CONTROL_OPERATION_INVALID: /u, '');
22
22
  }
23
23
 
24
- function taskLifecycle(args: string[] = []): void {
24
+ async function taskLifecycle(args: string[] = []): Promise<void> {
25
25
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
26
26
 
27
27
  let operation;
@@ -56,7 +56,7 @@ function taskLifecycle(args: string[] = []): void {
56
56
  repoRoot = resolved.repoRoot;
57
57
  }
58
58
 
59
- const result = dispatchTaskControlOperation(
59
+ const result = await dispatchTaskControlOperation(
60
60
  createDirectHostExecutionContext({ repoRoot }),
61
61
  operation
62
62
  ) as TaskLifecycleResult & { humanOverride?: unknown };
@@ -37,7 +37,7 @@ function usageFailure(message: string): void {
37
37
  process.exitCode = 1;
38
38
  }
39
39
 
40
- function taskOverride(args: string[] = []): void {
40
+ async function taskOverride(args: string[] = []): Promise<void> {
41
41
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
42
42
  const [taskRef, operation] = args;
43
43
  if (!taskRef || !operation || !['diagnose', 'issue', 'consume'].includes(operation)) {
@@ -76,17 +76,17 @@ function taskOverride(args: string[] = []): void {
76
76
  let result;
77
77
  try {
78
78
  if (operation === 'diagnose') {
79
- result = diagnoseHumanOverrideForTask(
79
+ result = await diagnoseHumanOverrideForTask(
80
80
  taskRef,
81
81
  values.failureId ? String(values.failureId) : undefined,
82
82
  values.target ? String(values.target) : undefined
83
83
  );
84
84
  } else if (operation === 'issue') {
85
- result = withTaskExecutionLock(
85
+ result = await withTaskExecutionLock(
86
86
  resolved.repoRoot,
87
87
  resolved.taskId,
88
88
  'task-override.issue',
89
- () => issueHumanOverride({
89
+ async () => issueHumanOverride({
90
90
  taskRef,
91
91
  failureId: String(values.failureId),
92
92
  target: String(values.target),
@@ -103,11 +103,11 @@ function taskOverride(args: string[] = []): void {
103
103
  } satisfies HumanOverrideRequest)
104
104
  );
105
105
  } else {
106
- result = withTaskExecutionLock(
106
+ result = await withTaskExecutionLock(
107
107
  resolved.repoRoot,
108
108
  resolved.taskId,
109
109
  'task-override.consume',
110
- () => consumeHumanOverride({
110
+ async () => consumeHumanOverride({
111
111
  taskRef,
112
112
  ticketId: String(values.ticketId),
113
113
  failureId: String(values.failureId),
@@ -16,7 +16,7 @@ function failUsage(message: string): void {
16
16
  process.exitCode = 2;
17
17
  }
18
18
 
19
- function taskReview(args: string[] = []): void {
19
+ async function taskReview(args: string[] = []): Promise<void> {
20
20
  if (args[0] === '--help' || args[0] === '-h') {
21
21
  process.stdout.write(USAGE);
22
22
  return;
@@ -78,11 +78,11 @@ function taskReview(args: string[] = []): void {
78
78
  let result;
79
79
  let humanOverride: unknown = null;
80
80
  try {
81
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', () => {
81
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', async () => {
82
82
  let current = finalizeReviewSummary({ taskRef: args[0]!, stage, artifact, orchestrated, dryRun }, { lockAlreadyHeld: true });
83
83
  if (current.status !== 'failed' || !overrideTicket) return current;
84
84
  if (!overrideTarget || !overrideScope) { failUsage('override ticket requires target and scope'); return current; }
85
- const consumed = consumeHumanOverride({
85
+ const consumed = await consumeHumanOverride({
86
86
  taskRef: args[0]!, ticketId: overrideTicket,
87
87
  failureId: failureId('review-finalization', current.error?.code ?? 'TASK_STATE_MISMATCH'),
88
88
  target: overrideTarget, scope: overrideScope
@@ -11,7 +11,7 @@ function fail(message: string): void {
11
11
  process.exitCode = 1;
12
12
  }
13
13
 
14
- function taskVerify(args: string[] = []): void {
14
+ async function taskVerify(args: string[] = []): Promise<void> {
15
15
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
16
16
  if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')) { fail('task ref and verification event are required'); return; }
17
17
  const taskRef = args[0];
@@ -41,8 +41,8 @@ function taskVerify(args: string[] = []): void {
41
41
  let result;
42
42
  let humanOverride: unknown = null;
43
43
  try {
44
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, () => {
45
- let current = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
44
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, async () => {
45
+ let current = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
46
46
  if (current.status === 'pass' || !overrideTicket) return current;
47
47
  if (!overrideTarget || !overrideScope) { fail('override ticket requires target and scope'); return current; }
48
48
  const failureProducer = current.status === 'blocked' || current.status === 'fail'
@@ -53,13 +53,13 @@ function taskVerify(args: string[] = []): void {
53
53
  : current.status === 'fail'
54
54
  ? 'CHECK_FAILED'
55
55
  : current.error?.code ?? 'VERIFY_TASK_STATE_MISMATCH';
56
- const consumed = consumeHumanOverride({
56
+ const consumed = await consumeHumanOverride({
57
57
  taskRef, ticketId: overrideTicket,
58
58
  failureId: failureId(failureProducer, failureCode),
59
59
  target: overrideTarget, scope: overrideScope
60
60
  }, {
61
- effectExecutor: (capability) => {
62
- const retried = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
61
+ effectExecutor: async (capability) => {
62
+ const retried = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
63
63
  current = retried;
64
64
  return retried.status !== 'pass'
65
65
  ? { code: 'OVERRIDE_EFFECT_FAILED', message: `${retried.error?.code ?? 'VERIFY_FAILED'}: ${retried.error?.message ?? 'manual verification effect failed'}` }
@@ -17,7 +17,7 @@ function usageFailure(message: string): void {
17
17
  process.exitCode = 1;
18
18
  }
19
19
 
20
- function taskWarning(args: string[] = []): void {
20
+ async function taskWarning(args: string[] = []): Promise<void> {
21
21
  if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
22
22
  const [taskRef, kind] = args;
23
23
  if (!taskRef || !kind || !['add', 'set-status', 'list'].includes(kind)) { usageFailure('task ref and a valid intent are required'); return; }
@@ -54,11 +54,11 @@ function taskWarning(args: string[] = []): void {
54
54
  let result;
55
55
  let humanOverride: unknown = null;
56
56
  try {
57
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, () => {
57
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, async () => {
58
58
  let current = applyWorkflowWarningIntent(values as WorkflowWarningIntent);
59
59
  if (current.status !== 'failed' || !values.overrideTicket) return current;
60
60
  if (!values.overrideTarget || !values.overrideScope) { usageFailure('override ticket requires target and scope'); return current; }
61
- const consumed = consumeHumanOverride({
61
+ const consumed = await consumeHumanOverride({
62
62
  taskRef, ticketId: String(values.overrideTicket),
63
63
  failureId: failureId('workflow-warning', current.error?.code ?? 'TASK_STATE_MISMATCH'),
64
64
  target: String(values.overrideTarget), scope: String(values.overrideScope)
@@ -1,4 +1,5 @@
1
1
  import type { PlatformError, PlatformResult } from './types.ts';
2
+ import type { ResourceIdentity } from './resource-identity.ts';
2
3
 
3
4
  type PlatformAdapterContext = {
4
5
  cwd: string;
@@ -28,6 +29,7 @@ type PlatformChangeRequestSnapshot = {
28
29
  assignees: string[];
29
30
  milestone: string | null;
30
31
  mergeability?: PlatformMergeability;
32
+ identity?: ResourceIdentity;
31
33
  };
32
34
 
33
35
  type PlatformCheckSnapshot = {
@@ -105,8 +107,7 @@ function registerPlatformCapabilities(
105
107
  'inspectChangeRequest' | 'inspectIssueClosingChangeRequests' | 'inspectRequiredChecks' | 'resolveChangeRequestGitEvidence'
106
108
  >
107
109
  ): void {
108
- const adapter = adapters.get(type);
109
- if (!adapter) throw new Error(`Platform adapter '${type}' must be registered before its capabilities`);
110
+ const adapter = adapters.get(type) ?? { type } as PlatformAdapter;
110
111
  adapters.set(type, { ...adapter, ...capabilities });
111
112
  }
112
113
 
@@ -3,7 +3,13 @@ import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { execFileSync, spawnSync } from "node:child_process";
5
5
 
6
- import { resolvePlatformChangeRequestGitEvidence } from "./adapters.ts";
6
+ import { resolvePlatformProviderContext } from './context.ts';
7
+ import {
8
+ providerError,
9
+ providerOperationContext,
10
+ unsupportedProviderOperation
11
+ } from './provider-bridge.ts';
12
+ import { isResourceIdentity } from './resource-identity.ts';
7
13
  import { resolveReviewedHeadRelation } from "./merged-pr-equivalence.ts";
8
14
  import type { ReviewedHeadRelation } from "./merged-pr-equivalence.ts";
9
15
  import type { PullRequestSnapshot } from "./pull-requests.ts";
@@ -53,25 +59,46 @@ function validMergeIdentity(lastReviewedCommit: string, pullRequest: PullRequest
53
59
  return null;
54
60
  }
55
61
 
56
- function resolveMaterializedReviewedHeadRelation(input: {
62
+ async function resolveMaterializedReviewedHeadRelation(input: {
57
63
  cwd: string;
58
64
  platformType: string | null;
59
65
  lastReviewedCommit: string;
60
66
  pullRequest: PullRequestSnapshot;
61
- }): ReviewedHeadRelation {
67
+ }): Promise<ReviewedHeadRelation> {
62
68
  const identityFailure = validMergeIdentity(input.lastReviewedCommit, input.pullRequest);
63
69
  if (identityFailure) return identityFailure;
64
70
 
65
- const source = resolvePlatformChangeRequestGitEvidence(input.platformType, {
71
+ const loaded = await resolvePlatformProviderContext({
66
72
  cwd: input.cwd,
67
- repository: input.pullRequest.repository,
68
- number: input.pullRequest.number,
69
- pullRequest: input.pullRequest
73
+ platformType: input.platformType || undefined
70
74
  });
75
+ if (!loaded.ok) {
76
+ return blocked(
77
+ loaded.context.error?.code || 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE',
78
+ loaded.context.error?.message || 'Unable to resolve the configured platform provider'
79
+ );
80
+ }
81
+ const target = isResourceIdentity(input.pullRequest.identity)
82
+ ? input.pullRequest.identity
83
+ : { kind: 'number' as const, value: input.pullRequest.number };
84
+ const operation = loaded.value.provider.changeRequests?.resolveGitEvidence
85
+ ? await loaded.value.provider.changeRequests.resolveGitEvidence({
86
+ context: providerOperationContext(loaded.value),
87
+ target,
88
+ expected: {
89
+ baseSha: input.pullRequest.base.sha,
90
+ headSha: input.pullRequest.head.sha,
91
+ targetBranch: input.pullRequest.base.ref
92
+ }
93
+ })
94
+ : unsupportedProviderOperation(loaded.value.provider, 'changeRequests.resolveGitEvidence');
95
+ const source = operation.ok
96
+ ? operation
97
+ : { ok: false as const, error: providerError(operation.error, 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE') };
71
98
  if (!source.ok || !source.value) {
72
99
  return blocked(
73
- source.error?.code || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE",
74
- source.error?.message || "Unable to resolve authoritative PR Git evidence"
100
+ ('error' in source && source.error?.code) || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE",
101
+ ('error' in source && source.error?.message) || "Unable to resolve authoritative PR Git evidence"
75
102
  );
76
103
  }
77
104
  if (
@@ -9,11 +9,12 @@ import { getOpenWorkflowWarnings } from '../task/workflow-warnings.ts';
9
9
  import { applyWorkflowWarningIntent } from '../task/workflow-warning-intents.ts';
10
10
  import { captureTaskWriteMetadata } from '../task/write.ts';
11
11
  import { syncPlatformComment } from './issue-comments.ts';
12
- import type { GitHubClient } from './github-client.ts';
12
+ import type { PlatformClient } from './context.ts';
13
13
  import { platformResult } from './types.ts';
14
14
  import type { PlatformOperation, PlatformResult } from './types.ts';
15
+ import { taskIssueIdentity } from './task-identities.ts';
15
16
 
16
- type CompletionBackfillOptions = { agent: string; cwd?: string; client?: GitHubClient };
17
+ type CompletionBackfillOptions = { agent: string; cwd?: string; client?: PlatformClient };
17
18
  type CompletionBackfillResult = PlatformResult & {
18
19
  artifacts: Array<{ artifact: string; status: PlatformResult['status'] }>;
19
20
  warnings: Array<{ id: string; status: string }>;
@@ -42,10 +43,10 @@ function excludedPrReview(taskDir: string, message: string): string | null {
42
43
  }
43
44
  }
44
45
 
45
- function backfillCompletionComments(
46
+ async function backfillCompletionComments(
46
47
  taskRef: string,
47
48
  options: CompletionBackfillOptions
48
- ): CompletionBackfillResult {
49
+ ): Promise<CompletionBackfillResult> {
49
50
  const resolved = resolveTaskRef(taskRef, options.cwd ? { repoRoot: options.cwd } : {});
50
51
  if (!resolved.ok) return result(platformResult('failed', {
51
52
  error: { code: resolved.code, message: resolved.message, retryable: false }
@@ -59,16 +60,16 @@ function backfillCompletionComments(
59
60
  }
60
61
  }), [], []);
61
62
  const initialContent = fs.readFileSync(resolved.taskMdPath, 'utf8');
62
- const issueNumber = Number(parseTaskFrontmatter(initialContent).issue_number);
63
- if (!Number.isInteger(issueNumber) || issueNumber <= 0) return result(platformResult('no-op', {
64
- error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid issue_number', retryable: false }
63
+ const issueIdentity = taskIssueIdentity(parseTaskFrontmatter(initialContent));
64
+ if (!issueIdentity) return result(platformResult('no-op', {
65
+ error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid platform issue identity', retryable: false }
65
66
  }), [], []);
66
67
 
67
68
  const artifacts: CompletionBackfillResult['artifacts'] = [];
68
69
  const operations: PlatformOperation[] = [];
69
70
  let latest = platformResult('no-op', { error: null });
70
71
  for (const artifact of inventory.artifacts) {
71
- latest = syncPlatformComment(resolved.taskId, {
72
+ latest = await syncPlatformComment(resolved.taskId, {
72
73
  kind: 'artifact',
73
74
  artifact: artifact.name,
74
75
  agent: options.agent,