code-graph-rag 0.0.945__tar.gz → 0.0.996__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 (376) hide show
  1. {code_graph_rag-0.0.945/code_graph_rag.egg-info → code_graph_rag-0.0.996}/PKG-INFO +8 -11
  2. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/PYPI_README.md +7 -10
  3. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/README.md +6 -6
  4. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996/code_graph_rag.egg-info}/PKG-INFO +8 -11
  5. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/code_graph_rag.egg-info/SOURCES.txt +13 -0
  6. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/ast_cache.py +47 -28
  7. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/cli.py +31 -15
  8. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/cli_help.py +23 -2
  9. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/config.py +59 -10
  10. code_graph_rag-0.0.996/codebase_rag/console_marks.py +59 -0
  11. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_cpp.py +7 -0
  12. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_csharp.py +7 -0
  13. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_dart.py +39 -0
  14. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_java.py +10 -0
  15. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_nodes.py +18 -0
  16. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_php.py +9 -0
  17. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_rust.py +7 -0
  18. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_scala.py +4 -0
  19. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/build.py +7 -1
  20. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/cli.py +17 -0
  21. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/core.py +7 -3
  22. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/graph.py +76 -3
  23. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/health.py +17 -4
  24. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/mcp.py +29 -0
  25. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/security.py +214 -0
  26. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/context_pruning.py +107 -16
  27. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/cypher_queries.py +178 -10
  28. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/dead_code.py +64 -3
  29. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/duplicates.py +4 -12
  30. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/rename.py +13 -0
  31. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/embedder.py +5 -3
  32. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/exceptions.py +29 -0
  33. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/gloss.py +55 -6
  34. code_graph_rag-0.0.996/codebase_rag/gloss_anchor.py +228 -0
  35. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/gloss_repair.py +219 -25
  36. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_query.py +196 -6
  37. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_updater.py +673 -48
  38. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/language_spec.py +113 -1
  39. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/logs.py +30 -21
  40. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/main.py +90 -27
  41. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/mcp/server.py +35 -6
  42. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/mcp/tools.py +385 -10
  43. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/models.py +7 -0
  44. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_tier.py +42 -28
  45. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/call_processor.py +202 -43
  46. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/call_resolver.py +188 -12
  47. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/identity.py +5 -8
  48. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/method_override.py +2 -1
  49. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/mixin.py +83 -16
  50. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/parent_extraction.py +77 -65
  51. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp/type_inference.py +288 -3
  52. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp/utils.py +166 -16
  53. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/dart/utils.py +204 -4
  54. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/definition_processor.py +13 -0
  55. code_graph_rag-0.0.996/codebase_rag/parsers/enum_variants.py +177 -0
  56. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/factory.py +3 -0
  57. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/field_nodes.py +1 -1
  58. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/function_ingest.py +13 -25
  59. code_graph_rag-0.0.996/codebase_rag/parsers/go_frontend/gotypes/go.mod +12 -0
  60. code_graph_rag-0.0.996/codebase_rag/parsers/go_frontend/gotypes/go.sum +8 -0
  61. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/import_processor.py +36 -1
  62. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/utils.py +38 -4
  63. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/variable_analyzer.py +8 -4
  64. code_graph_rag-0.0.996/codebase_rag/parsers/parameter_nodes.py +828 -0
  65. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/ast_analyzer.py +127 -2
  66. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/python_source_roots.py +79 -38
  67. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/type_facts.py +19 -3
  68. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/type_inference.py +23 -0
  69. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/utils.py +10 -0
  70. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/prompts.py +20 -4
  71. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/providers/base.py +21 -6
  72. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/providers/litellm.py +2 -2
  73. code_graph_rag-0.0.996/codebase_rag/queries/highlights/c_sharp.scm +3 -0
  74. code_graph_rag-0.0.996/codebase_rag/queries/highlights/dart.scm +19 -0
  75. code_graph_rag-0.0.996/codebase_rag/queries/highlights/java.scm +17 -0
  76. code_graph_rag-0.0.996/codebase_rag/queries/highlights/javascript.scm +14 -0
  77. code_graph_rag-0.0.996/codebase_rag/queries/highlights/php.scm +11 -0
  78. code_graph_rag-0.0.996/codebase_rag/queries/highlights/python.scm +5 -0
  79. code_graph_rag-0.0.996/codebase_rag/queries/highlights/rust.scm +11 -0
  80. code_graph_rag-0.0.996/codebase_rag/queries/highlights/typescript.scm +17 -0
  81. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/readme_sections.py +1 -3
  82. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/__init__.py +13 -1
  83. code_graph_rag-0.0.996/codebase_rag/services/cypher_guard.py +198 -0
  84. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/graph_service.py +36 -0
  85. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/llm.py +61 -26
  86. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/neo4j_driver.py +34 -3
  87. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/protobuf_service.py +1 -0
  88. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/structural_delta.py +119 -17
  89. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/code_retrieval.py +12 -5
  90. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/codebase_query.py +7 -4
  91. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/health_checker.py +17 -6
  92. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/semantic_search.py +18 -5
  93. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/shell_command.py +114 -1
  94. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/tool_descriptions.py +41 -4
  95. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/resolution.py +2 -5
  96. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/types_defs.py +29 -6
  97. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/fqn_resolver.py +28 -12
  98. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/path_utils.py +65 -9
  99. code_graph_rag-0.0.996/codebase_rag/utils/qn_markers.py +77 -0
  100. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/vector_store.py +64 -19
  101. code_graph_rag-0.0.996/codec/schema_pb2.py +93 -0
  102. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codec/schema_pb2.pyi +38 -8
  103. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/pyproject.toml +2 -1
  104. code_graph_rag-0.0.945/codebase_rag/parsers/go_frontend/gotypes/go.mod +0 -10
  105. code_graph_rag-0.0.945/codebase_rag/parsers/go_frontend/gotypes/go.sum +0 -8
  106. code_graph_rag-0.0.945/codebase_rag/parsers/parameter_nodes.py +0 -262
  107. code_graph_rag-0.0.945/codec/schema_pb2.py +0 -91
  108. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/LICENSE +0 -0
  109. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/cgr/__init__.py +0 -0
  110. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/code_graph_rag.egg-info/dependency_links.txt +0 -0
  111. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/code_graph_rag.egg-info/entry_points.txt +0 -0
  112. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/code_graph_rag.egg-info/requires.txt +0 -0
  113. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/code_graph_rag.egg-info/top_level.txt +0 -0
  114. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/__init__.py +0 -0
  115. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/__init__.py +0 -0
  116. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_analyzer.py +0 -0
  117. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/c.yaml +0 -0
  118. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/cpp.yaml +0 -0
  119. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/csharp.yaml +0 -0
  120. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/dart.yaml +0 -0
  121. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/go.yaml +0 -0
  122. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/java.yaml +0 -0
  123. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/javascript.yaml +0 -0
  124. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/lua.yaml +0 -0
  125. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/php.yaml +0 -0
  126. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/python.yaml +0 -0
  127. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/ruby.yaml +0 -0
  128. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/rust.yaml +0 -0
  129. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/scala.yaml +0 -0
  130. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/tsx.yaml +0 -0
  131. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/patterns/typescript.yaml +0 -0
  132. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/c.yaml +0 -0
  133. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/cpp.yaml +0 -0
  134. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/csharp.yaml +0 -0
  135. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/dart.yaml +0 -0
  136. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/go.yaml +0 -0
  137. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/java.yaml +0 -0
  138. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/javascript.yaml +0 -0
  139. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/lua.yaml +0 -0
  140. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/php.yaml +0 -0
  141. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/python.yaml +0 -0
  142. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/ruby.yaml +0 -0
  143. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/rust.yaml +0 -0
  144. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/scala.yaml +0 -0
  145. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/tsx.yaml +0 -0
  146. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/security/typescript.yaml +0 -0
  147. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/c.yaml +0 -0
  148. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/cpp.yaml +0 -0
  149. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/csharp.yaml +0 -0
  150. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/dart.yaml +0 -0
  151. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/go.yaml +0 -0
  152. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/java.yaml +0 -0
  153. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/javascript.yaml +0 -0
  154. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/lua.yaml +0 -0
  155. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/php.yaml +0 -0
  156. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/python.yaml +0 -0
  157. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/ruby.yaml +0 -0
  158. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/rust.yaml +0 -0
  159. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/scala.yaml +0 -0
  160. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/tsx.yaml +0 -0
  161. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/analyzers/ast_grep_rules/smells/typescript.yaml +0 -0
  162. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/capture.py +0 -0
  163. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/cgr_state.py +0 -0
  164. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/__init__.py +0 -0
  165. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_go.py +0 -0
  166. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_js.py +0 -0
  167. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_lua.py +0 -0
  168. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_python.py +0 -0
  169. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/ast_sql.py +0 -0
  170. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/deadcode_roots.py +0 -0
  171. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/deps.py +0 -0
  172. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/duplicates.py +0 -0
  173. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/fqn_specs.py +0 -0
  174. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/lang_tooling.py +0 -0
  175. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/languages.py +0 -0
  176. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/providers.py +0 -0
  177. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/stdlib_types.py +0 -0
  178. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/structural.py +0 -0
  179. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/constants/trace.py +0 -0
  180. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/crash_correlation.py +0 -0
  181. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/decorators.py +0 -0
  182. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/docker-compose.yaml +0 -0
  183. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/__init__.py +0 -0
  184. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/cli.py +0 -0
  185. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/contract.py +0 -0
  186. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/imports.py +0 -0
  187. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/patcher.py +0 -0
  188. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editing/transaction.py +0 -0
  189. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/editor_links.py +0 -0
  190. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/flow_verdict.py +0 -0
  191. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/function_registry.py +0 -0
  192. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_audit.py +0 -0
  193. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_cli.py +0 -0
  194. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_dialects.py +0 -0
  195. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/graph_loader.py +0 -0
  196. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/mcp/__init__.py +0 -0
  197. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/mcp/client.py +0 -0
  198. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parser_fingerprint.py +0 -0
  199. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parser_loader.py +0 -0
  200. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/__init__.py +0 -0
  201. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/anchor_hash.py +0 -0
  202. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_fingerprint.py +0 -0
  203. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/bash.yaml +0 -0
  204. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/elixir.yaml +0 -0
  205. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/haskell.yaml +0 -0
  206. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/kotlin.yaml +0 -0
  207. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/nix.yaml +0 -0
  208. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/ruby.yaml +0 -0
  209. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/solidity.yaml +0 -0
  210. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/ast_grep_patterns/swift.yaml +0 -0
  211. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/build_lock.py +0 -0
  212. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/__init__.py +0 -0
  213. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/cpp_modules.py +0 -0
  214. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/node_type.py +0 -0
  215. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/relationships.py +0 -0
  216. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/class_ingest/utils.py +0 -0
  217. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/contract_linking.py +0 -0
  218. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/contracts.py +0 -0
  219. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp/__init__.py +0 -0
  220. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp/preproc_recovery.py +0 -0
  221. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp/type_inference.py +0 -0
  222. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp/utils.py +0 -0
  223. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp_frontend/__init__.py +0 -0
  224. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp_frontend/constants.py +0 -0
  225. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp_frontend/frontend.py +0 -0
  226. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/cpp_frontend/qn.py +0 -0
  227. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp/__init__.py +0 -0
  228. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp_frontend/__init__.py +0 -0
  229. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp_frontend/frontend.py +0 -0
  230. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.cs +0 -0
  231. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.csproj +0 -0
  232. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/csharp_frontend/roslyn/Program.cs +0 -0
  233. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/dart/__init__.py +0 -0
  234. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/dart/type_inference.py +0 -0
  235. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/definition_docstring.py +0 -0
  236. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/dependency_parser.py +0 -0
  237. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/dispatch_registry.py +0 -0
  238. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/document_tier.py +0 -0
  239. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/endpoint_prefixes.py +0 -0
  240. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/endpoint_routes.py +0 -0
  241. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/endpoints.py +0 -0
  242. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/export_detection.py +0 -0
  243. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/flat_module.py +0 -0
  244. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/flow_access/__init__.py +0 -0
  245. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/flow_access/constants.py +0 -0
  246. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/flow_access/processor.py +0 -0
  247. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontend_mode.py +0 -0
  248. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/__init__.py +0 -0
  249. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/cpp.py +0 -0
  250. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/csharp.py +0 -0
  251. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/go.py +0 -0
  252. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/java.py +0 -0
  253. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/protocol.py +0 -0
  254. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/python.py +0 -0
  255. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/frontends/registry.py +0 -0
  256. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go/__init__.py +0 -0
  257. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go/module_paths.py +0 -0
  258. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go/type_inference.py +0 -0
  259. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go/utils.py +0 -0
  260. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go_frontend/__init__.py +0 -0
  261. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go_frontend/frontend.py +0 -0
  262. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/go_frontend/gotypes/main.go +0 -0
  263. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/__init__.py +0 -0
  264. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/base.py +0 -0
  265. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/cpp.py +0 -0
  266. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/java.py +0 -0
  267. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/js_ts.py +0 -0
  268. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/lua.py +0 -0
  269. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/php.py +0 -0
  270. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/protocol.py +0 -0
  271. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/python.py +0 -0
  272. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/registry.py +0 -0
  273. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/handlers/rust.py +0 -0
  274. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/__init__.py +0 -0
  275. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/constants.py +0 -0
  276. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/descriptor.py +0 -0
  277. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/extract.py +0 -0
  278. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/models.py +0 -0
  279. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/processor.py +0 -0
  280. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/io_access/registry.py +0 -0
  281. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/__init__.py +0 -0
  282. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/method_resolver.py +0 -0
  283. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/type_inference.py +0 -0
  284. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java/type_resolver.py +0 -0
  285. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java_frontend/__init__.py +0 -0
  286. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java_frontend/frontend.py +0 -0
  287. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java_frontend/javac/cgr/Frontend.java +0 -0
  288. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java_generated.py +0 -0
  289. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/java_lombok.py +0 -0
  290. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/__init__.py +0 -0
  291. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/ingest.py +0 -0
  292. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/module_paths.py +0 -0
  293. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/module_system.py +0 -0
  294. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/type_inference.py +0 -0
  295. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/js_ts/utils.py +0 -0
  296. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/lua/__init__.py +0 -0
  297. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/lua/type_inference.py +0 -0
  298. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/lua/utils.py +0 -0
  299. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/module_docstring.py +0 -0
  300. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/__init__.py +0 -0
  301. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/expression_analyzer.py +0 -0
  302. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/type_inference.py +0 -0
  303. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/utils.py +0 -0
  304. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py/variable_analyzer.py +0 -0
  305. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py_frontend/__init__.py +0 -0
  306. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/py_frontend/frontend.py +0 -0
  307. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/rpc_exposure.py +0 -0
  308. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/rs/__init__.py +0 -0
  309. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/rs/type_inference.py +0 -0
  310. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/rs/utils.py +0 -0
  311. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/semantic_call_join.py +0 -0
  312. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/stdlib_extractor.py +0 -0
  313. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/string_call.py +0 -0
  314. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/parsers/structure_processor.py +0 -0
  315. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/path_filters.py +0 -0
  316. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/providers/__init__.py +0 -0
  317. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/schema_builder.py +0 -0
  318. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/schema_parse.py +0 -0
  319. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/schemas.py +0 -0
  320. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/anthropic_token_counter.py +0 -0
  321. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/filtering.py +0 -0
  322. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/gloss_cleanup.py +0 -0
  323. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/graph_diff.py +0 -0
  324. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/provenance.py +0 -0
  325. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/resource_cleanup.py +0 -0
  326. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/services/usage_cost.py +0 -0
  327. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/sql_names.py +0 -0
  328. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/stack/__init__.py +0 -0
  329. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/stack/cli.py +0 -0
  330. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/stack/constants.py +0 -0
  331. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/stack/health.py +0 -0
  332. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/stack/manager.py +0 -0
  333. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/structural_check.py +0 -0
  334. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/taint.py +0 -0
  335. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tool_errors.py +0 -0
  336. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/__init__.py +0 -0
  337. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/ast_grep_service.py +0 -0
  338. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/directory_lister.py +0 -0
  339. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/duplicate_detection.py +0 -0
  340. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/file_editor.py +0 -0
  341. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/file_reader.py +0 -0
  342. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/file_writer.py +0 -0
  343. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/graph_rerank.py +0 -0
  344. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/language.py +0 -0
  345. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/research.py +0 -0
  346. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/structural_editor.py +0 -0
  347. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/structural_search.py +0 -0
  348. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/tools/web_search.py +0 -0
  349. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/__init__.py +0 -0
  350. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/cli.py +0 -0
  351. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/cpuprofile.py +0 -0
  352. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/dispatch_site.py +0 -0
  353. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/ebpf_pprof.py +0 -0
  354. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/ingest.py +0 -0
  355. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/instrumented.py +0 -0
  356. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/pprof.py +0 -0
  357. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/pytest_plugin.py +0 -0
  358. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/records.py +0 -0
  359. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/rust_pprof.py +0 -0
  360. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/sourcemap.py +0 -0
  361. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/speedscope.py +0 -0
  362. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/tracer.py +0 -0
  363. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/trace/xdebug.py +0 -0
  364. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/unixcoder.py +0 -0
  365. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/__init__.py +0 -0
  366. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/dependencies.py +0 -0
  367. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/rich_markdown.py +0 -0
  368. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/source_extraction.py +0 -0
  369. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/utils/token_utils.py +0 -0
  370. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/workspaces/__init__.py +0 -0
  371. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/workspaces/cli.py +0 -0
  372. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/workspaces/constants.py +0 -0
  373. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/workspaces/models.py +0 -0
  374. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codebase_rag/workspaces/storage.py +0 -0
  375. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/codec/__init__.py +0 -0
  376. {code_graph_rag-0.0.945 → code_graph_rag-0.0.996}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.945
3
+ Version: 0.0.996
4
4
  Summary: The ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs
5
5
  License-Expression: MIT
6
6
  Keywords: rag,retrieval-augmented-generation,knowledge-graph,code-analysis,tree-sitter,mcp,mcp-server,llm,graph-database,semantic-search,codebase,memgraph,developer-tools,monorepo
@@ -85,7 +85,7 @@ Dynamic: license-file
85
85
 
86
86
  # Code-Graph-RAG
87
87
 
88
- Code-Graph-RAG parses a multi-language codebase with Tree-sitter, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
88
+ Code-Graph-RAG parses a multi-language codebase with Tree-sitter, sharpened by compiler-grade frontends and runtime traces where available, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
89
89
 
90
90
  ## What It Does
91
91
 
@@ -155,15 +155,12 @@ pip install "code-graph-rag[treesitter-full] @ git+https://github.com/vitali87/c
155
155
  - `cmake` (for building pymgclient)
156
156
  - `ripgrep` (`rg`) (for shell command text searching)
157
157
 
158
- The wheel is pure Python (`py3-none-any`), so the package itself installs on
159
- any platform with Python 3.12 or newer (dependencies may still need platform
160
- wheels or build tools, such as `cmake` for `pymgclient`). The piwheels build for Debian Bookworm shows as failed
161
- because Bookworm's system Python is 3.11, which is below our floor. On
162
- Raspberry Pi OS Bookworm, install into a Python 3.12 environment so the pip
163
- commands above actually run under 3.12: with [uv](https://docs.astral.sh/uv/)
164
- run `uv venv --python 3.12 --seed && source .venv/bin/activate` (uv downloads
165
- 3.12 automatically; `--seed` puts pip in the environment), or install CPython 3.12 yourself and use
166
- `python3.12 -m pip install ...`.
158
+ The wheel is pure Python (`py3-none-any`), so it installs on any platform with
159
+ Python 3.12 or newer. Some distributions ship an older interpreter (Debian
160
+ Bookworm, and so Raspberry Pi OS Bookworm, ships 3.11), which also explains the
161
+ failed piwheels Bookworm build. On those systems, see the [installation
162
+ guide](https://github.com/vitali87/code-graph-rag/blob/main/docs/getting-started/installation.md#older-system-interpreters)
163
+ for the available interpreter-pinning alternatives.
167
164
 
168
165
  ## CLI Quick Start
169
166
 
@@ -1,6 +1,6 @@
1
1
  # Code-Graph-RAG
2
2
 
3
- Code-Graph-RAG parses a multi-language codebase with Tree-sitter, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
3
+ Code-Graph-RAG parses a multi-language codebase with Tree-sitter, sharpened by compiler-grade frontends and runtime traces where available, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
4
4
 
5
5
  ## What It Does
6
6
 
@@ -70,15 +70,12 @@ pip install "code-graph-rag[treesitter-full] @ git+https://github.com/vitali87/c
70
70
  - `cmake` (for building pymgclient)
71
71
  - `ripgrep` (`rg`) (for shell command text searching)
72
72
 
73
- The wheel is pure Python (`py3-none-any`), so the package itself installs on
74
- any platform with Python 3.12 or newer (dependencies may still need platform
75
- wheels or build tools, such as `cmake` for `pymgclient`). The piwheels build for Debian Bookworm shows as failed
76
- because Bookworm's system Python is 3.11, which is below our floor. On
77
- Raspberry Pi OS Bookworm, install into a Python 3.12 environment so the pip
78
- commands above actually run under 3.12: with [uv](https://docs.astral.sh/uv/)
79
- run `uv venv --python 3.12 --seed && source .venv/bin/activate` (uv downloads
80
- 3.12 automatically; `--seed` puts pip in the environment), or install CPython 3.12 yourself and use
81
- `python3.12 -m pip install ...`.
73
+ The wheel is pure Python (`py3-none-any`), so it installs on any platform with
74
+ Python 3.12 or newer. Some distributions ship an older interpreter (Debian
75
+ Bookworm, and so Raspberry Pi OS Bookworm, ships 3.11), which also explains the
76
+ failed piwheels Bookworm build. On those systems, see the [installation
77
+ guide](https://github.com/vitali87/code-graph-rag/blob/main/docs/getting-started/installation.md#older-system-interpreters)
78
+ for the available interpreter-pinning alternatives.
82
79
 
83
80
  ## CLI Quick Start
84
81
 
@@ -42,7 +42,7 @@
42
42
 
43
43
  # Code-Graph-RAG
44
44
 
45
- Code-Graph-RAG parses a multi-language codebase with Tree-sitter, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
45
+ Code-Graph-RAG parses a multi-language codebase with Tree-sitter, sharpened by compiler-grade frontends and runtime traces where available, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
46
46
 
47
47
  <p align="center">
48
48
  <img src="./assets/demo.gif" alt="demo">
@@ -51,9 +51,9 @@ Code-Graph-RAG parses a multi-language codebase with Tree-sitter, builds a knowl
51
51
  ## Latest News 🔥
52
52
 
53
53
  <!-- SECTION:latest_news -->
54
- - **UTF-8 Handling**: Improved handling of invalid UTF-8 bytes prevents file definitions from being dropped.
55
- - **Neo4j Backend Support**: Added support for Neo4j as a graph backend through a pluggable dialect seam.
56
- - **Gloss Node & Notes**: Introduced the Gloss node for agent-authored notes and enabled writing and reading Gloss notes via the MCP server.
54
+ - **Code Generation**: Split Cypher response cleaning and AST-grep rule validation into smaller, more manageable helpers for improved clarity and maintainability.
55
+ - **Scripting Improvements**: Resolved an issue where closed pull request run associations were incorrectly reported as missing, and improved error reporting in scripts to avoid over-claiming failing checks.
56
+ - **Data Handling**: Enhanced the handling of CONTAINS_SECTION in the double's module subtree and refined snippet lookup to project the matched node's own path.
57
57
  <!-- /SECTION:latest_news -->
58
58
 
59
59
  See [NEWS.md](NEWS.md) for the full history.
@@ -74,7 +74,7 @@ Point Code-Graph-RAG at a repository and it reads every source file, extracts fu
74
74
 
75
75
  The system has two components:
76
76
 
77
- 1. **Multi-language parser.** A Tree-sitter based parser reads the codebase and ingests functions, classes, methods, modules, and their relationships into Memgraph under a single language-agnostic schema.
77
+ 1. **Multi-language parser.** A Tree-sitter based parser reads the codebase and ingests functions, classes, methods, modules, and their relationships into Memgraph under a single language-agnostic schema. Where a toolchain is available, compiler-grade frontends layer exact facts on top (libclang for C/C++, `go/types` for Go, and opt-in Roslyn, `javac` and Jedi for C#, Java and Python), and [dynamic tracing](docs/guide/dynamic-tracing.md) merges calls observed at runtime. Tree-sitter stays the backbone: a trace only sees code that ran, and a compiler frontend only covers what its toolchain can build.
78
78
  2. **RAG system** (`codebase_rag/`). An interactive CLI that turns natural language into Cypher queries, retrieves matching code, and drives AI-powered editing and optimisation.
79
79
 
80
80
  ```
@@ -129,7 +129,7 @@ uv tool install "code-graph-rag[treesitter-full,semantic] @ git+https://github.c
129
129
  You also need Python 3.12+, Docker (for Memgraph), `cmake`, and `ripgrep`. Full prerequisites, source installs, and environment setup are in the [Installation](docs/getting-started/installation.md) guide.
130
130
 
131
131
  > [!NOTE]
132
- > The wheel is pure Python (`py3-none-any`), so the package itself installs on any platform with Python 3.12 or newer (dependencies may still need platform wheels or build tools, such as `cmake` for `pymgclient`). The [piwheels](https://www.piwheels.org/project/code-graph-rag/) build for Debian Bookworm shows as failed because Bookworm's system Python is 3.11, which is below our floor. On Raspberry Pi OS Bookworm, pin the interpreter explicitly, for example `uv tool install --python 3.12 "code-graph-rag[treesitter-full,semantic]"`; uv downloads Python 3.12 automatically and the PyPI wheel installs normally.
132
+ > The wheel is pure Python (`py3-none-any`), so it installs on any platform with Python 3.12 or newer. Older system interpreters (Debian Bookworm ships 3.11) need the interpreter pinned explicitly; see [Installation](docs/getting-started/installation.md#older-system-interpreters) for the commands.
133
133
 
134
134
  ## Quick Start
135
135
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.945
3
+ Version: 0.0.996
4
4
  Summary: The ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs
5
5
  License-Expression: MIT
6
6
  Keywords: rag,retrieval-augmented-generation,knowledge-graph,code-analysis,tree-sitter,mcp,mcp-server,llm,graph-database,semantic-search,codebase,memgraph,developer-tools,monorepo
@@ -85,7 +85,7 @@ Dynamic: license-file
85
85
 
86
86
  # Code-Graph-RAG
87
87
 
88
- Code-Graph-RAG parses a multi-language codebase with Tree-sitter, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
88
+ Code-Graph-RAG parses a multi-language codebase with Tree-sitter, sharpened by compiler-grade frontends and runtime traces where available, builds a knowledge graph of its structure in Memgraph, and lets you query, edit, and optimise that code in plain English. It works across a monorepo of mixed languages under one unified graph schema.
89
89
 
90
90
  ## What It Does
91
91
 
@@ -155,15 +155,12 @@ pip install "code-graph-rag[treesitter-full] @ git+https://github.com/vitali87/c
155
155
  - `cmake` (for building pymgclient)
156
156
  - `ripgrep` (`rg`) (for shell command text searching)
157
157
 
158
- The wheel is pure Python (`py3-none-any`), so the package itself installs on
159
- any platform with Python 3.12 or newer (dependencies may still need platform
160
- wheels or build tools, such as `cmake` for `pymgclient`). The piwheels build for Debian Bookworm shows as failed
161
- because Bookworm's system Python is 3.11, which is below our floor. On
162
- Raspberry Pi OS Bookworm, install into a Python 3.12 environment so the pip
163
- commands above actually run under 3.12: with [uv](https://docs.astral.sh/uv/)
164
- run `uv venv --python 3.12 --seed && source .venv/bin/activate` (uv downloads
165
- 3.12 automatically; `--seed` puts pip in the environment), or install CPython 3.12 yourself and use
166
- `python3.12 -m pip install ...`.
158
+ The wheel is pure Python (`py3-none-any`), so it installs on any platform with
159
+ Python 3.12 or newer. Some distributions ship an older interpreter (Debian
160
+ Bookworm, and so Raspberry Pi OS Bookworm, ships 3.11), which also explains the
161
+ failed piwheels Bookworm build. On those systems, see the [installation
162
+ guide](https://github.com/vitali87/code-graph-rag/blob/main/docs/getting-started/installation.md#older-system-interpreters)
163
+ for the available interpreter-pinning alternatives.
167
164
 
168
165
  ## CLI Quick Start
169
166
 
@@ -16,6 +16,7 @@ codebase_rag/cgr_state.py
16
16
  codebase_rag/cli.py
17
17
  codebase_rag/cli_help.py
18
18
  codebase_rag/config.py
19
+ codebase_rag/console_marks.py
19
20
  codebase_rag/context_pruning.py
20
21
  codebase_rag/crash_correlation.py
21
22
  codebase_rag/cypher_queries.py
@@ -29,6 +30,7 @@ codebase_rag/exceptions.py
29
30
  codebase_rag/flow_verdict.py
30
31
  codebase_rag/function_registry.py
31
32
  codebase_rag/gloss.py
33
+ codebase_rag/gloss_anchor.py
32
34
  codebase_rag/gloss_repair.py
33
35
  codebase_rag/graph_audit.py
34
36
  codebase_rag/graph_cli.py
@@ -162,6 +164,7 @@ codebase_rag/parsers/document_tier.py
162
164
  codebase_rag/parsers/endpoint_prefixes.py
163
165
  codebase_rag/parsers/endpoint_routes.py
164
166
  codebase_rag/parsers/endpoints.py
167
+ codebase_rag/parsers/enum_variants.py
165
168
  codebase_rag/parsers/export_detection.py
166
169
  codebase_rag/parsers/factory.py
167
170
  codebase_rag/parsers/field_nodes.py
@@ -288,8 +291,17 @@ codebase_rag/parsers/rs/utils.py
288
291
  codebase_rag/providers/__init__.py
289
292
  codebase_rag/providers/base.py
290
293
  codebase_rag/providers/litellm.py
294
+ codebase_rag/queries/highlights/c_sharp.scm
295
+ codebase_rag/queries/highlights/dart.scm
296
+ codebase_rag/queries/highlights/java.scm
297
+ codebase_rag/queries/highlights/javascript.scm
298
+ codebase_rag/queries/highlights/php.scm
299
+ codebase_rag/queries/highlights/python.scm
300
+ codebase_rag/queries/highlights/rust.scm
301
+ codebase_rag/queries/highlights/typescript.scm
291
302
  codebase_rag/services/__init__.py
292
303
  codebase_rag/services/anthropic_token_counter.py
304
+ codebase_rag/services/cypher_guard.py
293
305
  codebase_rag/services/filtering.py
294
306
  codebase_rag/services/gloss_cleanup.py
295
307
  codebase_rag/services/graph_diff.py
@@ -344,6 +356,7 @@ codebase_rag/utils/__init__.py
344
356
  codebase_rag/utils/dependencies.py
345
357
  codebase_rag/utils/fqn_resolver.py
346
358
  codebase_rag/utils/path_utils.py
359
+ codebase_rag/utils/qn_markers.py
347
360
  codebase_rag/utils/rich_markdown.py
348
361
  codebase_rag/utils/source_extraction.py
349
362
  codebase_rag/utils/token_utils.py
@@ -2,7 +2,6 @@
2
2
  # re-parses from disk via the loader so an eviction cannot lose an AST that
3
3
  # type inference still needs (see load()).
4
4
 
5
- import sys
6
5
  from collections import OrderedDict
7
6
  from collections.abc import Callable, ItemsView
8
7
  from pathlib import Path
@@ -13,8 +12,24 @@ from . import constants as cs
13
12
  from .config import settings
14
13
 
15
14
 
15
+ def _estimate_entry_bytes(value: tuple[Node, cs.SupportedLanguage]) -> int:
16
+ # The memory cap is measured in bytes of SOURCE the cached trees span, not
17
+ # the trees' true footprint: tree-sitter allocates nodes in C, invisible to
18
+ # sys.getsizeof (which reports ~56 bytes for any (Node, lang) tuple, so a
19
+ # cap summed from it never triggered). Tree size scales with source size,
20
+ # which makes this a stable proxy; the real heap cost is a multiple of it.
21
+ return value[0].end_byte
22
+
23
+
16
24
  class BoundedASTCache:
17
- __slots__ = ("cache", "loader", "max_entries", "max_memory_bytes")
25
+ __slots__ = (
26
+ "cache",
27
+ "entry_sizes",
28
+ "loader",
29
+ "max_entries",
30
+ "max_memory_bytes",
31
+ "total_bytes",
32
+ )
18
33
 
19
34
  def __init__(
20
35
  self,
@@ -24,6 +39,10 @@ class BoundedASTCache:
24
39
  | None = None,
25
40
  ):
26
41
  self.cache: OrderedDict[Path, tuple[Node, cs.SupportedLanguage]] = OrderedDict()
42
+ # Sizes are recorded at insert so eviction and the running total never
43
+ # rescan every entry: each insert stays O(1) plus the evictions it causes.
44
+ self.entry_sizes: dict[Path, int] = {}
45
+ self.total_bytes = 0
27
46
  self.loader = loader
28
47
  self.max_entries = (
29
48
  max_entries if max_entries is not None else settings.CACHE_MAX_ENTRIES
@@ -47,11 +66,11 @@ class BoundedASTCache:
47
66
  return entry
48
67
 
49
68
  def __setitem__(self, key: Path, value: tuple[Node, cs.SupportedLanguage]) -> None:
50
- if key in self.cache:
51
- del self.cache[key]
52
-
69
+ self._remove(key)
70
+ size = _estimate_entry_bytes(value)
53
71
  self.cache[key] = value
54
-
72
+ self.entry_sizes[key] = size
73
+ self.total_bytes += size
55
74
  self._enforce_limits()
56
75
 
57
76
  def __getitem__(self, key: Path) -> tuple[Node, cs.SupportedLanguage]:
@@ -60,8 +79,7 @@ class BoundedASTCache:
60
79
  return value
61
80
 
62
81
  def __delitem__(self, key: Path) -> None:
63
- if key in self.cache:
64
- del self.cache[key]
82
+ self._remove(key)
65
83
 
66
84
  def __contains__(self, key: Path) -> bool:
67
85
  return key in self.cache
@@ -69,24 +87,25 @@ class BoundedASTCache:
69
87
  def items(self) -> ItemsView[Path, tuple[Node, cs.SupportedLanguage]]:
70
88
  return self.cache.items()
71
89
 
90
+ def clear(self) -> None:
91
+ self.cache.clear()
92
+ self.entry_sizes.clear()
93
+ self.total_bytes = 0
94
+
95
+ def _remove(self, key: Path) -> None:
96
+ if key in self.cache:
97
+ del self.cache[key]
98
+ self.total_bytes -= self.entry_sizes.pop(key)
99
+
100
+ def _evict_oldest(self) -> None:
101
+ key, _ = self.cache.popitem(last=False)
102
+ self.total_bytes -= self.entry_sizes.pop(key)
103
+
72
104
  def _enforce_limits(self) -> None:
73
- while len(self.cache) > self.max_entries:
74
- self.cache.popitem(last=False)
75
-
76
- if self._should_evict_for_memory():
77
- entries_to_remove = max(
78
- 1, len(self.cache) // settings.CACHE_EVICTION_DIVISOR
79
- )
80
- for _ in range(entries_to_remove):
81
- if self.cache:
82
- self.cache.popitem(last=False)
83
-
84
- def _should_evict_for_memory(self) -> bool:
85
- try:
86
- cache_size = sum(sys.getsizeof(v) for v in self.cache.values())
87
- return cache_size > self.max_memory_bytes
88
- except Exception:
89
- return (
90
- len(self.cache)
91
- > self.max_entries * settings.CACHE_MEMORY_THRESHOLD_RATIO
92
- )
105
+ # Evict LRU entries until both caps hold. The newest entry is kept even
106
+ # if it alone exceeds the memory cap: the caller just parsed it and is
107
+ # about to use it, and load() would only re-parse it on the next read.
108
+ while len(self.cache) > self.max_entries or (
109
+ self.total_bytes > self.max_memory_bytes and len(self.cache) > 1
110
+ ):
111
+ self._evict_oldest()
@@ -27,6 +27,7 @@ from . import cypher_queries as cq
27
27
  from . import logs as ls
28
28
  from .capture import CaptureSelection, resolve_capture, split_spec
29
29
  from .config import load_ignore_patterns, settings
30
+ from .console_marks import status_mark
30
31
  from .editing.cli import cli as edits_cli
31
32
  from .editor_links import (
32
33
  EditorTemplateError,
@@ -953,6 +954,9 @@ def mcp_server(
953
954
  ),
954
955
  host: str = typer.Option(None, help=ch.HELP_MCP_HTTP_HOST),
955
956
  port: int = typer.Option(None, help=ch.HELP_MCP_HTTP_PORT),
957
+ workspace: str | None = typer.Option(
958
+ None, "--workspace", help=ch.HELP_MCP_WORKSPACE
959
+ ),
956
960
  ) -> None:
957
961
  try:
958
962
  if transport == cs.MCPTransport.HTTP:
@@ -960,11 +964,13 @@ def mcp_server(
960
964
 
961
965
  resolved_host = host or settings.MCP_HTTP_HOST
962
966
  resolved_port = port or settings.MCP_HTTP_PORT
963
- asyncio.run(serve_http(host=resolved_host, port=resolved_port))
967
+ asyncio.run(
968
+ serve_http(host=resolved_host, port=resolved_port, workspace=workspace)
969
+ )
964
970
  else:
965
971
  from codebase_rag.mcp import serve_stdio
966
972
 
967
- asyncio.run(serve_stdio())
973
+ asyncio.run(serve_stdio(workspace=workspace))
968
974
  except KeyboardInterrupt:
969
975
  app_context.console.print(style(cs.CLI_MSG_APP_TERMINATED, cs.Color.RED))
970
976
  except ValueError as e:
@@ -1301,18 +1307,6 @@ def status_command() -> None:
1301
1307
  app_context.console.print(f" - {project}: last sync {ts}")
1302
1308
 
1303
1309
 
1304
- def _status_mark(passed: bool, encoding: str) -> str:
1305
- """The pass/fail mark the console's stream can encode.
1306
-
1307
- Rich substitutes ASCII box characters on a non-UTF stream but leaves
1308
- text alone, so the glyph raised UnicodeEncodeError on a CP950 Windows
1309
- terminal before a single check was shown (issue #1910).
1310
- """
1311
- if encoding.lower().startswith(cs.ENCODING_UTF_PREFIX):
1312
- return cs.HEALTH_MARK_PASS if passed else cs.HEALTH_MARK_FAIL
1313
- return cs.HEALTH_MARK_PASS_ASCII if passed else cs.HEALTH_MARK_FAIL_ASCII
1314
-
1315
-
1316
1310
  @app.command(
1317
1311
  name=ch.CLICommandName.DOCTOR,
1318
1312
  help=ch.CMD_DOCTOR,
@@ -1330,7 +1324,7 @@ def doctor() -> None:
1330
1324
 
1331
1325
  encoding = app_context.console.encoding
1332
1326
  for result in results:
1333
- status = _status_mark(result.passed, encoding)
1327
+ status = status_mark(result.passed, encoding)
1334
1328
  status_color = cs.Color.GREEN if result.passed else cs.Color.RED
1335
1329
  status_text = style(status, status_color, cs.StyleModifier.NONE)
1336
1330
 
@@ -1458,6 +1452,7 @@ def _dead_code_config(
1458
1452
  entry_points: list[str],
1459
1453
  decorator_roots: list[str],
1460
1454
  min_resolution: cs.EdgeResolution | None = None,
1455
+ endpoint_roots: bool = True,
1461
1456
  ) -> DeadCodeConfig:
1462
1457
  # test_patterns is always set: included tests become roots; excluded, it
1463
1458
  # filters test modules out of module-load roots so test-only code stays dead.
@@ -1471,6 +1466,7 @@ def _dead_code_config(
1471
1466
  entry_points=tuple(entry_points),
1472
1467
  test_patterns=tuple(cs.TEST_PATH_PATTERNS),
1473
1468
  min_resolution=str(min_resolution) if min_resolution is not None else None,
1469
+ endpoint_roots=endpoint_roots,
1474
1470
  )
1475
1471
 
1476
1472
 
@@ -1581,6 +1577,18 @@ def _emit_dead_code(
1581
1577
  app_context.console.print(style(notice, cs.Color.YELLOW))
1582
1578
 
1583
1579
 
1580
+ def _notice_single_project_endpoint_roots(show_progress: bool) -> None:
1581
+ """Endpoint roots off on a graph holding one project: every endpoint
1582
+ reads as uncalled. Stdout carries the JSON payload when that format is
1583
+ chosen (local review P1), so the notice goes to stderr then."""
1584
+ if show_progress:
1585
+ app_context.console.print(
1586
+ style(cs.CLI_DEADCODE_SINGLE_PROJECT_ENDPOINTS, cs.Color.YELLOW)
1587
+ )
1588
+ else:
1589
+ typer.echo(cs.CLI_DEADCODE_SINGLE_PROJECT_ENDPOINTS, err=True)
1590
+
1591
+
1584
1592
  @app.command(
1585
1593
  name=ch.CLICommandName.DEAD_CODE,
1586
1594
  help=ch.CMD_DEAD_CODE,
@@ -1621,6 +1629,11 @@ def dead_code(
1621
1629
  min_resolution: cs.EdgeResolution | None = typer.Option(
1622
1630
  None, "--min-resolution", help=ch.HELP_DEADCODE_MIN_RESOLUTION
1623
1631
  ),
1632
+ endpoint_roots: bool = typer.Option(
1633
+ True,
1634
+ "--endpoint-roots/--no-endpoint-roots",
1635
+ help=ch.HELP_DEADCODE_ENDPOINT_ROOTS,
1636
+ ),
1624
1637
  ) -> None:
1625
1638
  from .dead_code import collect_dead_code_with_coverage
1626
1639
 
@@ -1647,8 +1660,11 @@ def dead_code(
1647
1660
  entry_point,
1648
1661
  decorator_root,
1649
1662
  min_resolution,
1663
+ endpoint_roots,
1650
1664
  ),
1651
1665
  )
1666
+ if not endpoint_roots and len(projects) <= 1:
1667
+ _notice_single_project_endpoint_roots(show_progress)
1652
1668
  except Exception as e:
1653
1669
  app_context.console.print(
1654
1670
  style(cs.CLI_ERR_DEADCODE_FAILED.format(error=e), cs.Color.RED)
@@ -24,6 +24,8 @@ class CLICommandName(StrEnum):
24
24
  STOP = "stop"
25
25
  STATUS = "status"
26
26
  HELP = "help"
27
+ VERIFY_INDEX = "verify-index"
28
+ DIFF_INDEX = "diff-index"
27
29
 
28
30
 
29
31
  APP_DESCRIPTION = (
@@ -380,6 +382,13 @@ HELP_QUERY_OUTPUT_FORMAT = "Format --ask-agent output as table or json."
380
382
  HELP_MCP_TRANSPORT = "Transport to serve: stdio or http."
381
383
  HELP_MCP_HTTP_HOST = "HTTP bind host. Used only with --transport http."
382
384
  HELP_MCP_HTTP_PORT = "HTTP bind port. Used only with --transport http."
385
+ HELP_MCP_WORKSPACE = (
386
+ "Serve the projects of workspace NAME: `list_projects` shows them, a "
387
+ "`project` argument, when given, must name one (omitted, the server "
388
+ "takes the project rooted at its directory, or the workspace's only "
389
+ "one), and source is read from each repo's own root. Also read from the "
390
+ "MCP_WORKSPACE environment variable."
391
+ )
383
392
 
384
393
  HELP_DEADCODE_PROJECT_NAME = (
385
394
  "Project to scan. If omitted, cgr uses the only indexed project."
@@ -405,6 +414,15 @@ HELP_DEADCODE_CLASSES = (
405
414
  )
406
415
  HELP_DEADCODE_FORMAT = "Report format: table or json."
407
416
  HELP_DEADCODE_OUTPUT = "Write the report to this file instead of stdout."
417
+ HELP_DEADCODE_ENDPOINT_ROOTS = (
418
+ "Treat a decorator-routed handler (FastAPI, Flask) as reachable by its "
419
+ "route decorator alone (default). With --no-endpoint-roots, such a "
420
+ "handler is live only if some indexed call site resolves to its endpoint "
421
+ "(RESOLVES_TO into it, or a direct READS_FROM/WRITES_TO for RPC and "
422
+ "dispatch resources), so an endpoint nobody calls is reported. A handler "
423
+ "registered by a call (Go HandleFunc, Express app.get) stays live "
424
+ "through that call."
425
+ )
408
426
  HELP_DEADCODE_MIN_RESOLUTION = (
409
427
  "Ignore call edges below this confidence when deciding liveness: "
410
428
  "heuristic < overload < exact < trace_confirmed (dynamic counts as confirmed)."
@@ -448,6 +466,9 @@ HELP_DELETE_PROJECT_REPO_PATH = (
448
466
  )
449
467
  HELP_COMMAND = "Command path to document, such as 'start' or 'daemon logs'."
450
468
 
469
+ CMD_VERIFY_INDEX = "Verify a protobuf index against its provenance manifest"
470
+ CMD_DIFF_INDEX = "Structural diff between two protobuf index snapshots"
471
+
451
472
  CLI_COMMANDS: dict[CLICommandName, str] = {
452
473
  CLICommandName.START: CMD_START,
453
474
  CLICommandName.OPTIMIZE: CMD_OPTIMIZE,
@@ -471,14 +492,14 @@ CLI_COMMANDS: dict[CLICommandName, str] = {
471
492
  CLICommandName.STATUS: CMD_STATUS,
472
493
  CLICommandName.DOCTOR: CMD_DOCTOR,
473
494
  CLICommandName.HELP: CMD_HELP,
495
+ CLICommandName.VERIFY_INDEX: CMD_VERIFY_INDEX,
496
+ CLICommandName.DIFF_INDEX: CMD_DIFF_INDEX,
474
497
  }
475
- CMD_VERIFY_INDEX = "Verify a protobuf index against its provenance manifest"
476
498
  HELP_VERIFY_INDEX_DIR = "Directory holding the index artifacts and manifest.json."
477
499
  HELP_TRUSTED_MANIFEST_SHA = (
478
500
  "Externally trusted sha256 of manifest.json (e.g. from an attestation); "
479
501
  "anchors verification beyond local self-consistency."
480
502
  )
481
- CMD_DIFF_INDEX = "Structural diff between two protobuf index snapshots"
482
503
  HELP_DIFF_OLD = "Directory holding the OLD snapshot artifacts."
483
504
  HELP_DIFF_NEW = "Directory holding the NEW snapshot artifacts."
484
505
  HELP_DIFF_JSON_OUT = "Write the JSON delta to FILE instead of stdout."
@@ -104,14 +104,36 @@ def format_missing_api_key_errors(
104
104
 
105
105
  LOCAL_PROVIDERS = frozenset({cs.Provider.OLLAMA})
106
106
 
107
+
108
+ def normalised_credential(value: str | None) -> str | None:
109
+ """A credential with surrounding whitespace removed, or None if it is blank
110
+ or the local-provider placeholder (`cs.DEFAULT_API_KEY`).
111
+
112
+ One rule for every source, a role's `api_key` and a provider variable
113
+ alike (#2119): the environment used to be read raw, so `" "` or `"ollama"`
114
+ there passed the start-up gate and failed later in the provider call.
115
+ """
116
+ if value is None:
117
+ return None
118
+ stripped = value.strip()
119
+ if not stripped or stripped == cs.DEFAULT_API_KEY:
120
+ return None
121
+ return stripped
122
+
123
+
107
124
  # The provider-owned variable `validate_api_key` accepts INSTEAD of the role's
108
125
  # own `<ROLE>_API_KEY`. Module level so `cgr doctor` can name the same variable
109
126
  # the gate reads rather than restating the rule and drifting from it (#1910).
110
- # A provider absent here is satisfied only by the role variable.
127
+ #
128
+ # DERIVED from API_KEY_INFO rather than hand-kept, because a hand-kept subset is
129
+ # what #1913 was: it left out OpenAI and Google, so the gate refused a
130
+ # configuration naming the variable `format_missing_api_key_errors` had just
131
+ # told the user to export, and that the provider itself reads
132
+ # (`_resolve_api_key(api_key, cs.ENV_OPENAI_API_KEY)` at providers/base.py:181,
133
+ # and ENV_GOOGLE_API_KEY at :116). One table means the gate, the error message
134
+ # and `cgr doctor` cannot disagree about which variable counts.
111
135
  PROVIDER_ENV_KEYS = {
112
- cs.Provider.ANTHROPIC: cs.ENV_ANTHROPIC_API_KEY,
113
- cs.Provider.AZURE: cs.ENV_AZURE_API_KEY,
114
- cs.Provider.MINIMAX: cs.ENV_MINIMAX_API_KEY,
136
+ provider: info["env_var"] for provider, info in API_KEY_INFO.items()
115
137
  }
116
138
 
117
139
 
@@ -142,14 +164,10 @@ class ModelConfig:
142
164
  provider_lower == cs.Provider.GOOGLE
143
165
  and self.provider_type == cs.GoogleProviderType.VERTEX
144
166
  )
145
- or (env_key and os.environ.get(env_key))
167
+ or (env_key and normalised_credential(os.environ.get(env_key)))
146
168
  ):
147
169
  return
148
- if (
149
- not self.api_key
150
- or not self.api_key.strip()
151
- or self.api_key == cs.DEFAULT_API_KEY
152
- ):
170
+ if normalised_credential(self.api_key) is None:
153
171
  error_msg = format_missing_api_key_errors(self.provider, role)
154
172
  raise ValueError(error_msg)
155
173
 
@@ -350,7 +368,10 @@ class AppConfig(BaseSettings):
350
368
  FILE_FLUSH_INTERVAL: int = Field(default=500, gt=0)
351
369
 
352
370
  CACHE_MAX_ENTRIES: int = 1000
371
+ # Measured in bytes of source the cached ASTs span (see ast_cache.py).
353
372
  CACHE_MAX_MEMORY_MB: int = 500
373
+ # No longer read (the AST cache now evicts LRU until under its cap); kept
374
+ # so an existing .env that sets them still validates.
354
375
  CACHE_EVICTION_DIVISOR: int = 10
355
376
  CACHE_MEMORY_THRESHOLD_RATIO: float = 0.8
356
377
 
@@ -410,6 +431,14 @@ class AppConfig(BaseSettings):
410
431
 
411
432
  QUIET: bool = Field(False, validation_alias="CGR_QUIET")
412
433
 
434
+ # Compaction discards old tool output to bound the context (#1500). It is
435
+ # on by default because an unbounded history eventually fails the request
436
+ # outright, but a mechanism that drops data must be declinable: set this
437
+ # false to keep every tool result and accept the ceiling.
438
+ CONTEXT_COMPACTION_ENABLED: bool = Field(
439
+ True, validation_alias="CGR_CONTEXT_COMPACTION_ENABLED"
440
+ )
441
+
413
442
  CGR_CAPTURE: str = Field("", validation_alias="CGR_CAPTURE")
414
443
 
415
444
  # Loopback by default: the StreamableHTTP endpoint has no built-in
@@ -428,6 +457,26 @@ class AppConfig(BaseSettings):
428
457
  provider = getattr(self, f"{role_upper}_PROVIDER", None)
429
458
  model = getattr(self, f"{role_upper}_MODEL", None)
430
459
 
460
+ # Half a role is a mistake, not a request for the default: falling
461
+ # back to Ollama here skipped the API-key gate (Ollama needs none) and
462
+ # then failed later as "Ollama not running" or quietly ran a small
463
+ # local model instead of the one the user asked for.
464
+ if bool(provider) != bool(model):
465
+ provider_var, model_var = f"{role_upper}_PROVIDER", f"{role_upper}_MODEL"
466
+ set_var, value, missing_var = (
467
+ (provider_var, provider, model_var)
468
+ if provider
469
+ else (model_var, model, provider_var)
470
+ )
471
+ raise ValueError(
472
+ ex.MODEL_ROLE_HALF_CONFIGURED.format(
473
+ set_var=set_var,
474
+ value=value,
475
+ missing_var=missing_var,
476
+ role=role_upper,
477
+ )
478
+ )
479
+
431
480
  if provider and model:
432
481
  return ModelConfig(
433
482
  provider=provider.lower(),