Contributing
How to set up, test and land a change in antigravity-booster.
antigravity-booster has no runtime dependencies. Every package, including the @adlc/* toolkit, is a devDependency installed by npm ci (C28). Tickets live in the .adlc/tickets/ directory store, and the CI rails-guard enforces their rails from it since #87 (adlc-rails-guard.yml).
Thanks for considering a contribution. This repo runs its own doctrine on itself, so a few of the rules below are enforced by CI rather than by convention.
Getting set up
git clone https://github.com/voodootikigod/antigravity-booster.git
cd antigravity-booster
npm ci
npm test # fully offline: fake-agy + fake-adlc fixtures, no API keysnpm test needs no credentials and reaches no network. If a change makes the
suite require either, that is a bug in the change.
To exercise the real CLI you also need Google Antigravity's agy on PATH and
the ADLC toolkit (npm i -g @adlc/cli). agb doctor reports what is missing.
The bar for a change
Tests must be load-bearing. A passing suite is not evidence; a suite that
fails when you break the code is. Before submitting, delete the guard your test
covers and confirm your test goes red. If it stays green, the test is decorative
and will be treated as such in review. adlc hollow-test automates this.
Fix the code, not the test. If a test fails, the default assumption is that the test is right.
Match the surrounding code. No new dependencies without a reason that survives the question "what does this do that Node cannot?" — the package ships with two, both first-party.
Things CI will reject
- Frozen rails. Paths declared as
railsin.adlc/tickets.jsoncannot be edited by a PR. This is enforced in-session by a hook and at merge by.github/workflows/adlc-rails-guard.yml. If your change genuinely needs to touch one, it needs its own ticket — not a bypass. - Removing or rewriting base tickets.
.adlc/tickets.jsonis append-only in a PR; existing tickets must survive byte-identically. - A drifted lockfile. CI runs
npm ci, sopackage-lock.jsonmust agree withpackage.json. - Undocumented commands. Every dispatched command needs a row in the
COMMANDStable inbin/agb.mjs; a test enforces it.
Committed bundles (dist/, vendor/)
The plugin ships prebuilt bundles so agy plugin install <git-url> works without npm install. They are generated, never hand-edited:
- After changing anything under
bin/,lib/,hooks/ormcp/, runnpm run buildand commitdist/with the source change. CI rebuilds and fails on any drift. - When a rebase or restack conflicts inside
dist/orvendor/, do not resolve the conflict by hand. Resolve the source conflicts, then runnpm run buildand commit the regenerated output. The CI drift gate is the arbiter. vendor/cache/adlc-antigravity-<version>.tgzis the pristine npm tarball. CI re-downloads it and requires byte-identity; never edit or repack it.
Do not bump the version in your PR
Leave package.json's version alone. Releases are cut separately: a release PR
carries the bump and nothing else, and the tag goes up immediately after it
merges. The tag is what triggers publishing.
A bump inside a feature PR lands a new version on main with no tag behind it,
so nothing publishes and nothing complains — the release is stranded until
someone notices npm is behind. That is not hypothetical: 0.5.0 shipped a day
late for exactly this reason. .github/workflows/release-drift.yml now catches
it within a day, but the cheaper fix is not to do it.
Platform notes
Gate sandboxing uses sandbox-exec and is macOS-only, so several security tests
skip on Linux. CI runs a macOS leg specifically to exercise them — if you touch
lib/gates.mjs, watch that leg, not just the Linux one.
Commits and PRs
Conventional commit prefixes (feat:, fix:, test:, docs:, chore:, ci:).
Explain why in the body; the diff already shows what. Keep unrelated changes in
separate commits.
main requires review, so open a PR rather than pushing to it.
Reporting security issues
Do not open a public issue — see SECURITY.md.