@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
@@ -10,15 +10,14 @@ function git(repoRoot, indexFile, args) {
10
10
  }
11
11
  return result.stdout;
12
12
  }
13
- function captureWorkspaceSnapshot(repoRoot) {
13
+ function captureWorktreeTree(repoRoot, forcedPath) {
14
14
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-infra-orchestration-index-'));
15
15
  const indexFile = path.join(tempDir, 'index');
16
16
  try {
17
17
  git(repoRoot, indexFile, ['read-tree', 'HEAD']);
18
18
  git(repoRoot, indexFile, ['add', '-A', '--', ':/']);
19
- const workspace = path.join(repoRoot, '.agents', 'workspace', 'active');
20
- if (fs.existsSync(workspace)) {
21
- git(repoRoot, indexFile, ['add', '-f', '--', '.agents/workspace/active']);
19
+ if (forcedPath && fs.existsSync(path.join(repoRoot, forcedPath))) {
20
+ git(repoRoot, indexFile, ['add', '-f', '--', forcedPath]);
22
21
  }
23
22
  return git(repoRoot, indexFile, ['write-tree']).trim();
24
23
  }
@@ -26,9 +25,22 @@ function captureWorkspaceSnapshot(repoRoot) {
26
25
  fs.rmSync(tempDir, { recursive: true, force: true });
27
26
  }
28
27
  }
28
+ function captureWorkspaceSnapshot(repoRoot, taskId) {
29
+ const workspaceRelative = taskId
30
+ ? `.agents/workspace/active/${taskId}`
31
+ : '.agents/workspace/active';
32
+ return captureWorktreeTree(repoRoot, workspaceRelative);
33
+ }
34
+ function captureRepositorySnapshot(repoRoot) {
35
+ return {
36
+ head: git(repoRoot, null, ['rev-parse', 'HEAD']).trim(),
37
+ headTree: git(repoRoot, null, ['rev-parse', 'HEAD^{tree}']).trim(),
38
+ worktreeTree: captureWorktreeTree(repoRoot, null)
39
+ };
40
+ }
29
41
  function diffWorkspaceSnapshots(repoRoot, before, after) {
30
42
  const output = git(repoRoot, null, ['diff', '--name-only', '-z', before, after]);
31
43
  return output.split('\0').filter(Boolean);
32
44
  }
33
- export { captureWorkspaceSnapshot, diffWorkspaceSnapshots };
45
+ export { captureRepositorySnapshot, captureWorkspaceSnapshot, diffWorkspaceSnapshots };
34
46
  //# sourceMappingURL=workspace-snapshot.js.map
@@ -12,6 +12,7 @@ import {
12
12
  } from '../sandbox/tool-types.ts';
13
13
  import type {
14
14
  AgentClientSandboxRecoveryCheck,
15
+ AgentClientSandboxImageDescriptor,
15
16
  AgentClientSandboxDescriptor,
16
17
  SandboxAlias,
17
18
  SandboxTool,
@@ -20,6 +21,28 @@ import type {
20
21
 
21
22
  type AgentClientCapabilities = AgentClientCapabilityMap;
22
23
 
24
+ type AgentClientModelSelectionContext =
25
+ | Readonly<{
26
+ kind: 'catalog';
27
+ completeness: 'complete' | 'partial';
28
+ source: string;
29
+ models: readonly Readonly<{
30
+ id: string;
31
+ reasoningEfforts?: readonly string[];
32
+ }>[];
33
+ guidance?: string;
34
+ }>
35
+ | Readonly<{
36
+ kind: 'interactive-only';
37
+ command: string;
38
+ guidance: string;
39
+ }>;
40
+
41
+ type AgentClientDelegationEvidence = Readonly<{
42
+ actualModel: 'host-event' | 'unavailable';
43
+ actualReasoningEffort: 'host-event' | 'spawn-ack' | 'unavailable';
44
+ }>;
45
+
23
46
  type AgentClientSeedCommand = Readonly<{
24
47
  templates: Readonly<{
25
48
  en: string;
@@ -28,12 +51,21 @@ type AgentClientSeedCommand = Readonly<{
28
51
  target: string;
29
52
  }>;
30
53
 
54
+ type AgentClientCustomCommandDescriptor = Readonly<{
55
+ target: string;
56
+ frontmatter: Readonly<Record<string, string | boolean>>;
57
+ argumentsToken?: string;
58
+ includeUsage?: boolean;
59
+ inheritDisableModelInvocation?: boolean;
60
+ }>;
61
+
31
62
  type AgentClientProjectDescriptor = Readonly<{
32
63
  ownedPathPrefixes: readonly string[];
33
64
  managed: readonly string[];
34
65
  merged: readonly string[];
35
66
  ejected: readonly string[];
36
67
  seedCommands: readonly AgentClientSeedCommand[];
68
+ customCommand?: AgentClientCustomCommandDescriptor;
37
69
  }>;
38
70
 
39
71
  type AgentClientAdapter = Readonly<{
@@ -41,6 +73,8 @@ type AgentClientAdapter = Readonly<{
41
73
  displayName: string;
42
74
  invocation: string;
43
75
  capabilities: AgentClientCapabilities;
76
+ modelSelection: AgentClientModelSelectionContext;
77
+ delegationEvidence: AgentClientDelegationEvidence;
44
78
  project: AgentClientProjectDescriptor;
45
79
  sandbox: AgentClientSandboxDescriptor;
46
80
  }>;
@@ -57,12 +91,59 @@ type AgentClientManifestEntry = Readonly<{
57
91
  managed: readonly string[];
58
92
  merged: readonly string[];
59
93
  ejected: readonly string[];
94
+ customCommand?: AgentClientCustomCommandDescriptor;
60
95
  }>;
61
96
 
62
97
  const PROJECT_ASSET_CATEGORIES = ['managed', 'merged', 'ejected'] as const;
63
98
  const MAX_SANDBOX_HOOK_TIMEOUT_MS = 300_000;
64
99
  const TOOL_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
65
100
 
101
+ function freezeSandboxImageDescriptor(
102
+ id: AgentClientId,
103
+ value: AgentClientSandboxImageDescriptor | undefined
104
+ ): AgentClientSandboxImageDescriptor | undefined {
105
+ if (value === undefined) return undefined;
106
+ const keys = value && typeof value === 'object' && !Array.isArray(value)
107
+ ? Object.keys(value)
108
+ : [];
109
+ const fragment = value?.dockerfileFragment;
110
+ const exclusions = value?.dotfilesExclusions;
111
+ const validExclusion = (entry: unknown): entry is string => {
112
+ if (
113
+ typeof entry !== 'string'
114
+ || entry === ''
115
+ || entry.startsWith('/')
116
+ || entry.endsWith('/')
117
+ || entry.includes('\\')
118
+ || /[*?[\]]/.test(entry)
119
+ ) {
120
+ return false;
121
+ }
122
+ return entry.split('/').every((segment) => segment !== '' && segment !== '.' && segment !== '..');
123
+ };
124
+ if (
125
+ !value
126
+ || typeof value !== 'object'
127
+ || Array.isArray(value)
128
+ || keys.length === 0
129
+ || keys.some((key) => !['dockerfileFragment', 'dotfilesExclusions'].includes(key))
130
+ || (fragment !== undefined && (typeof fragment !== 'string' || !TOOL_ID_PATTERN.test(fragment)))
131
+ || (exclusions !== undefined && (
132
+ !Array.isArray(exclusions)
133
+ || exclusions.some((entry) => !validExclusion(entry))
134
+ || new Set(exclusions).size !== exclusions.length
135
+ ))
136
+ ) {
137
+ throw new Error(`Agent Client '${id}' has an invalid sandbox image descriptor`);
138
+ }
139
+ return Object.freeze({
140
+ ...(fragment === undefined ? {} : { dockerfileFragment: fragment }),
141
+ ...(exclusions === undefined
142
+ ? {}
143
+ : { dotfilesExclusions: Object.freeze([...exclusions]) })
144
+ });
145
+ }
146
+
66
147
  function freezeRecoveryProbe(
67
148
  id: AgentClientId,
68
149
  checkId: string,
@@ -211,6 +292,51 @@ function defineAgentClientAdapter(
211
292
  })
212
293
  ) as AgentClientCapabilities;
213
294
 
295
+ const modelSelection = candidate.modelSelection;
296
+ if (!modelSelection || typeof modelSelection !== 'object') {
297
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
298
+ }
299
+ let frozenModelSelection: AgentClientModelSelectionContext;
300
+ if (modelSelection.kind === 'interactive-only') {
301
+ if (!modelSelection.command?.trim() || !modelSelection.guidance?.trim()) {
302
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
303
+ }
304
+ frozenModelSelection = Object.freeze({ ...modelSelection });
305
+ } else if (
306
+ modelSelection.kind === 'catalog'
307
+ && ['complete', 'partial'].includes(modelSelection.completeness)
308
+ && typeof modelSelection.source === 'string'
309
+ && modelSelection.source.trim() !== ''
310
+ && Array.isArray(modelSelection.models)
311
+ ) {
312
+ const models = modelSelection.models.map((model) => {
313
+ if (!model?.id?.trim() || (model.reasoningEfforts && !Array.isArray(model.reasoningEfforts))) {
314
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
315
+ }
316
+ return Object.freeze({
317
+ id: model.id,
318
+ ...(model.reasoningEfforts
319
+ ? { reasoningEfforts: Object.freeze([...model.reasoningEfforts]) }
320
+ : {})
321
+ });
322
+ });
323
+ frozenModelSelection = Object.freeze({
324
+ ...modelSelection,
325
+ models: Object.freeze(models)
326
+ });
327
+ } else {
328
+ throw new Error(`Agent Client '${candidate.id}' has an invalid model-selection context`);
329
+ }
330
+
331
+ const evidence = candidate.delegationEvidence;
332
+ if (
333
+ !evidence
334
+ || !['host-event', 'unavailable'].includes(evidence.actualModel)
335
+ || !['host-event', 'spawn-ack', 'unavailable'].includes(evidence.actualReasoningEffort)
336
+ ) {
337
+ throw new Error(`Agent Client '${candidate.id}' has invalid delegation evidence`);
338
+ }
339
+
214
340
  if (
215
341
  typeof candidate.project !== 'object'
216
342
  || candidate.project === null
@@ -219,8 +345,8 @@ function defineAgentClientAdapter(
219
345
  throw new Error(`Agent Client '${candidate.id}' has an invalid project descriptor`);
220
346
  }
221
347
  const ownedPathPrefixes = candidate.project.ownedPathPrefixes;
222
- if (!Array.isArray(ownedPathPrefixes) || ownedPathPrefixes.length === 0) {
223
- throw new Error(`Agent Client '${candidate.id}' requires owned path prefixes`);
348
+ if (!Array.isArray(ownedPathPrefixes)) {
349
+ throw new Error(`Agent Client '${candidate.id}' has invalid owned path prefixes`);
224
350
  }
225
351
 
226
352
  const paths = ownedPathPrefixes.map((prefix) => {
@@ -325,9 +451,68 @@ function defineAgentClientAdapter(
325
451
  });
326
452
  });
327
453
 
454
+ let customCommand: AgentClientCustomCommandDescriptor | undefined;
455
+ if (candidate.project.customCommand !== undefined) {
456
+ const descriptor = candidate.project.customCommand;
457
+ const placeholders = typeof descriptor?.target === 'string'
458
+ ? [...descriptor.target.matchAll(/\$\{([^}]+)\}/g)].map((match) => match[1])
459
+ : [];
460
+ const targetProbe = typeof descriptor?.target === 'string'
461
+ ? descriptor.target.replaceAll('${skillName}', 'skill')
462
+ : '';
463
+ const frontmatter = descriptor?.frontmatter;
464
+ if (
465
+ !descriptor
466
+ || typeof descriptor !== 'object'
467
+ || placeholders.length !== 1
468
+ || placeholders[0] !== 'skillName'
469
+ || targetProbe.includes('${')
470
+ || !isProjectRelativeLiteral(targetProbe)
471
+ || !paths.some((prefix) => targetProbe.startsWith(prefix))
472
+ || !frontmatter
473
+ || typeof frontmatter !== 'object'
474
+ || Array.isArray(frontmatter)
475
+ || Object.values(frontmatter).some((value) =>
476
+ typeof value !== 'string' && typeof value !== 'boolean'
477
+ )
478
+ || (
479
+ descriptor.argumentsToken !== undefined
480
+ && (
481
+ typeof descriptor.argumentsToken !== 'string'
482
+ || descriptor.argumentsToken === ''
483
+ || /[\r\n]/.test(descriptor.argumentsToken)
484
+ )
485
+ )
486
+ || (
487
+ descriptor.includeUsage !== undefined
488
+ && typeof descriptor.includeUsage !== 'boolean'
489
+ )
490
+ || (
491
+ descriptor.inheritDisableModelInvocation !== undefined
492
+ && typeof descriptor.inheritDisableModelInvocation !== 'boolean'
493
+ )
494
+ ) {
495
+ throw new Error(`Agent Client '${candidate.id}' has an invalid custom command`);
496
+ }
497
+ customCommand = Object.freeze({
498
+ target: descriptor.target,
499
+ frontmatter: Object.freeze({ ...frontmatter }),
500
+ ...(descriptor.argumentsToken === undefined
501
+ ? {}
502
+ : { argumentsToken: descriptor.argumentsToken }),
503
+ ...(descriptor.includeUsage === undefined
504
+ ? {}
505
+ : { includeUsage: descriptor.includeUsage }),
506
+ ...(descriptor.inheritDisableModelInvocation === undefined
507
+ ? {}
508
+ : { inheritDisableModelInvocation: descriptor.inheritDisableModelInvocation })
509
+ });
510
+ }
511
+
328
512
  if (!candidate.sandbox || typeof candidate.sandbox.createTool !== 'function') {
329
513
  throw new Error(`Agent Client '${candidate.id}' requires a sandbox descriptor`);
330
514
  }
515
+ const image = freezeSandboxImageDescriptor(candidate.id, candidate.sandbox.image);
331
516
  const hookIds = new Set<string>();
332
517
  const hooks = Object.freeze(candidate.sandbox.hooks.map((hook) => {
333
518
  if (
@@ -441,12 +626,21 @@ function defineAgentClientAdapter(
441
626
  displayName: candidate.displayName,
442
627
  invocation: candidate.invocation,
443
628
  capabilities: Object.freeze(capabilities),
629
+ modelSelection: frozenModelSelection,
630
+ delegationEvidence: Object.freeze({ ...evidence }),
444
631
  project: Object.freeze({
445
632
  ownedPathPrefixes: Object.freeze(paths),
446
633
  ...projectAssets,
447
- seedCommands: Object.freeze(seedCommands)
634
+ seedCommands: Object.freeze(seedCommands),
635
+ ...(customCommand === undefined ? {} : { customCommand })
448
636
  }),
449
- sandbox: Object.freeze({ createTool, aliases, hooks, recoveryChecks })
637
+ sandbox: Object.freeze({
638
+ createTool,
639
+ aliases,
640
+ hooks,
641
+ recoveryChecks,
642
+ ...(image === undefined ? {} : { image })
643
+ })
450
644
  });
451
645
  }
452
646
 
@@ -454,7 +648,10 @@ export { defineAgentClientAdapter };
454
648
  export type {
455
649
  AgentClientAdapter,
456
650
  AgentClientCapabilities,
651
+ AgentClientCustomCommandDescriptor,
652
+ AgentClientDelegationEvidence,
457
653
  AgentClientManifestEntry,
654
+ AgentClientModelSelectionContext,
458
655
  AgentClientProjectDescriptor,
459
656
  AgentClientSeedCommand,
460
657
  AgentClientRegistry
@@ -0,0 +1,65 @@
1
+ import { defineAgentClientAdapter } from '../adapter.ts';
2
+ import { hostJoin } from '../../sandbox/engines/wsl2-paths.ts';
3
+
4
+ const antigravityCliAdapter = defineAgentClientAdapter({
5
+ id: 'antigravity-cli',
6
+ displayName: 'Antigravity CLI',
7
+ invocation: '/${skillName}',
8
+ capabilities: {
9
+ instructions: { level: 'compatible' },
10
+ skills: { level: 'integrated' },
11
+ commands: { level: 'integrated' },
12
+ hooks: { level: 'compatible' },
13
+ subagents: { level: 'unsupported' },
14
+ orchestration: { level: 'unsupported' },
15
+ sandbox: { level: 'integrated' },
16
+ verification: { level: 'compatible' }
17
+ },
18
+ modelSelection: {
19
+ kind: 'interactive-only',
20
+ command: '/model',
21
+ guidance: 'Use the host model picker for the complete model and reasoning-effort catalog.'
22
+ },
23
+ delegationEvidence: {
24
+ actualModel: 'unavailable',
25
+ actualReasoningEffort: 'unavailable'
26
+ },
27
+ project: {
28
+ ownedPathPrefixes: [],
29
+ managed: [],
30
+ merged: [],
31
+ ejected: [],
32
+ seedCommands: []
33
+ },
34
+ sandbox: {
35
+ createTool: ({ home }) => ({
36
+ id: 'antigravity-cli',
37
+ name: 'Antigravity CLI',
38
+ install: {
39
+ type: 'shell',
40
+ cmd: 'curl -fsSL https://antigravity.google/cli/install.sh | bash -s -- --dir /home/devuser/.npm-global/bin'
41
+ },
42
+ sandboxBase: hostJoin(home, '.agent-infra', 'sandboxes', 'antigravity-cli'),
43
+ containerMount: '/home/devuser/.gemini',
44
+ versionCmd: 'agy --version',
45
+ setupHint: 'Run agy inside the container to finish authentication.',
46
+ hostPreSeedFiles: [
47
+ {
48
+ hostPath: hostJoin(home, '.gemini', 'antigravity-cli', 'keybindings.json'),
49
+ sandboxName: 'antigravity-cli/keybindings.json'
50
+ },
51
+ {
52
+ hostPath: hostJoin(home, '.gemini', 'config', 'mcp_config.json'),
53
+ sandboxName: 'config/mcp_config.json'
54
+ }
55
+ ]
56
+ }),
57
+ aliases: [
58
+ { name: 'antigravity-yolo', command: 'agy --dangerously-skip-permissions; tput ed' },
59
+ { name: 'agy-yolo', command: 'agy --dangerously-skip-permissions; tput ed' }
60
+ ],
61
+ hooks: []
62
+ }
63
+ });
64
+
65
+ export { antigravityCliAdapter };
@@ -2,7 +2,8 @@ import { execFileSync } from 'node:child_process';
2
2
  import { randomBytes } from 'node:crypto';
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
- import { hostJoin } from './engines/wsl2-paths.ts';
5
+ import { hostJoin } from '../../sandbox/engines/wsl2-paths.ts';
6
+ import { redactCommandError } from '../../sandbox/redaction.ts';
6
7
 
7
8
  type ExecFn = (file: string, args: string[], options?: Record<string, unknown>) => string | Buffer | void;
8
9
  type ReadFn = (targetPath: string) => string;
@@ -112,12 +113,6 @@ type CredentialPayload = {
112
113
 
113
114
  const LOCKED_PATTERN = /errSecInteractionNotAllowed|User interaction is not allowed/i;
114
115
  const NOT_FOUND_PATTERN = /errSecItemNotFound|specified item could not be found/i;
115
- const REDACTION_PATTERNS = [
116
- { pattern: /\{[^{}]*"claudeAiOauth"[\s\S]*?\}\s*\}/g, replacement: '[REDACTED credentials blob]' },
117
- { pattern: /sk-ant-[A-Za-z0-9_-]{20,}/g, replacement: '[REDACTED claude token]' },
118
- { pattern: /gh[psoru]_[A-Za-z0-9]{30,}/g, replacement: '[REDACTED github token]' },
119
- { pattern: /Bearer\s+[A-Za-z0-9._~+/=-]{20,}/gi, replacement: 'Bearer [REDACTED]' }
120
- ];
121
116
 
122
117
  function isRecord(value: unknown): value is Record<string, unknown> {
123
118
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -131,18 +126,8 @@ function errorMessage(error: unknown): string {
131
126
  return error instanceof Error ? error.message : 'unknown error';
132
127
  }
133
128
 
134
- export function redactCommandError(text: unknown): string {
135
- if (!text || typeof text !== 'string') {
136
- return '';
137
- }
138
-
139
- return REDACTION_PATTERNS.reduce(
140
- (result, { pattern, replacement }) => result.replace(pattern, replacement),
141
- text
142
- );
143
- }
144
-
145
129
  export const redactSecurityOutput = redactCommandError;
130
+ export { redactCommandError };
146
131
 
147
132
  function extractStderrSafely(error: unknown): string {
148
133
  const stderr = typeof error === 'object' && error !== null && 'stderr' in error
@@ -0,0 +1,128 @@
1
+ import { homedir } from 'node:os';
2
+ import { parseArgs } from 'node:util';
3
+ import {
4
+ buildLockedGuidance,
5
+ discoverProjects,
6
+ formatCredentialWarnings,
7
+ formatRemaining,
8
+ reconcileClaudeCredentials,
9
+ redactCommandError,
10
+ validateClaudeCredentialsEnvOverride
11
+ } from './claude-code-credentials.ts';
12
+ import { runProbe } from '../../sandbox/shell.ts';
13
+
14
+ const USAGE = 'Usage: ai sandbox refresh';
15
+
16
+ type ReconcileOptions = NonNullable<Parameters<typeof reconcileClaudeCredentials>[1]>;
17
+
18
+ type RefreshDeps = Partial<ReconcileOptions> & {
19
+ spawnFn?: typeof runProbe;
20
+ discoverFn?: typeof discoverProjects;
21
+ writeStdout?: (chunk: string) => unknown;
22
+ writeStderr?: (chunk: string) => unknown;
23
+ };
24
+
25
+ export function probeClaudeStatus(spawnFn: typeof runProbe = runProbe): { ok: boolean; stderr: string; error: string | null } {
26
+ const result = spawnFn('claude', ['/status'], {
27
+ encoding: 'utf8',
28
+ stdio: ['ignore', 'pipe', 'pipe'],
29
+ timeout: 30_000
30
+ });
31
+ return {
32
+ ok: result.status === 0,
33
+ stderr: result.stderr?.toString() ?? '',
34
+ error: result.error?.message ?? null
35
+ };
36
+ }
37
+
38
+ export async function runClaudeCodeRefresh(args: string[], deps: RefreshDeps = {}): Promise<number> {
39
+ const {
40
+ spawnFn = runProbe,
41
+ execFn,
42
+ readFn,
43
+ existsFn,
44
+ writeFn,
45
+ writeHostFn,
46
+ discoverFn = discoverProjects,
47
+ writeStdout = (chunk: string) => process.stdout.write(chunk),
48
+ writeStderr = (chunk: string) => process.stderr.write(chunk)
49
+ } = deps;
50
+
51
+ if (args[0] === '--help' || args[0] === '-h' || args[0] === 'help') {
52
+ writeStdout(`${USAGE}\n`);
53
+ return 0;
54
+ }
55
+
56
+ const { positionals } = parseArgs({ args, allowPositionals: true, strict: true });
57
+ if (positionals.length > 0) {
58
+ throw new Error(USAGE);
59
+ }
60
+ validateClaudeCredentialsEnvOverride();
61
+
62
+ const home = homedir();
63
+ if (!home) {
64
+ throw new Error('sandbox: home directory is required');
65
+ }
66
+
67
+ const projects = discoverFn(home);
68
+ if (projects.length === 0) {
69
+ writeStdout('No project credentials to refresh.\n');
70
+ return 0;
71
+ }
72
+
73
+ const reconcileOptions = { execFn, readFn, existsFn, writeFn, writeHostFn, projects };
74
+ let result = reconcileClaudeCredentials(home, reconcileOptions);
75
+ if (result.status === 'STALE_ACCESS' && result.authoritative === null) {
76
+ writeStdout('Host credentials appear stale; probing claude /status to trigger refresh...\n');
77
+ const probe = probeClaudeStatus(spawnFn);
78
+ if (!probe.ok) {
79
+ writeStderr(`Probe failed: ${redactCommandError(probe.stderr || probe.error || 'unknown error')}\n`);
80
+ writeStderr('Run "claude /login" on the host to renew credentials.\n');
81
+ return 1;
82
+ }
83
+ writeStdout('Probe succeeded; re-inspecting host credentials.\n');
84
+ result = reconcileClaudeCredentials(home, reconcileOptions);
85
+ }
86
+
87
+ if (result.status === 'MISSING') {
88
+ writeStderr('No Claude Code credentials found on host.\n');
89
+ writeStderr('Run "claude /login" on the host to authenticate.\n');
90
+ return 1;
91
+ }
92
+
93
+ if (result.status === 'KEYCHAIN_LOCKED') {
94
+ writeStderr(`${buildLockedGuidance()}\n`);
95
+ return 1;
96
+ }
97
+
98
+ if (result.status === 'KEYCHAIN_ERROR') {
99
+ writeStderr(`Host keychain error: ${redactCommandError(result.detail || 'unknown error')}\n`);
100
+ writeStderr(`${buildLockedGuidance()}\n`);
101
+ return 1;
102
+ }
103
+
104
+ if (result.status === 'KEYCHAIN_WRITE_FAILED') {
105
+ writeStderr(`[host] keychain write failed: ${formatCredentialWarnings(result.warnings) || 'unknown error'}\n`);
106
+ return 1;
107
+ }
108
+
109
+ if (result.status !== 'OK') {
110
+ writeStderr('Host credentials still invalid after probe; run "claude /login".\n');
111
+ return 1;
112
+ }
113
+
114
+ if (result.authoritative && result.authoritative !== 'host' && result.hostWritten) {
115
+ writeStdout(`[host] reconciled from ${result.authoritative}\n`);
116
+ }
117
+
118
+ for (const project of projects) {
119
+ const action = result.filesWritten.includes(project) ? 'updated' : 'unchanged';
120
+ writeStdout(`[${project}] ${action}; expires in ${formatRemaining(result.expiresAt)}\n`);
121
+ }
122
+
123
+ for (const failure of result.fileErrors) {
124
+ writeStderr(`[${failure.project}] sync failed: ${failure.error}\n`);
125
+ }
126
+
127
+ return result.fileErrors.length > 0 ? 1 : 0;
128
+ }