@fitlab-ai/agent-infra 0.9.13 → 0.9.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -8,18 +8,17 @@ import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-exec
8
8
  import { readPrDeliveryFact } from '../task/pr-delivery-fact.js';
9
9
  import { resolvePlatformProviderContext } from './context.js';
10
10
  import { normalizeCommentContent } from './issue-comments.js';
11
+ import { CONTROL_MARKER_PATTERN, escapeHtmlText, sanitizeMarkdownDocument, splitDocumentPlaceholder } from './comment-safety.js';
11
12
  import { platformResult } from './types.js';
12
13
  import { providerError, providerOperationContext, providerStatus, providerResourceToken, resourceIdentityNumber, unsupportedProviderOperation } from './provider-bridge.js';
13
- import { buildPrChangeReport, readPrChangeReport, replaceCanonicalReportPlaceholder, runMechanicalChangeReport, taskIntentDigest, validateMechanicalReport, validatePrecheckCandidate, writePrChangeReportAtomic } from './pr-change-report.js';
14
+ import { buildPrChangeReport, CANONICAL_REPORT_PLACEHOLDER, readPrChangeReport, replaceCanonicalReportPlaceholder, runMechanicalChangeReport, taskIntentDigest, validateMechanicalReport, validatePrecheckCandidate, writePrChangeReportAtomic } from './pr-change-report.js';
15
+ import { manualValidationFinalSummaryProjectionMatches } from '../task/manual-validation-receipt.js';
16
+ import { readManualValidationCompletion } from '../task/manual-validation-completion.js';
14
17
  function summaryMarker(taskId) {
15
18
  return `<!-- sync-pr:${taskId}:summary -->`;
16
19
  }
17
20
  function escapeSummaryAuditText(value) {
18
- return value
19
- .replace(/&/g, '&amp;')
20
- .replace(/</g, '&lt;')
21
- .replace(/>/g, '&gt;')
22
- .replace(/\r\n?/g, '\n');
21
+ return escapeHtmlText(value).replace(/\r\n?/g, '\n');
23
22
  }
24
23
  function renderSummaryAuditLine(value) {
25
24
  const safe = escapeSummaryAuditText(value);
@@ -289,6 +288,25 @@ async function summaryContext(taskRef, options = {}) {
289
288
  artifacts: canonicalArtifacts(resolved.taskDir)
290
289
  };
291
290
  }
291
+ async function summaryCommentState(taskRef, options = {}) {
292
+ const context = await summaryContext(taskRef, options);
293
+ if (!context.task.prNumber || !context.pullRequest)
294
+ return { ...context, comment: null };
295
+ const loaded = await resolvePlatformProviderContext({ cwd: options.cwd, client: options.client });
296
+ if (!loaded.ok || !loaded.value.provider.comments?.list)
297
+ return { ...context, comment: null };
298
+ const listed = await loaded.value.provider.comments.list({
299
+ context: providerOperationContext(loaded.value),
300
+ parent: providerResourceToken(loaded.value.provider, 'pull-request', String(context.task.prNumber))
301
+ });
302
+ if (!listed.ok)
303
+ return { ...context, comment: null };
304
+ const matches = listed.value.filter((comment) => comment.body.includes(summaryMarker(context.task.id)));
305
+ return {
306
+ ...context,
307
+ comment: matches.length === 1 ? { id: /^\d+$/u.test(matches[0].id) ? Number(matches[0].id) : matches[0].id, body: matches[0].body } : null
308
+ };
309
+ }
292
310
  async function reportWrite(taskRef, options) {
293
311
  const resolved = resolveTaskRef(taskRef, options.cwd ? { repoRoot: options.cwd } : {});
294
312
  if (!resolved.ok)
@@ -447,7 +465,7 @@ async function syncPullRequestSummary(taskRef, options) {
447
465
  return preserveFailure(context);
448
466
  }
449
467
  try {
450
- return await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, options.agent, async () => {
468
+ const execute = async () => {
451
469
  const { taskContent, boundFact } = readBoundTaskSnapshot(resolved.taskMdPath);
452
470
  if (!boundFact)
453
471
  return {
@@ -466,6 +484,34 @@ async function syncPullRequestSummary(taskRef, options) {
466
484
  const initial = await inspectBoundPullRequest(context, resolved.repoRoot, boundPrNumber, loaded.value);
467
485
  if (!initial.ok)
468
486
  return fail(initial.status, context, initial.error);
487
+ const manual = options.manualValidation;
488
+ const hasFinalManualValidation = /###\s+✅\s+(?:Manual Validation Passed|人工验证已通过)/u.test(options.body);
489
+ if (hasFinalManualValidation && (!manual || manual.phase !== 'final'))
490
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_TRANSACTION_REQUIRED', message: 'final manual-validation summary requires the transaction coordinator', retryable: false }, prNumber);
491
+ if (manual && (manual.phase === 'pending' ? hasFinalManualValidation : !hasFinalManualValidation))
492
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_SUMMARY_PHASE_INVALID', message: 'manual-validation summary phase does not match the requested writer phase', retryable: false }, prNumber);
493
+ if (manual) {
494
+ if (manual.phase === 'final' && (!manual.transactionId || !manual.receiptDigest || !manual.prHeadSha || manual.prHeadSha !== initial.value.head.sha))
495
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_TRANSACTION_REQUIRED', message: 'final manual-validation summary requires transaction, receipt, and current head identity', retryable: false }, prNumber);
496
+ if (manual.phase === 'final') {
497
+ if (manual.authority !== 'coordinator')
498
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_TRANSACTION_REQUIRED', message: 'final manual-validation summary requires coordinator authority', retryable: false }, prNumber);
499
+ const completion = readManualValidationCompletion(resolved.taskDir, {
500
+ transactionId: manual.transactionId,
501
+ taskId: resolved.taskId,
502
+ prNumber,
503
+ prHeadSha: initial.value.head.sha,
504
+ receiptDigest: manual.receiptDigest
505
+ });
506
+ if (!completion.ok)
507
+ return fail('failed', context, platformError(completion.error), prNumber);
508
+ const { receipt, transaction } = completion.value;
509
+ if (transaction.phase !== 'final-promotion-in-progress' || !transaction.eventAppended)
510
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: 'final summary requires a receipt-backed promotion intent', retryable: false }, prNumber);
511
+ if (!manualValidationFinalSummaryProjectionMatches(options.body, receipt))
512
+ return fail('failed', context, { code: 'MANUAL_VALIDATION_SUMMARY_PROJECTION_INVALID', message: 'final summary body does not match the canonical receipt projection', retryable: false }, prNumber);
513
+ }
514
+ }
469
515
  const expectedReportPath = taskReportPath(resolved.taskDir);
470
516
  const suppliedReportPath = path.resolve(resolved.repoRoot, options.changeReportFile);
471
517
  if (suppliedReportPath !== expectedReportPath)
@@ -476,7 +522,31 @@ async function syncPullRequestSummary(taskRef, options) {
476
522
  const checked = currentReportCheck(report.value, initial.value, taskContent, resolved.repoRoot);
477
523
  if (!checked.ok)
478
524
  return fail('failed', context, checked.error);
479
- const replaced = replaceCanonicalReportPlaceholder(options.body, report.value);
525
+ const placeholder = CANONICAL_REPORT_PLACEHOLDER;
526
+ const split = splitDocumentPlaceholder(options.body, placeholder);
527
+ if (!split.ok)
528
+ return fail('failed', context, {
529
+ code: 'PR_SUMMARY_BODY_CONTRACT_INVALID',
530
+ message: split.error.message,
531
+ retryable: false
532
+ });
533
+ const prefix = sanitizeMarkdownDocument(split.value.prefix, { reservedMarkers: [CONTROL_MARKER_PATTERN] });
534
+ const suffix = sanitizeMarkdownDocument(split.value.suffix, { reservedMarkers: [CONTROL_MARKER_PATTERN] });
535
+ if (!prefix.ok) {
536
+ return fail('failed', context, {
537
+ code: 'PR_SUMMARY_BODY_CONTRACT_INVALID',
538
+ message: `${prefix.error.message} at offset ${prefix.error.offset}`,
539
+ retryable: false
540
+ });
541
+ }
542
+ if (!suffix.ok) {
543
+ return fail('failed', context, {
544
+ code: 'PR_SUMMARY_BODY_CONTRACT_INVALID',
545
+ message: `${suffix.error.message} at offset ${suffix.error.offset}`,
546
+ retryable: false
547
+ });
548
+ }
549
+ const replaced = replaceCanonicalReportPlaceholder(`${prefix.value}${placeholder}${suffix.value}`, report.value);
480
550
  if (!replaced.ok)
481
551
  return fail('failed', context, platformError(replaced.error));
482
552
  const desired = buildPullRequestSummary(resolved.taskId, replaced.value, initial.value.head.sha, renderHumanOverrideAudit(taskContent));
@@ -589,7 +659,10 @@ async function syncPullRequestSummary(taskRef, options) {
589
659
  operations: [{ name: `summary:${reconciliation.action}`, status: 'applied', reasonCode: null }],
590
660
  result: null, warnings: [], ...info
591
661
  };
592
- });
662
+ };
663
+ return await (options.lockAlreadyHeld
664
+ ? execute()
665
+ : withTaskExecutionLock(resolved.repoRoot, resolved.taskId, options.agent, execute));
593
666
  }
594
667
  catch (error) {
595
668
  const lockError = error instanceof TaskExecutionLockError
@@ -598,5 +671,5 @@ async function syncPullRequestSummary(taskRef, options) {
598
671
  return fail(lockError.retryable ? 'blocked' : 'failed', context, lockError);
599
672
  }
600
673
  }
601
- export { buildPullRequestSummary, reconcileSummaryComment, reportWrite, summaryContext, summaryMarker, syncPullRequestSummary, warningResultForPrimary };
674
+ export { buildPullRequestSummary, reconcileSummaryComment, reportWrite, summaryCommentState, summaryContext, summaryMarker, syncPullRequestSummary, warningResultForPrimary };
602
675
  //# sourceMappingURL=pr-summary.js.map
@@ -15,6 +15,7 @@ type ProviderResult<T> = {
15
15
  } | {
16
16
  ok: false;
17
17
  error: PlatformError;
18
+ value?: T;
18
19
  };
19
20
  type ProviderOperationContext = {
20
21
  repositoryRoot: string;
@@ -172,6 +173,35 @@ type MutationReceipt = {
172
173
  changed: boolean;
173
174
  operationId?: string;
174
175
  };
176
+ type SecurityAlertKind = 'dependabot' | 'code-scanning';
177
+ type SecurityAlertSnapshot = {
178
+ kind: SecurityAlertKind;
179
+ number: number;
180
+ state: string;
181
+ data: JsonValue;
182
+ };
183
+ type LabelDefinition = {
184
+ name: string;
185
+ color: string;
186
+ description: string;
187
+ };
188
+ type LabelReconciliation = {
189
+ changed: boolean;
190
+ created: string[];
191
+ updated: string[];
192
+ removed: string[];
193
+ skipped: string[];
194
+ };
195
+ type MilestoneDefinition = {
196
+ title: string;
197
+ description: string;
198
+ state: 'open' | 'closed';
199
+ };
200
+ type MilestoneInitialization = {
201
+ changed: boolean;
202
+ created: string[];
203
+ skipped: string[];
204
+ };
175
205
  type RepositoryMetadataSnapshot = {
176
206
  repository: {
177
207
  identity: ResourceIdentity;
@@ -334,6 +364,14 @@ type PlatformProvider = {
334
364
  context: ProviderOperationContext;
335
365
  target: ResourceIdentity;
336
366
  }): Promise<ProviderResult<ChangeRequestSnapshot>>;
367
+ listFiles?(input: {
368
+ context: ProviderOperationContext;
369
+ target: ResourceIdentity;
370
+ }): Promise<ProviderResult<string[]>>;
371
+ listClosingIssues?(input: {
372
+ context: ProviderOperationContext;
373
+ target: ResourceIdentity;
374
+ }): Promise<ProviderResult<ResourceIdentity[]>>;
337
375
  listClosing(input: {
338
376
  context: ProviderOperationContext;
339
377
  issue: ResourceIdentity;
@@ -468,6 +506,34 @@ type PlatformProvider = {
468
506
  historyLimit: number;
469
507
  }): Promise<ProviderResult<ReleaseNotesFacts>>;
470
508
  };
509
+ securityAlerts?: {
510
+ inspect(input: {
511
+ context: ProviderOperationContext;
512
+ kind: SecurityAlertKind;
513
+ number: number;
514
+ }): Promise<ProviderResult<SecurityAlertSnapshot>>;
515
+ dismiss(input: {
516
+ context: ProviderOperationContext;
517
+ kind: SecurityAlertKind;
518
+ number: number;
519
+ reason: string;
520
+ comment: string;
521
+ mutation: MutationIdentity;
522
+ }): Promise<ProviderResult<MutationReceipt>>;
523
+ };
524
+ repositoryMetadata?: {
525
+ reconcileLabels(input: {
526
+ context: ProviderOperationContext;
527
+ desired: LabelDefinition[];
528
+ cleanupStaleIn: boolean;
529
+ mutation: MutationIdentity;
530
+ }): Promise<ProviderResult<LabelReconciliation>>;
531
+ reconcileMilestones(input: {
532
+ context: ProviderOperationContext;
533
+ desired: MilestoneDefinition[];
534
+ mutation: MutationIdentity;
535
+ }): Promise<ProviderResult<MilestoneInitialization>>;
536
+ };
471
537
  verification?: {
472
538
  fetchRemoteFacts(input: {
473
539
  context: ProviderOperationContext;
@@ -484,4 +550,4 @@ declare const PLATFORM_PROVIDER_CONTRACT_VERSION: 1;
484
550
  declare function isPlatformProviderFactory(value: unknown): value is PlatformProviderFactory;
485
551
  declare function validatePlatformProvider(value: unknown, providerType: string): ProviderResult<PlatformProvider>;
486
552
  export { PLATFORM_PROVIDER_CONTRACT_VERSION, isPlatformProviderFactory, validatePlatformProvider };
487
- export type { ChangeRequestSnapshot, CheckLogSnapshot, CheckRunSnapshot, GitEvidenceSnapshot, IssueSnapshot, JsonValue, MilestoneReconciliation, MutationIdentity, MutationReceipt, PlatformCapabilities, PlatformContextSnapshot, PlatformError, PlatformProvider, PlatformProviderFactory, PlatformProviderFactoryInput, ProviderOperationContext, ProviderResult, ReleaseSnapshot, RemoteCommentSnapshot, RequiredCheckSnapshot, RepositoryMetadataSnapshot, ReleaseNotesFacts, ResourceIdentity, ReviewSnapshot, VerificationRemoteFacts };
553
+ export type { ChangeRequestSnapshot, CheckLogSnapshot, CheckRunSnapshot, GitEvidenceSnapshot, IssueSnapshot, JsonValue, MilestoneReconciliation, MilestoneDefinition, MilestoneInitialization, LabelDefinition, LabelReconciliation, MutationIdentity, MutationReceipt, PlatformCapabilities, PlatformContextSnapshot, PlatformError, PlatformProvider, PlatformProviderFactory, PlatformProviderFactoryInput, ProviderOperationContext, ProviderResult, ReleaseSnapshot, RemoteCommentSnapshot, RequiredCheckSnapshot, RepositoryMetadataSnapshot, ReleaseNotesFacts, ResourceIdentity, SecurityAlertKind, SecurityAlertSnapshot, ReviewSnapshot, VerificationRemoteFacts };
@@ -7,12 +7,14 @@ function isPlatformProviderFactory(value) {
7
7
  }
8
8
  function validatePlatformProvider(value, providerType) {
9
9
  const operationGroups = {
10
- issues: { required: ['inspect', 'create', 'update', 'describeRepository'], optional: [] },
10
+ issues: { required: ['inspect', 'create', 'update', 'describeRepository'], optional: ['listLabels', 'listMilestones'] },
11
11
  comments: { required: ['list', 'write', 'delete'], optional: [] },
12
- changeRequests: { required: ['inspect', 'listClosing', 'create', 'update', 'resolveGitEvidence'], optional: ['verifyHead'] },
12
+ changeRequests: { required: ['inspect', 'listClosing', 'create', 'update', 'resolveGitEvidence'], optional: ['verifyHead', 'listFiles', 'listClosingIssues'] },
13
13
  checks: { required: ['inspectRequired', 'resolveRun', 'fetchLogs'], optional: [] },
14
14
  reviews: { required: ['list', 'publish'], optional: [] },
15
15
  releases: { required: ['inspect', 'create', 'update', 'reconcileMilestones', 'publishNotes', 'collectNotes'], optional: [] },
16
+ securityAlerts: { required: ['inspect', 'dismiss'], optional: [] },
17
+ repositoryMetadata: { required: ['reconcileLabels', 'reconcileMilestones'], optional: [] },
16
18
  verification: { required: ['fetchRemoteFacts'], optional: [] }
17
19
  };
18
20
  const resourceKindsByGroup = {
@@ -22,6 +24,8 @@ function validatePlatformProvider(value, providerType) {
22
24
  checks: ['pull-request'],
23
25
  reviews: ['pull-request'],
24
26
  releases: ['release', 'issue', 'pull-request'],
27
+ securityAlerts: [],
28
+ repositoryMetadata: [],
25
29
  verification: ['issue', 'pull-request']
26
30
  };
27
31
  if (!isRecord(value)
@@ -250,6 +250,64 @@ function validateReceipt(value) {
250
250
  ...(item.operationId === undefined ? {} : { operationId: stringValue(item.operationId, 'receipt.operationId') })
251
251
  };
252
252
  }
253
+ function positiveInteger(value, label) {
254
+ if (!Number.isSafeInteger(value) || value <= 0)
255
+ throw new Error(`${label} must be a positive integer`);
256
+ return value;
257
+ }
258
+ function validateSecurityAlert(value) {
259
+ const item = record(value, 'security alert');
260
+ exactKeys(item, ['kind', 'number', 'state', 'data'], 'security alert');
261
+ if (item.kind !== 'dependabot' && item.kind !== 'code-scanning')
262
+ throw new Error('security alert.kind is invalid');
263
+ return {
264
+ kind: item.kind,
265
+ number: positiveInteger(item.number, 'security alert.number'),
266
+ state: stringValue(item.state, 'security alert.state'),
267
+ data: jsonValue(item.data, 'security alert.data')
268
+ };
269
+ }
270
+ function validateLabelDefinition(value, label) {
271
+ const item = record(value, label);
272
+ exactKeys(item, ['name', 'color', 'description'], label);
273
+ return {
274
+ name: stringValue(item.name, `${label}.name`),
275
+ color: stringValue(item.color, `${label}.color`),
276
+ description: stringValue(item.description, `${label}.description`, true)
277
+ };
278
+ }
279
+ function validateLabelReconciliation(value) {
280
+ const item = record(value, 'label reconciliation');
281
+ exactKeys(item, ['changed', 'created', 'updated', 'removed', 'skipped'], 'label reconciliation');
282
+ const names = (field) => arrayValue(item[field], `label reconciliation.${field}`).map((entry) => stringValue(entry, `${field}[]`));
283
+ return {
284
+ changed: booleanValue(item.changed, 'label reconciliation.changed'),
285
+ created: names('created'),
286
+ updated: names('updated'),
287
+ removed: names('removed'),
288
+ skipped: names('skipped')
289
+ };
290
+ }
291
+ function validateMilestoneDefinition(value, label) {
292
+ const item = record(value, label);
293
+ exactKeys(item, ['title', 'description', 'state'], label);
294
+ if (item.state !== 'open' && item.state !== 'closed')
295
+ throw new Error(`${label}.state is invalid`);
296
+ return {
297
+ title: stringValue(item.title, `${label}.title`),
298
+ description: stringValue(item.description, `${label}.description`, true),
299
+ state: item.state
300
+ };
301
+ }
302
+ function validateMilestoneInitialization(value) {
303
+ const item = record(value, 'milestone initialization');
304
+ exactKeys(item, ['changed', 'created', 'skipped'], 'milestone initialization');
305
+ return {
306
+ changed: booleanValue(item.changed, 'milestone initialization.changed'),
307
+ created: arrayValue(item.created, 'milestone initialization.created').map((entry) => stringValue(entry, 'created[]')),
308
+ skipped: arrayValue(item.skipped, 'milestone initialization.skipped').map((entry) => stringValue(entry, 'skipped[]'))
309
+ };
310
+ }
253
311
  function validateMetadata(value) {
254
312
  const item = record(value, 'repository metadata');
255
313
  exactKeys(item, ['repository', 'labels', 'milestones', 'issueTypes', 'fields'], 'repository metadata');
@@ -352,6 +410,11 @@ const PROVIDER_ERROR_CATALOG = {
352
410
  ISSUE_NUMBER_INVALID: { message: 'The issue number is invalid', retryable: false },
353
411
  ISSUE_CREATE_RESPONSE_INVALID: { message: 'Issue creation returned an invalid response', retryable: false },
354
412
  COMMENT_ID_INVALID: { message: 'The comment identity is invalid', retryable: false },
413
+ SECURITY_KIND_INVALID: { message: 'The security alert kind is invalid', retryable: false },
414
+ SECURITY_NUMBER_INVALID: { message: 'The security alert number is invalid', retryable: false },
415
+ SECURITY_RESPONSE_INVALID: { message: 'The platform returned an invalid security alert', retryable: false },
416
+ LABEL_RESPONSE_INVALID: { message: 'The platform returned an invalid label response', retryable: false },
417
+ MILESTONE_RESPONSE_INVALID: { message: 'The platform returned an invalid milestone response', retryable: false },
355
418
  MILESTONE_IDENTITY_INVALID: { message: 'The milestone identity is invalid', retryable: false },
356
419
  CHECK_RUN_NOT_FOUND: { message: 'The check run was not found', retryable: false },
357
420
  RELEASE_NOTES_AUTHORS_TRUNCATED: { message: 'Release note commit authors exceeded the supported limit', retryable: false },
@@ -390,6 +453,8 @@ function validators(providerType, declaration) {
390
453
  return { sha: stringValue(item.sha, 'change request head.sha') };
391
454
  },
392
455
  'changeRequests.inspect': (value) => validateChangeRequest(value, declaredIdentityKind(declaration, 'pull-request'), true),
456
+ 'changeRequests.listFiles': (value) => arrayValue(value, 'pull request files').map((entry) => stringValue(entry, 'pull request files[]')),
457
+ 'changeRequests.listClosingIssues': (value) => arrayValue(value, 'closing issues').map((entry) => identity(entry, 'closing issues[]', declaredIdentityKind(declaration, 'issue'))),
393
458
  'changeRequests.listClosing': (value) => arrayValue(value, 'changeRequests').map((entry) => validateChangeRequest(entry, declaredIdentityKind(declaration, 'pull-request'), true)),
394
459
  'changeRequests.create': validateReceipt,
395
460
  'changeRequests.update': validateReceipt,
@@ -433,6 +498,10 @@ function validators(providerType, declaration) {
433
498
  },
434
499
  'releases.publishNotes': validateReceipt,
435
500
  'releases.collectNotes': (value) => validateReleaseNotes(value, declaration),
501
+ 'securityAlerts.inspect': validateSecurityAlert,
502
+ 'securityAlerts.dismiss': validateReceipt,
503
+ 'repositoryMetadata.reconcileLabels': validateLabelReconciliation,
504
+ 'repositoryMetadata.reconcileMilestones': validateMilestoneInitialization,
436
505
  'verification.fetchRemoteFacts': (value) => {
437
506
  const item = record(value, 'verification facts');
438
507
  exactKeys(item, ['issue', 'comments', 'changeRequest', 'commit', 'fields'], 'verification facts');
@@ -462,12 +531,16 @@ async function invokeProviderOperation(providerType, operation, call, validate)
462
531
  }
463
532
  if (envelope.ok === false && envelope.error && typeof envelope.error === 'object' && !Array.isArray(envelope.error)) {
464
533
  try {
465
- exactKeys(envelope, ['ok', 'error'], `${operation} result`);
534
+ exactKeys(envelope, Object.hasOwn(envelope, 'value') ? ['ok', 'error', 'value'] : ['ok', 'error'], `${operation} result`);
466
535
  const error = envelope.error;
467
536
  exactKeys(error, ['code', 'message', 'retryable'], `${operation} error`);
468
537
  if (typeof error.code !== 'string' || !error.code || typeof error.message !== 'string' || !error.message || typeof error.retryable !== 'boolean')
469
538
  throw new Error('invalid provider error');
470
- return { ok: false, error: safeProviderError(providerType, operation, error) };
539
+ return {
540
+ ok: false,
541
+ error: safeProviderError(providerType, operation, error),
542
+ ...(Object.hasOwn(envelope, 'value') ? { value: validate(envelope.value) } : {})
543
+ };
471
544
  }
472
545
  catch {
473
546
  return { ok: false, error: validationError(providerType, operation, 'Provider operation returned an invalid error') };
@@ -483,7 +556,7 @@ function wrapProviderOperations(provider) {
483
556
  const map = validators(provider.type, provider.identity);
484
557
  const wrapped = { ...provider, context: { ...provider.context } };
485
558
  wrapped.context.resolve = (input) => invokeProviderOperation(provider.type, 'context.resolve', () => provider.context.resolve(input), map['context.resolve']);
486
- for (const groupName of ['issues', 'comments', 'changeRequests', 'checks', 'reviews', 'releases', 'verification']) {
559
+ for (const groupName of ['issues', 'comments', 'changeRequests', 'checks', 'reviews', 'releases', 'securityAlerts', 'repositoryMetadata', 'verification']) {
487
560
  const group = provider[groupName];
488
561
  if (!group)
489
562
  continue;