Skip to main content

hybrid-coco

CI PyPI version PyPI downloads Python License: Apache 2.0 GitHub issues

Local, self-contained code intelligence for AI agents. Index your codebase once, query it deterministically with the hc CLI and hc_* MCP tools — one install, no external services.

hybrid-coco ships everything in one component: SQLite storage, tree-sitter parsers, CLI, MCP server, host-native hooks, awareness, and agent skills. No embeddings, no vector database, no Docker, no companion tools.

pip install hybrid-coco && hc init

The problem it solves

When Claude reads a file to find one function, it pays for the entire file:

# Without hybrid-coco
Read("src/gitlab_helpers.py")             >  12,140 tokens  (whole file)

# With hybrid-coco
hc_file_context("src/gitlab_helpers.py")  >  297 tokens  (symbols only)  < 97.6% savings

The hook intercepts native file-read / search tools (Read/Grep, or the host's equivalent) and suggests the equivalent hc_* tool. Same answer, fraction of the tokens.

How it works

Source files  ──tree-sitter──►  SQLite + FTS5  ──►  CLI (hc)
                                     │
                                     └──────────────►  MCP server (hc_*)
                                                           │
                                                    host-native hooks
                                                    intercept Read/Grep
                                                    (or host equivalent)
                                                    > suggest hc_* tools
  1. hc index .: parses every source file with tree-sitter, extracts symbols (functions, classes, methods, imports) with their signatures, docstrings, and line numbers into a FTS5 trigram index
  2. hc query / symbol / file-context / snippet: queries the index and returns structure or bounded source slices — not whole files
  3. hc serve: exposes the same queries as MCP tools (hc_search, hc_symbol, hc_file_context, hc_snippet, hc_structure, hc_status)
  4. Hooks: hc init registers host-native hooks that suggest hc_* tools whenever the agent is about to read or search an indexed file (hc init --host cursor|codex|opencode|devin, or --host all)

Benchmark

Measured on a real Rust codebase: 76 files, 2,242 symbols:

Query Baseline (full read / shell search) hybrid-coco Savings
Symbol lookup (TimedExecution) 2,227 tok 51 tok 97.7%
Pattern search (savings) 3,164 tok 334 tok 89.4%
File structure (tracking.rs) 12,140 tok 1,245 tok 89.7%
Schema grep (CREATE TABLE) 92 tok 29 tok 68.5%
File read (git.rs) 16,343 tok 377 tok 97.7%
Total (5 queries) 33,966 tok 2,036 tok ~94%

Baseline = recursive search plus reading whole files. hybrid-coco = hc symbol + hc query + hc file-context.

Quickstart

1. Install

Option A: One-line installer (recommended)

curl -fsSL https://raw.githubusercontent.com/jmeiracorbal/hybrid-coco/main/install.sh | bash

Installs the hc package (uv, pipx, or pip), Claude Code hooks, and the short global instruction gate (hc install-instructions --host claude). It does not run hc init. Other hosts: hc install-instructions --host cursor|codex|opencode|devin or --host all. Requires Python 3.11+.

Option B: Claude Code plugin

claude plugin marketplace add jmeiracorbal/hybrid-coco
claude plugin install hybrid-coco@hybrid-coco

Registers the MCP server and hooks automatically. Requires hc in PATH — install the package first:

pip install hybrid-coco   # or: uv tool install hybrid-coco

2. Index your project and register with an agent host

cd your-project/
hc init                 # Claude Code (default)
hc init --host cursor
hc init --host codex
hc init --host opencode
hc init --host devin
hc init --host all      # every supported host

hc init does five things:

  • Indexes the current directory (tree-sitter, SHA-256 incremental)
  • Registers the MCP server in the host project config
  • Installs host-native hooks that intercept Read and Grep (or the host's equivalent)
  • Installs host-adapted agent skills (hybrid-coco, hc-init, hc-search) — same names, host-specific MCP paths, native tools, and hook events
  • Activates the project the same way mnemo does: writes .hybrid-coco/project.json (version, deterministic id, agents) and copies the full protocol to .hybrid-coco/hybrid-coco.md. It does not append to project AGENTS.md / CLAUDE.md, and it does not write user-global instruction files. The short conditional protocol is installed once by install.sh / hc install-instructions.

Restart the agent host to activate.

3. Use from the agent

The MCP tools are now available in every conversation:

hc_search("savings_pct")       # FTS5 search over names, signatures, docstrings
hc_symbol("TimedExecution")    # exact/prefix symbol lookup → line range
hc_structure("function", lang=["rust"])  # tree-sitter shape search
hc_snippet("src/git.rs", 45, 67)  # bounded source slice from disk
hc_file_context("src/git.rs")  # all symbols in a file, structured
hc_status()                    # index stats

Invocable skills: /hc-init (setup/repair without full-reindex storms), /hc-search (choose the right hc_* query). The main hybrid-coco skill covers when to prefer hc_* over the host's native read/search tools.

The hooks will remind the agent (via the host's hook protocol) whenever it is about to read an indexed file directly.

Agent hosts

Host hc init MCP Skills Hooks
Claude Code default .claude/settings.json ~/.claude/skills/ PreToolUse Read|Grep, PostToolUse Write|Edit
Cursor --host cursor .cursor/mcp.json .cursor/skills/ + ~/.cursor/skills/ preToolUse Read|Grep, beforeReadFile, postToolUse Write|StrReplace, afterFileEdit, sessionStart
Codex --host codex .codex/config.toml .agents/skills/ + ~/.agents/skills/ PreToolUse Bash (cat/head/rg/grep), PostToolUse apply_patch, SessionStart
OpenCode --host opencode opencode.json .opencode/skills/ + ~/.config/opencode/skills/ plugin tool.execute.before/after (read/grep via filePath)
Devin --host devin .devin/mcp_config.json .devin/skills/ + ~/.config/devin/skills/ .devin/hooks.v1.json (read/grep, Claude-compatible decision: block)

Skills keep the same names on every host (hybrid-coco, hc-init, hc-search) so /hc-init and /hc-search still work. The SKILL.md body is host-adapted: MCP path, native tools to avoid, and only the hook events that host actually fires. Hooks never invent events a host does not support.

Instruction files follow the same split as mnemo: install globally, activate per project.

# global (once — install.sh / hc install-instructions)
~/.claude/CLAUDE.md                         ← short <!-- hybrid-coco:start --> gate
~/.cursor/rules/hybrid-coco.mdc             ← alwaysApply: true, same gate
~/.codex/AGENTS.md
~/.config/opencode/AGENTS.md
~/.config/devin/AGENTS.md

# project (`hc init`)
project/
├── .hybrid-coco/hybrid-coco.md   ← full protocol (gitignored with the index)
└── .hybrid-coco/project.json     ← {version, id, agents} — like mnemo's `.mnemo`

The global text is conditional: if .hybrid-coco/project.json is missing, skip hybrid-coco entirely. If the file exists but id is missing, empty, not a UUID, or not the uuid5 derived from the absolute project path, the runtime rewrites id in place — it does not invent version or agents, and it does not create a marker from scratch. Hooks use the same gate. hc init does not write project AGENTS.md, CLAUDE.md, or .cursor/rules/hybrid-coco.mdc, and does not touch the global instruction files. Re-running hc install-instructions refreshes the managed block without duplicating it.

CLI reference

hc index [PATH] [--exclude PATTERN]...
                         Index PATH (default: cwd); optional exclude patterns
hc update [PATH] [--exclude PATTERN]...
                         Re-index only changed files (SHA-256 diff)
hc status [PATH]         Index stats: files, symbols by kind, last update
hc query <TEXT> [--path P] [--lang L]... [--offset N] [--limit N]
                         FTS5 search; optional path/lang filters and pagination
hc symbol <NAME> [--path P] [--lang L]... [--offset N] [--limit N]
                         Exact name lookup, then prefix; same filters as query
hc file-context <PATH>   All symbols in PATH grouped by kind (~97% savings vs cat)
hc snippet <PATH> <START> <END>
                         Read PATH lines START..END from disk (1-based, inclusive)
hc structure <KIND> [--path P] [--lang L]...
                         Structural search: function | method | class | import
hc doctor [PATH]         Diagnostics: index, schema, languages, MCP/hooks, versions
hc reset [PATH] [-f] [--all]
                         Delete index DB; --all also drops project MCP entries
hc serve                 Start MCP server (stdio)
hc hook <HOST> <EVENT>   Host lifecycle hook (JSON stdin/stdout)
hc install-instructions [--host NAME]...
                         Short conditional protocol in user-global instruction files
                         --host: claude (default), cursor, codex, opencode, devin, all
hc init [PATH] [--host NAME]...
                         Index + marker + .gitignore + register MCP/hooks/skills
                         --host: claude (default), cursor, codex, opencode, devin, all
hc sync-skills [--check] Maintainer: sync Claude skill mirrors from assets/skills/
                         to skills/ and plugin/skills/ (--check verifies CI parity)

--exclude accepts gitignore-style patterns and may be repeated. They are combined with exclude in .hybrid-coco/config.toml. If that file is missing, hc init, hc index, hc update, and hc doctor write the default and continue.

Project settings

If .hybrid-coco/config.toml is missing, hybrid-coco creates it with empty lists and keeps going. Edit the file afterwards to restrict paths or override languages. An existing invalid file is not overwritten — that fails until you fix it.

include = []
exclude = []
languages = {}

Example with restrictions:

include = ["src/**"]
exclude = ["**/generated/**"]

[languages]
".pyx" = "python"
".h" = "cpp"
  • include: gitignore-style patterns. Empty list = no include restriction. Non-empty = only matching paths are indexed.
  • exclude: gitignore-style patterns, merged with hc index --exclude.
  • languages: extension → parser language (python, rust, cpp, …). Overrides the built-in extension map.

hc reset deletes the index database and leaves config.toml in place. hc doctor writes the default file if it is missing, and fails if the existing file is invalid.

Supported languages

Language Parser
Python tree-sitter-python
Rust tree-sitter-rust
JavaScript tree-sitter-javascript
TypeScript tree-sitter-typescript
Go tree-sitter-go
Java tree-sitter-java
C tree-sitter-c
C++ tree-sitter-cpp
C# tree-sitter-c-sharp
Kotlin tree-sitter-kotlin
Swift tree-sitter-swift

Adding a language: one LanguageSpec in src/hybrid_coco/languages/registry.py, a parser module under src/hybrid_coco/parsers/, and tests in tests/test_languages.py.

Design decisions

SQLite + FTS5, not a vector database: deterministic results, zero infrastructure, single file. Trigram search covers partial matches and is fast enough for codebases up to ~100K files. Semantic (embedding) search can be layered on top via sqlite-vec without changing the schema.

tree-sitter, not regex: symbol extraction is grammar-aware. Signatures and docstrings are extracted structurally, not by pattern matching.

No server process: hc serve runs as a stdio MCP server launched on demand by the agent host. There is no daemon to manage.

Incremental by default: hc update re-indexes only files whose SHA-256 has changed. Full re-index is only needed on first run or after .gitignore changes.

Boundaries

hybrid-coco is a single local component:

  • SQLite storage in the project workspace
  • tree-sitter parsers for symbol extraction
  • CLI (hc) for indexing and querying
  • MCP server (hc_*) for Claude Code, Cursor, Codex, OpenCode, Devin, and other MCP hosts
  • hooks, awareness, and skills shipped with the package (hc init --host)

It does not require companion services, external proxies, background daemons, or additional infrastructure.

Development

git clone https://github.com/jmeiracorbal/hybrid-coco
cd hybrid-coco
uv sync --extra dev
uv pip install -e .
hc --version

Run tests:

uv run pytest

Layout (maintainers)

Layer Modules
Application query.py, formatters.py
Indexing indexer.py, parsers/, languages/registry.py
Storage store.py, structure.py
Host integration hosts/ (base.py, hooks_patch.py, per-host installers)
Packaged assets assets/ (skills, hooks, awareness)

After editing Claude skills in src/hybrid_coco/assets/skills/:

hc sync-skills          # refresh skills/ and plugin/skills/
hc sync-skills --check  # verify mirrors (same check as CI)

Host-adapted skills under assets/hosts/<host>/skills/ are installed by hc init only — no repo mirror.

Run the benchmark against any indexed project:

cd path/to/project && hc index .
python scripts/benchmark.py path/to/project

Metadata

Release files for hybrid-coco 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hybrid-coco 0.2.0
File Size Uploaded Provenance Actions
hybrid_coco-0.2.0.tar.gz 146.0 kB Without provenance Details for hybrid_coco-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for hybrid-coco 0.2.0
File Interpreter ABI Platform Actions
hybrid_coco-0.2.0-py3-none-any.whl Python 3 none any Details for hybrid_coco-0.2.0-py3-none-any.whl

Total release size: 265.3 kB

Release files / hybrid_coco-0.2.0.tar.gz

Download URL hybrid_coco-0.2.0.tar.gz
Size 146.0 kB
Tags Source
SHA-256 checksum
How to use checksums
0b2be2e34524e6266edd0d01f3331c952d45ec5ebafcc48d0da48e86a8a50a9b
BLAKE2b-256 checksum
How to use checksums
3c2534a868c7c552b3fbe9ec2c248b29730bc9e0101687d20a7161e7b135e86d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / hybrid_coco-0.2.0-py3-none-any.whl

Download URL hybrid_coco-0.2.0-py3-none-any.whl
Size 119.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8104de39094b0c64a9fd1b2bd1289cfc37eec9062743f61c31da73a8b751d93a
BLAKE2b-256 checksum
How to use checksums
4dd1799cb96a73b552fc43b8c922a094db942e5ae2d493848893a124c9359163
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for hybrid-coco 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page