Releases: azmym/gemini-plugin
Release list
v0.6.1
Fixed
- Done-claim validation received empty or misleading diff evidence.
stop-done-claim.shsummarized the work withgit diff --stat HEAD~1, which produced nothing usable in four common cases: an unborn HEAD (the first commit not yet made), a root commit (no parent, soHEAD~1errors out), a multi-commit task (only the most recent commit was shown, hiding the rest of the work), and uncommitted changes (HEAD~1ignores the working tree entirely). In each case the gemini-validator was handed weak evidence to audit the "done" claim against. Fixed by addingbuild_diff_summary()tohooks/lib/common.sh: it shows staged work on an unborn HEAD, uncommitted changes against HEAD, and the whole branch since it forked from the default branch (detected asorigin/main,main, ormaster), falling back toHEAD~1and then the single commit when no fork point exists.
v0.6.0
Added
- Automatic design-review pass. Whenever a design/plan artifact is written (a
*-design.mdspec, a*-plan.md, or a file under aspecs//plans/directory) via a newPostToolUse(Write|Edit)hook, or when native plan mode exits, the plugin asks Claude to dispatch gemini-validator (VALIDATE_DESIGN) and gemini-challenger (CHALLENGE_DESIGN) over it. The pass is advisory (findings surface but never block), deduped by file content hash so cosmetic re-edits do not re-fire, exempt from the manual one-consult-per-turn cap (it is part of the uncounted hook channel), and silenced by the existingCLAUDE_PLUGIN_GEMINI_DISABLE_HOOKS/brainstorm.offkill switch. The artifact globs are overridable viaCLAUDE_PLUGIN_GEMINI_DESIGN_GLOBS.
Changed
- Verdict handling is now per-dispatch advisory-or-blocking.
subagent-verdict-handler.shreads and consumes a per-agent "pending mode" marker written by the dispatching hook. Afail/blockverdict blocks (exit 2) only when the marker isblocking(the default when no marker exists, which preserves the plan-validator and done-claim gates); the design-review pass writesadvisorymarkers so its findings never halt the flow. - Native plan-mode exit now also runs an advisory challenger alongside the existing blocking plan-validator (the validator gate is unchanged).
v0.5.1
Fixed
- Agents stalled "hunting for the tool name" in sessions with many MCP servers. When numerous MCP servers are connected, Claude Code switches MCP tools into deferred mode: the tool name is shown in a system reminder but its schema is not loaded, so a direct call fails until the caller materializes it via
ToolSearch. The five agents told themselves to "use the gemini_search_grounded tool" but never mentionedToolSearch, so a subagent in a heavy-MCP session could not find a directly-callable Gemini tool, burned its turn budget hunting for the name, and ended mid-investigation without emitting its JSON, after which the orchestrator fell back to plain web search. This was intermittent because a light session loads the tools directly and a capable model sometimes rediscoversToolSearchunaided. Distinct from the v0.4.1tools:-allowlist bug and from the stale-session casegemini-doctorcovers. Fixed by adding a "Deferred tools (do this FIRST)" step to each agent's "Tool availability" section: callToolSearchwith a namespace-agnostic keyword query (e.g.gemini search grounded) to load the schema, then call the exact tool name returned; treat the tool as missing only afterToolSearchreturns no match.
Changed
gemini-consultskill documents the deferred-tool path and points to/gemini-plugin:gemini-doctorwhen an agent returnsunavailable/unknownwith a missing-tool error.tests/mcp-namespace.batsnow asserts every agent documents theToolSearchdeferred-tool step using a keyword query (not a hardcodedmcp__path).
v0.5.0 — gemini-doctor diagnostic command
Added
-
/gemini-plugin:gemini-doctorcommand. A one-step self-diagnostic that distinguishes a real Gemini outage from a stale session. It runs four checks:- API key configured (without printing it).
- MCP server reachable from the main agent: resolves the grounded-search tool under the plugin namespace (
mcp__plugin_gemini-plugin_gemini__*) or the manual-install namespace (mcp__gemini__*), then calls it for real. - Subagent grounding path: spawns
gemini-researcherand confirms it actually sees a Gemini tool and grounds (the check that catches the most common failure). - On-disk plugin version (what the next fresh session will load).
When checks 1 and 2 pass but check 3 fails, the doctor reports STALE SESSION and tells you to restart Claude Code. This is the common cause of "grounding produced nothing" reports: the MCP server works, but a session started before a plugin update still has the outdated agent definitions loaded in memory.
Upgrade note: run /plugin and update gemini-plugin to v0.5.0, then start a fresh session so the new command and current agents load.
PR #18.
v0.4.1 — MCP namespace fix + fail-loud agents
Fixed
- Agents could not call Gemini when installed as a plugin. Plugin-registered MCP servers are namespaced under the plugin (the tool names carry a plugin prefix:
mcp__plugin_gemini-plugin_gemini__*), but every agent'stools:allowlist named the bare un-prefixed form (mcp__gemini__*), which does not exist in a plugin session. An agent whose allowlist names only nonexistent tools gets zero Gemini tools and silently falls back to training data (observed: gemini-researcher returned empty citations, low confidence, and a wrong answer). Fixed by removing thetools:block from all five agents so they inherit the session's Gemini tools under whatever namespace is registered (works for both plugin and manual installs). Prose and reference docs now use namespace-agnostic short tool names. - Agents no longer fabricate when Gemini is unavailable. Each agent now fails loud: if no Gemini MCP tool is present in the session, it returns verdict "unknown" (researcher: confidence "unavailable") with an error field naming the missing tool, instead of answering from training knowledge.
Added
tests/mcp-namespace.batsregression guard: forbids atools:key in agent frontmatter and any hardcoded plugin/server MCP namespace path in agents, skills, and hook scripts.
Upgrade note: run /plugin and update gemini-plugin to v0.4.1 to pick up this fix; the old cached install will not have it.
PR #15.
v0.4.0 — gemini-reviewer agent + gemini-consult dispatch rule
Added
gemini-revieweragent (5th subagent). A generalist third-reviewer for diffs and PRs, covering the cross-cutting concerns the other four agents do not own: security, threading correctness, library/version drift, doc accuracy, dead code, and complexity. Sonnet, maxTurns 10, returns structured JSON {verdict, strengths, issues, next_actions}. Advisory: changes_requested surfaces inline but does not block, because the reviewer is dispatched manually rather than by a hook.gemini-consultdispatch-rule skill (9th skill). Tells the main Claude when to consult Gemini, which of the five agents to route to, and enforces a one-consult-per-turn cap on manual dispatches (the always-on hooks are a separate, uncounted channel). Ports the disagreement protocol and "what you are NOT" scope guards.
Changed
gemini-revieweradded to the SubagentStop matcher so its transcript is read and persisted to plan-history.
PR #14.
v0.3.0 — fix subagent partial-response failures
Fixes user-reported failures where the gemini-validator subagent (and others) were returning partial responses without delivering the final JSON verdict. The verdict-handler hook then had nothing to parse and the validation was silently lost.
Root cause
Three combining factors: tight maxTurns budgets, under-spec'd models for structured-output workloads, and a system prompt that didn't structurally enforce the JSON-only final-turn rule.
Per-user direction: double maxTurns, bump model tier
| Agent | Old model | New model | Old maxTurns | New maxTurns |
|---|---|---|---|---|
| gemini-validator | haiku | sonnet | 3 | 6 |
| gemini-challenger | sonnet | opus | 4 | 8 |
| gemini-researcher | haiku | sonnet | 6 | 12 |
| gemini-summarizer | sonnet | opus | 2 | 4 |
System prompts now include explicit turn-budget plans reserving the final turn for JSON emission only.
Cost impact
Sonnet/Opus per call is ~4-5x Haiku/Sonnet. Combined with v0.2.0's brainstorm-on-by-default (researcher fires on every prompt), expect 5-10x higher Gemini-side cost per session vs v0.1.3.
Mitigation: /gemini-plugin:gemini-brainstorm-off reduces researcher invocations to keyword-matching prompts only.
How to update
/plugin marketplace update synthforge
/plugin install gemini-plugin@synthforge
Full changelog
https://github.com/azmym/gemini-plugin/blob/main/CHANGELOG.md#030---2026-05-28
v0.2.0 — brainstorming on by default
Per user request, this release makes Gemini grounding fire on every prompt by default rather than only on prompts matching the narrow keyword regex.
Behavior change
Before (v0.1.x): the grounding hook only fired when a prompt matched patterns like latest version of X or CVE-YYYY-NNN. Brainstorming mode was opt-in via a brainstorm.lock file.
After (v0.2.0): every prompt triggers a gemini-researcher consultation by default. To opt out and fall back to keyword-only grounding, run:
/gemini-plugin:gemini-brainstorm-off
To re-enable the default after opting out:
/gemini-plugin:gemini-brainstorm-on
Cost note
Per-prompt grounding catches stale-training-data answers but adds a Gemini call (Haiku, fast and cheap, but still real) to every prompt. Use /gemini-plugin:gemini-brainstorm-off if you want to control cost or reduce latency on chatty sessions.
Migration from v0.1.x
If you had brainstorm.lock set in v0.1.x, you can delete it (it's a no-op now). If you want LESS grounding than the new default, run /gemini-plugin:gemini-brainstorm-off once.
How to update
/plugin marketplace update synthforge
/plugin install gemini-plugin@synthforge
Full changelog
https://github.com/azmym/gemini-plugin/blob/main/CHANGELOG.md#020---2026-05-28
v0.1.3 — hook event/exit-code contract alignment
Hot-fix release for hook-event/exit-code mismatches found by an audit of every hook against the official Claude Code hooks documentation. The visible symptom in v0.1.2 was a wall-of-text "UserPromptSubmit operation blocked by hook" message on prompts containing common operational words (release, app, api, etc).
Root cause
Different hook events have different exit 2 semantics. We had used exit 2 + stderr everywhere. Five of seven hooks were wrong:
| Hook | What exit 2 actually does |
What we now use |
|---|---|---|
UserPromptSubmit |
Blocks prompt and erases it; stderr shown to user | exit 0 + JSON additionalContext |
PreToolUse(Bash) (destructive) |
Blocks tool; stderr to Claude | exit 0 + JSON permissionDecision: deny + additionalContext |
PreToolUse(ExitPlanMode) (plan validation) |
Blocks plan exit | exit 0 + JSON additionalContext (plan still reaches user; validator runs alongside) |
PreCompact |
Blocks compaction; stderr to user | exit 0 + JSON additionalContext (no longer blocks compaction) |
Stop |
Prevents stopping; stderr to Claude | exit 0 + JSON decision: block + reason + additionalContext |
SessionStart was already correct from v0.1.2. SubagentStop keeps exit 2 + stderr because it is the documented correct pattern there.
Bonus fix: narrower keyword regex
The old user-prompt-grounding.sh regex matched bare \brelease\b, \bapp\b, \bapi\b. Operational prompts like:
release="mss-cart-service", app="mss-cart-service-app"
triggered the grounding hook unnecessarily. The new regex requires contextual phrases that strongly imply post-cutoff questions:
latest|newest|current|recent (version|release|stable)version of XCVE-YYYY-NNNchangelog for Xdeprecated in Xbreaking change in Xsecurity advisory
Other improvements
- All hooks now have
trap ... ERRso any future failure writes a diagnostic to stderr instead of crashing silently with the cryptic "No stderr output" message - POSIX ERE regex (no
\d, no\s) for cross-platform compatibility (caught by Linux CI) - 73 tests passing on Ubuntu and macOS (4 new regression tests)
How to update
/plugin marketplace update synthforge
/plugin install gemini-plugin@synthforge
The "blocked by hook" wall of text will stop appearing.
Full changelog
https://github.com/azmym/gemini-plugin/blob/main/CHANGELOG.md#013---2026-05-28
v0.1.2 — SessionStart hook hot-fix
Hot-fix release for the SessionStart:startup hook error: Failed with non-blocking status code: No stderr output error reported in real session startup. v0.1.1 was correct in isolation (all tests passed) but broke at the integration boundary when Claude Code spawned the hook.
Three combining bugs
set -ucrash on${CLAUDE_PLUGIN_DATA}. The session-start and verdict-handler hooks referenced this env var directly. When unset,set -ucrashed the script with "unbound variable", non-zero exit, and no stderr.- Wrong exit-code convention for SessionStart. Per the Claude Code hooks docs,
SessionStartdoes not honorexit 2as a block signal. The supported way to inject context isexit 0with the directive on stdout (where it becomesadditionalContextfor the session). Even on success, users saw a misleading "hook error" line. - No error trap.
set -euo pipefailaborted on any internal failure with no message, producing the cryptic "No stderr output" error.
What's in this release
- New
data_dir()helper inlib/common.shthat returnsCLAUDE_PLUGIN_DATAwhen set, falling back to~/.claude/plugins/data/gemini-plugin/. State now survives reboots and never lands in/tmp. session-start-risk-map.sh: switched fromexit 2 + stderrtoexit 0 + stdout. Addedtrap ... ERRso any future crash writes a diagnostic line instead of vanishing silently.subagent-verdict-handler.sh: samedata_dir()migration andtrap ... ERR.- New regression test:
session-start: does not crash when CLAUDE_PLUGIN_DATA is unset. Total: 70 tests, all passing on Ubuntu and macOS CI.
How to update
/plugin marketplace update synthforge
/plugin install gemini-plugin@synthforge
The error will stop appearing on session start.
Full changelog
https://github.com/azmym/gemini-plugin/blob/main/CHANGELOG.md#012---2026-05-28