codebase-index 2.1.2__tar.gz → 2.1.3__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.
- codebase_index-2.1.3/.claude/skills/codebase-index/.skill_version +1 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude-plugin/plugin.json +1 -1
- codebase_index-2.1.3/.codex/skills/codebase-index/.skill_version +1 -0
- codebase_index-2.1.3/.opencode/skills/codebase-index/.skill_version +1 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/CHANGELOG.md +22 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/PKG-INFO +2 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/README.md +1 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/SCHEMA.md +2 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/installer.md +1 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/hooks/hooks.json +1 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/requirements.lock +1 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/__init__.py +1 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/cli.py +6 -5
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/hooks.py +80 -18
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/scaffold.py +10 -3
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/storage/schema.sql +4 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_hooks_guard.py +74 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_storage.py +29 -0
- codebase_index-2.1.2/.claude/skills/codebase-index/.skill_version +0 -1
- codebase_index-2.1.2/.codex/skills/codebase-index/.skill_version +0 -1
- codebase_index-2.1.2/.opencode/skills/codebase-index/.skill_version +0 -1
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/examples/hooks/settings.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/scripts/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/scripts/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.claude-plugin/marketplace.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/examples/hooks/settings.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/scripts/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/scripts/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.editorconfig +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.gitattributes +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/benchmark_report.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/language_support.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/skill_listing_request.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/SUPPORT.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/labels.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/workflows/ci.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.github/workflows/release.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.gitignore +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/agents/codebase-index.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/commands/codebase-index.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/examples/hooks/settings.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/scripts/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/scripts/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/AGENTS.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/CODE_OF_CONDUCT.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/CONTRIBUTING.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/LICENSE +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/ROADMAP.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/SECURITY.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/claude.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/claude.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/codex.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/codex.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/opencode.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/adapters/opencode.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/assets/architecture.svg +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/assets/benchmark.svg +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/assets/demo-terminal.svg +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/assets/mark.png +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/assets/social-preview.png +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/bin/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/bin/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/bin/codebase-index +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/bin/codebase-index.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/ARCHITECTURE.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/BENCHMARKS.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/COMMUNITY_AUDIT.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/COMMUNITY_LAUNCH.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/COMPARISON.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/DATABASE_SCHEMA.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/DEMO.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/DEVELOPMENT.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/FAQ.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/INSTALLATION.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/LANGUAGES.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/MCP.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/MEMORY.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/PRODUCT_UPGRADE_PLAN.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/QUICKSTART.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/RELEASE_CHECKLIST.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/RETRIEVAL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/RETRIEVAL_PIPELINE.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/ROADMAP.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/SECURITY.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/SECURITY_MODEL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/SKILL_DESIGN.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/demo.tape +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-benchmark-index-improvements.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-generalize-skill-research-discipline.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m1-storage-discovery.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m2-fts-lexical.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m3-treesitter-symbols.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m4-hybrid-search.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m5-graph-impact.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m6-embeddings-vector.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m7-5-plugin-one-command-install.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m7-skill-packaging.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m8-hooks-watch.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-m9-release.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-05-29-multilang-symbols-make-skill-win.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/plans/2026-06-24-snippet-skeletonization.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/specs/2026-05-29-plugin-one-command-install-design.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/specs/2026-06-14-typed-framework-edges-design.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/specs/2026-06-24-snippet-skeletonization-design.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/docs/superpowers/specs/2026-09-10-evidence-memory-design.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/config.example.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/demo/EXPECTED_OUTPUT.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/demo/README.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/demo/run_demo.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/demo/run_demo.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/hooks/settings.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/queries.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/sample-queries.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/examples/sample-retrieval-output.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/install.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/install.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/lib/common.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/lib/common.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/pyproject.toml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/2.0-audit.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/README.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/architecture.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/build_indexes.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/data/.gitignore +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/diagnose_accretion.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/diagnose_calibration.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/diagnose_slots.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/diagnose_structure.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/experiment_memory.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/experiments.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/fit_gate.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/fit_weights.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/hypotheses.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/novelty.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/baselines.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/evalrun.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/memory.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/relations.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/nucleus/search.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/related-work.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/selection.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/research/test_nucleus.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/apply_labels.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/bootstrap.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/bootstrap.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/check_links.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/check_versions.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/gen_assets.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/gen_benchmark_chart.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/gen_terminal_svg.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/release_notes.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/release_smoke.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/scripts/sync_skill_copies.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/examples/basic-usage.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/examples/claude-md-example.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/examples/hooks-example.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/bootstrap.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/doctor.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/install.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skill/scripts/smoke_test.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skills/codebase-index/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skills/codebase-index/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skills/codebase-index/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/skills/codebase-index/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/__main__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/config.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/discovery/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/discovery/classify.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/discovery/gates.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/discovery/ignore.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/discovery/walker.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/doctor.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/embeddings/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/embeddings/backend.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/embeddings/external.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/embeddings/local.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/embeddings/noop.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/analysis.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/builder.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/expand.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/export.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/modules.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/navigate.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/graph/retrieval.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/indexer/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/indexer/doc_chunks.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/indexer/freshness.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/indexer/pipeline.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/mcp/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/mcp/server.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/memory/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/memory/identity.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/memory/session.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/memory/store.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/memory/validate.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/models.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/output/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/output/json.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/output/markdown.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/output/redact.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/base.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/languages.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/line_chunker.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/symbol_chunks.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/parsers/treesitter.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/budget.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/diversity.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/features.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/fusion.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/fuzzy.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/intent.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/lexical.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/pipeline.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/priors.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/rerank.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/searchers.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/skeleton.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/tuning.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/retrieval/types.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/service.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/SKILL.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/examples/hooks/settings.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/references/commands.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/references/memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/references/response-contract.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/scripts/cbx +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_template/scripts/cbx.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/skill_update.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/storage/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/storage/db.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/storage/repo.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/watch/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/src/codebase_index/watch/watcher.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_honest.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_honest_RESULTS.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_honest_newtowny.txt +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_public.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_public_RESULTS.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/benchmark_real_repo.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/conftest.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/README.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/__init__.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/baselines.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/gen_queries.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/harness.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/memory_eval.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/metrics.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/queries/self_repo.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/queries/self_repo_git.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/1.10.0-perf.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/1.10.0-retrieval-8corpus.txt +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-04-public-baselines.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-04-public-baselines.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-14-evidence-memory.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-14-evidence-memory.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-24-agent-pilot.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-24-retrieval-2.1.0.txt +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/results/2026-09-24-terra-nl-queries.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/run_baselines.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/eval/run_eval.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/README.md +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/expected_answers.yml +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/index-1.10.0/index.sqlite +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/multilang/sample.go +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/multilang/sample.java +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/multilang/sample.rs +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/.env +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/.gitignore +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/huge.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/logo.png +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/node_modules/leftpad/index.js +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/secrets.pem +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/src/api/service.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/src/auth/token.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/src/models/user.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/src/schema.generated.ts +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/fixtures/sample_repo/web/app.ts +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/architecture.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/describe_refresh.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/explain_auth.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/impact_user_model.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_architecture.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_describe_symbol.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_explain_code.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_find_refs.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_find_symbol.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_healthcheck.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_impact_of.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_impact_of_diff.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_index_stats.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_path_between.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/mcp_search_code.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/path_renew_to_token.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/refs_refresh_access_token.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/search_token.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/stats.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden/symbol_user.json +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/golden_utils.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/installer/smoke.ps1 +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/installer/smoke.sh +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_agent_ergonomics.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_analysis.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_benchmark_comparison.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_bootstrap.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_budget.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_chunker.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_classify.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_clean_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_cli_golden.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_compact_output.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_config.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_diff_impact.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_discovery.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_diversity.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_doc_chunks.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_doctor.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_embeddings_backend.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_embeddings_external.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_embeddings_local.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_eval_baselines.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_freshness.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_fusion.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_fuzzy.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_gen_queries.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_graph.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_graph_coverage.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_graph_export_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_graph_retrieval.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_hooks_merge.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_hybrid_ranking.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_ignore.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_impact_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_impact_decay.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_index_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_init_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_intent.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_languages.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_lexical.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_mcp_golden.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_mcp_server.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_eval_smoke.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_identity.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_lifecycle.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_session.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_stale_context.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_store.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_surfaces.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_memory_validate.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_migration_1x.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_multilang_symbols.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_navigate.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_output.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_packaging.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_parse_guardrails.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_perf_smoke.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_pipeline.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_pipeline_search.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_pipeline_vectors.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_plugin_manifest.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_plugin_skill_parity.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_plugin_wrappers.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_priors.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_public_benchmark.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_qualified_refs.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_quality_benchmark.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_ranking_features.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_read_cap.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_redact.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_release_scripts.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_repo_search.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_rerank.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_retrieval_types.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_scaffold.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_search_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_searchers.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_seeded_index.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_service.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_skeleton.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_skill_update.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_symbol_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_symbol_ranking.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_symbol_refs.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_sync_skill_copies.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_treesitter.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_tuning_contract.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_update.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_update_cli.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_vector_search.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_vectors_storage.py +0 -0
- {codebase_index-2.1.2 → codebase_index-2.1.3}/tests/test_watcher.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.3
|
|
@@ -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": "2.1.
|
|
6
|
+
"version": "2.1.3",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "codebase-index contributors"
|
|
9
9
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.3
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.3
|
|
@@ -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
|
+
## [2.1.3] - 2026-11-02
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Removing files from a large index no longer takes hours: `chunks.symbol_id` and
|
|
14
|
+
`symbols.parent_id` are now indexed, so a deleted symbol no longer costs a full scan
|
|
15
|
+
of both tables. Existing indexes gain the two indexes the next time they are opened,
|
|
16
|
+
with no rebuild.
|
|
17
|
+
- The `PreToolUse` guard now covers Claude Code's PowerShell tool:
|
|
18
|
+
- a `codebase-index` command run from PowerShell turns the guard off for the session,
|
|
19
|
+
and `Select-String` or `rg` code searches there are guarded like their Bash
|
|
20
|
+
equivalents. A `Select-String` that reads piped input is left alone, and here-string
|
|
21
|
+
bodies (`@'...'@`) are not scanned;
|
|
22
|
+
- `install-hooks` refreshes the matcher of an installed guard. Run it again after
|
|
23
|
+
upgrading; the plugin's hooks pick this up on their own.
|
|
24
|
+
- The guard no longer intercepts searches that cannot be answered by the index: those
|
|
25
|
+
over `.git` internals, binaries (`.exe`, `.dll`, `.jar`, `.sqlite` and the like), or
|
|
26
|
+
absolute paths outside the indexed repository. Nor does it intercept anything in a
|
|
27
|
+
directory without an index.
|
|
28
|
+
|
|
9
29
|
## [2.1.2] - 2026-09-25
|
|
10
30
|
|
|
11
31
|
### Fixed
|
|
@@ -902,7 +922,8 @@ Pooled over 305 queries (Python, Java, TypeScript), v1.8.0 → 1.9.0:
|
|
|
902
922
|
- Hooks example + `watch` mode for keeping the index fresh without blocking the edit loop (M8).
|
|
903
923
|
- `doctor`, `stats`, `clean` diagnostics/maintenance commands.
|
|
904
924
|
|
|
905
|
-
[Unreleased]: https://github.com/denfry/codebase-index/compare/v2.1.
|
|
925
|
+
[Unreleased]: https://github.com/denfry/codebase-index/compare/v2.1.3...HEAD
|
|
926
|
+
[2.1.3]: https://github.com/denfry/codebase-index/compare/v2.1.2...v2.1.3
|
|
906
927
|
[2.1.2]: https://github.com/denfry/codebase-index/compare/v2.1.1...v2.1.2
|
|
907
928
|
[2.1.1]: https://github.com/denfry/codebase-index/compare/v2.1.0...v2.1.1
|
|
908
929
|
[2.1.0]: https://github.com/denfry/codebase-index/compare/v2.0.0...v2.1.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebase-index
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.3
|
|
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
|
|
@@ -69,6 +69,7 @@ Description-Content-Type: text/markdown
|
|
|
69
69
|
<img src="https://img.shields.io/badge/MCP-stdio%20server-3fb950" alt="MCP stdio server">
|
|
70
70
|
<img src="https://img.shields.io/badge/network-off%20by%20default-3fb950" alt="No network by default">
|
|
71
71
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-8b949e" alt="MIT license"></a>
|
|
72
|
+
<a href="https://discord.gg/mVZcNUAGZt"><img src="https://img.shields.io/badge/Discord-Join%20the%20community-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
|
|
72
73
|
</p>
|
|
73
74
|
|
|
74
75
|
<p align="center">
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
<img src="https://img.shields.io/badge/MCP-stdio%20server-3fb950" alt="MCP stdio server">
|
|
20
20
|
<img src="https://img.shields.io/badge/network-off%20by%20default-3fb950" alt="No network by default">
|
|
21
21
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-8b949e" alt="MIT license"></a>
|
|
22
|
+
<a href="https://discord.gg/mVZcNUAGZt"><img src="https://img.shields.io/badge/Discord-Join%20the%20community-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
|
|
22
23
|
</p>
|
|
23
24
|
|
|
24
25
|
<p align="center">
|
|
@@ -44,6 +44,7 @@ CREATE TABLE chunks (
|
|
|
44
44
|
symbol_names TEXT NOT NULL DEFAULT '' -- denormalized symbol name, FTS-indexed (mirrored by triggers)
|
|
45
45
|
);
|
|
46
46
|
CREATE INDEX idx_chunks_file ON chunks(file_id);
|
|
47
|
+
CREATE INDEX idx_chunks_symbol ON chunks(symbol_id);
|
|
47
48
|
|
|
48
49
|
-- Symbols extracted via tree-sitter (definitions).
|
|
49
50
|
CREATE TABLE symbols (
|
|
@@ -63,6 +64,7 @@ CREATE TABLE symbols (
|
|
|
63
64
|
CREATE INDEX idx_symbols_name ON symbols(name);
|
|
64
65
|
CREATE INDEX idx_symbols_file ON symbols(file_id);
|
|
65
66
|
CREATE INDEX idx_symbols_kind ON symbols(kind);
|
|
67
|
+
CREATE INDEX idx_symbols_parent ON symbols(parent_id);
|
|
66
68
|
|
|
67
69
|
-- Graph edges: imports / calls / references / inheritance / dependencies.
|
|
68
70
|
-- src is always a known symbol or file; dst may be unresolved (dst_id NULL, dst_name kept).
|
|
@@ -1074,10 +1074,11 @@ def install_hooks(
|
|
|
1074
1074
|
) -> None:
|
|
1075
1075
|
"""Make Claude Code search through the index by default.
|
|
1076
1076
|
|
|
1077
|
-
Adds a SessionStart note and a PreToolUse guard on Grep
|
|
1078
|
-
search of a session, before any codebase-index command, is sent back
|
|
1079
|
-
index command to run instead; repeating it lets it through. Both do
|
|
1080
|
-
a directory without an index. Other hooks in the settings file are
|
|
1077
|
+
Adds a SessionStart note and a PreToolUse guard on Grep, Bash and PowerShell: the
|
|
1078
|
+
first code search of a session, before any codebase-index command, is sent back
|
|
1079
|
+
with the index command to run instead; repeating it lets it through. Both do
|
|
1080
|
+
nothing in a directory without an index. Other hooks in the settings file are
|
|
1081
|
+
kept. Run it again after an upgrade to refresh an installed guard.
|
|
1081
1082
|
"""
|
|
1082
1083
|
from .config import find_root
|
|
1083
1084
|
from . import scaffold
|
|
@@ -1092,7 +1093,7 @@ def install_hooks(
|
|
|
1092
1093
|
verb = "removed from"
|
|
1093
1094
|
else:
|
|
1094
1095
|
changed = scaffold.install_guard_hooks(path)
|
|
1095
|
-
verb = "added to"
|
|
1096
|
+
verb = "added to or refreshed in"
|
|
1096
1097
|
if changed:
|
|
1097
1098
|
typer.echo(f"[install-hooks] {', '.join(changed)} {verb} {path}")
|
|
1098
1099
|
else:
|
|
@@ -4,17 +4,17 @@ Two events, both no-ops outside a repository that has an index:
|
|
|
4
4
|
|
|
5
5
|
- ``session-start`` adds one short note to the session context: this repository
|
|
6
6
|
is indexed, and which commands answer code questions.
|
|
7
|
-
- ``guard`` (PreToolUse on Grep and
|
|
7
|
+
- ``guard`` (PreToolUse on Grep, Bash and PowerShell) intercepts a code search the first time
|
|
8
8
|
in a session, before any ``codebase-index`` command has run, and names the
|
|
9
9
|
index command to use instead. It is a nudge, not a wall: searching for the
|
|
10
10
|
same term again lets it through, the first ``codebase-index`` command in the
|
|
11
11
|
session turns the guard off (even one that has yet to build the index), and
|
|
12
|
-
searches over docs, logs or config, or inside heredoc bodies,
|
|
13
|
-
intercepted.
|
|
12
|
+
searches over docs, logs or config, or inside heredoc and here-string bodies,
|
|
13
|
+
are never intercepted.
|
|
14
14
|
|
|
15
15
|
Measured on a 5.9k-file monorepo, an agent spent 19% fewer tokens with the index
|
|
16
16
|
than with grep (tests/eval/results/2026-09-24-agent-pilot.md), but agents reach
|
|
17
|
-
for Grep out of habit. The guard runs on every
|
|
17
|
+
for Grep out of habit. The guard runs on every shell call, so this module imports
|
|
18
18
|
only the standard library and does no index work beyond one small SQLite read.
|
|
19
19
|
|
|
20
20
|
Entry point: ``codebase-index-hook <event>`` reads the hook JSON on stdin and
|
|
@@ -39,6 +39,7 @@ from typing import Any, Optional
|
|
|
39
39
|
INDEX_REL = Path(".claude") / "cache" / "codebase-index" / "index.sqlite"
|
|
40
40
|
_STATE_DIR = "codebase-index-hooks"
|
|
41
41
|
_STATE_TTL_S = 2 * 24 * 3600
|
|
42
|
+
SHELL_TOOLS = ("Bash", "PowerShell")
|
|
42
43
|
|
|
43
44
|
# A shell segment that searches file contents: the first command of the segment
|
|
44
45
|
# (after `&&`, `||`, `;`, a newline or the start), so `ps aux | grep x` is not a
|
|
@@ -56,13 +57,22 @@ _HEREDOC = re.compile(
|
|
|
56
57
|
r".*?(?:^[ \t]*\2[ \t]*$|\Z)",
|
|
57
58
|
re.DOTALL | re.MULTILINE,
|
|
58
59
|
)
|
|
60
|
+
# PowerShell's heredoc: the closing `'@` or `"@` starts its own line.
|
|
61
|
+
_HERE_STRING = re.compile(r"""@(['"])[ \t]*\r?\n.*?^\1@""", re.DOTALL | re.MULTILINE)
|
|
59
62
|
_INDEX_CMD = re.compile(r"(?:^|[\s;&|/\\\"'])(?:codebase-index|cbx)(?:\.exe|\.ps1)?\s+\w")
|
|
60
|
-
# Searches over prose, logs and
|
|
63
|
+
# Searches over prose, logs, config, binaries and git internals are what grep is for;
|
|
64
|
+
# leave them alone.
|
|
61
65
|
_NON_CODE = re.compile(
|
|
62
|
-
r"\.(?:md|mdx|rst|txt|log|ya?ml|json|toml|ini|cfg|conf|csv|xml|properties|lock|env|html?
|
|
63
|
-
r"
|
|
66
|
+
r"\.(?:md|mdx|rst|txt|log|ya?ml|json|toml|ini|cfg|conf|csv|xml|properties|lock|env|html?"
|
|
67
|
+
r"|exe|dll|so|jar|class|bin|sqlite|db)\b"
|
|
68
|
+
r"|--include=\*?\.(?:md|txt|log|ya?ml|json|toml)"
|
|
69
|
+
r"|(?:^|[\s'\"/\\])\.git[\\/]",
|
|
64
70
|
re.IGNORECASE,
|
|
65
71
|
)
|
|
72
|
+
# Shell words of a search's arguments: a quoted string or a bare word.
|
|
73
|
+
_WORD = re.compile(r""""([^"]*)"|'([^']*)'|(\S+)""")
|
|
74
|
+
# An absolute path: a drive (C:\, C:/), an MSYS drive or POSIX root (/c/, /), or home.
|
|
75
|
+
_ABS_PATH = re.compile(r"^(?:[A-Za-z]:[\\/]|/|~(?:[\\/]|$)|\$HOME\b|\$\{HOME\})")
|
|
66
76
|
_NON_CODE_TYPES = {"md", "markdown", "txt", "log", "yaml", "yml", "json", "toml", "xml",
|
|
67
77
|
"csv", "ini", "config"}
|
|
68
78
|
|
|
@@ -144,25 +154,34 @@ def guard(payload: dict) -> Optional[dict]:
|
|
|
144
154
|
return None
|
|
145
155
|
tool = payload.get("tool_name") or ""
|
|
146
156
|
tool_input = payload.get("tool_input") or {}
|
|
147
|
-
if tool
|
|
157
|
+
if tool != "Grep" and tool not in SHELL_TOOLS:
|
|
148
158
|
return None
|
|
149
159
|
state = _State(str(payload.get("session_id") or "default"))
|
|
150
160
|
|
|
151
|
-
if tool
|
|
161
|
+
if tool in SHELL_TOOLS:
|
|
152
162
|
command = _HEREDOC.sub(lambda m: "<<" + m.group("rest"), str(tool_input.get("command") or ""))
|
|
163
|
+
if tool == "PowerShell":
|
|
164
|
+
command = _HERE_STRING.sub("''", command)
|
|
153
165
|
if _INDEX_CMD.search(command):
|
|
154
166
|
# Checked before the index exists: the first search is what builds it.
|
|
155
167
|
state.mark_used()
|
|
156
168
|
return None
|
|
157
|
-
|
|
169
|
+
root = find_index_root(_cwd(payload))
|
|
170
|
+
if root is None:
|
|
171
|
+
return None
|
|
172
|
+
pattern = _shell_search_pattern(command, root)
|
|
158
173
|
if pattern is None:
|
|
159
174
|
return None
|
|
160
175
|
else:
|
|
161
|
-
|
|
176
|
+
root = find_index_root(_cwd(payload))
|
|
177
|
+
if root is None or _grep_targets_non_code(tool_input):
|
|
178
|
+
return None
|
|
179
|
+
target = str(tool_input.get("path") or "")
|
|
180
|
+
if target and _outside_repo([target], root):
|
|
162
181
|
return None
|
|
163
182
|
pattern = str(tool_input.get("pattern") or "")
|
|
164
183
|
|
|
165
|
-
if state.used
|
|
184
|
+
if state.used:
|
|
166
185
|
return None
|
|
167
186
|
# Keyed by the search term, not the whole call: a retry rarely repeats the
|
|
168
187
|
# command byte for byte (a new description, another pipe, a regenerated script).
|
|
@@ -179,20 +198,63 @@ def guard(payload: dict) -> Optional[dict]:
|
|
|
179
198
|
}
|
|
180
199
|
|
|
181
200
|
|
|
182
|
-
def _shell_search_pattern(command: str) -> Optional[str]:
|
|
201
|
+
def _shell_search_pattern(command: str, root: Path) -> Optional[str]:
|
|
183
202
|
"""The search term of a content search in `command`, or None if there is none."""
|
|
184
203
|
for match in _SEARCH_CMD.finditer(command):
|
|
185
204
|
args = match.group("args")
|
|
186
205
|
if _NON_CODE.search(args):
|
|
187
206
|
continue
|
|
188
|
-
|
|
189
|
-
if
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
207
|
+
words = [next(g for g in m.groups() if g is not None) for m in _WORD.finditer(args)]
|
|
208
|
+
if match.group("cmd").lower() == "select-string":
|
|
209
|
+
pattern, paths = _select_string_terms(words)
|
|
210
|
+
else:
|
|
211
|
+
positional = [w for w in words if not w.startswith("-") and not w.isdigit()]
|
|
212
|
+
# The first positional word is the pattern, the rest are the paths searched.
|
|
213
|
+
paths = positional[1:]
|
|
214
|
+
quoted = re.search(r"""(['"])(.+?)\1""", args)
|
|
215
|
+
pattern = quoted.group(2) if quoted else (positional[0] if positional else "")
|
|
216
|
+
if not _outside_repo(paths, root):
|
|
217
|
+
return pattern
|
|
193
218
|
return None
|
|
194
219
|
|
|
195
220
|
|
|
221
|
+
def _select_string_terms(words: list[str]) -> tuple[str, list[str]]:
|
|
222
|
+
"""The pattern and paths of a Select-String call, named or positional."""
|
|
223
|
+
pattern: list[str] = []
|
|
224
|
+
paths: list[str] = []
|
|
225
|
+
positional: list[str] = []
|
|
226
|
+
target = None
|
|
227
|
+
for word in words:
|
|
228
|
+
if target is not None:
|
|
229
|
+
target.extend(word.split(",") if target is paths else [word])
|
|
230
|
+
target = None
|
|
231
|
+
elif word.lower() in ("-path", "-literalpath", "-lp"):
|
|
232
|
+
target = paths
|
|
233
|
+
elif word.lower() == "-pattern":
|
|
234
|
+
target = pattern
|
|
235
|
+
elif not word.startswith("-") and not word.isdigit():
|
|
236
|
+
positional.append(word)
|
|
237
|
+
if not pattern and positional:
|
|
238
|
+
pattern.append(positional.pop(0))
|
|
239
|
+
return (pattern[0] if pattern else ""), paths or positional
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def _outside_repo(paths: list[str], root: Path) -> bool:
|
|
243
|
+
"""True when every path is absolute and none lies inside the indexed repository."""
|
|
244
|
+
if not paths or not all(_ABS_PATH.match(p) for p in paths):
|
|
245
|
+
return False
|
|
246
|
+
base = os.path.normcase(os.path.abspath(root))
|
|
247
|
+
for raw in paths:
|
|
248
|
+
path = re.sub(r"^(?:~|\$HOME\b|\$\{HOME\})", lambda _m: str(Path.home()), raw)
|
|
249
|
+
msys = re.match(r"^/([a-zA-Z])(/.*)?$", path)
|
|
250
|
+
if os.name == "nt" and msys:
|
|
251
|
+
path = f"{msys.group(1)}:{msys.group(2) or '/'}"
|
|
252
|
+
full = os.path.normcase(os.path.abspath(path))
|
|
253
|
+
if full == base or full.startswith(base.rstrip(os.sep) + os.sep):
|
|
254
|
+
return False
|
|
255
|
+
return True
|
|
256
|
+
|
|
257
|
+
|
|
196
258
|
def _grep_targets_non_code(tool_input: dict) -> bool:
|
|
197
259
|
kind = str(tool_input.get("type") or "").lower()
|
|
198
260
|
if kind in _NON_CODE_TYPES:
|
|
@@ -292,7 +292,7 @@ GUARD_HOOKS: dict[str, dict] = {
|
|
|
292
292
|
"timeout": 5}],
|
|
293
293
|
},
|
|
294
294
|
"PreToolUse": {
|
|
295
|
-
"matcher": "Grep|Bash",
|
|
295
|
+
"matcher": "Grep|Bash|PowerShell",
|
|
296
296
|
"hooks": [{"type": "command", "command": "codebase-index-hook guard", "timeout": 5}],
|
|
297
297
|
},
|
|
298
298
|
}
|
|
@@ -305,7 +305,9 @@ def _is_guard_entry(entry: dict) -> bool:
|
|
|
305
305
|
def install_guard_hooks(settings_path: Path) -> list[str]:
|
|
306
306
|
"""Merge the index-first hooks into a Claude Code settings file.
|
|
307
307
|
|
|
308
|
-
Idempotent, and leaves every other hook in place.
|
|
308
|
+
Idempotent, and leaves every other hook in place. An installed guard gets the
|
|
309
|
+
current matcher, so upgrading only takes running this again. Returns the events
|
|
310
|
+
added or refreshed.
|
|
309
311
|
"""
|
|
310
312
|
settings: dict = {}
|
|
311
313
|
if settings_path.exists():
|
|
@@ -314,9 +316,14 @@ def install_guard_hooks(settings_path: Path) -> list[str]:
|
|
|
314
316
|
added = []
|
|
315
317
|
for event, entry in GUARD_HOOKS.items():
|
|
316
318
|
entries = hooks.setdefault(event, [])
|
|
317
|
-
|
|
319
|
+
installed = [e for e in entries if _is_guard_entry(e)]
|
|
320
|
+
if not installed:
|
|
318
321
|
entries.append(json.loads(json.dumps(entry)))
|
|
319
322
|
added.append(event)
|
|
323
|
+
elif "matcher" in entry and any(e.get("matcher") != entry["matcher"] for e in installed):
|
|
324
|
+
for existing in installed:
|
|
325
|
+
existing["matcher"] = entry["matcher"]
|
|
326
|
+
added.append(event)
|
|
320
327
|
if added:
|
|
321
328
|
settings_path.parent.mkdir(parents=True, exist_ok=True)
|
|
322
329
|
settings_path.write_text(json.dumps(settings, indent=2) + "\n", encoding="utf-8")
|
|
@@ -35,6 +35,9 @@ CREATE TABLE IF NOT EXISTS symbols (
|
|
|
35
35
|
CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name);
|
|
36
36
|
CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_id);
|
|
37
37
|
CREATE INDEX IF NOT EXISTS idx_symbols_kind ON symbols(kind);
|
|
38
|
+
-- Every deleted symbol looks up its children for ON DELETE SET NULL here and on
|
|
39
|
+
-- chunks.symbol_id; without an index each lookup is a full table scan.
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_symbols_parent ON symbols(parent_id);
|
|
38
41
|
|
|
39
42
|
CREATE TABLE IF NOT EXISTS chunks (
|
|
40
43
|
id INTEGER PRIMARY KEY,
|
|
@@ -52,6 +55,7 @@ CREATE TABLE IF NOT EXISTS chunks (
|
|
|
52
55
|
symbol_names TEXT NOT NULL DEFAULT ''
|
|
53
56
|
);
|
|
54
57
|
CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file_id);
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_chunks_symbol ON chunks(symbol_id);
|
|
55
59
|
|
|
56
60
|
CREATE TABLE IF NOT EXISTS edges (
|
|
57
61
|
id INTEGER PRIMARY KEY,
|
|
@@ -114,6 +114,80 @@ def test_code_searches_in_the_shell_are_guarded(repo: Path, command: str):
|
|
|
114
114
|
assert _denied(_call(repo, "Bash", command=command))
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
@pytest.mark.parametrize("command", [
|
|
118
|
+
"grep -qx '.claude/' .git/info/exclude",
|
|
119
|
+
"grep -aoE 'effortLevel' /c/Users/me/.local/bin/claude.exe",
|
|
120
|
+
"grep -rn 'def guard' ~/other-project/src",
|
|
121
|
+
])
|
|
122
|
+
def test_searches_over_git_internals_binaries_or_outside_the_repo_pass(repo: Path, command: str):
|
|
123
|
+
assert _call(repo, "Bash", command=command) is None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_a_search_outside_the_repo_passes_and_one_inside_it_is_guarded(repo: Path, tmp_path: Path):
|
|
127
|
+
elsewhere = (tmp_path / "elsewhere").as_posix()
|
|
128
|
+
assert _call(repo, "Bash", command=f"grep -rn -A 3 TownService {elsewhere}") is None
|
|
129
|
+
assert _call(repo, "Grep", pattern="TownService", path=elsewhere) is None
|
|
130
|
+
assert _denied(_call(repo, "Bash", command=f"grep -rn TownService {(repo / 'src').as_posix()}"))
|
|
131
|
+
assert _denied(_call(repo, "Grep", pattern="Other", path=str(repo / "src")))
|
|
132
|
+
# A pattern that looks like a path does not count as one.
|
|
133
|
+
assert _denied(_call(repo, "Bash", command='grep -rn "/api/v1" src'))
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def test_an_index_command_in_powershell_turns_the_guard_off(repo: Path):
|
|
137
|
+
assert _call(repo, "PowerShell", command='codebase-index search "x" --compact; git status') is None
|
|
138
|
+
assert _call(repo, "Grep", pattern="anything") is None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@pytest.mark.parametrize("command", [
|
|
142
|
+
"Select-String -Pattern TownService -Path src\\*.java",
|
|
143
|
+
"Select-String -Path src\\*.java -Pattern 'TownService'",
|
|
144
|
+
'git status; Select-String "TownService" src\\*.java',
|
|
145
|
+
"rg -n TownService src",
|
|
146
|
+
])
|
|
147
|
+
def test_code_searches_in_powershell_are_guarded(repo: Path, command: str):
|
|
148
|
+
reply = _call(repo, "PowerShell", command=command)
|
|
149
|
+
assert _denied(reply)
|
|
150
|
+
assert 'search "TownService"' in reply["hookSpecificOutput"]["permissionDecisionReason"]
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@pytest.mark.parametrize("command", [
|
|
154
|
+
"Get-Content build.txt | Select-String BUILD",
|
|
155
|
+
"Select-String -Path README.md -Pattern install",
|
|
156
|
+
"git commit -m @'\nfix: stop\n\ngrep -rn TownService src\n'@",
|
|
157
|
+
'Set-Content x.ps1 -Value @"\nSelect-String Town src\n"@\ngit status',
|
|
158
|
+
])
|
|
159
|
+
def test_powershell_filters_prose_and_here_strings_pass(repo: Path, command: str):
|
|
160
|
+
assert _call(repo, "PowerShell", command=command) is None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_select_string_outside_the_repo_passes_whichever_way_it_is_named(repo: Path, tmp_path: Path):
|
|
164
|
+
elsewhere = str(tmp_path / "elsewhere" / "*.cs")
|
|
165
|
+
assert _call(repo, "PowerShell", command=f"Select-String -Path '{elsewhere}' -Pattern Town") is None
|
|
166
|
+
assert _call(repo, "PowerShell", command=f"Select-String -Pattern Town -LiteralPath '{elsewhere}'") is None
|
|
167
|
+
inside = str(repo / "src" / "*.cs")
|
|
168
|
+
assert _denied(_call(repo, "PowerShell", command=f"Select-String -Path '{inside}' -Pattern Town"))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def test_install_refreshes_the_matcher_of_an_older_guard(tmp_path: Path):
|
|
172
|
+
path = tmp_path / "settings.json"
|
|
173
|
+
scaffold.install_guard_hooks(path)
|
|
174
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
175
|
+
data["hooks"]["PreToolUse"][0]["matcher"] = "Grep|Bash"
|
|
176
|
+
path.write_text(json.dumps(data), encoding="utf-8")
|
|
177
|
+
|
|
178
|
+
assert scaffold.install_guard_hooks(path) == ["PreToolUse"]
|
|
179
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
180
|
+
assert data["hooks"]["PreToolUse"][0]["matcher"] == scaffold.GUARD_HOOKS["PreToolUse"]["matcher"]
|
|
181
|
+
assert scaffold.install_guard_hooks(path) == []
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def test_every_guard_matcher_covers_the_tools_the_guard_reads():
|
|
185
|
+
plugin = json.loads(Path("hooks/hooks.json").read_text(encoding="utf-8"))
|
|
186
|
+
for matcher in (scaffold.GUARD_HOOKS["PreToolUse"]["matcher"],
|
|
187
|
+
plugin["hooks"]["PreToolUse"][0]["matcher"]):
|
|
188
|
+
assert set(matcher.split("|")) == {"Grep", *hooks.SHELL_TOOLS}
|
|
189
|
+
|
|
190
|
+
|
|
117
191
|
def test_grep_over_docs_or_config_passes(repo: Path):
|
|
118
192
|
assert _call(repo, "Grep", pattern="x", glob="**/*.yml") is None
|
|
119
193
|
assert _call(repo, "Grep", pattern="x", type="md") is None
|
|
@@ -42,6 +42,35 @@ def test_future_schema_version_raises(tmp_path):
|
|
|
42
42
|
pass
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
def test_every_foreign_key_column_leads_an_index(tmp_path):
|
|
46
|
+
"""Without one, SQLite scans the child table for every deleted parent row."""
|
|
47
|
+
with Database(tmp_path / "index.sqlite") as db:
|
|
48
|
+
conn = db.conn
|
|
49
|
+
tables = [
|
|
50
|
+
r[0]
|
|
51
|
+
for r in conn.execute(
|
|
52
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'fts_%'"
|
|
53
|
+
)
|
|
54
|
+
]
|
|
55
|
+
for table in tables:
|
|
56
|
+
leading = {
|
|
57
|
+
conn.execute(f"PRAGMA index_info({index['name']})").fetchone()["name"]
|
|
58
|
+
for index in conn.execute(f"PRAGMA index_list({table})").fetchall()
|
|
59
|
+
}
|
|
60
|
+
for fk in conn.execute(f"PRAGMA foreign_key_list({table})").fetchall():
|
|
61
|
+
assert fk["from"] in leading, f"{table}.{fk['from']} has no index"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_existing_index_gains_new_indexes_on_open(tmp_path):
|
|
65
|
+
db_path = tmp_path / "index.sqlite"
|
|
66
|
+
with Database(db_path) as db:
|
|
67
|
+
db.conn.execute("DROP INDEX idx_chunks_symbol")
|
|
68
|
+
db.conn.execute("DROP INDEX idx_symbols_parent")
|
|
69
|
+
with Database(db_path) as db:
|
|
70
|
+
names = {r[0] for r in db.conn.execute("SELECT name FROM sqlite_master WHERE type='index'")}
|
|
71
|
+
assert {"idx_chunks_symbol", "idx_symbols_parent"} <= names
|
|
72
|
+
|
|
73
|
+
|
|
45
74
|
def _open(tmp_path):
|
|
46
75
|
return Database(tmp_path / "index.sqlite").open()
|
|
47
76
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.2
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.2
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.2
|
|
File without changes
|
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/references/commands.md
RENAMED
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.claude/skills/codebase-index/references/memory.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/references/commands.md
RENAMED
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.codex/skills/codebase-index/references/memory.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.github/ISSUE_TEMPLATE/skill_listing_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/references/commands.md
RENAMED
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/references/memory.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codebase_index-2.1.2 → codebase_index-2.1.3}/.opencode/skills/codebase-index/scripts/cbx.ps1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|