@fitlab-ai/agent-infra 0.9.2 → 0.9.4

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 +12 -9
  2. package/README.zh-CN.md +12 -9
  3. package/bin/cli.ts +12 -0
  4. package/dist/bin/cli.js +14 -0
  5. package/dist/bin/internal-cli.js +134 -108
  6. package/dist/lib/agent-clients/adapter.js +137 -4
  7. package/dist/lib/agent-clients/adapters/antigravity-cli.js +64 -0
  8. package/dist/lib/{sandbox/credentials.js → agent-clients/adapters/claude-code-credentials.js} +4 -14
  9. package/dist/lib/agent-clients/adapters/claude-code-refresh.js +85 -0
  10. package/dist/lib/agent-clients/adapters/claude-code-sandbox.js +247 -0
  11. package/dist/lib/agent-clients/adapters/claude-code.js +27 -4
  12. package/dist/lib/agent-clients/adapters/codex.js +9 -0
  13. package/dist/lib/agent-clients/adapters/index.js +2 -2
  14. package/dist/lib/agent-clients/adapters/opencode-sandbox.js +108 -0
  15. package/dist/lib/agent-clients/adapters/opencode.js +24 -3
  16. package/dist/lib/agent-clients/adapters/runtimes/claude-code.dockerfile +65 -0
  17. package/dist/lib/agent-clients/config.js +42 -4
  18. package/dist/lib/agent-clients/next-steps.js +11 -2
  19. package/dist/lib/agent-clients/reconcile.js +2 -1
  20. package/dist/lib/agent-clients/registry.js +16 -2
  21. package/dist/lib/agent-clients/schema.js +18 -0
  22. package/dist/lib/agent-clients/tokens.js +49 -0
  23. package/dist/lib/agent-clients/types.js +1 -1
  24. package/dist/lib/defaults.json +1 -1
  25. package/dist/lib/git/workflow.js +54 -1
  26. package/dist/lib/internal/agent-client.js +61 -4
  27. package/dist/lib/internal/git-workflow.js +6 -1
  28. package/dist/lib/internal/platform-checks.js +3 -3
  29. package/dist/lib/internal/platform-comment.js +29 -2
  30. package/dist/lib/internal/platform-issue.js +7 -0
  31. package/dist/lib/internal/platform-pr-review.js +132 -0
  32. package/dist/lib/internal/platform-pr.js +20 -2
  33. package/dist/lib/internal/platform-release-notes.js +52 -16
  34. package/dist/lib/internal/pr-review-grade.js +140 -0
  35. package/dist/lib/internal/release-workflow.js +13 -6
  36. package/dist/lib/internal/sandbox-control.js +24 -0
  37. package/dist/lib/internal/task-activity.js +105 -0
  38. package/dist/lib/internal/task-event.js +17 -1
  39. package/dist/lib/internal/task-ledger.js +12 -3
  40. package/dist/lib/internal/task-lifecycle.js +26 -1
  41. package/dist/lib/internal/task-orchestration.js +167 -18
  42. package/dist/lib/internal/task-review.js +8 -3
  43. package/dist/lib/platform/adapters.js +8 -1
  44. package/dist/lib/platform/completion-backfill.js +122 -0
  45. package/dist/lib/platform/github-client.js +19 -2
  46. package/dist/lib/platform/issue-comments.js +3 -2
  47. package/dist/lib/platform/merged-pr-equivalence.js +115 -5
  48. package/dist/lib/platform/pr-checks.js +65 -42
  49. package/dist/lib/platform/pr-review.js +166 -0
  50. package/dist/lib/platform/pull-requests.js +371 -4
  51. package/dist/lib/platform/release-notes.js +85 -3
  52. package/dist/lib/platform/releases.js +13 -5
  53. package/dist/lib/pr-review/evidence-grading.js +229 -0
  54. package/dist/lib/process-data/index.js +239 -0
  55. package/dist/lib/process-data/normalize.js +198 -0
  56. package/dist/lib/process-data/privacy.js +33 -0
  57. package/dist/lib/process-data/reconcile.js +95 -0
  58. package/dist/lib/process-data/repair.js +58 -0
  59. package/dist/lib/process-data/sources.js +345 -0
  60. package/dist/lib/process-data/store.js +282 -0
  61. package/dist/lib/process-data/types.js +2 -0
  62. package/dist/lib/run/index.js +4 -3
  63. package/dist/lib/run/tui.js +10 -13
  64. package/dist/lib/sandbox/agent-client-reconciler.js +26 -2
  65. package/dist/lib/sandbox/capture.js +7 -2
  66. package/dist/lib/sandbox/commands/create.js +109 -248
  67. package/dist/lib/sandbox/commands/enter.js +15 -47
  68. package/dist/lib/sandbox/commands/list-running.js +16 -6
  69. package/dist/lib/sandbox/commands/ls.js +10 -6
  70. package/dist/lib/sandbox/commands/rebuild.js +4 -3
  71. package/dist/lib/sandbox/commands/refresh.js +4 -84
  72. package/dist/lib/sandbox/commands/rm.js +24 -3
  73. package/dist/lib/sandbox/commands/show.js +13 -4
  74. package/dist/lib/sandbox/commands/start.js +7 -4
  75. package/dist/lib/sandbox/config.js +2 -0
  76. package/dist/lib/sandbox/constants.js +6 -0
  77. package/dist/lib/sandbox/control/client.js +44 -0
  78. package/dist/lib/sandbox/control/protocol.js +35 -0
  79. package/dist/lib/sandbox/control/server.js +109 -0
  80. package/dist/lib/sandbox/dockerfile.js +36 -13
  81. package/dist/lib/sandbox/mounts.js +17 -4
  82. package/dist/lib/sandbox/recovery.js +128 -5
  83. package/dist/lib/sandbox/redaction.js +12 -0
  84. package/dist/lib/sandbox/runtimes/base.dockerfile +24 -74
  85. package/dist/lib/sandbox/workspace-identity.js +95 -0
  86. package/dist/lib/sandbox/workspace-view.js +103 -0
  87. package/dist/lib/task/activity-intent.js +307 -0
  88. package/dist/lib/task/artifact-lifecycle.js +2 -1
  89. package/dist/lib/task/commands/log.js +15 -14
  90. package/dist/lib/task/commit-finalization.js +267 -0
  91. package/dist/lib/task/commit-intent.js +165 -0
  92. package/dist/lib/task/decision-intents.js +31 -17
  93. package/dist/lib/task/delegation-receipts.js +25 -4
  94. package/dist/lib/task/events.js +67 -28
  95. package/dist/lib/task/finalization-artifacts.js +35 -0
  96. package/dist/lib/task/implementation-inputs.js +54 -7
  97. package/dist/lib/task/ledger-intents.js +35 -1
  98. package/dist/lib/task/lifecycle-execution.js +46 -0
  99. package/dist/lib/task/orchestration.js +753 -54
  100. package/dist/lib/task/resolve-ref.js +41 -1
  101. package/dist/lib/task/review-finalization.js +29 -9
  102. package/dist/lib/task/task-execution-lock.js +231 -0
  103. package/dist/lib/task/verification-checks.js +1 -1
  104. package/dist/lib/task/verification-engine.js +218 -2
  105. package/dist/lib/task/verification.js +4 -3
  106. package/dist/lib/task/workspace-snapshot.js +17 -5
  107. package/lib/agent-clients/adapter.ts +201 -4
  108. package/lib/agent-clients/adapters/antigravity-cli.ts +65 -0
  109. package/lib/{sandbox/credentials.ts → agent-clients/adapters/claude-code-credentials.ts} +3 -18
  110. package/lib/agent-clients/adapters/claude-code-refresh.ts +128 -0
  111. package/lib/agent-clients/adapters/claude-code-sandbox.ts +295 -0
  112. package/lib/agent-clients/adapters/claude-code.ts +31 -4
  113. package/lib/agent-clients/adapters/codex.ts +9 -0
  114. package/lib/agent-clients/adapters/index.ts +2 -2
  115. package/lib/agent-clients/adapters/opencode-sandbox.ts +136 -0
  116. package/lib/agent-clients/adapters/opencode.ts +27 -3
  117. package/lib/agent-clients/adapters/runtimes/claude-code.dockerfile +65 -0
  118. package/lib/agent-clients/config.ts +49 -4
  119. package/lib/agent-clients/next-steps.ts +15 -2
  120. package/lib/agent-clients/reconcile.ts +2 -1
  121. package/lib/agent-clients/registry.ts +19 -1
  122. package/lib/agent-clients/schema.ts +18 -0
  123. package/lib/agent-clients/tokens.ts +53 -0
  124. package/lib/agent-clients/types.ts +15 -1
  125. package/lib/defaults.json +1 -1
  126. package/lib/git/workflow.ts +66 -2
  127. package/lib/internal/agent-client.ts +59 -4
  128. package/lib/internal/git-workflow.ts +5 -1
  129. package/lib/internal/platform-checks.ts +4 -4
  130. package/lib/internal/platform-comment.ts +17 -2
  131. package/lib/internal/platform-issue.ts +4 -0
  132. package/lib/internal/platform-pr-review.ts +104 -0
  133. package/lib/internal/platform-pr.ts +14 -1
  134. package/lib/internal/platform-release-notes.ts +59 -16
  135. package/lib/internal/pr-review-grade.ts +130 -0
  136. package/lib/internal/release-workflow.ts +13 -6
  137. package/lib/internal/sandbox-control.ts +24 -0
  138. package/lib/internal/task-activity.ts +91 -0
  139. package/lib/internal/task-event.ts +9 -1
  140. package/lib/internal/task-ledger.ts +12 -3
  141. package/lib/internal/task-lifecycle.ts +26 -1
  142. package/lib/internal/task-orchestration.ts +123 -14
  143. package/lib/internal/task-review.ts +8 -3
  144. package/lib/platform/adapters.ts +29 -2
  145. package/lib/platform/completion-backfill.ts +134 -0
  146. package/lib/platform/github-client.ts +20 -2
  147. package/lib/platform/issue-comments.ts +3 -2
  148. package/lib/platform/merged-pr-equivalence.ts +127 -5
  149. package/lib/platform/pr-checks.ts +73 -46
  150. package/lib/platform/pr-review.ts +201 -0
  151. package/lib/platform/pull-requests.ts +444 -3
  152. package/lib/platform/release-notes.ts +100 -4
  153. package/lib/platform/releases.ts +16 -4
  154. package/lib/pr-review/evidence-grading.ts +318 -0
  155. package/lib/process-data/index.ts +224 -0
  156. package/lib/process-data/normalize.ts +202 -0
  157. package/lib/process-data/privacy.ts +41 -0
  158. package/lib/process-data/reconcile.ts +110 -0
  159. package/lib/process-data/repair.ts +64 -0
  160. package/lib/process-data/sources.ts +354 -0
  161. package/lib/process-data/store.ts +315 -0
  162. package/lib/process-data/types.ts +135 -0
  163. package/lib/run/index.ts +5 -3
  164. package/lib/run/tui.ts +14 -12
  165. package/lib/sandbox/agent-client-reconciler.ts +44 -2
  166. package/lib/sandbox/capture.ts +9 -2
  167. package/lib/sandbox/commands/create.ts +126 -280
  168. package/lib/sandbox/commands/enter.ts +13 -59
  169. package/lib/sandbox/commands/list-running.ts +23 -6
  170. package/lib/sandbox/commands/ls.ts +22 -6
  171. package/lib/sandbox/commands/rebuild.ts +4 -3
  172. package/lib/sandbox/commands/refresh.ts +4 -126
  173. package/lib/sandbox/commands/rm.ts +24 -3
  174. package/lib/sandbox/commands/show.ts +30 -4
  175. package/lib/sandbox/commands/start.ts +6 -4
  176. package/lib/sandbox/config.ts +4 -0
  177. package/lib/sandbox/constants.ts +8 -0
  178. package/lib/sandbox/control/client.ts +55 -0
  179. package/lib/sandbox/control/protocol.ts +75 -0
  180. package/lib/sandbox/control/server.ts +117 -0
  181. package/lib/sandbox/dockerfile.ts +66 -13
  182. package/lib/sandbox/mounts.ts +24 -4
  183. package/lib/sandbox/recovery.ts +163 -6
  184. package/lib/sandbox/redaction.ts +14 -0
  185. package/lib/sandbox/runtimes/base.dockerfile +24 -74
  186. package/lib/sandbox/tool-types.ts +16 -0
  187. package/lib/sandbox/workspace-identity.ts +123 -0
  188. package/lib/sandbox/workspace-view.ts +143 -0
  189. package/lib/server/server.schema.json +2 -2
  190. package/lib/task/activity-intent.ts +417 -0
  191. package/lib/task/artifact-lifecycle.ts +2 -1
  192. package/lib/task/commands/log.ts +15 -14
  193. package/lib/task/commit-finalization.ts +356 -0
  194. package/lib/task/commit-intent.ts +230 -0
  195. package/lib/task/decision-intents.ts +32 -12
  196. package/lib/task/delegation-receipts.ts +34 -5
  197. package/lib/task/events.ts +75 -30
  198. package/lib/task/finalization-artifacts.ts +58 -0
  199. package/lib/task/implementation-inputs.ts +62 -8
  200. package/lib/task/ledger-intents.ts +43 -3
  201. package/lib/task/lifecycle-execution.ts +106 -0
  202. package/lib/task/orchestration.ts +1019 -72
  203. package/lib/task/resolve-ref.ts +46 -1
  204. package/lib/task/review-finalization.ts +40 -9
  205. package/lib/task/task-execution-lock.ts +296 -0
  206. package/lib/task/verification-checks.ts +1 -1
  207. package/lib/task/verification-engine.ts +249 -2
  208. package/lib/task/verification.ts +5 -3
  209. package/lib/task/workspace-snapshot.ts +26 -5
  210. package/package.json +3 -3
  211. package/templates/.agents/QUICKSTART.en.md +25 -8
  212. package/templates/.agents/QUICKSTART.zh-CN.md +25 -8
  213. package/templates/.agents/README.en.md +10 -7
  214. package/templates/.agents/README.zh-CN.md +10 -7
  215. package/templates/.agents/hooks/lifecycle-delegation.js +15 -4
  216. package/templates/.agents/rules/README.en.md +1 -1
  217. package/templates/.agents/rules/README.zh-CN.md +1 -1
  218. package/templates/.agents/rules/create-issue.github.en.md +4 -2
  219. package/templates/.agents/rules/create-issue.github.zh-CN.md +4 -2
  220. package/templates/.agents/rules/human-decision-context.en.md +11 -2
  221. package/templates/.agents/rules/human-decision-context.zh-CN.md +11 -2
  222. package/templates/.agents/rules/issue-fields.github.en.md +3 -1
  223. package/templates/.agents/rules/issue-fields.github.zh-CN.md +3 -1
  224. package/templates/.agents/rules/issue-pr-commands.en.md +5 -3
  225. package/templates/.agents/rules/issue-pr-commands.github.en.md +5 -3
  226. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +5 -3
  227. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +5 -3
  228. package/templates/.agents/rules/issue-sync.github.en.md +7 -3
  229. package/templates/.agents/rules/issue-sync.github.zh-CN.md +8 -4
  230. package/templates/.agents/rules/lifecycle-orchestration.en.md +5 -2
  231. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +5 -2
  232. package/templates/.agents/rules/milestone-inference.github.en.md +4 -2
  233. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +4 -2
  234. package/templates/.agents/rules/next-step-output.en.md +3 -1
  235. package/templates/.agents/rules/next-step-output.zh-CN.md +3 -1
  236. package/templates/.agents/rules/no-mid-flow-questions.en.md +17 -0
  237. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +17 -0
  238. package/templates/.agents/rules/pr-checks-commands.en.md +3 -3
  239. package/templates/.agents/rules/pr-checks-commands.github.en.md +2 -2
  240. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +3 -3
  241. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +3 -3
  242. package/templates/.agents/rules/pr-sync.en.md +3 -1
  243. package/templates/.agents/rules/pr-sync.github.en.md +11 -1
  244. package/templates/.agents/rules/pr-sync.github.zh-CN.md +11 -1
  245. package/templates/.agents/rules/pr-sync.zh-CN.md +3 -1
  246. package/templates/.agents/rules/release-commands.en.md +1 -1
  247. package/templates/.agents/rules/release-commands.github.en.md +12 -2
  248. package/templates/.agents/rules/release-commands.github.zh-CN.md +12 -2
  249. package/templates/.agents/rules/release-commands.zh-CN.md +1 -1
  250. package/templates/.agents/rules/review-handshake.zh-CN.md +1 -1
  251. package/templates/.agents/rules/task-management.en.md +13 -0
  252. package/templates/.agents/rules/task-management.zh-CN.md +13 -0
  253. package/templates/.agents/skills/analyze-task/SKILL.en.md +10 -7
  254. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +10 -7
  255. package/templates/.agents/skills/block-task/SKILL.en.md +7 -5
  256. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +7 -5
  257. package/templates/.agents/skills/cancel-task/SKILL.en.md +6 -4
  258. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +6 -4
  259. package/templates/.agents/skills/close-codescan/SKILL.en.md +3 -1
  260. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +3 -1
  261. package/templates/.agents/skills/close-dependabot/SKILL.en.md +3 -1
  262. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +3 -1
  263. package/templates/.agents/skills/code-task/SKILL.en.md +10 -7
  264. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +12 -9
  265. package/templates/.agents/skills/commit/SKILL.en.md +23 -11
  266. package/templates/.agents/skills/commit/SKILL.zh-CN.md +29 -11
  267. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -1
  268. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -1
  269. package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +49 -0
  270. package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +55 -0
  271. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
  272. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
  273. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +1 -1
  274. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +1 -1
  275. package/templates/.agents/skills/commit/reference/task-status-update.en.md +4 -4
  276. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +4 -4
  277. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +6 -4
  278. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +6 -4
  279. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +1 -1
  280. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +1 -1
  281. package/templates/.agents/skills/complete-task/SKILL.en.md +22 -7
  282. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +22 -7
  283. package/templates/.agents/skills/complete-task/config/verify.en.json +1 -0
  284. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +1 -0
  285. package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +17 -0
  286. package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +17 -0
  287. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -5
  288. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -5
  289. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +1 -1
  290. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +1 -1
  291. package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -16
  292. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +17 -16
  293. package/templates/.agents/skills/create-task/SKILL.en.md +5 -3
  294. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +5 -3
  295. package/templates/.agents/skills/create-task/reference/context-capture.en.md +34 -0
  296. package/templates/.agents/skills/create-task/reference/context-capture.zh-CN.md +34 -0
  297. package/templates/.agents/skills/import-issue/SKILL.en.md +5 -3
  298. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +5 -3
  299. package/templates/.agents/skills/plan-task/SKILL.en.md +8 -5
  300. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +8 -5
  301. package/templates/.agents/skills/post-release/SKILL.en.md +2 -0
  302. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +2 -0
  303. package/templates/.agents/skills/release/SKILL.en.md +16 -10
  304. package/templates/.agents/skills/release/SKILL.zh-CN.md +16 -10
  305. package/templates/.agents/skills/restore-task/SKILL.en.md +4 -1
  306. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +4 -1
  307. package/templates/.agents/skills/review-analysis/SKILL.en.md +7 -4
  308. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +7 -4
  309. package/templates/.agents/skills/review-code/SKILL.en.md +11 -8
  310. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +11 -8
  311. package/templates/.agents/skills/review-code/reference/output-templates.en.md +1 -1
  312. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +1 -1
  313. package/templates/.agents/skills/review-plan/SKILL.en.md +7 -4
  314. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +7 -4
  315. package/templates/.agents/skills/review-pr/SKILL.en.md +186 -0
  316. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +186 -0
  317. package/templates/.agents/skills/review-pr/config/verify.en.json +37 -0
  318. package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +37 -0
  319. package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +65 -0
  320. package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +65 -0
  321. package/templates/.agents/skills/review-pr/reference/output-guidance.en.md +18 -0
  322. package/templates/.agents/skills/review-pr/reference/output-guidance.zh-CN.md +18 -0
  323. package/templates/.agents/skills/review-pr/reference/report-template.en.md +85 -0
  324. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +85 -0
  325. package/templates/.agents/skills/run-task/SKILL.en.md +8 -8
  326. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +8 -8
  327. package/templates/.agents/skills/run-task/config/verify.en.json +2 -1
  328. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +2 -1
  329. package/templates/.agents/skills/run-task/reference/host-validation.en.md +20 -0
  330. package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +20 -0
  331. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +98 -107
  332. package/templates/.agents/skills/watch-pr/SKILL.en.md +13 -13
  333. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +13 -13
  334. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +27 -6
  335. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +26 -5
  336. package/templates/.agents/templates/task.en.md +2 -2
  337. package/templates/.agents/templates/task.zh-CN.md +2 -2
  338. package/templates/.agents/workflows/bug-fix.en.yaml +3 -3
  339. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +3 -3
  340. package/templates/.agents/workflows/code-review.en.yaml +1 -1
  341. package/templates/.agents/workflows/code-review.zh-CN.yaml +1 -1
  342. package/templates/.agents/workflows/feature-development.en.yaml +4 -4
  343. package/templates/.agents/workflows/feature-development.zh-CN.yaml +4 -4
  344. package/templates/.agents/workflows/refactoring.en.yaml +3 -3
  345. package/templates/.agents/workflows/refactoring.zh-CN.yaml +3 -3
  346. package/templates/.claude/commands/post-release.en.md +1 -0
  347. package/templates/.claude/commands/post-release.zh-CN.md +1 -0
  348. package/templates/.claude/commands/review-pr.en.md +8 -0
  349. package/templates/.claude/commands/review-pr.zh-CN.md +8 -0
  350. package/templates/.claude/commands/watch-pr.en.md +1 -1
  351. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  352. package/templates/.claude/rules/tool-preferences.en.md +20 -0
  353. package/templates/.claude/rules/tool-preferences.zh-CN.md +20 -0
  354. package/templates/.opencode/commands/post-release.en.md +2 -0
  355. package/templates/.opencode/commands/post-release.zh-CN.md +2 -0
  356. package/templates/.opencode/commands/review-pr.en.md +11 -0
  357. package/templates/.opencode/commands/review-pr.zh-CN.md +11 -0
  358. package/templates/.opencode/commands/watch-pr.en.md +1 -1
  359. package/templates/.opencode/commands/watch-pr.zh-CN.md +1 -1
  360. package/dist/lib/agent-clients/adapters/gemini-cli.js +0 -64
  361. package/lib/agent-clients/adapters/gemini-cli.ts +0 -65
  362. package/templates/.gemini/commands/_project_/analyze-task.en.toml +0 -10
  363. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +0 -10
  364. package/templates/.gemini/commands/_project_/archive-tasks.en.toml +0 -10
  365. package/templates/.gemini/commands/_project_/archive-tasks.zh-CN.toml +0 -10
  366. package/templates/.gemini/commands/_project_/block-task.en.toml +0 -10
  367. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +0 -10
  368. package/templates/.gemini/commands/_project_/cancel-task.en.toml +0 -10
  369. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +0 -10
  370. package/templates/.gemini/commands/_project_/check-task.en.toml +0 -10
  371. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +0 -10
  372. package/templates/.gemini/commands/_project_/close-codescan.en.toml +0 -8
  373. package/templates/.gemini/commands/_project_/close-codescan.zh-CN.toml +0 -8
  374. package/templates/.gemini/commands/_project_/close-dependabot.en.toml +0 -8
  375. package/templates/.gemini/commands/_project_/close-dependabot.zh-CN.toml +0 -8
  376. package/templates/.gemini/commands/_project_/code-task.en.toml +0 -10
  377. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +0 -10
  378. package/templates/.gemini/commands/_project_/commit.en.toml +0 -10
  379. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +0 -10
  380. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +0 -10
  381. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +0 -10
  382. package/templates/.gemini/commands/_project_/complete-task.en.toml +0 -10
  383. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +0 -10
  384. package/templates/.gemini/commands/_project_/create-pr.en.toml +0 -10
  385. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +0 -10
  386. package/templates/.gemini/commands/_project_/create-release-note.en.toml +0 -8
  387. package/templates/.gemini/commands/_project_/create-release-note.zh-CN.toml +0 -8
  388. package/templates/.gemini/commands/_project_/create-task.en.toml +0 -8
  389. package/templates/.gemini/commands/_project_/create-task.zh-CN.toml +0 -8
  390. package/templates/.gemini/commands/_project_/import-codescan.en.toml +0 -8
  391. package/templates/.gemini/commands/_project_/import-codescan.zh-CN.toml +0 -8
  392. package/templates/.gemini/commands/_project_/import-dependabot.en.toml +0 -8
  393. package/templates/.gemini/commands/_project_/import-dependabot.zh-CN.toml +0 -8
  394. package/templates/.gemini/commands/_project_/import-issue.en.toml +0 -8
  395. package/templates/.gemini/commands/_project_/import-issue.zh-CN.toml +0 -8
  396. package/templates/.gemini/commands/_project_/init-labels.en.toml +0 -8
  397. package/templates/.gemini/commands/_project_/init-labels.zh-CN.toml +0 -8
  398. package/templates/.gemini/commands/_project_/init-milestones.en.toml +0 -10
  399. package/templates/.gemini/commands/_project_/init-milestones.zh-CN.toml +0 -10
  400. package/templates/.gemini/commands/_project_/plan-task.en.toml +0 -10
  401. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +0 -10
  402. package/templates/.gemini/commands/_project_/post-release.en.toml +0 -6
  403. package/templates/.gemini/commands/_project_/post-release.zh-CN.toml +0 -6
  404. package/templates/.gemini/commands/_project_/refine-title.en.toml +0 -8
  405. package/templates/.gemini/commands/_project_/refine-title.zh-CN.toml +0 -8
  406. package/templates/.gemini/commands/_project_/release.en.toml +0 -8
  407. package/templates/.gemini/commands/_project_/release.zh-CN.toml +0 -8
  408. package/templates/.gemini/commands/_project_/restore-task.en.toml +0 -8
  409. package/templates/.gemini/commands/_project_/restore-task.zh-CN.toml +0 -8
  410. package/templates/.gemini/commands/_project_/review-analysis.en.toml +0 -10
  411. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +0 -10
  412. package/templates/.gemini/commands/_project_/review-code.en.toml +0 -10
  413. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +0 -10
  414. package/templates/.gemini/commands/_project_/review-plan.en.toml +0 -10
  415. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +0 -10
  416. package/templates/.gemini/commands/_project_/run-task.en.toml +0 -8
  417. package/templates/.gemini/commands/_project_/run-task.zh-CN.toml +0 -8
  418. package/templates/.gemini/commands/_project_/test-integration.en.toml +0 -6
  419. package/templates/.gemini/commands/_project_/test-integration.zh-CN.toml +0 -6
  420. package/templates/.gemini/commands/_project_/test.en.toml +0 -6
  421. package/templates/.gemini/commands/_project_/test.zh-CN.toml +0 -6
  422. package/templates/.gemini/commands/_project_/update-agent-infra.en.toml +0 -6
  423. package/templates/.gemini/commands/_project_/update-agent-infra.zh-CN.toml +0 -6
  424. package/templates/.gemini/commands/_project_/upgrade-dependency.en.toml +0 -8
  425. package/templates/.gemini/commands/_project_/upgrade-dependency.zh-CN.toml +0 -8
  426. package/templates/.gemini/commands/_project_/watch-pr.en.toml +0 -10
  427. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +0 -10
  428. package/templates/.gemini/settings.json +0 -3
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <h1 align="center">Agent Infra</h1>
6
6
 
7
7
  <p align="center">
8
- Collaboration infrastructure for AI coding agents — skills, workflows, and sandboxes for Claude Code, Codex, Gemini CLI, and OpenCode.
8
+ Collaboration infrastructure for AI coding agents — skills, workflows, and sandboxes for Claude Code, Codex, Antigravity CLI, and OpenCode.
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -28,7 +28,7 @@
28
28
 
29
29
  ## Why agent-infra?
30
30
 
31
- Teams increasingly mix Claude Code, Codex, Gemini CLI, OpenCode, and other AI TUIs in the same repository, but each tool tends to introduce its own commands, prompts, and local conventions. Without a shared layer, the result is fragmented workflows, duplicated setup, and task history that is difficult to audit.
31
+ Teams increasingly mix Claude Code, Codex, Antigravity CLI, OpenCode, and other AI TUIs in the same repository, but each tool tends to introduce its own commands, prompts, and local conventions. Without a shared layer, the result is fragmented workflows, duplicated setup, and task history that is difficult to audit.
32
32
 
33
33
  agent-infra standardizes that shared infrastructure. It gives every supported AI TUI the same task lifecycle, the same skill vocabulary, the same project governance files, isolated development sandboxes, and the same upgrade path, so teams can switch tools without rebuilding process from scratch.
34
34
 
@@ -81,16 +81,17 @@ Just fix it at the application layer in LoginService.
81
81
 
82
82
  **11 commands. 1 natural-language correction. From issue to merged PR.** That is the entire SOP — programming can have a standard operating procedure too.
83
83
 
84
- Every command above works the same way in Claude Code, Codex, Gemini CLI, and OpenCode. Switch tools mid-task — the workflow state follows. For what each skill does under the hood, see [Built-in AI Skills](./docs/en/skills.md).
84
+ Every command above works the same way in Claude Code, Codex, Antigravity CLI, and OpenCode. Switch tools mid-task — the workflow state follows. For what each skill does under the hood, see [Built-in AI Skills](./docs/en/skills.md).
85
85
 
86
86
  ## Key Features
87
87
 
88
- - **Multi-AI collaboration**: one shared operating model for Claude Code, Codex, Gemini CLI, and OpenCode
88
+ - **Multi-AI collaboration**: one shared operating model for Claude Code, Codex, Antigravity CLI, and OpenCode
89
89
  - **Bootstrap CLI + skill-driven execution**: initialize once, then let AI skills drive day-to-day work
90
90
  - **IM command bridge**: route Feishu messages to built-ins, read-only task views, sandbox management, and controlled lifecycle skill runs
91
91
  - **Bilingual project docs**: English-first docs with synchronized Chinese translations
92
92
  - **Template-source architecture**: `templates/` mirrors the rendered project structure
93
93
  - **AI-assisted updates**: template changes can be merged while preserving project-specific customization
94
+ - **Auditable process-data archive**: preserve local tasks and GitHub evidence in append-only, verifiable snapshots
94
95
 
95
96
  ## Quick Start
96
97
 
@@ -153,7 +154,7 @@ Open the project in any AI TUI and run `update-agent-infra`:
153
154
  |-----|---------|
154
155
  | Claude Code | `/update-agent-infra` |
155
156
  | Codex | `$update-agent-infra` |
156
- | Gemini CLI | `/{{project}}:update-agent-infra` |
157
+ | Antigravity CLI | `/update-agent-infra` |
157
158
  | OpenCode | `/update-agent-infra` |
158
159
 
159
160
  This detects the packaged template version and renders all managed files. The same command is used both for first-time setup and for future template upgrades.
@@ -166,21 +167,23 @@ Manage the four built-in Agent Clients independently from the project lifecycle:
166
167
  ai agent-client list
167
168
  ai agent-client status
168
169
  ai agent-client enable codex
169
- ai agent-client disable gemini-cli
170
+ ai agent-client disable antigravity-cli
170
171
  ai agent-client configure
171
172
  ```
172
173
 
173
- The most-used lifecycle commands, in delivery order. The command prefix varies by TUI (`/skill` in Claude Code/OpenCode, `$skill` in Codex, `/{{project}}:skill` in Gemini CLI); the workflow semantics stay the same.
174
+ The most-used lifecycle commands, in delivery order. The command prefix varies by TUI (`/skill` in Claude Code/Antigravity/OpenCode and `$skill` in Codex); the workflow semantics stay the same.
174
175
 
175
176
  | Command | Purpose |
176
177
  |---------|---------|
177
178
  | `create-task` / `import-issue` | Start a task from a description or a GitHub Issue |
178
- | `run-task` | Resume and orchestrate the lifecycle in Claude Code with fresh isolated executors/reviewers until a safe commit or stable pause; Codex currently fails closed because its multi-agent runtime does not expose the required lifecycle events |
179
+ | `run-task` | Resume the lifecycle with fresh isolated executors/reviewers when the selected client exposes verified actual model/effort evidence; current built-in clients, including Claude Code and Codex, fail closed before delegation because their native start events do not expose all required evidence |
179
180
  | `analyze-task` → `review-analysis` | Capture scope and risks, then review the analysis |
180
181
  | `plan-task` → `review-plan` | Design the approach, then review the plan |
181
182
  | `code-task` → `review-code` | Implement and test, then run a structured code review |
182
183
  | `commit` → `create-pr` → `complete-task` | Commit, open a PR, and archive the task |
183
184
 
185
+ Start with one atomic role policy, for example: `$run-task 42 --executor-model <id> --executor-reasoning-effort <value> --reviewer-model <id> --reviewer-reasoning-effort <value>`. Both roles may use the same model. With no explicit policy, `run-task` reads the current Agent Client's optional `agentClients[].orchestration`; if neither source is complete, it shows the host model-selection guidance before creating any run. Re-entry uses the persisted v2 policy.
186
+
184
187
  See the full catalog — task status, release, security, and project-maintenance skills — in [Built-in AI Skills](./docs/en/skills.md).
185
188
 
186
189
  ## What You Get
@@ -196,7 +199,6 @@ my-project/
196
199
  │ ├── workflows/ # 4 prebuilt workflows
197
200
  │ └── templates/ # Task and artifact templates
198
201
  ├── .claude/ # Claude Code config and commands
199
- ├── .gemini/ # Gemini CLI config and commands
200
202
  ├── .opencode/ # OpenCode config and commands
201
203
  └── AGENTS.md # Universal AI agent instructions
202
204
  ```
@@ -205,6 +207,7 @@ my-project/
205
207
 
206
208
  In-depth guides live under [`docs/en/`](./docs/en/README.md):
207
209
 
210
+ - [Process Data Archive](./docs/en/process-data.md) — capture, verify, audit, repair, export, privacy, and backup guidance
208
211
  - [Architecture Overview](./docs/en/architecture.md) — bootstrap CLI, end-to-end flow, layered architecture
209
212
  - [Platform Support](./docs/en/platform-support.md) — macOS, Linux, Windows; sandbox engines and resources
210
213
  - [Sandbox](./docs/en/sandbox.md) — sandbox aliases, host-sandbox file exchange, user-level dotfiles channel
package/README.zh-CN.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <h1 align="center">Agent Infra</h1>
6
6
 
7
7
  <p align="center">
8
- AI 编程代理的协作基础设施 —— 为 Claude Code、Codex、Gemini CLI、OpenCode 提供 skills、工作流和沙箱。
8
+ AI 编程代理的协作基础设施 —— 为 Claude Code、Codex、Antigravity CLI、OpenCode 提供 skills、工作流和沙箱。
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -28,7 +28,7 @@
28
28
 
29
29
  ## 为什么需要 agent-infra?
30
30
 
31
- 越来越多的团队会在同一个仓库里混用 Claude Code、Codex、Gemini CLI、OpenCode 等 AI TUI,但每个工具往往都会带来自己的命令体系、提示词习惯和本地约定。缺少共享层时,结果通常是工作流割裂、初始化重复、任务历史难以追踪。
31
+ 越来越多的团队会在同一个仓库里混用 Claude Code、Codex、Antigravity CLI、OpenCode 等 AI TUI,但每个工具往往都会带来自己的命令体系、提示词习惯和本地约定。缺少共享层时,结果通常是工作流割裂、初始化重复、任务历史难以追踪。
32
32
 
33
33
  agent-infra 的目标就是把这层共享基础设施标准化。它为所有支持的 AI TUI 提供统一的任务生命周期、统一的 skill 词汇、统一的项目治理文件、隔离的开发沙箱以及统一的升级路径,让团队切换工具时不必重新发明流程。
34
34
 
@@ -80,16 +80,17 @@ agent-infra 的目标就是把这层共享基础设施标准化。它为所有
80
80
 
81
81
  **11 条命令,1 次自然语言纠正,从 Issue 到合并 PR。** 这就是完整的 SOP —— 编程也可以有标准作业流程。
82
82
 
83
- 以上每条命令在 Claude Code、Codex、Gemini CLI、OpenCode 中完全通用。任务进行到一半切换工具,工作流状态照常延续。每个 skill 背后做了什么,见 [内置 AI Skills](./docs/zh-CN/skills.md)。
83
+ 以上每条命令在 Claude Code、Codex、Antigravity CLI、OpenCode 中完全通用。任务进行到一半切换工具,工作流状态照常延续。每个 skill 背后做了什么,见 [内置 AI Skills](./docs/zh-CN/skills.md)。
84
84
 
85
85
  ## 核心特性
86
86
 
87
- - **多 AI 协作**:为 Claude Code、Codex、Gemini CLI、OpenCode 提供统一的协作模型
87
+ - **多 AI 协作**:为 Claude Code、Codex、Antigravity CLI、OpenCode 提供统一的协作模型
88
88
  - **引导 CLI + skill 驱动执行**:初始化一次,后续日常操作交给 AI skills
89
89
  - **IM 命令桥接**:把飞书消息路由到内置命令、任务只读视图、沙箱管理和受控生命周期 skill 执行
90
90
  - **双语文档**:英文为主文档,配套同步的中文版本
91
91
  - **模板源架构**:`templates/` 目录镜像最终渲染出的项目结构
92
92
  - **AI 辅助升级**:模板升级时可合并变更,同时尽量保留项目侧定制
93
+ - **可审计的过程数据归档**:把本地任务与 GitHub 证据保存为只追加、可校验的快照
93
94
 
94
95
  ## 快速开始
95
96
 
@@ -152,7 +153,7 @@ CLI 会收集项目元数据,让你选择启用的 Agent Client,为其安装
152
153
  |-----|------|
153
154
  | Claude Code | `/update-agent-infra` |
154
155
  | Codex | `$update-agent-infra` |
155
- | Gemini CLI | `/{{project}}:update-agent-infra` |
156
+ | Antigravity CLI | `/update-agent-infra` |
156
157
  | OpenCode | `/update-agent-infra` |
157
158
 
158
159
  该命令会检测当前打包模板版本并渲染所有受管理文件。首次安装和后续升级都使用同一条命令。
@@ -165,21 +166,23 @@ CLI 会收集项目元数据,让你选择启用的 Agent Client,为其安装
165
166
  ai agent-client list
166
167
  ai agent-client status
167
168
  ai agent-client enable codex
168
- ai agent-client disable gemini-cli
169
+ ai agent-client disable antigravity-cli
169
170
  ai agent-client configure
170
171
  ```
171
172
 
172
- 最常用的生命周期命令,按交付顺序排列。命令前缀因 TUI 而异(Claude Code/OpenCode 用 `/skill`,Codex 用 `$skill`,Gemini CLI 用 `/{{project}}:skill`),工作流语义保持一致。
173
+ 最常用的生命周期命令,按交付顺序排列。命令前缀因 TUI 而异(Claude Code/Antigravity/OpenCode 用 `/skill`,Codex 用 `$skill`),工作流语义保持一致。
173
174
 
174
175
  | 命令 | 用途 |
175
176
  |------|------|
176
177
  | `create-task` / `import-issue` | 从描述或 GitHub Issue 创建任务 |
177
- | `run-task` | 在 Claude Code 中从当前状态续跑生命周期,用 fresh 隔离 executor/reviewer 推进到安全提交或稳定暂停;Codex 当前因多代理运行时未暴露所需生命周期事件而失败关闭 |
178
+ | `run-task` | 当所选客户端能提供已验证的 actual model/effort 证据时,用 fresh 隔离 executor/reviewer 续跑生命周期;当前内建客户端(含 Claude Code 与 Codex)因原生 start 事件未暴露全部必需证据,会在委派前失败关闭 |
178
179
  | `analyze-task` → `review-analysis` | 明确范围与风险,再审查分析 |
179
180
  | `plan-task` → `review-plan` | 设计实现路径,再审查方案 |
180
181
  | `code-task` → `review-code` | 实现并测试,再执行结构化代码审查 |
181
182
  | `commit` → `create-pr` → `complete-task` | 提交、创建 PR、归档任务 |
182
183
 
184
+ 启动时可提供原子角色策略,例如:`$run-task 42 --executor-model <id> --executor-reasoning-effort <值> --reviewer-model <id> --reviewer-reasoning-effort <值>`。两个角色可以使用同一模型。完全没有显式策略时,`run-task` 读取当前 Agent Client 可选的 `agentClients[].orchestration`;两个来源都不完整时,会在创建任何 run 前展示宿主模型选择指引。重入使用已持久化的 v2 策略。
185
+
183
186
  完整清单(任务状态、发布、安全、项目维护等 skill)见 [内置 AI Skills](./docs/zh-CN/skills.md)。
184
187
 
185
188
  ## 安装效果
@@ -195,7 +198,6 @@ my-project/
195
198
  │ ├── workflows/ # 4 个预置工作流
196
199
  │ └── templates/ # 任务与产物模板
197
200
  ├── .claude/ # Claude Code 配置与命令
198
- ├── .gemini/ # Gemini CLI 配置与命令
199
201
  ├── .opencode/ # OpenCode 配置与命令
200
202
  └── AGENTS.md # 通用 AI agent 指令
201
203
  ```
@@ -204,6 +206,7 @@ my-project/
204
206
 
205
207
  深度指南位于 [`docs/zh-CN/`](./docs/zh-CN/README.md):
206
208
 
209
+ - [过程数据归档](./docs/zh-CN/process-data.md) — 采集、校验、审计、修复、导出、隐私与备份指南
207
210
  - [架构概览](./docs/zh-CN/architecture.md) — 引导 CLI、端到端流程、分层架构
208
211
  - [平台支持](./docs/zh-CN/platform-support.md) — macOS、Linux、Windows;沙箱引擎与资源配置
209
212
  - [沙箱](./docs/zh-CN/sandbox.md) — 沙箱 aliases、宿主-沙箱文件交换、用户级 dotfiles 通道
package/bin/cli.ts CHANGED
@@ -17,6 +17,7 @@ Usage: ai <command> [options]
17
17
  Commands:
18
18
  agent-client List, inspect, enable, disable, or configure Agent Clients
19
19
  cp <ssh-alias> Copy local clipboard image to a remote macOS clipboard or Linux sandbox over SSH
20
+ data Capture, verify, audit, repair, and export process data
20
21
  decide Record a ruling; code-stage decisions require explicit implementation intent
21
22
  help Show this help message
22
23
  init Initialize a new project with update-agent-infra seed command
@@ -94,6 +95,17 @@ switch (command) {
94
95
  if (code) process.exitCode = code;
95
96
  break;
96
97
  }
98
+ case 'data': {
99
+ const imported = await importCommand('../lib/process-data/index.ts');
100
+ if (!imported) break;
101
+ const { cmdData } = imported;
102
+ const code = await cmdData(process.argv.slice(3)).catch((e: unknown) => {
103
+ process.stderr.write(`Error: ${errorMessage(e)}\n`);
104
+ return 1;
105
+ });
106
+ if (code) process.exitCode = code;
107
+ break;
108
+ }
97
109
  case 'decide': {
98
110
  const imported = await importCommand('../lib/decide.ts');
99
111
  if (!imported) break;
package/dist/bin/cli.js CHANGED
@@ -21,6 +21,7 @@ Usage: ai <command> [options]
21
21
  Commands:
22
22
  agent-client List, inspect, enable, disable, or configure Agent Clients
23
23
  cp <ssh-alias> Copy local clipboard image to a remote macOS clipboard or Linux sandbox over SSH
24
+ data Capture, verify, audit, repair, and export process data
24
25
  decide Record a ruling; code-stage decisions require explicit implementation intent
25
26
  help Show this help message
26
27
  init Initialize a new project with update-agent-infra seed command
@@ -96,6 +97,19 @@ switch (command) {
96
97
  process.exitCode = code;
97
98
  break;
98
99
  }
100
+ case 'data': {
101
+ const imported = await importCommand('../lib/process-data/index.ts');
102
+ if (!imported)
103
+ break;
104
+ const { cmdData } = imported;
105
+ const code = await cmdData(process.argv.slice(3)).catch((e) => {
106
+ process.stderr.write(`Error: ${errorMessage(e)}\n`);
107
+ return 1;
108
+ });
109
+ if (code)
110
+ process.exitCode = code;
111
+ break;
112
+ }
99
113
  case 'decide': {
100
114
  const imported = await importCommand('../lib/decide.ts');
101
115
  if (!imported)
@@ -5,114 +5,140 @@ if (major < 22 || (major === 22 && minor < 9)) {
5
5
  process.exit(1);
6
6
  }
7
7
  const command = process.argv[2] || '';
8
- switch (command) {
9
- case 'agent-client': {
10
- const { agentClient } = await import('../lib/internal/agent-client.js');
11
- agentClient(process.argv.slice(3));
12
- break;
13
- }
14
- case 'git-workflow': {
15
- const { gitWorkflow } = await import('../lib/internal/git-workflow.js');
16
- gitWorkflow(process.argv.slice(3));
17
- break;
18
- }
19
- case 'release-workflow': {
20
- const { releaseWorkflow } = await import('../lib/internal/release-workflow.js');
21
- await releaseWorkflow(process.argv.slice(3));
22
- break;
23
- }
24
- case 'platform-release-notes': {
25
- const { platformReleaseNotes } = await import('../lib/internal/platform-release-notes.js');
26
- platformReleaseNotes(process.argv.slice(3));
27
- break;
28
- }
29
- case 'platform-context': {
30
- const { platformContext } = await import('../lib/internal/platform-context.js');
31
- platformContext(process.argv.slice(3));
32
- break;
33
- }
34
- case 'platform-comment': {
35
- const { platformComment } = await import('../lib/internal/platform-comment.js');
36
- platformComment(process.argv.slice(3));
37
- break;
38
- }
39
- case 'platform-issue': {
40
- const { platformIssue } = await import('../lib/internal/platform-issue.js');
41
- platformIssue(process.argv.slice(3));
42
- break;
43
- }
44
- case 'platform-pr': {
45
- const { platformPr } = await import('../lib/internal/platform-pr.js');
46
- platformPr(process.argv.slice(3));
47
- break;
48
- }
49
- case 'platform-checks': {
50
- const { platformChecks } = await import('../lib/internal/platform-checks.js');
51
- await platformChecks(process.argv.slice(3));
52
- break;
53
- }
54
- case 'task-context': {
55
- const { taskContext } = await import('../lib/internal/task-context.js');
56
- taskContext(process.argv.slice(3));
57
- break;
58
- }
59
- case 'task-ledger': {
60
- const { taskLedger } = await import('../lib/internal/task-ledger.js');
61
- taskLedger(process.argv.slice(3));
62
- break;
63
- }
64
- case 'task-warning': {
65
- const { taskWarning } = await import('../lib/internal/task-warning.js');
66
- taskWarning(process.argv.slice(3));
67
- break;
68
- }
69
- case 'task-artifact': {
70
- const { taskArtifact } = await import('../lib/internal/task-artifact.js');
71
- taskArtifact(process.argv.slice(3));
72
- break;
73
- }
74
- case 'task-orchestration': {
75
- const { taskOrchestration } = await import('../lib/internal/task-orchestration.js');
76
- taskOrchestration(process.argv.slice(3));
77
- break;
78
- }
79
- case 'task-review': {
80
- const { taskReview } = await import('../lib/internal/task-review.js');
81
- taskReview(process.argv.slice(3));
82
- break;
83
- }
84
- case 'task-event': {
85
- const { taskEvent } = await import('../lib/internal/task-event.js');
86
- taskEvent(process.argv.slice(3));
87
- break;
88
- }
89
- case 'task-lifecycle': {
90
- const { taskLifecycle } = await import('../lib/internal/task-lifecycle.js');
91
- taskLifecycle(process.argv.slice(3));
92
- break;
93
- }
94
- case 'task-short-id': {
95
- const { taskShortId } = await import('../lib/internal/task-short-id.js');
96
- taskShortId(process.argv.slice(3));
97
- break;
98
- }
99
- case 'task-snapshot': {
100
- const { taskSnapshot } = await import('../lib/internal/task-snapshot.js');
101
- taskSnapshot(process.argv.slice(3));
102
- break;
103
- }
104
- case 'task-verify': {
105
- const { taskVerify } = await import('../lib/internal/task-verify.js');
106
- taskVerify(process.argv.slice(3));
107
- break;
108
- }
109
- default:
110
- process.stdout.write(`${JSON.stringify({
111
- status: 'failed',
112
- changed: false,
113
- error: { code: 'INTERNAL_COMMAND_INVALID', message: `unknown internal command '${command}'` }
114
- })}\n`);
115
- process.exitCode = 1;
8
+ if (process.env.AGENT_INFRA_CONTROL_TOKEN
9
+ && (command === 'task-lifecycle' || command === 'task-orchestration')) {
10
+ const { sandboxControl } = await import('../lib/internal/sandbox-control.js');
11
+ sandboxControl(['client', command, ...process.argv.slice(3)]);
116
12
  }
13
+ else
14
+ switch (command) {
15
+ case 'sandbox-control': {
16
+ const { sandboxControl } = await import('../lib/internal/sandbox-control.js');
17
+ sandboxControl(process.argv.slice(3));
18
+ break;
19
+ }
20
+ case 'agent-client': {
21
+ const { agentClient } = await import('../lib/internal/agent-client.js');
22
+ agentClient(process.argv.slice(3));
23
+ break;
24
+ }
25
+ case 'git-workflow': {
26
+ const { gitWorkflow } = await import('../lib/internal/git-workflow.js');
27
+ gitWorkflow(process.argv.slice(3));
28
+ break;
29
+ }
30
+ case 'release-workflow': {
31
+ const { releaseWorkflow } = await import('../lib/internal/release-workflow.js');
32
+ await releaseWorkflow(process.argv.slice(3));
33
+ break;
34
+ }
35
+ case 'platform-release-notes': {
36
+ const { platformReleaseNotes } = await import('../lib/internal/platform-release-notes.js');
37
+ platformReleaseNotes(process.argv.slice(3));
38
+ break;
39
+ }
40
+ case 'platform-context': {
41
+ const { platformContext } = await import('../lib/internal/platform-context.js');
42
+ platformContext(process.argv.slice(3));
43
+ break;
44
+ }
45
+ case 'platform-comment': {
46
+ const { platformComment } = await import('../lib/internal/platform-comment.js');
47
+ platformComment(process.argv.slice(3));
48
+ break;
49
+ }
50
+ case 'platform-issue': {
51
+ const { platformIssue } = await import('../lib/internal/platform-issue.js');
52
+ platformIssue(process.argv.slice(3));
53
+ break;
54
+ }
55
+ case 'platform-pr': {
56
+ const { platformPr } = await import('../lib/internal/platform-pr.js');
57
+ platformPr(process.argv.slice(3));
58
+ break;
59
+ }
60
+ case 'platform-pr-review': {
61
+ const { platformPrReview } = await import('../lib/internal/platform-pr-review.js');
62
+ platformPrReview(process.argv.slice(3));
63
+ break;
64
+ }
65
+ case 'pr-review-grade': {
66
+ const { prReviewGrade } = await import('../lib/internal/pr-review-grade.js');
67
+ prReviewGrade(process.argv.slice(3));
68
+ break;
69
+ }
70
+ case 'platform-checks': {
71
+ const { platformChecks } = await import('../lib/internal/platform-checks.js');
72
+ await platformChecks(process.argv.slice(3));
73
+ break;
74
+ }
75
+ case 'task-context': {
76
+ const { taskContext } = await import('../lib/internal/task-context.js');
77
+ taskContext(process.argv.slice(3));
78
+ break;
79
+ }
80
+ case 'task-ledger': {
81
+ const { taskLedger } = await import('../lib/internal/task-ledger.js');
82
+ taskLedger(process.argv.slice(3));
83
+ break;
84
+ }
85
+ case 'task-warning': {
86
+ const { taskWarning } = await import('../lib/internal/task-warning.js');
87
+ taskWarning(process.argv.slice(3));
88
+ break;
89
+ }
90
+ case 'task-activity': {
91
+ const { taskActivity } = await import('../lib/internal/task-activity.js');
92
+ taskActivity(process.argv.slice(3));
93
+ break;
94
+ }
95
+ case 'task-artifact': {
96
+ const { taskArtifact } = await import('../lib/internal/task-artifact.js');
97
+ taskArtifact(process.argv.slice(3));
98
+ break;
99
+ }
100
+ case 'task-orchestration': {
101
+ const { taskOrchestration } = await import('../lib/internal/task-orchestration.js');
102
+ taskOrchestration(process.argv.slice(3));
103
+ break;
104
+ }
105
+ case 'task-review': {
106
+ const { taskReview } = await import('../lib/internal/task-review.js');
107
+ taskReview(process.argv.slice(3));
108
+ break;
109
+ }
110
+ case 'task-event': {
111
+ const { taskEvent } = await import('../lib/internal/task-event.js');
112
+ taskEvent(process.argv.slice(3));
113
+ break;
114
+ }
115
+ case 'task-lifecycle': {
116
+ const { taskLifecycle } = await import('../lib/internal/task-lifecycle.js');
117
+ taskLifecycle(process.argv.slice(3));
118
+ break;
119
+ }
120
+ case 'task-short-id': {
121
+ const { taskShortId } = await import('../lib/internal/task-short-id.js');
122
+ taskShortId(process.argv.slice(3));
123
+ break;
124
+ }
125
+ case 'task-snapshot': {
126
+ const { taskSnapshot } = await import('../lib/internal/task-snapshot.js');
127
+ taskSnapshot(process.argv.slice(3));
128
+ break;
129
+ }
130
+ case 'task-verify': {
131
+ const { taskVerify } = await import('../lib/internal/task-verify.js');
132
+ taskVerify(process.argv.slice(3));
133
+ break;
134
+ }
135
+ default:
136
+ process.stdout.write(`${JSON.stringify({
137
+ status: 'failed',
138
+ changed: false,
139
+ error: { code: 'INTERNAL_COMMAND_INVALID', message: `unknown internal command '${command}'` }
140
+ })}\n`);
141
+ process.exitCode = 1;
142
+ }
117
143
  export {};
118
144
  //# sourceMappingURL=internal-cli.js.map
@@ -3,6 +3,43 @@ import { SANDBOX_HOOK_PHASES } from '../sandbox/tool-types.js';
3
3
  const PROJECT_ASSET_CATEGORIES = ['managed', 'merged', 'ejected'];
4
4
  const MAX_SANDBOX_HOOK_TIMEOUT_MS = 300_000;
5
5
  const TOOL_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
6
+ function freezeSandboxImageDescriptor(id, value) {
7
+ if (value === undefined)
8
+ return undefined;
9
+ const keys = value && typeof value === 'object' && !Array.isArray(value)
10
+ ? Object.keys(value)
11
+ : [];
12
+ const fragment = value?.dockerfileFragment;
13
+ const exclusions = value?.dotfilesExclusions;
14
+ const validExclusion = (entry) => {
15
+ if (typeof entry !== 'string'
16
+ || entry === ''
17
+ || entry.startsWith('/')
18
+ || entry.endsWith('/')
19
+ || entry.includes('\\')
20
+ || /[*?[\]]/.test(entry)) {
21
+ return false;
22
+ }
23
+ return entry.split('/').every((segment) => segment !== '' && segment !== '.' && segment !== '..');
24
+ };
25
+ if (!value
26
+ || typeof value !== 'object'
27
+ || Array.isArray(value)
28
+ || keys.length === 0
29
+ || keys.some((key) => !['dockerfileFragment', 'dotfilesExclusions'].includes(key))
30
+ || (fragment !== undefined && (typeof fragment !== 'string' || !TOOL_ID_PATTERN.test(fragment)))
31
+ || (exclusions !== undefined && (!Array.isArray(exclusions)
32
+ || exclusions.some((entry) => !validExclusion(entry))
33
+ || new Set(exclusions).size !== exclusions.length))) {
34
+ throw new Error(`Agent Client '${id}' has an invalid sandbox image descriptor`);
35
+ }
36
+ return Object.freeze({
37
+ ...(fragment === undefined ? {} : { dockerfileFragment: fragment }),
38
+ ...(exclusions === undefined
39
+ ? {}
40
+ : { dotfilesExclusions: Object.freeze([...exclusions]) })
41
+ });
42
+ }
6
43
  function freezeRecoveryProbe(id, checkId, value) {
7
44
  if (!value
8
45
  || typeof value.script !== 'string'
@@ -116,14 +153,55 @@ function defineAgentClientAdapter(candidate) {
116
153
  }
117
154
  return [capability, Object.freeze({ level: support.level })];
118
155
  }));
156
+ const modelSelection = candidate.modelSelection;
157
+ if (!modelSelection || typeof modelSelection !== 'object') {
158
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
159
+ }
160
+ let frozenModelSelection;
161
+ if (modelSelection.kind === 'interactive-only') {
162
+ if (!modelSelection.command?.trim() || !modelSelection.guidance?.trim()) {
163
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
164
+ }
165
+ frozenModelSelection = Object.freeze({ ...modelSelection });
166
+ }
167
+ else if (modelSelection.kind === 'catalog'
168
+ && ['complete', 'partial'].includes(modelSelection.completeness)
169
+ && typeof modelSelection.source === 'string'
170
+ && modelSelection.source.trim() !== ''
171
+ && Array.isArray(modelSelection.models)) {
172
+ const models = modelSelection.models.map((model) => {
173
+ if (!model?.id?.trim() || (model.reasoningEfforts && !Array.isArray(model.reasoningEfforts))) {
174
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
175
+ }
176
+ return Object.freeze({
177
+ id: model.id,
178
+ ...(model.reasoningEfforts
179
+ ? { reasoningEfforts: Object.freeze([...model.reasoningEfforts]) }
180
+ : {})
181
+ });
182
+ });
183
+ frozenModelSelection = Object.freeze({
184
+ ...modelSelection,
185
+ models: Object.freeze(models)
186
+ });
187
+ }
188
+ else {
189
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
190
+ }
191
+ const evidence = candidate.delegationEvidence;
192
+ if (!evidence
193
+ || !['host-event', 'unavailable'].includes(evidence.actualModel)
194
+ || !['host-event', 'spawn-ack', 'unavailable'].includes(evidence.actualReasoningEffort)) {
195
+ throw new Error(`Agent Client '${candidate.id}' has invalid delegation evidence`);
196
+ }
119
197
  if (typeof candidate.project !== 'object'
120
198
  || candidate.project === null
121
199
  || Array.isArray(candidate.project)) {
122
200
  throw new Error(`Agent Client '${candidate.id}' has an invalid project descriptor`);
123
201
  }
124
202
  const ownedPathPrefixes = candidate.project.ownedPathPrefixes;
125
- if (!Array.isArray(ownedPathPrefixes) || ownedPathPrefixes.length === 0) {
126
- throw new Error(`Agent Client '${candidate.id}' requires owned path prefixes`);
203
+ if (!Array.isArray(ownedPathPrefixes)) {
204
+ throw new Error(`Agent Client '${candidate.id}' has invalid owned path prefixes`);
127
205
  }
128
206
  const paths = ownedPathPrefixes.map((prefix) => {
129
207
  if (typeof prefix !== 'string'
@@ -195,9 +273,55 @@ function defineAgentClientAdapter(candidate) {
195
273
  target: seed.target
196
274
  });
197
275
  });
276
+ let customCommand;
277
+ if (candidate.project.customCommand !== undefined) {
278
+ const descriptor = candidate.project.customCommand;
279
+ const placeholders = typeof descriptor?.target === 'string'
280
+ ? [...descriptor.target.matchAll(/\$\{([^}]+)\}/g)].map((match) => match[1])
281
+ : [];
282
+ const targetProbe = typeof descriptor?.target === 'string'
283
+ ? descriptor.target.replaceAll('${skillName}', 'skill')
284
+ : '';
285
+ const frontmatter = descriptor?.frontmatter;
286
+ if (!descriptor
287
+ || typeof descriptor !== 'object'
288
+ || placeholders.length !== 1
289
+ || placeholders[0] !== 'skillName'
290
+ || targetProbe.includes('${')
291
+ || !isProjectRelativeLiteral(targetProbe)
292
+ || !paths.some((prefix) => targetProbe.startsWith(prefix))
293
+ || !frontmatter
294
+ || typeof frontmatter !== 'object'
295
+ || Array.isArray(frontmatter)
296
+ || Object.values(frontmatter).some((value) => typeof value !== 'string' && typeof value !== 'boolean')
297
+ || (descriptor.argumentsToken !== undefined
298
+ && (typeof descriptor.argumentsToken !== 'string'
299
+ || descriptor.argumentsToken === ''
300
+ || /[\r\n]/.test(descriptor.argumentsToken)))
301
+ || (descriptor.includeUsage !== undefined
302
+ && typeof descriptor.includeUsage !== 'boolean')
303
+ || (descriptor.inheritDisableModelInvocation !== undefined
304
+ && typeof descriptor.inheritDisableModelInvocation !== 'boolean')) {
305
+ throw new Error(`Agent Client '${candidate.id}' has an invalid custom command`);
306
+ }
307
+ customCommand = Object.freeze({
308
+ target: descriptor.target,
309
+ frontmatter: Object.freeze({ ...frontmatter }),
310
+ ...(descriptor.argumentsToken === undefined
311
+ ? {}
312
+ : { argumentsToken: descriptor.argumentsToken }),
313
+ ...(descriptor.includeUsage === undefined
314
+ ? {}
315
+ : { includeUsage: descriptor.includeUsage }),
316
+ ...(descriptor.inheritDisableModelInvocation === undefined
317
+ ? {}
318
+ : { inheritDisableModelInvocation: descriptor.inheritDisableModelInvocation })
319
+ });
320
+ }
198
321
  if (!candidate.sandbox || typeof candidate.sandbox.createTool !== 'function') {
199
322
  throw new Error(`Agent Client '${candidate.id}' requires a sandbox descriptor`);
200
323
  }
324
+ const image = freezeSandboxImageDescriptor(candidate.id, candidate.sandbox.image);
201
325
  const hookIds = new Set();
202
326
  const hooks = Object.freeze(candidate.sandbox.hooks.map((hook) => {
203
327
  if (!hook.id
@@ -282,12 +406,21 @@ function defineAgentClientAdapter(candidate) {
282
406
  displayName: candidate.displayName,
283
407
  invocation: candidate.invocation,
284
408
  capabilities: Object.freeze(capabilities),
409
+ modelSelection: frozenModelSelection,
410
+ delegationEvidence: Object.freeze({ ...evidence }),
285
411
  project: Object.freeze({
286
412
  ownedPathPrefixes: Object.freeze(paths),
287
413
  ...projectAssets,
288
- seedCommands: Object.freeze(seedCommands)
414
+ seedCommands: Object.freeze(seedCommands),
415
+ ...(customCommand === undefined ? {} : { customCommand })
289
416
  }),
290
- sandbox: Object.freeze({ createTool, aliases, hooks, recoveryChecks })
417
+ sandbox: Object.freeze({
418
+ createTool,
419
+ aliases,
420
+ hooks,
421
+ recoveryChecks,
422
+ ...(image === undefined ? {} : { image })
423
+ })
291
424
  });
292
425
  }
293
426
  export { defineAgentClientAdapter };