@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
@@ -14,7 +14,7 @@ function output(result) {
14
14
  process.stdout.write(`${JSON.stringify(result)}\n`);
15
15
  process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
16
16
  }
17
- function taskCreate(args) {
17
+ async function taskCreate(args) {
18
18
  const inputIndex = args.indexOf('--input');
19
19
  const input = inputIndex >= 0 ? args[inputIndex + 1] : undefined;
20
20
  if (!input || args.length !== 2 || inputIndex !== 0) {
@@ -40,7 +40,7 @@ function taskCreate(args) {
40
40
  process.exitCode = response.exitCode;
41
41
  return;
42
42
  }
43
- output(createTask(candidate, { repoRoot: process.cwd() }));
43
+ output(await createTask(candidate, { repoRoot: process.cwd() }));
44
44
  }
45
45
  catch (error) {
46
46
  if (error instanceof SandboxControlClientError) {
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+ import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
3
+ import { deliverTaskBranch } from '../task/delivery.js';
4
+ const USAGE = `Usage: agent-infra-internal task-delivery <task-ref> deliver --agent <agent> [--remote <name>] [--base <branch>] [--dry-run] [--cwd <path>]\n`;
5
+ function taskDelivery(args = []) {
6
+ const taskRef = args[0];
7
+ const operation = args[1];
8
+ if (!taskRef || operation !== 'deliver') {
9
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'DELIVERY_PAYLOAD_INVALID', message: 'task ref and deliver operation are required' } })}\n`);
10
+ process.stderr.write(USAGE);
11
+ process.exitCode = 1;
12
+ return;
13
+ }
14
+ let agent = '';
15
+ let remote;
16
+ let baseRef;
17
+ let cwd = process.cwd();
18
+ let dryRun = false;
19
+ for (let index = 2; index < args.length; index += 1) {
20
+ const flag = args[index];
21
+ if (flag === '--dry-run') {
22
+ dryRun = true;
23
+ continue;
24
+ }
25
+ const value = args[++index];
26
+ if (value === undefined || value.startsWith('--')) {
27
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'DELIVERY_PAYLOAD_INVALID', message: `${flag} requires a value` } })}\n`);
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ if (flag === '--agent')
32
+ agent = value;
33
+ else if (flag === '--remote')
34
+ remote = value;
35
+ else if (flag === '--base')
36
+ baseRef = value;
37
+ else if (flag === '--cwd')
38
+ cwd = path.resolve(value);
39
+ else {
40
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'DELIVERY_PAYLOAD_INVALID', message: `unknown option '${flag}'` } })}\n`);
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ }
45
+ const normalized = normalizeAgentToken(agent);
46
+ if (!normalized) {
47
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'DELIVERY_PAYLOAD_INVALID', message: `invalid --agent '${agent}': ${AGENT_USAGE_HINT}` } })}\n`);
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ const result = deliverTaskBranch(taskRef, { repoRoot: cwd, agent: normalized, remote, baseRef, dryRun });
52
+ process.stdout.write(`${JSON.stringify(result)}\n`);
53
+ if (result.status === 'failed')
54
+ process.exitCode = 1;
55
+ if (result.status === 'blocked')
56
+ process.exitCode = 2;
57
+ }
58
+ export { taskDelivery };
59
+ //# sourceMappingURL=task-delivery.js.map
@@ -10,6 +10,9 @@ Events: ${eventCatalog.join(', ')}
10
10
  `;
11
11
  const FLAGS = {
12
12
  '--agent': 'agent', '--round': 'round', '--question': 'question', '--artifact': 'artifact',
13
+ '--artifact-sha256': 'artifactSha256', '--semantic-digest': 'semanticDigest',
14
+ '--initiator': 'initiator', '--request-id': 'requestId', '--reason-code': 'reasonCode',
15
+ '--source-finding': 'sourceFinding', '--source-artifact': 'sourceArtifact', '--source-sha256': 'sourceSha256',
13
16
  '--fix-for': 'fixFor', '--implementation-input': 'implementationInput',
14
17
  '--verdict': 'verdict', '--blockers': 'blockers', '--major': 'major',
15
18
  '--minor': 'minor', '--manual-validation': 'manualValidation', '--files-modified': 'filesModified',
@@ -22,7 +25,7 @@ function usageFailure(message) {
22
25
  process.stderr.write(USAGE);
23
26
  process.exitCode = 1;
24
27
  }
25
- function taskEvent(args = []) {
28
+ async function taskEvent(args = []) {
26
29
  if (args[0] === '--help' || args[0] === '-h') {
27
30
  process.stdout.write(USAGE);
28
31
  return;
@@ -95,7 +98,7 @@ function taskEvent(args = []) {
95
98
  let result;
96
99
  let humanOverride = null;
97
100
  try {
98
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-event.${request.event}`, () => {
101
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-event.${request.event}`, async () => {
99
102
  let current = applyTaskEvent(request, { lockAlreadyHeld: true });
100
103
  const values = request;
101
104
  if (current.status !== 'failed' || !values.overrideTicket)
@@ -103,7 +106,7 @@ function taskEvent(args = []) {
103
106
  if (!values.overrideTarget || !values.overrideScope) {
104
107
  return { ...current, humanOverride: { status: 'failed', error: { code: 'OVERRIDE_PAYLOAD_INVALID', message: 'override ticket requires target and scope' } } };
105
108
  }
106
- const consumed = consumeHumanOverride({
109
+ const consumed = await consumeHumanOverride({
107
110
  taskRef: request.taskRef,
108
111
  ticketId: String(values.overrideTicket),
109
112
  failureId: failureId('task-event', current.error?.code ?? 'EVENT_TRANSITION_INVALID'),
@@ -18,7 +18,7 @@ function parseFailure(error) {
18
18
  const message = error instanceof Error ? error.message : String(error);
19
19
  return message.replace(/^TASK_CONTROL_OPERATION_INVALID: /u, '');
20
20
  }
21
- function taskFinalization(args = []) {
21
+ async function taskFinalization(args = []) {
22
22
  if (args[0] === '--help' || args[0] === '-h') {
23
23
  process.stdout.write(USAGE);
24
24
  return;
@@ -56,7 +56,7 @@ function taskFinalization(args = []) {
56
56
  ...operation,
57
57
  request: { ...operation.request, taskRef: resolved.taskId }
58
58
  };
59
- const result = dispatchTaskControlOperation(createDirectHostExecutionContext({ repoRoot }), boundOperation);
59
+ const result = await dispatchTaskControlOperation(createDirectHostExecutionContext({ repoRoot }), boundOperation);
60
60
  process.stdout.write(envelope(result.status, result.changed, true, result, result.error));
61
61
  process.exitCode = exitCode(result.status);
62
62
  }
@@ -0,0 +1,60 @@
1
+ import { reconcileTaskInvalidation } from '../task/invalidation-command.js';
2
+ import { resolveTaskRef } from '../task/resolve-ref.js';
3
+ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
4
+ const USAGE = 'Usage: agent-infra-internal task-invalidation <task-ref> reconcile [--max-targets <n>] [--dry-run]\n';
5
+ function taskInvalidation(args = []) {
6
+ if (args[0] === '--help' || args[0] === '-h') {
7
+ process.stdout.write(USAGE);
8
+ return;
9
+ }
10
+ const taskRef = args[0];
11
+ if (!taskRef || args[1] !== 'reconcile') {
12
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'INVALIDATION_PAYLOAD_INVALID', message: 'task ref and reconcile are required' } })}\n`);
13
+ process.stderr.write(USAGE);
14
+ process.exitCode = 1;
15
+ return;
16
+ }
17
+ let maxTargets;
18
+ let dryRun = false;
19
+ for (let index = 2; index < args.length; index += 1) {
20
+ const flag = args[index];
21
+ if (flag === '--dry-run') {
22
+ if (dryRun) {
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ dryRun = true;
27
+ continue;
28
+ }
29
+ if (flag !== '--max-targets') {
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const value = Number(args[++index]);
34
+ if (!Number.isInteger(value) || value < 1 || maxTargets !== undefined) {
35
+ process.exitCode = 1;
36
+ return;
37
+ }
38
+ maxTargets = value;
39
+ }
40
+ const resolved = resolveTaskRef(taskRef);
41
+ if (!resolved.ok) {
42
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: resolved.code, message: resolved.message } })}\n`);
43
+ process.exitCode = 1;
44
+ return;
45
+ }
46
+ try {
47
+ const result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-invalidation.reconcile', () => reconcileTaskInvalidation(taskRef, { ...(maxTargets === undefined ? {} : { maxTargets }), dryRun }));
48
+ process.stdout.write(`${JSON.stringify(result)}\n`);
49
+ if (result.status === 'failed')
50
+ process.exitCode = 1;
51
+ }
52
+ catch (error) {
53
+ if (!(error instanceof TaskExecutionLockError))
54
+ throw error;
55
+ process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: error.code, message: error.message } })}\n`);
56
+ process.exitCode = 1;
57
+ }
58
+ }
59
+ export { taskInvalidation };
60
+ //# sourceMappingURL=task-invalidation.js.map
@@ -4,11 +4,13 @@ import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task
4
4
  import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, isReviewStage, parseLedgerDocument, summarizeLedgerStage, validateLedgerRows } from '../task/ledger.js';
5
5
  import { resolveTaskRef } from '../task/resolve-ref.js';
6
6
  import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
7
- 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`;
7
+ 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`;
8
8
  const FLAGS = {
9
9
  '--stage': 'stage', '--review-artifact': 'reviewArtifact', '--ordinal': 'ordinal',
10
10
  '--severity': 'severity', '--evidence': 'evidence', '--id': 'id', '--round': 'round',
11
11
  '--status': 'status', '--artifact': 'artifact', '--needs-implementation': 'needsImplementation',
12
+ '--intent-id': 'intentId', '--finding-id': 'findingId', '--source-artifact': 'sourceArtifact',
13
+ '--source-sha256': 'sourceSha256', '--target': 'target',
12
14
  '--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
13
15
  };
14
16
  const NUMERIC = new Set(['ordinal', 'round']);
@@ -18,7 +20,7 @@ function usageFailure(message) {
18
20
  process.stderr.write(USAGE);
19
21
  process.exitCode = 1;
20
22
  }
21
- function taskLedger(args = []) {
23
+ async function taskLedger(args = []) {
22
24
  if (args[0] === '--help' || args[0] === '-h') {
23
25
  process.stdout.write(USAGE);
24
26
  return;
@@ -28,7 +30,7 @@ function taskLedger(args = []) {
28
30
  usageFailure('task ref and intent are required');
29
31
  return;
30
32
  }
31
- if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'stage-status'].includes(kind)) {
33
+ if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'rework-intent-upsert', 'stage-status'].includes(kind)) {
32
34
  usageFailure(`unknown ledger intent '${kind}'`);
33
35
  return;
34
36
  }
@@ -72,13 +74,14 @@ function taskLedger(args = []) {
72
74
  'finding-review': ['id', 'status', 'evidence'],
73
75
  'decision-next-id': [],
74
76
  'decision-upsert': ['id', 'stage', 'artifact'],
77
+ 'rework-intent-upsert': ['intentId', 'findingId', 'sourceArtifact', 'sourceSha256', 'target'],
75
78
  'stage-status': ['stage']
76
79
  };
77
80
  const optional = {
78
81
  'finding-review': ['needsImplementation'],
79
82
  'decision-upsert': ['needsImplementation']
80
83
  };
81
- const overrideFields = kind === 'stage-status' || kind === 'decision-next-id'
84
+ const overrideFields = kind === 'stage-status' || kind === 'decision-next-id' || kind === 'rework-intent-upsert'
82
85
  ? []
83
86
  : ['overrideTicket', 'overrideTarget', 'overrideScope'];
84
87
  const allowed = new Set(['kind', 'taskRef', 'dryRun', ...required[kind], ...(optional[kind] ?? []), ...overrideFields]);
@@ -139,7 +142,7 @@ function taskLedger(args = []) {
139
142
  let result;
140
143
  let humanOverride = null;
141
144
  try {
142
- result = withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, () => {
145
+ result = await withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, async () => {
143
146
  let current = applyLedgerIntent(values);
144
147
  if (current.status !== 'failed' || !values.overrideTicket)
145
148
  return current;
@@ -147,7 +150,7 @@ function taskLedger(args = []) {
147
150
  usageFailure('override ticket requires target and scope');
148
151
  return current;
149
152
  }
150
- const consumed = consumeHumanOverride({
153
+ const consumed = await consumeHumanOverride({
151
154
  taskRef,
152
155
  ticketId: String(values.overrideTicket),
153
156
  failureId: failureId('ledger-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
@@ -11,7 +11,7 @@ function parseFailure(error) {
11
11
  const message = error instanceof Error ? error.message : String(error);
12
12
  return message.replace(/^TASK_CONTROL_OPERATION_INVALID: /u, '');
13
13
  }
14
- function taskLifecycle(args = []) {
14
+ async function taskLifecycle(args = []) {
15
15
  if (args[0] === '--help' || args[0] === '-h') {
16
16
  process.stdout.write(USAGE);
17
17
  return;
@@ -49,7 +49,7 @@ function taskLifecycle(args = []) {
49
49
  }
50
50
  repoRoot = resolved.repoRoot;
51
51
  }
52
- const result = dispatchTaskControlOperation(createDirectHostExecutionContext({ repoRoot }), operation);
52
+ const result = await dispatchTaskControlOperation(createDirectHostExecutionContext({ repoRoot }), operation);
53
53
  process.stdout.write(`${JSON.stringify(result)}\n`);
54
54
  if (result.status === 'failed')
55
55
  process.exitCode = 1;
@@ -28,7 +28,7 @@ function usageFailure(message) {
28
28
  process.stderr.write(USAGE);
29
29
  process.exitCode = 1;
30
30
  }
31
- function taskOverride(args = []) {
31
+ async function taskOverride(args = []) {
32
32
  if (args[0] === '--help' || args[0] === '-h') {
33
33
  process.stdout.write(USAGE);
34
34
  return;
@@ -79,10 +79,10 @@ function taskOverride(args = []) {
79
79
  let result;
80
80
  try {
81
81
  if (operation === 'diagnose') {
82
- result = diagnoseHumanOverrideForTask(taskRef, values.failureId ? String(values.failureId) : undefined, values.target ? String(values.target) : undefined);
82
+ result = await diagnoseHumanOverrideForTask(taskRef, values.failureId ? String(values.failureId) : undefined, values.target ? String(values.target) : undefined);
83
83
  }
84
84
  else if (operation === 'issue') {
85
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.issue', () => issueHumanOverride({
85
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.issue', async () => issueHumanOverride({
86
86
  taskRef,
87
87
  failureId: String(values.failureId),
88
88
  target: String(values.target),
@@ -99,7 +99,7 @@ function taskOverride(args = []) {
99
99
  }));
100
100
  }
101
101
  else {
102
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.consume', () => consumeHumanOverride({
102
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.consume', async () => consumeHumanOverride({
103
103
  taskRef,
104
104
  ticketId: String(values.ticketId),
105
105
  failureId: String(values.failureId),
@@ -13,7 +13,7 @@ function failUsage(message) {
13
13
  process.stderr.write(USAGE);
14
14
  process.exitCode = 2;
15
15
  }
16
- function taskReview(args = []) {
16
+ async function taskReview(args = []) {
17
17
  if (args[0] === '--help' || args[0] === '-h') {
18
18
  process.stdout.write(USAGE);
19
19
  return;
@@ -86,7 +86,7 @@ function taskReview(args = []) {
86
86
  let result;
87
87
  let humanOverride = null;
88
88
  try {
89
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', () => {
89
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', async () => {
90
90
  let current = finalizeReviewSummary({ taskRef: args[0], stage, artifact, orchestrated, dryRun }, { lockAlreadyHeld: true });
91
91
  if (current.status !== 'failed' || !overrideTicket)
92
92
  return current;
@@ -94,7 +94,7 @@ function taskReview(args = []) {
94
94
  failUsage('override ticket requires target and scope');
95
95
  return current;
96
96
  }
97
- const consumed = consumeHumanOverride({
97
+ const consumed = await consumeHumanOverride({
98
98
  taskRef: args[0], ticketId: overrideTicket,
99
99
  failureId: failureId('review-finalization', current.error?.code ?? 'TASK_STATE_MISMATCH'),
100
100
  target: overrideTarget, scope: overrideScope
@@ -8,7 +8,7 @@ function fail(message) {
8
8
  process.stderr.write(USAGE);
9
9
  process.exitCode = 1;
10
10
  }
11
- function taskVerify(args = []) {
11
+ async function taskVerify(args = []) {
12
12
  if (args[0] === '--help' || args[0] === '-h') {
13
13
  process.stdout.write(USAGE);
14
14
  return;
@@ -64,8 +64,8 @@ function taskVerify(args = []) {
64
64
  let result;
65
65
  let humanOverride = null;
66
66
  try {
67
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, () => {
68
- let current = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
67
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, async () => {
68
+ let current = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
69
69
  if (current.status === 'pass' || !overrideTicket)
70
70
  return current;
71
71
  if (!overrideTarget || !overrideScope) {
@@ -80,13 +80,13 @@ function taskVerify(args = []) {
80
80
  : current.status === 'fail'
81
81
  ? 'CHECK_FAILED'
82
82
  : current.error?.code ?? 'VERIFY_TASK_STATE_MISMATCH';
83
- const consumed = consumeHumanOverride({
83
+ const consumed = await consumeHumanOverride({
84
84
  taskRef, ticketId: overrideTicket,
85
85
  failureId: failureId(failureProducer, failureCode),
86
86
  target: overrideTarget, scope: overrideScope
87
87
  }, {
88
- effectExecutor: (capability) => {
89
- const retried = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
88
+ effectExecutor: async (capability) => {
89
+ const retried = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
90
90
  current = retried;
91
91
  return retried.status !== 'pass'
92
92
  ? { code: 'OVERRIDE_EFFECT_FAILED', message: `${retried.error?.code ?? 'VERIFY_FAILED'}: ${retried.error?.message ?? 'manual verification effect failed'}` }
@@ -13,7 +13,7 @@ function usageFailure(message) {
13
13
  process.stderr.write(USAGE);
14
14
  process.exitCode = 1;
15
15
  }
16
- function taskWarning(args = []) {
16
+ async function taskWarning(args = []) {
17
17
  if (args[0] === '--help' || args[0] === '-h') {
18
18
  process.stdout.write(USAGE);
19
19
  return;
@@ -85,7 +85,7 @@ function taskWarning(args = []) {
85
85
  let result;
86
86
  let humanOverride = null;
87
87
  try {
88
- result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, () => {
88
+ result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, async () => {
89
89
  let current = applyWorkflowWarningIntent(values);
90
90
  if (current.status !== 'failed' || !values.overrideTicket)
91
91
  return current;
@@ -93,7 +93,7 @@ function taskWarning(args = []) {
93
93
  usageFailure('override ticket requires target and scope');
94
94
  return current;
95
95
  }
96
- const consumed = consumeHumanOverride({
96
+ const consumed = await consumeHumanOverride({
97
97
  taskRef, ticketId: String(values.overrideTicket),
98
98
  failureId: failureId('workflow-warning', current.error?.code ?? 'TASK_STATE_MISMATCH'),
99
99
  target: String(values.overrideTarget), scope: String(values.overrideScope)
@@ -8,9 +8,7 @@ function getPlatformAdapter(type) {
8
8
  return type ? adapters.get(type) ?? null : null;
9
9
  }
10
10
  function registerPlatformCapabilities(type, capabilities) {
11
- const adapter = adapters.get(type);
12
- if (!adapter)
13
- throw new Error(`Platform adapter '${type}' must be registered before its capabilities`);
11
+ const adapter = adapters.get(type) ?? { type };
14
12
  adapters.set(type, { ...adapter, ...capabilities });
15
13
  }
16
14
  function hasPlatformCapability(type, capability) {
@@ -2,7 +2,9 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { execFileSync, spawnSync } from "node:child_process";
5
- import { resolvePlatformChangeRequestGitEvidence } from "./adapters.js";
5
+ import { resolvePlatformProviderContext } from './context.js';
6
+ import { providerError, providerOperationContext, unsupportedProviderOperation } from './provider-bridge.js';
7
+ import { isResourceIdentity } from './resource-identity.js';
6
8
  import { resolveReviewedHeadRelation } from "./merged-pr-equivalence.js";
7
9
  const SHA_PATTERN = /^[0-9a-f]{40}$/i;
8
10
  const REVIEWED_HEAD_REF = "refs/agent-infra/reviewed-head";
@@ -37,18 +39,36 @@ function validMergeIdentity(lastReviewedCommit, pullRequest) {
37
39
  }
38
40
  return null;
39
41
  }
40
- function resolveMaterializedReviewedHeadRelation(input) {
42
+ async function resolveMaterializedReviewedHeadRelation(input) {
41
43
  const identityFailure = validMergeIdentity(input.lastReviewedCommit, input.pullRequest);
42
44
  if (identityFailure)
43
45
  return identityFailure;
44
- const source = resolvePlatformChangeRequestGitEvidence(input.platformType, {
46
+ const loaded = await resolvePlatformProviderContext({
45
47
  cwd: input.cwd,
46
- repository: input.pullRequest.repository,
47
- number: input.pullRequest.number,
48
- pullRequest: input.pullRequest
48
+ platformType: input.platformType || undefined
49
49
  });
50
+ if (!loaded.ok) {
51
+ return blocked(loaded.context.error?.code || 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE', loaded.context.error?.message || 'Unable to resolve the configured platform provider');
52
+ }
53
+ const target = isResourceIdentity(input.pullRequest.identity)
54
+ ? input.pullRequest.identity
55
+ : { kind: 'number', value: input.pullRequest.number };
56
+ const operation = loaded.value.provider.changeRequests?.resolveGitEvidence
57
+ ? await loaded.value.provider.changeRequests.resolveGitEvidence({
58
+ context: providerOperationContext(loaded.value),
59
+ target,
60
+ expected: {
61
+ baseSha: input.pullRequest.base.sha,
62
+ headSha: input.pullRequest.head.sha,
63
+ targetBranch: input.pullRequest.base.ref
64
+ }
65
+ })
66
+ : unsupportedProviderOperation(loaded.value.provider, 'changeRequests.resolveGitEvidence');
67
+ const source = operation.ok
68
+ ? operation
69
+ : { ok: false, error: providerError(operation.error, 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE') };
50
70
  if (!source.ok || !source.value) {
51
- return blocked(source.error?.code || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE", source.error?.message || "Unable to resolve authoritative PR Git evidence");
71
+ return blocked(('error' in source && source.error?.code) || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE", ('error' in source && source.error?.message) || "Unable to resolve authoritative PR Git evidence");
52
72
  }
53
73
  if (!source.value.remoteUrl.trim() ||
54
74
  source.value.remoteUrl.trimStart().startsWith("-") ||
@@ -9,6 +9,7 @@ import { applyWorkflowWarningIntent } from '../task/workflow-warning-intents.js'
9
9
  import { captureTaskWriteMetadata } from '../task/write.js';
10
10
  import { syncPlatformComment } from './issue-comments.js';
11
11
  import { platformResult } from './types.js';
12
+ import { taskIssueIdentity } from './task-identities.js';
12
13
  function result(base, artifacts, warnings) {
13
14
  return { ...base, artifacts, warnings };
14
15
  }
@@ -29,7 +30,7 @@ function excludedPrReview(taskDir, message) {
29
30
  return null;
30
31
  }
31
32
  }
32
- function backfillCompletionComments(taskRef, options) {
33
+ async function backfillCompletionComments(taskRef, options) {
33
34
  const resolved = resolveTaskRef(taskRef, options.cwd ? { repoRoot: options.cwd } : {});
34
35
  if (!resolved.ok)
35
36
  return result(platformResult('failed', {
@@ -45,16 +46,16 @@ function backfillCompletionComments(taskRef, options) {
45
46
  }
46
47
  }), [], []);
47
48
  const initialContent = fs.readFileSync(resolved.taskMdPath, 'utf8');
48
- const issueNumber = Number(parseTaskFrontmatter(initialContent).issue_number);
49
- if (!Number.isInteger(issueNumber) || issueNumber <= 0)
49
+ const issueIdentity = taskIssueIdentity(parseTaskFrontmatter(initialContent));
50
+ if (!issueIdentity)
50
51
  return result(platformResult('no-op', {
51
- error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid issue_number', retryable: false }
52
+ error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid platform issue identity', retryable: false }
52
53
  }), [], []);
53
54
  const artifacts = [];
54
55
  const operations = [];
55
56
  let latest = platformResult('no-op', { error: null });
56
57
  for (const artifact of inventory.artifacts) {
57
- latest = syncPlatformComment(resolved.taskId, {
58
+ latest = await syncPlatformComment(resolved.taskId, {
58
59
  kind: 'artifact',
59
60
  artifact: artifact.name,
60
61
  agent: options.agent,