codecortex 0.19.0__tar.gz → 0.20.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. {codecortex-0.19.0/src/codecortex.egg-info → codecortex-0.20.0}/PKG-INFO +31 -4
  2. {codecortex-0.19.0 → codecortex-0.20.0}/README.md +30 -3
  3. {codecortex-0.19.0 → codecortex-0.20.0/src/codecortex.egg-info}/PKG-INFO +31 -4
  4. {codecortex-0.19.0 → codecortex-0.20.0}/src/codecortex.egg-info/SOURCES.txt +6 -0
  5. codecortex-0.20.0/src/codeintel/__init__.py +1 -0
  6. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/__main__.py +187 -48
  7. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/c4.py +371 -40
  8. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/install.py +61 -0
  9. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/query.py +15 -8
  10. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/gateway.py +117 -0
  11. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/indexer.py +10 -0
  12. codecortex-0.20.0/src/codeintel/injector.py +271 -0
  13. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/onboarding.py +21 -19
  14. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/providers/graph.py +362 -10
  15. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/providers/lsp.py +103 -5
  16. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/providers/semantic.py +120 -21
  17. codecortex-0.20.0/src/codeintel/query_ops.py +17 -0
  18. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/server.py +21 -5
  19. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_c4.py +252 -0
  20. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_c4_model.py +59 -6
  21. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_c4_output.py +12 -0
  22. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_cli_commands.py +12 -10
  23. codecortex-0.20.0/tests/test_cli_help.py +474 -0
  24. codecortex-0.20.0/tests/test_cli_install_dry_run.py +115 -0
  25. codecortex-0.20.0/tests/test_cli_install_offer_injection.py +119 -0
  26. codecortex-0.20.0/tests/test_edge_confidence.py +146 -0
  27. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_graph_failure_population.py +15 -0
  28. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_graph_real.py +5 -5
  29. codecortex-0.20.0/tests/test_lsp_language_coverage.py +100 -0
  30. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_mapper.py +132 -0
  31. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_mcp_server.py +28 -0
  32. codecortex-0.20.0/tests/test_null_reason_and_ripple.py +194 -0
  33. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_onboarding.py +6 -2
  34. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_semantic_provider.py +130 -0
  35. codecortex-0.19.0/src/codeintel/__init__.py +0 -1
  36. codecortex-0.19.0/src/codeintel/injector.py +0 -114
  37. codecortex-0.19.0/tests/test_cli_help.py +0 -223
  38. {codecortex-0.19.0 → codecortex-0.20.0}/LICENSE +0 -0
  39. {codecortex-0.19.0 → codecortex-0.20.0}/pyproject.toml +0 -0
  40. {codecortex-0.19.0 → codecortex-0.20.0}/setup.cfg +0 -0
  41. {codecortex-0.19.0 → codecortex-0.20.0}/src/codecortex.egg-info/dependency_links.txt +0 -0
  42. {codecortex-0.19.0 → codecortex-0.20.0}/src/codecortex.egg-info/entry_points.txt +0 -0
  43. {codecortex-0.19.0 → codecortex-0.20.0}/src/codecortex.egg-info/requires.txt +0 -0
  44. {codecortex-0.19.0 → codecortex-0.20.0}/src/codecortex.egg-info/top_level.txt +0 -0
  45. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/agent_prompt.py +0 -0
  46. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/auth.py +0 -0
  47. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/cache.py +0 -0
  48. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/__init__.py +0 -0
  49. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/_common.py +0 -0
  50. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/c4.py +0 -0
  51. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/doctor.py +0 -0
  52. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/gen_token.py +0 -0
  53. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/graph.py +0 -0
  54. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/index.py +0 -0
  55. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/map.py +0 -0
  56. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/prompt.py +0 -0
  57. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/reset.py +0 -0
  58. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/serve.py +0 -0
  59. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/serve_http.py +0 -0
  60. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/setup.py +0 -0
  61. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/commands/status.py +0 -0
  62. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/config.py +0 -0
  63. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/containment.py +0 -0
  64. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/doctor.py +0 -0
  65. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/graph_backend.py +0 -0
  66. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/graph_render.py +0 -0
  67. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/graph_resolution.py +0 -0
  68. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/grapher.py +0 -0
  69. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/http_server.py +0 -0
  70. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/installer.py +0 -0
  71. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/loc.py +0 -0
  72. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/logconfig.py +0 -0
  73. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/mapper.py +0 -0
  74. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/metrics.py +0 -0
  75. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/outcome.py +0 -0
  76. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/paths.py +0 -0
  77. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/policy.py +0 -0
  78. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/progress.py +0 -0
  79. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/provider.py +0 -0
  80. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/providers/__init__.py +0 -0
  81. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/providers/none.py +0 -0
  82. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/py.typed +0 -0
  83. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/redact.py +0 -0
  84. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/reindexer.py +0 -0
  85. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/reset.py +0 -0
  86. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/searcher.py +0 -0
  87. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/semantic_db.py +0 -0
  88. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/source_kind.py +0 -0
  89. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/term.py +0 -0
  90. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/verify.py +0 -0
  91. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/viewer/__init__.py +0 -0
  92. {codecortex-0.19.0 → codecortex-0.20.0}/src/codeintel/viewer/graph_template.html +0 -0
  93. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_agent_prompt.py +0 -0
  94. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_backend_reaper.py +0 -0
  95. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_cache.py +0 -0
  96. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_chunking.py +0 -0
  97. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_cold_process.py +0 -0
  98. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_config.py +0 -0
  99. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_corpus.py +0 -0
  100. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_docs_ci_claims.py +0 -0
  101. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_docs_deadcode_withdrawal.py +0 -0
  102. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_doctor.py +0 -0
  103. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_e2e.py +0 -0
  104. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_engine_adoption.py +0 -0
  105. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_enterprise.py +0 -0
  106. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_gateway.py +0 -0
  107. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_graph_provider.py +0 -0
  108. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_graph_stdin.py +0 -0
  109. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_grapher.py +0 -0
  110. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_hardening.py +0 -0
  111. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_http_auth.py +0 -0
  112. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_http_server.py +0 -0
  113. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_incompleteness.py +0 -0
  114. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_index_progress.py +0 -0
  115. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_indexer_binary.py +0 -0
  116. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_installer.py +0 -0
  117. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_integration.py +0 -0
  118. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_loc_census.py +0 -0
  119. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_lsp_provider.py +0 -0
  120. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_lsp_real.py +0 -0
  121. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_mcp_handshake.py +0 -0
  122. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_model_dimension.py +0 -0
  123. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_never_raise.py +0 -0
  124. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_rbac.py +0 -0
  125. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_redaction_boundary.py +0 -0
  126. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_reindexer.py +0 -0
  127. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_rerank.py +0 -0
  128. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_reset.py +0 -0
  129. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_source_kind.py +0 -0
  130. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_staleness.py +0 -0
  131. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_symbol_context.py +0 -0
  132. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_term.py +0 -0
  133. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_treesitter.py +0 -0
  134. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_verify.py +0 -0
  135. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_verify_call.py +0 -0
  136. {codecortex-0.19.0 → codecortex-0.20.0}/tests/test_version_skew.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecortex
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Summary: Local-first, MCP-native code-intelligence server — graph, LSP, and semantic search behind one safe code.query tool for coding agents.
5
5
  Author: Shammai Hamilton
6
6
  License-Expression: MIT
@@ -61,7 +61,7 @@ Prefer plain text? `codeintel map` writes a **readable architecture overview** t
61
61
 
62
62
  **What `CODE_INTEL.md` is for.** It's a *static, committable* snapshot of a codebase's shape — meant to be read (by a person or an agent) **first**, instead of reconstructing structure by grepping. It covers the cases the live `code.query` tool doesn't:
63
63
 
64
- - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a pointer into `CLAUDE.md` / `AGENTS.md`, so an agent picks up the codebase's structure automatically at the start of a session.
64
+ - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a short, tool-naming pointer block into `AGENTS.md` (the cross-tool surface read by Codex, Cursor, Zed, and others — created with your consent if it doesn't exist yet) plus a one-line `@AGENTS.md` import into `CLAUDE.md`, and writes the fuller [`USING_CODEINTEL.md`](USING_CODEINTEL.md) guide the block points to — so an agent knows to reach for `code.query` before it reaches for grep, not just that a `CODE_INTEL.md` exists.
65
65
  - **A committed, diffable overview.** It lives *in the repo* — reviewable in a PR, browsable on GitHub, available offline. Re-run `codeintel map` after `codeintel index` to refresh it.
66
66
  - **The load-bearing code at a glance.** Ranking symbols by caller count surfaces what most of the codebase depends on (the risky-to-change core) plus the entry points — the first things a newcomer, or an agent, should understand before touching anything.
67
67
 
@@ -78,6 +78,8 @@ Without structural tools, an agent dropped into unfamiliar code falls back on `g
78
78
 
79
79
  Net effect: fewer, sharper tool calls, less re-reading, and an agent that can see *structure* — callers, impact, call chains — that plain search can't.
80
80
 
81
+ **The honest framing.** Agentic grep is still the backbone, and codeintel doesn't claim otherwise — Claude Code itself ships grep-only and that is a reasonable default for most of what an agent reads. The defensible claim is narrower: a structural index *where it pays*, degrading to grep the moment an engine is missing or not indexed, which is exactly what the safe-null contract above already does under the hood. Worth saying explicitly rather than leaving it implicit in a failure mode.
82
+
81
83
  ## What your agent can ask
82
84
 
83
85
  It's one call: `code.query(op, target, engine="auto")`. In `auto` mode (the default) codeintel picks the engine per operation:
@@ -279,7 +281,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
279
281
  ```text
280
282
  v claude: registered at /Users/you/.claude.json
281
283
 
282
- v verified: codeintel 0.19.0 — 4 tools (code.query, code.status, code.doctor, code.map)
284
+ v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
283
285
  ```
284
286
 
285
287
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -463,7 +465,22 @@ Config is **validated on load** — an out-of-range number, a misspelled enum, o
463
465
 
464
466
  Not sure what's installed? `codeintel doctor` reports exactly which backends are present, whether this repo is indexed, and the command to fix each gap.
465
467
 
466
- **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5` weights once (cached under `~/.cache`, fully offline thereafter); the optional backends also install on first use *if you opt in*. After that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on a private repo.
468
+ **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5`
469
+ weights once — cached under `fastembed`'s own default (`$TMPDIR/fastembed_cache`, **not**
470
+ `~/.cache`; override with `FASTEMBED_CACHE_PATH` for a location that survives a `/tmp` cleanup),
471
+ fully offline thereafter; the optional backends also install on first use *if you opt in*. After
472
+ that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on
473
+ a private repo. Behind a proxy or fully air-gapped, this download is the one step that can fail —
474
+ see [Offline / air-gapped install](docs/install.md#offline--air-gapped-install) for a documented
475
+ workaround.
476
+
477
+ **What codeintel writes to disk.** `~/.codeintel/semantic.db` is a **single file shared across
478
+ every repo you've ever indexed** with this machine's default embedding model (rows are
479
+ partitioned internally by repo) — 239 MB was observed here after indexing a handful of repos.
480
+ `codeintel reset <repo>` clears that repo's rows but does not shrink the file (SQLite doesn't
481
+ reclaim space without a `VACUUM`); `codeintel reset --all` removes the file outright. Separately,
482
+ the **LSP** engine's backend (serena) writes a `.serena/` directory *into each project you index*
483
+ — add it to that project's `.gitignore` (codeintel's own repo does).
467
484
 
468
485
  ## For agents
469
486
 
@@ -584,6 +601,16 @@ engines safe-null and you get a fraction of the capability table above. `codeint
584
601
  installs what it can and `codeintel doctor` tells you exactly what is missing and how to fix it.
585
602
  Run `doctor` first if the tool seems quieter than the docs suggest.
586
603
 
604
+ **The graph backend is the closest competitor, and it should be named as one.**
605
+ `codebase-memory-mcp` already ships semantic vector search, hybrid LSP type resolution, impact
606
+ analysis, and auto-registration with several agents on its own. A user who installs it alone gets
607
+ most of this project's capability table with less setup. The marginal value of codeintel over its
608
+ own backend is the unification, the safe-null contract, and the LSP merge — one call across three
609
+ engines instead of three separate tools to learn, a never-raise contract enforced by
610
+ fault-injection tests rather than convention, and answers that merge graph structure with exact
611
+ LSP locations instead of picking one. That's real and defensible, and considerably narrower than
612
+ "three engines" makes it sound.
613
+
587
614
  **Maintenance.** One maintainer, MIT licensed, issues and PRs welcome. There is no support
588
615
  guarantee — factor that into anything load-bearing.
589
616
 
@@ -24,7 +24,7 @@ Prefer plain text? `codeintel map` writes a **readable architecture overview** t
24
24
 
25
25
  **What `CODE_INTEL.md` is for.** It's a *static, committable* snapshot of a codebase's shape — meant to be read (by a person or an agent) **first**, instead of reconstructing structure by grepping. It covers the cases the live `code.query` tool doesn't:
26
26
 
27
- - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a pointer into `CLAUDE.md` / `AGENTS.md`, so an agent picks up the codebase's structure automatically at the start of a session.
27
+ - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a short, tool-naming pointer block into `AGENTS.md` (the cross-tool surface read by Codex, Cursor, Zed, and others — created with your consent if it doesn't exist yet) plus a one-line `@AGENTS.md` import into `CLAUDE.md`, and writes the fuller [`USING_CODEINTEL.md`](USING_CODEINTEL.md) guide the block points to — so an agent knows to reach for `code.query` before it reaches for grep, not just that a `CODE_INTEL.md` exists.
28
28
  - **A committed, diffable overview.** It lives *in the repo* — reviewable in a PR, browsable on GitHub, available offline. Re-run `codeintel map` after `codeintel index` to refresh it.
29
29
  - **The load-bearing code at a glance.** Ranking symbols by caller count surfaces what most of the codebase depends on (the risky-to-change core) plus the entry points — the first things a newcomer, or an agent, should understand before touching anything.
30
30
 
@@ -41,6 +41,8 @@ Without structural tools, an agent dropped into unfamiliar code falls back on `g
41
41
 
42
42
  Net effect: fewer, sharper tool calls, less re-reading, and an agent that can see *structure* — callers, impact, call chains — that plain search can't.
43
43
 
44
+ **The honest framing.** Agentic grep is still the backbone, and codeintel doesn't claim otherwise — Claude Code itself ships grep-only and that is a reasonable default for most of what an agent reads. The defensible claim is narrower: a structural index *where it pays*, degrading to grep the moment an engine is missing or not indexed, which is exactly what the safe-null contract above already does under the hood. Worth saying explicitly rather than leaving it implicit in a failure mode.
45
+
44
46
  ## What your agent can ask
45
47
 
46
48
  It's one call: `code.query(op, target, engine="auto")`. In `auto` mode (the default) codeintel picks the engine per operation:
@@ -242,7 +244,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
242
244
  ```text
243
245
  v claude: registered at /Users/you/.claude.json
244
246
 
245
- v verified: codeintel 0.19.0 — 4 tools (code.query, code.status, code.doctor, code.map)
247
+ v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
246
248
  ```
247
249
 
248
250
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -426,7 +428,22 @@ Config is **validated on load** — an out-of-range number, a misspelled enum, o
426
428
 
427
429
  Not sure what's installed? `codeintel doctor` reports exactly which backends are present, whether this repo is indexed, and the command to fix each gap.
428
430
 
429
- **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5` weights once (cached under `~/.cache`, fully offline thereafter); the optional backends also install on first use *if you opt in*. After that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on a private repo.
431
+ **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5`
432
+ weights once — cached under `fastembed`'s own default (`$TMPDIR/fastembed_cache`, **not**
433
+ `~/.cache`; override with `FASTEMBED_CACHE_PATH` for a location that survives a `/tmp` cleanup),
434
+ fully offline thereafter; the optional backends also install on first use *if you opt in*. After
435
+ that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on
436
+ a private repo. Behind a proxy or fully air-gapped, this download is the one step that can fail —
437
+ see [Offline / air-gapped install](docs/install.md#offline--air-gapped-install) for a documented
438
+ workaround.
439
+
440
+ **What codeintel writes to disk.** `~/.codeintel/semantic.db` is a **single file shared across
441
+ every repo you've ever indexed** with this machine's default embedding model (rows are
442
+ partitioned internally by repo) — 239 MB was observed here after indexing a handful of repos.
443
+ `codeintel reset <repo>` clears that repo's rows but does not shrink the file (SQLite doesn't
444
+ reclaim space without a `VACUUM`); `codeintel reset --all` removes the file outright. Separately,
445
+ the **LSP** engine's backend (serena) writes a `.serena/` directory *into each project you index*
446
+ — add it to that project's `.gitignore` (codeintel's own repo does).
430
447
 
431
448
  ## For agents
432
449
 
@@ -547,6 +564,16 @@ engines safe-null and you get a fraction of the capability table above. `codeint
547
564
  installs what it can and `codeintel doctor` tells you exactly what is missing and how to fix it.
548
565
  Run `doctor` first if the tool seems quieter than the docs suggest.
549
566
 
567
+ **The graph backend is the closest competitor, and it should be named as one.**
568
+ `codebase-memory-mcp` already ships semantic vector search, hybrid LSP type resolution, impact
569
+ analysis, and auto-registration with several agents on its own. A user who installs it alone gets
570
+ most of this project's capability table with less setup. The marginal value of codeintel over its
571
+ own backend is the unification, the safe-null contract, and the LSP merge — one call across three
572
+ engines instead of three separate tools to learn, a never-raise contract enforced by
573
+ fault-injection tests rather than convention, and answers that merge graph structure with exact
574
+ LSP locations instead of picking one. That's real and defensible, and considerably narrower than
575
+ "three engines" makes it sound.
576
+
550
577
  **Maintenance.** One maintainer, MIT licensed, issues and PRs welcome. There is no support
551
578
  guarantee — factor that into anything load-bearing.
552
579
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecortex
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Summary: Local-first, MCP-native code-intelligence server — graph, LSP, and semantic search behind one safe code.query tool for coding agents.
5
5
  Author: Shammai Hamilton
6
6
  License-Expression: MIT
@@ -61,7 +61,7 @@ Prefer plain text? `codeintel map` writes a **readable architecture overview** t
61
61
 
62
62
  **What `CODE_INTEL.md` is for.** It's a *static, committable* snapshot of a codebase's shape — meant to be read (by a person or an agent) **first**, instead of reconstructing structure by grepping. It covers the cases the live `code.query` tool doesn't:
63
63
 
64
- - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a pointer into `CLAUDE.md` / `AGENTS.md`, so an agent picks up the codebase's structure automatically at the start of a session.
64
+ - **Agents & hosts that don't speak MCP.** Not every agent supports MCP, and the server isn't always running. `codeintel map` writes a plain file any agent can read; `codeintel map --inject` also drops a short, tool-naming pointer block into `AGENTS.md` (the cross-tool surface read by Codex, Cursor, Zed, and others — created with your consent if it doesn't exist yet) plus a one-line `@AGENTS.md` import into `CLAUDE.md`, and writes the fuller [`USING_CODEINTEL.md`](USING_CODEINTEL.md) guide the block points to — so an agent knows to reach for `code.query` before it reaches for grep, not just that a `CODE_INTEL.md` exists.
65
65
  - **A committed, diffable overview.** It lives *in the repo* — reviewable in a PR, browsable on GitHub, available offline. Re-run `codeintel map` after `codeintel index` to refresh it.
66
66
  - **The load-bearing code at a glance.** Ranking symbols by caller count surfaces what most of the codebase depends on (the risky-to-change core) plus the entry points — the first things a newcomer, or an agent, should understand before touching anything.
67
67
 
@@ -78,6 +78,8 @@ Without structural tools, an agent dropped into unfamiliar code falls back on `g
78
78
 
79
79
  Net effect: fewer, sharper tool calls, less re-reading, and an agent that can see *structure* — callers, impact, call chains — that plain search can't.
80
80
 
81
+ **The honest framing.** Agentic grep is still the backbone, and codeintel doesn't claim otherwise — Claude Code itself ships grep-only and that is a reasonable default for most of what an agent reads. The defensible claim is narrower: a structural index *where it pays*, degrading to grep the moment an engine is missing or not indexed, which is exactly what the safe-null contract above already does under the hood. Worth saying explicitly rather than leaving it implicit in a failure mode.
82
+
81
83
  ## What your agent can ask
82
84
 
83
85
  It's one call: `code.query(op, target, engine="auto")`. In `auto` mode (the default) codeintel picks the engine per operation:
@@ -279,7 +281,7 @@ Then it launches the exact command it registered and drives a real MCP handshake
279
281
  ```text
280
282
  v claude: registered at /Users/you/.claude.json
281
283
 
282
- v verified: codeintel 0.19.0 — 4 tools (code.query, code.status, code.doctor, code.map)
284
+ v verified: codeintel 0.20.0 — 4 tools (code.query, code.status, code.doctor, code.map)
283
285
  ```
284
286
 
285
287
  If the command is not on `PATH`, or the server fails to start, install says so and exits non-zero
@@ -463,7 +465,22 @@ Config is **validated on load** — an out-of-range number, a misspelled enum, o
463
465
 
464
466
  Not sure what's installed? `codeintel doctor` reports exactly which backends are present, whether this repo is indexed, and the command to fix each gap.
465
467
 
466
- **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5` weights once (cached under `~/.cache`, fully offline thereafter); the optional backends also install on first use *if you opt in*. After that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on a private repo.
468
+ **The only network touch is first-run setup:** `fastembed` downloads the `BAAI/bge-small-en-v1.5`
469
+ weights once — cached under `fastembed`'s own default (`$TMPDIR/fastembed_cache`, **not**
470
+ `~/.cache`; override with `FASTEMBED_CACHE_PATH` for a location that survives a `/tmp` cleanup),
471
+ fully offline thereafter; the optional backends also install on first use *if you opt in*. After
472
+ that, **no code or data leaves your machine** — which is what makes `--engine all` safe to run on
473
+ a private repo. Behind a proxy or fully air-gapped, this download is the one step that can fail —
474
+ see [Offline / air-gapped install](docs/install.md#offline--air-gapped-install) for a documented
475
+ workaround.
476
+
477
+ **What codeintel writes to disk.** `~/.codeintel/semantic.db` is a **single file shared across
478
+ every repo you've ever indexed** with this machine's default embedding model (rows are
479
+ partitioned internally by repo) — 239 MB was observed here after indexing a handful of repos.
480
+ `codeintel reset <repo>` clears that repo's rows but does not shrink the file (SQLite doesn't
481
+ reclaim space without a `VACUUM`); `codeintel reset --all` removes the file outright. Separately,
482
+ the **LSP** engine's backend (serena) writes a `.serena/` directory *into each project you index*
483
+ — add it to that project's `.gitignore` (codeintel's own repo does).
467
484
 
468
485
  ## For agents
469
486
 
@@ -584,6 +601,16 @@ engines safe-null and you get a fraction of the capability table above. `codeint
584
601
  installs what it can and `codeintel doctor` tells you exactly what is missing and how to fix it.
585
602
  Run `doctor` first if the tool seems quieter than the docs suggest.
586
603
 
604
+ **The graph backend is the closest competitor, and it should be named as one.**
605
+ `codebase-memory-mcp` already ships semantic vector search, hybrid LSP type resolution, impact
606
+ analysis, and auto-registration with several agents on its own. A user who installs it alone gets
607
+ most of this project's capability table with less setup. The marginal value of codeintel over its
608
+ own backend is the unification, the safe-null contract, and the LSP merge — one call across three
609
+ engines instead of three separate tools to learn, a never-raise contract enforced by
610
+ fault-injection tests rather than convention, and answers that merge graph structure with exact
611
+ LSP locations instead of picking one. That's real and defensible, and considerably narrower than
612
+ "three engines" makes it sound.
613
+
587
614
  **Maintenance.** One maintainer, MIT licensed, issues and PRs welcome. There is no support
588
615
  guarantee — factor that into anything load-bearing.
589
616
 
@@ -36,6 +36,7 @@ src/codeintel/policy.py
36
36
  src/codeintel/progress.py
37
37
  src/codeintel/provider.py
38
38
  src/codeintel/py.typed
39
+ src/codeintel/query_ops.py
39
40
  src/codeintel/redact.py
40
41
  src/codeintel/reindexer.py
41
42
  src/codeintel/reset.py
@@ -77,6 +78,8 @@ tests/test_cache.py
77
78
  tests/test_chunking.py
78
79
  tests/test_cli_commands.py
79
80
  tests/test_cli_help.py
81
+ tests/test_cli_install_dry_run.py
82
+ tests/test_cli_install_offer_injection.py
80
83
  tests/test_cold_process.py
81
84
  tests/test_config.py
82
85
  tests/test_corpus.py
@@ -84,6 +87,7 @@ tests/test_docs_ci_claims.py
84
87
  tests/test_docs_deadcode_withdrawal.py
85
88
  tests/test_doctor.py
86
89
  tests/test_e2e.py
90
+ tests/test_edge_confidence.py
87
91
  tests/test_engine_adoption.py
88
92
  tests/test_enterprise.py
89
93
  tests/test_gateway.py
@@ -101,6 +105,7 @@ tests/test_indexer_binary.py
101
105
  tests/test_installer.py
102
106
  tests/test_integration.py
103
107
  tests/test_loc_census.py
108
+ tests/test_lsp_language_coverage.py
104
109
  tests/test_lsp_provider.py
105
110
  tests/test_lsp_real.py
106
111
  tests/test_mapper.py
@@ -108,6 +113,7 @@ tests/test_mcp_handshake.py
108
113
  tests/test_mcp_server.py
109
114
  tests/test_model_dimension.py
110
115
  tests/test_never_raise.py
116
+ tests/test_null_reason_and_ripple.py
111
117
  tests/test_onboarding.py
112
118
  tests/test_rbac.py
113
119
  tests/test_redaction_boundary.py
@@ -0,0 +1 @@
1
+ __version__ = "0.20.0"