English ยท ็ฎไฝไธญๆ
Language-neutral code index for AI agents โ precise navigation without full-project search.
CodeMap builds a deterministic, AST-based index of your codebase so AI agents (Claude Code, Cursor, Codex, etc.) can find call chains, route mappings, and cross-file relationships without grepping the entire project. Indexing is static, fast, and reproducible โ no LLM in the index path.
Status: 0.1.0 stable. Installable from PyPI as codemap-core
plus 14 codemap-<lang> plugins.
๐ In a hurry? The
INSTALL.mdguide is the definitive walkthrough โ it coverspipx/uv tool/pip, language-plugin injection, offline distribution, troubleshooting, and a verbatim clean-machine validation log.
- Core principles
- Installation
- Verify
- Commands
- Configuration
- Built-in indexers and bridges
- Architecture
- Writing a plugin
- Performance
- Documentation
- Contributing
- License
- Static analysis first, LLM as consumer โ the index is deterministic and reproducible.
- Layered defense, confidence-graded โ admit uncertainty rather than hallucinate.
- Cross-asset bridging is the core value โ non-source assets (XML, YAML, IDL) bridge to code via the same protocol as languages.
- Evolvable path โ CLI โ MCP Server โ Agent CLI, each step independently valuable.
- Ecosystem-compatible โ SCIP for symbols, MCP for tools.
- Language-neutral โ no language or framework is privileged; all indexers and bridges register through the same plugin protocol (see ADR-L001).
# Recommended: pipx provides environment isolation + a system-wide
# `codemap` command
pipx install codemap-core
# Plain pip (preferably into a venv)
pip install codemap-core
# Or with uv
uv tool install codemap-core# `--watch` mode needs watchdog
pip install "codemap-core[watch]"
pipx install "codemap-core[watch]"
# Development tools (tests, lint, mypy, import-linter, benchmarks)
pip install "codemap-core[dev]"Each non-Python language indexer ships as an independent PyPI
distribution. To add a language to a pipx-installed codemap, use
pipx inject so the plugin lands in the same isolated venv as the
main CLI:
pipx inject codemap codemap-typescript codemap-java codemap-go \
codemap-rust codemap-swift codemap-kotlin \
codemap-ruby codemap-php codemap-sql \
codemap-bash codemap-c codemap-cpp \
codemap-csharp codemap-scalaPlain pip (when codemap-core is installed via pip, not pipx):
pip install codemap-typescript codemap-java codemap-go codemap-rust \
codemap-swift codemap-kotlin codemap-ruby codemap-php \
codemap-sql codemap-bash codemap-c codemap-cpp \
codemap-csharp codemap-scalaOr one at a time when you only need a single language:
pipx inject codemap codemap-typescript # or pip install codemap-typescriptEach plugin declares codemap-core as a dependency, so pip will pull
the engine if you don't already have it. After installation, codemap doctor lists every installed plugin alongside the built-in indexers on
identical terms โ see Writing a plugin for the
design.
git clone https://github.com/qxbyte/codemap.git
cd codemap
# Editable install with all dev tooling
pip install -e ".[dev,watch]"
# Optionally install language plugins in editable mode
pip install -e plugins/codemap-typescript
pip install -e plugins/codemap-java
pip install -e plugins/codemap-go
pip install -e plugins/codemap-rust
pip install -e plugins/codemap-swift
pip install -e plugins/codemap-kotlin
pip install -e plugins/codemap-ruby
pip install -e plugins/codemap-php
pip install -e plugins/codemap-sql
pip install -e plugins/codemap-bash
pip install -e plugins/codemap-c
pip install -e plugins/codemap-cpp
pip install -e plugins/codemap-csharp
pip install -e plugins/codemap-scalaFor users who want unreleased changes from main or to pin to a
specific commit, the git URL form still works:
# Track main
pip install git+https://github.com/qxbyte/codemap.git
pipx install git+https://github.com/qxbyte/codemap.git
# Pin to a commit
pip install git+https://github.com/qxbyte/codemap.git@2c3ed45
# A specific language plugin from a subdirectory
pip install "git+https://github.com/qxbyte/codemap.git#subdirectory=plugins/codemap-typescript"| Item | Requirement |
|---|---|
| Python | โฅ 3.11 (the project develops on 3.13) |
| OS | macOS / Linux (Windows may need polling fallback for --watch) |
| Network | Required at install time to fetch tree-sitter-typescript etc. |
codemap --version # โ 0.1.0
codemap --help # list global flags + subcommands
codemap doctor # show registered indexers, bridges, and `.codemap/` stateA successful install with the TypeScript plugin should look like:
$ codemap doctor
CodeMap 0.1.0
project_root: /your/path
Registered indexers
โ name โ version โ languages โ file_patterns โ
โ _example_lang โ 0.1.0 โ example โ *.example โ
โ python โ 0.1.0 โ python โ *.py, *.pyi โ
โ typescript โ 0.1.0 โ typescript โ *.ts, *.tsx โ
โ java โ 0.1.0 โ java โ *.java โ
โ go โ 0.1.0 โ go โ *.go โ
โ rust โ 0.1.0 โ rust โ *.rs โ
โ swift โ 0.1.0 โ swift โ *.swift โ
โ kotlin โ 0.1.0 โ kotlin โ *.kt, *.kts โ
โ ruby โ 0.1.0 โ ruby โ *.rb โ
โ php โ 0.1.0 โ php โ *.php โ
โ sql โ 0.1.0 โ sql โ *.sql, *.ddl โ
โ bash โ 0.1.0 โ bash โ *.sh, *.bash, *.bats โ
โ c โ 0.1.0 โ c โ *.c, *.h โ
โ cpp โ 0.1.0 โ cpp โ *.cpp, *.cc, *.cxx, *.hpp, *.hh, *.hxx โ
โ csharp โ 0.1.0 โ csharp โ *.cs, *.csx โ
โ scala โ 0.1.0 โ scala โ *.scala, *.sc โ
Registered bridges
โ name โ version โ requires โ
โ http_route โ 0.1.0 โ - โ
โ python_cross_module โ 0.1.0 โ - โ
Full reference: docs/cli.md.
# Index a project (writes .codemap/)
codemap index /path/to/project
codemap index . --rebuild # discard old index
codemap index . --incremental # re-parse only files whose sha256 changed
codemap index . --watch # stay running and re-index on changes
codemap index . --dry-run # report what would be indexed, no write
# Diagnose
codemap doctor # plugins + index health
codemap diagnostics --severity error # show recorded warnings / errors
codemap config show # merged effective configuration
# Query
codemap search login -n 5
codemap get '<symbol-id>'
codemap callers '<symbol-id>' --depth 2
codemap callees '<symbol-id>'
codemap trace --from '<id>' --depth 5
codemap trace --from '<id>' --to '<id>' # shortest path
codemap routes # HTTP routes from the http_route bridge
# Machine-readable output: all commands take --json
codemap --json callers '<symbol-id>'Exit codes follow sysexits.h (ADR-005); see
docs/cli.md for the table.
Project-level configuration lives at .codemap/config.yaml (committed
or git-ignored โ your choice). A user-level override at
~/.config/codemap/config.yaml is layered on top of built-in defaults,
and the project file is layered on top of that. CLI flags win over all
three.
# .codemap/config.yaml
storage:
backend: json # json | sqlite (sqlite reserved for a future sprint)
index:
ignore: [] # extra fnmatch patterns on names + project-relative paths
max_file_bytes: 10485760
follow_symlinks: false
indexers:
enabled: all # "all" or an explicit list of indexer names
disabled: [] # subtractive
bridges:
enabled: all
disabled: []Full reference: docs/configuration.md.
Run codemap config show to inspect the merged result and see which
file contributed each value.
| Indexer | Files | Provided by | Status |
|---|---|---|---|
python |
*.py, *.pyi |
main repo | first-class, dogfooded |
typescript |
*.ts, *.tsx |
plugins/codemap-typescript/ |
independent plugin |
java |
*.java |
plugins/codemap-java/ |
independent plugin |
go |
*.go |
plugins/codemap-go/ |
independent plugin |
rust |
*.rs |
plugins/codemap-rust/ |
independent plugin |
swift |
*.swift |
plugins/codemap-swift/ |
independent plugin |
kotlin |
*.kt, *.kts |
plugins/codemap-kotlin/ |
independent plugin |
ruby |
*.rb |
plugins/codemap-ruby/ |
independent plugin |
php |
*.php |
plugins/codemap-php/ |
independent plugin |
sql |
*.sql, *.ddl |
plugins/codemap-sql/ |
independent plugin (DDL only) |
bash |
*.sh, *.bash, *.bats |
plugins/codemap-bash/ |
independent plugin |
c |
*.c, *.h |
plugins/codemap-c/ |
independent plugin |
cpp |
*.cpp, *.cc, *.cxx, *.hpp, *.hh, *.hxx |
plugins/codemap-cpp/ |
independent plugin |
csharp |
*.cs, *.csx |
plugins/codemap-csharp/ |
independent plugin |
scala |
*.scala, *.sc |
plugins/codemap-scala/ |
independent plugin |
_example_lang |
*.example |
main repo | reference / smoke |
| Bridge | Purpose |
|---|---|
http_route |
Mints scip-route intermediates from Symbol.extra["http_route"] and ["http_calls"] metadata; links client callers to server handlers regardless of language |
python_cross_module |
Resolves synthetic scip-python . . . <module>/<leaf>. targets emitted by the Python indexer to concrete local symbols when the file is in the index |
New language? You never need to PR the main repository โ see Writing a plugin.
cli โ core โ indexers
โ โ
โโโ io โโโโโ
โ
mcp
- core โ pure business logic, Pydantic data models, SymbolID (SCIP
format), call-graph algorithms (
walk_chain,shortest_path) - io โ persistence adapters (JSON today, SQLite reserved for scale)
- indexers โ pluggable language/asset indexers, discovered via
codemap.indexersentry-point group - bridges โ pluggable cross-language resolvers, discovered via
codemap.bridgesentry-point group - cli โ Typer command surface
- mcp โ MCP server, later sprint
Strict import-linter contracts (pyproject.toml) enforce the
dependency direction cli โ core โ indexers, cli โ core โ io on
every PR.
CodeMap's indexers and bridges are plugin-first. Adding a new language is
a separate PyPI package โ main repo is never touched. The
codemap-typescript package under plugins/ is the reference
implementation:
# your-plugin/pyproject.toml
[project.entry-points."codemap.indexers"]
yourlang = "codemap_yourlang:YourLangIndexer"That one line is the only coupling. After pip install your-plugin
your indexer appears in codemap doctor on identical terms.
Step-by-step guide: docs/plugin-guide.md.
Reference: plugins/codemap-typescript/.
Baseline numbers (median, M-series single core, indexing the CodeMap repo itself, 437 symbols / 1232 edges):
| Bench | Median | Target (design ยง21) |
|---|---|---|
| full index | 73 ms | โค 3 s |
callers |
4.7 ยตs | โค 50 ms |
callees |
26 ยตs | โค 50 ms |
walk_chain depth 10 |
72 ยตs | โค 200 ms |
Re-run locally with pytest -m bench -o addopts="". PRs that regress
any median by โฅ 20 % are blocked by CI (ADR-010). Full table and
methodology: docs/performance.md.
| File | Topic |
|---|---|
docs/cli.md |
Every command, flag, JSON envelope, exit code |
docs/configuration.md |
All config keys + merge order |
docs/plugin-guide.md |
How to write an indexer / bridge plugin |
docs/performance.md |
Baseline numbers + ADR-010 regression policy |
docs/indexers/python.md |
Python indexer details |
docs/bridges/http_route.md |
HTTP route bridge contract |
docs/adr/ |
Architecture decision records (1โ12 + L001) |
CHANGELOG.md |
Release notes |
See CONTRIBUTING.md. The key invariant: no
language is a first-class citizen. Proposals that special-case any
ecosystem will be asked to refactor into the generic plugin protocol
(ADR-L001).
CI gates every PR through ruff, mypy --strict, import-linter,
pytest --cov 80%, and the benchmark suite.
MIT โ see LICENSE.