jcodemunch-mcp 1.108.332__tar.gz → 1.108.334__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.
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/.claude-plugin/plugin.json +1 -1
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CHANGELOG.md +118 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/ISSUE-HISTORY.md +28 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/PKG-INFO +4 -4
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/README.md +2 -2
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/harness/ARCHAEOLOGY.md +7 -4
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/workflows/LEDGER.md +11 -5
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/pyproject.toml +8 -2
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/server.json +2 -2
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/init.py +35 -4
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/search_symbols.py +3 -1
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/parse_budget.py +9 -4
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/sql_preprocessor.py +92 -22
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/template_shared.py +8 -2
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/embedding_store.py +144 -1
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/index_store.py +7 -1
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/embed_repo.py +39 -36
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/search_symbols.py +106 -17
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_macro_docstring_is_the_comment_above_it.py +79 -3
- jcodemunch_mcp-1.108.334/tests/test_init_index_summary_reads_the_indexers_result.py +114 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parse_path_loops_are_linear.py +110 -16
- jcodemunch_mcp-1.108.334/tests/test_semantic_topup_checks_the_stored_model.py +718 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_suggest_queries.py +14 -7
- jcodemunch_mcp-1.108.334/tests/test_tree_sitter_range_is_the_tested_range.py +159 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/uv.lock +2 -2
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/whatsnew.json +13 -13
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/.clabot +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/.claude-plugin/marketplace.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/.dockerignore +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/.gitignore +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/AGENTS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/AGENT_HINTS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/AGENT_HOOKS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/AGENT_INSTALL_UNIVERSAL.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/ARCHITECTURE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CAPABILITIES.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CLI-AND-ENV.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CLIENTS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CODE_OF_CONDUCT.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CONFIGURATION.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CONTEXT_PROVIDERS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/CONTRIBUTING.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/Caddyfile +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/Dockerfile +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/GROQ.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/HEADLESS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/INSTALL_FROM_SOURCE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/KEY-FILES.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/LANGUAGE_SUPPORT.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/LICENSE +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/QUICKSTART.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/RELEASE_RESTORE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/ROADMAP.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/SCIP.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/SECURITY.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/SPEC.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/SPEC_MUNCH.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/TOKEN_SAVINGS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/TROUBLESHOOTING.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/TWEAKCC.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/UNDER_THE_HOOD.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/USER_GUIDE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/badge-kit.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/METHODOLOGY.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/RAG_COMPARISON_NOTES.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/REPRODUCING.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/ab-test-dead-code-2026-03-18.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/ab-test-naming-audit-2026-03-18.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/anchor/measure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/attic/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/attic/ab_v1_70_0.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/attic/profile_backpressure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/attic/profile_config_regression.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/attic/profile_language_filter.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/cache_stability/measure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/cache_stability/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/calibration/planted_queries.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/codex_surface/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/codex_surface/run_codex_arms.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/codex_surface/tasks.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/deadcode_eval/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/deadcode_eval/results-2026-08-03.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/deadcode_eval/run_eval.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/jcm_tools_full.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/jdata_tools.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/jdoc_tools.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/rubric_upstream.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/score_descriptions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/description_smells/scores.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/events/handlers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/events/protocol.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/events/registry.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/events/web.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/go/collect/plist.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/go/collect/queue.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/go/collect/ring.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/go/mower/mower.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/go/talent/recruiter.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/applepay_adapter.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/base.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/legacy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/mock_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/paypal_impl.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/payments/stripe_impl.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/pos/hardware.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/pos/legal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/pos/terminal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/reporting/base_report.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/reporting/csv_report.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/analytics/banner.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/analytics/toast.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/billing/decorators.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/billing/handlers.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/billing/protocol.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/billing/reports.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/building/elevator.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/factory/conveyor.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/gateway/push.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/notify/base.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/notify/email.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/corpus/ts/notify/sms.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/gold.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/goldset/measure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/capture_schema_baseline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/capture_token_baseline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/run_benchmark.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/run_odysseus_compare.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/run_rag_baseline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/harness/token_floor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/jcm_reference.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/odysseus_compare_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/odysseus_compare_results.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/offload/results-django__django.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/offload/results-fastapi__fastapi.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/offload/results-local__jcodemunch-mcp-0394b683.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/offload/run_offload_criterion.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/provenance/channel_accuracy.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/provenance/measured.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/corpus.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/oracle.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/reader_corpus.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/reader_oracle.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/reader_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/run_fidelity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/racket_fidelity/run_reader_fidelity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rag_baseline_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rag_baseline_results.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/fixtures/self_v1_75_0.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/results/self_v1_75_0-golden.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/results/self_v1_75_0-v1.75.0.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/replay/run_replay.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/requirements-rag-bench.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/results.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/results_v1.70.0.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/PROTOCOL.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/RESULT.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/build_cases.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/cases.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/predicate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_binary_pilot/run_pilot.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/emitted_task_cases.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/emitted_task_holdout.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/emitted_task_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/explain_misses.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/explanations.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/holdout.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/holdout_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/measure_route_discriminators.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/queries.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/route_discriminator_results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/run_emitted_task.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/route_recall/run_route_recall.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/corpus.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/oracle/Cargo.toml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/oracle/src/main.rs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/rust_fidelity/run_fidelity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/schema_baseline.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/self_latency/measure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/swebench/PROTOCOL.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/swebench/power.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/tasks.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/tier_switch/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/tier_switch/price_tier_switch.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/tier_switch/results.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/token_baselines/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/token_baselines/v1.108.163.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/benchmarks/whitepaper.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/cli/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/cli/cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/clients/ts/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/clients/ts/decoder.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docker-compose.yml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/cicd/AUDIT.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/cicd/DESIGN.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/cicd/FINDINGS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/cicd/RUNBOOK.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/cicd/VERIFICATION.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/harness/COVERAGE-MAP.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/harness/DESIGN.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/harness/FINDINGS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/harness/VERIFICATION.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/inbound/AUDIT.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/inbound/DESIGN.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/inbound/FINDINGS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/inbound/POLICY.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/inbound/VERIFICATION.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/prd-extraction-fingerprint.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/standard/DISCOVERY.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/standard/ENFORCEMENT-PLAN.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/standard/NICHE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/standard/STANDARD.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/workflows/DESIGN.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/workflows/FINDINGS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/workflows/LOOPS.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/docs/workflows/VERIFICATION.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/examples/groq_validate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/examples/otel-collector/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/examples/otel-collector/jcm-exporter.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/__main__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/audit-allowlist.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/corpora.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/corpora.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/release_age.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/results/latest.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/results/self_latency.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/results/self_latency_ci_runs_2026-09-22.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/results/self_latency_three_runs.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/retired.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/thresholds.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/thresholds.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/harness/tiers.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/jcodemunch_whitepaper.pdf +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/mcpb/build.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/mcpb/server/main.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/django.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/express.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/fastapi.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/flask.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/gin.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/jcodemunch.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/langchain.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/nextjs.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/pytorch.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/react.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/requests.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/rust_axum.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/spring_boot.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/corpus/vue.yaml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/leaderboard.html +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/corpus.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/encoding_bench.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/evaluate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/inference.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/leaderboard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/retrieval.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/munch_bench/runner.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-haiku-4-5_express.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-haiku-4-5_fastapi.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-haiku-4-5_flask.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-sonnet-4-6_express.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-sonnet-4-6_fastapi.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/anthropic_claude-sonnet-4-6_flask.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/results/groq_llama-3.3-70b-versatile_2026-04-13.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/tests/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/tests/test_corpus.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/tests/test_evaluate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/munch-bench/tests/test_leaderboard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/packaging/debian/build_deb.sh +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/schemas/confidence-provenance.schema.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/schemas/evidence-receipt.schema.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/schemas/ranked-context-response.schema.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/schemas/retrieval-verdict.schema.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/dod_changelog.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/gap_ledgers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/handshake.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/open_regression_issue.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/pr_bench_comment.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/refresh_grammar_inventory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/registry_verify.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/release_notes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/release_preflight.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/surface_diff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/scripts/unstable_modules_diag.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/speedreview/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/speedreview/action.yml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/speedreview/review.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/__main__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/agent_selector.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/delivery.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/digest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/file_risk.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/health.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/_common.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/briefing.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/landmarks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/reindex.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/snapshot.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/steering.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/hooks/taskcomplete.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/install_pack.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/observatory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/policy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/receipt.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/reflect.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/skills.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/upgrade.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/cli/whatsnew.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/config.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/counter.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/credentials.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/embeddings/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/embeddings/advice.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/embeddings/failures.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/embeddings/local_encoder.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/decoder.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/format.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/gate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/generic.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/json_passthrough.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schema_driven.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/find_importers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/find_references.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_blast_radius.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_call_hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_dependency_cycles.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_dependency_graph.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_file_outline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_impact_preview.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_ranked_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_repo_outline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_signal_chains.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/get_tectonic_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/registry.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/search_ast.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/encoding/schemas/search_text.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/enrichment/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/enrichment/lsp_bridge.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/capability.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/producers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/receipts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/scip.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/evidence/scip_ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/config.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/explainer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/inference.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/retriever.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/groq/voice.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/handoff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/hook_event.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/install_layout.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/investigator/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/investigator/deletion_safety.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/investigator/retrieval_counterfactual.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/investigator/reuse_audit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/org/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/org/http_routes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/org/license.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/org/report.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/org/store.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/astro_shared.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/complexity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/_route_utils.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/base.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/dbt.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/decorator_routes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/django.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/express.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/framework_profiles.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/git_blame.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/go_routers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/laravel.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/nextjs.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/nuxt.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/context/rails.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/extractor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/fqn.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/grammar_pack.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/parse_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/racket_reader.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/path_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/progress.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/redact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/reindex_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/confidence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/embed_drift.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/entropy_prune.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/freshness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/ledger_trust.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/offload.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/provenance.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/query_shape.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/regret.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/scoring.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/signal_fusion.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/subject_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/tuning.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/retrieval/verdict.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/_calls_store.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/confidence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/diagnostics_ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/diagnostics_log.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/http_routes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/otel.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/redact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/resolve.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/sql_ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/sql_log.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/stack_ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime/stack_log.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/runtime_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/secret_classifier.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/security.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/server.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/service_installer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/stdio_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/embedding_matrix.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/generation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/git_root.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/process_locks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/process_registry.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/selective.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/sqlite_store.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/token_tracker.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/storage/transcript_roots.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/summarizer/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/summarizer/batch_summarize.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/summarizer/file_summarize.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/surface_offer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tier_resolver.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tier_switch_cost.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_arg_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_call_graph.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_corpus_adequacy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_diagnostics_consume.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_dynamic_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_entry_points.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_git_history.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_indexing_pipeline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_name_reachability.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_runtime_discovery.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_scip_consume.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_stop_rule.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_test_paths.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/_utils.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/analyze_perf.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/assemble_task_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/audit_agent_config.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/check_delete_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/check_edit_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/check_embedding_drift.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/check_references.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/check_rename_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/decision_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/digest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_dead_code.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_hot_paths.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_implementations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_importers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_references.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_similar_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/find_unused_paths.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/flow_edges.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_architecture_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_blast_radius.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_call_hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_changed_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_churn_rate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_class_hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_context_bundle.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_coupling_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_cross_repo_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_dead_code_v2.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_decorator_census.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_delivery_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_dependency_cycles.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_dependency_graph.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_endpoint_impact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_extraction_candidates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_file_content.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_file_outline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_file_risk.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_file_tree.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_group_contracts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_hotspots.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_impact_preview.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_layer_violations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_parity_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_pr_risk_profile.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_project_intel.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_ranked_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_redaction_log.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_related_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_repo_health.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_repo_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_repo_outline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_runtime_coverage.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_session_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_session_snapshot.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_session_stats.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_signal_chains.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_symbol.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_symbol_complexity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_symbol_diff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_symbol_importance.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_symbol_provenance.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_tectonic_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_untested_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/get_watch_status.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/health_radar.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/import_runtime_signal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/import_scip.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/index_dependency.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/index_file.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/index_folder.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/index_repo.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/invalidate_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/list_repos.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/list_workspaces.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/mermaid_viewer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/observatory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/observatory_render.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/package_registry.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/pagerank.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/plan_refactoring.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/plan_turn.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/refresh.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/register_edit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/render_diagram.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/resolve_repo.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/search_ast.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/search_columns.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/search_text.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/session_journal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/session_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/suggest_corrections.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/suggest_queries.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/summarize_repo.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/test_summarizer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/tune_weights.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/turn_budget.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/tools/winnow_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/version_check.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/watch_all.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/watcher.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/conftest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/conftest_helpers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/encoding/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/encoding/test_dispatcher.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/encoding/test_format.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/encoding/test_generic_hardened.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/encoding/test_tier1_roundtrip.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/al/sample.al +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/arduino/sample.ino +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/BaseLayout.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/ClientIsland.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/ContentPage.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/DynamicRoute.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/WidgetComponent.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/WithProps.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/sample.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/sample_bom_crlf.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/sample_malformed_frontmatter.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/astro/sample_multi_script.astro +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/blade/sample.blade.php +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/c/sample.c +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/aider_map.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cocoindex_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/code_review_graph_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/codebase_memory_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/codegraph_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/imp_json.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/index.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/inv_default.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/inv_json.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/refs_json.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/search_json.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/cymbal/show_json.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/graft_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/serena_mcp.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/README.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/index.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/run.sh +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/self-P1-cache_put.0.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/self-P2-cache_put.0.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/self-P4-token_tracker.0.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/self-T-router.0.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/status.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/timings.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/competitive/zvec_grep/tools_list.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/cpp/sample.cpp +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/csharp/sample.cs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/dart/sample.dart +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/REGENERATE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/mypy.jsonl +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/pyright.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/ruff.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/sample_a.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/sample_mod.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/diagnostics/tsc.txt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/elixir/sample.ex +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/gap_ledger_issues.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/go/sample.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/grammar_declaration_inventory.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/java/Sample.java +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/javascript/sample.js +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/perl/sample.pl +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/php/sample.php +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/app/__init__.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/app/cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/app/inventory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/app/orders.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/main.go +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/pyproject.toml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/web/handlers.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/web/router.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/pkg_smoke/web/util.js +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/python/sample.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/REGENERATE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/atexp-syntax.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/atexp.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/basics.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/forms.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/guards.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/macros.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket/reader.rkt +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket_oracle.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/racket_reader_oracle.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/razor/Counter.razor +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/razor/dotnet_aspnetcore_layout.cshtml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/razor/sample.cshtml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/ruby/sample.rb +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust/REGENERATE.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust/basics.rs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust/guards.rs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust/qualification.rs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust/sample.rs +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/rust_oracle.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/svelte/Counter.svelte +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/templates/sample.py.jinja +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/templates/sample.ts.j2 +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/templates/widget.ts.twig +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/typescript/sample.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/verilog/sample.sv +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/vhdl/sample.vhd +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/xml/sample.xml +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/fixtures/xml/sample.xul +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_blast_radius_counts_its_cross_repo_importers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_family_class_behind_an_export_macro_is_a_class.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_family_enum_behind_an_export_macro_is_an_enum.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_prototype_is_a_function.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_struct_member_is_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_type_reference_is_not_a_declaration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_c_typedef_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_class_in_a_method_body_is_not_published_bare.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_class_member_carries_its_owner.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_class_defined_with_a_qualified_name_is_nested.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_function_local_type_is_owned_by_the_function.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_header_of_prototypes_is_read_as_cpp.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_out_of_class_definition_is_a_member.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_specialisation_keeps_its_arguments.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_cpp_template_span_ends_where_it_starts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_dart_extension_type_and_enum_own_their_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_dynamic_import_is_an_edge_or_a_named_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_failing_tier_names_its_failures.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_function_valued_binding_in_a_component_script_is_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_go_method_belongs_to_its_receiver.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_grouped_go_binding_records_its_own_span.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_grouped_go_type_block_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_js_class_expression_is_a_class.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_js_declarator_records_its_own_span.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_kotlin_spilled_accessor_owns_its_body.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_kotlin_top_level_binding_is_not_a_member.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_latency_tail_is_resampled_before_it_fails.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_members_parent_survives_disambiguation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_near_miss_symbol_id_names_its_candidates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_prototype_list_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_red_tier_keeps_its_tracebacks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_refused_absence_never_reads_as_proof.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_rust_struct_field_is_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_ts_parameter_property_is_a_field.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_tsx_script_is_read_with_the_tsx_grammar.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_vue_component_with_two_scripts_indexes_both.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_vue_options_script_keeps_its_top_level_declarations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_vue_or_svelte_script_class_owns_its_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_a_zig_qualified_container_is_a_container.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_absence_wiring_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_adaptive_languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_agent_selector.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_al.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_an_astro_class_owns_its_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_an_fsharp_and_chain_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_an_fsharp_non_rec_and_chain_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_an_unbound_class_expression_publishes_its_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_analyze_perf_totals.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_anthropic_optional.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_architecture_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_architecture_tools.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_arrow_functions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_asm_language.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_assemble_task_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_astro.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_audit_agent_config.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_benchmark_grep_baseline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_benchmark_reference.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_benchmark_tables_mirror_the_reference.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_blade.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_blank_identifier_is_not_a_symbol.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_blast_radius.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_blast_radius_package_granular_verdict.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_bm25_cache_single_flight.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_bm25_correctness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_bounded_verdicts_declare_whether_absence_was_established.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_branch_indexing.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_build.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_build_tree_spellings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_byte_offset_symbol_names.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cache_hit_rate_basis.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cache_mode.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_call_extraction.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_call_graph_ast.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_call_hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_call_outcome_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_call_references_model.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_capability_certificate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_catalog_moratorium.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_changed_symbols_blast_describes_until_sha.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_changed_symbols_blast_keeps_its_verdict.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_changed_symbols_names_the_files_it_did_not_diff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_channel_accuracy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_check_delete_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_check_edit_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_check_edit_safe_reads_the_dynamic_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_check_references.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_check_rename_safe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_churn_rate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_churn_rate_never_answers_for_a_target_that_is_not_there.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ci_env_reproduce_command.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_class_constant_owner.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_class_hierarchy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_class_state_is_indexed_in_four_more_languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_class_state_is_indexed_in_three_spec_languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_claude_md_policy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_claude_md_rotation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_claude_md_size.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cleanup.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cli_env_split.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cli_output_encoding.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_code_index_path_is_honoured.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_code_scanning_triage.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_aider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_checks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_cocoindex.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_code_review_graph.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_codebase_memory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_codegraph.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_compare_ref.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_fairness_digest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_findings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_graft.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_image_cost.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_mcp_driver.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_prerequisites.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_reindex_one.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_sandbox.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_serena.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_tier.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_trend.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_workflows.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_competitive_zvec_grep.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_complexity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_confidence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_confidence_score_scale.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_check_hooks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_check_matches_resolver.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_check_names_a_stale_policy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_docs_reverse_parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_isolation_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_lazy_load.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_set.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_config_watcher_keys.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_configuration_md_defaults.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_constant_extraction_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_context_providers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_copilot_hook.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_count_cap_end_to_end.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_counter.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_counter_surface_stability.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_counts_survive_truncation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cpp_data_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cpp_function_shaped_variables_are_not_functions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_credentials.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_cross_repo.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_csharp_operator_forms.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_css.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dart_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dbt_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dead_code_corpus_adequacy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dead_code_reads_the_dynamic_import_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dead_code_v2.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_deadcode_eval_harness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_declared_forms_extract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_decorator_awareness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_decorator_census.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_decorator_routes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_deferred_summarization.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_definition_exclusion_is_case_exact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_delete_index_cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_delivery_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dependency_graph_imports_alias.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_description_smells.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_diagnostics_consumers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_diagnostics_ingest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_digest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dispatch_resolution.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dispatch_schema_parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dispatcher_arg_mutation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_django_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_docs_config_parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dod_checklist_code_roots.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dod_retired_test_detection.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_dod_row1_binding.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embed_drift.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embed_model_version_floor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embed_repo_error_cause.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embed_task_type_gate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embedding_model_change.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_embedding_provider_advice.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_endpoint_impact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_endpoint_infra_impact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_enum_members_register.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_every_language_spec_field_has_a_reader.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_every_served_cache_hit_is_counted_once.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_exact_match_survives_the_cut.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_explicit_embed_model_wins.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_express_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_extra_extensions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_extraction_candidates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_fast_path_no_hydration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_file_io_encoding_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_file_summaries.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_file_summary_member_kinds.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_dead_code.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_implementations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_importers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_importers_discloses_the_dynamic_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_references_line_numbers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_find_similar_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_fqn.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_framework_build_trees_are_skipped.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_framework_profiles.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_framework_script_bindings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_freshness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_fsharp_abstract_interface_and_constructor_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_fsharp_members_after_static_member_val.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_full_save_keeps_embedding_meta.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_full_tier_coverage_core.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_future_version_no_false_absence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_fuzzy_search.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_gap_ledgers_cite_open_issues.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_gcm.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_generated_policy_matches_tools_list.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_generation_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_changed_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_context_bundle.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_file_outline_integration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_file_risk.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_file_tree.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_group_contracts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_repo_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_get_untested_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_git_history_coverage.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_git_paths_relative_to_index_root.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_git_root_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_git_sha_verification.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_gleam_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_go_routers_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_go_variables.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_grammar_spelled_forms.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_groq_explainer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_groq_voice.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_guide_respects_disabled_tools.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_handshake_watchdog.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hardening.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_harness_bench_artifact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_harness_summary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_harness_verdict_lines.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_haskell_declared_forms.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_health_radar.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_health_radar_action.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hook_budget_tree_kill.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hook_output_channels.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hook_path_table.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hook_steering_fixes.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hooks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_hotspots.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_html_file_class.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_identity_mode.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_identity_normalized_tier.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_importer_walkers_ask_blast_verdict.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_bench_table.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_depeval_apply.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_depkind.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_digest.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_fix_gates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_intake_plan.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_plumbing.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_prompts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_scan.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_selfcheck.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_sweep.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_triage_apply.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inbound_workflows.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_incremental.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_index_channel_tri_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_index_dependency.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_index_file.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_index_file_head_advance.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_index_folder_empty_discovery.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init_client_schemas.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init_home_isolation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init_hooks_paths.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init_minimal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_init_policy_matches_surface.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_install_copilot_hooks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_install_pack.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_install_pack_member_confinement.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_install_uninstall.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_integrity_check_cost.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_inventory_reads_every_channel.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_investigator_deletion_safety.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_investigator_entry_point_importer_is_live.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_investigator_trusts_the_folded_import_match.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_issue_456_perf_correlation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_java_declaration_forms.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_java_fields.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_js_bindings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_js_class_field_phantom_methods.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_js_destructured_bindings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_js_ts_class_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_json.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_julia_name_depth.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_julia_short_functions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_key_files_split.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_kind_enum_is_derived.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_kotlin_properties.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_language_pack_generation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_language_spec_maps_agree.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_laravel_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ledger_field_types.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_legacy_lock_holder_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_license_identifier_agreement.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_list_repos.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_local_encoder.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_local_integration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_lockfile_version_sync.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_lsp_bridge.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_luau_language.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_mcp_instructions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_mcp_pin_carries_its_measurement.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_member_kind_audit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_member_state_is_not_a_constant.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_meta_disclosure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_migration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_missing_content_cache_is_reported.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_mtime_optimization.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_name_not_searchable_keeps_its_other_gaps.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_negative_evidence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_nesting_depth_channels.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_new_languages.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_new_languages_v143.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_next_entry_points.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_nextjs_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_nim_exported_routines_are_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_non_ascii_names_keep_refusing.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_nuxt_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_nuxt_srcdir.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_observatory.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_observatory_clone_depth.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_offload.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_offload_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_one_declaration_binds_every_name.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_one_test_file_predicate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_optional_dep_skips_are_visible.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_org_http.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_org_license.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_org_rollup.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pack_api_transport.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pack_index_survives_orphan_sweep.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pack_marker_not_a_repo_index.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_package_json_scripts_are_entry_points.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pagerank.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_paid_embeddings_optin.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parity_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parse_budget_cancels.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parse_budget_python_side.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parse_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parse_warnings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parser.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_parser_generation_upgrade.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pascal_fsharp_nim_members_are_owned.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pascal_interface_members_are_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pascal_method_implementation_is_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_path_entry_point_invariants.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_path_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_perf_db_path_resolution.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_perf_telemetry.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_perf_trim_is_per_database.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_php_enum_cases_are_indexed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_php_members.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pid_reuse_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_plan_refactoring.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_plan_turn.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_plan_turn_absence_is_repo_scoped.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_plugin_manifest_sync.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_policy_grants_absence_only_on_a_proven_scan.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_post_tool_use_hook.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_preflight_descriptions_name_every_verdict.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_process_code_freshness.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_process_locks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_progress.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_project_intel.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_prompts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_property_based.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_provenance.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_provider_metadata_and_perf.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_psr4.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_pulse.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_python_class_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_python_relative_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_python_script_dir_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_python_sibling_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_collections.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_config_reparse.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_fidelity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_fidelity_artifacts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_lang_gate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_language.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_racket_reader.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_rails_provider.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ranking_ledger.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_rate_limit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_razor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_readonly_annotations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_receipt.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_redact.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_references_compare_normalised_spellings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_refresh_campaign.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_refresh_corpus_unreadable.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_register_edit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_registry_verify_reads_every_page.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_registry_verify_retries_an_unanswered_read.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_reindex_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_related_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_release_cadence_gate.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_release_install_is_its_own_probe.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_release_notes_fit_the_github_limit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_release_preflight.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_render_diagram.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_render_diagram_integration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_render_diagram_viewer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_repeat_root_walk_additional.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_repeat_subdir_walk.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_replay_metrics.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_repo_health.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_repo_key_lookup_caches_what_it_learned.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_resolve_repo.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_resolve_repo_nested_repo_boundary.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_response_cap.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_result_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_result_cache_isolation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_retirement_ledger.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_retrieval_counterfactual.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_retrieval_inflation.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_retrieval_tools.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_reuse_audit.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_route_binary_pilot_is_frozen.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_route_criterion_has_one_authority.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_route_recall_artifacts_are_fresh.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_route_utils.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_evidence_names_the_body_it_observed.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_hit_count_column.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase0.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase1.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase2.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase3.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase4.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase5.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase6.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_runtime_phase7.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_rust_fidelity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_rust_fidelity_artifacts.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_savings_baseline.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_savings_by_tool.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_savings_two_carriers.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_savings_usd_basis.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_scala_given.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_scala_parser.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_schema_baseline_transcription.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_schema_budget.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_schtasks_locale.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_scip_evidence.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_sdist_exclusions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_ast_encoder_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_columns.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_perf.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_result_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_symbols_defaults.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_search_symbols_tie_order.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_secret_classifier.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_security.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_security_disclosure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_security_exclusions_are_project_overridable.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_security_md_limits_parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_security_md_policy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_selective_snapshot.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_semantic_extra_floor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_semantic_search.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_server.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_server_json_sync.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_session_journal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_session_snapshot.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_session_state.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_session_state_does_not_leak_between_tests.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_share_savings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_signal_fusion.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_size_cap_end_to_end.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_skill_candidates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_skills.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_solidity_declarations.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_source_drift.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_sql_language.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_sqlite_store.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_standard_invariants.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_stdio_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_stop_rule.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_storage.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_storage_path_resolution.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_streamable_http_integration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_streamable_http_sessions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_strict_deny_requires_resolvable_target.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_subprocess_encoding_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_suggest_corrections.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_summarize_from_docstrings.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_summarizer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_surface_cli.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_surface_diff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_surface_offer.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_svelte.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_swift_deinit_is_a_method.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_swift_parser.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_swift_protocol_requirements.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_symbol_complexity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_symbol_diff.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_taskcomplete_real_contract.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tectonic_map.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tectonic_partition_hub.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tectonic_temporal_signal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_telemetry_db_skip.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_templates.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_thresholds_are_the_only_copy.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tier_resolver.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tier_runtime.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tier_switch_cost.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_token_benchmark_floor.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_token_budget_context.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_toml_end_line.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tool_kind_sets_derive_from_kind_order.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tool_registration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tool_surface_clamp.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tools.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_transcript_roots.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tree_id_is_content_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_truncated_flag.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ts_abstract_class.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ts_module_extensions.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_ts_type_only_imports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_tsconfig_walk_cost.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_turn_budget.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_undeclared_table_guard.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_unicode_escapes_name_the_same_identifier.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_unloadable_index_rebuild_disclosure.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_unsettled_verdicts_are_never_terminal.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_usage_question_routes_to_usage_tool.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_0.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_101.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_102.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_103.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_104.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_105.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_106.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_107.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_108.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_110.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_114.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_115.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_118.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_119.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_120.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_121.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_122.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_125.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_126.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_127.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_128.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_129.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_134.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_136.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_137.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_139.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_146.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_147.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_148.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_149.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_150.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_151.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_152.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_153.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_156.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_158.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_159.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_160.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_161.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_162.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_163.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_164.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_165.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_166.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_167.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_168.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_169.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_171.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_172.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_173.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_174.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_175.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_176.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_177.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_178.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_179.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_180.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_181.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_182.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_183.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_184.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_185.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_186.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_187.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_188.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_189.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_190.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_191.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_192.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_193.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_194.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_199.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_2.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_200.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_201.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_206.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_207.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_208.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_209.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_210.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_211.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_223.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_224.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_225.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_226.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_227.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_228.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_229.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_230.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_231.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_234.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_269.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_270.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_271.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_272.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_273.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_275.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_276.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_277.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_281.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_55.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_56.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_57.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_58.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_59.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_63.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_64.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_70.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_71.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_72.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_73.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_74.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_78.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_80.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_81.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_83.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_84.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_85.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_86.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_92.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_95.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_108_99.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_80_10_dead_code_intra_file_calls.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_80_7_dead_code_js_reexports.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_v1_80_9_lodash_class.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_verdict_coverage_calibration.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_version_check.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_vue_svelte_comment_lookup_is_linear.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watch_all.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watch_claude.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watch_once.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_dynamic.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_hash_delta.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_knob_parity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_lock.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_memory_cache.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_polling_default.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_registration_indexing.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_root_removed_during_a_poll.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_serve.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_watcher_symlink_safety.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_weekly_results_pr_once.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_weight_tuning.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_whatsnew.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_winnow_symbols.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_workflow_commit_identity.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_workflow_hooks.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_workflows_pinned.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_workflows_registered.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_worktree_identity_resolves_its_own_index.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_yaml_byte_extent.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_yaml_key_coercion.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_yaml_language.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_yaml_line_location.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/tests/test_zig_powershell_matlab_members_are_owned.py +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/.gitignore +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/.vscodeignore +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/README.md +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/package-lock.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/package.json +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/src/extension.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/src/riskGutter.ts +0 -0
- {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/vscode-extension/tsconfig.json +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "jcodemunch",
|
|
4
4
|
"displayName": "jCodeMunch",
|
|
5
|
-
"version": "1.108.
|
|
5
|
+
"version": "1.108.334",
|
|
6
6
|
"description": "Token-efficient MCP server for source code exploration via tree-sitter AST parsing",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "J. Gravelle",
|
|
@@ -2,6 +2,124 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.108.334] - 2026-10-08 - a semantic search writes no vector of a second model
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **A semantic search no longer writes a second model's vectors into the store (LEDGER
|
|
10
|
+
L-121).** `search_symbols` with `semantic=true` embeds every symbol that has no vector and
|
|
11
|
+
writes it. `embed_repo` has compared the stored model with the active one since #500; the
|
|
12
|
+
search, the other of the two vector writers, compared nothing. So after a change of embedding
|
|
13
|
+
model, one semantic search on a repo with a new symbol wrote that symbol at the new width
|
|
14
|
+
beside the old vectors (`evidence/l121_before_after.txt`, a mocked provider: five vectors at
|
|
15
|
+
width 8, then `{4: 1, 8: 5}`). The matrix keeps the first width and drops the rest, so the
|
|
16
|
+
new symbol read as missing on every later search and each one called the provider for it
|
|
17
|
+
again (two calls per search in that file, the query and the symbol).
|
|
18
|
+
The rule now has one home, `stale_reason` in `storage/embedding_store.py`, and both writers
|
|
19
|
+
ask it. It covers a changed model, a changed task type, and vectors with no metadata; an
|
|
20
|
+
unknown stored model is still not a change, and there the width decides. On a reason the
|
|
21
|
+
search does not rebuild: a search is a read, and two clients on one store with different
|
|
22
|
+
providers would re-embed the whole repo on every search from the other. It writes nothing,
|
|
23
|
+
calls the provider for nothing, ranks without the semantic channel, and says so in the
|
|
24
|
+
response body as `semantic_store_mismatch` (`reason`, `stored_model`, `active_model`,
|
|
25
|
+
`remedy`), with `channels.semantic: "unavailable"` in the verdict. `semantic_only` returns
|
|
26
|
+
no row there. Where the stored model is unknown and only the width differs, the reason is
|
|
27
|
+
`embedding_dimension_mismatch` with `stored_dimension` and `active_dimension`; the provider
|
|
28
|
+
is called once there, for the query, and its width is compared with the width of the stored
|
|
29
|
+
vectors themselves. `embed_repo` rebuilds, as before, and the next search scores again.
|
|
30
|
+
One store changes behaviour on upgrade: vectors with no metadata, which every full re-index
|
|
31
|
+
left before 1.108.331 (#522). A semantic search scored and topped those up; it now answers
|
|
32
|
+
`embedding_metadata_missing` and ranks without the semantic channel until `embed_repo` runs,
|
|
33
|
+
which re-embeds the repo.
|
|
34
|
+
The rule reads what is recorded about the vectors, so the record no longer outlives them:
|
|
35
|
+
`EmbeddingStore.clear()` removes the dimension, model and task type with the vectors, and a
|
|
36
|
+
writer that finds a record beside no vectors removes it with a statement that cannot delete
|
|
37
|
+
a vector. Before, a rebuild whose every batch failed left an empty store named for the old
|
|
38
|
+
model, and the retry wrote the new model's vectors under that name and reported
|
|
39
|
+
`embedding_dimension` from the old one.
|
|
40
|
+
Each writer decides its write from a reading taken over the connection it writes with.
|
|
41
|
+
`embed_repo` reads once, and that reading decides both the rebuild and what it reports. The
|
|
42
|
+
search reads again at its write, after its provider calls, so a store another client rebuilt
|
|
43
|
+
in between is left alone. The read-only reading the search starts from sees nothing under a
|
|
44
|
+
storage path that holds `#` (LEDGER L-137); there the search learns of a changed model only
|
|
45
|
+
at the write, after it has called the provider, and still writes nothing.
|
|
46
|
+
A test scans `src/` and fails on a function that calls `set_many` without asking
|
|
47
|
+
(`tests/test_semantic_topup_checks_the_stored_model.py`).
|
|
48
|
+
Not changed: the fusion exit (`fusion=true`) still scores a query from the active model
|
|
49
|
+
against a stored model's vectors (LEDGER L-135), and `embed_repo` without `force` on a store
|
|
50
|
+
whose model is unknown still writes a new width beside the old one (LEDGER L-136).
|
|
51
|
+
|
|
52
|
+
## [1.108.333] - 2026-10-07 - the parse budget stops a slow parse again on a fresh install
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- **`init`'s index line reports what the indexer did (reported by Dave).** After indexing,
|
|
57
|
+
`jcodemunch-mcp init` printed `indexed <folder> (? files, ? symbols)`. The line read
|
|
58
|
+
`files_indexed` and `symbols_indexed` from the indexer's result. No run returns the second,
|
|
59
|
+
and only a run cut short by the file cap returns the first. A full index answers `file_count` and `symbol_count`, a run that
|
|
60
|
+
re-indexes some files answers `changed`, `new`, `deleted` and `symbol_count`. So the line has
|
|
61
|
+
read `? symbols` for every index `init` ran since the command arrived (2026-04-03), and
|
|
62
|
+
`? files` for all but a capped one. It also
|
|
63
|
+
read `indexed` for a run the indexer had refused, a folder with no source file among them.
|
|
64
|
+
The line now has one form per answer (`evidence/init_index_line.txt`, the real indexer on a
|
|
65
|
+
scratch project): `indexed <folder> (2 files, 3 symbols)`,
|
|
66
|
+
`indexed <folder> (1 changed, 1 new, 1 deleted, 3 symbols)`,
|
|
67
|
+
`<folder> is up to date (nothing changed since the last index)`, and
|
|
68
|
+
`indexing failed: No source files found`. A count the result does not carry is left out, and
|
|
69
|
+
a run the file cap cut short adds `the file cap was reached, 2 of 4 files are in the index` to
|
|
70
|
+
whichever form it has.
|
|
71
|
+
Nothing had tested the line: the `init` tests replace the function that writes it. The new
|
|
72
|
+
tests run the real indexer on a project they own
|
|
73
|
+
(`tests/test_init_index_summary_reads_the_indexers_result.py`). The index itself was correct.
|
|
74
|
+
Not changed: the indexer's `warnings` (a file skipped by the parse budget, a provider skipped)
|
|
75
|
+
are still not printed by `init`. A test that reads the same absent key is LEDGER L-134.
|
|
76
|
+
|
|
77
|
+
- **Three more ways a macro got the wrong docstring (LEDGER L-129, L-130, L-131).** 1.108.332
|
|
78
|
+
gave a dbt or Jinja/Twig directive the `{# comment #}` that ends directly above it; its
|
|
79
|
+
review found three inputs the rule still read wrongly, measured through `parse_file` on
|
|
80
|
+
1.108.332 and then on the fix (`evidence/l129_l131_before_after.txt`). A comment that TRAILS
|
|
81
|
+
code on its line was taken by the directive on the next line: after
|
|
82
|
+
`{% macro a() %}select 1{% endmacro %} {# end of a #}`, `b` read `end of a` and reads nothing.
|
|
83
|
+
The comment must now be first on its line, with only other comments (or a `--` lead) before it
|
|
84
|
+
there. A `{#`
|
|
85
|
+
inside an expression opened a comment: with `{{ '{#' }}` in the macro above, `second` read
|
|
86
|
+
`' }}{% endmacro %}` and the line after it, and reads `about second`. The file is read as
|
|
87
|
+
Jinja reads it, `{{ ... }}`, `{% ... %}` and `{# ... #}` left to right, each to its first
|
|
88
|
+
closer. And a whitespace-control mark was dropped whatever the dialect: `{#~approx 5 rows#}`
|
|
89
|
+
in a `.sql` read `approx 5 rows` and reads `~approx 5 rows`; `{#+1 to the offset #}` in a
|
|
90
|
+
`.twig` read `1 to the offset` and reads `+1 to the offset`. `-` is a mark everywhere, `+` in
|
|
91
|
+
Jinja and dbt, `~` in Twig. Nothing inside `{% raw %}` or `{% verbatim %}` is a delimiter, and
|
|
92
|
+
a byte-order mark or a zero-width space before a comment is not text, so a file that starts
|
|
93
|
+
with a BOM keeps its first docstring. ⚠ The docstring changes on unchanged content, so
|
|
94
|
+
`PARSER_GENERATION` is 11 and an existing index re-parses once at its next index run; no
|
|
95
|
+
symbol id moves. ⚠ What reads WORSE than on 1.108.332 (LEDGER L-132, same evidence file):
|
|
96
|
+
a stray `{{` or `{%` outside a raw block that has a later closer is one expression up to that
|
|
97
|
+
closer, so `-- wrap in {{ to call` above a documented macro, with a `{{ x }}` further down,
|
|
98
|
+
costs that macro its docstring (`doc` before, nothing now); Jinja itself refuses such a file.
|
|
99
|
+
A closer inside a string in an expression (`{{ '}}' }}`) still ends the expression there, and
|
|
100
|
+
when the leftover holds an opener (`{{ '}} {%' }}`) the documented macro below it loses its
|
|
101
|
+
docstring too.
|
|
102
|
+
Not run: a dbt, Jinja or Twig corpus.
|
|
103
|
+
|
|
104
|
+
- **The parse budget stops a slow parse again on a fresh install (reported by Dave).** The
|
|
105
|
+
per-file budget (`JCODEMUNCH_PARSE_BUDGET_SECONDS`, 1.108.329) stops tree-sitter's C parse
|
|
106
|
+
through `Parser.timeout_micros`. tree-sitter 0.26.0 removed that attribute, and the
|
|
107
|
+
dependency read `tree-sitter>=0.25` with no upper bound, so an install that resolved 0.26.0
|
|
108
|
+
could no longer stop a parse. Its only sign was one line at index time: `the installed
|
|
109
|
+
tree-sitter has no Parser.timeout_micros`. Measured with this tree's source and a 0.5 s budget
|
|
110
|
+
on a 405,035-byte Python file (`evidence/tree_sitter_026.txt`): on tree-sitter 0.25.2 the file
|
|
111
|
+
is stopped after 0.54 s; on 0.26.0 after 7.06 s, when the parse had run to its end. Through
|
|
112
|
+
`index_folder` the file is named as skipped on both (`parse exceeded the 0.5s budget`), so no
|
|
113
|
+
wrong symbol was served; the time was spent. CI never saw
|
|
114
|
+
it: it installs from `uv.lock`, which pins 0.25.2, and the guard that fails on a binding
|
|
115
|
+
without the attribute runs there. The range is now `>=0.25,<0.26`, so an upgrade moves such an
|
|
116
|
+
install back to a version that can stop a parse, and
|
|
117
|
+
`tests/test_tree_sitter_range_is_the_tested_range.py` fails when the declared range admits any
|
|
118
|
+
release past the locked minor, an exclusion such as `!=0.26.0` included. The warning now names
|
|
119
|
+
the remedy. Not changed: tree-sitter
|
|
120
|
+
0.26 is not supported; its replacement for the timeout, a progress callback, crashed the
|
|
121
|
+
interpreter when it was tried on 0.25.2 (LEDGER L-133).
|
|
122
|
+
|
|
5
123
|
## [1.108.332] - 2026-10-07 - a macro's docstring is the comment directly above it
|
|
6
124
|
|
|
7
125
|
### Fixed
|
|
@@ -2228,3 +2228,31 @@ The 1.108.331 entry, verbatim, dropped when it was compressed to a `Prior` line:
|
|
|
2228
2228
|
The `Tests:` line's 1.108.329 count, verbatim:
|
|
2229
2229
|
|
|
2230
2230
|
- ⚠ Prior (1.108.329): 14726 passed, 25 skipped, **0 failed** (14751 total).
|
|
2231
|
+
|
|
2232
|
+
## Current State rotation (2026-10-07, release 1.108.333)
|
|
2233
|
+
|
|
2234
|
+
The 1.108.330 entry, verbatim as it stood in `CLAUDE.md`:
|
|
2235
|
+
|
|
2236
|
+
- **Prior (1.108.330):** **The parse budget bounds a file's Python-side time** (L-116): `parse_budget.checkpoint()` raises inside `parse_file` once the file's deadline has passed, and every loop on the parse path starts with one (rules: the Env Vars row; residue L-117, L-118). Also a bare Python module name resolves to the script directory beside the importer (#972, @whakomatic; L-120). Full text: `CHANGELOG.md`; verbatim in `ISSUE-HISTORY.md` (2026-10-06, release 1.108.331).
|
|
2237
|
+
|
|
2238
|
+
The 1.108.332 entry, verbatim, dropped when it was compressed to a `Prior` line:
|
|
2239
|
+
|
|
2240
|
+
- **Version:** 1.108.332 — **A macro's docstring is the comment directly above it** (L-126): `_PrecedingComments` (`parser/sql_preprocessor.py`) gives a dbt or Jinja/Twig directive the `{# #}` that ENDS where the text before it ends, less one whitespace-control mark per side. ⚠ `PARSER_GENERATION` is 10: a stored docstring moved on unchanged content. ⚠ Residue, each owing its own generation: L-129, L-130, L-131. Also three loops on the parse path are linear in the file (L-117; residue L-127, L-128). Forensics: `CHANGELOG.md`, `docs/workflows/LEDGER.md`.
|
|
2241
|
+
|
|
2242
|
+
The `Tests:` line's 1.108.330 count, verbatim:
|
|
2243
|
+
|
|
2244
|
+
- ⚠ Prior (1.108.330): 14783 passed, 25 skipped, **0 failed** (14808 total).
|
|
2245
|
+
|
|
2246
|
+
## Current State rotation (2026-10-08, release 1.108.334)
|
|
2247
|
+
|
|
2248
|
+
The 1.108.331 entry, verbatim as it stood in `CLAUDE.md`:
|
|
2249
|
+
|
|
2250
|
+
- **Prior (1.108.331):** **A full re-index keeps the embedding metadata beside its vectors** (#522, @lsg1103275794): `save_index` leaves the `meta` keys under `embedding_store.META_KEY_PREFIX`. ⚠ `embed_repo` after a full re-index re-embeds everything only on `force=true` (residue L-121, L-122). Also its task-type gate has THREE states (#523): `None` is never recorded and is not a change, `""` is a recorded value, and vectors with no embedding metadata are still rebuilt, named by `rebuild_reason`. Full text: `CHANGELOG.md`; verbatim in `ISSUE-HISTORY.md` (2026-10-07, release 1.108.332).
|
|
2251
|
+
|
|
2252
|
+
The 1.108.333 entry, verbatim, dropped when it was compressed to a `Prior` line:
|
|
2253
|
+
|
|
2254
|
+
- **Version:** 1.108.333 — **The parse budget stops a slow parse again on a fresh install** (reported by Dave): `pyproject.toml` declares `tree-sitter>=0.25,<0.26`. ⚠⚠ **The range stops at the minor `uv.lock` pins, and `tests/test_tree_sitter_range_is_the_tested_range.py` fails when it admits a later one**: tree-sitter 0.26.0 removed `Parser.timeout_micros`, CI installs from the lock, and a user installs from the range, so the cancel guard never ran on what users got. Moving to a later tree-sitter means moving the lock first (0.26 is unsupported, L-133); the lock's `requires-dist` line is edited by hand with it. Also `init`'s index line reads the keys `index_folder` returns (`cli/init.py` `_index_summary`; it printed `? files, ? symbols`; residue L-134), and three more inputs gave a macro the wrong docstring (L-129, L-130, L-131; residue L-132). ⚠ `PARSER_GENERATION` is 11. Forensics: `CHANGELOG.md`, `docs/workflows/LEDGER.md`.
|
|
2255
|
+
|
|
2256
|
+
The `Tests:` line's 1.108.331 count, verbatim:
|
|
2257
|
+
|
|
2258
|
+
- ⚠ Prior (1.108.331): 14800 passed, 25 skipped, **0 failed** (14825 total).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: jcodemunch-mcp
|
|
3
|
-
Version: 1.108.
|
|
3
|
+
Version: 1.108.334
|
|
4
4
|
Summary: Token-efficient MCP server for source code exploration via tree-sitter AST parsing
|
|
5
5
|
Project-URL: Homepage, https://github.com/jgravelle/jcodemunch-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/jgravelle/jcodemunch-mcp
|
|
@@ -27,7 +27,7 @@ Requires-Dist: pathspec>=0.12.0
|
|
|
27
27
|
Requires-Dist: pyyaml>=6.0
|
|
28
28
|
Requires-Dist: tree-sitter-fsharp==0.3.12
|
|
29
29
|
Requires-Dist: tree-sitter-language-pack<1.0.0,>=0.7.0
|
|
30
|
-
Requires-Dist: tree-sitter
|
|
30
|
+
Requires-Dist: tree-sitter<0.26,>=0.25
|
|
31
31
|
Provides-Extra: all
|
|
32
32
|
Requires-Dist: anthropic>=0.40.0; extra == 'all'
|
|
33
33
|
Requires-Dist: anyio>=4.14.2; extra == 'all'
|
|
@@ -246,10 +246,10 @@ That's the highlight reel. The complete tour of 90+ tools, the MUNCH compact wir
|
|
|
246
246
|
<!-- WHATSNEW:START -->
|
|
247
247
|
#### What's new
|
|
248
248
|
|
|
249
|
+
- **[v1.108.334](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.334)** (2026-10-08) — a semantic search writes no vector of a second model
|
|
250
|
+
- **[v1.108.333](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.333)** (2026-10-07) — the parse budget stops a slow parse again on a fresh install
|
|
249
251
|
- **[v1.108.332](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.332)** (2026-10-07) — a macro's docstring is the comment directly above it
|
|
250
252
|
- **[v1.108.331](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.331)** (2026-10-06) — a full re-index keeps the embedding metadata beside its vectors
|
|
251
|
-
- **[v1.108.330](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.330)** (2026-10-06) — the parse budget bounds a file's Python-side time
|
|
252
|
-
- **[v1.108.329](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.329)** (2026-10-05) — the parse budget stops a slow parse
|
|
253
253
|
<!-- WHATSNEW:END -->
|
|
254
254
|
|
|
255
255
|
---
|
|
@@ -158,10 +158,10 @@ That's the highlight reel. The complete tour of 90+ tools, the MUNCH compact wir
|
|
|
158
158
|
<!-- WHATSNEW:START -->
|
|
159
159
|
#### What's new
|
|
160
160
|
|
|
161
|
+
- **[v1.108.334](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.334)** (2026-10-08) — a semantic search writes no vector of a second model
|
|
162
|
+
- **[v1.108.333](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.333)** (2026-10-07) — the parse budget stops a slow parse again on a fresh install
|
|
161
163
|
- **[v1.108.332](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.332)** (2026-10-07) — a macro's docstring is the comment directly above it
|
|
162
164
|
- **[v1.108.331](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.331)** (2026-10-06) — a full re-index keeps the embedding metadata beside its vectors
|
|
163
|
-
- **[v1.108.330](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.330)** (2026-10-06) — the parse budget bounds a file's Python-side time
|
|
164
|
-
- **[v1.108.329](https://github.com/jgravelle/jcodemunch-mcp/releases/tag/v1.108.329)** (2026-10-05) — the parse budget stops a slow parse
|
|
165
165
|
<!-- WHATSNEW:END -->
|
|
166
166
|
|
|
167
167
|
---
|
|
@@ -39,7 +39,7 @@ reason could not be found it was marked UNCLEAR, not LOAD-BEARING.
|
|
|
39
39
|
### Scars worth naming (odd inputs that are wounds)
|
|
40
40
|
|
|
41
41
|
- `tests/test_server.py` pins `len(tools) == 90` as a literal while the live `full` profile serves 91; its docstring says `test_summarizer` is disabled by default. A literal count is a second copy of the surface; flagged for the coverage map, not changed.
|
|
42
|
-
- `tests/test_suggest_queries.py` empty-index case
|
|
42
|
+
- `tests/test_suggest_queries.py` empty-index case was conditional and passed vacuously until 2026-10-07 (LEDGER L-134): its fixture, a lone `README.md`, is refused by the indexer, and its `if` read a key the indexer does not return. It indexes a source file with no symbol now and asserts unconditionally.
|
|
43
43
|
- `tests/test_nesting_depth_channels.py` scans for a stray 0x08 BACKSPACE byte because one once replaced a backslash in a regex and compiled.
|
|
44
44
|
- `tests/test_v1_108_84.py` carries a real reporter's macOS path as the INPUT; the path is the defect's shape (#357), not an environment leak.
|
|
45
45
|
- `tests/test_watcher_serve.py` uses a literal Windows system path as a MOCKED fixture because #447 wrote a real file into a real system directory once.
|
|
@@ -186,6 +186,7 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
|
|
|
186
186
|
| tests/test_embed_task_type_gate.py | `embed_repo`'s task-type gate tells three states apart: a recorded and different task type rebuilds (including a toggle from the recorded empty string), an absent row beside a recorded dimension is unknown and re-embeds nothing, and vectors with no embedding metadata at all are rebuilt with `rebuild_reason: embedding_metadata_missing`; and embed, full re-index, embed again embeds only the new symbol (the #522 pair). | "fix: embed_repo treats a never-recorded task type as unknown, not as a change (#523)" | 3 | LOAD-BEARING | Mocks `embed_texts` and the provider resolver only; each reintroduced defect in `evidence/f523_mutants.txt` fails a test; the pair test guards #522's fix, not this gate |
|
|
187
187
|
| tests/test_embedding_model_change.py | `embed_repo` detects a stored-model change and rebuilds instead of mixing vector widths; the exclusion count is reported. | 57d19ab "fix(embed): detect a model change instead of mixing vector widths (#500)"; c8dd085 (#488) | 3 | LOAD-BEARING | Patches `_detect_provider` through its shared source |
|
|
188
188
|
| tests/test_full_save_keeps_embedding_meta.py | A full `save_index` keeps the embedding store's `meta` rows (`embed_dimension`, `embed_model`, `embed_task_type`) beside the vectors it also keeps, and still removes an index key the new index does not write and a key that only resembles the prefix. | "fix: a full re-index keeps the embedding metadata beside the vectors it describes (#522)" | 3 | LOAD-BEARING | Reads the `_EMBED_*_KEY` names off `embedding_store`; the end-to-end half (embed, full re-index, model change) is in `tests/test_embedding_model_change.py` |
|
|
189
|
+
| tests/test_semantic_topup_checks_the_stored_model.py | A semantic `search_symbols` asks what built the stored vectors before its top-up writes: on a changed model, a changed task type or vectors with no metadata it writes nothing, calls the provider for nothing, and returns `semantic_store_mismatch`; on a width other than the stored vectors' it calls the provider for the query only and returns the same field; the same model and an unknown model at the same width still top up; a store with no vectors has no stamp (`clear()` removes it, and a writer removes one left behind without `clear()`); each writer decides its write from a reading over its write connection, tested on a real storage path holding `#` and on a store rebuilt by another client during the top-up. | "fix: a semantic search writes no vector of a second model (LEDGER L-121)" | 3 | LOAD-BEARING | The #500 guard drove `embed_repo` only, one of two callers of `set_many`; an AST scan of `src/` fails on a caller that does not call `stale_reason`. `read_meta` is asserted not to move the .db or its sidecars |
|
|
189
190
|
| tests/test_embedding_provider_advice.py | All three provider-advice sites (embed_repo error, `semantic` param description, search_symbols no-provider error) name the bundled ONNX encoder from one shared message. | 6a43655 "fix(embeddings): one source for provider advice, bundled encoder first (#489)" | 4 | LOAD-BEARING | Source ratchet via `inspect.getsource` asserting the old literal is absent and `NO_PROVIDER_MESSAGE` is used |
|
|
190
191
|
| tests/test_endpoint_impact.py | `get_endpoint_impact` resolves verb+path to handlers from decorator (Flask) and string-dispatch (Django) routes and returns their blast radius. | bdebb63 "v1.108.90 — new tool: get_endpoint_impact" | 1 | LOAD-BEARING | Builds real fixture repos via index_folder |
|
|
191
192
|
| tests/test_endpoint_infra_impact.py | `include_infra=True` on get_endpoint_impact fuses `collect_project_intel` cross-refs and upstream `exposes[]` into the endpoint result. | 789aa12 "v1.108.91 — endpoint-scoped infrastructure links"; 8417eca "v1.108.93: upstream exposes[]" | 1 | LOAD-BEARING | Cites docs/prd-endpoint-infra-impact.md P1; 19 tests |
|
|
@@ -248,6 +249,7 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
|
|
|
248
249
|
| tests/test_init.py | `init` client detection, `_patch_mcp_config` backup/merge, CLAUDE.md/Cursor/Windsurf installs, hooks install, audit, and the client registry incl. Codex/opencode. | `e176e7a v1.21.26 Cursor/Windsurf rules + --demo`; `8c6f85b v1.108.35 fix CI-only break`; `c0a82da feat(init): register Codex CLI and opencode` | 6 | LOAD-BEARING | 44 tests; the largest init surface; per-client schema shapes are in test_init_client_schemas.py. |
|
|
249
250
|
| tests/test_init_client_schemas.py | Each host gets its own config shape (Codex TOML with resolved binary and never `uvx`, opencode `mcp` array command, VS Code `servers`, Gemini/Cline detection). | `c0a82da feat(init): register Codex CLI and opencode, each on its own schema`; `8c7a6d8 feat(init): register Gemini CLI, Cline and VS Code/Copilot` | 6 | LOAD-BEARING | Docstring: a wrong schema produces no error (silent no-tools); cites CLIENTS.md multi-hour hang. |
|
|
250
251
|
| tests/test_init_hooks_paths.py | Hook commands are written with forward slashes on Windows (bash eats backslashes) and re-running `init` never appends duplicate hooks (subcommand-keyed dedupe). | `105e5a1 fix: Windows hook path bash-escape eating + duplicate hook accumulation (v1.108.7)`; `9b375cd fix(hooks): ten confirmed defects` | 6 | LOAD-BEARING | Patches `_hook_invocation` to return literal `C:\Python314\...` and `C:\Program Files\...` paths (intentional inputs). |
|
|
252
|
+
| tests/test_init_index_summary_reads_the_indexers_result.py | `init`'s index line reports what `index_folder` returned: files and symbols for a full index, changed/new/deleted and symbols for a run that re-indexed some files, `up to date` when nothing changed, `indexing failed` with the indexer's error for a refusal, and how many files the index holds when the file cap cut the walk short; never `?`, and no count the result lacks. | "fix: init's index line reads the keys the indexer returns" (a user report by email, 2026-10-07) | 6 | LOAD-BEARING | Five cases run the REAL indexer in a project and a store the test owns: the line read `symbols_indexed`, which no run returns, and `files_indexed`, which only a capped run returns, and the only tests near it (`test_init_minimal.py`, `test_init_policy_matches_surface.py`) replace `run_index` whole, so a mock would supply whichever keys its author expected. |
|
|
251
253
|
| tests/test_init_minimal.py | `init --minimal` registers the MCP server and touches no other channel (no CLAUDE.md, rules, AGENTS.md, hooks, index, audit). | `aa4cb54 release: v1.108.22 — ... init --minimal ...`; `e3663c5 test: retire the src.jcodemunch_mcp package twin` | 6 | LOAD-BEARING | 3 tests, spies on every helper. |
|
|
252
254
|
| tests/test_init_policy_matches_surface.py | The policy `init` writes names only tools the advertised surface carries — after `load_config`, honouring `tool_surface` and profile — and `--minimal --hooks` installs hooks (#397). | `d7e3b17 release: v1.108.206 - init wrote a policy for a decision it had not made yet`; `054755d (#507)`; `9cf763e refactor: break three import cycles` | 4 | LOAD-BEARING | Header warns patches must target `cli.policy`, not `init` re-exports (monkeypatch trap). |
|
|
253
255
|
| tests/test_install_copilot_hooks.py | `init --copilot-hooks` writes `.github/hooks/hooks.json` with one postToolUse rule keyed by subcommand, idempotently. | `aede3b2 release: v1.81.0 — VS Code extension, Copilot hooks`; `1650270 test(hooks): assert the Copilot rule by subcommand, not by bare-name substring` | 6 | LOAD-BEARING | Asserts outcome not string shape (Windows `.EXE` absolute path). |
|
|
@@ -351,9 +353,10 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
|
|
|
351
353
|
| tests/test_paid_embeddings_optin.py | `_detect_provider` never selects a paid cloud embedding provider from an API key alone -- the explicit `*_EMBED_MODEL` is the opt-in and the local ONNX encoder wins at priority 0. | `2971bb2 test: pin that a bare cloud key cannot select a paid embedding provider`; docstring: suite-parity check for a jdocmunch defect, deliberately NOT a port of its gate | 8 | LOAD-BEARING | Pins a property jcm already had so a "simplification" cannot remove it; env-only, no network. |
|
|
352
354
|
| tests/test_parity_map.py | `get_parity_map` classifies ported/renamed/diverged/added/orphaned symbols across two scopes, computes `parity_pct`, orders the port plan topologically with SCC grouping, errors on same scope/unindexed/empty, and is read-only. | `07bbb0c get_parity_map: correspondence-aware migration parity map (v1.108.111)`; docstring | 1 | LOAD-BEARING | Fixture is a legacy/ vs v2/ tree with commented expected outcomes per symbol. |
|
|
353
355
|
| tests/test_parse_budget_cancels.py | An over-budget tree-sitter parse is stopped at `JCODEMUNCH_PARSE_BUDGET_SECONDS` and the file is named in `warnings`, on `parse_file`, a full index and an incremental re-index, at any file size; a stop is recognised without a clock; another thread's time is not charged to the file; a first index starts no wait thread; the installed binding can still cancel a parse. | LEDGER L-114 (2026-10-04): the thread wait could not return while the parse held the GIL | 5 | LOAD-BEARING | The slow input is L-113's shape; each cancelled case costs its 0.25 s budget. The fake-parser cases pin both directions of the stop rule and the expired-deadline branch (review rounds found mutants that passed an earlier form). `test_a_first_index_leaves_no_thread_behind` predates L-116's fix and still holds; every route is in `tests/test_parse_budget_python_side.py`. `OLD_WAIT_GATE` is the retired wait's 128 KiB threshold, kept as a fixture boundary. The binding canary fails when `Parser.timeout_micros` is gone |
|
|
356
|
+
| tests/test_tree_sitter_range_is_the_tested_range.py | The `tree-sitter` range `pyproject.toml` declares admits the version `uv.lock` pins, admits no version of a later minor or major over a grid of them (so an exclusion such as `!=0.26.0` fails, twelve spellings pinned), refuses 0.26.0 by name, and equals the range the lock records; the requirement is read from the parsed TOML, every extra and dependency group included. | "fix: the tree-sitter range stops at the locked minor, so the parse budget can stop a parse" (a user report by email, 2026-10-07) | 7 | LOAD-BEARING | CI installs from the lock and a user installs from the range, so a guard that runs on the installed binding (`test_parse_budget_cancels.py`) says nothing about what a user gets. This reads the two files as text and compares them. Raising the cap means moving the lock in the same change; do not widen the range to make this pass. |
|
|
354
357
|
| tests/test_parse_budget_python_side.py | A file's Python-side work is stopped at `JCODEMUNCH_PARSE_BUDGET_SECONDS` in the parsing thread and the file is named: the generic walker, dedicated parsers, a regex language, seven walkers on a tree that builds no symbol, and three quadratic loops that are no recursion. Over the source: every `for`/`while` in the six parse-path modules starts with a checkpoint (three named exemptions), no recursion lacks one, every module of `parser/` is classified. Also: a parser that swallows the stop builds nothing more; a parser-side stop raises at the next checkpoint; a file that ends past its deadline with no checkpoint having seen it is named; time the thread did not spend is not charged; a first index and a re-index name the same file the same way; every file is parsed on the calling thread; no clock is read outside a file or with the budget off. | LEDGER L-116 (2026-10-05): the thread wait was wall-clock, skipped one route and left its worker running | 5 | LOAD-BEARING | The clock is the test's: the deadline passes 5.5 s into a 5 s budget when the file's C parse returns, so nothing depends on a slow fixture and a far-over-only stop fails. ⚠ A new loop on the parse path fails the scan until its first statement is `parse_budget.checkpoint()`; do NOT add it to the exemption table to pass (each entry there has its reason beside it). A new module in `parser/` must be put on or off the path. The scans see statements, not a comprehension, a loop's iterable or one slow call (L-118) |
|
|
355
|
-
| tests/test_parse_path_loops_are_linear.py | Three loops on the parse path are linear in the file: attributing calls to their enclosing symbol, the Razor `@code {` brace scan, and the dbt/Jinja directive loop. Each fix returns what the implementation it replaced returns (kept in the file as an oracle) on seeded generated input (since L-126 a directive's docstring is the one exception: the old loop's docstring was that defect, so the field is held to the rule, written the slow way beside the oracle), finishes a file twice as big before the oracle finishes the small one, and where `parse_budget.checkpoint()` sees the loop, passes under 2.6 times the checkpoints for twice the file. The Razor scan searches under 2.6 times the characters for twice the blocks when each opens an unclosed comment; the directive loop copies or searches under 2.6 times the characters for twice the directives; the call sweep raises under 2.6 times the line events for twice the calls. No module of `parser/` counts newlines up to an offset (`_line_numbers` is the one table), and that scan sees both spellings. Also: a call inside two symbols goes to the inner one; a brace in a string or a comment does not close a block; a macro keeps its line, its end and its `--` comment. | "fix: three loops on the parse path take time proportional to the file (LEDGER L-117)" | 5 | LOAD-BEARING | The race is against the oracle on the same machine in the same test, never against a typed number of seconds. A count of checkpoints is blind to work inside one C call (a slice, a `count`, a regex search), which is why the race is there too. The race is blind to a rescan cheaper than the old loop (a copy of the file per directive wins it), which is why the character and line-event counts are there: a new loop on these paths needs a count that can see its work, not only a race. The race is at TWICE the size, not more: coverage's C tracer (the 3.10 and 3.11 jobs) slows the fix and not the oracle, and at eight times the size the fix lost. Before changing a size, read the margins with the tracer on. The oracles are the old code and must not be edited to agree with a change. |
|
|
356
|
-
| tests/test_a_macro_docstring_is_the_comment_above_it.py | A dbt macro, a Jinja template macro and a Twig macro and block each take the `{# comment #}` that ends directly above them as their docstring, through `parse_file`; the dashes of `{#- ... -#}` are not part of it; a comment elsewhere in the file, a stray `#}`, text that only ends like a comment and an unclosed comment are nobody's docstring; of two comments the nearer one is used; a `--` comment nearer than a Jinja one wins; 300 documented macros each keep their own; `PARSER_GENERATION` is at least
|
|
358
|
+
| tests/test_parse_path_loops_are_linear.py | Three loops on the parse path are linear in the file: attributing calls to their enclosing symbol, the Razor `@code {` brace scan, and the dbt/Jinja directive loop. Each fix returns what the implementation it replaced returns (kept in the file as an oracle) on seeded generated input (since L-126 a directive's docstring is the one exception: the old loop's docstring was that defect, so the field is held to the rule, written the slow way beside the oracle), finishes a file twice as big before the oracle finishes the small one, and where `parse_budget.checkpoint()` sees the loop, passes under 2.6 times the checkpoints for twice the file. The Razor scan searches under 2.6 times the characters for twice the blocks when each opens an unclosed comment; the directive loop copies or searches under 2.6 times the characters, and passes under 2.6 times the checkpoints, for twice the directives, over ten shapes; the call sweep raises under 2.6 times the line events for twice the calls. No module of `parser/` counts newlines up to an offset (`_line_numbers` is the one table), and that scan sees both spellings. Also: a call inside two symbols goes to the inner one; a brace in a string or a comment does not close a block; a macro keeps its line, its end and its `--` comment. | "fix: three loops on the parse path take time proportional to the file (LEDGER L-117)" | 5 | LOAD-BEARING | The race is against the oracle on the same machine in the same test, never against a typed number of seconds. A count of checkpoints is blind to work inside one C call (a slice, a `count`, a regex search), which is why the race is there too. The race is blind to a rescan cheaper than the old loop (a copy of the file per directive wins it), which is why the character and line-event counts are there: a new loop on these paths needs a count that can see its work, not only a race. The race is at TWICE the size, not more: coverage's C tracer (the 3.10 and 3.11 jobs) slows the fix and not the oracle, and at eight times the size the fix lost. Before changing a size, read the margins with the tracer on. The oracles are the old code and must not be edited to agree with a change. |
|
|
359
|
+
| tests/test_a_macro_docstring_is_the_comment_above_it.py | A dbt macro, a Jinja template macro and a Twig macro and block each take the `{# comment #}` that ends directly above them as their docstring, through `parse_file`; the dashes of `{#- ... -#}` are not part of it; a comment that trails code on its line is nobody's, and one after a `--` lead is still the docstring (L-129); a `{#` inside `{{ ... }}` or `{% ... %}` opens no comment (L-130); `+` is a mark in Jinja and dbt and text in Twig, `~` the reverse (L-131); nothing inside `{% raw %}` or `{% verbatim %}` is a delimiter; a file that starts with a byte-order mark keeps its first docstring; one case pins a reading the ledger calls a loss (L-132: a stray `{{` with a later closer), so that a fix has to move it on purpose; a comment elsewhere in the file, a stray `#}`, text that only ends like a comment and an unclosed comment are nobody's docstring; of two comments the nearer one is used; a `--` comment nearer than a Jinja one wins; 300 documented macros each keep their own; `PARSER_GENERATION` is at least 11. | "fix: a macro's docstring is the comment directly above it (LEDGER L-126)" | 1 | LOAD-BEARING | The lookup returned the FIRST comment of the file for any directive under a `#}`, so a one-macro fixture cannot fail on it: every case here has a first comment that is NOT the answer. The generation assertion is a floor, not an equality, so the next bump does not edit this file. |
|
|
357
360
|
| tests/test_parse_cache.py | Content-addressed parse cache is a passthrough when disabled, returns identical symbols on hit, and FIFO-evicts past `DEFAULT_MAX_ROWS`. | `c57b070 release: v1.108.40 -- content-addressed parse cache for shared-host indexing`; `444925e v1.108.41 -- bound the shared parse cache (FIFO eviction)` | 3 | LOAD-BEARING | Env-gated by `JCODEMUNCH_PARSE_CACHE`; compares `dataclasses.asdict` of symbols. |
|
|
358
361
|
| tests/test_parse_warnings.py | `index_folder` reports `missing_extractors` for a language with symbols but no import extractor (Elixir), and `get_dead_code_v2` emits `framework_warning` when no entry points are found. | `b4db152 release: v1.21.19 -- Phase 5 uncertainty disclosure (T15-T18)`; docstring T17/T18 | 9 | LOAD-BEARING | Elixir is the representative gap; if an Elixir import extractor is added this fixture language must change. |
|
|
359
362
|
| tests/test_parser.py | Core `parse_file` extraction for Python plus Lua, JS/TS const constants, and Astro frontmatter/components. | `ac91053 feat: add Lua language support (v1.0.1)`; `c984804 feat: extract JS/TS const declarations as constants`; `d1aa0e5 feat(parser): enhance Astro support ... regression tests` | 1 | LOAD-BEARING | Phase 1 file that accreted language cases; one `read_text` on a fixture. |
|
|
@@ -491,7 +494,7 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
|
|
|
491
494
|
| tests/test_strict_deny_requires_resolvable_target.py | The bash hook's strict deny stays silent on unexpanded shell expansions ($HOME, $B) and drive-letter paths but still denies regex-anchor searches like "foo$". | `0d951fb fix(hooks): a strict deny requires a target the hook can resolve`; docstring #541 | 6 | LOAD-BEARING | Literal `C:/Users/j/x.md` and `/c/Users/j/x.md` params (reporter's paths, inputs only). |
|
|
492
495
|
| tests/test_subprocess_encoding_guard.py | Every text-mode subprocess call in src/ passes encoding=; the known-gap allowlist is empty. | `bf1a543 release: v1.108.232 - git output is decoded as UTF-8, not as cp1252` | 8 | LOAD-BEARING | AST ratchet over src/**/*.py; Windows-only cp1252 failure invisible in CI. |
|
|
493
496
|
| tests/test_suggest_corrections.py | Regret signals are mined from a seeded ranking_events ledger, the no-telemetry path fabricates nothing, and suggest_corrections writes no user file. | `c472c29 release: v1.108.68 - retrieval-regret loop`; `85f3fb6 test: two guards read ambient machine state instead of declaring it` (#437 shape) | 9 | LOAD-BEARING | Patches token_tracker._state per test. |
|
|
494
|
-
| tests/test_suggest_queries.py | suggest_queries errors on unindexed/empty repos and returns suggestions for an indexed one. | `94f9ed2 release: v1.21.18 — Phase 4 test infrastructure (T12/T13/T14)` | 1 | LOAD-BEARING |
|
|
497
|
+
| tests/test_suggest_queries.py | suggest_queries errors on unindexed/empty repos and returns suggestions for an indexed one. | `94f9ed2 release: v1.21.18 — Phase 4 test infrastructure (T12/T13/T14)` | 1 | LOAD-BEARING | The empty-index test indexes a comment-only `.py` (success, 1 file, 0 symbols) and asserts the error unconditionally; until 2026-10-07 it was conditional and never reached its assertion (LEDGER L-134). |
|
|
495
498
|
| tests/test_summarize_from_docstrings.py | summarize_from_docstrings default-on, opt-out falls to signature fallback, per-repo override honoured (IPI defense F-04). | `aa4cb54 release: v1.108.22 — docstring opt-out`; docstring P1.5 | 8 | LOAD-BEARING | Config-gate test. |
|
|
496
499
|
| tests/test_summarizer.py | Docstring extraction, provider detection (paid auto-detect opt-in), Gemini/OpenAI batch summarizers, circuit breaker, timeout and openai_extra_body (#323). | `a04df81 release: v1.108.128 — never auto-bill a paid cloud provider`; `f008def fix: OpenAI summarizer honors the circuit breaker`; #323 | 6 | LOAD-BEARING | Mocks httpx.Client; sets JCODEMUNCH_ALLOW_PAID_SUMMARIES; 900+ lines. |
|
|
497
500
|
| tests/test_surface_cli.py | `jcodemunch-mcp surface` routes correctly, emits the --json receipt shape, and reflects env-selected surface/profile. | `5296846 release: v1.108.154 — surface CLI subcommand` | 4 | LOAD-BEARING | Spawns `python -m jcodemunch_mcp` subprocesses (120s timeout). |
|
|
@@ -169,14 +169,20 @@ with jjg's reason. Keep the row. To promote a row to an issue, set Status to
|
|
|
169
169
|
| L-118 | 2026-10-05, L-116 review round 3 | Three regex calls over a whole file are superlinear on unclosed delimiters, and a regex call cannot be stopped part-way by the parse budget (it passes no checkpoint and holds the interpreter), so the caller waits for it and the file is named afterwards. At a 0.5 s budget (`evidence/l116_one_call_shapes.txt`): a 140,000-byte EJS file of `<% x` lines held its caller 30.90 s (`_EJS_SCRIPTLET_RE.finditer`), a 149,996-byte Astro file of `<!-- x` lines 11.16 s (the comment mask's `sub`), a 150,000-byte dbt `.sql` of `{% x` lines 23.63 s (`JINJA_PATTERN.sub`). The same on 1.108.329 (30.62, 11.21, 23.76 s). With the budget off the time about quadruples per doubling of the file: EJS 0.38, 1.47 and 6.50 s at 15, 30 and 60 KB, Astro 0.13, 0.54 and 2.01 s, dbt 0.29, 1.12 and 4.20 s (the same file's GROWTH lines). 61 `for` statements in the six parse-path modules iterate a `finditer`, `findall`, `split` or `splitlines` call, 57 of them in `extractor.py` (`evidence/l116_regex_iterables.txt`); each such call runs before its loop's checkpoint. Not run: which of those patterns can backtrack; any size above 150 KB. | `src/jcodemunch_mcp/parser/extractor.py` (`_parse_ejs_symbols`, the Astro comment mask); `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`strip_jinja`) | defect | medium | OPEN |
|
|
170
170
|
| L-119 | 2026-10-05, L-116 review round 2 | A Racket file with 12,500 nested parentheses (25,000 bytes) raises `RecursionError` out of `parse_file`, on 1.108.329 and after L-116 (`evidence/l116_one_call_shapes.txt`, first line of each half). The reader in `racket_reader.py` recurses per nesting level. What a user sees was not traced: whether the index names the file as a parse failure or loses it. Not run: the depth at which it starts; other recursive walkers on deeply nested input in other languages. | `src/jcodemunch_mcp/parser/racket_reader.py` | defect | low | OPEN |
|
|
171
171
|
| L-120 | 2026-10-05, review of contributor PR #972 | A bare Python module name is resolved against the importer's script directory since #972 (`resolve_specifier`), and four spellings of the same dependency can still build no edge, so `find_importers` returns nothing for the target and `find_dead_code` can list it. (1) A dotted name through a directory with no `__init__.py`: `from helpers import util` beside a namespace `helpers/` (the branch is gated on a name with no dot; in a repo with no package the dotted form does resolve, through the source-root lookup). (2) A nested test directory importing a module that sits beside a `conftest.py` above it (`tests/unit/test_x.py` importing `tests/helpers.py` by bare name; pytest's rootdir insertion is not modelled). (3) A sibling that exists only as `.pyi`. (4) A real script directory kept inside a package (`pkg/tests/`, `pkg/demos/`): the follow-up commit on #972 refuses a directory with no `__init__.py` under a package at any level, because the same shape is a namespace sub-package where the edge is false (reproduced: `import openai` in `app/llms/openai/common_utils.py` resolved to an unimported `app/llms/openai/openai.py`, and `find_dead_code` then listed no dead file). The reviewer counted the branch's firings in the site-packages of this box's `C:\Program Files\Python310` (37,971 `.py`/`.pyi` files): 112 unguarded, 100 with the standard-library refusal, 47 with a refusal on the parent directory alone (round 1), 39 with the any-level refusal that shipped (round 2). Round 2 classed the 53 that the parent-only refusal drops as 39 plausible script edges and 14 names that are also an installed distribution, and the 8 more that the any-level refusal drops as one self-edge and 7 plausible script edges (`onnx/test/version_converter`, `pythonwin/pywin/Demos/app` and `ocx`). The standard-library refusal reads the SERVER's interpreter, so `distutils` is refused on 3.10 and not on 3.12. Also unmodelled: `-m` from the root, `PYTHONPATH`, and a standard-library name a script directory really does shadow. Not run: any corpus but that site-packages tree and this repo (58 new edges, all kept by both refusals). The counts are the review's probe output, not a file under `evidence/`. | `src/jcodemunch_mcp/parser/imports.py` (`resolve_specifier`) | gap | low | OPEN |
|
|
172
|
-
| L-121 | 2026-10-06, review of the #522 fix | The semantic top-up in `search_symbols` embeds every symbol that has no vector with the CURRENT model and writes it, and compares no stored model first; #500's model-change check lives only in `embed_repo`, the other of the two vector writers. After a model change, one semantic `search_symbols` on a repo with a new symbol leaves vectors of two widths in the store, on the incremental path and after a full re-index alike. Reviewer's probe (mocked provider, not an evidence file): embed with model A at width 8, add a file, re-index, semantic search under model B at width 4, then the store held one width-4 vector beside three width-8 ones. Before #522's fix a full re-index made it worse: the top-up found no stored dimension and stamped the store with model B, after which `embed_repo` answered `cached: True` over the mixed store. With the fix the stored model stays A and the next `embed_repo` rebuilds. `EmbeddingMatrix` takes its width from the first row and drops rows that differ, so the matrix keeps the three OLD vectors and drops the new one, and a query embedded with model B scores against none of them (round 2's probe: `dim=8`, three ids, `skipped=1`, `score_all` of a width-4 query empty): until the next `embed_repo` no symbol gets a similarity score. The dropped symbol also reads as missing on every semantic search, so each search calls the provider for it again (one batch of 1 on the first search and on the second). Not read: per-result scores in the response. Not run: a real provider; the fusion exit. | `src/jcodemunch_mcp/tools/search_symbols.py` (the top-up near `emb_store.set_many`) | defect | medium |
|
|
172
|
+
| L-121 | 2026-10-06, review of the #522 fix | The semantic top-up in `search_symbols` embeds every symbol that has no vector with the CURRENT model and writes it, and compares no stored model first; #500's model-change check lives only in `embed_repo`, the other of the two vector writers. After a model change, one semantic `search_symbols` on a repo with a new symbol leaves vectors of two widths in the store, on the incremental path and after a full re-index alike. Reviewer's probe (mocked provider, not an evidence file): embed with model A at width 8, add a file, re-index, semantic search under model B at width 4, then the store held one width-4 vector beside three width-8 ones. Before #522's fix a full re-index made it worse: the top-up found no stored dimension and stamped the store with model B, after which `embed_repo` answered `cached: True` over the mixed store. With the fix the stored model stays A and the next `embed_repo` rebuilds. `EmbeddingMatrix` takes its width from the first row and drops rows that differ, so the matrix keeps the three OLD vectors and drops the new one, and a query embedded with model B scores against none of them (round 2's probe: `dim=8`, three ids, `skipped=1`, `score_all` of a width-4 query empty): until the next `embed_repo` no symbol gets a similarity score. The dropped symbol also reads as missing on every semantic search, so each search calls the provider for it again (one batch of 1 on the first search and on the second). Not read: per-result scores in the response. Not run: a real provider; the fusion exit. | `src/jcodemunch_mcp/tools/search_symbols.py` (the top-up near `emb_store.set_many`) | defect | medium | FIXED 2026-10-08 (`fix/L-121-semantic-topup-checks-the-stored-model`). The rule moved to `stale_reason` in `storage/embedding_store.py` and both writers ask it; on a reason the search writes nothing, calls the provider for nothing, scores no similarity and returns `semantic_store_mismatch` in the body. It does not rebuild; `embed_repo` does. `evidence/l121_before_after.txt` (mocked provider): on `origin/main` one search under model B left `{4: 1, 8: 5}` and two provider calls per search; on the branch `{8: 5}` and none. `tests/test_semantic_topup_checks_the_stored_model.py` scans `src/` for a `set_many` caller that does not ask; the scan matches a call spelled `set_many`, so a writer that aliases the method passes it. Found by the review and fixed with it: `EmbeddingStore.clear()` kept the dimension, model and task type rows, so a rebuild whose every batch failed left an empty store named for the old model and the retry wrote the new model's vectors under that name; `clear()` removes the rows now, and a writer that finds rows beside no vectors removes them with `drop_orphan_stamp`, one statement that cannot delete a vector. `embed_repo` reads the store once, over its read-write connection, for the rebuild and for what it reports; the search reads again at its write, on a connection of its own, so a rebuild by another client between that reading and the write is still not seen (review round 7, read from the source). The scan for `clear()` callers matches the variable name `emb_store`. Residue: L-135, L-136, L-137. |
|
|
173
173
|
| L-122 | 2026-10-06, review of the #522 fix | `embed_repo` without `force` embeds only symbols that have no vector, keyed by symbol id, so a symbol whose body changed keeps the vector of its old body and a symbol that no longer exists keeps its row: no caller of `EmbeddingStore.delete_many` exists in `src/`. This was already so after an incremental re-index. After a full re-index it was hidden until #522's fix, because the full save erased the `embed_task_type` row and the `task_type` gate (#523) then re-embedded everything. Reviewer's probe (mocked provider): add one file, delete one, rewrite one body, full re-index, `embed_repo` with the same model: 5 symbols embedded and no orphan before the fix, 1 embedded, one orphan row and one stale vector after it, the same as the incremental path gives on both trees. `force=true` rebuilds. Not run: how similarity ranking moves with stale vectors on a real corpus. | `src/jcodemunch_mcp/tools/embed_repo.py`; `src/jcodemunch_mcp/storage/embedding_store.py` | defect | low | OPEN |
|
|
174
174
|
| L-123 | 2026-10-06, CI on PR #980 | `tests/test_v1_108_225.py::TestCachedFreshnessIsRevalidated::test_a_revalidated_hit_does_not_corrupt_later_hits` failed once on `full: test (windows-latest, 3.11)` (run 37464102292, 1 failed of 14812, `a revalidated hit must be reproducible, not a one-shot correction`) and passed when that job was re-run with no change. The other seven matrix jobs of the same run passed, and the test passed in all five local full-tier runs of that branch that day. PR #980 changes which `meta` rows a full save deletes and touches nothing the test exercises (a commit, then two cached `search_symbols` reads of row freshness). The job log shows `assert 'fresh' != 'fresh'` under the failure: the assertion is `first_hit == second_hit != "fresh"`, so the two cached reads AGREED and both said `fresh` after the commit. The hits were reproducible; what failed is that neither read saw the commit, which points at freshness detection after `_commit_edit` (the index's stored HEAD against git's, or a cached HEAD read) and away from the cache write-through the test is named for. Cause not established beyond that. Not run: the test in a loop on a Windows runner. | `tests/test_v1_108_225.py` | flake | low | OPEN |
|
|
175
175
|
| L-124 | 2026-10-06, L-115 fix | In a Vue or Svelte `<script>`, the docstring taken from a `/* block comment */` above a declaration keeps the closing delimiter: `/* block comment */` is served as `block comment */`. `_preceding_comment` strips leading `/` and `*` and never the trailing `*/`. Pinned as it is by `tests/test_vue_svelte_comment_lookup_is_linear.py` so that L-115's fix moved no docstring. A fix changes stored docstrings on unchanged files and needs a `PARSER_GENERATION` bump. The review ran three more: a JSDoc block keeps its inner ` * ` lines and the closing `*/`; `/**/` and `/***/` give the docstring `/`. All the same on 1.108.330. Not run: the same lookup in Astro. | `src/jcodemunch_mcp/parser/extractor.py` (`_preceding_comment` in `_parse_vue_symbols` and `_parse_svelte_symbols`) | defect | low | OPEN |
|
|
176
176
|
| L-125 | 2026-10-06, CI on PR #984 | `tests/test_parse_budget_cancels.py::test_a_first_index_leaves_no_thread_behind` failed once on `full: test (windows-latest, 3.13)` (run 37517459287) and passed when that job was re-run with no change. PR #984 changes one package block of `uv.lock` and no code. The failing assertion is `result.get("symbol_count", 0) >= 2`, and the count read 1. The test indexes two files under a short real-time parse budget, one of them large, so a slow runner that spends the budget on the large file leaves one symbol: that reading fits the count and is not confirmed from the log. Second timing-sensitive test to fail once on a Windows runner that day (L-123 is the first). Not run: the test in a loop on a Windows runner. Second occurrence, 2026-10-07, PR #985: `full: test (ubuntu-latest, 3.10)` (run 37623527802), the same assertion (`assert (True is True and 1 >= 2)`, 1 failed of 14832), passed when that job was re-run with no change; the other seven matrix jobs passed. So it is not a Windows-runner effect. | `tests/test_parse_budget_cancels.py` | flake | low | OPEN |
|
|
177
177
|
| L-126 | 2026-10-06, L-117 fix | A dbt macro (or a Jinja `macro`/`block`) that follows a `{# comment #}` is given the FIRST `{# ... #}` of the file as its docstring, whichever comment it follows. The lookup searches the text before the directive from the start of the file and takes the first match; it checks only that the text ends with `#}`. `evidence/l126_first_comment.txt` on `main`: `{# about first #}` above `first`, `{# about second #}` above `second` gives `second` the docstring `about first`. A macro under `--` lines is right. The L-117 fix keeps this as it was, so it moves no symbol field; fixing it changes docstrings on unchanged files and owes a `PARSER_GENERATION` bump. Not run: how many macros in a real dbt project sit under a second or later Jinja comment. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments`) | defect | high | FIXED 2026-10-07 (`fix/l126-macro-docstring-comment`). `_PrecedingComments` lists the file's comments once, left to right, and a directive takes the one that ENDS where the text before it ends; a `#}` that closes no comment falls through to the `--` lines. `evidence/l126_before_after.txt`, `parse_file`, `main` then the fix: `second` read `about first` and reads `about second`; a `.j2` `button` read `renders a field` and reads `renders a button`. `PARSER_GENERATION` 10: the docstring moves on unchanged content. Guard: `tests/test_a_macro_docstring_is_the_comment_above_it.py`; the L-117 oracle test holds every field but the docstring to the old loop and the docstring to the rule. Review round 1: the dashes of `{#- ... -#}` were served as part of the docstring (`- about m -`, the same on `main` for a file's first comment); they are dropped, in the same generation, with Jinja's `+` and Twig's `~` (review round 2), one mark per side. What the rule still gets wrong: L-129, L-130, L-131. Not run: a dbt or Jinja corpus. |
|
|
178
178
|
| L-127 | 2026-10-06, L-117 fix | Three shapes on the paths L-117 fixed are still superlinear; each time about quadruples when the file doubles, the same on `main` and after the fix (`evidence/l117_before_after.txt`, the residue lines, budget off). (1) Razor `@code {` blocks nested in each other: every block's body is parsed as C#, and an outer body holds the inner ones, so 150 nested blocks took 0.458 s and 300 took 1.846 s. Not valid Razor; a real file has one or two blocks. (2) The directive regex (`_directive_pattern`) on an unclosed `{% macro m(`: each one reads on for its `)`, so 2000 such lines took 0.681 s and 4000 took 2.577 s. One regex call, so the budget cannot stop it part-way: the L-118 class, and not in L-118's list. (3) A directive on a `--` line takes every `--` line above it as its docstring, so N macros each on its own `--` line produce docstrings that total N * N: 500 took 0.124 s and 1000 took 0.432 s. The output is that size by its own definition. | `src/jcodemunch_mcp/parser/extractor.py` (`_parse_razor_symbols`); `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_directive_pattern`, `_PrecedingComments.before`) | defect | low | OPEN |
|
|
179
|
-
| L-128 | 2026-10-07, L-117 review round 3 | The count instruments of `tests/test_parse_path_loops_are_linear.py` wrap the spellings the old loops used and nothing else, so a per-item rescan in another spelling passes all 35 tests. The reviewer put five back into a copy of the fix and each stayed green: `text.rfind(...)`, `x in text`, `text.partition(...)` and a slice of the undecoded bytes per directive, and `list(callable_syms)` per call (one line event, however long the list). None of the five has been in the tree. A list membership test per call is seen by the wall-clock race alone. The durable form is a counted `str` that fails on any method it does not list. Also `monkeypatch.undo()` inside the two counting helpers undoes the autouse `_every_language_enabled` patch for the rest of that test; no caller parses a file after a helper today. | `tests/test_parse_path_loops_are_linear.py` (`_characters_read_by_the_directive_loop`, `_line_events`, `_characters_searched`) | test | low | OPEN |
|
|
180
|
-
| L-129 | 2026-10-07, L-126 review round 1 | A Jinja comment that trails code on its own line is taken as the docstring of the directive on the NEXT line: `{% macro a() %}x{% endmacro %} {# end of a #}` then `{% macro b() %}` gives `b` the docstring `end of a`. The `--` branch requires a comment line to start with `--`; the Jinja branch asks only that the comment END where the text before the directive ends. The same on `main` when that comment is the file's first. `tests/test_a_macro_docstring_is_the_comment_above_it.py` pins the same-line reading (`{# a #} x {# b #}` gives `b`), so a fix inverts that case. ⚠ A fix moves stored docstrings on unchanged content and owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments.before`) | defect | low |
|
|
181
|
-
| L-130 | 2026-10-07, L-126 review round 1 | The comment table of `_PrecedingComments` reads `{#` wherever it stands, an expression or a string included: `{% macro first() %}{{ '{#' }}{% endmacro %}`, then `{# about second #}`, then `{% macro second() %}` gives `second` the docstring `' }}{% endmacro %}` + newline + `{# about second` (code in a docstring). `main` gave `about first`: wrong before, wrong differently now. Jinja's own lexer reads `{{ ... }}`, `{% ... %}` and `{# ... #}` left to right, so a `{#` inside an expression opens no comment; `JINJA_PATTERN` in the same module already lexes that way. ⚠ A fix owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments.__init__`) | defect | low |
|
|
182
|
-
| L-131 | 2026-10-07, L-126 review round 3 | The whitespace-control marks dropped from a Jinja comment's ends are the same three for every dialect (`-`, `+`, `~`), and `~` is a mark in Twig only, `+` in Jinja only. A comment whose text starts or ends flush against the delimiter with the other dialect's mark loses that character: in a `.sql`, `{#~approx 5 rows#}` reads `approx 5 rows`; a Twig `{#+1 to the offset #}` reads `1 to the offset`. One punctuation character, and only with no space beside the delimiter (`{# ~approx #}` is untouched). The exact form passes the dialect's marks in beside `directive_keywords`. ⚠ A fix owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_WHITESPACE_CONTROL_MARKS`, `_PrecedingComments.before`) | defect | low |
|
|
179
|
+
| L-128 | 2026-10-07, L-117 review round 3 | The count instruments of `tests/test_parse_path_loops_are_linear.py` wrap the spellings the old loops used and nothing else, so a per-item rescan in another spelling passes all 35 tests. The reviewer put five back into a copy of the fix and each stayed green: `text.rfind(...)`, `x in text`, `text.partition(...)` and a slice of the undecoded bytes per directive, and `list(callable_syms)` per call (one line event, however long the list). None of the five has been in the tree. A list membership test per call is seen by the wall-clock race alone. The durable form is a counted `str` that fails on any method it does not list. Also `monkeypatch.undo()` inside the two counting helpers undoes the autouse `_every_language_enabled` patch for the rest of that test; no caller parses a file after a helper today. The same holds for the walk L-129 added (`_is_first_on_its_line`): its review put back `text.rfind(...)` with `set(self._line_starts)` per step, and `dict(self._comment_body_start).get(pos)` per step, and all tests stayed green. Round 2 of that review: dropping the cache write in `_first_text_of` passes too; no shape has long leading whitespace before a chain of comments on one line. | `tests/test_parse_path_loops_are_linear.py` (`_characters_read_by_the_directive_loop`, `_line_events`, `_characters_searched`) | test | low | OPEN |
|
|
180
|
+
| L-129 | 2026-10-07, L-126 review round 1 | A Jinja comment that trails code on its own line is taken as the docstring of the directive on the NEXT line: `{% macro a() %}x{% endmacro %} {# end of a #}` then `{% macro b() %}` gives `b` the docstring `end of a`. The `--` branch requires a comment line to start with `--`; the Jinja branch asks only that the comment END where the text before the directive ends. The same on `main` when that comment is the file's first. `tests/test_a_macro_docstring_is_the_comment_above_it.py` pins the same-line reading (`{# a #} x {# b #}` gives `b`), so a fix inverts that case. ⚠ A fix moves stored docstrings on unchanged content and owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments.before`) | defect | low | FIXED 2026-10-07 (`fix/l129-l131-macro-docstring-residue`). The comment must be first on its line, with only other comments before it there (`_PrecedingComments._is_first_on_its_line`). `evidence/l129_l131_before_after.txt`: `b` read `end of a` and reads nothing. The pinned `{# a #} x {# b #}` case is inverted. Review round 1: a byte-order mark or a zero-width space before the comment is not text (a file starting with a BOM lost its first docstring in the first form of this fix). `PARSER_GENERATION` 11, shared with L-130 and L-131. |
|
|
181
|
+
| L-130 | 2026-10-07, L-126 review round 1 | The comment table of `_PrecedingComments` reads `{#` wherever it stands, an expression or a string included: `{% macro first() %}{{ '{#' }}{% endmacro %}`, then `{# about second #}`, then `{% macro second() %}` gives `second` the docstring `' }}{% endmacro %}` + newline + `{# about second` (code in a docstring). `main` gave `about first`: wrong before, wrong differently now. Jinja's own lexer reads `{{ ... }}`, `{% ... %}` and `{# ... #}` left to right, so a `{#` inside an expression opens no comment; `JINJA_PATTERN` in the same module already lexes that way. ⚠ A fix owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments.__init__`) | defect | low | FIXED 2026-10-07 (`fix/l129-l131-macro-docstring-residue`). The comment table reads `{{`, `{%` and `{#` left to right, each to its first closer; a kind with no closer left is text from there on. `evidence/l129_l131_before_after.txt`: `second` reads `about second`. Nothing inside `{% raw %}` or `{% verbatim %}` is a delimiter (review round 1: the first form of this fix lost the docstring below a raw block holding a `{{`). What the lexer reads worse than 1.108.332 did: L-132. `PARSER_GENERATION` 11. |
|
|
182
|
+
| L-131 | 2026-10-07, L-126 review round 3 | The whitespace-control marks dropped from a Jinja comment's ends are the same three for every dialect (`-`, `+`, `~`), and `~` is a mark in Twig only, `+` in Jinja only. A comment whose text starts or ends flush against the delimiter with the other dialect's mark loses that character: in a `.sql`, `{#~approx 5 rows#}` reads `approx 5 rows`; a Twig `{#+1 to the offset #}` reads `1 to the offset`. One punctuation character, and only with no space beside the delimiter (`{# ~approx #}` is untouched). The exact form passes the dialect's marks in beside `directive_keywords`. ⚠ A fix owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_WHITESPACE_CONTROL_MARKS`, `_PrecedingComments.before`) | defect | low | FIXED 2026-10-07 (`fix/l129-l131-macro-docstring-residue`). `extract_dbt_directives` takes `whitespace_marks` (`JINJA_WHITESPACE_MARKS` by default, `TWIG_WHITESPACE_MARKS` from `template_shared` for Twig). `evidence/l129_l131_before_after.txt`: `{#~approx 5 rows#}` in a `.sql` reads `~approx 5 rows`; `{#+1 to the offset #}` in a `.twig` reads `+1 to the offset`. `PARSER_GENERATION` 11. |
|
|
183
|
+
| L-132 | 2026-10-07, L-129/L-130/L-131 review round 1 | Two inputs read worse after L-130's lexer than on 1.108.332 (`evidence/l129_l131_before_after.txt`, the L-132 line; the second from the review's probe). (1) A stray `{{` or `{%` outside a raw block that has a later closer of its kind is read as one expression up to that closer, so every comment between is not a comment: `-- wrap in {{ to call`, then `{# doc #}`, then `{% macro m() %}`, with a `{{ x }}` further down, gave `m` the docstring `doc` and gives it nothing. Jinja refuses such a file, so a rendered dbt project cannot hold one; a `.sql` that is never rendered can. `test_a_stray_opener_with_a_later_closer_is_one_expression_to_that_closer` pins the reading. (2) A closer inside a string in an expression still ends the expression there, and the leftover can pair with a later closer: `{{ '}} {%' }}` above a documented macro costs it its docstring. Reading strings inside an expression needs a state-shared scan to stay linear (the L-117 Razor problem). A third the review found, a comment after a `--` lead (`-- note {# doc #}`), was fixed in the same change: a `--` lead is a comment, so `doc` is still the docstring. Review round 2 added two readings that are odd and not worse than 1.108.332: a `--` that starts a continuation line INSIDE a comment trailing code counts as a `--` lead (`x {# a`, newline, `-- still a #} {# b #}` gives `b`, where the same without the `--` gives nothing); and a line holding only a zero-width space is a blank line to the `--` branch, so `-- a`, that line, `-- b` reads both lines where 1.108.332 read `b`. ⚠ A fix moves stored docstrings and owes its own `PARSER_GENERATION` bump. | `src/jcodemunch_mcp/parser/sql_preprocessor.py` (`_PrecedingComments.__init__`, `before`) | defect | low | OPEN |
|
|
184
|
+
| L-133 | 2026-10-07, a user report by email (Dave) | tree-sitter 0.26 is not supported: it removed `Parser.timeout_micros`, the one mechanism the parse budget has for stopping a C parse, so the dependency is capped at `<0.26` (`evidence/tree_sitter_026.txt`: a 0.5 s budget stopped a 405,035-byte file after 0.54 s on 0.25.2 and after 7.06 s on 0.26.0). To probe 0.26 again: the capped range no longer resolves it, so resolve this project's requirements, set the `tree-sitter` line to the version wanted, and run with `uv run --no-project --with-requirements` and `PYTHONPATH=src` (the evidence file's header). The replacement is `parse(progress_callback=)`; on 0.25.2 it was ignored for a bytestring and killed the interpreter with an access violation with a read callback, on all eight variants probed (`parser/parse_budget.py` module docstring). Probed on 0.26.0, 2026-10-08 (`evidence/progress_callback_026.txt`, Windows): on Python 3.12.4 the callback is ignored for a bytestring (the binding warns) and the interpreter dies with an access violation the first time it is due with a read callback; a file too small to reach the first call parses. The cause is in the binding, not here: `parser_progress_callback` (`tree_sitter/binding/parser.c`, the same in 0.25.2 and 0.26.0) builds the call's arguments with the format `"Ip"`, `Py_BuildValue` accepts `p` only from Python 3.14, so on 3.10 to 3.13 the call returns NULL and the next line passes it to `PyObject_IsTrue`. On Python 3.14.6 the same probe stops the 405,035-byte file after 0.57 s with `ValueError: Parsing failed`, and the stopped parser must be `reset()` before reuse (the next parse returned the old source's tree). Upstream fix: tree-sitter/py-tree-sitter PR 503 ("make progress_callback work on Python < 3.14"), open and unreleased on 2026-10-08; 0.26.0 is the newest release. So no released binding can stop a 0.26 parse on any Python this project supports, and the cap stays. TO CLOSE, once a release carries that fix: a read-callback path in `_BudgetedParser.parse` for a binding without `timeout_micros` (source fed in slices, the callback returning true past the deadline, `reset()` after a stop), the lock moved to that release so `test_the_installed_tree_sitter_can_cancel_a_parse` runs on it, then the range. Not measured: what parsing through a read callback costs against a bytestring. Until then a host that needs tree-sitter 0.26 for another package cannot install both. | `src/jcodemunch_mcp/parser/parse_budget.py` (`bind`, `_BudgetedParser`); `pyproject.toml` | enhancement | medium | OPEN |
|
|
185
|
+
| L-134 | 2026-10-07, a user report by email (Dave), second finding | `tests/test_suggest_queries.py:28` reads `symbols_indexed` off `index_folder`'s result with a default of 0. No run returns that key (the indexer answers `symbol_count`), so the condition is true for any successful run and the `empty index` branch does not depend on the count it names. The branch is also not reached today: the fixture holds only a `README.md`, so the indexer refuses with `No source files found`. Found while fixing the same key in `cli/init.py`. To close: a fixture the indexer accepts with no symbol in it, and `symbol_count`. | `tests/test_suggest_queries.py` (`test_empty_index_returns_error`) | test | low | FIXED 2026-10-07 (`fix/L-134-suggest-queries-empty-index-test`). The fixture is a comment-only `.py`, which the indexer accepts with 1 file and 0 symbols; the test asserts that, then that `suggest_queries` answers its empty-index error, with no `if`. With the tool's empty-index check removed the old test passed and the new one fails (`evidence/old_test_is_vacuous.txt`, `evidence/red.txt`). The product was correct throughout. |
|
|
186
|
+
| L-135 | 2026-10-08, the L-121 fix | The fusion exit of `search_symbols` (`fusion=true`) embeds the query with the ACTIVE model and scores it against the stored matrix without asking what built the stored vectors: it calls `get_matrix` and `score_all` and never `stale_reason`. When the stored model differs and the widths differ, `score_all` answers `{}` and the similarity channel is empty with `similarity_used` true. When the widths agree the channel ranks by vectors of two models. The semantic exit refuses this case since L-121. Read from the source, not run: no probe, no evidence file. The exit writes no vector. | `src/jcodemunch_mcp/tools/search_symbols.py` (`_search_symbols_fusion`, the similarity channel) | defect | low | OPEN |
|
|
187
|
+
| L-136 | 2026-10-08, the L-121 fix | `embed_repo` without `force`, on a store whose model name is unknown (a store from before #500, or one embedded with an empty model name), seeds `dim` from the stored dimension and writes the new vectors with `set_many` whatever their width, so a model of another width leaves two widths in the store. `stale_reason` answers None there by design (unknown is not a change). The semantic exit compares the width of its query vector with the width of the stored vectors since L-121 and writes nothing on a difference; `embed_repo` has no such check. Run by the L-121 review (round 4, a scratchpad probe, not an evidence file): stored model absent, width 8, one new symbol, `embed_repo` at width 4 left `{8: 5, 4: 1}` on `origin/main` and on the branch. `force=true` rebuilds. | `src/jcodemunch_mcp/tools/embed_repo.py` (the batch loop) | defect | low | OPEN |
|
|
188
|
+
| L-137 | 2026-10-08, the L-121 review (round 4) | `storage/generation.py` `readonly_uri` builds `file:{path}?mode=ro` without quoting the path, so under a storage path that holds `#` or `%` the read-only open fails or opens another file, and every reader built on `connect_readonly` answers as if nothing were stored. Reviewer's probe (a scratchpad script, not an evidence file), over a store holding 6 vectors: `has_any()` answered False in a directory named `c#proj` and None in one named `a%20b`, and `iter_raw()` was empty in both. `has_any()` documents False as nothing embedded, so the first is a false absence. The same on `origin/main`. With `#` the open does not fail: the query string falls into the URI fragment, SQLite opens the path up to the `#` and creates an empty file there (`c` beside `c#proj`), and the read fails on a missing table (review round 5's probe). `embed_repo` reads what is recorded over its read-write connection since L-121 and is not affected in that reading; The semantic exit of `search_symbols` loads its matrix through `iter_raw`, so under such a path it finds no stored vector and embeds every symbol on each search (review round 6's probe, `c#proj`, six symbols: provider calls `[1, 6]` per search). On `origin/main` that search then overwrote all six vectors with the active model's under the old stamp when the widths agreed; since L-121 it reads the stamp again at the write and writes nothing, after paying for the calls. Not run: which other tools read through `connect_readonly` under such a path; a path with `?`. | `src/jcodemunch_mcp/storage/generation.py` (`readonly_uri`) | defect | medium | OPEN |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "jcodemunch-mcp"
|
|
3
|
-
version = "1.108.
|
|
3
|
+
version = "1.108.334"
|
|
4
4
|
description = "Token-efficient MCP server for source code exploration via tree-sitter AST parsing"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -64,7 +64,13 @@ dependencies = [
|
|
|
64
64
|
# The F# wheel's grammar is ABI 15, which a tree-sitter runtime older than
|
|
65
65
|
# 0.25 cannot load: `Language()` raises and F# indexes as empty. The pack
|
|
66
66
|
# carried that floor only transitively, and its own spec does not promise it.
|
|
67
|
-
|
|
67
|
+
# CAPPED at the locked minor: the per-file parse budget stops a slow parse
|
|
68
|
+
# through `Parser.timeout_micros`, and tree-sitter 0.26.0 removed it. With
|
|
69
|
+
# no cap an install resolved 0.26.0 and lost the stop, while CI, locked to
|
|
70
|
+
# 0.25.2, saw nothing. Raise the cap only together with `uv.lock`, so
|
|
71
|
+
# `tests/test_parse_budget_cancels.py` runs on the new version first
|
|
72
|
+
# (`tests/test_tree_sitter_range_is_the_tested_range.py`).
|
|
73
|
+
"tree-sitter>=0.25,<0.26",
|
|
68
74
|
"pathspec>=0.12.0",
|
|
69
75
|
"pyyaml>=6.0",
|
|
70
76
|
]
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.jgravelle/jcodemunch-mcp",
|
|
4
4
|
"title": "jCodemunch MCP",
|
|
5
5
|
"description": "Token-efficient code exploration via tree-sitter AST parsing. 70+ languages, 86-99% token savings.",
|
|
6
|
-
"version": "1.108.
|
|
6
|
+
"version": "1.108.334",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "pypi",
|
|
10
10
|
"identifier": "jcodemunch-mcp",
|
|
11
|
-
"version": "1.108.
|
|
11
|
+
"version": "1.108.334",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
|
@@ -1134,14 +1134,45 @@ def run_index(*, dry_run: bool = False) -> str:
|
|
|
1134
1134
|
|
|
1135
1135
|
try:
|
|
1136
1136
|
from ..tools.index_folder import index_folder
|
|
1137
|
-
|
|
1138
|
-
files = result.get("files_indexed", "?")
|
|
1139
|
-
symbols = result.get("symbols_indexed", "?")
|
|
1140
|
-
return f" indexed {cwd} ({files} files, {symbols} symbols)"
|
|
1137
|
+
return _index_summary(cwd, index_folder(path=cwd))
|
|
1141
1138
|
except Exception as e:
|
|
1142
1139
|
return f" indexing failed: {e}"
|
|
1143
1140
|
|
|
1144
1141
|
|
|
1142
|
+
def _index_summary(cwd: str, result: dict) -> str:
|
|
1143
|
+
"""One line for what `index_folder` answered. It answers in four shapes:
|
|
1144
|
+
a refusal (`success` false, `error`), a full index (`file_count`), a run
|
|
1145
|
+
that re-indexed some files (`changed`/`new`/`deleted`, `symbol_count`) and
|
|
1146
|
+
a run that found nothing changed (the three counts at 0, no symbol count).
|
|
1147
|
+
A count the result does not carry is left out, never printed as `?`.
|
|
1148
|
+
Any successful shape can also say the file cap cut the walk short
|
|
1149
|
+
(`truncated`); the line then says how many files the index holds."""
|
|
1150
|
+
if not result.get("success"):
|
|
1151
|
+
return f" indexing failed: {result.get('error') or 'the indexer gave no reason'}"
|
|
1152
|
+
parts = []
|
|
1153
|
+
unchanged = False
|
|
1154
|
+
if "file_count" in result:
|
|
1155
|
+
parts.append(f"{result['file_count']} files")
|
|
1156
|
+
elif "changed" in result:
|
|
1157
|
+
touched = [result.get(key, 0) for key in ("changed", "new", "deleted")]
|
|
1158
|
+
unchanged = not any(touched)
|
|
1159
|
+
parts.append(
|
|
1160
|
+
"nothing changed since the last index" if unchanged
|
|
1161
|
+
else "{} changed, {} new, {} deleted".format(*touched)
|
|
1162
|
+
)
|
|
1163
|
+
if result.get("symbol_count") is not None:
|
|
1164
|
+
parts.append(f"{result['symbol_count']} symbols")
|
|
1165
|
+
detail = ", ".join(parts)
|
|
1166
|
+
if result.get("truncated"):
|
|
1167
|
+
capped = "the file cap was reached, {} of {} files are in the index".format(
|
|
1168
|
+
result.get("files_indexed", "some"), result.get("files_discovered", "the")
|
|
1169
|
+
)
|
|
1170
|
+
detail = f"{detail}; {capped}" if detail else capped
|
|
1171
|
+
if unchanged:
|
|
1172
|
+
return f" {cwd} is up to date ({detail})"
|
|
1173
|
+
return f" indexed {cwd} ({detail})" if detail else f" indexed {cwd}"
|
|
1174
|
+
|
|
1175
|
+
|
|
1145
1176
|
# ---------------------------------------------------------------------------
|
|
1146
1177
|
# Audit agent config
|
|
1147
1178
|
# ---------------------------------------------------------------------------
|
|
@@ -28,7 +28,9 @@ _META_JSON = ("verdict", "exact_match")
|
|
|
28
28
|
# on the shipped default), and an undeclared dict is dropped by the encoder.
|
|
29
29
|
# semantic_channel_error (L-108): why the fusion exit's similarity channel did not
|
|
30
30
|
# run, e.g. a refused local model. A BODY dict for the same reason.
|
|
31
|
-
|
|
31
|
+
# semantic_store_mismatch (L-121): the stored vectors were built by another
|
|
32
|
+
# model, so the semantic exit wrote and scored nothing. A BODY dict likewise.
|
|
33
|
+
_JSON_BLOBS = ("semantic_topup", "semantic_channel_error", "semantic_store_mismatch")
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
def encode(tool: str, response: dict) -> tuple[str, str]:
|
{jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.334}/src/jcodemunch_mcp/parser/parse_budget.py
RENAMED
|
@@ -16,9 +16,13 @@ is left of the deadline as its own timeout, and the C parser stops itself.
|
|
|
16
16
|
in favour of `parse(progress_callback=)`. The callback is not usable: it is
|
|
17
17
|
ignored for a bytestring, and with a read callback it killed the interpreter
|
|
18
18
|
with an access violation on all eight variants probed (tree-sitter 0.25.2,
|
|
19
|
-
Python 3.12.4, Windows). A binding without the attribute
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
Python 3.12.4, Windows). A binding without the attribute cannot stop the C
|
|
20
|
+
parse: the file is named only when the parse returns and the next checkpoint
|
|
21
|
+
fires. `bind()` says so once in the log and
|
|
22
|
+
`tests/test_parse_budget_cancels.py` fails on it. ⚠⚠ tree-sitter 0.26.0 IS
|
|
23
|
+
such a binding, and that test runs on the LOCKED version only, so the
|
|
24
|
+
dependency range is capped at the locked minor (`pyproject.toml`,
|
|
25
|
+
`tests/test_tree_sitter_range_is_the_tested_range.py`).
|
|
22
26
|
|
|
23
27
|
⚠ Many dedicated parsers catch `Exception` around their parse and return `[]`
|
|
24
28
|
(a grammar that failed to load is "indexed for text search only"). A cancel
|
|
@@ -298,7 +302,8 @@ def bind(parser):
|
|
|
298
302
|
_warned_no_timeout = True
|
|
299
303
|
logger.warning(
|
|
300
304
|
"the installed tree-sitter has no Parser.timeout_micros; "
|
|
301
|
-
"JCODEMUNCH_PARSE_BUDGET_SECONDS cannot stop a slow parse on it"
|
|
305
|
+
"JCODEMUNCH_PARSE_BUDGET_SECONDS cannot stop a slow parse on it. "
|
|
306
|
+
'tree-sitter 0.26 removed it: upgrade jcodemunch-mcp, or install "tree-sitter>=0.25,<0.26"'
|
|
302
307
|
)
|
|
303
308
|
return parser
|
|
304
309
|
return _BudgetedParser(parser, scope)
|