--- name: sync-gbrain preamble-tier: 2 version: 1.0.0 description: | Keep gbrain current with this repo's code and refresh agent search guidance in CLAUDE.md. Wraps the gstack-gbrain-sync orchestrator with state probing, native code-surface registration, capability checks, and a verdict block. Re-runnable, idempotent. Use when: "sync gbrain", "refresh gbrain", "re-index this repo", "gbrain search isn't finding things". (gstack) triggers: - sync gbrain - refresh gbrain - reindex repo - update gbrain allowed-tools: - Bash - Read - Write - Edit - Glob - Grep - AskUserQuestion --- {{PREAMBLE}} # /sync-gbrain — Keep gbrain current and teach the agent to use it You are running the canonical "keep this brain up to date" verb. /setup-gbrain installs gbrain once; /sync-gbrain runs every time the user wants the brain refreshed against this repo's current state, and refreshes the agent-side guidance in CLAUDE.md so the coding agent knows when to prefer `gbrain` search over Grep. **Architecture (post-codex review):** This skill uses gbrain v0.20.0+'s **native code surfaces** (`gbrain sources add`, `gbrain sync --strategy code`, `gbrain reindex-code`, `gbrain code-def/code-refs/code-callers/code-callees`). It does NOT use `gbrain import` (that path is for markdown directories). It does NOT touch `~/.gstack/` indexing (the existing `gstack-gbrain-source-wireup` owns that — never double-store). ## User-invocable When the user types `/sync-gbrain`, run this skill. Argument modes (parsed by the skill itself, not a dispatcher binary): - `/sync-gbrain` — incremental sync (default; mtime fast-path; ~50ms steady-state) - `/sync-gbrain --full` — full code reindex via `gbrain reindex-code` (~25-35 min on a big repo) - `/sync-gbrain --code-only` — only run the code stage; skip memory + brain-sync - `/sync-gbrain --dry-run` — preview what would sync; no writes anywhere - `/sync-gbrain --no-memory` / `--no-brain-sync` — selectively skip stages - `/sync-gbrain --quiet` — suppress per-stage output Pass-through args go straight to the orchestrator at `{{BIN_DIR}}/gstack-gbrain-sync.ts`. --- ## Step 1: State probe Before doing anything, check that /setup-gbrain has been run on this Mac. ```bash ~/.claude/skills/gstack/bin/gstack-gbrain-detect 2>/dev/null ``` **Remote-MCP mode (Path 4 of /setup-gbrain):** if `gbrain_mcp_mode=remote-http`, this skill is a graceful no-op. The brain server's own indexing cadence handles code import + search refresh; this Mac doesn't run a local gbrain CLI to drive `gbrain sources add` / `sync --strategy code`. Print: > "Remote MCP detected (Path 4). /sync-gbrain is local-mode-only in V1. > Your brain server (`` from claude.json) handles indexing on its own > cadence. If indexing seems stale, ping your brain admin or trigger a > manual sync there. To wire `/sync-gbrain` through MCP tools (when gbrain > ships `mcp__gbrain__sources_add` and friends), see the v1.27.0.0+ > follow-on TODO." Then exit cleanly. Do NOT proceed to Step 2. For local-stdio mode and unconfigured states: If `gbrain_on_path=false` OR `gbrain_config_exists=false` OR CLAUDE.md does not contain `## GBrain Configuration (configured by /setup-gbrain)`, STOP and tell the user: > "/sync-gbrain requires /setup-gbrain to be run first. Run `/setup-gbrain` to > install gbrain, register the MCP server, and set per-repo trust policy." Do NOT continue — the skill is unsafe when gbrain isn't configured (we'd write a CLAUDE.md guidance block referencing tools that don't exist). Also check the per-repo trust policy. If `gstack-gbrain-repo-policy get` for this repo returns `deny`, STOP: > "This repo's gbrain trust policy is `deny`. Run `/setup-gbrain --repo` to > change it before syncing." --- ## Step 2: Run the orchestrator Pass user args to the orchestrator. Do not paraphrase them — pass through as-is. ```bash bun run ~/.claude/skills/gstack/bin/gstack-gbrain-sync.ts ``` The orchestrator runs three stages: code → memory → brain-sync (per the plan's storage tiering). Each stage failure is non-fatal; subsequent stages still run. State is persisted to `~/.gstack/.gbrain-sync-state.json` via tmp-file + atomic rename. Concurrent runs are blocked by a lock file at `~/.gstack/.sync-gbrain.lock` (5-min stale-takeover). --- ## Step 3: Code-index health check After the sync run, query gbrain for the cwd source's page_count: ```bash SOURCE_ID=$(grep -o '"source_id":"[^"]*"' ~/.gstack/.gbrain-sync-state.json 2>/dev/null \ | head -1 | sed 's/.*"source_id":"//;s/".*//') PAGES=$(gbrain sources list --json 2>/dev/null \ | jq -r --arg id "$SOURCE_ID" '.sources[] | select(.id==$id) | .page_count' 2>/dev/null \ || echo 0) echo "cwd source: $SOURCE_ID, page_count: $PAGES" ``` If `PAGES` is 0 or empty AND the user did NOT pass `--no-code` AND mode was not `--full`, AskUserQuestion via the format in the preamble: > D1 — This repo has 0 indexed pages in gbrain. Run a full code reindex now? > > ELI10: gbrain hasn't indexed this repo's code yet. The semantic search > tools (`gbrain search`, `code-def`, `code-refs`) will return nothing > until we run a full pass. Takes ~25-35 minutes on a big Mac. > > Recommendation: A — the brain is unusable for code search until indexed, > and Step 2 of this skill already verified gbrain is configured correctly. > > Note: options differ in kind, not coverage — no completeness score. > > A) Run /sync-gbrain --full now (recommended) > B) Skip — I'll run it later If A: re-invoke the orchestrator with `--full --code-only`. If B: continue to Step 4 with the empty-corpus state recorded. --- ## Step 4: Refresh `## GBrain Search Guidance` block in CLAUDE.md Capability check (per /plan-eng-review §6): ```bash SLUG="_capability_check_$$" if [ -f ~/.gbrain/config.json ] && \ gbrain --version 2>/dev/null | grep -q '^gbrain ' && \ echo "ping" | gbrain put "$SLUG" >/dev/null 2>&1 && \ gbrain search "ping" 2>/dev/null | grep -q "$SLUG"; then CAPABILITY_OK=1 else CAPABILITY_OK=0 fi gbrain delete "$SLUG" 2>/dev/null || true ``` Then update CLAUDE.md based on capability state: **If `CAPABILITY_OK=1`** — write or update the block. Idempotent: find the HTML-comment-delimited block; replace its body if it exists; append at the end of CLAUDE.md if it doesn't. NEVER duplicate. Block is machine-AGNOSTIC (no engine, no page counts, no last-sync time — those are in the existing `## GBrain Configuration` block). Verbatim block content (copy exactly): ```markdown ## GBrain Search Guidance (configured by /sync-gbrain) GBrain is set up and synced on this machine. The agent should prefer gbrain over Grep when the question is semantic or when you don't know the exact identifier yet. Two indexed corpora available via the `gbrain` CLI: - This repo's code (registered as `gstack-code-` source). - `~/.gstack/` curated memory (registered as `gstack-brain-` source via the existing federation pipeline). Prefer gbrain when: - "Where is X handled?" / semantic intent, no exact string yet: `gbrain search ""` or `gbrain query ""` - "Where is symbol Y defined?" / symbol-based code questions: `gbrain code-def ` or `gbrain code-refs ` - "What calls Y?" / "What does Y depend on?": `gbrain code-callers ` / `gbrain code-callees ` - "What did we decide last time?" / past plans, retros, learnings: `gbrain search "" --source gstack-brain-` Grep is still right for known exact strings, regex, multiline patterns, and file globs. The brain auto-syncs incrementally on every gstack skill start. Run `/sync-gbrain` to force-refresh, `/sync-gbrain --full` for full reindex. ``` Use the Read + Edit tools. The find-and-replace target is the entire region from `` through ``. If those markers are missing, search for `## GBrain Search Guidance (configured by /sync-gbrain)` heading and replace from there to the next `## ` or EOF. If no heading exists, append the entire block at the end of CLAUDE.md. **Atomic write:** write the new CLAUDE.md content to a tmp file alongside it (e.g., `CLAUDE.md.sync-gbrain.tmp`) then `mv` to atomic-rename, so a crash mid-write never leaves the file half-modified. **If `CAPABILITY_OK=0`** — REMOVE the block entirely if present. Use the same Edit tool to strip the start/end-marker region. The `## GBrain Configuration` block stays in place (it's a record of the install, not a capability claim). Do NOT crash if CLAUDE.md is missing or unwritable — log a warning and continue. --- ## Step 5: Verdict block (idempotent doctor output) Print a status block matching `/setup-gbrain` Step 10 conventions. Each row is `[OK]/[FIX]/[WARN]/[ERR]`. Reuse `gbrain doctor --json --fast` for informational rows but DO NOT gate the guidance block on doctor (per /plan-eng-review §6 — doctor is too strict for unrelated reasons). ``` gbrain status: GREEN CLI ............. OK Engine .......... OK Capability ...... OK write+search round-trip CWD source ...... OK (page_count=) ~/.gstack source. OK (page_count=) — managed by /setup-gbrain Memory sync ..... OK CLAUDE.md ....... OK ## GBrain Search Guidance present Last sync ....... OK Run `/sync-gbrain` again any time gbrain feels off; safe and idempotent. ``` If any row is YELLOW or RED, the verdict line says so and the failing rows surface a one-line "next action" (e.g., `Capability ...... ERR capability check failed; CLAUDE.md guidance block REMOVED — run /setup-gbrain to repair`). --- ## Concurrency note This skill is safe to run concurrently from multiple terminals on the same Mac. The orchestrator acquires a lock at `~/.gstack/.sync-gbrain.lock` before any state-file or CLAUDE.md mutation and exits with code 2 if another sync is in flight. Stale locks (process died) auto-clear after 5 minutes. ## Cross-machine note The `## GBrain Search Guidance` block is committed to the repo's CLAUDE.md and travels with `git push`/`git pull` — NOT through `~/.gstack/.brain-allowlist` (which is for `~/.gstack/` brain-sync only). On a different Mac with a synced CLAUDE.md but no local gbrain, /sync-gbrain detects the mismatch via the capability check and REMOVES the block (the local agent shouldn't be told to use a tool that isn't installed). ## Status reporting End with a Completion Status (per the preamble protocol): - **DONE** — all stages green, CLAUDE.md guidance block present, verdict GREEN. - **DONE_WITH_CONCERNS** — sync ran but at least one stage failed or capability check failed. List which. - **BLOCKED** — could not acquire lock, gbrain not on PATH, or per-repo policy is deny. State the blocker. - **NEEDS_CONTEXT** — /setup-gbrain has not been run, or `gbrain doctor` shows a state that requires user decision (e.g., engine migration).