File layout
What agb writes in the target repo (.booster/, .worktrees/, .adlc/) and under your home directory.
agb keeps run state next to the code it builds, in three repo-local directories, plus a handful of user-global paths under your home directory. On first run agb appends the entries it needs to the target repo's .gitignore and commits them (ensureGitignore): .worktrees/, .booster/ and .adlc/*, with the ticket store, archive, specs and .adlc/config.json re-included so they stay tracked.
Target repository
<repo>/
├── .booster/ run state (gitignored, owner-only)
│ ├── run.lock.d/
│ │ └── meta.json per-repo run lock holder
│ ├── run.json live run state
│ ├── report.json final report of the last run
│ └── logs/<runId>/
│ ├── events.jsonl run event stream
│ └── <ticket>.jsonl agy transcript per ticket
├── .worktrees/ gitignored
│ ├── agb-<ticket id, lowercased>/ one worktree per ticket
│ ├── agb-integration-<8 hex>/ disposable merge worktrees
│ └── .attempt_git/ per-attempt git state
└── .adlc/
├── tickets/ or tickets.json ticket store (tracked)
├── ticket-archive/ archived tickets (tracked)
├── config.json ADLC trust root (tracked)
├── integration_journal.json merge transaction journal
├── leases/ pool lease heartbeats
├── graph-coupling.json input to adlc merge-forecast
└── manifest.jsonl gate evidence (gate-manifest).booster/
| Path | Written by | Notes |
|---|---|---|
run.lock.d/meta.json | acquireRepoLock | One agb run per repository at a time. The lock is a directory, created atomically; meta.json records the holder's pid and run id so a stale lock from a dead process can be reclaimed (C25). |
run.json | RunStatus.flush | Rewritten atomically (temp file plus rename) on every phase change; read by agb status and the sidecar dashboard (C25). |
report.json | RunStatus.report | Same object agb run prints on stdout (report write). |
logs/<runId>/events.jsonl | RunStatus.appendEvent | Append-only event stream (events path). |
logs/<runId>/<ticket>.jsonl | runAgy | One JSON line per agy invocation for that ticket (transcript path). |
The run id has the form run-<base36 timestamp> (runId). Formats are on Log formats.
.booster/, .booster/logs/ and each run's log directory are forced to mode 0700, and files are written 0600, because transcripts can quote repository contents (ownerOnlyDir). On filesystems without POSIX modes agb warns once instead of failing.
.worktrees/
Each ticket builds in .worktrees/agb-<id> on branch agb/<id>, with the id lowercased (createWorktree). A leftover worktree and branch with the same name from an earlier run are removed first. Merges happen in disposable .worktrees/agb-integration-<token> worktrees, so the main checkout is not used for integration (integration worktree); orphans are reaped at the next run's start. agb refuses to run if .worktrees is a symlink, not a directory, or resolves outside the repository (validateWorktreeRoot).
.adlc/
- Ticket store. Either the directory store
.adlc/tickets/(one JSON shard per ticket) or the legacy single file.adlc/tickets.json.agb doctorfails when both exist, because the plugin fails closed in that state (C25). integration_journal.json. The merge transaction journal, written atomically (temp file, fsync, rename) (C25). Its phases arePREPARED,GATES_PASSED,REF_ADVANCEDandFINALIZED(JOURNAL_PHASES). At startup,reconcileIntegrationJournalrolls back or completes whatever a crashed run left behind. See Integration journal.leases/. One<leaseId>.heartbeatper pool lease held by a live builder (C25). Inside the builder sandbox this directory is masked with a tmpfs so a builder cannot forge leases (bwrap mount).graph-coupling.json. Optional coupling data passed toadlc merge-forecast(C25).config.json. The ADLC trust root (sandbox attestation, attested flags). Humans edit it; agb only reads it. See Security.manifest.jsonl. Append-only gate evidence written throughadlc gate-manifest. See Gate evidence.
User-global paths
AGB_HOME_DIR, where noted, replaces your home directory; it defaults to os.homedir().
| Path | Purpose | Source |
|---|---|---|
~/.gemini/config/plugins/adlc-antigravity | Installed companion ADLC plugin. The only location the bundled build resolves it from. | adlc-bridge.mjs, pluginsDirFor |
~/.gemini/antigravity-cli/plugin_data/antigravity-booster/ | Booster data: migration lock and state, rails-guard-health.json diagnostic log. | boosterDataDir, healthLogPath |
~/.gemini/antigravity/brain/, ~/.gemini/jetski/brain/ | Antigravity plan conversations read by agb plan and agb brains. | brain.mjs |
~/.gemini/agb-sidecar-plugin-<pid>-<port>/ | Temporary plugin manifest agb sidecar registers, removed on exit (AGB_PLUGIN_DIR overrides). | bin/agb.mjs |
~/.local/bin/agb | Terminal shim installed by agb bootstrap; left alone if it has different content unless --force-reinstall. | installTerminalShim |
~/.local/bin/agy | First candidate when resolving the agy binary, before Homebrew and system paths. | resolveAgyBinary |
$AGB_HOME_DIR/.adlc/pinned, $AGB_HOME_DIR/.adlc/locks | Pinned copies and locks for the authenticated ADLC binary (AGB_EXEC_CACHE_DIR, AGB_EXEC_LOCKS_DIR override). | adlc-bridge.mjs |
~/.adlc/tmp | Private temp base for sandboxed builder launches. | agy.mjs |
$TMPDIR/agb_pools_shared.json, agb_pools_v2.json | Cross-process pool quota and lease state (AGB_POOLS_DIR, AGB_QUOTA_STATE, AGB_POOLS_V2 override). | getStateFile |
All override variables are listed in Environment variables.