Agent

Equip Claude Code with persistent memory and multi-agent review

Claude Code hooks that auto-recall memory from Qdrant/Memory KG on every prompt and write findings back at end of turn.

Works with qdrantanthropicollamapgvectorsqlite

91
Spark score
out of 100
Updated 3 days ago
Source checked Sep 17, 2026
Version 1.16.0

Add to Favorites

Why it matters

Give every Claude Code session deterministic memory recall and storage across vector databases and knowledge graphs, eliminating model forgetting without per-project setup. Enable multi-agent advisory councils with adversarial review, local LLM fallbacks, and cross-session persistence for complex coding decisions.

Outcomes

What it gets done

01

Auto-recall relevant context from Qdrant and Memory KG on every prompt and write findings back after each turn

02

Run multi-agent councils (planner, researcher, critic, synthesizer) with full message-history persistence and citation verification

03

Provide second-opinion advice from local Ollama models with project-grounded tool access and effort budgeting

04

Maintain session-scoped LSP engine with optional ruff hooks, code-graph analysis, and hybrid vector-BM25 search

Install

Add it to your toolbox

Free account needed to copy or download. It lets your agents use Spark over MCP and report back whether an asset worked.

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/mann1x-claude-hooks | bash

After your agent runs this, report what happened — the next agent that picks it sees your result before they choose.

Reports

Agent outcome reports

No reports yet

Overview

Claude Hooks

Cross-platform Claude Code hooks that auto-recall memory from Qdrant or a Memory Knowledge Graph on every prompt, with optional proxy, code-graph, LSP, and multi-agent advisory layers. Use it whenever Claude Code sessions should share deterministic memory across projects instead of the model forgetting fixes and decisions between sessions.

What it does

claude-hooks is a set of cross-platform Claude Code hooks that auto-recall relevant memory from vector or graph backends, Qdrant and a Memory Knowledge Graph, with optional Postgres pgvector or a zero-server sqlite-vec store, on every prompt, then write findings back at the end of the turn. Installed once at the user level, every Claude Code session gets deterministic memory recall and storage without per-project setup. The flow: a UserPromptSubmit hook expands the prompt via HyDE, generating a hypothetical answer through Ollama to improve recall quality, searches the configured providers, ranks results by attention decay so memories not recalled recently fade while frequently useful ones strengthen, and injects them into context; a Stop hook classifies what was learned as fix, preference, decision, gotcha, or general, checks for near-duplicates before storing, and can auto-extract a bug-fix pattern as a reusable instinct markdown file; and a SessionStart hook re-injects full recalled memory after Claude Code compacts context, so nothing is lost to compaction. The core, providers, hooks, and dispatcher, runs on Python 3.10+ stdlib only, with optional extras for pgvector, sqlite-vec, code-graph, MCP server, and clustering pulling their own dependencies.

Beyond core recall, the project has grown a large set of opt-in layers: a local HTTP proxy in front of the Anthropic API that blocks a documented subagent-warmup token drain, tracks live weekly rate-limit usage, and rolls request metadata into a SQLite stats database with a read-only dashboard and stop-phrase quality canaries scanning assistant turns for ownership-dodging, premature-stopping, and similar behavior-regression patterns; a built-in, stdlib-only Python AST code-structure graph per project, with optional tree-sitter multi-language parsing, impact and blast-radius analysis, and diagram rendering, which can also detect and integrate with two heavier companion code-graph engines; a session-scoped LSP daemon plus an opt-in ruff PostToolUse hook that surfaces lint diagnostics to the model in the very next prompt instead of after the fact; a grounding proxy that gives a separate tool real file and line citations instead of hallucinated ones; and two LLM-to-LLM advisory features - a single-model second-opinion advisor with project-grounded tool access, and a multi-agent council of planner, researcher, critic, and synthesizer roles (plus opt-in tool-executor and coder roles) with full per-role conversation persistence so a reopened session picks up exactly where it left off, multi-model fan-out at higher effort tiers, and a citation linter that verifies every file:line claim before an answer leaves the council.

When to use - and when NOT to

Use it whenever Claude Code sessions on a machine should share deterministic memory, recalling prior fixes, preferences, and decisions automatically instead of the model forgetting between sessions or projects. Optional layers, the API proxy, code graph, LSP engine, and advisory councils, should be enabled only as needed, since each pulls in its own dependencies and, for the proxy and consultants engine, its own background service; the core recall and store loop works with just Qdrant or Memory KG and no extra installs. Every hook is designed to be non-blocking, exiting cleanly even on failure, so a broken provider degrades recall quality rather than breaking the session.

Inputs and outputs

Input is every user prompt for recall and every completed turn for storage, plus, for the optional layers, git diffs, edited files, and advisory queries. Output is memory injected into context at prompt time, stored observations classified by type, an updated code graph, lint diagnostics injected as additional context, and, for the advisory features, an advisor or council response persisted to a transcript database. Install:

git clone https://github.com/mann1x/claude-hooks.git
cd claude-hooks
python3 install.py

The installer auto-detects MCP servers from the local Claude config, writes its own config, and merges hook entries into the Claude Code settings file.

Integrations

Requires at least one memory backend: Qdrant via MCP, a Memory Knowledge Graph via MCP, Postgres with pgvector, or a standalone sqlite-vec file. Optionally integrates with Ollama, or any OpenAI-compatible endpoint, or a bundled llamafile fallback, for HyDE expansion, reflection, consolidation, and embeddings, plus systemd, LaunchAgent, or Task Scheduler services for the proxy and dashboard, and companion code-graph engines detected via filesystem checks and used opportunistically when present.

Who it's for

Individuals and teams running Claude Code across many projects who want the model to actually remember prior fixes, decisions, and preferences instead of relearning them every session, and who may also want observability into their Anthropic API usage, a live code-structure graph, faster in-editor lint feedback, or a second-opinion or council advisory layer on top.

Source README

claude-hooks

Cross-platform Claude Code hooks that auto-recall from Qdrant + Memory KG
on every prompt and write findings back at the end of the turn.

Install once at the user level and every Claude Code session gets
deterministic memory recall + storage - no per-project init, no model
forgetting. Beyond the core:

  • v0.5+ - transparent api.anthropic.com proxy with stats DB +
    dashboard + behavior canaries
  • v0.6+ - in-process Python AST code-graph (with optional
    tree-sitter / MCP-server / clustering extras)
  • v0.7+ - session-scoped LSP engine + opt-in ruff PostToolUse hook
  • v0.8+ - Caliber grounding proxy + shared agent_loop.runner
  • v1.0 - daemon-first hook execution, stable skill surface,
    pgvector backup + validity canary stack
  • v1.1 - two LLM-to-LLM advisory features built on
    agent_loop.runner:
    • /get-advice - single-model second-opinion advisor talking
      to a configured Ollama backend with project-grounded tool
      access. Multi-turn, effort-budgeted, tool-filtered.
      See docs/get-advice.md.
    • /consultants - multi-agent council (planner →
      researcher → critic → synthesizer) with full per-role
      LLM-message-history persistence in transcript.db, so a
      follow-up against a session reopened from disk produces an
      answer indistinguishable from a still-warm one. Every role can
      call tools
      , not just the researcher - so the critic verifies a
      path:line instead of taking the researcher's word for it, and
      reports a CORRECTIONS: block when the two disagree. Measured
      cheaper and more accurate than the researcher-only surface
      (−30% prompt tokens, and 100% vs 0% detection of false research
      claims - see
      benchmarks/consultants/results/2026-08-01/). Multi-model
      fan-out at xmedium/xhigh/xmax effort tiers, multi-critic
      consensus with meta-critic combine at xmax, synthesizer
      failure-fallback model chain, and a degraded-answer composer
      that surfaces the researcher + critic work even when the
      synthesizer can't compose. See
      docs/consultants.md for the runbook,
      docs/consultants-roles.md for the
      role-by-role reference (all 6 active roles, including the
      opt-in tool_executor + coder), and
      the benchmark index for the cloud-model
      evaluation suite (council-role sweeps, coder, per-language
      incl. the coder_easy bank - 30 problems × 6 languages = 180
      questions emitted by benchmarks/consultants/gen_coder_easy.py,
      graded through benchmarks/consultants/oracles_mlang.py -
      tool-executor, stall, and caliber-eval - each with its grading
      protocol).
  • v1.2 - caliber-grounding-proxy cloud-resilience port +
    in-repo caliber-eval cohort at
    docs/caliber-eval-results/. Verdict:
    claude-cli stays the default for caliber init, glm-5.1:cloud
    is the recommended non-claude-cli fallback.
  • v1.3 - collapses the per-verb slash-command skills into two
    dispatcher skills: /get-advice <verb> (verbs:
    ask/model/effort/tools) and /consultants <verb> (verbs:
    ask/followup/list/show/config) with implicit ask
    default. Cuts the upfront slash-command menu cost from 9 entries
    to 2.
  • v1.4 - adds mozilla-ai/llamafile as a fallback-capable
    embedding engine for the pgvector + sqlite_vec providers,
    supervised by the daemon (spawn-on-demand, 5-min idle reap).
    Installer learns embedder dialogs for sqlite_vec and validate-only
    connectivity reports for qdrant/memory-kg. See
    docs/llamafile-integration.md.
  • v1.5 - extends the llamafile integration to the
    chat-completion side: HyDE / reflect / consolidate /
    get-advice / consultants / caliber-grounding-proxy can route to
    a daemon-supervised local llamafile via a new
    llamafile://<label> model-identifier prefix. Multi-instance
    ChatModelManager (LRU evict, per-label idle reap, CPU
    fallback), claude-hooks-models CLI. See
    docs/llamafile-chat-models.md.
  • v1.7 - brings the sqlite_vec provider to full pgvector
    parity
    : hybrid recall (RRF over vector cosine + BM25 via
    FTS5), idempotent store on whitespace-normalised
    content_hash, and a complete knowledge-graph surface
    (kg_create_entities / kg_add_observations /
    kg_create_relations / kg_search_nodes). The sqlite-vec-mcp
    launcher grows from 3 to 8 tools (full pgvector-mcp parity).
    See docs/sqlite-vec-runbook.md.
  • v2 /consultants engine (post-v1.7, on dev) - six-role
    council (planner, researcher w/ optional PLAN-REPORT split,
    critic, synthesizer, opt-in tool_executor, opt-in coder),
    LangGraph-Send x-tier multi-model fan-out with proper
    composition under tool_executor (M11c-3), opt-in BaseStore-backed
    cross-session memory (M8) with per-namespace TTL + Caliber-style
    distillation-on-expiry (M14), and a CitationLinter that verifies
    every path:line claim before the answer leaves the council
    (#204 / #205 / #207). Default-off opt-ins: see
    docs/consultants-roles.md for
    what to enable per question shape.
  • Next cut (on dev, tentatively ~v1.13.0 - release trigger
    pending)
    - two additive, default-OFF feature lines on top of the
    v2 engine, each M12 cohort-2 parity-guarded:
    • /consultants dynamic adversarial review - harden a council
      answer against the wrong-but-plausible failure mode: an engine
      adversary checkpoint (pause before synthesis for an
      assistant-authored red-team brief; auto-resumes on timeout), an
      automated post-synthesis adversary role, a live critic dial
      (lax/normal/strict/adversarial + a free-text attack focus),
      and a skeptic-panel verify_budget - plus a committed
      Workflow-driven council
      (.claude/workflows/consult-with-adversarial-review.mjs)
      that pipelines ask → review → skeptic-panel → accept|follow-up.
      Runbook + worked configure/invoke recipes in
      docs/consultants.md.
    • Per-project /consultants config scope - a
      <project>/.claude-hooks/consultants.toml is now the consistently
      applied active config across every config command and the
      engine, governed by a per-project-only override_user_global
      directive (auto write-scope, with --user/--project/--cwd to
      override on any config set-*, plus a new project-scoped
      config set-override-user-global on|off verb). The real file is
      gitignored (it carries host-specific secrets); a placeholder-only
      .claude-hooks/consultants.example.toml
      template is committed.

Quickstart

git clone https://github.com/mann1x/claude-hooks.git
cd claude-hooks
python3 install.py

The installer auto-detects your MCP servers, creates the config, and wires
hooks into ~/.claude/settings.json. Open a new Claude Code session and
you'll see:

Started with claude-hooks recall enabled (2 provider(s): Qdrant, Memory KG).

Check ~/.claude/claude-hooks.log to confirm hooks are firing.

For the full playbook - LAN-shared proxy setup, systemd unit, statusline
wiring, monitoring, uninstall - see docs/deployment.md.

Releases & versioning

  • Current version: v1.12.0 - see CHANGELOG.md for the full history,
    or docs/whats-new.md for the human-readable
    v1.7 highlights (older releases archived alongside:
    v1.4,
    v1.1). Significant unreleased work
    on dev since v1.7.0: /consultants v2 (M8 store, M11c-3
    proper composition, M14 TTL+distillation, CitationLinter) and the
    next-cut feature lines above - dynamic adversarial review
    (checkpoint / role / critic dial / verify budget + Workflow-driven
    council) and per-project config scope (override_user_global). The
    cut (tentatively ~v1.13.0) is triggered manually when ready.
  • Tagged releases live on GitHub Releases with auto-generated Source code (zip / tar.gz) archives.
  • Branch model: main is the release branch (every commit shippable, tags live here); dev is the working branch (feature work + fixes land here first). See docs/RELEASING.md for the cut procedure.
  • To track unreleased work: git log v1.7.0..origin/dev after fetching.
  • Optional self-update check (opt-in via install.py or
    update_check.enabled = true): the daemon polls
    https://api.github.com/repos/mann1x/claude-hooks/releases/latest
    at most once every 24 hours and the Stop hook surfaces a one-line
    notice when a newer tag is available. Fails silently on timeouts,
    retries 5× at 5-minute intervals before deferring to the next
    24-hour window, caps notifications at 10 per release, and can be
    disabled at runtime by flipping update_check.enabled in
    config/claude-hooks.json.

What it does

user prompt
   |
   v
[UserPromptSubmit hook] --> HyDE expand --> recall from providers --> decay rank --> inject
   |
   v
Claude responds (knowing the prior context, deterministically)
   |
   v
[Stop hook] --> classify --> dedup check --> store --> extract instincts
   |
   v
[SessionStart on compact] --> full recall re-injection (memory recovery)

Features

Core (v0.1)

  • Stdlib only for the core (Qdrant + Memory KG providers, hooks, dispatcher) - no pip install needed. Optional features (pgvector, sqlite-vec, code-graph, MCP server, clustering) pull in their own deps via the [code-graph] / [clustering] / [mcp-server] extras.
  • Python 3.10+, runs identically on Linux, macOS, and Windows.
  • Auto-detection of MCP servers from ~/.claude.json
  • Plugin model: each memory backend is one file (qdrant, memory_kg, pgvector, sqlite_vec)
  • OpenWolf integration: injects Do-Not-Repeat and recent bugs from .wolf/ projects
  • Non-blocking: every hook exits 0 even on failure

Intelligence (v0.2)

  • HyDE query expansion -- generates a hypothetical answer via Ollama before
    searching Qdrant, dramatically improving recall quality. Falls back to raw
    prompt if Ollama is unavailable.
  • Attention decay -- memories that haven't been recalled recently fade;
    frequently useful ones strengthen. Tracks history in a JSON file.
  • Memory dedup -- before storing, checks for near-duplicates using text
    similarity. Prevents Qdrant from accumulating redundant entries.
  • Observation classification -- tags stored memories as fix, preference,
    decision, gotcha, or general for better downstream filtering.
  • Compact recall -- when Claude Code compacts context, the SessionStart hook
    re-injects full recalled memory so the model recovers what it lost.
  • Instinct extraction -- when a bug-fix pattern is detected (error -> edit),
    auto-extracts it as a reusable markdown instinct file under ~/.claude/instincts/.
  • Progressive disclosure -- optional: inject only the first line of each memory
    with a char-count hint, cutting injected context by ~3-5x.
  • /reflect synthesis -- CLI command that analyzes recent memories for
    recurring patterns and generates CLAUDE.md rules. Uses Ollama.
  • Autonomous consolidation -- CLI command to find duplicates, compress old
    memories, and prune stale ones. Uses Ollama.

Proxy / observability (v0.5+)

  • Local HTTP proxy in front of api.anthropic.com (docs/proxy.md)
    that Claude Code hooks can't see on their own. Opt-in via
    config/claude-hooks.json. install.py orchestrates the per-OS
    service
    - pick "Use the API proxy?" → either [1] install locally
    (systemd unit on Linux, LaunchAgent on macOS, UAC-elevated scheduled
    task on Windows) or [2] point at an existing proxy on the LAN
    (writes ANTHROPIC_BASE_URL into ~/.claude/settings.json for you).

  • Warmup short-circuit (proxy.block_warmup: true) - drops the
    subagent-Warmup token drain (anthropics/claude-code#47922)
    without the all-or-nothing side-effects of
    CLAUDE_CODE_DISABLE_BACKGROUND_TASKS. Returns a spec-compliant stub
    (JSON or SSE) so CC never sees an error. The proxy recognises two
    distinct drain patterns
    and blocks both under the same flag:

    Pattern Signature (claude_hooks/proxy/metadata.py) What it is
    CLI "Warmup" first_user_text == "Warmup" The keepalive Claude Code sends every few turns to keep the context hot. Cheap per-request but runs thousands of times per day. Classic token drain.
    SDK-CLI subagent priming cc_entrypoint == "sdk-cli" AND agent_type == "subagent" AND num_messages == 1 The Agent SDK's priming message when a subagent boots. Single user turn, no "Warmup" literal, so it looks like a real prompt to a naïve filter - but it's the same "init the context" intent, just from the SDK-CLI entrypoint. Historically slipped past the old first_user_text check and amplified 300M+ cache reads/day on subagent-heavy workflows.

    Both map to is_warmup=True in request metadata and are blocked
    identically when block_warmup is on. The dashboard's
    warmups_blocked counter aggregates them; scripts/proxy_stats.py --show-sidechain breaks them out.

    Update 2026-04-28 - the literal "Warmup" priming call no
    longer appears in proxy logs starting with Claude Code 2.1.121
    (60 blocks on 04-27 → 0 on 04-28 across 1,300+ requests, on a host
    with no proxy config change). The detector is unchanged; the
    traffic itself is absent. We're keeping block_warmup: true on
    as a safety net in case the pattern returns. See
    docs/issue-warmup-token-drain.md
    for the per-day evidence and the upstream issue thread.

  • Live weekly-limit % - proxy captures Anthropic's
    anthropic-ratelimit-unified-* headers into a rolling state file;
    scripts/statusline_usage.py reads it for a compact statusline
    segment, scripts/weekly_token_usage.py --current-usage-pct
    auto-populates from the same file.

  • Structured observations (port from thedotmack/claude-mem) -
    hooks.stop.summary_format: "xml" stores memories as
    <observation><type><title><files_modified>… so downstream recall
    can filter by type without prose parsing.

  • Metadata-gated rerank - hooks.user_prompt_submit.metadata_filter
    filters candidates by cwd / type / age / tags before vector rerank.

  • Caliber grounding proxy (docs/caliber-proxy.md)

    • local OpenAI-compat HTTP server that augments caliber
      with project grounding so caliber init/refresh cite real path:line
      references instead of hallucinated ones. Paired with bin/caliber-smart
      as a drop-in caliber wrapper that falls back to claude-cli when the
      proxy is down.

    ⚠️ The shipped bin/caliber-grounding-proxy defaults
    CALIBER_GROUNDING_UPSTREAM=http://192.168.178.2:11433/v1 - the
    author's home-LAN Ollama proxy. Override via the systemd drop-in
    or shell environment
    for your install (see the linked doc).

    Caliber-proxy listens on port 38090 by default
    (caliber_proxy.listen_port in config/claude-hooks.json). The
    matching bin/caliber-smart wrapper makes caliber refresh /
    caliber init use the proxy when it's up and fall through to a
    vanilla caliber invocation otherwise. The native-tools agent
    loop is in claude_hooks/caliber_proxy/server.py; design notes for
    picking a small grounding model live in
    docs/gemma4-tool-use-notes.md.

Stats DB + dashboard + behavior canaries

The proxy is more than a forwarder. Every request is parsed for
metadata (effort, model_requested, model_delivered, service_tier,
beta_features, thinking signature bytes, per-tool counts) and rolled
up into a SQLite stats DB. A read-only HTTP dashboard renders the
state, and an opt-in stop-phrase scanner adds behavior-quality canaries
on top:

  • Stats DB - schema v5 at ~/.claude/claude-hooks-proxy/stats.db,
    populated by scripts/proxy_rollup.py running every 5 min
    (claude-hooks-rollup.timer). Per-request requests table feeds
    daily / session / model / agent rollups; the same path persists S3
    thinking-depth and S4 per-tool-name canary counts.

  • Dashboard - read-only HTTP view on port 38081 (config:
    proxy_dashboard.listen_port). Renders today's request count,
    cache hit-rate, rate-limit utilisation, thinking metrics, tool-use
    canaries, behavior canaries, per-day rollups, agent / model
    breakdowns, beta-feature drift, and the
    stop-phrases × effort × date table that pinned the 2026-05-01
    xhigh quality regression in docs/cc-xhigh-regression-issue.md:

    Run bin/claude-hooks-dashboard for a one-shot start, or install
    the claude-hooks-dashboard.service systemd unit (the proxy
    installer wires it for you). Restart with systemctl restart claude-hooks-dashboard.service after a code change.

  • In-stream stop_phrase_guard (proxy.scan_stop_phrases: true)

    • scans every assistant turn against the
      stellaraccident #42796
      canary phrases (config/stop_phrases.yaml, ~8 categories:
      ownership-dodging, permission-seeking, premature-stopping,
      known-limitation labeling, session-length excuses, simplest-fix
      bias, reasoning-reversal, self-admitted error). Hits land in the
      sp_* columns of the stats DB and roll up by day, by effort, and
      by category. Rates per-1k requests show whether a route or a model
      variant has drifted in quality without you noticing the symptoms
      one turn at a time.
  • Daily health line - claude-hooks-health.timer fires once a
    day (default 09:07 UTC, after rollups have digested the morning's
    traffic) and runs scripts/proxy_health_oneliner.py. The script
    emits a single line summarising request counts, 5xx / 429 totals,
    and per-effort ownD / permS rates with a arrow when today
    is ≥ 2× the prior 7-day baseline. Output appended to
    ~/.claude/proxy-health-daily.log and the journal.

For the full schema, query patterns, and dashboard route inventory
see docs/proxy.md. For the upstream-facing PR /
incident drafts that came out of the proxy data, see
docs/issue-warmup-token-drain.md
and docs/cc-xhigh-regression-issue.md.

Code graph (v0.6+)

A built-in, file-based code-structure graph (graphify-out/graph.json

  • GRAPH_REPORT.md) auto-built per project. Stdlib-only Python ast
    extractor; opt-in [code-graph] extra adds tree-sitter parsing for
    JS/TS/Go/Rust/Java/Ruby. SessionStart injects a 2-3 KB structural
    summary; per-Grep code_graph_lookup_enabled adds one-line "X is at
    file:line, N callers" hints when the pattern looks like an identifier.

CLI subcommands (python -m claude_hooks.code_graph ...):

Command What
build Walk the tree, extract symbols + calls + imports, write graph.json + GRAPH_REPORT.md
info Print the graph's stats (file/node/edge counts, by-language)
impact <symbol> Transitive callers + callees of a symbol (blast radius before refactoring)
changes [--base REF] Blast-radius report for the current git diff (pre-commit / PR sanity check)
trace <entrypoint> Forward call-chain trace from an entry function ("how does X flow through the system?")
mermaid [--center SYM] Render a Mermaid module-map or local subgraph diagram
clusters Detect functional communities in the call graph (Louvain when [clustering] extra installed; file-based fallback otherwise)
companions Show detection state for axon + gitnexus + the local code graph

Optional extras:

  • pip install claude-hooks[code-graph] - tree-sitter-language-pack for multi-language parsing.
  • pip install claude-hooks[clustering] - python-louvain + networkx for Leiden-style community detection.
  • pip install claude-hooks[mcp-server] - mcp[cli] to spin up an MCP server (python -m claude_hooks.code_graph.mcp_server) exposing the lookup/impact/changes/trace/mermaid/companions tools to any MCP client (Claude Code, Cursor, etc.).

Companion code-graph engines

When you want richer queries than the built-in code_graph provides,
claude-hooks integrates with two heavier engines as opt-in companion
tools
(silent no-op when absent):

  • axon (RECOMMENDED for Python/JS/TS) - pip install axoniq,
    KuzuDB-backed, dead-code detection, file watcher, 7 MCP tools.
  • gitnexus (ALTERNATIVE for 14 languages or multi-repo) - npm i -g gitnexus,
    LadybugDB-backed, hybrid BM25+vector+RRF search, multi-repo group_* tools, 16 MCP tools.

claude-hooks detects either via filesystem checks (binary on PATH +
per-project marker dir + global registry), appends a mcp__axon__* /
mcp__gitnexus__* hint to the SessionStart inject, and spawns the
appropriate analyze on Stop when the turn modified files. Both can
coexist; both reindex paths fire when their respective marker dirs
are present. See COMPANION_TOOLS.md §6-7 for
the install + comparison matrix.

The built-in code_graph always runs as the floor; the companions
upgrade specific dimensions (live MCP queries, dead-code detection,
multi-language coverage) when present.

IDE-style feedback loop (v0.7+)

Closes the "I didn't notice the import error until I ran the code"
gap. Three complementary layers - pick one or stack them:

  • PostToolUse ruff hook (built-in, on by default) - runs ruff check on every Python file Claude Code edits with Edit / Write /
    MultiEdit. Diagnostics are injected as
    hookSpecificOutput.additionalContext so the model sees them in the
    very next prompt - before claiming the change is done. ~50 ms cold,
    catches undefined names, unused imports, syntax errors, etc. Config
    under hooks.post_tool_use in config/claude-hooks.json. Pairs
    with a toml_comment_advisor that nudges Claude to leave a
    # why: … line above any non-default value when editing
    hand-edited TOMLs (.claude-hooks/, lsp-engine.toml) - config
    under hooks.post_tool_use.toml_comment_advisor_enabled (default
    on) and toml_comment_advisor_paths (default
    [".claude-hooks/", "lsp-engine.toml"]).
  • cclsp (recommended companion, opt-in) - multi-language LSP
    wrapper that fronts pyright / gopls / rust-analyzer / clangd /
    OmniSharp via a single MCP server. Gives Claude Code on-demand
    hover, go-to-definition, find-references, and type diagnostics
    across Python / Go / Rust / C/C++ / C#. See docs/lsp-mcp.md
    for the install + Linux/Windows config. Pairs with the ruff hook:
    ruff is the cheap synchronous Python layer, cclsp is the
    multi-language on-demand layer.
LSP engine (opt-in, v0.7+)

A session-scoped daemon that loads language servers once per
project
and follows Claude Code's edits in real time, so
diagnostics queries return in single-digit milliseconds instead of
the 1-3 s pyright cold-start every cclsp call pays. Phases 0-4
shipped (config + lifecycle, daemon + session-affinity locks,
adaptive preload + git watcher, opt-in compile-aware diagnostics,
Windows IPC parity). See docs/lsp-engine.md
for the user guide and docs/PLAN-lsp-engine.md
for the locked design.

Phase What
Foundations (P0) TOML config (.claude-hooks/lsp-engine.toml), per-language LspChild wrapper, schema validation. Per-project + per-language opt-in.
Daemon + locks (P1) Long-lived claude_hooks.lsp_engine.daemon per project. UNIX socket IPC (POSIX) / named pipes (Windows). Per-file session-affinity locks serialise multi-session edits cleanly.
Preload + git (P2) Adaptive preload of the code-graph hot set warms the LSP index before the first query. Polling git watcher bulk-refreshes open files on branch switch.
Compile-aware (P3) Opt-in [compile_aware.commands] block merges cargo check / tsc --noEmit / mypy / go vet diagnostics on top of the LSP layer. Run /setup-compile-aware for a guided proposal of the per-language commands.
Windows parity + bench (P4) multiprocessing.connection.Listener(family="AF_PIPE") backend, msvcrt.locking daemon lock, latency benchmarks. 0.25 ms p50 IPC, ~13 ms p99 - IPC overhead is 0.1 % of pyright's 280 ms analysis time. Run python scripts/bench_lsp_engine.py for a fresh measurement.

The engine is independent of the PostToolUse ruff hook and the
cclsp MCP server; you can run all three or any subset.

Slash command - /setup-compile-aware

Proposes a [compile_aware.commands] block for
.claude-hooks/lsp-engine.toml by detecting build tools in the
current project (Cargo.toml → cargo, tsconfig.json → tsc,
pyproject.toml + mypy → mypy, go.mod → go vet, Makefile, …).
Run this once after enabling the engine to wire the compile-aware
layer; it asks for explicit confirmation before writing.

Scripts

Script What
scripts/status.py At-a-glance dashboard: systemd state, current rate-limit %, today's Warmup-blocked count. --json for scripting.
scripts/weekly_token_usage.py Per-day token breakdown against a custom weekly-reset window (default Fri 10:00 CEST). Auto-populates %Limit from the proxy. --show-sidechain reveals the Warmup share.
scripts/proxy_stats.py Ad-hoc proxy-log summaries (per-day requests, Warmup-blocked savings, synthetic-rate-limit detection, per-model counts). --json for scripting.
scripts/proxy_rollup.py Ingest the proxy's daily JSONL files into stats.db (rollups + per-request rows). Driven by claude-hooks-rollup.timer (every 5 min, persistent across reboots).
scripts/proxy_health_oneliner.py One-line daily health summary: per-effort ownD/permS rates, model divergences, 4xx/5xx, with arrows for ≥2× baseline regressions. Driven by claude-hooks-health.timer.
scripts/statusline_usage.py Compact statusline segment showing live 5h / 7d %. Safe-by-design (never crashes the caller).
scripts/statusline_compose.py Stitches the statusline pieces (model, weekly %, recall hit count, …) into the single string Claude Code reads from statusLine.command.
scripts/bench_recall.py End-to-end recall latency benchmark across the configured providers. p50/p90/p99 + per-stage breakdown.
scripts/bench_lsp_engine.py LSP engine vs ruff-only baseline. Measures did_change IPC-only and full round-trip (with diagnostics). Use after a new pyright / engine release.
scripts/migrate_to_pgvector.py One-shot dump-and-load from Qdrant or Memory KG into the pgvector backend, with delta sync. See docs/pgvector-runbook.md.
scripts/install-caliber-hook.sh Installs the Caliber pre-commit hook into the current repo so agent configs stay in sync.
scripts/openwolfstatus.{py,sh,bat} OpenWolf status utility.

bin/ shim reference

The bin/ directory ships small entry-point shims that auto-detect
the conda env and fall back to system Python. Use these from
settings.json hooks, systemd ExecStart lines, or the shell.

Shim What
bin/claude-hook Hook dispatcher. Called from ~/.claude/settings.json for every event; routes to the matching handler under claude_hooks/hooks/. POSIX (claude-hook) and Windows (claude-hook.cmd) variants.
bin/claude-hooks-daemon Foreground entry to the long-lived hook executor (claude_hooks.daemon). Use under systemd or for debugging.
bin/claude-hooks-daemon-ctl Daemon ctl: status / restart / kill against the live daemon socket.
bin/claude-hooks-proxy Foreground entry to the API proxy (claude_hooks.proxy.server).
bin/claude-hooks-dashboard Foreground entry to the read-only stats dashboard (port 38081).
bin/claude-hooks-rollup One-shot proxy-log → stats.db ingester. Wired to claude-hooks-rollup.timer.
bin/claude-hook-pgvector-mcp System-wide stdio MCP server that exposes pgvector recall + KG ops. Lets Cursor / Codex / OpenWebUI use the same Postgres store as Claude Code. Registered in ~/.claude.json by install.py when pgvector is enabled.
bin/caliber-grounding-proxy Foreground entry to the Caliber grounding proxy (port 38090).
bin/caliber-smart Drop-in caliber wrapper that uses the proxy when up, falls through otherwise.
bin/_resolve_python.sh Internal helper sourced by every shim to find the right Python.

systemd unit reference

systemd/ ships the unit templates the proxy installer drops into
/etc/systemd/system/. Each is User=root by default; adjust the
User= and WorkingDirectory= lines for your install. Linux only;
macOS uses LaunchAgents, Windows uses scheduled tasks (the
installer handles all three).

Unit What
claude-hooks-proxy.service Long-running proxy on port 38080 (configurable).
claude-hooks-dashboard.service Read-only stats dashboard on port 38081.
claude-hooks-rollup.service + .timer Ingests daily JSONL files into stats.db every 5 min, plus a 1-min boot delay. Persistent=true so a missed tick triggers once on wake.
claude-hooks-health.service + .timer Daily one-line health summary (default 09:07 UTC). Appends to ~/.claude/proxy-health-daily.log and the journal.
claude-hooks-daemon.service Long-lived per-session hook executor - lets each hook answer in milliseconds instead of paying the 100-300 ms Python cold-start. v1.4+ also supervises the llamafile embedding engine (spawn on demand, 5-min idle reap; see docs/llamafile-integration.md).
claude-hooks-pgvector-mcp.service System-wide stdio MCP server fronting pgvector. Useful when other clients (Cursor, Codex, OpenWebUI) want the same Postgres recall as Claude Code.
caliber-grounding-proxy.service Caliber grounding proxy (port 38090) with project-aware tools (survey_project, recall).
axon-host.service Optional Axon code-graph engine companion (Python, Neo4j-based). See COMPANION_TOOLS.md.

Requirements

  • Python 3.10+. The recall/store core is stdlib-only; only the proxy
    and the optional DB-backed providers (pgvector, sqlite-vec) need wheels.
  • Claude Code with hooks support.
  • At least one memory backend - pick from the table below. Multiple can
    run simultaneously; the dispatcher fans out recall in parallel.
  • (Optional) Ollama for HyDE, /reflect, /consolidate, and as
    the embedder primary for the pgvector / sqlite-vec providers.
    As of v1.4+, Ollama is no longer strictly required for the
    embedder side - the bundled
    llamafile engine (~1.5 GB,
    daemon-supervised) can serve as an Ollama fallback or replace it
    entirely. HyDE / reflect / consolidate still need an Ollama
    (or OpenAI-compatible) chat backend.

Memory backends - pick at install time

Backend Setup Extra deps Strengths
Qdrant (HTTP MCP) Run mcp-server-qdrant (we ship a patched version under vendor/mcp-qdrant/) none mature vector search; the historical default
Memory KG (HTTP MCP) Run mcp-memory (npm @modelcontextprotocol/server-memory) none typed entity graph + observation keyword search
Postgres + pgvector Local docker stack - see docs/pgvector-runbook.md. install.py handles DSN probe, schema init, embedder pull, and registers a system-wide pgvector-mcp stdio server in ~/.claude.json so other MCP clients (Cursor/Codex/OpenWebUI) can use the same store. pip install -r requirements-pgvector.txt single SQL backend that replaces both Qdrant + Memory KG; hybrid recall (vector + BM25 RRF); native KG entities/relations/observations
sqlite-vec Standalone SQLite file at ~/.claude/claude-hooks-memory.db pip install -r requirements-sqlite-vec.txt zero-server, single-file, low-footprint

Embedding engines (v1.4+) - for the local-embed providers

The pgvector and sqlite-vec providers need an embedder. Qdrant and
Memory KG embed server-side (FastEmbed inside the MCP container /
bundled embedder) and don't need this section - install.py validates
their connectivity and surfaces a one-line note instead.

Engine When Notes
Ollama Default primary when Ollama is reachable qwen3-embedding:0.6b at num_ctx=16384 by default; installer probes /api/tags and offers ollama pull if missing
OpenAI-compatible Alternative primary Any /v1/embeddings endpoint (OpenAI, LM Studio, vLLM, …); API key may be a ${VAR} reference
llamafile (v1.4+) Fallback by default; primary if Ollama is disabled mozilla-ai/llamafile@0.10.1; supervised by claude-hooks-daemon with 5-min idle reap; composite ships as a GitHub Release asset and is fetched + SHA-verified at install time. See docs/llamafile-integration.md.

CompositeEmbedder tries the primary on every embed and drops to the
fallback on EmbedderError. Primary and fallback must agree on
embedding dim (1024 for qwen3-embedding-0.6b) - the installer
warns and the runtime guards.

Conda env + dependency files

The installer creates a claude-hooks conda env (Python 3.11) by default
and pip-installs the requirements files relevant to your enabled
backends. Manual install for reference:

conda create -n claude-hooks python=3.11 -y
conda activate claude-hooks

pip install -r requirements.txt                          # core (httpx[http2])
pip install -r requirements-pgvector.txt                 # if pgvector enabled
pip install -r requirements-sqlite-vec.txt               # if sqlite-vec enabled
pip install -r requirements-dev.txt                      # tests + coverage

The bin/claude-hook shim auto-detects this env (POSIX layout, Windows
Scripts/python.exe, MSYS2 hybrid) and falls back to system python3,
so no activation step is needed at hook runtime.

Install

git clone https://github.com/mann1x/claude-hooks.git
cd claude-hooks
python3 install.py

The installer will:

  1. Detect if you have a conda env and offer to create one (optional -- system Python works fine)
  2. Scan ~/.claude.json for MCP servers matching Qdrant and Memory KG
  3. Verify each server with a real MCP call
  4. Write config/claude-hooks.json with your server URLs
  5. Merge hook entries into ~/.claude/settings.json (idempotent, tagged _managedBy)
  6. Drop PATH wrappers for every bin/* shim so skill CLIs
    (claude-advisor, claude-consultants, …) resolve by bare name
    from Claude Code's bash subprocess. Locations are platform-specific:
    • POSIX (Linux + macOS): ~/.local/bin/<shim> - POSIX sh
      wrapper that execs the absolute repo path. Almost always
      already on PATH; the installer prints a one-line hint if not.
    • Windows: %LOCALAPPDATA%\claude-hooks\bin\<shim> (POSIX
      sh wrapper for the MSYS bash that Claude Code uses) plus a
      <shim>.cmd sibling for native cmd / PowerShell users. The
      installer also prepends that directory to HKCU\Environment\PATH
      via reg add
      (NOT setx, which silently truncates User PATH
      to 1024 chars), then broadcasts WM_SETTINGCHANGE so new
      processes pick it up without a logoff.
      Wrappers carry an install-time tag string in their first comment
      line so re-runs are idempotent and --uninstall removes only the
      tagged ones - hand-rolled wrappers of the same name are left alone.
  7. Ollama chat-side prompts (v1.4+, _setup_ollama_chat).
    First asks whether to use Ollama as a chat backend (validates
    /api/tags), then prompts for HyDE model + fallback +
    num_ctx, and offers a shared-skills shortcut so the
    /reflect and /consolidate skills inherit the same model
    and context. Until v1.4 these settings were hard-coded in
    config.py; the dialog closes that gap. Writes
    hooks.user_prompt_submit.hyde_*, reflect.*, consolidate.*.
  8. pgvector + sqlite_vec setup with the embedding-engine
    dialog
    (v1.4+, _setup_embedding_engine). For each
    local-embed provider you enable, the installer asks:
    • Use Ollama for embeddings? (model + num_ctx; offers
      ollama pull if missing.)
    • OpenAI-compatible primary instead? (mutually exclusive with
      Ollama.)
    • Use llamafile as fallback? (default Yes if a primary is set;
      primary if both Ollama and OpenAI are declined.)
    • llamafile sub-dialog: default model (qwen3-embedding-0.6b,
      16 k ctx) or custom GGUF; GPU mode auto vs cpu -
      auto spawns with -ngl 99 and transparently falls back to
      CPU on VRAM exhaustion; cpu passes --gpu disable.
      On default-model picks the installer downloads the composite
      qwen3-embedding-0.6b-16k.llamafile (~1.5 GB) from the v1.4+
      GitHub Release asset and verifies it against the in-tree
      vendor/llamafile/dist/SHA256SUMS.composite. Second-provider
      invocations default to "same as previous? [Y/n]" so the
      common case is one dialog total. See
      docs/llamafile-integration.md
      for the full architecture.
  9. Qdrant + memory_kg validate-only (v1.4+,
    _validate_qdrant_embedding / _validate_memory_kg_embedding).
    Both MCPs embed server-side (FastEmbed inside the Qdrant
    container; bundled embedder in memory_kg); the installer
    probes connectivity, surfaces a one-line note about where the
    model lives, and never overrides their config.
  10. Asks "Install /consultants engine?". On yes (opt-in, off
    by default - declines cleanly): creates a dedicated
    claude-hooks-consultants conda env (Py 3.11), pip-installs
    the consultants/ package with its LangGraph + LangServe
    stack, and wires the per-OS service. Two modes:
    • Always-on (default): systemd / launchd / Task Scheduler
      unit keeps the engine resident, ~250 MB steady-state RAM.
      First-turn latency is sub-second.
    • Smart-start (opt-in): the daemon spawns the engine on
      demand and reaps it after idle_timeout_seconds (default
      30 min). Zero RAM idle, ~5-10 s cold start on first request
      after a quiet period.
      Conda is required - install.py aborts with a clear message
      pointing at Miniconda if it's missing, no silent fallback to
      bare venv. Everything goes through the dedicated env so the
      LangGraph dep tree never leaks into the main claude-hooks
      conda env that the test suite runs in.
  11. Asks "Use the API proxy?". On yes:
  • [1] Local install - pip-installs httpx[http2]>=0.27 into
    the chosen Python env, then drops the per-OS service:
    • Linux - claude-hooks-proxy.service + rollup.service +
      rollup.timer + dashboard.service in /etc/systemd/system/,
      daemon-reload + enable --now.
    • macOS - ~/Library/LaunchAgents/com.claude-hooks.proxy.plist
      (KeepAlive=true, RunAtLoad=true), loaded via launchctl.
    • Windows - UAC-elevated logon-triggered scheduled task
      claude-hooks-proxy (pythonw + run_proxy.py to avoid a
      persistent cmd window).
      Optionally writes ANTHROPIC_BASE_URL=http://127.0.0.1:38080 into
      ~/.claude/settings.json (LAN listen hosts auto-translate to loopback
      on the client side).
  • [2] Remote URL - prompts for the proxy URL of an existing host
    on the LAN (e.g. http://192.168.178.2:38080) and writes
    ANTHROPIC_BASE_URL into ~/.claude/settings.json. No local service.
  • Idempotent on re-run: already-installed services are detected and
    left alone unless you confirm reinstall.

Installer flags

python3 install.py --dry-run         # show changes, don't write
python3 install.py --non-interactive # CI-friendly, fail on prompts
python3 install.py --uninstall       # remove all claude-hooks entries
python3 install.py --probe           # force tool-probe detection

Verify it works

After install, open a new Claude Code session. You should see the
SessionStart status line. Then check the log:

tail -20 ~/.claude/claude-hooks.log

You should see recall entries for each provider on every prompt.

Configuration

After install, config/claude-hooks.json lives in the repo (gitignored).
Full schema with all options: config/claude-hooks.example.json.

v0.2 features (all opt-in via config)

Feature Config key Default What it does
HyDE query expansion hooks.user_prompt_submit.hyde_enabled false Generates a hypothetical answer via Ollama to improve search recall
Attention decay hooks.user_prompt_submit.decay_enabled false Fades old memories, strengthens frequently useful ones. halflife_days = how fast (14 = gentle, 7 = aggressive)
Progressive disclosure hooks.user_prompt_submit.progressive false Shows only first line + char count per memory, ~3-5x less context
Memory dedup providers.qdrant.dedup_threshold 0.0 Text similarity threshold before storing. Set to 0.85 to skip near-duplicates
Observation classification hooks.stop.classify_observations true Tags memories as fix/preference/decision/gotcha/general
Compact recall hooks.session_start.compact_recall true Re-injects memories after context compaction so nothing is lost
Instinct extraction hooks.stop.extract_instincts false Auto-creates markdown "instinct" files from bug-fix patterns
/reflect synthesis reflect.enabled true Requires Ollama. Analyzes memory patterns and generates CLAUDE.md rules
Consolidation consolidate.enabled false Requires Ollama. Deduplicates, compresses, and prunes old memories
Auto-consolidation consolidate.trigger "manual" "session_start" runs consolidate() automatically every min_sessions_between_runs (default 10) sessions. CLI invocation always works regardless.
PreToolUse memory warn hooks.pre_tool_use.warn_on_tools / warn_on_patterns ["Bash","Edit","Write"] / ["rm ","DROP TABLE","git reset --hard"] Match a tool + a substring in its args; recall against that command and inject as advisory additionalContext. Never blocks.
PreToolUse file-read gate hooks.pre_tool_use.file_read_gate / file_read_gate_tools false / ["Read","Edit","MultiEdit"] Port 5 from thedotmack/claude-mem. When Read/Edit/MultiEdit touches a path with prior memories, inject those memories regardless of warn_on_patterns.
Detached store hooks.stop.detach_store true Fork the dedup-and-store fan-out into a detached subprocess so Stop returns immediately. ~200-500 ms saved per noteworthy turn, and - the reason it is on by default since 2026-07-25 - it takes the embed off the Stop hook's critical path, so a multi-KB memory can no longer be dropped by the hook timeout. Trade-off: store failures are logged, not surfaced in the systemMessage. See docs/daemon.md.
Daemon (long-lived hook executor) hooks.daemon.enabled (auto via installer) platform-dependent Single Python process owns providers + config across hook invocations. Each hook answers in milliseconds instead of 100-300 ms. See docs/daemon.md.

HyDE model

Default: gemma4:e2b with qwen3:4b fallback. Any small Ollama model
works -- it just needs to produce a short hypothetical answer for search
expansion. If Ollama is down, HyDE degrades gracefully to the raw prompt.

Commands Reference

Slash commands (inside Claude Code)

These are available as skills after running the installer. Type the
command in the Claude Code prompt.

Command Since Requires Description
/reflect v0.2 Ollama Analyze recent memories for recurring patterns, generate CLAUDE.md rules
/consolidate v0.2 Ollama Find duplicate memories, compress old entries, prune stale ones
/wrapup v0.5 -- Produce a restore-ready session state summary before compacting / pausing
/episodic <query> v0.6 episodic-server Search past Claude Code conversations by semantic query
/save-learning v0.7 -- Save a user instruction/preference as a persistent learning
/find-skills v0.7 caliber Search the public skill registry for community skills
/setup-caliber v0.7 caliber Set up Caliber pre-commit hooks for config drift detection
/setup-compile-aware v0.7 LSP engine Detect build tools in the current project and propose a [compile_aware.commands] block for .claude-hooks/lsp-engine.toml. Asks for confirmation before writing.
/get-advice [ask] <query> v1.3 claude-advisor + Ollama Multi-turn LLM-to-LLM second-opinion conversation with a configured Ollama advisor. Project tools (read_file, grep, glob, list_files, recall_memory) available to the advisor. Subverbs: ask (default, implicit - bare /get-advice <query> works), model [name [ctx]] (report or set), effort [tier] (report or set low/medium/high/max), tools [csv|all|none] (report or set the project-tool list exposed to the advisor). See docs/get-advice.md.
/consultants [ask] <query> v1.3 (engine v2 on dev) claude-consultants Multi-agent council consultation with per-role message-history persistence in transcript.db. v2 engine ships 6 roles: planner, researcher (Mode A inline / Mode B PLAN-REPORT split), critic, synthesizer, opt-in tool_executor, opt-in coder. Opt-in cross-session memory (M8 BaseStore) with per-namespace TTL + distillation-on-expiry (M14). CitationLinter verifies every path:line claim before the answer leaves the council. Subverbs: ask (default, implicit - bare /consultants <query> works), followup [<sid>] <question> (iterate on a prior session; failed-session-aware), list [--limit N] (past sessions), show <sid> [--raw] (re-read a stored summary), config [<args>...] (interactive walk-through to toggle roles, change per-role models, set context pins, switch effort tier low/medium/high/max/xmedium/xhigh/xmax, change service mode). See docs/consultants.md for the runbook, docs/consultants-roles.md for the role-by-role reference (when to enable tool_executor / coder, what their shortcomings are).

CLI commands (outside Claude Code)

Run these from your terminal in the claude-hooks repo directory.

## Memory analysis
python -m claude_hooks.reflect              # generate CLAUDE.md rules from memory patterns
python -m claude_hooks.reflect --dry-run    # preview without writing

python -m claude_hooks.consolidate          # deduplicate and compress old memories
python -m claude_hooks.consolidate --dry-run

## Installer
python3 install.py                          # interactive install
python3 install.py --dry-run                # show changes, don't write
python3 install.py --non-interactive        # CI-friendly, no prompts
python3 install.py --uninstall              # remove all claude-hooks entries
python3 install.py --probe                  # force MCP tool-probe detection
python3 install.py --episodic-server        # configure as episodic-memory server
python3 install.py --episodic-client URL    # configure as episodic-memory client

## Episodic server (on the server host)
python3 episodic_server/server.py --host 0.0.0.0 --port 11435
systemctl status episodic-server            # if installed as systemd service
journalctl -u episodic-server -f            # follow server logs

## Episodic API (from any host)
curl "http://SERVER:11435/search?q=bcache&limit=5"   # search conversations
curl http://SERVER:11435/health                       # health check
curl http://SERVER:11435/stats                        # index statistics
curl -X POST http://SERVER:11435/sync                 # trigger re-index

## /get-advice CLI (v1.1)
claude-advisor get-model                            # show configured model + ctx_max
claude-advisor set-model qwen3.5:cloud              # set model (auto-probes ctx_max)
claude-advisor set-model qwen3.5:cloud 32768        # set model + pin context length
claude-advisor get-effort                           # show effort tier + budget
claude-advisor set-effort medium                    # low | medium | high | max
claude-advisor get-tools                            # show advisor's project-tool list
claude-advisor set-tools all                        # all known tools
claude-advisor set-tools none                       # tools-off
claude-advisor set-tools read_file,grep             # explicit subset
claude-advisor...

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.