@fitlab-ai/agent-infra 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +11 -11
  2. package/README.zh-CN.md +11 -11
  3. package/bin/cli.ts +26 -9
  4. package/dist/bin/cli.js +173 -157
  5. package/dist/bin/internal-cli.js +66 -40
  6. package/dist/lib/agent-client.js +5 -0
  7. package/dist/lib/agent-clients/next-steps.js +6 -1
  8. package/dist/lib/decide.js +3 -3
  9. package/dist/lib/internal/agent-client.js +5 -2
  10. package/dist/lib/internal/cli-route-inventory.js +152 -0
  11. package/dist/lib/internal/codex-lifecycle.js +9 -6
  12. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  13. package/dist/lib/internal/git-workflow.js +10 -6
  14. package/dist/lib/internal/platform-checks.js +19 -7
  15. package/dist/lib/internal/platform-comment.js +25 -13
  16. package/dist/lib/internal/platform-context.js +6 -3
  17. package/dist/lib/internal/platform-issue.js +20 -13
  18. package/dist/lib/internal/platform-metadata.js +88 -0
  19. package/dist/lib/internal/platform-pr-review.js +26 -13
  20. package/dist/lib/internal/platform-pr.js +84 -31
  21. package/dist/lib/internal/platform-release-notes.js +9 -6
  22. package/dist/lib/internal/platform-security.js +93 -0
  23. package/dist/lib/internal/pr-review-grade.js +25 -12
  24. package/dist/lib/internal/release-workflow.js +23 -9
  25. package/dist/lib/internal/sandbox-control.js +50 -7
  26. package/dist/lib/internal/task-activity.js +16 -7
  27. package/dist/lib/internal/task-artifact.js +235 -24
  28. package/dist/lib/internal/task-context.js +4 -1
  29. package/dist/lib/internal/task-create.js +50 -17
  30. package/dist/lib/internal/task-delivery.js +4 -1
  31. package/dist/lib/internal/task-event.js +10 -4
  32. package/dist/lib/internal/task-finalization.js +6 -3
  33. package/dist/lib/internal/task-invalidation.js +63 -0
  34. package/dist/lib/internal/task-ledger.js +20 -6
  35. package/dist/lib/internal/task-lifecycle.js +6 -3
  36. package/dist/lib/internal/task-operation-registry.js +421 -0
  37. package/dist/lib/internal/task-orchestration.js +12 -0
  38. package/dist/lib/internal/task-override.js +14 -7
  39. package/dist/lib/internal/task-qualification.js +90 -0
  40. package/dist/lib/internal/task-review.js +7 -4
  41. package/dist/lib/internal/task-short-id.js +11 -1
  42. package/dist/lib/internal/task-snapshot.js +4 -1
  43. package/dist/lib/internal/task-validate.js +7 -2
  44. package/dist/lib/internal/task-verify.js +11 -7
  45. package/dist/lib/internal/task-warning.js +11 -4
  46. package/dist/lib/platform/adapters.js +1 -3
  47. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  48. package/dist/lib/platform/comment-safety.js +226 -0
  49. package/dist/lib/platform/completion-backfill.js +6 -5
  50. package/dist/lib/platform/context.js +70 -130
  51. package/dist/lib/platform/github-client.js +1 -1
  52. package/dist/lib/platform/github-provider.js +1130 -0
  53. package/dist/lib/platform/in-label-sync.js +143 -0
  54. package/dist/lib/platform/issue-comments.js +237 -72
  55. package/dist/lib/platform/issues.js +335 -189
  56. package/dist/lib/platform/metadata-labels.js +6 -2
  57. package/dist/lib/platform/none-provider.js +28 -0
  58. package/dist/lib/platform/pr-change-report.js +545 -0
  59. package/dist/lib/platform/pr-checks.js +119 -104
  60. package/dist/lib/platform/pr-review.js +88 -72
  61. package/dist/lib/platform/pr-summary.js +541 -50
  62. package/dist/lib/platform/provider-bridge.js +45 -0
  63. package/dist/lib/platform/provider-contract.d.ts +553 -0
  64. package/dist/lib/platform/provider-contract.js +99 -0
  65. package/dist/lib/platform/provider-loader.js +251 -0
  66. package/dist/lib/platform/provider-validation.js +577 -0
  67. package/dist/lib/platform/pull-request-metadata.js +8 -6
  68. package/dist/lib/platform/pull-requests.js +734 -543
  69. package/dist/lib/platform/release-notes.js +78 -55
  70. package/dist/lib/platform/releases.js +79 -50
  71. package/dist/lib/platform/repository-metadata.js +377 -0
  72. package/dist/lib/platform/resource-identity.d.ts +26 -0
  73. package/dist/lib/platform/resource-identity.js +92 -0
  74. package/dist/lib/platform/security-alerts.js +155 -0
  75. package/dist/lib/platform/task-identities.js +31 -0
  76. package/dist/lib/platform/verification-required.js +11 -12
  77. package/dist/lib/platform/verification-sync.js +129 -248
  78. package/dist/lib/pr-review/evidence-grading.js +19 -6
  79. package/dist/lib/process-data/index.js +7 -0
  80. package/dist/lib/run/index.js +68 -23
  81. package/dist/lib/sandbox/commands/control-status.js +22 -0
  82. package/dist/lib/sandbox/commands/create.js +32 -6
  83. package/dist/lib/sandbox/commands/ls.js +5 -0
  84. package/dist/lib/sandbox/commands/rm.js +827 -120
  85. package/dist/lib/sandbox/commands/show.js +16 -0
  86. package/dist/lib/sandbox/control/client.js +174 -19
  87. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  88. package/dist/lib/sandbox/control/container-identity.js +28 -31
  89. package/dist/lib/sandbox/control/executor.js +151 -16
  90. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  91. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  92. package/dist/lib/sandbox/control/protocol.js +77 -0
  93. package/dist/lib/sandbox/control/server.js +677 -34
  94. package/dist/lib/sandbox/control/state.js +209 -4
  95. package/dist/lib/sandbox/control/task-view.js +183 -0
  96. package/dist/lib/sandbox/engines/authority.js +289 -0
  97. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  98. package/dist/lib/sandbox/index.js +5 -0
  99. package/dist/lib/sandbox/recovery.js +21 -1
  100. package/dist/lib/sandbox/workspace-view.js +2 -1
  101. package/dist/lib/sandbox/worktree-safety.js +4 -1
  102. package/dist/lib/server/index.js +8 -0
  103. package/dist/lib/server/protocol.js +38 -1
  104. package/dist/lib/task/activity-log.js +8 -1
  105. package/dist/lib/task/artifact-lifecycle.js +75 -18
  106. package/dist/lib/task/artifact-operations.js +520 -0
  107. package/dist/lib/task/artifact-repair-intent.js +59 -0
  108. package/dist/lib/task/artifact-schema.js +135 -0
  109. package/dist/lib/task/capabilities.js +310 -0
  110. package/dist/lib/task/commands/status.js +32 -0
  111. package/dist/lib/task/commit-operation.js +12 -1
  112. package/dist/lib/task/control-authority.js +12 -5
  113. package/dist/lib/task/create-service.js +111 -12
  114. package/dist/lib/task/create.js +25 -0
  115. package/dist/lib/task/current-contract.js +5 -1
  116. package/dist/lib/task/decision-details.js +1 -1
  117. package/dist/lib/task/events.js +416 -17
  118. package/dist/lib/task/finalization.js +37 -13
  119. package/dist/lib/task/human-override.js +58 -36
  120. package/dist/lib/task/index.js +11 -3
  121. package/dist/lib/task/invalidation-command.js +86 -0
  122. package/dist/lib/task/invalidation.js +260 -0
  123. package/dist/lib/task/ledger-intents.js +37 -0
  124. package/dist/lib/task/local-artifact-finalization.js +299 -0
  125. package/dist/lib/task/orchestration.js +240 -144
  126. package/dist/lib/task/pr-delivery-fact.js +102 -101
  127. package/dist/lib/task/qualification-audit.js +490 -0
  128. package/dist/lib/task/qualification-confirmation.js +109 -0
  129. package/dist/lib/task/qualification-intents.js +148 -0
  130. package/dist/lib/task/review-artifacts.js +22 -23
  131. package/dist/lib/task/review-finalization.js +121 -4
  132. package/dist/lib/task/review-fingerprint.js +24 -2
  133. package/dist/lib/task/rework-intent.js +138 -0
  134. package/dist/lib/task/sections.js +6 -4
  135. package/dist/lib/task/skill-scope.js +23 -0
  136. package/dist/lib/task/task-execution-lock.js +27 -17
  137. package/dist/lib/task/verification-config.js +11 -0
  138. package/dist/lib/task/verification-engine.js +93 -16
  139. package/dist/lib/task/verification.js +3 -3
  140. package/dist/lib/task/workflow-warning-intents.js +1 -1
  141. package/dist/lib/task/write.js +11 -0
  142. package/dist/lib/version.js +11 -1
  143. package/dist/lifecycle-build-manifest.json +3 -3
  144. package/lib/agent-client.ts +9 -0
  145. package/lib/agent-clients/next-steps.ts +6 -1
  146. package/lib/decide.ts +3 -3
  147. package/lib/init.ts +1 -1
  148. package/lib/internal/agent-client.ts +4 -2
  149. package/lib/internal/cli-route-inventory.ts +140 -0
  150. package/lib/internal/codex-lifecycle.ts +8 -6
  151. package/lib/internal/codex-sandbox-controller.ts +7 -2
  152. package/lib/internal/git-workflow.ts +9 -6
  153. package/lib/internal/platform-checks.ts +14 -6
  154. package/lib/internal/platform-comment.ts +20 -12
  155. package/lib/internal/platform-context.ts +5 -3
  156. package/lib/internal/platform-issue.ts +17 -11
  157. package/lib/internal/platform-metadata.ts +70 -0
  158. package/lib/internal/platform-pr-review.ts +23 -12
  159. package/lib/internal/platform-pr.ts +65 -27
  160. package/lib/internal/platform-release-notes.ts +8 -6
  161. package/lib/internal/platform-security.ts +83 -0
  162. package/lib/internal/pr-review-grade.ts +20 -11
  163. package/lib/internal/release-workflow.ts +21 -9
  164. package/lib/internal/sandbox-control.ts +44 -6
  165. package/lib/internal/task-activity.ts +15 -7
  166. package/lib/internal/task-artifact.ts +204 -22
  167. package/lib/internal/task-context.ts +3 -1
  168. package/lib/internal/task-create.ts +78 -17
  169. package/lib/internal/task-delivery.ts +3 -1
  170. package/lib/internal/task-event.ts +9 -4
  171. package/lib/internal/task-finalization.ts +6 -4
  172. package/lib/internal/task-invalidation.ts +41 -0
  173. package/lib/internal/task-ledger.ts +21 -8
  174. package/lib/internal/task-lifecycle.ts +5 -3
  175. package/lib/internal/task-operation-registry.ts +482 -0
  176. package/lib/internal/task-orchestration.ts +12 -0
  177. package/lib/internal/task-override.ts +15 -9
  178. package/lib/internal/task-qualification.ts +61 -0
  179. package/lib/internal/task-review.ts +6 -4
  180. package/lib/internal/task-short-id.ts +10 -1
  181. package/lib/internal/task-snapshot.ts +3 -1
  182. package/lib/internal/task-validate.ts +6 -2
  183. package/lib/internal/task-verify.ts +10 -7
  184. package/lib/internal/task-warning.ts +10 -4
  185. package/lib/platform/adapters.ts +3 -2
  186. package/lib/platform/change-request-git-evidence.ts +36 -9
  187. package/lib/platform/comment-safety.ts +250 -0
  188. package/lib/platform/completion-backfill.ts +9 -8
  189. package/lib/platform/context.ts +97 -134
  190. package/lib/platform/github-client.ts +2 -2
  191. package/lib/platform/github-provider.ts +1132 -0
  192. package/lib/platform/in-label-sync.ts +208 -0
  193. package/lib/platform/issue-comments.ts +255 -80
  194. package/lib/platform/issues.ts +344 -174
  195. package/lib/platform/metadata-labels.ts +5 -2
  196. package/lib/platform/none-provider.ts +35 -0
  197. package/lib/platform/pr-change-report.ts +639 -0
  198. package/lib/platform/pr-checks.ts +126 -106
  199. package/lib/platform/pr-review.ts +88 -85
  200. package/lib/platform/pr-summary.ts +581 -53
  201. package/lib/platform/provider-bridge.ts +82 -0
  202. package/lib/platform/provider-contract.ts +611 -0
  203. package/lib/platform/provider-loader.ts +307 -0
  204. package/lib/platform/provider-validation.ts +611 -0
  205. package/lib/platform/pull-request-metadata.ts +10 -7
  206. package/lib/platform/pull-requests.ts +781 -550
  207. package/lib/platform/release-notes.ts +76 -59
  208. package/lib/platform/releases.ts +77 -43
  209. package/lib/platform/repository-metadata.ts +453 -0
  210. package/lib/platform/resource-identity.ts +121 -0
  211. package/lib/platform/security-alerts.ts +191 -0
  212. package/lib/platform/task-identities.ts +40 -0
  213. package/lib/platform/types.ts +4 -2
  214. package/lib/platform/verification-required.ts +11 -13
  215. package/lib/platform/verification-sync.ts +128 -304
  216. package/lib/pr-review/evidence-grading.ts +25 -8
  217. package/lib/process-data/index.ts +7 -0
  218. package/lib/run/index.ts +62 -22
  219. package/lib/sandbox/commands/control-status.ts +26 -0
  220. package/lib/sandbox/commands/create.ts +46 -6
  221. package/lib/sandbox/commands/ls.ts +7 -0
  222. package/lib/sandbox/commands/rm.ts +1000 -87
  223. package/lib/sandbox/commands/show.ts +16 -0
  224. package/lib/sandbox/control/client.ts +203 -19
  225. package/lib/sandbox/control/completed-reentry.ts +98 -0
  226. package/lib/sandbox/control/container-identity.ts +27 -43
  227. package/lib/sandbox/control/executor.ts +180 -15
  228. package/lib/sandbox/control/lifecycle.ts +629 -17
  229. package/lib/sandbox/control/native-file-lock.ts +209 -0
  230. package/lib/sandbox/control/protocol.ts +118 -2
  231. package/lib/sandbox/control/server.ts +724 -34
  232. package/lib/sandbox/control/state.ts +257 -4
  233. package/lib/sandbox/control/task-view.ts +240 -0
  234. package/lib/sandbox/engines/authority.ts +365 -0
  235. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  236. package/lib/sandbox/index.ts +7 -0
  237. package/lib/sandbox/recovery.ts +21 -1
  238. package/lib/sandbox/workspace-view.ts +9 -3
  239. package/lib/sandbox/worktree-safety.ts +4 -1
  240. package/lib/server/index.ts +10 -0
  241. package/lib/server/protocol.ts +36 -1
  242. package/lib/task/activity-log.ts +8 -0
  243. package/lib/task/artifact-lifecycle.ts +70 -22
  244. package/lib/task/artifact-operations.ts +626 -0
  245. package/lib/task/artifact-repair-intent.ts +71 -0
  246. package/lib/task/artifact-schema.ts +192 -0
  247. package/lib/task/capabilities.ts +331 -0
  248. package/lib/task/commands/status.ts +38 -0
  249. package/lib/task/commit-operation.ts +12 -1
  250. package/lib/task/control-authority.ts +22 -9
  251. package/lib/task/create-service.ts +139 -14
  252. package/lib/task/create.ts +27 -0
  253. package/lib/task/current-contract.ts +6 -1
  254. package/lib/task/decision-details.ts +6 -2
  255. package/lib/task/events.ts +392 -16
  256. package/lib/task/finalization.ts +50 -14
  257. package/lib/task/human-override.ts +70 -46
  258. package/lib/task/index.ts +16 -3
  259. package/lib/task/invalidation-command.ts +86 -0
  260. package/lib/task/invalidation.ts +332 -0
  261. package/lib/task/ledger-intents.ts +35 -1
  262. package/lib/task/local-artifact-finalization.ts +432 -0
  263. package/lib/task/orchestration.ts +223 -133
  264. package/lib/task/pr-delivery-fact.ts +131 -148
  265. package/lib/task/qualification-audit.ts +599 -0
  266. package/lib/task/qualification-confirmation.ts +117 -0
  267. package/lib/task/qualification-intents.ts +150 -0
  268. package/lib/task/review-artifacts.ts +21 -22
  269. package/lib/task/review-finalization.ts +133 -4
  270. package/lib/task/review-fingerprint.ts +23 -2
  271. package/lib/task/rework-intent.ts +165 -0
  272. package/lib/task/sections.ts +6 -4
  273. package/lib/task/skill-scope.ts +24 -0
  274. package/lib/task/task-execution-lock.ts +23 -14
  275. package/lib/task/verification-config.ts +12 -0
  276. package/lib/task/verification-engine.ts +103 -17
  277. package/lib/task/verification.ts +4 -4
  278. package/lib/task/workflow-warning-intents.ts +1 -1
  279. package/lib/task/write.ts +19 -0
  280. package/lib/update.ts +1 -1
  281. package/lib/version.ts +15 -1
  282. package/package.json +12 -1
  283. package/templates/.agents/rules/README.en.md +3 -1
  284. package/templates/.agents/rules/README.zh-CN.md +3 -1
  285. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  286. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  287. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  288. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  289. package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
  290. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  291. package/templates/.agents/rules/issue-sync.en.md +2 -0
  292. package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
  293. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  294. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  295. package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
  296. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
  297. package/templates/.agents/rules/pr-sync.en.md +10 -4
  298. package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
  299. package/templates/.agents/rules/security-alerts.en.md +8 -8
  300. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  301. package/templates/.agents/rules/task-short-id.en.md +1 -4
  302. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  303. package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
  304. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
  305. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  306. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  307. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  308. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  309. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  310. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  311. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
  314. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
  315. package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
  316. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
  317. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  318. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  319. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  320. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  321. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  322. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  323. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  324. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  325. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  326. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  327. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
  328. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
  329. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
  330. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
  331. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  332. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  333. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
  334. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
  335. package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
  336. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
  337. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
  338. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
  339. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  340. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  341. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  342. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  343. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  344. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  345. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  346. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  347. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  348. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  349. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  350. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  351. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  352. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  353. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  354. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  355. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  356. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  357. package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
  358. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
  359. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  360. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  361. package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
  362. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
  363. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  364. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  365. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  366. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  367. package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
  368. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
  369. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  370. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  371. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  372. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  373. package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
  374. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
  375. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  376. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  377. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  378. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  379. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  380. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  381. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  382. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  383. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
  384. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
  385. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  386. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  387. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  388. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  389. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  390. package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
  391. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
  392. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  393. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  394. package/templates/.agents/templates/task.en.md +24 -1
  395. package/templates/.agents/templates/task.zh-CN.md +24 -1
  396. package/templates/.github/workflows/pr-label.yml +7 -26
  397. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  398. package/templates/.agents/scripts/security-alerts.sh +0 -31
  399. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  400. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  401. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  402. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -0,0 +1,209 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createRequire } from 'node:module';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+
7
+ type NativeFsExt = Readonly<{
8
+ flockSync: (fd: number, flags: string) => void;
9
+ lockFileExSync: (fd: number, flags: number, offsetLow: number, offsetHigh: number, lengthLow: number, lengthHigh: number) => void;
10
+ unlockFileExSync: (fd: number, offsetLow: number, offsetHigh: number, lengthLow: number, lengthHigh: number) => void;
11
+ constants: Readonly<{
12
+ LOCKFILE_EXCLUSIVE_LOCK: number;
13
+ LOCKFILE_FAIL_IMMEDIATELY: number;
14
+ }>;
15
+ getNativeModuleSource?: () => string;
16
+ }>;
17
+
18
+ export type SandboxLockCapability = Readonly<{
19
+ supported: boolean;
20
+ primitive: 'flock' | 'LockFileEx' | 'unavailable';
21
+ binarySource: string | null;
22
+ reason?: string;
23
+ }>;
24
+
25
+ export type SandboxLockNamespace = Readonly<{
26
+ lockRoot: string;
27
+ domainDirectory: string;
28
+ lockDomain: string;
29
+ carrierIdentityDigest: string;
30
+ lockPath: string;
31
+ }>;
32
+
33
+ export type SandboxResourceLock = Readonly<{
34
+ path: string;
35
+ lockDomain: string;
36
+ release(): void;
37
+ }>;
38
+
39
+ const require = createRequire(import.meta.url);
40
+ const LOCK_ROOT_NAME = path.join('.agent-infra', 'sandbox-locks');
41
+
42
+ function loadNative(): NativeFsExt {
43
+ try {
44
+ return require('fs-ext-extra-prebuilt') as NativeFsExt;
45
+ } catch {
46
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: native lock module is unavailable');
47
+ }
48
+ }
49
+
50
+ function digest(value: string): string {
51
+ return createHash('sha256').update(value).digest('hex');
52
+ }
53
+
54
+ function assertPrivateDirectory(directory: string, home: string): void {
55
+ const resolvedHome = path.resolve(home);
56
+ let current = resolvedHome;
57
+ const relative = path.relative(resolvedHome, path.resolve(directory));
58
+ if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {
59
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock root must be below the user home');
60
+ }
61
+ for (const segment of relative.split(path.sep).filter(Boolean)) {
62
+ current = path.join(current, segment);
63
+ if (fs.existsSync(current)) {
64
+ const stat = fs.lstatSync(current);
65
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
66
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock namespace contains a link or non-directory');
67
+ }
68
+ if (process.platform !== 'win32' && typeof process.getuid === 'function'
69
+ && stat.uid !== process.getuid()) {
70
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock namespace owner mismatch');
71
+ }
72
+ } else {
73
+ try {
74
+ fs.mkdirSync(current, { mode: 0o700 });
75
+ } catch (error) {
76
+ if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
77
+ const stat = fs.lstatSync(current);
78
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
79
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock namespace contains a link or non-directory');
80
+ }
81
+ }
82
+ }
83
+ if (process.platform !== 'win32') fs.chmodSync(current, 0o700);
84
+ }
85
+ const real = fs.realpathSync.native(path.resolve(directory));
86
+ const realRelative = path.relative(fs.realpathSync.native(resolvedHome), real);
87
+ if (!realRelative || realRelative.startsWith('..') || path.isAbsolute(realRelative)) {
88
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock namespace realpath escapes the user home');
89
+ }
90
+ }
91
+
92
+ export function resolveSandboxLockNamespace(
93
+ carrierIdentity: string,
94
+ options: Readonly<{ lockDomain?: string; home?: string }> = {}
95
+ ): SandboxLockNamespace {
96
+ if (!carrierIdentity.trim()) throw new Error('SANDBOX_LOCK_IDENTITY_INVALID');
97
+ const home = path.resolve(options.home ?? os.homedir());
98
+ const lockRoot = path.join(home, LOCK_ROOT_NAME);
99
+ assertPrivateDirectory(lockRoot, home);
100
+ const primitive = process.platform === 'win32' ? 'LockFileEx' : 'flock';
101
+ const lockDomain = options.lockDomain ?? digest(`${process.platform}\0${process.arch}\0${primitive}`);
102
+ if (!/^[a-f0-9]{64}$/u.test(lockDomain)) throw new Error('SANDBOX_LOCK_DOMAIN_INVALID');
103
+ const domainDirectory = path.join(lockRoot, lockDomain);
104
+ assertPrivateDirectory(domainDirectory, home);
105
+ const carrierIdentityDigest = digest(carrierIdentity);
106
+ return {
107
+ lockRoot,
108
+ domainDirectory,
109
+ lockDomain,
110
+ carrierIdentityDigest,
111
+ lockPath: path.join(domainDirectory, `${carrierIdentityDigest}.lock`)
112
+ };
113
+ }
114
+
115
+ export function stableSandboxLockPath(
116
+ carrierIdentity: string,
117
+ lockDomain?: string,
118
+ options: Readonly<{ home?: string }> = {}
119
+ ): string {
120
+ return resolveSandboxLockNamespace(carrierIdentity, { lockDomain, home: options.home }).lockPath;
121
+ }
122
+
123
+ export function probeNativeLockCapability(): SandboxLockCapability {
124
+ try {
125
+ const native = loadNative();
126
+ return {
127
+ supported: true,
128
+ primitive: process.platform === 'win32' ? 'LockFileEx' : 'flock',
129
+ binarySource: native.getNativeModuleSource?.() ?? null
130
+ };
131
+ } catch (error) {
132
+ return {
133
+ supported: false,
134
+ primitive: 'unavailable',
135
+ binarySource: null,
136
+ reason: error instanceof Error ? error.message : String(error)
137
+ };
138
+ }
139
+ }
140
+
141
+ export function acquireSandboxResourceLock(
142
+ carrierIdentity: string,
143
+ options: Readonly<{ lockDomain?: string; home?: string }> = {}
144
+ ): SandboxResourceLock {
145
+ const native = loadNative();
146
+ const namespace = resolveSandboxLockNamespace(carrierIdentity, options);
147
+ if (fs.existsSync(namespace.lockPath)) {
148
+ const existing = fs.lstatSync(namespace.lockPath);
149
+ if (existing.isSymbolicLink() || !existing.isFile()) {
150
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock object is not a regular file');
151
+ }
152
+ if (process.platform !== 'win32' && typeof process.getuid === 'function'
153
+ && existing.uid !== process.getuid()) {
154
+ throw new Error('SANDBOX_LOCK_UNSUPPORTED: lock object owner mismatch');
155
+ }
156
+ }
157
+ let fd: number | undefined;
158
+ try {
159
+ const noFollow = process.platform !== 'win32' && typeof fs.constants.O_NOFOLLOW === 'number'
160
+ ? fs.constants.O_NOFOLLOW : 0;
161
+ fd = fs.openSync(namespace.lockPath, fs.constants.O_CREAT | fs.constants.O_RDWR | noFollow, 0o600);
162
+ if (process.platform !== 'win32') fs.chmodSync(namespace.lockPath, 0o600);
163
+ if (process.platform === 'win32') {
164
+ native.lockFileExSync(
165
+ fd,
166
+ native.constants.LOCKFILE_EXCLUSIVE_LOCK | native.constants.LOCKFILE_FAIL_IMMEDIATELY,
167
+ 0, 0, 1, 0
168
+ );
169
+ } else {
170
+ native.flockSync(fd, 'exnb');
171
+ }
172
+ } catch (error) {
173
+ try {
174
+ if (fd !== undefined) fs.closeSync(fd);
175
+ } catch {
176
+ // Preserve the lock acquisition error.
177
+ }
178
+ const code = error && typeof error === 'object' && 'code' in error ? String((error as { code?: unknown }).code) : '';
179
+ if (['EAGAIN', 'EACCES', 'EWOULDBLOCK'].includes(code)) {
180
+ throw new Error('SANDBOX_LOCK_BUSY');
181
+ }
182
+ throw new Error(`SANDBOX_LOCK_UNSUPPORTED: ${error instanceof Error ? error.message : String(error)}`);
183
+ }
184
+
185
+ let released = false;
186
+ return {
187
+ path: namespace.lockPath,
188
+ lockDomain: namespace.lockDomain,
189
+ release() {
190
+ if (released) return;
191
+ released = true;
192
+ let failure: unknown = null;
193
+ try {
194
+ if (fd === undefined) throw new Error('descriptor is missing');
195
+ if (process.platform === 'win32') native.unlockFileExSync(fd, 0, 0, 1, 0);
196
+ else native.flockSync(fd, 'un');
197
+ } catch (error) {
198
+ failure = error;
199
+ } finally {
200
+ try {
201
+ if (fd !== undefined) fs.closeSync(fd);
202
+ } catch (error) {
203
+ failure ??= error;
204
+ }
205
+ }
206
+ if (failure) throw new Error(`SANDBOX_LOCK_RELEASE_FAILED: ${failure instanceof Error ? failure.message : String(failure)}`);
207
+ }
208
+ };
209
+ }
@@ -1,9 +1,16 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import { validateTaskCreateCandidate, type TaskCreateCandidateV1 } from '../../task/create.ts';
2
3
  import { normalizeAgentToken } from '../../agent-clients/tokens.ts';
3
4
  import type { ProcessIdentity } from '../../server/process-state.ts';
4
5
  import type { CodexControllerLeaseProofV1 } from './controller-registration.ts';
6
+ import type { SandboxAuthorityEvidenceV1 } from '../engines/authority.ts';
7
+ import type { SandboxTaskView } from './task-view.ts';
5
8
 
6
9
  export const SANDBOX_CONTROL_MAX_BYTES = 64 * 1024;
10
+ export const SANDBOX_CONTROL_MAX_LOGICAL_RECORDS = 1024;
11
+ export const SANDBOX_CONTROL_MAX_RESPONSE_BYTES = 64 * 1024 * 1024;
12
+ export const SANDBOX_CONTROL_MAX_TERMINAL_RECORD_BYTES = 1024 * 1024;
13
+ export const SANDBOX_CONTROL_RESERVATION_BYTES = SANDBOX_CONTROL_MAX_TERMINAL_RECORD_BYTES + 4 * 1024;
7
14
  export const SANDBOX_CONTROL_ADMISSION_WINDOW_MS = 2_000;
8
15
  export const SANDBOX_CONTROL_STATUS_INTERVAL_MS = 250;
9
16
  export const SANDBOX_CONTROL_STATUS_STALE_MS = 1_500;
@@ -32,6 +39,7 @@ export type SandboxControlContainerIdentity = Readonly<{
32
39
  export type SandboxControlManifestBase = Readonly<{
33
40
  engine: string; repoRoot: string; worktreeRoot: string; project: string; container: string;
34
41
  containerIdentity: SandboxControlContainerIdentity;
42
+ authorityEvidence: SandboxAuthorityEvidenceV1;
35
43
  branch: string; mode: 'task-bound' | 'branch-only'; taskId: string | null; token: string;
36
44
  generation: string; channelDir: string; publicStatusDir: string; processingDir: string;
37
45
  }>;
@@ -63,14 +71,48 @@ export type SandboxCodexControllerRequest = RequestBase & Readonly<{
63
71
  }>;
64
72
  export type SandboxControlRequest = SandboxTaskCommandRequest | SandboxTaskFinalizationRequest | SandboxTaskCreateRequest | SandboxCodexControllerRequest;
65
73
  export type SandboxControlError = Readonly<{ code: string; message: string; retryable: boolean }>;
74
+ export type SandboxControlResultEvidence = Readonly<{
75
+ version: 1;
76
+ id: string;
77
+ generation: string;
78
+ exitCode: number;
79
+ stdoutBytes: number;
80
+ stderrBytes: number;
81
+ stdoutSha256: string;
82
+ stderrSha256: string;
83
+ captureState: 'metadata-only';
84
+ }>;
85
+ export type SandboxControlPayloadReference = Readonly<{
86
+ version: 1;
87
+ id: string;
88
+ generation: string;
89
+ stdoutBytes: number;
90
+ stderrBytes: number;
91
+ stdoutSha256: string;
92
+ stderrSha256: string;
93
+ }>;
94
+ export type SandboxControlPayload = SandboxControlPayloadReference & Readonly<{
95
+ stdout: string;
96
+ stderr: string;
97
+ }>;
98
+ export type SandboxControlReservation = Readonly<{
99
+ version: 1;
100
+ id: string;
101
+ generation: string;
102
+ logicalRecords: 1;
103
+ bytes: number;
104
+ createdAt: number;
105
+ }>;
66
106
  export type SandboxControlResponse = Readonly<{
67
107
  version: 2; id: string; phase: 'accepted' | 'completed' | 'rejected'; exitCode: number | null;
68
108
  stdout: string; stderr: string; error: SandboxControlError | null;
109
+ outputState?: 'available' | 'unavailable';
110
+ payload?: SandboxControlPayloadReference | null;
69
111
  }>;
70
112
  export type SandboxControlStatus = Readonly<{
71
- version: 2; generation: string; broker: ProcessIdentity & { brokerId: string };
113
+ version: 3; generation: string; broker: ProcessIdentity & { brokerId: string };
72
114
  state: 'starting' | 'healthy' | 'busy' | 'parked'; reasonCode: string | null;
73
- activeRequestId: string | null; updatedAt: number;
115
+ activeRequestId: string | null; updatedAt: number; taskView: SandboxTaskView;
74
116
  }>;
75
117
  export type SandboxControlLease = Readonly<{
76
118
  version: 2; generation: string; nonce: string; owner: ProcessIdentity;
@@ -97,6 +139,80 @@ function fail(code: string, message: string, retryable = false): never {
97
139
  throw new SandboxControlProtocolError(code, message, retryable);
98
140
  }
99
141
 
142
+ export function parseSandboxControlResultEvidence(value: unknown): SandboxControlResultEvidence {
143
+ const evidence = value as Partial<SandboxControlResultEvidence> | null;
144
+ const keys = evidence && typeof evidence === 'object' ? Object.keys(evidence).sort().join(',') : '';
145
+ if (keys !== 'captureState,exitCode,generation,id,stderrBytes,stderrSha256,stdoutBytes,stdoutSha256,version'
146
+ || evidence?.version !== 1
147
+ || typeof evidence.id !== 'string' || !/^[a-f0-9-]{16,64}$/u.test(evidence.id)
148
+ || typeof evidence.generation !== 'string' || evidence.generation.length === 0
149
+ || !Number.isSafeInteger(evidence.exitCode)
150
+ || !Number.isSafeInteger(evidence.stdoutBytes) || (evidence.stdoutBytes as number) < 0
151
+ || !Number.isSafeInteger(evidence.stderrBytes) || (evidence.stderrBytes as number) < 0
152
+ || (evidence.stdoutBytes as number) + (evidence.stderrBytes as number) > SANDBOX_CONTROL_MAX_RESPONSE_BYTES
153
+ || typeof evidence.stdoutSha256 !== 'string' || !/^[a-f0-9]{64}$/u.test(evidence.stdoutSha256)
154
+ || typeof evidence.stderrSha256 !== 'string' || !/^[a-f0-9]{64}$/u.test(evidence.stderrSha256)
155
+ || evidence.captureState !== 'metadata-only') {
156
+ throw new Error('SANDBOX_CONTROL_RESULT_EVIDENCE_INVALID');
157
+ }
158
+ return evidence as SandboxControlResultEvidence;
159
+ }
160
+
161
+ function validPayloadReference(value: unknown, id: string, generation: string): value is SandboxControlPayloadReference {
162
+ const payload = value as Partial<SandboxControlPayloadReference> | null;
163
+ const keys = payload && typeof payload === 'object' ? Object.keys(payload).sort().join(',') : '';
164
+ return keys === 'generation,id,stderrBytes,stderrSha256,stdoutBytes,stdoutSha256,version'
165
+ && payload?.version === 1
166
+ && payload.id === id
167
+ && payload.generation === generation
168
+ && Number.isSafeInteger(payload.stdoutBytes) && (payload.stdoutBytes as number) >= 0
169
+ && Number.isSafeInteger(payload.stderrBytes) && (payload.stderrBytes as number) >= 0
170
+ && (payload.stdoutBytes as number) + (payload.stderrBytes as number) <= SANDBOX_CONTROL_MAX_RESPONSE_BYTES
171
+ && typeof payload.stdoutSha256 === 'string' && /^[a-f0-9]{64}$/u.test(payload.stdoutSha256)
172
+ && typeof payload.stderrSha256 === 'string' && /^[a-f0-9]{64}$/u.test(payload.stderrSha256);
173
+ }
174
+
175
+ export function parseSandboxControlPayload(value: unknown): SandboxControlPayload {
176
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('SANDBOX_CONTROL_PAYLOAD_INVALID');
177
+ const payload = value as Partial<SandboxControlPayload>;
178
+ const reference: Partial<SandboxControlPayloadReference> = {
179
+ version: payload.version,
180
+ id: payload.id,
181
+ generation: payload.generation,
182
+ stdoutBytes: payload.stdoutBytes,
183
+ stderrBytes: payload.stderrBytes,
184
+ stdoutSha256: payload.stdoutSha256,
185
+ stderrSha256: payload.stderrSha256
186
+ };
187
+ const keys = Object.keys(payload).sort().join(',');
188
+ if (keys !== 'generation,id,stderr,stderrBytes,stderrSha256,stdout,stdoutBytes,stdoutSha256,version'
189
+ || !validPayloadReference(reference, reference.id as string, reference.generation as string)
190
+ || typeof payload.stdout !== 'string' || typeof payload.stderr !== 'string'
191
+ || Buffer.byteLength(payload.stdout, 'utf8') !== payload.stdoutBytes
192
+ || Buffer.byteLength(payload.stderr, 'utf8') !== payload.stderrBytes
193
+ || createHash('sha256').update(payload.stdout, 'utf8').digest('hex') !== payload.stdoutSha256
194
+ || createHash('sha256').update(payload.stderr, 'utf8').digest('hex') !== payload.stderrSha256) {
195
+ throw new Error('SANDBOX_CONTROL_PAYLOAD_INVALID');
196
+ }
197
+ return payload as SandboxControlPayload;
198
+ }
199
+
200
+ export function parseSandboxControlReservation(value: unknown): SandboxControlReservation {
201
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('SANDBOX_CONTROL_RESERVATION_INVALID');
202
+ const reservation = value as Partial<SandboxControlReservation>;
203
+ const keys = Object.keys(reservation).sort().join(',');
204
+ if (keys !== 'bytes,createdAt,generation,id,logicalRecords,version'
205
+ || reservation.version !== 1
206
+ || typeof reservation.id !== 'string' || !/^[a-f0-9-]{16,64}$/u.test(reservation.id)
207
+ || typeof reservation.generation !== 'string' || reservation.generation.length === 0
208
+ || reservation.logicalRecords !== 1
209
+ || !Number.isSafeInteger(reservation.bytes) || (reservation.bytes as number) < SANDBOX_CONTROL_RESERVATION_BYTES
210
+ || !Number.isSafeInteger(reservation.createdAt)) {
211
+ throw new Error('SANDBOX_CONTROL_RESERVATION_INVALID');
212
+ }
213
+ return reservation as SandboxControlReservation;
214
+ }
215
+
100
216
  export function isSandboxControlFamily(value: string): value is SandboxControlFamily {
101
217
  return SANDBOX_CONTROL_FAMILIES.includes(value as SandboxControlFamily);
102
218
  }