@fitlab-ai/agent-infra 0.8.5 → 0.9.1

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 (467) hide show
  1. package/README.md +6 -1
  2. package/README.zh-CN.md +5 -1
  3. package/bin/cli.ts +2 -2
  4. package/dist/bin/cli.js +2 -2
  5. package/dist/bin/internal-cli.js +103 -0
  6. package/dist/lib/decide.js +81 -90
  7. package/dist/lib/defaults.json +1 -0
  8. package/dist/lib/git/review-snapshot.js +79 -0
  9. package/dist/lib/git/workflow.js +101 -0
  10. package/dist/lib/internal/git-workflow.js +42 -0
  11. package/dist/lib/internal/platform-checks.js +119 -0
  12. package/dist/lib/internal/platform-comment.js +129 -0
  13. package/dist/lib/internal/platform-context.js +46 -0
  14. package/dist/lib/internal/platform-issue.js +142 -0
  15. package/dist/lib/internal/platform-pr.js +146 -0
  16. package/dist/lib/internal/platform-release-notes.js +53 -0
  17. package/dist/lib/internal/release-workflow.js +320 -0
  18. package/dist/lib/internal/task-artifact.js +67 -0
  19. package/dist/lib/internal/task-context.js +43 -0
  20. package/dist/lib/internal/task-event.js +70 -0
  21. package/dist/lib/internal/task-ledger.js +114 -0
  22. package/dist/lib/internal/task-lifecycle.js +58 -0
  23. package/dist/lib/internal/task-short-id.js +83 -0
  24. package/dist/lib/internal/task-snapshot.js +47 -0
  25. package/dist/lib/internal/task-verify.js +50 -0
  26. package/dist/lib/internal/task-warning.js +74 -0
  27. package/dist/lib/platform/adapters.js +14 -0
  28. package/dist/lib/platform/context.js +146 -0
  29. package/dist/lib/platform/github-client.js +124 -0
  30. package/dist/lib/platform/github-release-notes.js +96 -0
  31. package/dist/lib/platform/issue-comments.js +409 -0
  32. package/dist/lib/platform/issue-metadata.js +183 -0
  33. package/dist/lib/platform/issues.js +619 -0
  34. package/dist/lib/platform/merged-pr-equivalence.js +54 -0
  35. package/dist/lib/platform/metadata-labels.js +28 -0
  36. package/dist/lib/platform/pr-checks.js +216 -0
  37. package/dist/lib/platform/pr-summary.js +88 -0
  38. package/dist/lib/platform/pull-request-metadata.js +38 -0
  39. package/dist/lib/platform/pull-requests.js +340 -0
  40. package/dist/lib/platform/release-notes.js +143 -0
  41. package/dist/lib/platform/releases.js +82 -0
  42. package/dist/lib/platform/types.js +22 -0
  43. package/dist/lib/platform/verification-required.js +102 -0
  44. package/dist/lib/platform/verification-sync.js +1014 -0
  45. package/dist/lib/platform/verification.js +6 -0
  46. package/dist/lib/release/channels.js +31 -0
  47. package/dist/lib/release/workflow.js +32 -0
  48. package/dist/lib/render.js +3 -2
  49. package/dist/lib/run/index.js +24 -7
  50. package/dist/lib/sandbox/build-proxy.js +63 -0
  51. package/dist/lib/sandbox/capture.js +25 -3
  52. package/dist/lib/sandbox/commands/create.js +93 -31
  53. package/dist/lib/sandbox/commands/enter.js +34 -11
  54. package/dist/lib/sandbox/commands/list-running.js +10 -8
  55. package/dist/lib/sandbox/commands/rebuild.js +24 -7
  56. package/dist/lib/sandbox/commands/show.js +2 -2
  57. package/dist/lib/sandbox/commands/start.js +53 -15
  58. package/dist/lib/sandbox/image-build.js +2 -1
  59. package/dist/lib/sandbox/index.js +6 -6
  60. package/dist/lib/sandbox/mounts.js +36 -0
  61. package/dist/lib/sandbox/recovery.js +562 -0
  62. package/dist/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
  63. package/dist/lib/sandbox/runtimes/base.dockerfile +8 -1
  64. package/dist/lib/sandbox/runtimes/java17.dockerfile +8 -1
  65. package/dist/lib/sandbox/runtimes/java21.dockerfile +8 -1
  66. package/dist/lib/sandbox/runtimes/node20.dockerfile +8 -1
  67. package/dist/lib/sandbox/runtimes/node22.dockerfile +8 -1
  68. package/dist/lib/sandbox/runtimes/python3.dockerfile +8 -1
  69. package/dist/lib/sandbox/shell.js +2 -1
  70. package/dist/lib/sandbox/task-resolver.js +5 -1
  71. package/dist/lib/sandbox/tools.js +19 -0
  72. package/dist/lib/server/protocol.js +5 -5
  73. package/dist/lib/task/activity-log.js +61 -0
  74. package/dist/lib/task/artifact-lifecycle.js +427 -0
  75. package/dist/lib/task/command-options.js +30 -0
  76. package/dist/lib/task/commands/cat.js +36 -6
  77. package/dist/lib/task/commands/decisions.js +80 -46
  78. package/dist/lib/task/commands/files.js +21 -7
  79. package/dist/lib/task/commands/grep.js +55 -7
  80. package/dist/lib/task/commands/issue-body.js +33 -19
  81. package/dist/lib/task/commands/log.js +27 -70
  82. package/dist/lib/task/commands/show.js +20 -7
  83. package/dist/lib/task/commands/status.js +18 -8
  84. package/dist/lib/task/decision-intents.js +154 -0
  85. package/dist/lib/task/decision-items.js +53 -0
  86. package/dist/lib/task/events.js +318 -0
  87. package/dist/lib/task/frontmatter.js +159 -1
  88. package/dist/lib/task/implementation-inputs.js +117 -0
  89. package/dist/lib/task/index.js +12 -9
  90. package/dist/lib/task/issue-form.js +21 -6
  91. package/dist/lib/task/ledger-intents.js +185 -0
  92. package/dist/lib/task/ledger.js +65 -35
  93. package/dist/lib/task/lifecycle.js +484 -0
  94. package/dist/lib/task/resolve-ref.js +152 -32
  95. package/dist/lib/task/review-artifacts.js +101 -0
  96. package/dist/lib/task/review-fingerprint.js +55 -0
  97. package/dist/lib/task/sections.js +358 -4
  98. package/dist/lib/task/short-id.js +292 -7
  99. package/dist/lib/task/snapshot.js +95 -0
  100. package/dist/lib/task/verification-checks.js +8 -0
  101. package/dist/lib/task/verification-config.js +14 -0
  102. package/dist/lib/task/verification-engine.js +923 -0
  103. package/dist/lib/task/verification-review.js +3 -0
  104. package/dist/lib/task/verification-types.js +2 -0
  105. package/dist/lib/task/verification.js +113 -0
  106. package/dist/lib/task/workflow-warning-intents.js +131 -0
  107. package/dist/lib/task/workflow-warnings.js +10 -78
  108. package/dist/lib/task/write.js +241 -0
  109. package/lib/decide.ts +57 -97
  110. package/lib/defaults.json +1 -0
  111. package/lib/git/review-snapshot.ts +73 -0
  112. package/lib/git/workflow.ts +101 -0
  113. package/lib/internal/git-workflow.ts +37 -0
  114. package/lib/internal/platform-checks.ts +101 -0
  115. package/lib/internal/platform-comment.ts +99 -0
  116. package/lib/internal/platform-context.ts +33 -0
  117. package/lib/internal/platform-issue.ts +116 -0
  118. package/lib/internal/platform-pr.ts +119 -0
  119. package/lib/internal/platform-release-notes.ts +55 -0
  120. package/lib/internal/release-workflow.ts +288 -0
  121. package/lib/internal/task-artifact.ts +47 -0
  122. package/lib/internal/task-context.ts +35 -0
  123. package/lib/internal/task-event.ts +51 -0
  124. package/lib/internal/task-ledger.ts +86 -0
  125. package/lib/internal/task-lifecycle.ts +41 -0
  126. package/lib/internal/task-short-id.ts +55 -0
  127. package/lib/internal/task-snapshot.ts +32 -0
  128. package/lib/internal/task-verify.ts +33 -0
  129. package/lib/internal/task-warning.ts +50 -0
  130. package/lib/platform/adapters.ts +30 -0
  131. package/lib/platform/context.ts +164 -0
  132. package/lib/platform/github-client.ts +146 -0
  133. package/lib/platform/github-release-notes.ts +132 -0
  134. package/lib/platform/issue-comments.ts +479 -0
  135. package/lib/platform/issue-metadata.ts +250 -0
  136. package/lib/platform/issues.ts +693 -0
  137. package/lib/platform/merged-pr-equivalence.ts +70 -0
  138. package/lib/platform/metadata-labels.ts +33 -0
  139. package/lib/platform/pr-checks.ts +247 -0
  140. package/lib/platform/pr-summary.ts +90 -0
  141. package/lib/platform/pull-request-metadata.ts +69 -0
  142. package/lib/platform/pull-requests.ts +386 -0
  143. package/lib/platform/release-notes.ts +167 -0
  144. package/lib/platform/releases.ts +71 -0
  145. package/lib/platform/types.ts +74 -0
  146. package/lib/platform/verification-required.ts +109 -0
  147. package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
  148. package/lib/platform/verification.ts +11 -0
  149. package/lib/release/channels.ts +30 -0
  150. package/lib/release/workflow.ts +31 -0
  151. package/lib/render.ts +3 -2
  152. package/lib/run/index.ts +25 -7
  153. package/lib/sandbox/build-proxy.ts +94 -0
  154. package/lib/sandbox/capture.ts +29 -3
  155. package/lib/sandbox/commands/create.ts +120 -36
  156. package/lib/sandbox/commands/enter.ts +38 -11
  157. package/lib/sandbox/commands/list-running.ts +10 -8
  158. package/lib/sandbox/commands/rebuild.ts +29 -7
  159. package/lib/sandbox/commands/show.ts +2 -2
  160. package/lib/sandbox/commands/start.ts +50 -16
  161. package/lib/sandbox/image-build.ts +4 -1
  162. package/lib/sandbox/index.ts +6 -6
  163. package/lib/sandbox/mounts.ts +55 -0
  164. package/lib/sandbox/recovery.ts +828 -0
  165. package/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
  166. package/lib/sandbox/runtimes/base.dockerfile +8 -1
  167. package/lib/sandbox/runtimes/java17.dockerfile +8 -1
  168. package/lib/sandbox/runtimes/java21.dockerfile +8 -1
  169. package/lib/sandbox/runtimes/node20.dockerfile +8 -1
  170. package/lib/sandbox/runtimes/node22.dockerfile +8 -1
  171. package/lib/sandbox/runtimes/python3.dockerfile +8 -1
  172. package/lib/sandbox/shell.ts +3 -1
  173. package/lib/sandbox/task-resolver.ts +5 -1
  174. package/lib/sandbox/tools.ts +31 -0
  175. package/lib/server/protocol.ts +5 -5
  176. package/lib/task/activity-log.ts +62 -0
  177. package/lib/task/artifact-lifecycle.ts +484 -0
  178. package/lib/task/command-options.ts +32 -0
  179. package/lib/task/commands/cat.ts +22 -9
  180. package/lib/task/commands/decisions.ts +49 -47
  181. package/lib/task/commands/files.ts +14 -6
  182. package/lib/task/commands/grep.ts +34 -7
  183. package/lib/task/commands/issue-body.ts +26 -21
  184. package/lib/task/commands/log.ts +17 -70
  185. package/lib/task/commands/show.ts +14 -6
  186. package/lib/task/commands/status.ts +17 -7
  187. package/lib/task/decision-intents.ts +163 -0
  188. package/lib/task/decision-items.ts +64 -0
  189. package/lib/task/events.ts +320 -0
  190. package/lib/task/frontmatter.ts +202 -2
  191. package/lib/task/implementation-inputs.ts +137 -0
  192. package/lib/task/index.ts +12 -9
  193. package/lib/task/issue-form.ts +24 -6
  194. package/lib/task/ledger-intents.ts +201 -0
  195. package/lib/task/ledger.ts +77 -31
  196. package/lib/task/lifecycle.ts +458 -0
  197. package/lib/task/resolve-ref.ts +197 -36
  198. package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
  199. package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +26 -12
  200. package/lib/task/sections.ts +486 -4
  201. package/lib/task/short-id.ts +403 -9
  202. package/lib/task/snapshot.ts +143 -0
  203. package/lib/task/verification-checks.ts +9 -0
  204. package/lib/task/verification-config.ts +20 -0
  205. package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +230 -421
  206. package/lib/task/verification-review.ts +10 -0
  207. package/lib/task/verification-types.ts +29 -0
  208. package/lib/task/verification.ts +156 -0
  209. package/lib/task/workflow-warning-intents.ts +142 -0
  210. package/lib/task/workflow-warnings.ts +10 -78
  211. package/lib/task/write.ts +468 -0
  212. package/package.json +4 -2
  213. package/templates/.agents/README.en.md +4 -3
  214. package/templates/.agents/README.zh-CN.md +4 -3
  215. package/templates/.agents/rules/README.en.md +6 -5
  216. package/templates/.agents/rules/README.zh-CN.md +6 -5
  217. package/templates/.agents/rules/create-issue.en.md +1 -1
  218. package/templates/.agents/rules/create-issue.github.en.md +5 -184
  219. package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
  220. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  221. package/templates/.agents/rules/human-decision-context.en.md +36 -0
  222. package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
  223. package/templates/.agents/rules/issue-fields.github.en.md +4 -148
  224. package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
  225. package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
  226. package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
  227. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
  228. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
  229. package/templates/.agents/rules/issue-sync.en.md +1 -1
  230. package/templates/.agents/rules/issue-sync.github.en.md +14 -301
  231. package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
  232. package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
  233. package/templates/.agents/rules/milestone-inference.en.md +1 -1
  234. package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
  235. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
  236. package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
  237. package/templates/.agents/rules/next-step-output.en.md +12 -11
  238. package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
  239. package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
  240. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
  241. package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
  242. package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
  243. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
  244. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
  245. package/templates/.agents/rules/pr-sync.en.md +30 -3
  246. package/templates/.agents/rules/pr-sync.github.en.md +12 -115
  247. package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
  248. package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
  249. package/templates/.agents/rules/release-commands.en.md +2 -2
  250. package/templates/.agents/rules/release-commands.github.en.md +10 -40
  251. package/templates/.agents/rules/release-commands.github.zh-CN.md +9 -39
  252. package/templates/.agents/rules/release-commands.zh-CN.md +2 -2
  253. package/templates/.agents/rules/review-handshake.en.md +10 -6
  254. package/templates/.agents/rules/review-handshake.zh-CN.md +10 -6
  255. package/templates/.agents/rules/task-management.en.md +11 -2
  256. package/templates/.agents/rules/task-management.zh-CN.md +11 -3
  257. package/templates/.agents/rules/task-short-id.en.md +25 -29
  258. package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
  259. package/templates/.agents/rules/testing-discipline.en.md +20 -2
  260. package/templates/.agents/rules/testing-discipline.zh-CN.md +20 -2
  261. package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
  262. package/templates/.agents/scripts/task-short-id.js +71 -533
  263. package/templates/.agents/skills/analyze-task/SKILL.en.md +26 -56
  264. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +30 -60
  265. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
  266. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
  267. package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
  268. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
  269. package/templates/.agents/skills/block-task/config/verify.json +1 -2
  270. package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
  271. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
  272. package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
  273. package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
  274. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
  275. package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
  276. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
  277. package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
  278. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
  279. package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
  280. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
  281. package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
  282. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
  283. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
  284. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
  285. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
  286. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
  287. package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
  288. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
  289. package/templates/.agents/skills/commit/SKILL.en.md +13 -11
  290. package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
  291. package/templates/.agents/skills/commit/config/verify.json +1 -2
  292. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
  293. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
  294. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
  295. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
  296. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
  297. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
  298. package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
  299. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
  300. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
  301. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
  302. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
  303. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
  304. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
  305. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
  306. package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
  307. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
  308. package/templates/.agents/skills/complete-task/config/verify.en.json +10 -7
  309. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +10 -7
  310. package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
  311. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
  312. package/templates/.agents/skills/create-pr/config/verify.json +1 -2
  313. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
  314. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
  315. package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -38
  316. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +16 -37
  317. package/templates/.agents/skills/create-task/SKILL.en.md +16 -13
  318. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -13
  319. package/templates/.agents/skills/create-task/config/verify.json +1 -2
  320. package/templates/.agents/skills/create-task/reference/context-capture.en.md +29 -0
  321. package/templates/.agents/skills/create-task/reference/context-capture.zh-CN.md +29 -0
  322. package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
  323. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
  324. package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
  325. package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
  326. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
  327. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
  328. package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
  329. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
  330. package/templates/.agents/skills/import-issue/config/verify.json +1 -2
  331. package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
  332. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
  333. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
  334. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
  335. package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
  336. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
  337. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  338. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  339. package/templates/.agents/skills/release/SKILL.en.md +16 -163
  340. package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
  341. package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
  342. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
  343. package/templates/.agents/skills/restore-task/config/verify.json +1 -2
  344. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
  345. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
  346. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
  347. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
  348. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
  349. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
  350. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
  351. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
  352. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
  353. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
  354. package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
  355. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
  356. package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
  357. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
  358. package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
  359. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
  360. package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
  361. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
  362. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
  363. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
  364. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
  365. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
  366. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
  367. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
  368. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
  369. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
  370. package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
  371. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
  372. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
  373. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
  374. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
  375. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
  376. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
  377. package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
  378. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
  379. package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
  380. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
  381. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
  382. package/templates/.agents/templates/task.en.md +24 -1
  383. package/templates/.agents/templates/task.zh-CN.md +24 -1
  384. package/templates/.claude/commands/analyze-task.en.md +1 -1
  385. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  386. package/templates/.claude/commands/block-task.en.md +1 -1
  387. package/templates/.claude/commands/block-task.zh-CN.md +1 -1
  388. package/templates/.claude/commands/cancel-task.en.md +1 -1
  389. package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
  390. package/templates/.claude/commands/check-task.en.md +1 -1
  391. package/templates/.claude/commands/check-task.zh-CN.md +1 -1
  392. package/templates/.claude/commands/code-task.en.md +1 -1
  393. package/templates/.claude/commands/code-task.zh-CN.md +1 -1
  394. package/templates/.claude/commands/commit.en.md +1 -0
  395. package/templates/.claude/commands/commit.zh-CN.md +1 -0
  396. package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
  397. package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
  398. package/templates/.claude/commands/complete-task.en.md +1 -1
  399. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  400. package/templates/.claude/commands/create-pr.en.md +1 -1
  401. package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
  402. package/templates/.claude/commands/plan-task.en.md +1 -1
  403. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  404. package/templates/.claude/commands/review-analysis.en.md +1 -1
  405. package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
  406. package/templates/.claude/commands/review-code.en.md +1 -1
  407. package/templates/.claude/commands/review-code.zh-CN.md +1 -1
  408. package/templates/.claude/commands/review-plan.en.md +1 -1
  409. package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
  410. package/templates/.claude/commands/watch-pr.en.md +1 -1
  411. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  412. package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
  413. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
  414. package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
  415. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
  416. package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
  417. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
  418. package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
  419. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
  420. package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
  421. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
  422. package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
  423. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
  424. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
  425. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
  426. package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
  427. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
  428. package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
  429. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
  430. package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
  431. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
  432. package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
  433. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
  434. package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
  435. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
  436. package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
  437. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
  438. package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
  439. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
  440. package/templates/.git-hooks/check-large-files.cjs +92 -0
  441. package/templates/.git-hooks/check-version-format.sh +5 -1
  442. package/templates/.git-hooks/pre-commit +1 -0
  443. package/templates/.opencode/commands/analyze-task.en.md +1 -1
  444. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  445. package/templates/.opencode/commands/check-task.en.md +1 -1
  446. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  447. package/templates/.opencode/commands/code-task.en.md +1 -1
  448. package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
  449. package/templates/.opencode/commands/commit.en.md +2 -0
  450. package/templates/.opencode/commands/commit.zh-CN.md +2 -0
  451. package/templates/.opencode/commands/complete-task.en.md +1 -1
  452. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  453. package/templates/.opencode/commands/plan-task.en.md +1 -1
  454. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  455. package/templates/.opencode/commands/review-analysis.en.md +1 -1
  456. package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
  457. package/templates/.opencode/commands/review-code.en.md +1 -1
  458. package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
  459. package/templates/.opencode/commands/review-plan.en.md +1 -1
  460. package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
  461. package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
  462. package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
  463. package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
  464. package/templates/.agents/scripts/workflow-warnings.js +0 -290
  465. package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
  466. package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
  467. package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
@@ -24,6 +24,12 @@ import {
24
24
  worktreeDirCandidates
25
25
  } from '../constants.ts';
26
26
  import { prepareDockerfile } from '../dockerfile.ts';
27
+ import {
28
+ assertBuildProxyCompatibility,
29
+ buildProxyFailureHint,
30
+ prepareBuildProxy,
31
+ redactBuildProxyValues
32
+ } from '../build-proxy.ts';
27
33
  import { detectEngine, ensureDocker } from '../engine.ts';
28
34
  import {
29
35
  commandForEngine,
@@ -39,10 +45,18 @@ import {
39
45
  import { resolveTaskBranch } from '../task-resolver.ts';
40
46
  import {
41
47
  resolveTools,
48
+ tmpfsSeedStagingPath,
49
+ tmpfsSeedTargetPath,
42
50
  toolConfigDirCandidates
43
51
  } from '../tools.ts';
44
- import type { SandboxTool } from '../tools.ts';
52
+ import type { SandboxTool, TmpfsSeedEntry } from '../tools.ts';
53
+ import {
54
+ assertFreshSandboxReady,
55
+ hydrateTmpfsSeedEntries,
56
+ prepareTmpfsMounts
57
+ } from '../recovery.ts';
45
58
  import { hostJoin, toEnginePath, volumeArg } from '../engines/wsl2-paths.ts';
59
+ import { sandboxCoreBindMounts } from '../mounts.ts';
46
60
  import { clipboardHostDir, CONTAINER_CLIPBOARD_MOUNT } from '../clipboard/paths.ts';
47
61
  import { validateSelinuxDisableEnv } from '../engines/selinux.ts';
48
62
  import { dotfilesCacheDir, materializeDotfiles } from '../dotfiles.ts';
@@ -87,7 +101,7 @@ alias gy='gemini --yolo; tput ed'
87
101
  `;
88
102
  const CONTAINER_HOME = '/home/devuser';
89
103
  const CONTAINER_SHELL_CONFIG_MOUNT = `${CONTAINER_HOME}/.host-shell-config`;
90
- const USAGE = `Usage: ai sandbox create <branch> [base] [--cpu <n>] [--memory <n>] [--no-refresh] [--inherit-proxy|-P]
104
+ const USAGE = `Usage: ai sandbox create <branch> [base] [--cpu <n>] [--memory <n>] [--no-refresh] [--inherit-proxy|-P] [--inherit-build-proxy|-B]
91
105
 
92
106
  Host aliases:
93
107
  ${'~'}/.agent-infra/aliases/sandbox.sh is auto-created on first run and exposed
@@ -97,7 +111,9 @@ Host aliases:
97
111
 
98
112
  Proxy:
99
113
  --inherit-proxy, -P Copy non-empty standard host proxy variables into the
100
- container environment through the private env file.`;
114
+ container environment through the private env file.
115
+ --inherit-build-proxy, -B Pass uppercase HTTP_PROXY, HTTPS_PROXY, and NO_PROXY
116
+ to managed image build steps for this invocation.`;
101
117
  const HOST_PROXY_ENV_KEYS = [
102
118
  'http_proxy',
103
119
  'HTTP_PROXY',
@@ -108,13 +124,20 @@ const HOST_PROXY_ENV_KEYS = [
108
124
  'no_proxy',
109
125
  'NO_PROXY'
110
126
  ] as const;
127
+ const MANAGED_GITHUB_GIT_CONFIG = [
128
+ '[credential]',
129
+ '\thelper = !gh auth git-credential',
130
+ '[credential "https://github.com"]',
131
+ '\thelper =',
132
+ '\thelper = !gh auth git-credential',
133
+ '[url "https://github.com/"]',
134
+ '\tinsteadOf = git@github.com:'
135
+ ];
111
136
 
112
137
  type SandboxCreateConfig = ReturnType<typeof loadConfig>;
113
138
  type PreparedDockerfile = ReturnType<typeof prepareDockerfile>;
114
139
  type ResolvedTool = { tool: SandboxTool; dir: string };
115
- type TmpfsSeedPlanEntry = {
116
- stagingPath: string;
117
- targetPath: string;
140
+ type TmpfsSeedPlanEntry = TmpfsSeedEntry & {
118
141
  volumeArgs: string[];
119
142
  };
120
143
  type RuntimeCheck = { name: string; cmd: string[] };
@@ -128,9 +151,9 @@ type ExecSyncOptions = ExecFileSyncOptions & {
128
151
  };
129
152
  type ExecSyncFn = (cmd: string, args: string[], options?: ExecSyncOptions) => Buffer | string;
130
153
  type EngineExecFn = (engine: string, cmd: string, args: string[], opts?: ExecFileSyncOptions) => Buffer | string;
131
- type EngineRunFn = (engine: string, cmd: string, args: string[], opts?: { cwd?: string }) => string;
154
+ type EngineRunFn = (engine: string, cmd: string, args: string[], opts?: { cwd?: string; env?: NodeJS.ProcessEnv }) => string;
132
155
  type EngineRunSafeFn = EngineRunFn;
133
- type EngineRunVerboseFn = (engine: string, cmd: string, args: string[], opts?: { cwd?: string }) => void;
156
+ type EngineRunVerboseFn = (engine: string, cmd: string, args: string[], opts?: { cwd?: string; env?: NodeJS.ProcessEnv }) => void;
134
157
  type DirectRunFn = (cmd: string, args: string[], opts?: { cwd?: string }) => string;
135
158
  type DirectRunSafeFn = DirectRunFn;
136
159
  type DirectRunVerboseFn = (cmd: string, args: string[], opts?: { cwd?: string }) => void;
@@ -249,6 +272,16 @@ function normalizeContainerHomeSeparators(content: string): string {
249
272
  return content.replace(containerHomePattern, (value) => value.replaceAll('\\', '/'));
250
273
  }
251
274
 
275
+ function isGitHubCliCredentialHelper(line: string): boolean {
276
+ const helperMatch = line.match(/^\s*helper\s*=\s*(.+?)\s*$/i);
277
+ if (!helperMatch) {
278
+ return false;
279
+ }
280
+
281
+ const helper = (helperMatch[1] ?? '').trim().replace(/^"(.*)"$/, '$1');
282
+ return /^!\s*(?:"[^"]*[\\/]+gh"|(?:\S*[\\/]+)?gh)\s+auth\s+git-credential(?:\s|$)/i.test(helper);
283
+ }
284
+
252
285
  export function sanitizeGitConfig(
253
286
  gitconfig: string,
254
287
  home: string,
@@ -266,11 +299,13 @@ export function sanitizeGitConfig(
266
299
  const sanitized = [];
267
300
  let inGpgSection = false;
268
301
  let currentSection = '';
302
+ let currentSectionName = '';
269
303
 
270
304
  for (const line of lines) {
271
305
  const sectionMatch = line.match(/^\s*\[([^\]]+)\]\s*$/);
272
306
  if (sectionMatch) {
273
307
  const sectionName = (sectionMatch[1] ?? '').trim();
308
+ currentSectionName = sectionName;
274
309
  currentSection = ((sectionName.match(/^([^\s"]+)/)?.[1]) ?? '').toLowerCase();
275
310
  inGpgSection = /^gpg(?:\s+"[^"]+")?$/i.test(sectionName);
276
311
  if (stripGpg && inGpgSection) {
@@ -298,11 +333,23 @@ export function sanitizeGitConfig(
298
333
  if (stripGpg && currentSection === 'user' && /^\s*signingKey\s*=.*$/i.test(line)) {
299
334
  continue;
300
335
  }
336
+ if (currentSection === 'credential' && isGitHubCliCredentialHelper(line)) {
337
+ continue;
338
+ }
339
+ if (
340
+ /^url\s+"https:\/\/github\.com\/"$/i.test(currentSectionName)
341
+ && /^\s*insteadOf\s*=\s*git@github\.com:\s*$/i.test(line)
342
+ ) {
343
+ continue;
344
+ }
301
345
 
302
346
  sanitized.push(line);
303
347
  }
304
348
 
305
- return appendSafeDirectories(sanitized, repoRoot).join('\n');
349
+ return [
350
+ ...appendSafeDirectories(sanitized, repoRoot),
351
+ ...MANAGED_GITHUB_GIT_CONFIG
352
+ ].join('\n');
306
353
  }
307
354
 
308
355
  export function hostHasGpgKeys(home: string, execFn: ExecSyncFn = execFileSync): boolean {
@@ -1225,7 +1272,9 @@ export function buildImage(
1225
1272
  runVerboseFn = runVerboseEngine,
1226
1273
  env = process.env,
1227
1274
  refresh = false,
1228
- lastRefresh
1275
+ lastRefresh,
1276
+ buildProxyArgs = [],
1277
+ buildEnv
1229
1278
  }: {
1230
1279
  engine?: string;
1231
1280
  runFn?: EngineRunFn;
@@ -1234,6 +1283,8 @@ export function buildImage(
1234
1283
  env?: NodeJS.ProcessEnv;
1235
1284
  refresh?: boolean;
1236
1285
  lastRefresh?: number;
1286
+ buildProxyArgs?: string[];
1287
+ buildEnv?: NodeJS.ProcessEnv;
1237
1288
  } = {}
1238
1289
  ): void {
1239
1290
  const selectedEngine = engine ?? detectEngine({ engine: config.engine });
@@ -1246,9 +1297,10 @@ export function buildImage(
1246
1297
  runSafeFn,
1247
1298
  env,
1248
1299
  refresh,
1249
- lastRefresh
1300
+ lastRefresh,
1301
+ buildProxyArgs
1250
1302
  }),
1251
- { cwd: config.repoRoot }
1303
+ { cwd: config.repoRoot, env: buildEnv }
1252
1304
  );
1253
1305
  }
1254
1306
 
@@ -1272,6 +1324,7 @@ export async function create(args: string[]): Promise<void> {
1272
1324
  memory: { type: 'string' },
1273
1325
  'no-refresh': { type: 'boolean' },
1274
1326
  'inherit-proxy': { type: 'boolean', short: 'P' },
1327
+ 'inherit-build-proxy': { type: 'boolean', short: 'B' },
1275
1328
  help: { type: 'boolean', short: 'h' }
1276
1329
  }
1277
1330
  });
@@ -1323,6 +1376,7 @@ export async function create(args: string[]): Promise<void> {
1323
1376
  const baseBranch = base ?? runSafe('git', ['-C', effectiveConfig.repoRoot, 'branch', '--show-current']);
1324
1377
  const expectedImageSignature = buildImageSignature(preparedDockerfile, tools);
1325
1378
  const engine = detectEngine(effectiveConfig);
1379
+ let createdTmpfsSeedPlan: TmpfsSeedPlanEntry[] = [];
1326
1380
 
1327
1381
  p.intro(pc.cyan('AI Sandbox'));
1328
1382
  p.log.info(
@@ -1356,6 +1410,15 @@ export async function create(args: string[]): Promise<void> {
1356
1410
  const needsImageBuild = signatureStale || refreshDue;
1357
1411
 
1358
1412
  if (needsImageBuild) {
1413
+ if (values['inherit-build-proxy'] && effectiveConfig.dockerfile) {
1414
+ throw new Error('Build proxy inheritance is unavailable with a custom sandbox Dockerfile.');
1415
+ }
1416
+ const buildProxy = prepareBuildProxy(
1417
+ values['inherit-build-proxy'] ?? false,
1418
+ process.env,
1419
+ engine
1420
+ );
1421
+ if (values['inherit-build-proxy']) assertBuildProxyCompatibility(engine);
1359
1422
  const buildRefresh = !imageExists || refreshDue;
1360
1423
  const buildLastRefresh = buildRefresh ? now : currentLastRefresh || 0;
1361
1424
 
@@ -1372,7 +1435,13 @@ export async function create(args: string[]): Promise<void> {
1372
1435
  tools,
1373
1436
  preparedDockerfile.path,
1374
1437
  expectedImageSignature,
1375
- { engine, refresh: buildRefresh, lastRefresh: buildLastRefresh }
1438
+ {
1439
+ engine,
1440
+ refresh: buildRefresh,
1441
+ lastRefresh: buildLastRefresh,
1442
+ buildProxyArgs: buildProxy.args,
1443
+ buildEnv: buildProxy.env
1444
+ }
1376
1445
  );
1377
1446
  p.log.success(
1378
1447
  refreshDue
@@ -1385,10 +1454,14 @@ export async function create(args: string[]): Promise<void> {
1385
1454
  if (refreshDue && !signatureStale && imageExists) {
1386
1455
  p.log.warn(
1387
1456
  'Scheduled sandbox image refresh failed; continuing with the existing image. ' +
1388
- commandErrorMessage(error)
1457
+ redactBuildProxyValues(commandErrorMessage(error), buildProxy.redactionValues)
1458
+ + (values['inherit-build-proxy'] ? ` ${buildProxyFailureHint(engine)}` : '')
1389
1459
  );
1390
1460
  } else {
1391
- throw error;
1461
+ const hint = values['inherit-build-proxy'] ? `\n${buildProxyFailureHint(engine)}` : '';
1462
+ throw new Error(
1463
+ `${redactBuildProxyValues(commandErrorMessage(error), buildProxy.redactionValues)}${hint}`
1464
+ );
1392
1465
  }
1393
1466
  }
1394
1467
  } else {
@@ -1571,9 +1644,12 @@ export async function create(args: string[]): Promise<void> {
1571
1644
  branch,
1572
1645
  repoRoot: effectiveConfig.repoRoot
1573
1646
  });
1574
- const shellConfigVolumes = hostShellConfig.mounts.flatMap(({ hostPath, containerPath }) => [
1647
+ const coreVolumes = sandboxCoreBindMounts(effectiveConfig, branch, {
1648
+ worktree,
1649
+ shellConfigHostDir: hostShellConfig.hostDir
1650
+ }).flatMap(({ hostPaths, containerPath, readOnly }) => [
1575
1651
  '-v',
1576
- volumeArg(engine, hostPath, containerPath, ':ro')
1652
+ volumeArg(engine, hostPaths[0]!, containerPath, readOnly ? ':ro' : '')
1577
1653
  ]);
1578
1654
  // Mount each declared seed read-only at an isolated staging path.
1579
1655
  // After docker run mounts the empty tmpfs, the container's default
@@ -1583,14 +1659,17 @@ export async function create(args: string[]): Promise<void> {
1583
1659
  // being exposed or written through.
1584
1660
  tmpfsSeedPlan = effectiveResolvedTools.flatMap(({ tool, dir }) =>
1585
1661
  (tool.tmpfs?.seed ?? []).flatMap((entry, index) => {
1662
+ const targetPath = tmpfsSeedTargetPath(tool.containerMount, entry);
1586
1663
  const hostPath = path.join(dir, entry);
1587
1664
  if (!fs.existsSync(hostPath)) {
1588
1665
  return [];
1589
1666
  }
1590
- const stagingPath = path.posix.join('/run/agent-infra/tmpfs-seeds', tool.id, String(index));
1667
+ const stagingPath = tmpfsSeedStagingPath(tool.id, index);
1591
1668
  return [{
1669
+ toolId: tool.id,
1670
+ containerMount: tool.containerMount,
1592
1671
  stagingPath,
1593
- targetPath: path.posix.join(tool.containerMount, entry),
1672
+ targetPath,
1594
1673
  volumeArgs: ['-v', volumeArg(engine, hostPath, stagingPath, ':ro')]
1595
1674
  }];
1596
1675
  })
@@ -1630,14 +1709,7 @@ export async function create(args: string[]): Promise<void> {
1630
1709
  sandboxLabel(effectiveConfig),
1631
1710
  '--label',
1632
1711
  `${sandboxBranchLabel(effectiveConfig)}=${branch}`,
1633
- '-v',
1634
- volumeArg(engine, worktree, '/workspace'),
1635
- '-v',
1636
- volumeArg(engine, workspaceDir, '/workspace/.agents/workspace'),
1637
- '-v',
1638
- volumeArg(engine, shareCommon, '/share/common'),
1639
- '-v',
1640
- volumeArg(engine, shareBranch, '/share/branch'),
1712
+ ...coreVolumes,
1641
1713
  ...buildClipboardVolumeArgs(engine, effectiveConfig.home),
1642
1714
  '-v',
1643
1715
  volumeArg(
@@ -1650,25 +1722,30 @@ export async function create(args: string[]): Promise<void> {
1650
1722
  ...tmpfsArgs,
1651
1723
  ...tmpfsSeedPlan.flatMap(({ volumeArgs }) => volumeArgs),
1652
1724
  ...liveMountVolumes,
1653
- ...shellConfigVolumes,
1654
1725
  ...envFile.dockerArgs,
1655
1726
  ...tzFlags,
1656
1727
  '-w',
1657
1728
  '/workspace',
1658
1729
  effectiveConfig.imageName
1659
1730
  ]);
1731
+ createdTmpfsSeedPlan = tmpfsSeedPlan;
1660
1732
  } finally {
1661
1733
  envFile.cleanup();
1662
1734
  }
1663
1735
 
1664
- for (const { stagingPath, targetPath } of tmpfsSeedPlan) {
1665
- runEngineTaskCommand(engine, 'docker', [
1666
- 'exec', container, 'mkdir', '-p', path.posix.dirname(targetPath)
1667
- ]);
1668
- runEngineTaskCommand(engine, 'docker', [
1669
- 'exec', container, 'cp', '-R', '--', stagingPath, targetPath
1670
- ]);
1671
- }
1736
+ prepareTmpfsMounts({
1737
+ engine,
1738
+ container,
1739
+ mountPaths: effectiveResolvedTools
1740
+ .filter(({ tool }) => tool.tmpfs)
1741
+ .map(({ tool }) => tool.containerMount)
1742
+ });
1743
+ hydrateTmpfsSeedEntries({
1744
+ engine,
1745
+ container,
1746
+ entries: tmpfsSeedPlan,
1747
+ replace: true
1748
+ });
1672
1749
 
1673
1750
  // Belt-and-suspenders: re-create the four shell-config symlinks at
1674
1751
  // runtime so users with a custom `sandbox.dockerfile` (which won't
@@ -1737,6 +1814,13 @@ export async function create(args: string[]): Promise<void> {
1737
1814
  }
1738
1815
 
1739
1816
  p.log.step('Verifying setup...');
1817
+ assertFreshSandboxReady({
1818
+ config: effectiveConfig,
1819
+ engine,
1820
+ branch,
1821
+ container,
1822
+ copiedEntries: createdTmpfsSeedPlan
1823
+ });
1740
1824
  const runningContainers = runSafeEngine(engine, 'docker', ['ps', '--format', '{{.Names}}']).split('\n');
1741
1825
  const checks = [
1742
1826
  { name: 'Container running', ok: runningContainers.includes(container) },
@@ -6,6 +6,7 @@ import {
6
6
  sandboxLabel
7
7
  } from '../constants.ts';
8
8
  import { detectEngine } from '../engine.ts';
9
+ import { ensureSandboxReady } from '../recovery.ts';
9
10
  import {
10
11
  formatCredentialWarnings,
11
12
  formatRemaining,
@@ -22,15 +23,15 @@ import {
22
23
  fetchSandboxRows,
23
24
  resolveBranchArg,
24
25
  selectSandboxContainer,
25
- startSandboxContainer
26
26
  } from './list-running.ts';
27
27
 
28
- const USAGE = `Usage: ai sandbox exec <branch | TASK-id | N | '#N'> [cmd...]
28
+ const USAGE = `Usage: ai sandbox exec [--recreate] <branch | TASK-id | N> [cmd...]
29
29
 
30
- N (bare) and '#N' both reference the same active task short id from
30
+ N references an active task short id from
31
31
  .agents/workspace/active/.short-ids.json. They resolve only via that
32
32
  registry — they do not reference a container's row position in
33
- 'ai sandbox ls' output.`;
33
+ 'ai sandbox ls' output. --recreate is a host recovery flag only before the
34
+ target; the same token after the target is passed to the container command.`;
34
35
  const TMUX_ENTRY_PATH = '/usr/local/bin/sandbox-tmux-entry';
35
36
 
36
37
  // Terminal-detection variables that interactive TUIs (e.g. claude-code)
@@ -123,6 +124,24 @@ export function formatCredentialSyncStatus(
123
124
  return null;
124
125
  }
125
126
 
127
+ export function parseEnterArgs(args: string[]): {
128
+ target: string;
129
+ command: string[];
130
+ recreate: boolean;
131
+ } {
132
+ let recreate = false;
133
+ let index = 0;
134
+ while (args[index] === '--recreate') {
135
+ recreate = true;
136
+ index += 1;
137
+ }
138
+ const target = args[index] ?? '';
139
+ if (!target) {
140
+ throw new Error(USAGE);
141
+ }
142
+ return { target, command: args.slice(index + 1), recreate };
143
+ }
144
+
126
145
  export async function enter(args: string[]): Promise<number> {
127
146
  if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
128
147
  process.stdout.write(`${USAGE}\n`);
@@ -135,8 +154,8 @@ export async function enter(args: string[]): Promise<number> {
135
154
  const config = loadConfig();
136
155
  validateClaudeCredentialsEnvOverride();
137
156
  const engine = detectEngine(config);
138
- const [firstArg = '', ...cmd] = args;
139
- const branch = resolveBranchArg(firstArg, { repoRoot: config.repoRoot });
157
+ const parsed = parseEnterArgs(args);
158
+ const branch = resolveBranchArg(parsed.target, { repoRoot: config.repoRoot });
140
159
  assertValidBranchName(branch);
141
160
 
142
161
  const { running, nonRunning } = fetchSandboxRows(
@@ -154,11 +173,19 @@ export async function enter(args: string[]): Promise<number> {
154
173
  `No sandbox found for branch '${branch}'. Run 'ai sandbox create ${branch}' to create one.`
155
174
  );
156
175
  }
157
- if (!found.running) {
158
- process.stderr.write(`Sandbox '${found.name}' is stopped; starting it...\n`);
159
- startSandboxContainer(engine, found.name);
160
- }
161
- const container = found.name;
176
+ const ready = await ensureSandboxReady({
177
+ config,
178
+ engine,
179
+ branch,
180
+ row: found,
181
+ allowRecreate: parsed.recreate,
182
+ recreate: async (targetBranch) => {
183
+ const { create } = await import('./create.ts');
184
+ await create([targetBranch, '--no-refresh']);
185
+ }
186
+ });
187
+ const container = ready.container;
188
+ const cmd = parsed.command;
162
189
 
163
190
  if (config.tools.includes('claude-code')) {
164
191
  try {
@@ -3,6 +3,7 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { runSafeEngine, runVerboseEngine } from '../shell.ts';
5
5
  import { resolveTaskBranch } from '../task-resolver.ts';
6
+ import { isRemovedHashShortIdInput } from '../../task/short-id.ts';
6
7
 
7
8
  export type SandboxRow = {
8
9
  name: string;
@@ -90,13 +91,13 @@ export function fetchSandboxRows(
90
91
 
91
92
  /**
92
93
  * Returns true iff `arg` is a syntactically valid task short reference.
93
- * Accepts both bare numeric ('11') and '#'-prefixed ('#11') forms.
94
+ * Accepts bare numeric ('11') task short ids.
94
95
  * Zero IO. Callers MUST use this as the gate before constructing any context
95
96
  * for resolveTaskShortRef — that way non-matching arguments (e.g. '#abc',
96
97
  * '#1.5', '#') never trigger sandbox list IO.
97
98
  */
98
99
  export function isTaskShortRef(arg: string): boolean {
99
- return /^#?\d+$/.test(arg);
100
+ return /^\d+$/.test(arg);
100
101
  }
101
102
 
102
103
  type RegistryLookup =
@@ -115,9 +116,7 @@ type RegistryLookup =
115
116
  function tryResolveFromRegistry(arg: string, repoRoot: string): RegistryLookup {
116
117
  const scriptPath = path.join(repoRoot, '.agents', 'scripts', 'task-short-id.js');
117
118
  if (!fs.existsSync(scriptPath)) return { status: 'miss' };
118
- // Strip leading '#' when forwarding bare-numeric input through the script's CLI.
119
- // (Script accepts both forms, but this avoids shell quoting confusion in error
120
- // messages echoed back to the user.)
119
+ // Forward the bare-numeric short ref to the registry script for ID resolution.
121
120
  const result = spawnSync('node', [scriptPath, 'resolve', arg], { encoding: 'utf8', cwd: repoRoot });
122
121
  if (result.status !== 0) return { status: 'miss' };
123
122
  const taskId = (result.stdout || '').trim();
@@ -149,7 +148,7 @@ function tryResolveFromRegistry(arg: string, repoRoot: string): RegistryLookup {
149
148
 
150
149
  /**
151
150
  /**
152
- * Resolve a task short reference (bare 'N' or '#N') to a branch name for the
151
+ * Resolve a bare task short reference to a branch name for the
153
152
  * sandbox entrypoint.
154
153
  *
155
154
  * Resolution: registry-only. Look up the short id in the global task-short-id
@@ -169,13 +168,13 @@ export function resolveTaskShortRef(
169
168
  if (lookup.status === 'hit') return lookup.branch;
170
169
  throw new Error(
171
170
  `short ref '${arg}' is not in the active task registry. ` +
172
- `'#N' and bare N resolve only via the registry (not by row position in 'ai sandbox ls'); ` +
171
+ `bare N resolves only via the registry (not by row position in 'ai sandbox ls'); ` +
173
172
  `use a task short id (e.g. 'ai sandbox exec 11'), a TASK-id, or a branch name.`
174
173
  );
175
174
  }
176
175
 
177
176
  /**
178
- * Resolve a sandbox command argument (`<branch | TASK-id | N | '#N'>`) to a
177
+ * Resolve a sandbox command argument (`<branch | TASK-id | N>`) to a
179
178
  * branch name, mirroring `ai sandbox exec` so that `start` and `exec` share one
180
179
  * input contract. Short refs go through the registry-only resolver (which throws
181
180
  * an actionable error on a miss); everything else flows through resolveTaskBranch
@@ -183,6 +182,9 @@ export function resolveTaskShortRef(
183
182
  * Callers still run assertValidBranchName on the result.
184
183
  */
185
184
  export function resolveBranchArg(arg: string, ctx: { repoRoot: string }): string {
185
+ if (isRemovedHashShortIdInput(arg)) {
186
+ throw new Error(`Invalid task short id '${arg}': task short ids must use bare digits`);
187
+ }
186
188
  return isTaskShortRef(arg)
187
189
  ? resolveTaskShortRef(arg, ctx)
188
190
  : resolveTaskBranch(arg, ctx.repoRoot);
@@ -16,8 +16,14 @@ import {
16
16
  parseImageLabels,
17
17
  parseRefreshTimestamp
18
18
  } from '../image-build.ts';
19
+ import {
20
+ assertBuildProxyCompatibility,
21
+ buildProxyFailureHint,
22
+ prepareBuildProxy,
23
+ redactBuildProxyValues
24
+ } from '../build-proxy.ts';
19
25
 
20
- const USAGE = `Usage: ai sandbox rebuild [--quiet] [--refresh]`;
26
+ const USAGE = `Usage: ai sandbox rebuild [--quiet] [--refresh] [--inherit-build-proxy|-B]`;
21
27
 
22
28
  type EngineRunFn = (engine: string, cmd: string, args: string[], opts?: { cwd?: string }) => string;
23
29
  type EngineRunSafeFn = EngineRunFn;
@@ -33,7 +39,8 @@ export function buildArgs(
33
39
  runSafeFn = runSafeEngine,
34
40
  env = process.env,
35
41
  refresh = false,
36
- lastRefresh
42
+ lastRefresh,
43
+ buildProxyArgs = []
37
44
  }: {
38
45
  engine?: string;
39
46
  runFn?: EngineRunFn;
@@ -41,6 +48,7 @@ export function buildArgs(
41
48
  env?: NodeJS.ProcessEnv;
42
49
  refresh?: boolean;
43
50
  lastRefresh?: number;
51
+ buildProxyArgs?: string[];
44
52
  } = {}
45
53
  ): string[] {
46
54
  return buildSandboxImageArgs(config, tools, dockerfilePath, imageSignature, {
@@ -49,7 +57,8 @@ export function buildArgs(
49
57
  runSafeFn,
50
58
  env,
51
59
  refresh,
52
- lastRefresh
60
+ lastRefresh,
61
+ buildProxyArgs
53
62
  });
54
63
  }
55
64
 
@@ -77,6 +86,7 @@ export async function rebuild(args: string[]): Promise<void> {
77
86
  options: {
78
87
  refresh: { type: 'boolean' },
79
88
  quiet: { type: 'boolean', short: 'q' },
89
+ 'inherit-build-proxy': { type: 'boolean', short: 'B' },
80
90
  help: { type: 'boolean', short: 'h' }
81
91
  }
82
92
  });
@@ -95,6 +105,11 @@ export async function rebuild(args: string[]): Promise<void> {
95
105
  const engine = detectEngine(config);
96
106
 
97
107
  await ensureDocker(config, undefined);
108
+ if (values['inherit-build-proxy'] && config.dockerfile) {
109
+ throw new Error('Build proxy inheritance is unavailable with a custom sandbox Dockerfile.');
110
+ }
111
+ const buildProxy = prepareBuildProxy(values['inherit-build-proxy'] ?? false, process.env, engine);
112
+ if (values['inherit-build-proxy']) assertBuildProxyCompatibility(engine);
98
113
  const lastRefresh = refresh ? Date.now() : readExistingLastRefresh(config, engine);
99
114
  p.intro(pc.cyan('Rebuilding sandbox image'));
100
115
 
@@ -105,9 +120,11 @@ export async function rebuild(args: string[]): Promise<void> {
105
120
  runEngine(engine, 'docker', buildArgs(config, tools, preparedDockerfile.path, imageSignature, {
106
121
  engine,
107
122
  refresh,
108
- lastRefresh
123
+ lastRefresh,
124
+ buildProxyArgs: buildProxy.args
109
125
  }), {
110
- cwd: config.repoRoot
126
+ cwd: config.repoRoot,
127
+ env: buildProxy.env
111
128
  });
112
129
  spinner.stop(pc.green('Sandbox image rebuilt'));
113
130
  } else {
@@ -118,13 +135,18 @@ export async function rebuild(args: string[]): Promise<void> {
118
135
  buildArgs(config, tools, preparedDockerfile.path, imageSignature, {
119
136
  engine,
120
137
  refresh,
121
- lastRefresh
138
+ lastRefresh,
139
+ buildProxyArgs: buildProxy.args
122
140
  }),
123
- { cwd: config.repoRoot }
141
+ { cwd: config.repoRoot, env: buildProxy.env }
124
142
  );
125
143
  p.log.success(pc.green('Sandbox image rebuilt'));
126
144
  }
127
145
  pruneSandboxDanglingImages(config, engine);
146
+ } catch (error) {
147
+ const message = redactBuildProxyValues(error instanceof Error ? error.message : String(error), buildProxy.redactionValues);
148
+ const hint = values['inherit-build-proxy'] ? `\n${buildProxyFailureHint(engine)}` : '';
149
+ throw new Error(`${message}${hint}`);
128
150
  } finally {
129
151
  preparedDockerfile.cleanup();
130
152
  }
@@ -7,12 +7,12 @@ import { assertValidBranchName, worktreeDirCandidates } from '../constants.ts';
7
7
  import { resolveBranchArg } from './list-running.ts';
8
8
  import { resolveTools, toolConfigDirCandidates } from '../tools.ts';
9
9
 
10
- const USAGE = `Usage: ai sandbox show <branch | TASK-id | N | '#N'>
10
+ const USAGE = `Usage: ai sandbox show <branch | TASK-id | N>
11
11
 
12
12
  Shows one sandbox's worktree path and per-tool state paths (Claude Code,
13
13
  Codex, Gemini CLI, OpenCode). The argument follows the same contract as
14
14
  'ai sandbox exec' and 'ai sandbox start': N (bare) is the recommended form
15
- for task short ids (e.g. 'ai sandbox show 11'); '#N', a TASK-id, or a plain
15
+ for task short ids (e.g. 'ai sandbox show 11'); a TASK-id or a plain
16
16
  branch name are also accepted. Use 'ai sandbox ls' for the container list.`;
17
17
 
18
18
  export type SandboxDetail = {