jcodemunch-mcp 1.108.332__tar.gz → 1.108.333__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1384) hide show
  1. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/.claude-plugin/plugin.json +1 -1
  2. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CHANGELOG.md +71 -0
  3. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/ISSUE-HISTORY.md +14 -0
  4. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/PKG-INFO +3 -3
  5. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/README.md +1 -1
  6. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/harness/ARCHAEOLOGY.md +4 -2
  7. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/workflows/LEDGER.md +7 -4
  8. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/pyproject.toml +8 -2
  9. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/server.json +2 -2
  10. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/init.py +35 -4
  11. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/parse_budget.py +9 -4
  12. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/sql_preprocessor.py +92 -22
  13. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/template_shared.py +8 -2
  14. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/index_store.py +7 -1
  15. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_macro_docstring_is_the_comment_above_it.py +79 -3
  16. jcodemunch_mcp-1.108.333/tests/test_init_index_summary_reads_the_indexers_result.py +114 -0
  17. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parse_path_loops_are_linear.py +110 -16
  18. jcodemunch_mcp-1.108.333/tests/test_tree_sitter_range_is_the_tested_range.py +159 -0
  19. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/uv.lock +2 -2
  20. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/whatsnew.json +7 -7
  21. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/.clabot +0 -0
  22. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/.claude-plugin/marketplace.json +0 -0
  23. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/.dockerignore +0 -0
  24. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/.gitignore +0 -0
  25. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/AGENTS.md +0 -0
  26. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/AGENT_HINTS.md +0 -0
  27. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/AGENT_HOOKS.md +0 -0
  28. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/AGENT_INSTALL_UNIVERSAL.md +0 -0
  29. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/ARCHITECTURE.md +0 -0
  30. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CAPABILITIES.md +0 -0
  31. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CLI-AND-ENV.md +0 -0
  32. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CLIENTS.md +0 -0
  33. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CODE_OF_CONDUCT.md +0 -0
  34. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CONFIGURATION.md +0 -0
  35. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CONTEXT_PROVIDERS.md +0 -0
  36. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/CONTRIBUTING.md +0 -0
  37. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/Caddyfile +0 -0
  38. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/Dockerfile +0 -0
  39. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/GROQ.md +0 -0
  40. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/HEADLESS.md +0 -0
  41. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/INSTALL_FROM_SOURCE.md +0 -0
  42. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/KEY-FILES.md +0 -0
  43. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/LANGUAGE_SUPPORT.md +0 -0
  44. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/LICENSE +0 -0
  45. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/QUICKSTART.md +0 -0
  46. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/RELEASE_RESTORE.md +0 -0
  47. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/ROADMAP.md +0 -0
  48. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/SCIP.md +0 -0
  49. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/SECURITY.md +0 -0
  50. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/SPEC.md +0 -0
  51. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/SPEC_MUNCH.md +0 -0
  52. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/TOKEN_SAVINGS.md +0 -0
  53. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/TROUBLESHOOTING.md +0 -0
  54. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/TWEAKCC.md +0 -0
  55. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/UNDER_THE_HOOD.md +0 -0
  56. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/USER_GUIDE.md +0 -0
  57. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/badge-kit.md +0 -0
  58. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/METHODOLOGY.md +0 -0
  59. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/RAG_COMPARISON_NOTES.md +0 -0
  60. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/README.md +0 -0
  61. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/REPRODUCING.md +0 -0
  62. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/ab-test-dead-code-2026-03-18.md +0 -0
  63. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/ab-test-naming-audit-2026-03-18.md +0 -0
  64. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/anchor/measure.py +0 -0
  65. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/attic/README.md +0 -0
  66. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/attic/ab_v1_70_0.py +0 -0
  67. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/attic/profile_backpressure.py +0 -0
  68. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/attic/profile_config_regression.py +0 -0
  69. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/attic/profile_language_filter.py +0 -0
  70. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/cache_stability/measure.py +0 -0
  71. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/cache_stability/results.json +0 -0
  72. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/calibration/planted_queries.json +0 -0
  73. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/codex_surface/README.md +0 -0
  74. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/codex_surface/run_codex_arms.py +0 -0
  75. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/codex_surface/tasks.json +0 -0
  76. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/deadcode_eval/README.md +0 -0
  77. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/deadcode_eval/results-2026-08-03.json +0 -0
  78. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/deadcode_eval/run_eval.py +0 -0
  79. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/README.md +0 -0
  80. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/jcm_tools_full.json +0 -0
  81. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/jdata_tools.json +0 -0
  82. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/jdoc_tools.json +0 -0
  83. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/rubric_upstream.py +0 -0
  84. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/score_descriptions.py +0 -0
  85. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/description_smells/scores.json +0 -0
  86. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/events/handlers.py +0 -0
  87. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/events/protocol.py +0 -0
  88. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/events/registry.py +0 -0
  89. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/events/web.py +0 -0
  90. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/go/collect/plist.go +0 -0
  91. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/go/collect/queue.go +0 -0
  92. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/go/collect/ring.go +0 -0
  93. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/go/mower/mower.go +0 -0
  94. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/go/talent/recruiter.go +0 -0
  95. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/applepay_adapter.py +0 -0
  96. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/base.py +0 -0
  97. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/legacy.py +0 -0
  98. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/mock_provider.py +0 -0
  99. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/paypal_impl.py +0 -0
  100. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/payments/stripe_impl.py +0 -0
  101. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/pos/hardware.py +0 -0
  102. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/pos/legal.py +0 -0
  103. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/pos/terminal.py +0 -0
  104. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/reporting/base_report.py +0 -0
  105. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/reporting/csv_report.py +0 -0
  106. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/analytics/banner.ts +0 -0
  107. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/analytics/toast.ts +0 -0
  108. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/billing/decorators.ts +0 -0
  109. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/billing/handlers.ts +0 -0
  110. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/billing/protocol.ts +0 -0
  111. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/billing/reports.ts +0 -0
  112. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/building/elevator.ts +0 -0
  113. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/factory/conveyor.ts +0 -0
  114. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/gateway/push.ts +0 -0
  115. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/notify/base.ts +0 -0
  116. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/notify/email.ts +0 -0
  117. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/corpus/ts/notify/sms.ts +0 -0
  118. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/gold.json +0 -0
  119. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/goldset/measure.py +0 -0
  120. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/capture_schema_baseline.py +0 -0
  121. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/capture_token_baseline.py +0 -0
  122. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/run_benchmark.py +0 -0
  123. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/run_odysseus_compare.py +0 -0
  124. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/run_rag_baseline.py +0 -0
  125. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/harness/token_floor.py +0 -0
  126. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/jcm_reference.json +0 -0
  127. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/odysseus_compare_results.json +0 -0
  128. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/odysseus_compare_results.md +0 -0
  129. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/offload/results-django__django.json +0 -0
  130. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/offload/results-fastapi__fastapi.json +0 -0
  131. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/offload/results-local__jcodemunch-mcp-0394b683.json +0 -0
  132. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/offload/run_offload_criterion.py +0 -0
  133. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/provenance/channel_accuracy.json +0 -0
  134. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/provenance/measured.json +0 -0
  135. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/README.md +0 -0
  136. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/corpus.json +0 -0
  137. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/oracle.rkt +0 -0
  138. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/reader_corpus.json +0 -0
  139. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/reader_oracle.rkt +0 -0
  140. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/reader_results.json +0 -0
  141. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/results.json +0 -0
  142. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/run_fidelity.py +0 -0
  143. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/racket_fidelity/run_reader_fidelity.py +0 -0
  144. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rag_baseline_results.json +0 -0
  145. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rag_baseline_results.md +0 -0
  146. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/__init__.py +0 -0
  147. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/fixtures/self_v1_75_0.json +0 -0
  148. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/metrics.py +0 -0
  149. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/results/self_v1_75_0-golden.json +0 -0
  150. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/results/self_v1_75_0-v1.75.0.json +0 -0
  151. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/replay/run_replay.py +0 -0
  152. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/requirements-rag-bench.txt +0 -0
  153. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/results.md +0 -0
  154. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/results_v1.70.0.md +0 -0
  155. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/PROTOCOL.md +0 -0
  156. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/RESULT.md +0 -0
  157. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/build_cases.py +0 -0
  158. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/cases.json +0 -0
  159. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/predicate.py +0 -0
  160. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/results.json +0 -0
  161. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_binary_pilot/run_pilot.py +0 -0
  162. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/emitted_task_cases.json +0 -0
  163. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/emitted_task_holdout.json +0 -0
  164. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/emitted_task_results.json +0 -0
  165. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/explain_misses.py +0 -0
  166. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/explanations.json +0 -0
  167. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/holdout.json +0 -0
  168. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/holdout_results.json +0 -0
  169. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/measure_route_discriminators.py +0 -0
  170. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/queries.json +0 -0
  171. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/results.json +0 -0
  172. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/route_discriminator_results.json +0 -0
  173. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/run_emitted_task.py +0 -0
  174. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/route_recall/run_route_recall.py +0 -0
  175. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/README.md +0 -0
  176. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/corpus.json +0 -0
  177. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/oracle/Cargo.toml +0 -0
  178. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/oracle/src/main.rs +0 -0
  179. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/results.json +0 -0
  180. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/rust_fidelity/run_fidelity.py +0 -0
  181. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/schema_baseline.json +0 -0
  182. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/self_latency/measure.py +0 -0
  183. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/swebench/PROTOCOL.md +0 -0
  184. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/swebench/power.py +0 -0
  185. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/tasks.json +0 -0
  186. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/tier_switch/README.md +0 -0
  187. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/tier_switch/price_tier_switch.py +0 -0
  188. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/tier_switch/results.json +0 -0
  189. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/token_baselines/README.md +0 -0
  190. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/token_baselines/v1.108.163.json +0 -0
  191. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/benchmarks/whitepaper.md +0 -0
  192. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/cli/README.md +0 -0
  193. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/cli/cli.py +0 -0
  194. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/clients/ts/README.md +0 -0
  195. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/clients/ts/decoder.ts +0 -0
  196. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docker-compose.yml +0 -0
  197. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/cicd/AUDIT.md +0 -0
  198. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/cicd/DESIGN.md +0 -0
  199. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/cicd/FINDINGS.md +0 -0
  200. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/cicd/RUNBOOK.md +0 -0
  201. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/cicd/VERIFICATION.md +0 -0
  202. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/harness/COVERAGE-MAP.md +0 -0
  203. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/harness/DESIGN.md +0 -0
  204. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/harness/FINDINGS.md +0 -0
  205. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/harness/VERIFICATION.md +0 -0
  206. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/inbound/AUDIT.md +0 -0
  207. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/inbound/DESIGN.md +0 -0
  208. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/inbound/FINDINGS.md +0 -0
  209. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/inbound/POLICY.md +0 -0
  210. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/inbound/VERIFICATION.md +0 -0
  211. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/prd-extraction-fingerprint.md +0 -0
  212. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/standard/DISCOVERY.md +0 -0
  213. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/standard/ENFORCEMENT-PLAN.md +0 -0
  214. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/standard/NICHE.md +0 -0
  215. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/standard/STANDARD.md +0 -0
  216. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/workflows/DESIGN.md +0 -0
  217. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/workflows/FINDINGS.md +0 -0
  218. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/workflows/LOOPS.md +0 -0
  219. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/docs/workflows/VERIFICATION.md +0 -0
  220. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/examples/groq_validate.py +0 -0
  221. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/examples/otel-collector/README.md +0 -0
  222. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/examples/otel-collector/jcm-exporter.yaml +0 -0
  223. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/__init__.py +0 -0
  224. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/__main__.py +0 -0
  225. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/audit-allowlist.json +0 -0
  226. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/corpora.json +0 -0
  227. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/corpora.py +0 -0
  228. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/release_age.py +0 -0
  229. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/results/latest.json +0 -0
  230. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/results/self_latency.json +0 -0
  231. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/results/self_latency_ci_runs_2026-09-22.json +0 -0
  232. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/results/self_latency_three_runs.json +0 -0
  233. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/retired.json +0 -0
  234. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/thresholds.json +0 -0
  235. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/thresholds.py +0 -0
  236. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/harness/tiers.json +0 -0
  237. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/jcodemunch_whitepaper.pdf +0 -0
  238. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/mcpb/build.py +0 -0
  239. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/mcpb/server/main.py +0 -0
  240. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/django.yaml +0 -0
  241. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/express.yaml +0 -0
  242. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/fastapi.yaml +0 -0
  243. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/flask.yaml +0 -0
  244. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/gin.yaml +0 -0
  245. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/jcodemunch.yaml +0 -0
  246. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/langchain.yaml +0 -0
  247. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/nextjs.yaml +0 -0
  248. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/pytorch.yaml +0 -0
  249. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/react.yaml +0 -0
  250. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/requests.yaml +0 -0
  251. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/rust_axum.yaml +0 -0
  252. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/spring_boot.yaml +0 -0
  253. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/corpus/vue.yaml +0 -0
  254. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/leaderboard.html +0 -0
  255. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/__init__.py +0 -0
  256. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/cli.py +0 -0
  257. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/corpus.py +0 -0
  258. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/encoding_bench.py +0 -0
  259. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/evaluate.py +0 -0
  260. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/inference.py +0 -0
  261. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/leaderboard.py +0 -0
  262. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/retrieval.py +0 -0
  263. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/munch_bench/runner.py +0 -0
  264. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-haiku-4-5_express.json +0 -0
  265. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-haiku-4-5_fastapi.json +0 -0
  266. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-haiku-4-5_flask.json +0 -0
  267. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-sonnet-4-6_express.json +0 -0
  268. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-sonnet-4-6_fastapi.json +0 -0
  269. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/anthropic_claude-sonnet-4-6_flask.json +0 -0
  270. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/results/groq_llama-3.3-70b-versatile_2026-04-13.json +0 -0
  271. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/tests/__init__.py +0 -0
  272. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/tests/test_corpus.py +0 -0
  273. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/tests/test_evaluate.py +0 -0
  274. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/munch-bench/tests/test_leaderboard.py +0 -0
  275. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/packaging/debian/build_deb.sh +0 -0
  276. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/schemas/confidence-provenance.schema.json +0 -0
  277. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/schemas/evidence-receipt.schema.json +0 -0
  278. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/schemas/ranked-context-response.schema.json +0 -0
  279. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/schemas/retrieval-verdict.schema.json +0 -0
  280. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/dod_changelog.py +0 -0
  281. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/gap_ledgers.py +0 -0
  282. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/handshake.py +0 -0
  283. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/open_regression_issue.py +0 -0
  284. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/pr_bench_comment.py +0 -0
  285. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/refresh_grammar_inventory.py +0 -0
  286. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/registry_verify.py +0 -0
  287. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/release_notes.py +0 -0
  288. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/release_preflight.py +0 -0
  289. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/surface_diff.py +0 -0
  290. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/scripts/unstable_modules_diag.py +0 -0
  291. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/speedreview/README.md +0 -0
  292. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/speedreview/action.yml +0 -0
  293. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/speedreview/review.py +0 -0
  294. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/__init__.py +0 -0
  295. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/__main__.py +0 -0
  296. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/agent_selector.py +0 -0
  297. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/__init__.py +0 -0
  298. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/delivery.py +0 -0
  299. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/digest.py +0 -0
  300. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/file_risk.py +0 -0
  301. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/health.py +0 -0
  302. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/__init__.py +0 -0
  303. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/_common.py +0 -0
  304. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/briefing.py +0 -0
  305. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/landmarks.py +0 -0
  306. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/reindex.py +0 -0
  307. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/snapshot.py +0 -0
  308. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/steering.py +0 -0
  309. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/hooks/taskcomplete.py +0 -0
  310. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/install_pack.py +0 -0
  311. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/observatory.py +0 -0
  312. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/parity.py +0 -0
  313. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/policy.py +0 -0
  314. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/receipt.py +0 -0
  315. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/reflect.py +0 -0
  316. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/skills.py +0 -0
  317. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/upgrade.py +0 -0
  318. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/cli/whatsnew.py +0 -0
  319. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/config.py +0 -0
  320. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/counter.py +0 -0
  321. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/credentials.py +0 -0
  322. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/embeddings/__init__.py +0 -0
  323. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/embeddings/advice.py +0 -0
  324. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/embeddings/failures.py +0 -0
  325. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/embeddings/local_encoder.py +0 -0
  326. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/__init__.py +0 -0
  327. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/decoder.py +0 -0
  328. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/format.py +0 -0
  329. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/gate.py +0 -0
  330. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/generic.py +0 -0
  331. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/json_passthrough.py +0 -0
  332. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schema_driven.py +0 -0
  333. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/__init__.py +0 -0
  334. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/find_importers.py +0 -0
  335. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/find_references.py +0 -0
  336. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_blast_radius.py +0 -0
  337. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_call_hierarchy.py +0 -0
  338. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_dependency_cycles.py +0 -0
  339. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_dependency_graph.py +0 -0
  340. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_file_outline.py +0 -0
  341. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_impact_preview.py +0 -0
  342. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_ranked_context.py +0 -0
  343. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_repo_outline.py +0 -0
  344. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_signal_chains.py +0 -0
  345. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/get_tectonic_map.py +0 -0
  346. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/registry.py +0 -0
  347. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/search_ast.py +0 -0
  348. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/search_symbols.py +0 -0
  349. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/encoding/schemas/search_text.py +0 -0
  350. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/enrichment/__init__.py +0 -0
  351. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/enrichment/lsp_bridge.py +0 -0
  352. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/__init__.py +0 -0
  353. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/capability.py +0 -0
  354. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/producers.py +0 -0
  355. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/receipts.py +0 -0
  356. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/scip.py +0 -0
  357. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/evidence/scip_ingest.py +0 -0
  358. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/__init__.py +0 -0
  359. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/cli.py +0 -0
  360. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/config.py +0 -0
  361. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/explainer.py +0 -0
  362. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/inference.py +0 -0
  363. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/retriever.py +0 -0
  364. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/groq/voice.py +0 -0
  365. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/handoff.py +0 -0
  366. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/hook_event.py +0 -0
  367. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/install_layout.py +0 -0
  368. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/investigator/__init__.py +0 -0
  369. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/investigator/deletion_safety.py +0 -0
  370. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/investigator/retrieval_counterfactual.py +0 -0
  371. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/investigator/reuse_audit.py +0 -0
  372. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/org/__init__.py +0 -0
  373. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/org/http_routes.py +0 -0
  374. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/org/license.py +0 -0
  375. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/org/report.py +0 -0
  376. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/org/store.py +0 -0
  377. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/__init__.py +0 -0
  378. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/astro_shared.py +0 -0
  379. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/complexity.py +0 -0
  380. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/__init__.py +0 -0
  381. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/_route_utils.py +0 -0
  382. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/base.py +0 -0
  383. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/dbt.py +0 -0
  384. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/decorator_routes.py +0 -0
  385. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/django.py +0 -0
  386. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/express.py +0 -0
  387. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/framework_profiles.py +0 -0
  388. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/git_blame.py +0 -0
  389. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/go_routers.py +0 -0
  390. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/laravel.py +0 -0
  391. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/nextjs.py +0 -0
  392. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/nuxt.py +0 -0
  393. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/context/rails.py +0 -0
  394. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/extractor.py +0 -0
  395. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/fqn.py +0 -0
  396. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/grammar_pack.py +0 -0
  397. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/hierarchy.py +0 -0
  398. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/imports.py +0 -0
  399. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/languages.py +0 -0
  400. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/parse_cache.py +0 -0
  401. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/racket_reader.py +0 -0
  402. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/parser/symbols.py +0 -0
  403. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/path_map.py +0 -0
  404. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/progress.py +0 -0
  405. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/redact.py +0 -0
  406. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/reindex_state.py +0 -0
  407. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/__init__.py +0 -0
  408. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/confidence.py +0 -0
  409. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/embed_drift.py +0 -0
  410. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/entropy_prune.py +0 -0
  411. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/freshness.py +0 -0
  412. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/ledger_trust.py +0 -0
  413. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/offload.py +0 -0
  414. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/provenance.py +0 -0
  415. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/query_shape.py +0 -0
  416. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/regret.py +0 -0
  417. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/scoring.py +0 -0
  418. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/signal_fusion.py +0 -0
  419. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/subject_state.py +0 -0
  420. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/tuning.py +0 -0
  421. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/retrieval/verdict.py +0 -0
  422. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/__init__.py +0 -0
  423. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/_calls_store.py +0 -0
  424. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/confidence.py +0 -0
  425. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/diagnostics_ingest.py +0 -0
  426. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/diagnostics_log.py +0 -0
  427. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/http_routes.py +0 -0
  428. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/ingest.py +0 -0
  429. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/otel.py +0 -0
  430. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/redact.py +0 -0
  431. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/resolve.py +0 -0
  432. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/sql_ingest.py +0 -0
  433. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/sql_log.py +0 -0
  434. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/stack_ingest.py +0 -0
  435. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime/stack_log.py +0 -0
  436. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/runtime_identity.py +0 -0
  437. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/secret_classifier.py +0 -0
  438. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/security.py +0 -0
  439. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/server.py +0 -0
  440. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/service_installer.py +0 -0
  441. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/stdio_guard.py +0 -0
  442. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/__init__.py +0 -0
  443. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/embedding_matrix.py +0 -0
  444. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/embedding_store.py +0 -0
  445. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/generation.py +0 -0
  446. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/git_root.py +0 -0
  447. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/process_locks.py +0 -0
  448. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/process_registry.py +0 -0
  449. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/selective.py +0 -0
  450. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/sqlite_store.py +0 -0
  451. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/token_tracker.py +0 -0
  452. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/storage/transcript_roots.py +0 -0
  453. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/summarizer/__init__.py +0 -0
  454. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/summarizer/batch_summarize.py +0 -0
  455. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/summarizer/file_summarize.py +0 -0
  456. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/surface_offer.py +0 -0
  457. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tier_resolver.py +0 -0
  458. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tier_switch_cost.py +0 -0
  459. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/__init__.py +0 -0
  460. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_arg_contract.py +0 -0
  461. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_call_graph.py +0 -0
  462. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_corpus_adequacy.py +0 -0
  463. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_diagnostics_consume.py +0 -0
  464. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_dynamic_boundary.py +0 -0
  465. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_entry_points.py +0 -0
  466. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_git_history.py +0 -0
  467. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_indexing_pipeline.py +0 -0
  468. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_name_reachability.py +0 -0
  469. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_runtime_discovery.py +0 -0
  470. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_scip_consume.py +0 -0
  471. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_stop_rule.py +0 -0
  472. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_test_paths.py +0 -0
  473. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/_utils.py +0 -0
  474. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/analyze_perf.py +0 -0
  475. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/assemble_task_context.py +0 -0
  476. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/audit_agent_config.py +0 -0
  477. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/check_delete_safe.py +0 -0
  478. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/check_edit_safe.py +0 -0
  479. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/check_embedding_drift.py +0 -0
  480. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/check_references.py +0 -0
  481. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/check_rename_safe.py +0 -0
  482. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/decision_context.py +0 -0
  483. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/digest.py +0 -0
  484. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/embed_repo.py +0 -0
  485. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_dead_code.py +0 -0
  486. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_hot_paths.py +0 -0
  487. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_implementations.py +0 -0
  488. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_importers.py +0 -0
  489. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_references.py +0 -0
  490. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_similar_symbols.py +0 -0
  491. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/find_unused_paths.py +0 -0
  492. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/flow_edges.py +0 -0
  493. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_architecture_metrics.py +0 -0
  494. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_blast_radius.py +0 -0
  495. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_call_hierarchy.py +0 -0
  496. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_changed_symbols.py +0 -0
  497. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_churn_rate.py +0 -0
  498. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_class_hierarchy.py +0 -0
  499. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_context_bundle.py +0 -0
  500. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_coupling_metrics.py +0 -0
  501. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_cross_repo_map.py +0 -0
  502. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_dead_code_v2.py +0 -0
  503. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_decorator_census.py +0 -0
  504. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_delivery_metrics.py +0 -0
  505. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_dependency_cycles.py +0 -0
  506. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_dependency_graph.py +0 -0
  507. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_endpoint_impact.py +0 -0
  508. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_extraction_candidates.py +0 -0
  509. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_file_content.py +0 -0
  510. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_file_outline.py +0 -0
  511. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_file_risk.py +0 -0
  512. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_file_tree.py +0 -0
  513. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_group_contracts.py +0 -0
  514. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_hotspots.py +0 -0
  515. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_impact_preview.py +0 -0
  516. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_layer_violations.py +0 -0
  517. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_parity_map.py +0 -0
  518. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_pr_risk_profile.py +0 -0
  519. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_project_intel.py +0 -0
  520. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_ranked_context.py +0 -0
  521. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_redaction_log.py +0 -0
  522. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_related_symbols.py +0 -0
  523. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_repo_health.py +0 -0
  524. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_repo_map.py +0 -0
  525. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_repo_outline.py +0 -0
  526. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_runtime_coverage.py +0 -0
  527. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_session_context.py +0 -0
  528. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_session_snapshot.py +0 -0
  529. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_session_stats.py +0 -0
  530. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_signal_chains.py +0 -0
  531. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_symbol.py +0 -0
  532. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_symbol_complexity.py +0 -0
  533. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_symbol_diff.py +0 -0
  534. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_symbol_importance.py +0 -0
  535. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_symbol_provenance.py +0 -0
  536. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_tectonic_map.py +0 -0
  537. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_untested_symbols.py +0 -0
  538. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/get_watch_status.py +0 -0
  539. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/health_radar.py +0 -0
  540. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/import_runtime_signal.py +0 -0
  541. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/import_scip.py +0 -0
  542. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/index_dependency.py +0 -0
  543. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/index_file.py +0 -0
  544. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/index_folder.py +0 -0
  545. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/index_repo.py +0 -0
  546. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/invalidate_cache.py +0 -0
  547. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/list_repos.py +0 -0
  548. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/list_workspaces.py +0 -0
  549. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/mermaid_viewer.py +0 -0
  550. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/observatory.py +0 -0
  551. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/observatory_render.py +0 -0
  552. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/package_registry.py +0 -0
  553. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/pagerank.py +0 -0
  554. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/plan_refactoring.py +0 -0
  555. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/plan_turn.py +0 -0
  556. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/refresh.py +0 -0
  557. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/register_edit.py +0 -0
  558. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/render_diagram.py +0 -0
  559. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/resolve_repo.py +0 -0
  560. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/search_ast.py +0 -0
  561. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/search_columns.py +0 -0
  562. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/search_symbols.py +0 -0
  563. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/search_text.py +0 -0
  564. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/session_journal.py +0 -0
  565. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/session_state.py +0 -0
  566. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/suggest_corrections.py +0 -0
  567. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/suggest_queries.py +0 -0
  568. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/summarize_repo.py +0 -0
  569. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/test_summarizer.py +0 -0
  570. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/tune_weights.py +0 -0
  571. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/turn_budget.py +0 -0
  572. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/tools/winnow_symbols.py +0 -0
  573. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/version_check.py +0 -0
  574. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/watch_all.py +0 -0
  575. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/src/jcodemunch_mcp/watcher.py +0 -0
  576. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/__init__.py +0 -0
  577. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/conftest.py +0 -0
  578. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/conftest_helpers.py +0 -0
  579. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/encoding/__init__.py +0 -0
  580. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/encoding/test_dispatcher.py +0 -0
  581. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/encoding/test_format.py +0 -0
  582. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/encoding/test_generic_hardened.py +0 -0
  583. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/encoding/test_tier1_roundtrip.py +0 -0
  584. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/al/sample.al +0 -0
  585. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/arduino/sample.ino +0 -0
  586. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/BaseLayout.astro +0 -0
  587. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/ClientIsland.astro +0 -0
  588. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/ContentPage.astro +0 -0
  589. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/DynamicRoute.astro +0 -0
  590. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/WidgetComponent.astro +0 -0
  591. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/WithProps.astro +0 -0
  592. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/sample.astro +0 -0
  593. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/sample_bom_crlf.astro +0 -0
  594. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/sample_malformed_frontmatter.astro +0 -0
  595. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/astro/sample_multi_script.astro +0 -0
  596. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/blade/sample.blade.php +0 -0
  597. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/c/sample.c +0 -0
  598. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/aider_map.json +0 -0
  599. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cocoindex_mcp.json +0 -0
  600. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/code_review_graph_mcp.json +0 -0
  601. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/codebase_memory_mcp.json +0 -0
  602. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/codegraph_mcp.json +0 -0
  603. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/imp_json.json +0 -0
  604. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/index.txt +0 -0
  605. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/inv_default.txt +0 -0
  606. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/inv_json.json +0 -0
  607. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/refs_json.json +0 -0
  608. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/search_json.json +0 -0
  609. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/cymbal/show_json.json +0 -0
  610. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/graft_mcp.json +0 -0
  611. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/serena_mcp.json +0 -0
  612. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/README.txt +0 -0
  613. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/index.txt +0 -0
  614. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/run.sh +0 -0
  615. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/self-P1-cache_put.0.txt +0 -0
  616. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/self-P2-cache_put.0.txt +0 -0
  617. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/self-P4-token_tracker.0.txt +0 -0
  618. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/self-T-router.0.txt +0 -0
  619. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/status.txt +0 -0
  620. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/timings.txt +0 -0
  621. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/competitive/zvec_grep/tools_list.json +0 -0
  622. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/cpp/sample.cpp +0 -0
  623. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/csharp/sample.cs +0 -0
  624. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/dart/sample.dart +0 -0
  625. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/REGENERATE.md +0 -0
  626. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/mypy.jsonl +0 -0
  627. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/pyright.json +0 -0
  628. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/ruff.json +0 -0
  629. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/sample_a.ts +0 -0
  630. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/sample_mod.py +0 -0
  631. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/diagnostics/tsc.txt +0 -0
  632. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/elixir/sample.ex +0 -0
  633. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/gap_ledger_issues.json +0 -0
  634. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/go/sample.go +0 -0
  635. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/grammar_declaration_inventory.json +0 -0
  636. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/java/Sample.java +0 -0
  637. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/javascript/sample.js +0 -0
  638. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/perl/sample.pl +0 -0
  639. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/php/sample.php +0 -0
  640. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/README.md +0 -0
  641. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/app/__init__.py +0 -0
  642. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/app/cli.py +0 -0
  643. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/app/inventory.py +0 -0
  644. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/app/orders.py +0 -0
  645. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/main.go +0 -0
  646. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/pyproject.toml +0 -0
  647. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/web/handlers.ts +0 -0
  648. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/web/router.ts +0 -0
  649. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/pkg_smoke/web/util.js +0 -0
  650. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/python/sample.py +0 -0
  651. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/REGENERATE.md +0 -0
  652. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/atexp-syntax.rkt +0 -0
  653. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/atexp.rkt +0 -0
  654. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/basics.rkt +0 -0
  655. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/forms.rkt +0 -0
  656. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/guards.rkt +0 -0
  657. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/macros.rkt +0 -0
  658. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket/reader.rkt +0 -0
  659. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket_oracle.json +0 -0
  660. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/racket_reader_oracle.json +0 -0
  661. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/razor/Counter.razor +0 -0
  662. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/razor/dotnet_aspnetcore_layout.cshtml +0 -0
  663. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/razor/sample.cshtml +0 -0
  664. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/ruby/sample.rb +0 -0
  665. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust/REGENERATE.md +0 -0
  666. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust/basics.rs +0 -0
  667. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust/guards.rs +0 -0
  668. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust/qualification.rs +0 -0
  669. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust/sample.rs +0 -0
  670. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/rust_oracle.json +0 -0
  671. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/svelte/Counter.svelte +0 -0
  672. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/templates/sample.py.jinja +0 -0
  673. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/templates/sample.ts.j2 +0 -0
  674. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/templates/widget.ts.twig +0 -0
  675. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/typescript/sample.ts +0 -0
  676. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/verilog/sample.sv +0 -0
  677. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/vhdl/sample.vhd +0 -0
  678. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/xml/sample.xml +0 -0
  679. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/fixtures/xml/sample.xul +0 -0
  680. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_blast_radius_counts_its_cross_repo_importers.py +0 -0
  681. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_family_class_behind_an_export_macro_is_a_class.py +0 -0
  682. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_family_enum_behind_an_export_macro_is_an_enum.py +0 -0
  683. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_prototype_is_a_function.py +0 -0
  684. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_struct_member_is_indexed.py +0 -0
  685. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_type_reference_is_not_a_declaration.py +0 -0
  686. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_c_typedef_binds_every_name.py +0 -0
  687. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_class_in_a_method_body_is_not_published_bare.py +0 -0
  688. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_class_member_carries_its_owner.py +0 -0
  689. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_class_defined_with_a_qualified_name_is_nested.py +0 -0
  690. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_function_local_type_is_owned_by_the_function.py +0 -0
  691. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_header_of_prototypes_is_read_as_cpp.py +0 -0
  692. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_out_of_class_definition_is_a_member.py +0 -0
  693. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_specialisation_keeps_its_arguments.py +0 -0
  694. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_cpp_template_span_ends_where_it_starts.py +0 -0
  695. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_dart_extension_type_and_enum_own_their_members.py +0 -0
  696. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_dynamic_import_is_an_edge_or_a_named_boundary.py +0 -0
  697. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_failing_tier_names_its_failures.py +0 -0
  698. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_function_valued_binding_in_a_component_script_is_indexed.py +0 -0
  699. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_go_method_belongs_to_its_receiver.py +0 -0
  700. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_grouped_go_binding_records_its_own_span.py +0 -0
  701. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_grouped_go_type_block_binds_every_name.py +0 -0
  702. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_js_class_expression_is_a_class.py +0 -0
  703. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_js_declarator_records_its_own_span.py +0 -0
  704. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_kotlin_spilled_accessor_owns_its_body.py +0 -0
  705. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_kotlin_top_level_binding_is_not_a_member.py +0 -0
  706. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_latency_tail_is_resampled_before_it_fails.py +0 -0
  707. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_members_parent_survives_disambiguation.py +0 -0
  708. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_near_miss_symbol_id_names_its_candidates.py +0 -0
  709. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_prototype_list_binds_every_name.py +0 -0
  710. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_red_tier_keeps_its_tracebacks.py +0 -0
  711. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_refused_absence_never_reads_as_proof.py +0 -0
  712. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_rust_struct_field_is_indexed.py +0 -0
  713. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_ts_parameter_property_is_a_field.py +0 -0
  714. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_tsx_script_is_read_with_the_tsx_grammar.py +0 -0
  715. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_vue_component_with_two_scripts_indexes_both.py +0 -0
  716. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_vue_options_script_keeps_its_top_level_declarations.py +0 -0
  717. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_vue_or_svelte_script_class_owns_its_members.py +0 -0
  718. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_a_zig_qualified_container_is_a_container.py +0 -0
  719. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_absence_wiring_guard.py +0 -0
  720. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_adaptive_languages.py +0 -0
  721. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_agent_selector.py +0 -0
  722. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_al.py +0 -0
  723. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_an_astro_class_owns_its_members.py +0 -0
  724. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_an_fsharp_and_chain_binds_every_name.py +0 -0
  725. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_an_fsharp_non_rec_and_chain_binds_every_name.py +0 -0
  726. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_an_unbound_class_expression_publishes_its_members.py +0 -0
  727. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_analyze_perf_totals.py +0 -0
  728. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_anthropic_optional.py +0 -0
  729. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_architecture_metrics.py +0 -0
  730. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_architecture_tools.py +0 -0
  731. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_arrow_functions.py +0 -0
  732. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_asm_language.py +0 -0
  733. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_assemble_task_context.py +0 -0
  734. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_astro.py +0 -0
  735. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_audit_agent_config.py +0 -0
  736. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_benchmark_grep_baseline.py +0 -0
  737. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_benchmark_reference.py +0 -0
  738. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_benchmark_tables_mirror_the_reference.py +0 -0
  739. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_blade.py +0 -0
  740. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_blank_identifier_is_not_a_symbol.py +0 -0
  741. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_blast_radius.py +0 -0
  742. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_blast_radius_package_granular_verdict.py +0 -0
  743. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_bm25_cache_single_flight.py +0 -0
  744. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_bm25_correctness.py +0 -0
  745. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_bounded_verdicts_declare_whether_absence_was_established.py +0 -0
  746. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_branch_indexing.py +0 -0
  747. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_build.py +0 -0
  748. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_build_tree_spellings.py +0 -0
  749. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_byte_offset_symbol_names.py +0 -0
  750. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cache_hit_rate_basis.py +0 -0
  751. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cache_mode.py +0 -0
  752. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_call_extraction.py +0 -0
  753. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_call_graph_ast.py +0 -0
  754. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_call_hierarchy.py +0 -0
  755. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_call_outcome_contract.py +0 -0
  756. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_call_references_model.py +0 -0
  757. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_capability_certificate.py +0 -0
  758. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_catalog_moratorium.py +0 -0
  759. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_changed_symbols_blast_describes_until_sha.py +0 -0
  760. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_changed_symbols_blast_keeps_its_verdict.py +0 -0
  761. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_changed_symbols_names_the_files_it_did_not_diff.py +0 -0
  762. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_channel_accuracy.py +0 -0
  763. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_check_delete_safe.py +0 -0
  764. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_check_edit_safe.py +0 -0
  765. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_check_edit_safe_reads_the_dynamic_boundary.py +0 -0
  766. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_check_references.py +0 -0
  767. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_check_rename_safe.py +0 -0
  768. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_churn_rate.py +0 -0
  769. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_churn_rate_never_answers_for_a_target_that_is_not_there.py +0 -0
  770. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ci_env_reproduce_command.py +0 -0
  771. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_class_constant_owner.py +0 -0
  772. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_class_hierarchy.py +0 -0
  773. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_class_state_is_indexed_in_four_more_languages.py +0 -0
  774. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_class_state_is_indexed_in_three_spec_languages.py +0 -0
  775. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_claude_md_policy.py +0 -0
  776. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_claude_md_rotation.py +0 -0
  777. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_claude_md_size.py +0 -0
  778. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cleanup.py +0 -0
  779. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cli.py +0 -0
  780. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cli_env_split.py +0 -0
  781. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cli_output_encoding.py +0 -0
  782. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_code_index_path_is_honoured.py +0 -0
  783. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_code_scanning_triage.py +0 -0
  784. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_aider.py +0 -0
  785. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_checks.py +0 -0
  786. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_cocoindex.py +0 -0
  787. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_code_review_graph.py +0 -0
  788. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_codebase_memory.py +0 -0
  789. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_codegraph.py +0 -0
  790. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_compare_ref.py +0 -0
  791. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_fairness_digest.py +0 -0
  792. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_findings.py +0 -0
  793. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_graft.py +0 -0
  794. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_image_cost.py +0 -0
  795. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_mcp_driver.py +0 -0
  796. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_prerequisites.py +0 -0
  797. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_reindex_one.py +0 -0
  798. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_sandbox.py +0 -0
  799. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_serena.py +0 -0
  800. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_tier.py +0 -0
  801. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_trend.py +0 -0
  802. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_workflows.py +0 -0
  803. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_competitive_zvec_grep.py +0 -0
  804. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_complexity.py +0 -0
  805. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_confidence.py +0 -0
  806. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_confidence_score_scale.py +0 -0
  807. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config.py +0 -0
  808. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_check_hooks.py +0 -0
  809. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_check_matches_resolver.py +0 -0
  810. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_check_names_a_stale_policy.py +0 -0
  811. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_docs_reverse_parity.py +0 -0
  812. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_isolation_guard.py +0 -0
  813. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_lazy_load.py +0 -0
  814. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_set.py +0 -0
  815. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_config_watcher_keys.py +0 -0
  816. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_configuration_md_defaults.py +0 -0
  817. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_constant_extraction_guard.py +0 -0
  818. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_context_providers.py +0 -0
  819. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_copilot_hook.py +0 -0
  820. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_count_cap_end_to_end.py +0 -0
  821. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_counter.py +0 -0
  822. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_counter_surface_stability.py +0 -0
  823. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_counts_survive_truncation.py +0 -0
  824. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cpp_data_members.py +0 -0
  825. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cpp_function_shaped_variables_are_not_functions.py +0 -0
  826. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_credentials.py +0 -0
  827. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_cross_repo.py +0 -0
  828. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_csharp_operator_forms.py +0 -0
  829. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_css.py +0 -0
  830. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dart_imports.py +0 -0
  831. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dbt_provider.py +0 -0
  832. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dead_code_corpus_adequacy.py +0 -0
  833. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dead_code_reads_the_dynamic_import_boundary.py +0 -0
  834. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dead_code_v2.py +0 -0
  835. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_deadcode_eval_harness.py +0 -0
  836. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_declared_forms_extract.py +0 -0
  837. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_decorator_awareness.py +0 -0
  838. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_decorator_census.py +0 -0
  839. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_decorator_routes.py +0 -0
  840. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_deferred_summarization.py +0 -0
  841. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_definition_exclusion_is_case_exact.py +0 -0
  842. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_delete_index_cli.py +0 -0
  843. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_delivery_metrics.py +0 -0
  844. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dependency_graph_imports_alias.py +0 -0
  845. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_description_smells.py +0 -0
  846. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_diagnostics_consumers.py +0 -0
  847. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_diagnostics_ingest.py +0 -0
  848. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_digest.py +0 -0
  849. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dispatch_resolution.py +0 -0
  850. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dispatch_schema_parity.py +0 -0
  851. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dispatcher_arg_mutation.py +0 -0
  852. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_django_provider.py +0 -0
  853. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_docs_config_parity.py +0 -0
  854. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dod_checklist_code_roots.py +0 -0
  855. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dod_retired_test_detection.py +0 -0
  856. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_dod_row1_binding.py +0 -0
  857. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embed_drift.py +0 -0
  858. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embed_model_version_floor.py +0 -0
  859. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embed_repo_error_cause.py +0 -0
  860. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embed_task_type_gate.py +0 -0
  861. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embedding_model_change.py +0 -0
  862. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_embedding_provider_advice.py +0 -0
  863. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_endpoint_impact.py +0 -0
  864. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_endpoint_infra_impact.py +0 -0
  865. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_enum_members_register.py +0 -0
  866. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_every_language_spec_field_has_a_reader.py +0 -0
  867. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_every_served_cache_hit_is_counted_once.py +0 -0
  868. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_exact_match_survives_the_cut.py +0 -0
  869. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_explicit_embed_model_wins.py +0 -0
  870. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_express_provider.py +0 -0
  871. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_extra_extensions.py +0 -0
  872. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_extraction_candidates.py +0 -0
  873. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_fast_path_no_hydration.py +0 -0
  874. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_file_io_encoding_guard.py +0 -0
  875. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_file_summaries.py +0 -0
  876. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_file_summary_member_kinds.py +0 -0
  877. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_dead_code.py +0 -0
  878. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_implementations.py +0 -0
  879. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_importers.py +0 -0
  880. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_importers_discloses_the_dynamic_boundary.py +0 -0
  881. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_references_line_numbers.py +0 -0
  882. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_find_similar_symbols.py +0 -0
  883. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_fqn.py +0 -0
  884. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_framework_build_trees_are_skipped.py +0 -0
  885. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_framework_profiles.py +0 -0
  886. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_framework_script_bindings.py +0 -0
  887. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_freshness.py +0 -0
  888. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_fsharp_abstract_interface_and_constructor_members.py +0 -0
  889. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_fsharp_members_after_static_member_val.py +0 -0
  890. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_full_save_keeps_embedding_meta.py +0 -0
  891. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_full_tier_coverage_core.py +0 -0
  892. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_future_version_no_false_absence.py +0 -0
  893. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_fuzzy_search.py +0 -0
  894. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_gap_ledgers_cite_open_issues.py +0 -0
  895. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_gcm.py +0 -0
  896. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_generated_policy_matches_tools_list.py +0 -0
  897. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_generation_contract.py +0 -0
  898. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_changed_symbols.py +0 -0
  899. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_context_bundle.py +0 -0
  900. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_file_outline_integration.py +0 -0
  901. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_file_risk.py +0 -0
  902. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_file_tree.py +0 -0
  903. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_group_contracts.py +0 -0
  904. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_repo_map.py +0 -0
  905. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_get_untested_symbols.py +0 -0
  906. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_git_history_coverage.py +0 -0
  907. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_git_paths_relative_to_index_root.py +0 -0
  908. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_git_root_identity.py +0 -0
  909. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_git_sha_verification.py +0 -0
  910. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_gleam_imports.py +0 -0
  911. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_go_routers_provider.py +0 -0
  912. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_go_variables.py +0 -0
  913. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_grammar_spelled_forms.py +0 -0
  914. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_groq_explainer.py +0 -0
  915. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_groq_voice.py +0 -0
  916. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_guide_respects_disabled_tools.py +0 -0
  917. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_handshake_watchdog.py +0 -0
  918. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hardening.py +0 -0
  919. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_harness_bench_artifact.py +0 -0
  920. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_harness_summary.py +0 -0
  921. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_harness_verdict_lines.py +0 -0
  922. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_haskell_declared_forms.py +0 -0
  923. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_health_radar.py +0 -0
  924. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_health_radar_action.py +0 -0
  925. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hook_budget_tree_kill.py +0 -0
  926. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hook_output_channels.py +0 -0
  927. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hook_path_table.py +0 -0
  928. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hook_steering_fixes.py +0 -0
  929. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hooks.py +0 -0
  930. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_hotspots.py +0 -0
  931. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_html_file_class.py +0 -0
  932. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_identity_mode.py +0 -0
  933. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_identity_normalized_tier.py +0 -0
  934. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_importer_walkers_ask_blast_verdict.py +0 -0
  935. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_bench_table.py +0 -0
  936. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_depeval_apply.py +0 -0
  937. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_depkind.py +0 -0
  938. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_digest.py +0 -0
  939. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_fix_gates.py +0 -0
  940. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_intake_plan.py +0 -0
  941. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_plumbing.py +0 -0
  942. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_prompts.py +0 -0
  943. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_scan.py +0 -0
  944. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_selfcheck.py +0 -0
  945. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_sweep.py +0 -0
  946. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_triage_apply.py +0 -0
  947. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inbound_workflows.py +0 -0
  948. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_incremental.py +0 -0
  949. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_index_channel_tri_state.py +0 -0
  950. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_index_dependency.py +0 -0
  951. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_index_file.py +0 -0
  952. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_index_file_head_advance.py +0 -0
  953. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_index_folder_empty_discovery.py +0 -0
  954. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init.py +0 -0
  955. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init_client_schemas.py +0 -0
  956. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init_home_isolation.py +0 -0
  957. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init_hooks_paths.py +0 -0
  958. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init_minimal.py +0 -0
  959. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_init_policy_matches_surface.py +0 -0
  960. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_install_copilot_hooks.py +0 -0
  961. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_install_pack.py +0 -0
  962. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_install_pack_member_confinement.py +0 -0
  963. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_install_uninstall.py +0 -0
  964. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_integrity_check_cost.py +0 -0
  965. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_inventory_reads_every_channel.py +0 -0
  966. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_investigator_deletion_safety.py +0 -0
  967. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_investigator_entry_point_importer_is_live.py +0 -0
  968. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_investigator_trusts_the_folded_import_match.py +0 -0
  969. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_issue_456_perf_correlation.py +0 -0
  970. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_java_declaration_forms.py +0 -0
  971. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_java_fields.py +0 -0
  972. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_js_bindings.py +0 -0
  973. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_js_class_field_phantom_methods.py +0 -0
  974. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_js_destructured_bindings.py +0 -0
  975. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_js_ts_class_state.py +0 -0
  976. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_json.py +0 -0
  977. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_julia_name_depth.py +0 -0
  978. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_julia_short_functions.py +0 -0
  979. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_key_files_split.py +0 -0
  980. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_kind_enum_is_derived.py +0 -0
  981. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_kotlin_properties.py +0 -0
  982. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_language_pack_generation.py +0 -0
  983. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_language_spec_maps_agree.py +0 -0
  984. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_languages.py +0 -0
  985. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_laravel_provider.py +0 -0
  986. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ledger_field_types.py +0 -0
  987. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_legacy_lock_holder_identity.py +0 -0
  988. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_license_identifier_agreement.py +0 -0
  989. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_list_repos.py +0 -0
  990. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_local_encoder.py +0 -0
  991. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_local_integration.py +0 -0
  992. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_lockfile_version_sync.py +0 -0
  993. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_lsp_bridge.py +0 -0
  994. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_luau_language.py +0 -0
  995. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_mcp_instructions.py +0 -0
  996. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_mcp_pin_carries_its_measurement.py +0 -0
  997. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_member_kind_audit.py +0 -0
  998. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_member_state_is_not_a_constant.py +0 -0
  999. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_meta_disclosure.py +0 -0
  1000. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_migration.py +0 -0
  1001. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_missing_content_cache_is_reported.py +0 -0
  1002. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_mtime_optimization.py +0 -0
  1003. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_name_not_searchable_keeps_its_other_gaps.py +0 -0
  1004. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_negative_evidence.py +0 -0
  1005. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_nesting_depth_channels.py +0 -0
  1006. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_new_languages.py +0 -0
  1007. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_new_languages_v143.py +0 -0
  1008. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_next_entry_points.py +0 -0
  1009. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_nextjs_provider.py +0 -0
  1010. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_nim_exported_routines_are_indexed.py +0 -0
  1011. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_non_ascii_names_keep_refusing.py +0 -0
  1012. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_nuxt_provider.py +0 -0
  1013. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_nuxt_srcdir.py +0 -0
  1014. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_observatory.py +0 -0
  1015. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_observatory_clone_depth.py +0 -0
  1016. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_offload.py +0 -0
  1017. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_offload_contract.py +0 -0
  1018. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_one_declaration_binds_every_name.py +0 -0
  1019. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_one_test_file_predicate.py +0 -0
  1020. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_optional_dep_skips_are_visible.py +0 -0
  1021. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_org_http.py +0 -0
  1022. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_org_license.py +0 -0
  1023. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_org_rollup.py +0 -0
  1024. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pack_api_transport.py +0 -0
  1025. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pack_index_survives_orphan_sweep.py +0 -0
  1026. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pack_marker_not_a_repo_index.py +0 -0
  1027. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_package_json_scripts_are_entry_points.py +0 -0
  1028. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pagerank.py +0 -0
  1029. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_paid_embeddings_optin.py +0 -0
  1030. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parity_map.py +0 -0
  1031. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parse_budget_cancels.py +0 -0
  1032. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parse_budget_python_side.py +0 -0
  1033. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parse_cache.py +0 -0
  1034. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parse_warnings.py +0 -0
  1035. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parser.py +0 -0
  1036. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_parser_generation_upgrade.py +0 -0
  1037. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pascal_fsharp_nim_members_are_owned.py +0 -0
  1038. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pascal_interface_members_are_indexed.py +0 -0
  1039. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pascal_method_implementation_is_indexed.py +0 -0
  1040. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_path_entry_point_invariants.py +0 -0
  1041. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_path_map.py +0 -0
  1042. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_perf_db_path_resolution.py +0 -0
  1043. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_perf_telemetry.py +0 -0
  1044. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_perf_trim_is_per_database.py +0 -0
  1045. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_php_enum_cases_are_indexed.py +0 -0
  1046. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_php_members.py +0 -0
  1047. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pid_reuse_identity.py +0 -0
  1048. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_plan_refactoring.py +0 -0
  1049. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_plan_turn.py +0 -0
  1050. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_plan_turn_absence_is_repo_scoped.py +0 -0
  1051. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_plugin_manifest_sync.py +0 -0
  1052. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_policy_grants_absence_only_on_a_proven_scan.py +0 -0
  1053. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_post_tool_use_hook.py +0 -0
  1054. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_preflight_descriptions_name_every_verdict.py +0 -0
  1055. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_process_code_freshness.py +0 -0
  1056. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_process_locks.py +0 -0
  1057. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_progress.py +0 -0
  1058. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_project_intel.py +0 -0
  1059. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_prompts.py +0 -0
  1060. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_property_based.py +0 -0
  1061. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_provenance.py +0 -0
  1062. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_provider_metadata_and_perf.py +0 -0
  1063. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_psr4.py +0 -0
  1064. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_pulse.py +0 -0
  1065. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_python_class_state.py +0 -0
  1066. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_python_relative_imports.py +0 -0
  1067. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_python_script_dir_imports.py +0 -0
  1068. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_python_sibling_imports.py +0 -0
  1069. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_collections.py +0 -0
  1070. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_config_reparse.py +0 -0
  1071. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_fidelity.py +0 -0
  1072. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_fidelity_artifacts.py +0 -0
  1073. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_lang_gate.py +0 -0
  1074. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_language.py +0 -0
  1075. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_racket_reader.py +0 -0
  1076. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_rails_provider.py +0 -0
  1077. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ranking_ledger.py +0 -0
  1078. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_rate_limit.py +0 -0
  1079. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_razor.py +0 -0
  1080. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_readonly_annotations.py +0 -0
  1081. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_receipt.py +0 -0
  1082. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_redact.py +0 -0
  1083. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_references_compare_normalised_spellings.py +0 -0
  1084. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_refresh_campaign.py +0 -0
  1085. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_refresh_corpus_unreadable.py +0 -0
  1086. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_register_edit.py +0 -0
  1087. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_registry_verify_reads_every_page.py +0 -0
  1088. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_registry_verify_retries_an_unanswered_read.py +0 -0
  1089. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_reindex_state.py +0 -0
  1090. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_related_symbols.py +0 -0
  1091. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_release_cadence_gate.py +0 -0
  1092. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_release_install_is_its_own_probe.py +0 -0
  1093. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_release_notes_fit_the_github_limit.py +0 -0
  1094. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_release_preflight.py +0 -0
  1095. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_render_diagram.py +0 -0
  1096. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_render_diagram_integration.py +0 -0
  1097. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_render_diagram_viewer.py +0 -0
  1098. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_repeat_root_walk_additional.py +0 -0
  1099. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_repeat_subdir_walk.py +0 -0
  1100. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_replay_metrics.py +0 -0
  1101. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_repo_health.py +0 -0
  1102. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_repo_key_lookup_caches_what_it_learned.py +0 -0
  1103. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_resolve_repo.py +0 -0
  1104. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_resolve_repo_nested_repo_boundary.py +0 -0
  1105. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_response_cap.py +0 -0
  1106. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_result_cache.py +0 -0
  1107. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_result_cache_isolation.py +0 -0
  1108. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_retirement_ledger.py +0 -0
  1109. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_retrieval_counterfactual.py +0 -0
  1110. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_retrieval_inflation.py +0 -0
  1111. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_retrieval_tools.py +0 -0
  1112. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_reuse_audit.py +0 -0
  1113. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_route_binary_pilot_is_frozen.py +0 -0
  1114. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_route_criterion_has_one_authority.py +0 -0
  1115. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_route_recall_artifacts_are_fresh.py +0 -0
  1116. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_route_utils.py +0 -0
  1117. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_evidence_names_the_body_it_observed.py +0 -0
  1118. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_hit_count_column.py +0 -0
  1119. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase0.py +0 -0
  1120. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase1.py +0 -0
  1121. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase2.py +0 -0
  1122. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase3.py +0 -0
  1123. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase4.py +0 -0
  1124. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase5.py +0 -0
  1125. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase6.py +0 -0
  1126. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_runtime_phase7.py +0 -0
  1127. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_rust_fidelity.py +0 -0
  1128. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_rust_fidelity_artifacts.py +0 -0
  1129. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_savings_baseline.py +0 -0
  1130. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_savings_by_tool.py +0 -0
  1131. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_savings_two_carriers.py +0 -0
  1132. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_savings_usd_basis.py +0 -0
  1133. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_scala_given.py +0 -0
  1134. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_scala_parser.py +0 -0
  1135. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_schema_baseline_transcription.py +0 -0
  1136. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_schema_budget.py +0 -0
  1137. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_schtasks_locale.py +0 -0
  1138. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_scip_evidence.py +0 -0
  1139. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_sdist_exclusions.py +0 -0
  1140. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_ast_encoder_contract.py +0 -0
  1141. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_columns.py +0 -0
  1142. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_perf.py +0 -0
  1143. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_result_cache.py +0 -0
  1144. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_symbols_defaults.py +0 -0
  1145. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_search_symbols_tie_order.py +0 -0
  1146. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_secret_classifier.py +0 -0
  1147. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_security.py +0 -0
  1148. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_security_disclosure.py +0 -0
  1149. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_security_exclusions_are_project_overridable.py +0 -0
  1150. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_security_md_limits_parity.py +0 -0
  1151. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_security_md_policy.py +0 -0
  1152. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_selective_snapshot.py +0 -0
  1153. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_semantic_extra_floor.py +0 -0
  1154. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_semantic_search.py +0 -0
  1155. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_server.py +0 -0
  1156. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_server_json_sync.py +0 -0
  1157. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_session_journal.py +0 -0
  1158. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_session_snapshot.py +0 -0
  1159. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_session_state.py +0 -0
  1160. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_session_state_does_not_leak_between_tests.py +0 -0
  1161. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_share_savings.py +0 -0
  1162. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_signal_fusion.py +0 -0
  1163. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_size_cap_end_to_end.py +0 -0
  1164. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_skill_candidates.py +0 -0
  1165. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_skills.py +0 -0
  1166. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_solidity_declarations.py +0 -0
  1167. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_source_drift.py +0 -0
  1168. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_sql_language.py +0 -0
  1169. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_sqlite_store.py +0 -0
  1170. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_standard_invariants.py +0 -0
  1171. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_stdio_guard.py +0 -0
  1172. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_stop_rule.py +0 -0
  1173. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_storage.py +0 -0
  1174. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_storage_path_resolution.py +0 -0
  1175. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_streamable_http_integration.py +0 -0
  1176. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_streamable_http_sessions.py +0 -0
  1177. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_strict_deny_requires_resolvable_target.py +0 -0
  1178. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_subprocess_encoding_guard.py +0 -0
  1179. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_suggest_corrections.py +0 -0
  1180. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_suggest_queries.py +0 -0
  1181. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_summarize_from_docstrings.py +0 -0
  1182. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_summarizer.py +0 -0
  1183. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_surface_cli.py +0 -0
  1184. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_surface_diff.py +0 -0
  1185. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_surface_offer.py +0 -0
  1186. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_svelte.py +0 -0
  1187. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_swift_deinit_is_a_method.py +0 -0
  1188. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_swift_parser.py +0 -0
  1189. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_swift_protocol_requirements.py +0 -0
  1190. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_symbol_complexity.py +0 -0
  1191. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_symbol_diff.py +0 -0
  1192. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_taskcomplete_real_contract.py +0 -0
  1193. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tectonic_map.py +0 -0
  1194. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tectonic_partition_hub.py +0 -0
  1195. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tectonic_temporal_signal.py +0 -0
  1196. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_telemetry_db_skip.py +0 -0
  1197. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_templates.py +0 -0
  1198. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_thresholds_are_the_only_copy.py +0 -0
  1199. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tier_resolver.py +0 -0
  1200. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tier_runtime.py +0 -0
  1201. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tier_switch_cost.py +0 -0
  1202. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_token_benchmark_floor.py +0 -0
  1203. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_token_budget_context.py +0 -0
  1204. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_toml_end_line.py +0 -0
  1205. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tool_kind_sets_derive_from_kind_order.py +0 -0
  1206. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tool_registration.py +0 -0
  1207. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tool_surface_clamp.py +0 -0
  1208. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tools.py +0 -0
  1209. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_transcript_roots.py +0 -0
  1210. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tree_id_is_content_identity.py +0 -0
  1211. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_truncated_flag.py +0 -0
  1212. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ts_abstract_class.py +0 -0
  1213. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ts_module_extensions.py +0 -0
  1214. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_ts_type_only_imports.py +0 -0
  1215. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_tsconfig_walk_cost.py +0 -0
  1216. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_turn_budget.py +0 -0
  1217. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_undeclared_table_guard.py +0 -0
  1218. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_unicode_escapes_name_the_same_identifier.py +0 -0
  1219. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_unloadable_index_rebuild_disclosure.py +0 -0
  1220. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_unsettled_verdicts_are_never_terminal.py +0 -0
  1221. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_usage_question_routes_to_usage_tool.py +0 -0
  1222. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_0.py +0 -0
  1223. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_101.py +0 -0
  1224. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_102.py +0 -0
  1225. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_103.py +0 -0
  1226. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_104.py +0 -0
  1227. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_105.py +0 -0
  1228. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_106.py +0 -0
  1229. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_107.py +0 -0
  1230. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_108.py +0 -0
  1231. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_110.py +0 -0
  1232. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_114.py +0 -0
  1233. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_115.py +0 -0
  1234. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_118.py +0 -0
  1235. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_119.py +0 -0
  1236. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_120.py +0 -0
  1237. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_121.py +0 -0
  1238. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_122.py +0 -0
  1239. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_125.py +0 -0
  1240. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_126.py +0 -0
  1241. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_127.py +0 -0
  1242. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_128.py +0 -0
  1243. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_129.py +0 -0
  1244. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_134.py +0 -0
  1245. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_136.py +0 -0
  1246. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_137.py +0 -0
  1247. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_139.py +0 -0
  1248. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_146.py +0 -0
  1249. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_147.py +0 -0
  1250. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_148.py +0 -0
  1251. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_149.py +0 -0
  1252. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_150.py +0 -0
  1253. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_151.py +0 -0
  1254. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_152.py +0 -0
  1255. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_153.py +0 -0
  1256. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_156.py +0 -0
  1257. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_158.py +0 -0
  1258. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_159.py +0 -0
  1259. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_160.py +0 -0
  1260. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_161.py +0 -0
  1261. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_162.py +0 -0
  1262. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_163.py +0 -0
  1263. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_164.py +0 -0
  1264. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_165.py +0 -0
  1265. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_166.py +0 -0
  1266. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_167.py +0 -0
  1267. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_168.py +0 -0
  1268. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_169.py +0 -0
  1269. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_171.py +0 -0
  1270. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_172.py +0 -0
  1271. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_173.py +0 -0
  1272. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_174.py +0 -0
  1273. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_175.py +0 -0
  1274. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_176.py +0 -0
  1275. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_177.py +0 -0
  1276. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_178.py +0 -0
  1277. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_179.py +0 -0
  1278. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_180.py +0 -0
  1279. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_181.py +0 -0
  1280. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_182.py +0 -0
  1281. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_183.py +0 -0
  1282. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_184.py +0 -0
  1283. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_185.py +0 -0
  1284. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_186.py +0 -0
  1285. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_187.py +0 -0
  1286. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_188.py +0 -0
  1287. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_189.py +0 -0
  1288. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_190.py +0 -0
  1289. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_191.py +0 -0
  1290. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_192.py +0 -0
  1291. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_193.py +0 -0
  1292. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_194.py +0 -0
  1293. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_199.py +0 -0
  1294. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_2.py +0 -0
  1295. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_200.py +0 -0
  1296. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_201.py +0 -0
  1297. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_206.py +0 -0
  1298. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_207.py +0 -0
  1299. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_208.py +0 -0
  1300. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_209.py +0 -0
  1301. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_210.py +0 -0
  1302. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_211.py +0 -0
  1303. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_223.py +0 -0
  1304. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_224.py +0 -0
  1305. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_225.py +0 -0
  1306. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_226.py +0 -0
  1307. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_227.py +0 -0
  1308. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_228.py +0 -0
  1309. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_229.py +0 -0
  1310. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_230.py +0 -0
  1311. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_231.py +0 -0
  1312. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_234.py +0 -0
  1313. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_269.py +0 -0
  1314. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_270.py +0 -0
  1315. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_271.py +0 -0
  1316. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_272.py +0 -0
  1317. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_273.py +0 -0
  1318. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_275.py +0 -0
  1319. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_276.py +0 -0
  1320. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_277.py +0 -0
  1321. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_281.py +0 -0
  1322. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_55.py +0 -0
  1323. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_56.py +0 -0
  1324. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_57.py +0 -0
  1325. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_58.py +0 -0
  1326. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_59.py +0 -0
  1327. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_63.py +0 -0
  1328. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_64.py +0 -0
  1329. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_70.py +0 -0
  1330. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_71.py +0 -0
  1331. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_72.py +0 -0
  1332. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_73.py +0 -0
  1333. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_74.py +0 -0
  1334. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_78.py +0 -0
  1335. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_80.py +0 -0
  1336. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_81.py +0 -0
  1337. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_83.py +0 -0
  1338. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_84.py +0 -0
  1339. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_85.py +0 -0
  1340. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_86.py +0 -0
  1341. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_92.py +0 -0
  1342. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_95.py +0 -0
  1343. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_108_99.py +0 -0
  1344. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_80_10_dead_code_intra_file_calls.py +0 -0
  1345. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_80_7_dead_code_js_reexports.py +0 -0
  1346. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_v1_80_9_lodash_class.py +0 -0
  1347. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_verdict_coverage_calibration.py +0 -0
  1348. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_version_check.py +0 -0
  1349. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_vue_svelte_comment_lookup_is_linear.py +0 -0
  1350. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watch_all.py +0 -0
  1351. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watch_claude.py +0 -0
  1352. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watch_once.py +0 -0
  1353. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_dynamic.py +0 -0
  1354. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_hash_delta.py +0 -0
  1355. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_knob_parity.py +0 -0
  1356. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_lock.py +0 -0
  1357. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_memory_cache.py +0 -0
  1358. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_polling_default.py +0 -0
  1359. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_registration_indexing.py +0 -0
  1360. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_root_removed_during_a_poll.py +0 -0
  1361. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_serve.py +0 -0
  1362. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_watcher_symlink_safety.py +0 -0
  1363. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_weekly_results_pr_once.py +0 -0
  1364. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_weight_tuning.py +0 -0
  1365. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_whatsnew.py +0 -0
  1366. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_winnow_symbols.py +0 -0
  1367. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_workflow_commit_identity.py +0 -0
  1368. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_workflow_hooks.py +0 -0
  1369. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_workflows_pinned.py +0 -0
  1370. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_workflows_registered.py +0 -0
  1371. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_worktree_identity_resolves_its_own_index.py +0 -0
  1372. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_yaml_byte_extent.py +0 -0
  1373. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_yaml_key_coercion.py +0 -0
  1374. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_yaml_language.py +0 -0
  1375. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_yaml_line_location.py +0 -0
  1376. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/tests/test_zig_powershell_matlab_members_are_owned.py +0 -0
  1377. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/.gitignore +0 -0
  1378. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/.vscodeignore +0 -0
  1379. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/README.md +0 -0
  1380. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/package-lock.json +0 -0
  1381. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/package.json +0 -0
  1382. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/src/extension.ts +0 -0
  1383. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/vscode-extension/src/riskGutter.ts +0 -0
  1384. {jcodemunch_mcp-1.108.332 → jcodemunch_mcp-1.108.333}/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.332",
5
+ "version": "1.108.333",
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,77 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.108.333] - 2026-10-07 - the parse budget stops a slow parse again on a fresh install
6
+
7
+ ### Fixed
8
+
9
+ - **`init`'s index line reports what the indexer did (reported by Dave).** After indexing,
10
+ `jcodemunch-mcp init` printed `indexed <folder> (? files, ? symbols)`. The line read
11
+ `files_indexed` and `symbols_indexed` from the indexer's result. No run returns the second,
12
+ 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
13
+ re-indexes some files answers `changed`, `new`, `deleted` and `symbol_count`. So the line has
14
+ read `? symbols` for every index `init` ran since the command arrived (2026-04-03), and
15
+ `? files` for all but a capped one. It also
16
+ read `indexed` for a run the indexer had refused, a folder with no source file among them.
17
+ The line now has one form per answer (`evidence/init_index_line.txt`, the real indexer on a
18
+ scratch project): `indexed <folder> (2 files, 3 symbols)`,
19
+ `indexed <folder> (1 changed, 1 new, 1 deleted, 3 symbols)`,
20
+ `<folder> is up to date (nothing changed since the last index)`, and
21
+ `indexing failed: No source files found`. A count the result does not carry is left out, and
22
+ a run the file cap cut short adds `the file cap was reached, 2 of 4 files are in the index` to
23
+ whichever form it has.
24
+ Nothing had tested the line: the `init` tests replace the function that writes it. The new
25
+ tests run the real indexer on a project they own
26
+ (`tests/test_init_index_summary_reads_the_indexers_result.py`). The index itself was correct.
27
+ Not changed: the indexer's `warnings` (a file skipped by the parse budget, a provider skipped)
28
+ are still not printed by `init`. A test that reads the same absent key is LEDGER L-134.
29
+
30
+ - **Three more ways a macro got the wrong docstring (LEDGER L-129, L-130, L-131).** 1.108.332
31
+ gave a dbt or Jinja/Twig directive the `{# comment #}` that ends directly above it; its
32
+ review found three inputs the rule still read wrongly, measured through `parse_file` on
33
+ 1.108.332 and then on the fix (`evidence/l129_l131_before_after.txt`). A comment that TRAILS
34
+ code on its line was taken by the directive on the next line: after
35
+ `{% macro a() %}select 1{% endmacro %} {# end of a #}`, `b` read `end of a` and reads nothing.
36
+ The comment must now be first on its line, with only other comments (or a `--` lead) before it
37
+ there. A `{#`
38
+ inside an expression opened a comment: with `{{ '{#' }}` in the macro above, `second` read
39
+ `' }}{% endmacro %}` and the line after it, and reads `about second`. The file is read as
40
+ Jinja reads it, `{{ ... }}`, `{% ... %}` and `{# ... #}` left to right, each to its first
41
+ closer. And a whitespace-control mark was dropped whatever the dialect: `{#~approx 5 rows#}`
42
+ in a `.sql` read `approx 5 rows` and reads `~approx 5 rows`; `{#+1 to the offset #}` in a
43
+ `.twig` read `1 to the offset` and reads `+1 to the offset`. `-` is a mark everywhere, `+` in
44
+ Jinja and dbt, `~` in Twig. Nothing inside `{% raw %}` or `{% verbatim %}` is a delimiter, and
45
+ a byte-order mark or a zero-width space before a comment is not text, so a file that starts
46
+ with a BOM keeps its first docstring. ⚠ The docstring changes on unchanged content, so
47
+ `PARSER_GENERATION` is 11 and an existing index re-parses once at its next index run; no
48
+ symbol id moves. ⚠ What reads WORSE than on 1.108.332 (LEDGER L-132, same evidence file):
49
+ a stray `{{` or `{%` outside a raw block that has a later closer is one expression up to that
50
+ closer, so `-- wrap in {{ to call` above a documented macro, with a `{{ x }}` further down,
51
+ costs that macro its docstring (`doc` before, nothing now); Jinja itself refuses such a file.
52
+ A closer inside a string in an expression (`{{ '}}' }}`) still ends the expression there, and
53
+ when the leftover holds an opener (`{{ '}} {%' }}`) the documented macro below it loses its
54
+ docstring too.
55
+ Not run: a dbt, Jinja or Twig corpus.
56
+
57
+ - **The parse budget stops a slow parse again on a fresh install (reported by Dave).** The
58
+ per-file budget (`JCODEMUNCH_PARSE_BUDGET_SECONDS`, 1.108.329) stops tree-sitter's C parse
59
+ through `Parser.timeout_micros`. tree-sitter 0.26.0 removed that attribute, and the
60
+ dependency read `tree-sitter>=0.25` with no upper bound, so an install that resolved 0.26.0
61
+ could no longer stop a parse. Its only sign was one line at index time: `the installed
62
+ tree-sitter has no Parser.timeout_micros`. Measured with this tree's source and a 0.5 s budget
63
+ on a 405,035-byte Python file (`evidence/tree_sitter_026.txt`): on tree-sitter 0.25.2 the file
64
+ is stopped after 0.54 s; on 0.26.0 after 7.06 s, when the parse had run to its end. Through
65
+ `index_folder` the file is named as skipped on both (`parse exceeded the 0.5s budget`), so no
66
+ wrong symbol was served; the time was spent. CI never saw
67
+ it: it installs from `uv.lock`, which pins 0.25.2, and the guard that fails on a binding
68
+ without the attribute runs there. The range is now `>=0.25,<0.26`, so an upgrade moves such an
69
+ install back to a version that can stop a parse, and
70
+ `tests/test_tree_sitter_range_is_the_tested_range.py` fails when the declared range admits any
71
+ release past the locked minor, an exclusion such as `!=0.26.0` included. The warning now names
72
+ the remedy. Not changed: tree-sitter
73
+ 0.26 is not supported; its replacement for the timeout, a progress callback, crashed the
74
+ interpreter when it was tried on 0.25.2 (LEDGER L-133).
75
+
5
76
  ## [1.108.332] - 2026-10-07 - a macro's docstring is the comment directly above it
6
77
 
7
78
  ### Fixed
@@ -2228,3 +2228,17 @@ 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).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: jcodemunch-mcp
3
- Version: 1.108.332
3
+ Version: 1.108.333
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>=0.25
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.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
250
  - **[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
251
  - **[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
252
  - **[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.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
162
  - **[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
163
  - **[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
164
  - **[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
  ---
@@ -248,6 +248,7 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
248
248
  | 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
249
  | 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
250
  | 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). |
251
+ | 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
252
  | 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
253
  | 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
254
  | 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 +352,10 @@ Criterion codes: 1 correctness, 2 token reduction, 3 freshness/caches/absence, 4
351
352
  | 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
353
  | 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
354
  | 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 |
355
+ | 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
356
  | 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 10. | "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
+ | 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. |
358
+ | 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
359
  | 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
360
  | 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
361
  | 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. |
@@ -176,7 +176,10 @@ with jjg's reason. Keep the row. To promote a row to an issue, set Status to
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 | OPEN |
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 | OPEN |
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 | 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. 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). Not run: the callback on 0.26.0 itself. Until it works, 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 | OPEN |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "jcodemunch-mcp"
3
- version = "1.108.332"
3
+ version = "1.108.333"
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
- "tree-sitter>=0.25",
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.332",
6
+ "version": "1.108.333",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "pypi",
10
10
  "identifier": "jcodemunch-mcp",
11
- "version": "1.108.332",
11
+ "version": "1.108.333",
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
- result = index_folder(path=cwd)
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
  # ---------------------------------------------------------------------------
@@ -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 leaves only the thread
20
- wait; `bind()` says so once in the log and
21
- `tests/test_parse_budget_cancels.py` fails on it.
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)
@@ -71,9 +71,25 @@ _LINE_BREAK_RE = re.compile(
71
71
  + "".join(chr(c) for c in (0x0A, 0x0D, 0x0B, 0x0C, 0x1C, 0x1D, 0x1E, 0x85, 0x2028, 0x2029))
72
72
  + "]"
73
73
  )
74
- _NON_SPACE_RE = re.compile(r"\S")
75
- # what may stand between a comment delimiter and its body: `{#-`, `{#+`, `{#~`
76
- _WHITESPACE_CONTROL_MARKS = ("-", "+", "~")
74
+ # A byte-order mark and a zero-width space print nothing and are not text: a
75
+ # file that starts with a BOM still starts with its first comment.
76
+ _INVISIBLE = chr(0xFEFF) + chr(0x200B)
77
+ _NON_SPACE_RE = re.compile(r"[^\s" + _INVISIBLE + "]")
78
+ # What may stand between a comment delimiter and its body, per dialect (L-131):
79
+ # `{#-` everywhere, `{#+` in Jinja and dbt, `{#~` in Twig. The other dialect's
80
+ # mark is the comment's own text.
81
+ JINJA_WHITESPACE_MARKS = ("-", "+")
82
+ TWIG_WHITESPACE_MARKS = ("-", "~")
83
+ # `{{`, `{%` and `{#`, and what closes each
84
+ _JINJA_OPENER_RE = re.compile(r"\{[{%#]")
85
+ _JINJA_CLOSER = {"{": "}}", "%": "%}", "#": "#}"}
86
+ # `{% raw %}` (Jinja) and `{% verbatim %}` (Twig): nothing up to the end tag is
87
+ # a delimiter, so a `{{` written there opens no expression.
88
+ _RAW_OPEN_RE = re.compile(r"\{%[-+~]?\s*(raw|verbatim)\s*[-+~]?%\}")
89
+ _RAW_END_RE = {
90
+ word: re.compile(r"\{%[-+~]?\s*end" + word + r"\s*[-+~]?%\}")
91
+ for word in ("raw", "verbatim")
92
+ }
77
93
 
78
94
 
79
95
  class _PrecedingComments:
@@ -95,25 +111,81 @@ class _PrecedingComments:
95
111
  of the file and checked only that the text before the directive ended in
96
112
  ``#}``, so every documented macro after the first carried the FIRST
97
113
  comment of the file. A ``#}`` that closes no comment is not one.
114
+
115
+ ⚠⚠ Three more rules, each a wrong docstring before it (L-129, L-130,
116
+ L-131). The comment is FIRST ON ITS LINE, with only other comments before
117
+ it there (or a ``--`` lead): one that trails code (``{% endmacro %} {# end of a #}``) belongs
118
+ to that code, not to the directive on the next line. The file is read as
119
+ Jinja reads it, ``{{ ... }}``, ``{% ... %}`` and ``{# ... #}`` left to
120
+ right, so a ``{#`` inside an expression or a tag opens no comment, and
121
+ nothing inside ``{% raw %}`` or ``{% verbatim %}`` opens anything. And a
122
+ whitespace-control mark is dropped only if it is this dialect's.
98
123
  """
99
124
 
100
- def __init__(self, text: str) -> None:
125
+ def __init__(self, text: str, whitespace_marks: tuple[str, ...] = JINJA_WHITESPACE_MARKS) -> None:
101
126
  self._text = text
127
+ self._marks = whitespace_marks
102
128
  self._line_starts = [0] + [m.end() for m in _LINE_BREAK_RE.finditer(text)]
103
129
  self._line_ends = [m.start() for m in _LINE_BREAK_RE.finditer(text)] + [len(text)]
104
130
  self._first_text: dict[int, int] = {} # line index -> its first non-space character
105
131
  # where a comment ends -> where its body starts. Read left to right,
106
- # a comment running to the first `#}` after its `{#`; when a `{#` has
107
- # no `#}`, no later one has either.
132
+ # each `{{`, `{%` or `{#` running to the first closer of its kind.
133
+ # When one has no closer, no later one of that kind has either, so
134
+ # that kind is text from there on (one failed search per kind).
108
135
  self._comment_body_start: dict[int, int] = {}
109
- opened = text.find("{#")
110
- while opened >= 0:
136
+ unclosed: set[str] = set() # also a raw word whose end tag is nowhere ahead
137
+ pos = 0
138
+ while True:
111
139
  parse_budget.checkpoint()
112
- closed = text.find("#}", opened + 2)
113
- if closed < 0:
140
+ found = _JINJA_OPENER_RE.search(text, pos)
141
+ if found is None:
114
142
  break
115
- self._comment_body_start[closed + 2] = opened + 2
116
- opened = text.find("{#", closed + 2)
143
+ opened = found.start()
144
+ kind = text[opened + 1]
145
+ if kind == "%":
146
+ raw_tag = _RAW_OPEN_RE.match(text, opened)
147
+ if raw_tag is not None and raw_tag.group(1) not in unclosed:
148
+ ended = _RAW_END_RE[raw_tag.group(1)].search(text, raw_tag.end())
149
+ if ended is not None:
150
+ pos = ended.end()
151
+ continue
152
+ unclosed.add(raw_tag.group(1))
153
+ closed = -1 if kind in unclosed else text.find(_JINJA_CLOSER[kind], opened + 2)
154
+ if closed < 0:
155
+ unclosed.add(kind)
156
+ pos = opened + 1
157
+ continue
158
+ if kind == "#":
159
+ self._comment_body_start[closed + 2] = opened + 2
160
+ pos = closed + 2
161
+
162
+ def _first_text_of(self, idx: int) -> int:
163
+ """Where line ``idx``'s first visible character is; its end when it has none."""
164
+ first_text = self._first_text.get(idx)
165
+ if first_text is None:
166
+ found = _NON_SPACE_RE.search(self._text, self._line_starts[idx], self._line_ends[idx])
167
+ first_text = self._first_text[idx] = found.start() if found else self._line_ends[idx]
168
+ return first_text
169
+
170
+ def _is_first_on_its_line(self, opened: int) -> bool:
171
+ """Whether only space, and other comments, stand between a line start and ``opened``."""
172
+ text = self._text
173
+ pos = opened
174
+ while True:
175
+ parse_budget.checkpoint()
176
+ first_text = self._first_text_of(bisect.bisect_right(self._line_starts, pos) - 1)
177
+ # A line that starts with `--` is a comment up to here, not code:
178
+ # `-- note {# doc #}` leaves the Jinja comment first of its kind.
179
+ if first_text >= pos or text.startswith("--", first_text, pos):
180
+ return True
181
+ # text stands before `pos` on this line, so this stops at it
182
+ while text[pos - 1].isspace() or text[pos - 1] in _INVISIBLE:
183
+ parse_budget.checkpoint()
184
+ pos -= 1
185
+ body_start = self._comment_body_start.get(pos) # a comment ends here
186
+ if body_start is None:
187
+ return False
188
+ pos = body_start - 2
117
189
 
118
190
  @staticmethod
119
191
  def _clean(comment_body: str) -> str:
@@ -144,14 +216,14 @@ class _PrecedingComments:
144
216
 
145
217
  # Check for {# comment #} immediately before
146
218
  body_start = self._comment_body_start.get(end)
147
- if body_start is not None:
219
+ if body_start is not None and self._is_first_on_its_line(body_start - 2):
148
220
  body = text[body_start:end - 2]
149
221
  # `{#- ... -#}` trims the whitespace around the comment; the
150
- # dashes are the delimiter's, not the comment's. So are Jinja's
151
- # `+` and Twig's `~`. One mark per side, read before any space.
152
- if body[:1] in _WHITESPACE_CONTROL_MARKS:
222
+ # mark is the delimiter's, not the comment's. One mark per side,
223
+ # read before any space, and only this dialect's.
224
+ if body[:1] in self._marks:
153
225
  body = body[1:]
154
- if body[-1:] in _WHITESPACE_CONTROL_MARKS:
226
+ if body[-1:] in self._marks:
155
227
  body = body[:-1]
156
228
  return self._clean(body)
157
229
 
@@ -161,10 +233,7 @@ class _PrecedingComments:
161
233
  line_end = end
162
234
  while idx >= 0:
163
235
  parse_budget.checkpoint()
164
- first_text = self._first_text.get(idx)
165
- if first_text is None:
166
- found = _NON_SPACE_RE.search(text, self._line_starts[idx], self._line_ends[idx])
167
- first_text = self._first_text[idx] = found.start() if found else self._line_ends[idx]
236
+ first_text = self._first_text_of(idx)
168
237
  if text.startswith("--", first_text, line_end):
169
238
  lines.append(text[first_text + 2:line_end].strip())
170
239
  elif first_text >= line_end:
@@ -183,6 +252,7 @@ class _PrecedingComments:
183
252
  def extract_dbt_directives(
184
253
  sql_bytes: bytes,
185
254
  directive_keywords: tuple[str, ...] = _DEFAULT_DBT_DIRECTIVES,
255
+ whitespace_marks: tuple[str, ...] = JINJA_WHITESPACE_MARKS,
186
256
  ) -> list[DbtDirective]:
187
257
  """Extract Jinja ``{% <kw> name(params) %}`` directive blocks as metadata.
188
258
 
@@ -202,7 +272,7 @@ def extract_dbt_directives(
202
272
  sql_str = sql_bytes.decode("utf-8", errors="replace")
203
273
  directives: list[DbtDirective] = []
204
274
  newline_offsets = [m.start() for m in re.finditer("\n", sql_str)]
205
- comments = _PrecedingComments(sql_str)
275
+ comments = _PrecedingComments(sql_str, tuple(whitespace_marks))
206
276
  # directive keyword -> (starts, ends) of every end tag of that keyword
207
277
  end_tags: dict[str, tuple[list[int], list[int]]] = {}
208
278
 
@@ -33,7 +33,7 @@ from dataclasses import dataclass
33
33
  from typing import Callable, Optional
34
34
 
35
35
  from . import parse_budget
36
- from .sql_preprocessor import extract_dbt_directives
36
+ from .sql_preprocessor import JINJA_WHITESPACE_MARKS, TWIG_WHITESPACE_MARKS, extract_dbt_directives
37
37
  from .symbols import Symbol, compute_content_hash, make_symbol_id
38
38
 
39
39
 
@@ -53,6 +53,10 @@ _TEMPLATE_DIRECTIVES = ("macro", "block")
53
53
  # named, overridable region (constant-like named anchor).
54
54
  _DIRECTIVE_KIND = {"macro": "function", "block": "constant"}
55
55
 
56
+ # Engine -> the whitespace-control marks of its comment delimiters (L-131);
57
+ # an engine not named here reads as Jinja.
58
+ _WHITESPACE_MARKS = {"twig": TWIG_WHITESPACE_MARKS}
59
+
56
60
 
57
61
  def extract_jinja_directives(
58
62
  text: str, filename: str, language: str = "jinja"
@@ -68,7 +72,9 @@ def extract_jinja_directives(
68
72
  """
69
73
  symbols: list[Symbol] = []
70
74
  for d in extract_dbt_directives(
71
- text.encode("utf-8"), directive_keywords=_TEMPLATE_DIRECTIVES
75
+ text.encode("utf-8"),
76
+ directive_keywords=_TEMPLATE_DIRECTIVES,
77
+ whitespace_marks=_WHITESPACE_MARKS.get(language, JINJA_WHITESPACE_MARKS),
72
78
  ):
73
79
  parse_budget.checkpoint()
74
80
  kind = _DIRECTIVE_KIND[d.directive]
@@ -586,7 +586,13 @@ INDEX_VERSION = 17
586
586
  # it as its docstring. Every such directive after the first documented one
587
587
  # carried the FIRST comment of the file. ⚠⚠ No symbol id moves; only
588
588
  # `docstring` (and a summary built from it) changes, on UNCHANGED content.
589
- PARSER_GENERATION = 10
589
+ #
590
+ # 11 (L-129, L-130, L-131): three more rules for that docstring. A comment
591
+ # that trails code on its line is not the next directive's; a `{#` inside
592
+ # `{{ ... }}` or `{% ... %}` opens no comment; and a whitespace-control
593
+ # mark is dropped only for its own dialect (`+` Jinja and dbt, `~` Twig).
594
+ # ⚠⚠ No symbol id moves; only `docstring` changes, on UNCHANGED content.
595
+ PARSER_GENERATION = 11
590
596
 
591
597
 
592
598
  @dataclass(frozen=True)