@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.
- package/README.md +6 -1
- package/README.zh-CN.md +5 -1
- package/bin/cli.ts +2 -2
- package/dist/bin/cli.js +2 -2
- package/dist/bin/internal-cli.js +103 -0
- package/dist/lib/decide.js +81 -90
- package/dist/lib/defaults.json +1 -0
- package/dist/lib/git/review-snapshot.js +79 -0
- package/dist/lib/git/workflow.js +101 -0
- package/dist/lib/internal/git-workflow.js +42 -0
- package/dist/lib/internal/platform-checks.js +119 -0
- package/dist/lib/internal/platform-comment.js +129 -0
- package/dist/lib/internal/platform-context.js +46 -0
- package/dist/lib/internal/platform-issue.js +142 -0
- package/dist/lib/internal/platform-pr.js +146 -0
- package/dist/lib/internal/platform-release-notes.js +53 -0
- package/dist/lib/internal/release-workflow.js +320 -0
- package/dist/lib/internal/task-artifact.js +67 -0
- package/dist/lib/internal/task-context.js +43 -0
- package/dist/lib/internal/task-event.js +70 -0
- package/dist/lib/internal/task-ledger.js +114 -0
- package/dist/lib/internal/task-lifecycle.js +58 -0
- package/dist/lib/internal/task-short-id.js +83 -0
- package/dist/lib/internal/task-snapshot.js +47 -0
- package/dist/lib/internal/task-verify.js +50 -0
- package/dist/lib/internal/task-warning.js +74 -0
- package/dist/lib/platform/adapters.js +14 -0
- package/dist/lib/platform/context.js +146 -0
- package/dist/lib/platform/github-client.js +124 -0
- package/dist/lib/platform/github-release-notes.js +96 -0
- package/dist/lib/platform/issue-comments.js +409 -0
- package/dist/lib/platform/issue-metadata.js +183 -0
- package/dist/lib/platform/issues.js +619 -0
- package/dist/lib/platform/merged-pr-equivalence.js +54 -0
- package/dist/lib/platform/metadata-labels.js +28 -0
- package/dist/lib/platform/pr-checks.js +216 -0
- package/dist/lib/platform/pr-summary.js +88 -0
- package/dist/lib/platform/pull-request-metadata.js +38 -0
- package/dist/lib/platform/pull-requests.js +340 -0
- package/dist/lib/platform/release-notes.js +143 -0
- package/dist/lib/platform/releases.js +82 -0
- package/dist/lib/platform/types.js +22 -0
- package/dist/lib/platform/verification-required.js +102 -0
- package/dist/lib/platform/verification-sync.js +1014 -0
- package/dist/lib/platform/verification.js +6 -0
- package/dist/lib/release/channels.js +31 -0
- package/dist/lib/release/workflow.js +32 -0
- package/dist/lib/render.js +3 -2
- package/dist/lib/run/index.js +24 -7
- package/dist/lib/sandbox/build-proxy.js +63 -0
- package/dist/lib/sandbox/capture.js +25 -3
- package/dist/lib/sandbox/commands/create.js +93 -31
- package/dist/lib/sandbox/commands/enter.js +34 -11
- package/dist/lib/sandbox/commands/list-running.js +10 -8
- package/dist/lib/sandbox/commands/rebuild.js +24 -7
- package/dist/lib/sandbox/commands/show.js +2 -2
- package/dist/lib/sandbox/commands/start.js +53 -15
- package/dist/lib/sandbox/image-build.js +2 -1
- package/dist/lib/sandbox/index.js +6 -6
- package/dist/lib/sandbox/mounts.js +36 -0
- package/dist/lib/sandbox/recovery.js +562 -0
- package/dist/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
- package/dist/lib/sandbox/runtimes/base.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/java17.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/java21.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/node20.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/node22.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/python3.dockerfile +8 -1
- package/dist/lib/sandbox/shell.js +2 -1
- package/dist/lib/sandbox/task-resolver.js +5 -1
- package/dist/lib/sandbox/tools.js +19 -0
- package/dist/lib/server/protocol.js +5 -5
- package/dist/lib/task/activity-log.js +61 -0
- package/dist/lib/task/artifact-lifecycle.js +427 -0
- package/dist/lib/task/command-options.js +30 -0
- package/dist/lib/task/commands/cat.js +36 -6
- package/dist/lib/task/commands/decisions.js +80 -46
- package/dist/lib/task/commands/files.js +21 -7
- package/dist/lib/task/commands/grep.js +55 -7
- package/dist/lib/task/commands/issue-body.js +33 -19
- package/dist/lib/task/commands/log.js +27 -70
- package/dist/lib/task/commands/show.js +20 -7
- package/dist/lib/task/commands/status.js +18 -8
- package/dist/lib/task/decision-intents.js +154 -0
- package/dist/lib/task/decision-items.js +53 -0
- package/dist/lib/task/events.js +318 -0
- package/dist/lib/task/frontmatter.js +159 -1
- package/dist/lib/task/implementation-inputs.js +117 -0
- package/dist/lib/task/index.js +12 -9
- package/dist/lib/task/issue-form.js +21 -6
- package/dist/lib/task/ledger-intents.js +185 -0
- package/dist/lib/task/ledger.js +65 -35
- package/dist/lib/task/lifecycle.js +484 -0
- package/dist/lib/task/resolve-ref.js +152 -32
- package/dist/lib/task/review-artifacts.js +101 -0
- package/dist/lib/task/review-fingerprint.js +55 -0
- package/dist/lib/task/sections.js +358 -4
- package/dist/lib/task/short-id.js +292 -7
- package/dist/lib/task/snapshot.js +95 -0
- package/dist/lib/task/verification-checks.js +8 -0
- package/dist/lib/task/verification-config.js +14 -0
- package/dist/lib/task/verification-engine.js +923 -0
- package/dist/lib/task/verification-review.js +3 -0
- package/dist/lib/task/verification-types.js +2 -0
- package/dist/lib/task/verification.js +113 -0
- package/dist/lib/task/workflow-warning-intents.js +131 -0
- package/dist/lib/task/workflow-warnings.js +10 -78
- package/dist/lib/task/write.js +241 -0
- package/lib/decide.ts +57 -97
- package/lib/defaults.json +1 -0
- package/lib/git/review-snapshot.ts +73 -0
- package/lib/git/workflow.ts +101 -0
- package/lib/internal/git-workflow.ts +37 -0
- package/lib/internal/platform-checks.ts +101 -0
- package/lib/internal/platform-comment.ts +99 -0
- package/lib/internal/platform-context.ts +33 -0
- package/lib/internal/platform-issue.ts +116 -0
- package/lib/internal/platform-pr.ts +119 -0
- package/lib/internal/platform-release-notes.ts +55 -0
- package/lib/internal/release-workflow.ts +288 -0
- package/lib/internal/task-artifact.ts +47 -0
- package/lib/internal/task-context.ts +35 -0
- package/lib/internal/task-event.ts +51 -0
- package/lib/internal/task-ledger.ts +86 -0
- package/lib/internal/task-lifecycle.ts +41 -0
- package/lib/internal/task-short-id.ts +55 -0
- package/lib/internal/task-snapshot.ts +32 -0
- package/lib/internal/task-verify.ts +33 -0
- package/lib/internal/task-warning.ts +50 -0
- package/lib/platform/adapters.ts +30 -0
- package/lib/platform/context.ts +164 -0
- package/lib/platform/github-client.ts +146 -0
- package/lib/platform/github-release-notes.ts +132 -0
- package/lib/platform/issue-comments.ts +479 -0
- package/lib/platform/issue-metadata.ts +250 -0
- package/lib/platform/issues.ts +693 -0
- package/lib/platform/merged-pr-equivalence.ts +70 -0
- package/lib/platform/metadata-labels.ts +33 -0
- package/lib/platform/pr-checks.ts +247 -0
- package/lib/platform/pr-summary.ts +90 -0
- package/lib/platform/pull-request-metadata.ts +69 -0
- package/lib/platform/pull-requests.ts +386 -0
- package/lib/platform/release-notes.ts +167 -0
- package/lib/platform/releases.ts +71 -0
- package/lib/platform/types.ts +74 -0
- package/lib/platform/verification-required.ts +109 -0
- package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
- package/lib/platform/verification.ts +11 -0
- package/lib/release/channels.ts +30 -0
- package/lib/release/workflow.ts +31 -0
- package/lib/render.ts +3 -2
- package/lib/run/index.ts +25 -7
- package/lib/sandbox/build-proxy.ts +94 -0
- package/lib/sandbox/capture.ts +29 -3
- package/lib/sandbox/commands/create.ts +120 -36
- package/lib/sandbox/commands/enter.ts +38 -11
- package/lib/sandbox/commands/list-running.ts +10 -8
- package/lib/sandbox/commands/rebuild.ts +29 -7
- package/lib/sandbox/commands/show.ts +2 -2
- package/lib/sandbox/commands/start.ts +50 -16
- package/lib/sandbox/image-build.ts +4 -1
- package/lib/sandbox/index.ts +6 -6
- package/lib/sandbox/mounts.ts +55 -0
- package/lib/sandbox/recovery.ts +828 -0
- package/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
- package/lib/sandbox/runtimes/base.dockerfile +8 -1
- package/lib/sandbox/runtimes/java17.dockerfile +8 -1
- package/lib/sandbox/runtimes/java21.dockerfile +8 -1
- package/lib/sandbox/runtimes/node20.dockerfile +8 -1
- package/lib/sandbox/runtimes/node22.dockerfile +8 -1
- package/lib/sandbox/runtimes/python3.dockerfile +8 -1
- package/lib/sandbox/shell.ts +3 -1
- package/lib/sandbox/task-resolver.ts +5 -1
- package/lib/sandbox/tools.ts +31 -0
- package/lib/server/protocol.ts +5 -5
- package/lib/task/activity-log.ts +62 -0
- package/lib/task/artifact-lifecycle.ts +484 -0
- package/lib/task/command-options.ts +32 -0
- package/lib/task/commands/cat.ts +22 -9
- package/lib/task/commands/decisions.ts +49 -47
- package/lib/task/commands/files.ts +14 -6
- package/lib/task/commands/grep.ts +34 -7
- package/lib/task/commands/issue-body.ts +26 -21
- package/lib/task/commands/log.ts +17 -70
- package/lib/task/commands/show.ts +14 -6
- package/lib/task/commands/status.ts +17 -7
- package/lib/task/decision-intents.ts +163 -0
- package/lib/task/decision-items.ts +64 -0
- package/lib/task/events.ts +320 -0
- package/lib/task/frontmatter.ts +202 -2
- package/lib/task/implementation-inputs.ts +137 -0
- package/lib/task/index.ts +12 -9
- package/lib/task/issue-form.ts +24 -6
- package/lib/task/ledger-intents.ts +201 -0
- package/lib/task/ledger.ts +77 -31
- package/lib/task/lifecycle.ts +458 -0
- package/lib/task/resolve-ref.ts +197 -36
- package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
- package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +26 -12
- package/lib/task/sections.ts +486 -4
- package/lib/task/short-id.ts +403 -9
- package/lib/task/snapshot.ts +143 -0
- package/lib/task/verification-checks.ts +9 -0
- package/lib/task/verification-config.ts +20 -0
- package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +230 -421
- package/lib/task/verification-review.ts +10 -0
- package/lib/task/verification-types.ts +29 -0
- package/lib/task/verification.ts +156 -0
- package/lib/task/workflow-warning-intents.ts +142 -0
- package/lib/task/workflow-warnings.ts +10 -78
- package/lib/task/write.ts +468 -0
- package/package.json +4 -2
- package/templates/.agents/README.en.md +4 -3
- package/templates/.agents/README.zh-CN.md +4 -3
- package/templates/.agents/rules/README.en.md +6 -5
- package/templates/.agents/rules/README.zh-CN.md +6 -5
- package/templates/.agents/rules/create-issue.en.md +1 -1
- package/templates/.agents/rules/create-issue.github.en.md +5 -184
- package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
- package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
- package/templates/.agents/rules/human-decision-context.en.md +36 -0
- package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
- package/templates/.agents/rules/issue-fields.github.en.md +4 -148
- package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
- package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
- package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
- package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
- package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
- package/templates/.agents/rules/issue-sync.en.md +1 -1
- package/templates/.agents/rules/issue-sync.github.en.md +14 -301
- package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
- package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
- package/templates/.agents/rules/milestone-inference.en.md +1 -1
- package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
- package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
- package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
- package/templates/.agents/rules/next-step-output.en.md +12 -11
- package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
- package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
- package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
- package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
- package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
- package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
- package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
- package/templates/.agents/rules/pr-sync.en.md +30 -3
- package/templates/.agents/rules/pr-sync.github.en.md +12 -115
- package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
- package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
- package/templates/.agents/rules/release-commands.en.md +2 -2
- package/templates/.agents/rules/release-commands.github.en.md +10 -40
- package/templates/.agents/rules/release-commands.github.zh-CN.md +9 -39
- package/templates/.agents/rules/release-commands.zh-CN.md +2 -2
- package/templates/.agents/rules/review-handshake.en.md +10 -6
- package/templates/.agents/rules/review-handshake.zh-CN.md +10 -6
- package/templates/.agents/rules/task-management.en.md +11 -2
- package/templates/.agents/rules/task-management.zh-CN.md +11 -3
- package/templates/.agents/rules/task-short-id.en.md +25 -29
- package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
- package/templates/.agents/rules/testing-discipline.en.md +20 -2
- package/templates/.agents/rules/testing-discipline.zh-CN.md +20 -2
- package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
- package/templates/.agents/scripts/task-short-id.js +71 -533
- package/templates/.agents/skills/analyze-task/SKILL.en.md +26 -56
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +30 -60
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
- package/templates/.agents/skills/block-task/config/verify.json +1 -2
- package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
- package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
- package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
- package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
- package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
- package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
- package/templates/.agents/skills/commit/SKILL.en.md +13 -11
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
- package/templates/.agents/skills/commit/config/verify.json +1 -2
- package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
- package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
- package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
- package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
- package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
- package/templates/.agents/skills/complete-task/config/verify.en.json +10 -7
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +10 -7
- package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
- package/templates/.agents/skills/create-pr/config/verify.json +1 -2
- package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
- package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
- package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -38
- package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +16 -37
- package/templates/.agents/skills/create-task/SKILL.en.md +16 -13
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -13
- package/templates/.agents/skills/create-task/config/verify.json +1 -2
- package/templates/.agents/skills/create-task/reference/context-capture.en.md +29 -0
- package/templates/.agents/skills/create-task/reference/context-capture.zh-CN.md +29 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
- package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
- package/templates/.agents/skills/import-issue/config/verify.json +1 -2
- package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
- package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
- package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
- package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
- package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/release/SKILL.en.md +16 -163
- package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
- package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
- package/templates/.agents/skills/restore-task/config/verify.json +1 -2
- package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
- package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
- package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
- package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
- package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
- package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
- package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
- package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
- package/templates/.agents/templates/task.en.md +24 -1
- package/templates/.agents/templates/task.zh-CN.md +24 -1
- package/templates/.claude/commands/analyze-task.en.md +1 -1
- package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.claude/commands/block-task.en.md +1 -1
- package/templates/.claude/commands/block-task.zh-CN.md +1 -1
- package/templates/.claude/commands/cancel-task.en.md +1 -1
- package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
- package/templates/.claude/commands/check-task.en.md +1 -1
- package/templates/.claude/commands/check-task.zh-CN.md +1 -1
- package/templates/.claude/commands/code-task.en.md +1 -1
- package/templates/.claude/commands/code-task.zh-CN.md +1 -1
- package/templates/.claude/commands/commit.en.md +1 -0
- package/templates/.claude/commands/commit.zh-CN.md +1 -0
- package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
- package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
- package/templates/.claude/commands/complete-task.en.md +1 -1
- package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
- package/templates/.claude/commands/create-pr.en.md +1 -1
- package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
- package/templates/.claude/commands/plan-task.en.md +1 -1
- package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
- package/templates/.claude/commands/review-analysis.en.md +1 -1
- package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.claude/commands/review-code.en.md +1 -1
- package/templates/.claude/commands/review-code.zh-CN.md +1 -1
- package/templates/.claude/commands/review-plan.en.md +1 -1
- package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
- package/templates/.claude/commands/watch-pr.en.md +1 -1
- package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
- package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
- package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
- package/templates/.git-hooks/check-large-files.cjs +92 -0
- package/templates/.git-hooks/check-version-format.sh +5 -1
- package/templates/.git-hooks/pre-commit +1 -0
- package/templates/.opencode/commands/analyze-task.en.md +1 -1
- package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/check-task.en.md +1 -1
- package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/code-task.en.md +1 -1
- package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/commit.en.md +2 -0
- package/templates/.opencode/commands/commit.zh-CN.md +2 -0
- package/templates/.opencode/commands/complete-task.en.md +1 -1
- package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/plan-task.en.md +1 -1
- package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-analysis.en.md +1 -1
- package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-code.en.md +1 -1
- package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-plan.en.md +1 -1
- package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
- package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
- package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
- package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
- package/templates/.agents/scripts/workflow-warnings.js +0 -290
- package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
- package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
- 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
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
|
1647
|
+
const coreVolumes = sandboxCoreBindMounts(effectiveConfig, branch, {
|
|
1648
|
+
worktree,
|
|
1649
|
+
shellConfigHostDir: hostShellConfig.hostDir
|
|
1650
|
+
}).flatMap(({ hostPaths, containerPath, readOnly }) => [
|
|
1575
1651
|
'-v',
|
|
1576
|
-
volumeArg(engine,
|
|
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 =
|
|
1667
|
+
const stagingPath = tmpfsSeedStagingPath(tool.id, index);
|
|
1591
1668
|
return [{
|
|
1669
|
+
toolId: tool.id,
|
|
1670
|
+
containerMount: tool.containerMount,
|
|
1592
1671
|
stagingPath,
|
|
1593
|
-
targetPath
|
|
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
|
-
|
|
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
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
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
|
|
28
|
+
const USAGE = `Usage: ai sandbox exec [--recreate] <branch | TASK-id | N> [cmd...]
|
|
29
29
|
|
|
30
|
-
N
|
|
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
|
|
139
|
-
const branch = resolveBranchArg(
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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');
|
|
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 = {
|