Skip to content

Commit 7189258

Browse files
jgravelleclaude
andcommitted
v1.108.89 — revert 1.108.88 Antigravity install target; document correct manual config
1.108.88's `install antigravity` wrote to the wrong locations (~/.gemini/settings.json + ~/.gemini/antigravity/skills/, taken from a competitor README) and never actually configured Antigravity. - Removed the install target, client auto-detection, alias, and skill wiring; deleted cli/antigravity.py and tests/test_antigravity_install.py. cli/init.py, cli/skills.py, server.py restored byte-for-byte to their 1.108.87 shape. - README now documents the real path: Antigravity (2.0/IDE/CLI) loads MCP servers from the shared HOME-level ~/.gemini/config/mcp_config.json; shared skills in ~/.gemini/skills/. Copy-paste block added to "Works with". #307 was already closed 2026-05-23 (manual config documented/working). A first-class installer stays deferred pending demand. No INDEX_VERSION bump. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent cf4dcb8 commit 7189258

10 files changed

Lines changed: 94 additions & 285 deletions

File tree

CHANGELOG.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,30 @@
22

33
All notable changes to jcodemunch-mcp are documented here.
44

5-
## [1.108.88] - 2026-06-30 - Antigravity (Google) install target (#307)
5+
## [1.108.89] - 2026-06-30 - Revert the 1.108.88 Antigravity install target; document correct manual config
6+
7+
1.108.88 added an `install antigravity` target that wrote to the **wrong**
8+
config locations (`~/.gemini/settings.json` and `~/.gemini/antigravity/skills/`),
9+
so it did not actually configure Antigravity. This release backs that out and
10+
replaces it with correctly-pathed documentation.
11+
12+
### Changed
13+
14+
- **Removed the `install antigravity` target** (and Antigravity client
15+
auto-detection / alias / skill wiring) added in 1.108.88. `cli/antigravity.py`
16+
deleted; `cli/skills.py` and `cli/init.py` restored to their 1.108.87 shape.
17+
- **README now documents the real path.** Antigravity (2.0 / IDE / CLI) loads
18+
MCP servers from the shared **`~/.gemini/config/mcp_config.json`** (HOME-level
19+
only) under the `mcpServers` key; shared agent skills live in
20+
`~/.gemini/skills/` (CLI-only in `~/.gemini/antigravity-cli/skills/`). A copy-
21+
paste `mcp_config.json` block is in the "Works with" section.
22+
23+
No code path other than the reverted installer is affected; no INDEX_VERSION
24+
bump. (Antigravity has worked via manual config since #307 was closed
25+
2026-05-23; this just documents it correctly. A first-class installer remains
26+
deferred pending real demand.)
27+
28+
## [1.108.88] - 2026-06-30 - Antigravity (Google) install target (#307) [reverted in 1.108.89]
629

730
First-class onboarding for Google's Antigravity agent, which follows the Gemini
831
CLI configuration contract.

CLAUDE.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# jcodemunch-mcp — Project Brief
22

33
## Current State
4-
- **Version:** 1.108.88 — Antigravity (Google) install target (#307). Antigravity follows the Gemini CLI contract: MCP servers in `~/.gemini/settings.json` under a top-level `mcpServers` object (same shape as every other json_patch client), skills under `~/.gemini/antigravity/skills/`. So MCP registration rides the existing path: `_detect_clients()` adds an `MCPClient("Antigravity", ~/.gemini/settings.json, "json_patch")` when `~/.gemini` exists, and `"antigravity"` is in `_AGENT_ALIASES` → `install antigravity` / `install --all` / `init` / `uninstall` / `install-status` all work. New `cli/antigravity.py` owns the Antigravity paths + skill install (`install_antigravity_skill`/`uninstall_antigravity_skill`/`antigravity_skill_status`). `cli/skills.py` refactored: new directory-keyed core (`_install_skill_at`/`_uninstall_skill_at`/`_skill_status_at`) shared by Claude + Antigravity bundles — Claude skill behavior/return-strings byte-identical (existing tests pass). `run_init` installs the Antigravity skill when `antigravity_present()`; `install_status` reports it under `skills.antigravity`. **Scope = PRD phase 1 (MCP + skills only); the AfterTool context-enrichment hook is a later phase, and #307 stays OPEN pending a real-Antigravity end-to-end confirmation (unit tests can't prove the live channel — verification asymmetry).** New `tests/test_antigravity_install.py` (13). NO INDEX_VERSION bump. Files: `cli/antigravity.py` (new), `cli/skills.py`, `cli/init.py`, `server.py` (install help). PRD: `docs/prd-antigravity-hooks.md`. Clean-room competitive response (see memory `reference_competitor_gitnexus`).
4+
- **Version:** 1.108.89 — Revert the 1.108.88 `install antigravity` target; document the correct manual config instead. 1.108.88 wrote to the WRONG paths (`~/.gemini/settings.json` + `~/.gemini/antigravity/skills/`, lifted from a competitor README) so it never configured Antigravity. **Authoritative paths (Google docs + our own `reference_antigravity_integration` memory):** Antigravity (2.0/IDE/CLI) loads MCP servers from the shared HOME-level **`~/.gemini/config/mcp_config.json`** (`mcpServers` key); shared skills in `~/.gemini/skills/` (CLI-only `~/.gemini/antigravity-cli/skills/`). This release deletes `cli/antigravity.py`, restores `cli/skills.py`+`cli/init.py`+`server.py` to 1.108.87 shape, removes `tests/test_antigravity_install.py`, and adds a copy-paste `mcp_config.json` block to README "Works with". **#307 was already CLOSED 2026-05-23** (manual config documented/working); a first-class installer stays DEFERRED (demand threshold ~5 reports, `feedback_demand_driven_installer_support`). Lesson: reconcile our own hands-on memory before trusting a competitor's README; verify config paths against the live contract. NO INDEX_VERSION bump.
55
- **Versions 1.108.85–1.108.87** (all 2026-06-30): **.85** install-mechanism-aware `watch` hint (`watch_extra_install_command()` → pipx inject / uv tool install / uvx --with) + migration-warning de-spam (`_MIGRATION_SCHEMA_WARNED` warn-once per repo) — #357 follow-up @zakblacki. **.86** `watch-all` prints a steady-state line (Ctrl+C / `watch-install`) + per-repo "Now watching … (idle until you edit a file)" so the post-index silence isn't read as a hang. **.87** License v1.1: non-commercial use/copy/modify stay free but redistribution narrowed (no registry republish, no rename/rebrand, no false-authorship, no name/marks) — response to the AnimAIOS `animamunch` PyPI fork; see memory `project_animamunch_fork`.
66
- **Version:** 1.108.84 — Install-mechanism-aware `upgrade` (#357, reported by @zakblacki on a pipx install). `jcodemunch-mcp upgrade` ran `sys.executable -m pip install -U` blindly; pipx/uv venvs ship NO `pip` module → `No module named pip`, pip exited non-zero, and the command **bailed before refreshing hooks**. Compounding it: the startup version-drift warning (`server.py`) told the user to run `jcodemunch-mcp upgrade` to clear the stale-hook nag — the exact pip-less-failing command — so it never cleared. Fix (rewrote `cli/upgrade.py`): new `detect_install_mechanism()` (path/env heuristic, no subprocess) → `(mechanism, upgrade_command)` for pip/pipx/uv/uvx/venv. `_pip_available()` gates the in-process `pip install -U`: present → runs as before (a genuine pip *failure* now refreshes hooks anyway + preserves the non-zero rc, was: skip-and-bail); **absent → does NOT shell out to a foreign package manager** (honors jjg's stated "detect then tell, don't guess-and-run" stance from the issue thread), prints the exact command (`pipx upgrade` / `uv tool upgrade`), and refreshes hooks in-process via `init --hooks` (pip-free, stamps `last_init_version.txt` so the nag clears). The nag warning now leads with `init --hooks`. NO INDEX_VERSION bump. New `tests/test_v1_108_84.py` (11). Files: `cli/upgrade.py` (rewrite), `server.py` (warning text). Side issues answered in #357 reply (not bugs): `.pack/nodejs` migration warning = stale starter-pack index; `find_dead_code` `framework_warning` inflated dead-code % on a Node project because its entry-point heuristic looks for `main.py`/`app.py` (pass `entry_point_patterns` or reindex); real-time freshness = `watch-all`. See [[project_jmunch_console]].
77
- **Version:** 1.108.83 — Tame `watch-all` CPU under WSL (#356, reported by @Blainexi). `watch-all` pegged 15-30% CPU non-stop on WSL. NOT a busy loop: **`watchfiles` auto-enables polling whenever it detects WSL** (inotify unreliable across the boundary, confirmed in watchfiles docs), and its default 300ms poll re-stats the whole watched tree several times/sec — multiplied across every indexed repo. `DefaultFilter` drops `node_modules`/`.git` *events* but the polling walk still stats them (structural cost). Fix: the `awatch` call now passes `poll_delay_ms=_watch_poll_delay_ms()` (resolves `JCODEMUNCH_WATCH_POLL_DELAY_MS` → `WATCHFILES_POLL_DELAY_MS` → `DEFAULT_WATCH_POLL_DELAY_MS=1000`; non-positive/garbage → default); ignored when native FS events are used (no-op off WSL). Plus a one-time WSL startup hint (`_is_wsl()`) naming the two levers: raise the poll delay, or set `WATCHFILES_FORCE_POLLING=false` for Linux-filesystem repos to use native inotify (~0 idle CPU); `/mnt/*` repos need polling. NO INDEX_VERSION bump. New `tests/test_v1_108_83.py` (11); `test_watch_all.py`/`test_watcher_lock.py` green. Files: `watcher.py`, `watch_all.py`. See [[project_jmunch_console]].
@@ -99,8 +99,7 @@ src/jcodemunch_mcp/
9999
agent_selector.py # Complexity scoring + model routing (off/manual/auto); default provider batting orders
100100
cli/
101101
init.py # `jcodemunch-mcp init` — one-command onboarding (client detection, config patching, CLAUDE.md, Cursor rules, Windsurf rules, hooks); --demo flag. v1.105.1: `install <agent>` / `uninstall` / `install-status` verbs. v1.107.0: `--skills` flag on install, skills block in install_status report
102-
skills.py # v1.107.0: Claude Agent Skill bundle writer. _build_skill_content() composes YAML frontmatter + tier-filtered tool-usage decision tree. install_claude_skill / uninstall_claude_skill / skill_status. Lives at ~/.claude/skills/jcodemunch/SKILL.md (global) or ./.claude/skills/jcodemunch/SKILL.md (project). Reuses _filter_policy_for_tools from init.py for tier awareness. v1.108.88: directory-keyed core (_install_skill_at / _uninstall_skill_at / _skill_status_at) shared with the Antigravity bundle
103-
antigravity.py # v1.108.88: Antigravity (Google) integration. Gemini-family paths (gemini_settings_path = ~/.gemini/settings.json for MCP; antigravity_skills_dir = ~/.gemini/antigravity/skills/) + skill install/uninstall/status reusing skills.py's directory-keyed core. MCP registration itself rides init.py's json_patch path (Antigravity is a detected client). PRD phase 1 (no AfterTool hook yet); see docs/prd-antigravity-hooks.md
102+
skills.py # v1.107.0: Claude Agent Skill bundle writer. _build_skill_content() composes YAML frontmatter + tier-filtered tool-usage decision tree. install_claude_skill / uninstall_claude_skill / skill_status. Lives at ~/.claude/skills/jcodemunch/SKILL.md (global) or ./.claude/skills/jcodemunch/SKILL.md (project). Reuses _filter_policy_for_tools from init.py for tier awareness
104103
hooks.py # PreToolUse (Read interceptor) + PostToolUse (auto-reindex) + PreCompact (session snapshot) + TaskCompleted (post-task diagnostics) + SubagentStart (repo briefing) hook handlers for Claude Code
105104
groq/
106105
cli.py # `gcm` CLI entrypoint — codebase Q&A (single question + --chat mode)

README.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ pip install jcodemunch-mcp
369369
jcodemunch-mcp init
370370
```
371371

372-
`init` auto-detects your MCP clients (Claude Code, Claude Desktop, Cursor, Windsurf, Continue, Antigravity), writes their config entries, installs the CLAUDE.md prompt policy so your agent actually uses jCodeMunch, optionally installs enforcement hooks (PreToolUse read guard + PostToolUse auto-reindex + PreCompact session snapshot), optionally indexes your project, and audits your agent config files for token waste. Run `jcodemunch-mcp init --help` for all flags.
372+
`init` auto-detects your MCP clients (Claude Code, Claude Desktop, Cursor, Windsurf, Continue), writes their config entries, installs the CLAUDE.md prompt policy so your agent actually uses jCodeMunch, optionally installs enforcement hooks (PreToolUse read guard + PostToolUse auto-reindex + PreCompact session snapshot), optionally indexes your project, and audits your agent config files for token waste. Run `jcodemunch-mcp init --help` for all flags.
373373

374374
> **Prefer a one-line CLAUDE.md?** From v1.71.0 the server exposes a
375375
> `jcodemunch_guide` tool that returns the same policy snippet `claude-md
@@ -862,7 +862,7 @@ Tested configurations:
862862
|----------|--------|
863863
| **Claude Code / Claude Desktop** | `jcodemunch-mcp init` (auto-detects and patches config) |
864864
| **Cursor / Windsurf / Continue** | `jcodemunch-mcp init` or manual `mcp.json` |
865-
| **Antigravity (Google)** | `jcodemunch-mcp install antigravity` — registers the MCP server in `~/.gemini/settings.json` and installs the skill bundle under `~/.gemini/antigravity/skills/` |
865+
| **Antigravity (Google)** | Add a `jcodemunch` entry to `~/.gemini/config/mcp_config.json` (shared by Antigravity 2.0 / IDE / CLI). See below. |
866866
| **OpenAI Codex CLI** | Add `[mcp_servers.jcodemunch]` block to `~/.codex/config.toml` (see below) |
867867
| **Cline / Roo Code** | Add via the MCP marketplace UI or paste `command: uvx`, `args: ["jcodemunch-mcp"]` |
868868
| **Zed** | Add to `settings.json` under `context_servers` |
@@ -920,6 +920,32 @@ args = ["jcodemunch-mcp"]
920920
```
921921
</details>
922922
923+
<details>
924+
<summary>Antigravity (Google) config</summary>
925+
926+
Antigravity (2.0, IDE, and CLI) loads MCP servers from a single shared file at
927+
`~/.gemini/config/mcp_config.json` (HOME-level only — project-local
928+
`.antigravitycli/mcp_config.json` is read but not loaded). Add:
929+
930+
```json
931+
// ~/.gemini/config/mcp_config.json
932+
{
933+
"mcpServers": {
934+
"jcodemunch": {
935+
"command": "uvx",
936+
"args": ["jcodemunch-mcp"]
937+
}
938+
}
939+
}
940+
```
941+
942+
Restart Antigravity so it re-reads the config; tools appear under
943+
`mcp(jcodemunch/*)`. To grant the jcodemunch agent skill to all Antigravity
944+
tools, drop the bundle from `jcodemunch-mcp install claude-code --skills`
945+
(at `~/.claude/skills/jcodemunch/SKILL.md`) into the shared skills dir
946+
`~/.gemini/skills/jcodemunch/` (or the CLI-only `~/.gemini/antigravity-cli/skills/`).
947+
</details>
948+
923949
<details>
924950
<summary>Hermes Agent config</summary>
925951

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "jcodemunch-mcp"
3-
version = "1.108.88"
3+
version = "1.108.89"
44
description = "Token-efficient MCP server for source code exploration via tree-sitter AST parsing"
55
readme = "README.md"
66
requires-python = ">=3.10"

src/jcodemunch_mcp/cli/antigravity.py

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/jcodemunch_mcp/cli/init.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,6 @@ def _detect_clients() -> list[MCPClient]:
247247
if continue_dir.exists():
248248
clients.append(MCPClient("Continue", continue_dir / "config.json", "json_patch"))
249249

250-
# Antigravity (Google) — Gemini-family contract: MCP servers live in
251-
# ~/.gemini/settings.json under the same `mcpServers` shape we patch
252-
# elsewhere, so registration reuses the json_patch path. (Skills install
253-
# separately under ~/.gemini/antigravity/skills/, handled in cli/antigravity.)
254-
from .antigravity import gemini_dir, gemini_settings_path
255-
if gemini_dir().exists():
256-
clients.append(MCPClient("Antigravity", gemini_settings_path(), "json_patch"))
257-
258250
return clients
259251

260252

@@ -1175,17 +1167,6 @@ def run_init(
11751167
f"Write .claude/skills/jcodemunch/SKILL.md {where}",
11761168
"Claude loads the skill on demand for code-navigation tasks instead of carrying the policy block in baseline context every turn",
11771169
))
1178-
# Antigravity uses a separate skills dir (~/.gemini/antigravity/skills/);
1179-
# install the same bundle there when an Antigravity/Gemini config exists.
1180-
from .antigravity import antigravity_present, install_antigravity_skill
1181-
if antigravity_present():
1182-
amsg = install_antigravity_skill(dry_run=dry_run, backup=backup)
1183-
print(f" Antigravity Skill:{amsg}")
1184-
if demo and "would" in amsg:
1185-
_demo_actions.append((
1186-
"Write ~/.gemini/antigravity/skills/jcodemunch/SKILL.md",
1187-
"Antigravity loads the jCodemunch skill on demand for code-navigation tasks",
1188-
))
11891170

11901171
# ----- Step 3: Agent hooks -----
11911172
do_hooks = hooks
@@ -1572,7 +1553,6 @@ def uninstall_copilot_hooks(*, dry_run: bool = False, backup: bool = True) -> st
15721553
"cursor": "Cursor",
15731554
"windsurf": "Windsurf",
15741555
"continue": "Continue",
1575-
"antigravity": "Antigravity",
15761556
"all": "__all__",
15771557
}
15781558

@@ -1670,9 +1650,6 @@ def run_uninstall(
16701650
for scope in ("global", "project"):
16711651
msg = uninstall_claude_skill(scope=scope, dry_run=dry_run, backup=backup)
16721652
print(f" Claude Skill ({scope}):{msg}")
1673-
from .antigravity import uninstall_antigravity_skill
1674-
amsg = uninstall_antigravity_skill(dry_run=dry_run)
1675-
print(f" Antigravity Skill:{amsg}")
16761653

16771654
print()
16781655
if dry_run:
@@ -1780,11 +1757,9 @@ def install_status() -> dict[str, Any]:
17801757

17811758
# Claude Agent Skill bundle (v1.107.0) — per-scope presence
17821759
from .skills import skill_status as _skill_status
1783-
from .antigravity import antigravity_skill_status as _ag_skill_status
17841760
report["skills"] = {
17851761
"global": _skill_status("global"),
17861762
"project": _skill_status("project"),
1787-
"antigravity": _ag_skill_status(),
17881763
}
17891764

17901765
return report
@@ -1827,10 +1802,6 @@ def print_status(report: Optional[dict[str, Any]] = None, *, as_json: bool = Fal
18271802
info = report["skills"].get(scope, {})
18281803
flag = "[x]" if info.get("present") else "[ ]"
18291804
print(f" {flag} {scope} ({info.get('path', '')})")
1830-
ag = report["skills"].get("antigravity")
1831-
if ag:
1832-
flag = "[x]" if ag.get("present") else "[ ]"
1833-
print(f" {flag} antigravity ({ag.get('path', '')})")
18341805
print()
18351806

18361807

0 commit comments

Comments
 (0)