feat(install): re-add Antigravity as a wiring target
CI / Check / Test (push) Failing after 1s
CI / Tag release (push) Skipped

Antigravity discovers skills via a path-entries JSON
(~/.gemini/config/skills.json), not a symlink directory. One entry points
at $AGENTS_DIR — the same managed, surfaces-filtered, collision-resolved
directory Crush/OpenCode/Pi already read — so Antigravity sees exactly the
same skill set as every other harness, for free.

Requires jq; every other target in this script stays dependency-free on
purpose, so wire_antigravity skips with a warning (not a hard failure) if
jq is missing. Merges into skills.json rather than overwriting it: the
file is documented as user-editable (json_configs.md — e.g. a personal
skills dir), so a hand-added entry must survive a re-run.

Was previously removed as "unused" (mathias/skills#41 — Antigravity usage
picked back up). Mistral Vibe stays removed.

Closes #41

Bump-Type: minor

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-30 08:58:34 +02:00
co-authored by Claude Sonnet 5
parent 86529d2ac5
commit e9ad692418
3 changed files with 99 additions and 3 deletions
+49
View File
@@ -55,6 +55,7 @@ run_install() {
AGENTS_SKILLS_DIR="$_f/home/.agents/skills" \
CRUSH_SKILLS_DIR="$_f/home/.config/crush/skills" \
OPENCODE_SKILLS_DIR="$_f/home/.config/opencode/skills" \
ANTIGRAVITY_SKILLS_JSON="$_f/home/.gemini/config/skills.json" \
SKILLS_EXTRA_SOURCES="$_extra" \
bash "$SUT" 2>&1)
rc=$?
@@ -183,5 +184,53 @@ else
no 'a source with no surfaces convention is linked as-is' "$out"
fi
# --- 9. Antigravity: the managed agents dir is registered, not the raw checkout
# skills.json entries must point at $AGENTS_DIR — that's what already carries
# surfaces-filtering, collision handling and multi-source merge. Pointing at
# the checkout directly would bypass all of it and give Antigravity a
# different skill set than every other harness.
f=$(new_fixture antigravity)
out=$(run_install "$f")
AG="$f/home/.gemini/config/skills.json"
if [ ! -f "$AG" ]; then
no 'Antigravity skills.json is created' "$out"
elif ! command -v jq >/dev/null 2>&1; then
no 'jq available to verify Antigravity wiring' "(jq missing on test host)"
else
registered=$(jq -r --arg p "$f/home/.agents/skills" '[.entries[]? | select(.path == $p)] | length' "$AG")
if [ "$registered" = "1" ]; then
ok 'Antigravity registers the managed agents dir, not the raw checkout'
else
no 'Antigravity registers the managed agents dir, not the raw checkout' "$(cat "$AG")"
fi
fi
# --- 10. Antigravity wiring is idempotent ------------------------------------
f=$(new_fixture antigravity_idempotent)
run_install "$f" >/dev/null
out=$(run_install "$f")
AG="$f/home/.gemini/config/skills.json"
count=$(jq '.entries | length' "$AG" 2>/dev/null || echo "?")
if [ "$count" = "1" ]; then
ok 'Antigravity wiring is idempotent (no duplicate entries)'
else
no 'Antigravity wiring is idempotent (no duplicate entries)' "entries=$count"$'\n'"$out"
fi
# --- 11. Antigravity wiring preserves entries it doesn't own -----------------
# A user may hand-edit skills.json to point at their own personal skills dir
# (json_configs.md documents this). Our merge must not clobber it.
f=$(new_fixture antigravity_preserve)
mkdir -p "$f/home/.gemini/config"
printf '{"entries":[{"path":"/Users/mathias/personal-skills"}]}' > "$f/home/.gemini/config/skills.json"
out=$(run_install "$f")
AG="$f/home/.gemini/config/skills.json"
personal=$(jq -r '[.entries[]? | select(.path == "/Users/mathias/personal-skills")] | length' "$AG" 2>/dev/null || echo 0)
if [ "$personal" = "1" ]; then
ok 'Antigravity wiring preserves pre-existing hand-authored entries'
else
no 'Antigravity wiring preserves pre-existing hand-authored entries' "$(cat "$AG")"$'\n'"$out"
fi
printf '\ninstall: %d passed, %d failed\n' "$pass" "$fail"
[ "$fail" -eq 0 ]