codebase-index 1.7.0__tar.gz → 1.8.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 (326) hide show
  1. codebase_index-1.8.0/.claude/skills/codebase-index/.skill_version +1 -0
  2. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude-plugin/plugin.json +1 -1
  3. codebase_index-1.8.0/.codex/skills/codebase-index/.skill_version +1 -0
  4. codebase_index-1.8.0/.opencode/skills/codebase-index/.skill_version +1 -0
  5. {codebase_index-1.7.0 → codebase_index-1.8.0}/CHANGELOG.md +22 -1
  6. {codebase_index-1.7.0 → codebase_index-1.8.0}/PKG-INFO +4 -2
  7. {codebase_index-1.7.0 → codebase_index-1.8.0}/README.md +3 -1
  8. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/ARCHITECTURE.md +1 -1
  9. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/FAQ.md +6 -5
  10. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/INSTALLATION.md +3 -3
  11. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/RETRIEVAL.md +33 -17
  12. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/RETRIEVAL_PIPELINE.md +58 -35
  13. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/SEO.md +2 -2
  14. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/installer.md +2 -3
  15. {codebase_index-1.7.0 → codebase_index-1.8.0}/pyproject.toml +1 -1
  16. {codebase_index-1.7.0 → codebase_index-1.8.0}/requirements.lock +1 -1
  17. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/__init__.py +1 -1
  18. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/expand.py +123 -13
  19. codebase_index-1.8.0/src/codebase_index/graph/retrieval.py +456 -0
  20. codebase_index-1.8.0/src/codebase_index/retrieval/diversity.py +289 -0
  21. codebase_index-1.8.0/src/codebase_index/retrieval/fuzzy.py +278 -0
  22. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/intent.py +1 -1
  23. codebase_index-1.8.0/src/codebase_index/retrieval/lexical.py +409 -0
  24. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/pipeline.py +62 -18
  25. codebase_index-1.8.0/src/codebase_index/retrieval/priors.py +211 -0
  26. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/rerank.py +15 -1
  27. codebase_index-1.8.0/src/codebase_index/retrieval/searchers.py +551 -0
  28. codebase_index-1.8.0/src/codebase_index/retrieval/tuning.py +106 -0
  29. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/storage/repo.py +7 -3
  30. codebase_index-1.8.0/tests/eval/__init__.py +1 -0
  31. codebase_index-1.8.0/tests/eval/harness.py +257 -0
  32. codebase_index-1.8.0/tests/eval/metrics.py +129 -0
  33. codebase_index-1.8.0/tests/eval/queries/self_repo.yml +204 -0
  34. codebase_index-1.8.0/tests/eval/run_eval.py +104 -0
  35. codebase_index-1.8.0/tests/golden/explain_auth.json +54 -0
  36. codebase_index-1.8.0/tests/golden/mcp_explain_code.json +56 -0
  37. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_search_code.json +4 -4
  38. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/search_token.json +4 -4
  39. codebase_index-1.8.0/tests/test_diversity.py +49 -0
  40. codebase_index-1.8.0/tests/test_fuzzy.py +42 -0
  41. codebase_index-1.8.0/tests/test_graph_retrieval.py +100 -0
  42. codebase_index-1.8.0/tests/test_impact_decay.py +110 -0
  43. codebase_index-1.8.0/tests/test_lexical.py +66 -0
  44. codebase_index-1.8.0/tests/test_priors.py +74 -0
  45. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_search_cli.py +13 -0
  46. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_symbol_ranking.py +109 -12
  47. codebase_index-1.7.0/.claude/skills/codebase-index/.skill_version +0 -1
  48. codebase_index-1.7.0/.codex/skills/codebase-index/.skill_version +0 -1
  49. codebase_index-1.7.0/.opencode/skills/codebase-index/.skill_version +0 -1
  50. codebase_index-1.7.0/src/codebase_index/retrieval/searchers.py +0 -291
  51. codebase_index-1.7.0/tests/golden/explain_auth.json +0 -21
  52. codebase_index-1.7.0/tests/golden/mcp_explain_code.json +0 -23
  53. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/SKILL.md +0 -0
  54. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/examples/hooks/settings.json +0 -0
  55. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/references/commands.md +0 -0
  56. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/references/response-contract.md +0 -0
  57. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/scripts/cbx +0 -0
  58. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude/skills/codebase-index/scripts/cbx.ps1 +0 -0
  59. {codebase_index-1.7.0 → codebase_index-1.8.0}/.claude-plugin/marketplace.json +0 -0
  60. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/SKILL.md +0 -0
  61. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/examples/hooks/settings.json +0 -0
  62. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/references/commands.md +0 -0
  63. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/references/response-contract.md +0 -0
  64. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/scripts/cbx +0 -0
  65. {codebase_index-1.7.0 → codebase_index-1.8.0}/.codex/skills/codebase-index/scripts/cbx.ps1 +0 -0
  66. {codebase_index-1.7.0 → codebase_index-1.8.0}/.editorconfig +0 -0
  67. {codebase_index-1.7.0 → codebase_index-1.8.0}/.gitattributes +0 -0
  68. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/FUNDING.yml +0 -0
  69. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  70. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  71. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/ISSUE_TEMPLATE/skill_listing_request.yml +0 -0
  72. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  73. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/workflows/ci.yml +0 -0
  74. {codebase_index-1.7.0 → codebase_index-1.8.0}/.github/workflows/release.yml +0 -0
  75. {codebase_index-1.7.0 → codebase_index-1.8.0}/.gitignore +0 -0
  76. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/agents/codebase-index.md +0 -0
  77. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/commands/codebase-index.md +0 -0
  78. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/SKILL.md +0 -0
  79. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/examples/hooks/settings.json +0 -0
  80. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/references/commands.md +0 -0
  81. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/references/response-contract.md +0 -0
  82. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/scripts/cbx +0 -0
  83. {codebase_index-1.7.0 → codebase_index-1.8.0}/.opencode/skills/codebase-index/scripts/cbx.ps1 +0 -0
  84. {codebase_index-1.7.0 → codebase_index-1.8.0}/AGENTS.md +0 -0
  85. {codebase_index-1.7.0 → codebase_index-1.8.0}/CODE_OF_CONDUCT.md +0 -0
  86. {codebase_index-1.7.0 → codebase_index-1.8.0}/CONTRIBUTING.md +0 -0
  87. {codebase_index-1.7.0 → codebase_index-1.8.0}/LICENSE +0 -0
  88. {codebase_index-1.7.0 → codebase_index-1.8.0}/ROADMAP.md +0 -0
  89. {codebase_index-1.7.0 → codebase_index-1.8.0}/SECURITY.md +0 -0
  90. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/claude.ps1 +0 -0
  91. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/claude.sh +0 -0
  92. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/codex.ps1 +0 -0
  93. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/codex.sh +0 -0
  94. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/opencode.ps1 +0 -0
  95. {codebase_index-1.7.0 → codebase_index-1.8.0}/adapters/opencode.sh +0 -0
  96. {codebase_index-1.7.0 → codebase_index-1.8.0}/assets/demo.png +0 -0
  97. {codebase_index-1.7.0 → codebase_index-1.8.0}/assets/mark.png +0 -0
  98. {codebase_index-1.7.0 → codebase_index-1.8.0}/assets/social-preview.png +0 -0
  99. {codebase_index-1.7.0 → codebase_index-1.8.0}/bin/cbx +0 -0
  100. {codebase_index-1.7.0 → codebase_index-1.8.0}/bin/cbx.ps1 +0 -0
  101. {codebase_index-1.7.0 → codebase_index-1.8.0}/bin/codebase-index +0 -0
  102. {codebase_index-1.7.0 → codebase_index-1.8.0}/bin/codebase-index.ps1 +0 -0
  103. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/BENCHMARKS.md +0 -0
  104. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/COMPARISON.md +0 -0
  105. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/DATABASE_SCHEMA.md +0 -0
  106. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/LANGUAGES.md +0 -0
  107. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/MCP.md +0 -0
  108. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/PRODUCT_UPGRADE_PLAN.md +0 -0
  109. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/QUICKSTART.md +0 -0
  110. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/RELEASE_CHECKLIST.md +0 -0
  111. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/ROADMAP.md +0 -0
  112. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/SCHEMA.md +0 -0
  113. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/SECURITY.md +0 -0
  114. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/SECURITY_MODEL.md +0 -0
  115. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/SKILL_DESIGN.md +0 -0
  116. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-benchmark-index-improvements.md +0 -0
  117. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-generalize-skill-research-discipline.md +0 -0
  118. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m1-storage-discovery.md +0 -0
  119. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m2-fts-lexical.md +0 -0
  120. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m3-treesitter-symbols.md +0 -0
  121. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m4-hybrid-search.md +0 -0
  122. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m5-graph-impact.md +0 -0
  123. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m6-embeddings-vector.md +0 -0
  124. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m7-5-plugin-one-command-install.md +0 -0
  125. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m7-skill-packaging.md +0 -0
  126. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m8-hooks-watch.md +0 -0
  127. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-m9-release.md +0 -0
  128. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-05-29-multilang-symbols-make-skill-win.md +0 -0
  129. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/plans/2026-06-24-snippet-skeletonization.md +0 -0
  130. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/specs/2026-05-29-plugin-one-command-install-design.md +0 -0
  131. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/specs/2026-06-14-typed-framework-edges-design.md +0 -0
  132. {codebase_index-1.7.0 → codebase_index-1.8.0}/docs/superpowers/specs/2026-06-24-snippet-skeletonization-design.md +0 -0
  133. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/config.example.json +0 -0
  134. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/demo-project/README.md +0 -0
  135. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/hooks/settings.json +0 -0
  136. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/queries.md +0 -0
  137. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/sample-queries.md +0 -0
  138. {codebase_index-1.7.0 → codebase_index-1.8.0}/examples/sample-retrieval-output.md +0 -0
  139. {codebase_index-1.7.0 → codebase_index-1.8.0}/hooks/hooks.json +0 -0
  140. {codebase_index-1.7.0 → codebase_index-1.8.0}/install.ps1 +0 -0
  141. {codebase_index-1.7.0 → codebase_index-1.8.0}/install.sh +0 -0
  142. {codebase_index-1.7.0 → codebase_index-1.8.0}/lib/common.ps1 +0 -0
  143. {codebase_index-1.7.0 → codebase_index-1.8.0}/lib/common.sh +0 -0
  144. {codebase_index-1.7.0 → codebase_index-1.8.0}/scripts/bootstrap.ps1 +0 -0
  145. {codebase_index-1.7.0 → codebase_index-1.8.0}/scripts/bootstrap.sh +0 -0
  146. {codebase_index-1.7.0 → codebase_index-1.8.0}/scripts/gen_assets.py +0 -0
  147. {codebase_index-1.7.0 → codebase_index-1.8.0}/scripts/release_smoke.py +0 -0
  148. {codebase_index-1.7.0 → codebase_index-1.8.0}/scripts/sync_skill_copies.py +0 -0
  149. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/SKILL.md +0 -0
  150. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/examples/basic-usage.md +0 -0
  151. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/examples/claude-md-example.md +0 -0
  152. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/examples/hooks-example.json +0 -0
  153. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/references/commands.md +0 -0
  154. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/references/response-contract.md +0 -0
  155. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/bootstrap.py +0 -0
  156. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/cbx +0 -0
  157. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/cbx.ps1 +0 -0
  158. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/doctor.py +0 -0
  159. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/install.py +0 -0
  160. {codebase_index-1.7.0 → codebase_index-1.8.0}/skill/scripts/smoke_test.py +0 -0
  161. {codebase_index-1.7.0 → codebase_index-1.8.0}/skills/codebase-index/SKILL.md +0 -0
  162. {codebase_index-1.7.0 → codebase_index-1.8.0}/skills/codebase-index/references/commands.md +0 -0
  163. {codebase_index-1.7.0 → codebase_index-1.8.0}/skills/codebase-index/references/response-contract.md +0 -0
  164. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/__main__.py +0 -0
  165. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/cli.py +0 -0
  166. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/config.py +0 -0
  167. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/discovery/__init__.py +0 -0
  168. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/discovery/classify.py +0 -0
  169. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/discovery/ignore.py +0 -0
  170. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/discovery/walker.py +0 -0
  171. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/doctor.py +0 -0
  172. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/embeddings/__init__.py +0 -0
  173. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/embeddings/backend.py +0 -0
  174. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/embeddings/external.py +0 -0
  175. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/embeddings/local.py +0 -0
  176. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/embeddings/noop.py +0 -0
  177. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/__init__.py +0 -0
  178. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/analysis.py +0 -0
  179. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/builder.py +0 -0
  180. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/export.py +0 -0
  181. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/graph/navigate.py +0 -0
  182. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/indexer/__init__.py +0 -0
  183. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/indexer/doc_chunks.py +0 -0
  184. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/indexer/freshness.py +0 -0
  185. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/indexer/pipeline.py +0 -0
  186. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/mcp/__init__.py +0 -0
  187. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/mcp/server.py +0 -0
  188. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/models.py +0 -0
  189. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/output/__init__.py +0 -0
  190. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/output/json.py +0 -0
  191. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/output/markdown.py +0 -0
  192. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/output/redact.py +0 -0
  193. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/__init__.py +0 -0
  194. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/base.py +0 -0
  195. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/languages.py +0 -0
  196. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/line_chunker.py +0 -0
  197. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/symbol_chunks.py +0 -0
  198. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/parsers/treesitter.py +0 -0
  199. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/__init__.py +0 -0
  200. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/budget.py +0 -0
  201. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/fusion.py +0 -0
  202. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/skeleton.py +0 -0
  203. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/retrieval/types.py +0 -0
  204. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/scaffold.py +0 -0
  205. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/service.py +0 -0
  206. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/SKILL.md +0 -0
  207. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/examples/hooks/settings.json +0 -0
  208. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/references/commands.md +0 -0
  209. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/references/response-contract.md +0 -0
  210. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/scripts/cbx +0 -0
  211. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_template/scripts/cbx.ps1 +0 -0
  212. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/skill_update.py +0 -0
  213. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/storage/__init__.py +0 -0
  214. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/storage/db.py +0 -0
  215. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/storage/schema.sql +0 -0
  216. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/watch/__init__.py +0 -0
  217. {codebase_index-1.7.0 → codebase_index-1.8.0}/src/codebase_index/watch/watcher.py +0 -0
  218. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/__init__.py +0 -0
  219. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_honest.py +0 -0
  220. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_honest_RESULTS.md +0 -0
  221. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_honest_newtowny.txt +0 -0
  222. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_public.py +0 -0
  223. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_public_RESULTS.md +0 -0
  224. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/benchmark_real_repo.py +0 -0
  225. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/conftest.py +0 -0
  226. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/README.md +0 -0
  227. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/expected_answers.yml +0 -0
  228. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/multilang/sample.go +0 -0
  229. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/multilang/sample.java +0 -0
  230. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/multilang/sample.rs +0 -0
  231. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/.env +0 -0
  232. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/.gitignore +0 -0
  233. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/huge.json +0 -0
  234. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/logo.png +0 -0
  235. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/node_modules/leftpad/index.js +0 -0
  236. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/secrets.pem +0 -0
  237. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/src/api/service.py +0 -0
  238. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/src/auth/token.py +0 -0
  239. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/src/models/user.py +0 -0
  240. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/src/schema.generated.ts +0 -0
  241. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/fixtures/sample_repo/web/app.ts +0 -0
  242. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/architecture.json +0 -0
  243. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/describe_refresh.json +0 -0
  244. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/impact_user_model.json +9 -9
  245. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_architecture.json +0 -0
  246. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_describe_symbol.json +0 -0
  247. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_find_refs.json +0 -0
  248. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_find_symbol.json +0 -0
  249. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_healthcheck.json +0 -0
  250. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_impact_of.json +9 -9
  251. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_impact_of_diff.json +0 -0
  252. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_index_stats.json +0 -0
  253. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/mcp_path_between.json +0 -0
  254. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/path_renew_to_token.json +0 -0
  255. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/refs_refresh_access_token.json +0 -0
  256. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/stats.json +0 -0
  257. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden/symbol_user.json +0 -0
  258. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/golden_utils.py +0 -0
  259. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/installer/smoke.ps1 +0 -0
  260. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/installer/smoke.sh +0 -0
  261. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_analysis.py +0 -0
  262. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_benchmark_comparison.py +0 -0
  263. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_bootstrap.py +0 -0
  264. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_budget.py +0 -0
  265. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_chunker.py +0 -0
  266. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_classify.py +0 -0
  267. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_clean_cli.py +0 -0
  268. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_cli.py +0 -0
  269. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_cli_golden.py +0 -0
  270. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_config.py +0 -0
  271. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_diff_impact.py +0 -0
  272. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_discovery.py +0 -0
  273. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_doc_chunks.py +0 -0
  274. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_doctor.py +0 -0
  275. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_embeddings_backend.py +0 -0
  276. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_embeddings_external.py +0 -0
  277. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_embeddings_local.py +0 -0
  278. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_freshness.py +0 -0
  279. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_fusion.py +0 -0
  280. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_graph.py +0 -0
  281. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_graph_coverage.py +0 -0
  282. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_graph_export_cli.py +0 -0
  283. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_hooks_merge.py +0 -0
  284. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_hybrid_ranking.py +0 -0
  285. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_ignore.py +0 -0
  286. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_impact_cli.py +0 -0
  287. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_index_cli.py +0 -0
  288. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_init_cli.py +0 -0
  289. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_intent.py +0 -0
  290. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_languages.py +0 -0
  291. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_mcp_golden.py +0 -0
  292. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_mcp_server.py +0 -0
  293. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_multilang_symbols.py +0 -0
  294. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_navigate.py +0 -0
  295. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_output.py +0 -0
  296. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_packaging.py +0 -0
  297. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_parse_guardrails.py +0 -0
  298. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_perf_smoke.py +0 -0
  299. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_pipeline.py +0 -0
  300. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_pipeline_search.py +0 -0
  301. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_pipeline_vectors.py +0 -0
  302. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_plugin_manifest.py +0 -0
  303. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_plugin_skill_parity.py +0 -0
  304. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_plugin_wrappers.py +0 -0
  305. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_public_benchmark.py +0 -0
  306. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_quality_benchmark.py +0 -0
  307. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_redact.py +0 -0
  308. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_repo_search.py +0 -0
  309. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_rerank.py +0 -0
  310. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_retrieval_types.py +0 -0
  311. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_scaffold.py +0 -0
  312. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_searchers.py +0 -0
  313. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_seeded_index.py +0 -0
  314. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_service.py +0 -0
  315. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_skeleton.py +0 -0
  316. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_skill_update.py +0 -0
  317. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_storage.py +0 -0
  318. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_symbol_cli.py +0 -0
  319. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_symbol_refs.py +0 -0
  320. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_sync_skill_copies.py +0 -0
  321. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_treesitter.py +0 -0
  322. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_update.py +0 -0
  323. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_update_cli.py +0 -0
  324. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_vector_search.py +0 -0
  325. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_vectors_storage.py +0 -0
  326. {codebase_index-1.7.0 → codebase_index-1.8.0}/tests/test_watcher.py +0 -0
@@ -3,7 +3,7 @@
3
3
  "name": "codebase-index",
4
4
  "displayName": "Codebase Index",
5
5
  "description": "Give Claude a precise local map of your codebase: find implementations, trace behavior, and predict change impact with file-line evidence.",
6
- "version": "1.7.0",
6
+ "version": "1.8.0",
7
7
  "author": {
8
8
  "name": "codebase-index contributors"
9
9
  },
@@ -6,6 +6,26 @@ All notable changes to this project are documented here. The format is based on
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.8.0] - 2026-09-02
10
+
11
+ ### Added
12
+
13
+ - **Reproducible retrieval evaluation.** Added a self-repository ground-truth
14
+ query suite with Recall@K, MRR, nDCG, hit rate, precision, MAP, useful-context,
15
+ latency percentiles, and one-signal ablations.
16
+
17
+ ### Changed
18
+
19
+ - **Hybrid retrieval quality.** Natural-language lexical queries now use safe,
20
+ down-weighted identifier/synonym expansion and soft term coverage; exact symbol
21
+ lookup preserves framing-word tolerance and bounded fuzzy matching.
22
+ - **Packaging compatibility.** Cap the build backend below the Metadata 2.5
23
+ default until the release validation toolchain supports that metadata version.
24
+ - **Ranking defaults are evidence-driven.** Implementation/test/documentation
25
+ source priors are calibrated from the benchmark. Graph propagation is bounded
26
+ and intent-directed; graph and MMR signals remain opt-in because ablations
27
+ reduced direct retrieval quality on the reproducible corpus.
28
+
9
29
  ## [1.7.0] - 2026-07-29
10
30
 
11
31
  ### Added
@@ -401,7 +421,8 @@ All notable changes to this project are documented here. The format is based on
401
421
  - Hooks example + `watch` mode for keeping the index fresh without blocking the edit loop (M8).
402
422
  - `doctor`, `stats`, `clean` diagnostics/maintenance commands.
403
423
 
404
- [Unreleased]: https://github.com/denfry/codebase-index/compare/v1.7.0...HEAD
424
+ [Unreleased]: https://github.com/denfry/codebase-index/compare/v1.8.0...HEAD
425
+ [1.8.0]: https://github.com/denfry/codebase-index/compare/v1.7.0...v1.8.0
405
426
  [1.7.0]: https://github.com/denfry/codebase-index/compare/v1.6.0...v1.7.0
406
427
  [1.6.0]: https://github.com/denfry/codebase-index/compare/v1.5.0...v1.6.0
407
428
  [1.5.0]: https://github.com/denfry/codebase-index/compare/v1.4.0...v1.5.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebase-index
3
- Version: 1.7.0
3
+ Version: 1.8.0
4
4
  Summary: A precise local codebase map for AI coding agents: find, trace, and predict with file-line evidence.
5
5
  Project-URL: Homepage, https://github.com/denfry/codebase-index
6
6
  Project-URL: Documentation, https://github.com/denfry/codebase-index/tree/main/docs
@@ -321,7 +321,7 @@ See [MCP.md](docs/MCP.md) for client configuration.
321
321
 
322
322
  ## Project status
323
323
 
324
- The latest released line is **1.7.0**. It includes:
324
+ The latest released line is **1.8.0**. It includes:
325
325
 
326
326
  - hybrid and optional vector retrieval;
327
327
  - Tree-sitter symbol extraction across the documented language tiers;
@@ -329,6 +329,8 @@ The latest released line is **1.7.0**. It includes:
329
329
  - architecture communities, central nodes, and surprising cross-module links;
330
330
  - shortest dependency paths and node descriptions;
331
331
  - token-budgeted and skeletonized retrieval packets;
332
+ - benchmark-calibrated lexical expansion, fuzzy identifier matching, and source-aware ranking;
333
+ - bounded, intent-directed graph discovery with optional diversity and duplicate suppression;
332
334
  - CLI, Skill, plugin, and MCP delivery;
333
335
  - incremental updates, watch hooks, diagnostics, skill rollback, and diff-aware
334
336
  impact analysis.
@@ -271,7 +271,7 @@ See [MCP.md](docs/MCP.md) for client configuration.
271
271
 
272
272
  ## Project status
273
273
 
274
- The latest released line is **1.7.0**. It includes:
274
+ The latest released line is **1.8.0**. It includes:
275
275
 
276
276
  - hybrid and optional vector retrieval;
277
277
  - Tree-sitter symbol extraction across the documented language tiers;
@@ -279,6 +279,8 @@ The latest released line is **1.7.0**. It includes:
279
279
  - architecture communities, central nodes, and surprising cross-module links;
280
280
  - shortest dependency paths and node descriptions;
281
281
  - token-budgeted and skeletonized retrieval packets;
282
+ - benchmark-calibrated lexical expansion, fuzzy identifier matching, and source-aware ranking;
283
+ - bounded, intent-directed graph discovery with optional diversity and duplicate suppression;
282
284
  - CLI, Skill, plugin, and MCP delivery;
283
285
  - incremental updates, watch hooks, diagnostics, skill rollback, and diff-aware
284
286
  impact analysis.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 1. Overview
4
4
 
5
- `codebase-index` is a **local-first** code intelligence layer for AI coding agents. In `1.7.0`
5
+ `codebase-index` is a **local-first** code intelligence layer for AI coding agents. In `1.8.0`
6
6
  it has two shipped faces:
7
7
 
8
8
  1. **A Claude Code Skill** (`.claude/skills/codebase-index/SKILL.md`) that Claude auto-invokes for
@@ -14,7 +14,7 @@ pip install codebase-index # or: pipx install codebase-index
14
14
  ```
15
15
 
16
16
  To pin an exact version or grab an unreleased commit, install from a GitHub tag
17
- instead: `pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.7.0"`.
17
+ instead: `pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.8.0"`.
18
18
 
19
19
  Then run `codebase-index init` inside your project and `codebase-index index` to build
20
20
  the first index. In Claude Code you can instead install the plugin
@@ -162,11 +162,12 @@ Yes. Use any of these methods:
162
162
 
163
163
  ## Is it production-ready?
164
164
 
165
- Yes — `codebase-index` is released as **v1.7.0**. The core indexing and search
166
- functionality is implemented and tested. The current `1.7.0` package includes:
165
+ Yes — `codebase-index` is released as **v1.8.0**. The core indexing and search
166
+ functionality is implemented and tested. The current `1.8.0` package includes:
167
167
 
168
- - Hybrid FTS/path/symbol/vector retrieval
169
- - Import/call/reference graph expansion and `impact`
168
+ - Hybrid FTS/path/symbol/vector retrieval with benchmark-calibrated lexical expansion
169
+ and bounded fuzzy identifier matching
170
+ - Import/call/reference graph expansion, intent-directed graph discovery, and `impact`
170
171
  - Diff-aware blast-radius analysis for tracked working-tree changes
171
172
  - Optional local embeddings, with external embeddings gated behind explicit opt-in
172
173
  - Hooks and watch mode for freshness
@@ -67,7 +67,7 @@ pipx install codebase-index # isolated environment
67
67
  uv tool install codebase-index # uv-managed tool
68
68
 
69
69
  # Pin to a GitHub tag for an exact or unreleased version
70
- pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.7.0"
70
+ pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.8.0"
71
71
 
72
72
  # From source (editable mode)
73
73
  git clone https://github.com/denfry/codebase-index.git
@@ -90,7 +90,7 @@ pip install -e ".[embeddings-local,watch,dev]"
90
90
 
91
91
  ### uvx / Homebrew status
92
92
 
93
- As of `1.7.0`, **PyPI is shipped** — `pip install codebase-index` and
93
+ As of `1.8.0`, **PyPI is shipped** — `pip install codebase-index` and
94
94
  `pipx install codebase-index` are the verified paths. `uvx codebase-index init`,
95
95
  Homebrew tap installation, signed checksums, and SBOMs remain distribution
96
96
  targets for a more complete release story.
@@ -130,7 +130,7 @@ Expected output:
130
130
  === codebase-index Doctor ===
131
131
 
132
132
  [OK] Python 3.12 (requires 3.11+)
133
- [OK] codebase-index package installed (v1.7.0)
133
+ [OK] codebase-index package installed (v1.8.0)
134
134
  [OK] tree-sitter is available
135
135
  [INFO] Cache directory not yet created: ...
136
136
  [INFO] Skill not installed in .claude/skills/
@@ -2,7 +2,8 @@
2
2
 
3
3
  The retrieval engine turns a natural-language or symbolic query into a **compact, ranked,
4
4
  token-budgeted** set of file/line ranges for Claude to read. It is hybrid: multiple independent
5
- retrievers run, their results are fused, reranked, expanded via the graph, then trimmed.
5
+ retrievers run, their results are fused and reranked, then trimmed. Graph expansion and MMR are
6
+ available as bounded opt-in signals; the shipped default prioritizes direct evidence.
6
7
 
7
8
  ```
8
9
  query
@@ -21,13 +22,16 @@ query
21
22
  [3] rank fusion ── Reciprocal Rank Fusion (RRF) across retriever result lists
22
23
  │
23
24
  ▼
24
- [4] rerank ── feature-based score (symbol-kind, path proximity, recency, centrality)
25
+ [4] rerank ── feature-based score (symbol-kind, path, source role, centrality)
25
26
  │
26
27
  ▼
27
- [5] graph expansion ── pull in imports/callers/callees per intent (bounded)
28
+ [5] optional graph expansion ── pull in imports/callers/callees per intent (bounded)
28
29
  │
29
30
  ▼
30
- [6] token budgeting ── greedy fill under --token-budget; snippets trimmed + secret-redacted
31
+ [6] diversity / duplicate filtering (MMR opt-in, SimHash duplicate guard)
32
+ │
33
+ ▼
34
+ [7] token budgeting ── greedy fill under --token-budget; snippets trimmed + secret-redacted
31
35
  │
32
36
  ▼
33
37
  ranked results + recommended_reads + fallback_suggestions
@@ -59,10 +63,12 @@ source)` list so fusion is source-agnostic.
59
63
 
60
64
  - **Path** — exact and glob path matches (`src/auth/*.py`, `auth.py`). Highest precision; surfaced
61
65
  first when the query clearly names a path.
62
- - **Symbol** — query against `symbols` (name exact, prefix, then fuzzy/trigram). Carries `kind`
63
- (function/class/method/...) and signature. Primary for `locate_impl` / `find_refs`.
66
+ - **Symbol** — query against `symbols` (exact, identifier parts, bounded fuzzy matching). Carries
67
+ `kind` (function/class/method/...) and signature. Primary for `locate_impl` / `find_refs`.
64
68
  - **FTS** — FTS5 `bm25()` over the `fts_chunks` virtual table (chunk text + symbol names +
65
- summaries indexed). Tokenizer is code-aware (splits camelCase/snake_case). Primary lexical signal.
69
+ summaries indexed). Query-time camelCase/snake_case splitting, small down-weighted synonym
70
+ expansion, and soft coverage scoring make natural-language questions robust without weakening
71
+ exact terms.
66
72
  - **Vector** *(opt-in)* — cosine similarity over chunk embeddings via `sqlite-vec`. Only runs if
67
73
  `embeddings.enabled = true`. Adds semantic recall for paraphrased queries. Absent → pipeline
68
74
  degrades gracefully to FTS+symbol.
@@ -96,19 +102,30 @@ A lightweight, explainable feature score (no external model required) layered on
96
102
  The reranker also produces the human-readable **`reason`** string per result
97
103
  (e.g. *"exact symbol match · called by 4 sites · in src/auth/"*).
98
104
 
99
- ## 5. Graph expansion (`graph/expand.py`)
105
+ ## 5. Graph expansion (`graph/retrieval.py`; `graph/expand.py` for impact APIs)
106
+
107
+ Graph expansion runs only when the tuning enables `graph_source` and the intent plan requests a
108
+ graph strategy. It is disabled by default because the reproducible self-repository ablation
109
+ reduced direct-hit MRR when related nodes displaced lexical hits.
100
110
 
101
- After reranking, pull in *related* nodes per the intent's graph strategy, bounded by `--depth`
102
- (default 1–2) and a node cap:
111
+ When enabled, it is bounded by depth and node cap:
103
112
 
104
113
  - `impact` → walk **up** edges (callers, importers) = blast radius.
105
114
  - `how_it_works` → walk **down** edges (callees, imported defs) = mechanism.
106
- - `find_refs` → direct reverse edges only.
107
- - `data_flow` → both directions along call/assignment edges.
115
+ - `find_refs` → walk **up** edges to callers/importers.
116
+ - `data_flow` → walk **both** directions along call/assignment edges.
117
+
118
+ Expanded nodes retain edge confidence and receive distance-decayed scores so seeds stay on top.
119
+
120
+ ## 6. Diversity and duplicate control
108
121
 
109
- Expanded nodes are merged into results with a discounted score so seeds stay on top.
122
+ `retrieval.diversity` provides bounded MMR selection and SimHash near-duplicate
123
+ suppression. MMR is disabled in the shipped default because the reproducible
124
+ benchmark favored relevance-only ranking; callers that need broader snippet
125
+ coverage can enable `RetrievalTuning(mmr=True)`. Duplicate suppression remains
126
+ available independently.
110
127
 
111
- ## 6. Token budgeting (`retrieval/budget.py`)
128
+ ## 7. Token budgeting (`retrieval/budget.py`)
112
129
 
113
130
  Results are trimmed to fit `--token-budget` (default per intent, e.g. 1500 tokens):
114
131
 
@@ -121,7 +138,7 @@ Results are trimmed to fit `--token-budget` (default per intent, e.g. 1500 token
121
138
 
122
139
  The point: Claude gets enough to decide, and a precise list of what to read next — never a dump.
123
140
 
124
- ## 7. Confidence & fallback
141
+ ## 8. Confidence & fallback
125
142
 
126
143
  A `confidence` score (high/medium/low) is derived from: top RRF score, score gap between #1 and #2,
127
144
  number of agreeing retrievers, and whether a symbol matched exactly.
@@ -131,13 +148,12 @@ number of agreeing retrievers, and whether a symbol matched exactly.
131
148
  - **low** → skill instructs Claude to **fall back** to `ripgrep`/Grep/Glob with suggested patterns
132
149
  emitted in `fallback_suggestions` (derived from query terms + detected symbols).
133
150
 
134
- ## 8. Output payload (shared by Markdown + JSON)
151
+ ## 9. Output payload (shared by Markdown + JSON)
135
152
 
136
153
  ```jsonc
137
154
  {
138
155
  "query": "where is auth token refresh implemented",
139
156
  "intent": "locate_impl",
140
- "index": { "exists": true, "stale": false, "built_at": "...", "head_commit": "abc1234" },
141
157
  "confidence": "high",
142
158
  "results": [
143
159
  {
@@ -18,7 +18,7 @@ Intent detection (keyword / symbol / impact / general)
18
18
  │ 2. Path-based search │
19
19
  │ 3. SQLite FTS5 lexical search │
20
20
  │ 4. Vector search (optional embeddings) │
21
- │ 5. Graph expansion (from seed results) │
21
+ │ 5. Graph expansion (explicit opt-in) │
22
22
  └─────────────────────────────────────────┘
23
23
  ↓
24
24
  Reciprocal Rank Fusion (RRF)
@@ -53,15 +53,16 @@ Ranked retrieval packet with confidence score
53
53
 
54
54
  ## 3. SQLite FTS5 Lexical Search
55
55
 
56
- **Trigger:** General keyword queries.
56
+ **Trigger:** General keyword and natural-language queries.
57
57
 
58
58
  **Process:**
59
- - Build an FTS5 query from the user's text
60
- - Tokenize: split `snake_case`, expand `camelCase` at query time
61
- - Search the `fts_chunks` virtual table
62
- - Return matching chunks with BM25-style scores
59
+ - Parse identifiers into camelCase/PascalCase/snake_case subtokens.
60
+ - Add a small, explicit synonym/inflection vocabulary at lower weight.
61
+ - Use OR groups for soft matching, then require bounded term coverage and rank
62
+ by original-term coverage plus BM25.
63
+ - Quote every FTS term so query punctuation cannot inject MATCH operators.
63
64
 
64
- **Score:** Based on FTS5 rank — higher for more term matches and rarer terms.
65
+ **Score:** Coverage is the primary signal; BM25 is a bounded tie-break.
65
66
 
66
67
  ## 4. Vector Search (Optional)
67
68
 
@@ -80,52 +81,74 @@ Ranked retrieval packet with confidence score
80
81
 
81
82
  ## 5. Graph Expansion
82
83
 
83
- **Trigger:** After initial results are found.
84
+ **Trigger:** `RetrievalTuning(graph_source=True)` and an intent plan with a
85
+ graph strategy. It is disabled in the shipped default because the reproducible
86
+ self-repository ablation reduced direct-hit MRR.
84
87
 
85
88
  **Process:**
86
- - For each seed result, traverse the dependency/call graph
87
- - Find related files: callers, callees, imports, inheritors
88
- - Add related files with a decay factor (distance from seed)
89
+ - Seed from lexical/symbol candidates already found in SQLite.
90
+ - Traverse only indexed, resolved edges with bounded depth and node count.
91
+ - Follow `up` (callers/importers), `down` (callees/imports), or `both`
92
+ according to the intent plan.
93
+ - Apply distance decay and preserve edge confidence in the candidate reason.
89
94
 
90
- **Score:** Decreases with graph distance — direct connections score higher.
95
+ Graph expansion is an opt-in context-discovery signal, not a replacement for
96
+ direct lexical or symbol evidence.
91
97
 
92
- ## Reciprocal Rank Fusion (RRF)
98
+ ## 6. Diversity and duplicate control
93
99
 
94
- Combines results from multiple retrievers:
100
+ SimHash suppresses near-duplicate snippets independently of MMR. Bounded
101
+ Maximal Marginal Relevance is available through `RetrievalTuning(mmr=True)`;
102
+ the shipped default keeps relevance-only ordering because the benchmark favored
103
+ direct hits.
104
+
105
+ ## 7. Reciprocal Rank Fusion (RRF)
106
+
107
+ Combines ranked lists from the enabled retrievers:
95
108
 
96
109
  ```
97
- RRF_score(d) = Σ (1 / (k + rank_r(d)))
110
+ RRF_score(d) = Σ w_r · k / (k + rank_r(d))
98
111
  ```
99
112
 
113
+ The implementation multiplies textbook RRF by `k` so fusion and bounded rerank
114
+ bonuses share a comparable scale; ordering is unchanged.
115
+
100
116
  Where:
101
117
  - `k` is a constant (default 60)
102
118
  - `rank_r(d)` is the rank of document `d` in retriever `r`
103
- - Sum is over all retrievers that returned `d`
119
+ - `w_r` is the intent/tuning weight for retriever `r`
104
120
 
105
- This ensures documents that appear in multiple retrievers rank higher.
121
+ The implementation merges co-located chunks into one per-file bucket before
122
+ fusion, preventing a large file from dominating the result list.
106
123
 
107
- ## Reranking
124
+ ## 8. Reranking
108
125
 
109
- After fusion, apply additional boosts:
126
+ After fusion, apply bounded explainable boosts and penalties:
110
127
 
111
- | Factor | Boost | Rationale |
112
- |---|---|---|
113
- | Exact symbol match | +0.3 | User named a specific symbol |
114
- | File type relevance | +0.1 | `.ts` for TypeScript queries, etc. |
115
- | Recency | +0.05 | Recently modified files may be more relevant |
116
- | File size | -0.05 per 10KB | Prefer focused files over large ones |
128
+ | Factor | Effect | Rationale |
129
+ |---|---:|---|
130
+ | Exact symbol match | +0.20 | User named a specific symbol |
131
+ | Symbol definition kind | +0.05 | Prefer actionable definitions |
132
+ | Path term match | +0.05 | User supplied a location clue |
133
+ | Degree / reference evidence | up to +0.08 | Stable structural tiebreaker |
134
+ | Implementation source prior | +0.08 | Prefer source over prose/tests |
135
+ | Documentation source prior | -0.05 | Avoid docs displacing implementation |
136
+ | Generated/vendor/build | -0.12 | Suppress low-value derived code |
137
+ | Test path on non-test query | -0.06 | Keep tests as supporting evidence |
117
138
 
118
- ## Confidence Score
139
+ ## 9. Confidence
119
140
 
120
- The final confidence score (0.0 to 1.0) determines how Claude should proceed:
141
+ Confidence is categorical (`high`, `medium`, `low`) and is derived from
142
+ exact-symbol evidence, multi-retriever agreement, score separation, and result
143
+ count. Exact symbol matches are `high`, including a single-result response.
121
144
 
122
- | Confidence | Meaning | Action |
123
- |---|---|---|
124
- | 0.8 - 1.0 | High | Read recommended ranges and answer directly |
125
- | 0.5 - 0.8 | Medium | Read ranges; optionally confirm with one Grep |
126
- | 0.0 - 0.5 | Low | Use fallback suggestions (ripgrep, Glob) |
145
+ | Confidence | Action |
146
+ |---|---|
147
+ | `high` | Read recommended ranges and answer directly |
148
+ | `medium` | Read ranges; optionally confirm with one Grep |
149
+ | `low` | Use fallback suggestions (ripgrep, Glob) |
127
150
 
128
- ## Token Budget Enforcement
151
+ ## 10. Token Budget Enforcement
129
152
 
130
153
  The output is capped at a configurable token budget:
131
154
 
@@ -134,9 +157,9 @@ The output is capped at a configurable token budget:
134
157
  3. Remaining results are listed without snippets
135
158
  4. The `recommended_reads` field contains only the most critical line ranges
136
159
 
137
- Default budget: 2000 tokens (configurable in `.codeindex.json`).
160
+ Default budget: 1500 tokens (configurable in `.codeindex.json`).
138
161
 
139
- ## Fallback Suggestions
162
+ ## 11. Fallback Suggestions
140
163
 
141
164
  When confidence is low, the pipeline generates fallback strategies:
142
165
 
@@ -177,7 +177,7 @@ Features:
177
177
  - Secret redaction
178
178
  - Respects .gitignore
179
179
 
180
- Install: pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.7.0"
180
+ Install: pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.8.0"
181
181
  GitHub: https://github.com/denfry/codebase-index
182
182
  ```
183
183
 
@@ -192,5 +192,5 @@ codebase-index builds a local hybrid index so Claude finds the right files witho
192
192
  - No network by default
193
193
  - Token-efficient output
194
194
 
195
- pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.7.0"
195
+ pip install "codebase-index @ git+https://github.com/denfry/codebase-index.git@v1.8.0"
196
196
  ```
@@ -108,7 +108,7 @@ pwsh ./install.ps1 -Target claude -InstallDir "D:\skills\codebase-index"
108
108
  **Pinning по ветке/тегу** (воспроизводимость и безопасность):
109
109
 
110
110
  ```sh
111
- sh install.sh --branch v1.7.0
111
+ sh install.sh --branch v1.8.0
112
112
  ```
113
113
 
114
114
  ---
@@ -151,8 +151,7 @@ sh install.sh --branch v1.7.0
151
151
  ```json
152
152
  {
153
153
  "skill_name": "codebase-index",
154
- "version": "1.7.0",
155
- "installed_at": "2026-05-29T12:00:00Z",
154
+ "version": "1.8.0",
156
155
  "target": "claude",
157
156
  "os": "linux",
158
157
  "source_repo": "https://github.com/denfry/codebase-index",
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
2
+ requires = ["hatchling<1.32"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
@@ -1,3 +1,3 @@
1
- codebase-index @ https://github.com/denfry/codebase-index/archive/refs/tags/v1.7.0.tar.gz
1
+ codebase-index @ https://github.com/denfry/codebase-index/archive/refs/tags/v1.8.0.tar.gz
2
2
  tree-sitter==0.25.2
3
3
  tree-sitter-language-pack==1.8.1
@@ -4,4 +4,4 @@ Public surface is intentionally small; the CLI (`codebase_index.cli:app`) is the
4
4
  See docs/ARCHITECTURE.md for the module map.
5
5
  """
6
6
 
7
- __version__ = "1.7.0"
7
+ __version__ = "1.8.0"