These docs track main. Latest release: v1.0.0.

antigravity-booster
Reference

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/

PathWritten byNotes
run.lock.d/meta.jsonacquireRepoLockOne 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.jsonRunStatus.flushRewritten atomically (temp file plus rename) on every phase change; read by agb status and the sidecar dashboard (C25).
report.jsonRunStatus.reportSame object agb run prints on stdout (report write).
logs/<runId>/events.jsonlRunStatus.appendEventAppend-only event stream (events path).
logs/<runId>/<ticket>.jsonlrunAgyOne 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 doctor fails 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 are PREPARED, GATES_PASSED, REF_ADVANCED and FINALIZED (JOURNAL_PHASES). At startup, reconcileIntegrationJournal rolls back or completes whatever a crashed run left behind. See Integration journal.
  • leases/. One <leaseId>.heartbeat per 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 to adlc 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 through adlc gate-manifest. See Gate evidence.

User-global paths

AGB_HOME_DIR, where noted, replaces your home directory; it defaults to os.homedir().

PathPurposeSource
~/.gemini/config/plugins/adlc-antigravityInstalled 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/agbTerminal shim installed by agb bootstrap; left alone if it has different content unless --force-reinstall.installTerminalShim
~/.local/bin/agyFirst candidate when resolving the agy binary, before Homebrew and system paths.resolveAgyBinary
$AGB_HOME_DIR/.adlc/pinned, $AGB_HOME_DIR/.adlc/locksPinned copies and locks for the authenticated ADLC binary (AGB_EXEC_CACHE_DIR, AGB_EXEC_LOCKS_DIR override).adlc-bridge.mjs
~/.adlc/tmpPrivate temp base for sandboxed builder launches.agy.mjs
$TMPDIR/agb_pools_shared.json, agb_pools_v2.jsonCross-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.

On this page