code-graph-rag 0.0.770__tar.gz → 0.0.845__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 (344) hide show
  1. {code_graph_rag-0.0.770/code_graph_rag.egg-info → code_graph_rag-0.0.845}/PKG-INFO +1 -1
  2. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/README.md +6 -3
  3. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845/code_graph_rag.egg-info}/PKG-INFO +1 -1
  4. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/code_graph_rag.egg-info/SOURCES.txt +9 -0
  5. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/cli.py +14 -0
  6. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/cli_help.py +22 -0
  7. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/config.py +24 -0
  8. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_scala.py +14 -0
  9. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/cli.py +58 -0
  10. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/core.py +42 -0
  11. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/duplicates.py +5 -0
  12. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/graph.py +82 -4
  13. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/lang_tooling.py +12 -0
  14. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/languages.py +25 -1
  15. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/mcp.py +14 -0
  16. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/providers.py +46 -0
  17. code_graph_rag-0.0.845/codebase_rag/constants/security.py +842 -0
  18. code_graph_rag-0.0.845/codebase_rag/context_pruning.py +173 -0
  19. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/crash_correlation.py +287 -0
  20. code_graph_rag-0.0.845/codebase_rag/editing/__init__.py +50 -0
  21. code_graph_rag-0.0.845/codebase_rag/editing/cli.py +118 -0
  22. code_graph_rag-0.0.845/codebase_rag/editing/imports.py +470 -0
  23. code_graph_rag-0.0.845/codebase_rag/editing/patcher.py +377 -0
  24. code_graph_rag-0.0.845/codebase_rag/editing/transaction.py +644 -0
  25. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/exceptions.py +4 -0
  26. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/graph_updater.py +372 -50
  27. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/language_spec.py +31 -57
  28. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/logs.py +44 -5
  29. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/main.py +149 -7
  30. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/mcp/tools.py +258 -29
  31. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/models.py +5 -0
  32. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parser_fingerprint.py +42 -1
  33. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parser_loader.py +1 -0
  34. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/build_lock.py +66 -0
  35. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/call_processor.py +173 -50
  36. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/call_resolver.py +208 -10
  37. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/parent_extraction.py +103 -0
  38. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp_frontend/qn.py +13 -49
  39. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp_frontend/frontend.py +21 -26
  40. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/dart/utils.py +9 -7
  41. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/definition_processor.py +6 -8
  42. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/document_tier.py +199 -2
  43. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/flat_module.py +14 -9
  44. code_graph_rag-0.0.845/codebase_rag/parsers/frontend_mode.py +38 -0
  45. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/function_ingest.py +10 -1
  46. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go_frontend/frontend.py +20 -25
  47. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/import_processor.py +398 -36
  48. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/variable_analyzer.py +37 -30
  49. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java_frontend/frontend.py +17 -40
  50. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java_lombok.py +1 -0
  51. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py_frontend/frontend.py +9 -8
  52. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/stdlib_extractor.py +4 -0
  53. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/utils.py +64 -31
  54. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/providers/base.py +166 -23
  55. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/schema_builder.py +22 -1
  56. code_graph_rag-0.0.845/codebase_rag/schema_parse.py +129 -0
  57. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/schemas.py +4 -0
  58. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/anthropic_token_counter.py +26 -0
  59. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/graph_diff.py +20 -1
  60. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/protobuf_service.py +45 -36
  61. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/provenance.py +1 -0
  62. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/stack/manager.py +5 -0
  63. code_graph_rag-0.0.845/codebase_rag/tools/codebase_query.py +771 -0
  64. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/duplicate_detection.py +1 -1
  65. code_graph_rag-0.0.845/codebase_rag/tools/graph_rerank.py +196 -0
  66. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/health_checker.py +2 -0
  67. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/language.py +4 -0
  68. code_graph_rag-0.0.845/codebase_rag/tools/shell_command.py +1705 -0
  69. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/tool_descriptions.py +31 -2
  70. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/cli.py +3 -0
  71. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/instrumented.py +14 -2
  72. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/types_defs.py +40 -5
  73. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/path_utils.py +123 -7
  74. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/vector_store.py +59 -59
  75. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codec/schema_pb2.py +36 -36
  76. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codec/schema_pb2.pyi +4 -2
  77. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/pyproject.toml +25 -1
  78. code_graph_rag-0.0.770/codebase_rag/constants/security.py +0 -253
  79. code_graph_rag-0.0.770/codebase_rag/tools/codebase_query.py +0 -132
  80. code_graph_rag-0.0.770/codebase_rag/tools/shell_command.py +0 -768
  81. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/LICENSE +0 -0
  82. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/PYPI_README.md +0 -0
  83. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/cgr/__init__.py +0 -0
  84. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/code_graph_rag.egg-info/dependency_links.txt +0 -0
  85. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/code_graph_rag.egg-info/entry_points.txt +0 -0
  86. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/code_graph_rag.egg-info/requires.txt +0 -0
  87. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/code_graph_rag.egg-info/top_level.txt +0 -0
  88. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/__init__.py +0 -0
  89. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/__init__.py +0 -0
  90. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_analyzer.py +0 -0
  91. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/c.yaml +0 -0
  92. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/cpp.yaml +0 -0
  93. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/csharp.yaml +0 -0
  94. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/dart.yaml +0 -0
  95. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/go.yaml +0 -0
  96. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/java.yaml +0 -0
  97. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/javascript.yaml +0 -0
  98. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/lua.yaml +0 -0
  99. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/php.yaml +0 -0
  100. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/python.yaml +0 -0
  101. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/ruby.yaml +0 -0
  102. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/rust.yaml +0 -0
  103. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/scala.yaml +0 -0
  104. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/tsx.yaml +0 -0
  105. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/patterns/typescript.yaml +0 -0
  106. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/c.yaml +0 -0
  107. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/cpp.yaml +0 -0
  108. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/csharp.yaml +0 -0
  109. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/dart.yaml +0 -0
  110. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/go.yaml +0 -0
  111. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/java.yaml +0 -0
  112. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/javascript.yaml +0 -0
  113. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/lua.yaml +0 -0
  114. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/php.yaml +0 -0
  115. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/python.yaml +0 -0
  116. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/ruby.yaml +0 -0
  117. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/rust.yaml +0 -0
  118. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/scala.yaml +0 -0
  119. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/tsx.yaml +0 -0
  120. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/security/typescript.yaml +0 -0
  121. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/c.yaml +0 -0
  122. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/cpp.yaml +0 -0
  123. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/csharp.yaml +0 -0
  124. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/dart.yaml +0 -0
  125. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/go.yaml +0 -0
  126. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/java.yaml +0 -0
  127. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/javascript.yaml +0 -0
  128. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/lua.yaml +0 -0
  129. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/php.yaml +0 -0
  130. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/python.yaml +0 -0
  131. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/ruby.yaml +0 -0
  132. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/rust.yaml +0 -0
  133. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/scala.yaml +0 -0
  134. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/tsx.yaml +0 -0
  135. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/analyzers/ast_grep_rules/smells/typescript.yaml +0 -0
  136. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/ast_cache.py +0 -0
  137. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/capture.py +0 -0
  138. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/cgr_state.py +0 -0
  139. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/__init__.py +0 -0
  140. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_cpp.py +0 -0
  141. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_csharp.py +0 -0
  142. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_dart.py +0 -0
  143. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_go.py +0 -0
  144. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_java.py +0 -0
  145. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_js.py +0 -0
  146. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_lua.py +0 -0
  147. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_nodes.py +0 -0
  148. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_php.py +0 -0
  149. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_python.py +0 -0
  150. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_rust.py +0 -0
  151. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/ast_sql.py +0 -0
  152. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/build.py +0 -0
  153. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/deadcode_roots.py +0 -0
  154. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/deps.py +0 -0
  155. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/fqn_specs.py +0 -0
  156. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/health.py +0 -0
  157. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/stdlib_types.py +0 -0
  158. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/structural.py +0 -0
  159. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/constants/trace.py +0 -0
  160. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/cypher_queries.py +0 -0
  161. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/dead_code.py +0 -0
  162. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/decorators.py +0 -0
  163. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/docker-compose.yaml +0 -0
  164. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/duplicates.py +0 -0
  165. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/editor_links.py +0 -0
  166. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/embedder.py +0 -0
  167. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/flow_verdict.py +0 -0
  168. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/function_registry.py +0 -0
  169. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/graph_audit.py +0 -0
  170. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/graph_loader.py +0 -0
  171. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/mcp/__init__.py +0 -0
  172. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/mcp/client.py +0 -0
  173. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/mcp/server.py +0 -0
  174. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/__init__.py +0 -0
  175. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_fingerprint.py +0 -0
  176. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/bash.yaml +0 -0
  177. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/elixir.yaml +0 -0
  178. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/haskell.yaml +0 -0
  179. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/kotlin.yaml +0 -0
  180. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/nix.yaml +0 -0
  181. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/ruby.yaml +0 -0
  182. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/solidity.yaml +0 -0
  183. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_patterns/swift.yaml +0 -0
  184. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/ast_grep_tier.py +0 -0
  185. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/__init__.py +0 -0
  186. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/cpp_modules.py +0 -0
  187. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/identity.py +0 -0
  188. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/method_override.py +0 -0
  189. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/mixin.py +0 -0
  190. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/node_type.py +0 -0
  191. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/relationships.py +0 -0
  192. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/class_ingest/utils.py +0 -0
  193. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/contract_linking.py +0 -0
  194. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/contracts.py +0 -0
  195. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp/__init__.py +0 -0
  196. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp/preproc_recovery.py +0 -0
  197. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp/type_inference.py +0 -0
  198. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp/utils.py +0 -0
  199. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp_frontend/__init__.py +0 -0
  200. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp_frontend/constants.py +0 -0
  201. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/cpp_frontend/frontend.py +0 -0
  202. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp/__init__.py +0 -0
  203. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp/type_inference.py +0 -0
  204. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp/utils.py +0 -0
  205. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp_frontend/__init__.py +0 -0
  206. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.cs +0 -0
  207. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.csproj +0 -0
  208. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/csharp_frontend/roslyn/Program.cs +0 -0
  209. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/dart/__init__.py +0 -0
  210. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/dart/type_inference.py +0 -0
  211. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/dependency_parser.py +0 -0
  212. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/dispatch_registry.py +0 -0
  213. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/endpoint_prefixes.py +0 -0
  214. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/endpoint_routes.py +0 -0
  215. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/endpoints.py +0 -0
  216. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/export_detection.py +0 -0
  217. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/factory.py +0 -0
  218. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/flow_access/__init__.py +0 -0
  219. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/flow_access/constants.py +0 -0
  220. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/flow_access/processor.py +0 -0
  221. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/__init__.py +0 -0
  222. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/cpp.py +0 -0
  223. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/csharp.py +0 -0
  224. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/go.py +0 -0
  225. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/java.py +0 -0
  226. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/protocol.py +0 -0
  227. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/python.py +0 -0
  228. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/frontends/registry.py +0 -0
  229. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go/__init__.py +0 -0
  230. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go/module_paths.py +0 -0
  231. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go/type_inference.py +0 -0
  232. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go/utils.py +0 -0
  233. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go_frontend/__init__.py +0 -0
  234. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go_frontend/gotypes/go.mod +0 -0
  235. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go_frontend/gotypes/go.sum +0 -0
  236. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/go_frontend/gotypes/main.go +0 -0
  237. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/__init__.py +0 -0
  238. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/base.py +0 -0
  239. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/cpp.py +0 -0
  240. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/java.py +0 -0
  241. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/js_ts.py +0 -0
  242. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/lua.py +0 -0
  243. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/php.py +0 -0
  244. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/protocol.py +0 -0
  245. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/python.py +0 -0
  246. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/registry.py +0 -0
  247. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/handlers/rust.py +0 -0
  248. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/__init__.py +0 -0
  249. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/constants.py +0 -0
  250. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/descriptor.py +0 -0
  251. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/extract.py +0 -0
  252. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/models.py +0 -0
  253. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/processor.py +0 -0
  254. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/io_access/registry.py +0 -0
  255. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/__init__.py +0 -0
  256. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/method_resolver.py +0 -0
  257. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/type_inference.py +0 -0
  258. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/type_resolver.py +0 -0
  259. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java/utils.py +0 -0
  260. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java_frontend/__init__.py +0 -0
  261. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java_frontend/javac/cgr/Frontend.java +0 -0
  262. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/java_generated.py +0 -0
  263. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/__init__.py +0 -0
  264. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/ingest.py +0 -0
  265. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/module_paths.py +0 -0
  266. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/module_system.py +0 -0
  267. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/type_inference.py +0 -0
  268. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/js_ts/utils.py +0 -0
  269. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/lua/__init__.py +0 -0
  270. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/lua/type_inference.py +0 -0
  271. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/lua/utils.py +0 -0
  272. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/__init__.py +0 -0
  273. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/ast_analyzer.py +0 -0
  274. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/expression_analyzer.py +0 -0
  275. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/type_inference.py +0 -0
  276. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/utils.py +0 -0
  277. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py/variable_analyzer.py +0 -0
  278. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/py_frontend/__init__.py +0 -0
  279. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/python_source_roots.py +0 -0
  280. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/rpc_exposure.py +0 -0
  281. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/rs/__init__.py +0 -0
  282. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/rs/type_inference.py +0 -0
  283. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/rs/utils.py +0 -0
  284. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/semantic_call_join.py +0 -0
  285. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/string_call.py +0 -0
  286. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/structure_processor.py +0 -0
  287. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/parsers/type_inference.py +0 -0
  288. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/path_filters.py +0 -0
  289. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/prompts.py +0 -0
  290. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/providers/__init__.py +0 -0
  291. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/providers/litellm.py +0 -0
  292. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/readme_sections.py +0 -0
  293. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/__init__.py +0 -0
  294. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/filtering.py +0 -0
  295. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/graph_service.py +0 -0
  296. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/llm.py +0 -0
  297. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/resource_cleanup.py +0 -0
  298. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/services/usage_cost.py +0 -0
  299. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/sql_names.py +0 -0
  300. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/stack/__init__.py +0 -0
  301. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/stack/cli.py +0 -0
  302. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/stack/constants.py +0 -0
  303. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/stack/health.py +0 -0
  304. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/taint.py +0 -0
  305. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tool_errors.py +0 -0
  306. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/__init__.py +0 -0
  307. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/ast_grep_service.py +0 -0
  308. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/code_retrieval.py +0 -0
  309. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/directory_lister.py +0 -0
  310. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/file_editor.py +0 -0
  311. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/file_reader.py +0 -0
  312. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/file_writer.py +0 -0
  313. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/research.py +0 -0
  314. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/semantic_search.py +0 -0
  315. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/structural_editor.py +0 -0
  316. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/structural_search.py +0 -0
  317. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/tools/web_search.py +0 -0
  318. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/__init__.py +0 -0
  319. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/cpuprofile.py +0 -0
  320. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/ebpf_pprof.py +0 -0
  321. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/ingest.py +0 -0
  322. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/pprof.py +0 -0
  323. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/pytest_plugin.py +0 -0
  324. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/records.py +0 -0
  325. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/resolution.py +0 -0
  326. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/rust_pprof.py +0 -0
  327. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/sourcemap.py +0 -0
  328. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/speedscope.py +0 -0
  329. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/tracer.py +0 -0
  330. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/trace/xdebug.py +0 -0
  331. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/unixcoder.py +0 -0
  332. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/__init__.py +0 -0
  333. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/dependencies.py +0 -0
  334. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/fqn_resolver.py +0 -0
  335. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/rich_markdown.py +0 -0
  336. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/source_extraction.py +0 -0
  337. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/utils/token_utils.py +0 -0
  338. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/workspaces/__init__.py +0 -0
  339. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/workspaces/cli.py +0 -0
  340. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/workspaces/constants.py +0 -0
  341. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/workspaces/models.py +0 -0
  342. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codebase_rag/workspaces/storage.py +0 -0
  343. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/codec/__init__.py +0 -0
  344. {code_graph_rag-0.0.770 → code_graph_rag-0.0.845}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.770
3
+ Version: 0.0.845
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
@@ -51,9 +51,12 @@ 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
- - **Graph Indexing**: The name property is now indexed for improved graph read-path lookups. SQL routines are also indexed to resolve calls that name their target in a string.
55
- - **Duplicate Code Detection**: An AST-based duplicate code detection system has been introduced, alongside fixes for duplicate detection across multiple repositories.
56
- - **Agentic QA**: A new agentic QA benchmark harness and indexing-time benchmark have been added.
54
+ - **Index Consistency**: Ensure incremental deletes match clean index states.
55
+ - **Patch Reporting**: Distinguish between unverifiable and verified patches in reports.
56
+ - **Windows Teardown**: Clear the read-only bit when removing a temp repo for successful Windows teardown.
57
+ - **TypeScript Grading**: Grade TypeScript inheritance against the tsc oracle for improved accuracy.
58
+ - **Exclude Set Handling**: Record the exclusion set to ensure `--exclude` flags are correctly applied across runs.
59
+ - **MCP Indexing**: Honour `.cgrignore` and `.gitignore` in MCP index and update processes, matching the CLI.
57
60
  <!-- /SECTION:latest_news -->
58
61
 
59
62
  See [NEWS.md](NEWS.md) for the full history.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.770
3
+ Version: 0.0.845
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
@@ -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/context_pruning.py
19
20
  codebase_rag/crash_correlation.py
20
21
  codebase_rag/cypher_queries.py
21
22
  codebase_rag/dead_code.py
@@ -40,6 +41,7 @@ codebase_rag/path_filters.py
40
41
  codebase_rag/prompts.py
41
42
  codebase_rag/readme_sections.py
42
43
  codebase_rag/schema_builder.py
44
+ codebase_rag/schema_parse.py
43
45
  codebase_rag/schemas.py
44
46
  codebase_rag/sql_names.py
45
47
  codebase_rag/taint.py
@@ -125,6 +127,11 @@ codebase_rag/constants/security.py
125
127
  codebase_rag/constants/stdlib_types.py
126
128
  codebase_rag/constants/structural.py
127
129
  codebase_rag/constants/trace.py
130
+ codebase_rag/editing/__init__.py
131
+ codebase_rag/editing/cli.py
132
+ codebase_rag/editing/imports.py
133
+ codebase_rag/editing/patcher.py
134
+ codebase_rag/editing/transaction.py
128
135
  codebase_rag/mcp/__init__.py
129
136
  codebase_rag/mcp/client.py
130
137
  codebase_rag/mcp/server.py
@@ -147,6 +154,7 @@ codebase_rag/parsers/endpoints.py
147
154
  codebase_rag/parsers/export_detection.py
148
155
  codebase_rag/parsers/factory.py
149
156
  codebase_rag/parsers/flat_module.py
157
+ codebase_rag/parsers/frontend_mode.py
150
158
  codebase_rag/parsers/function_ingest.py
151
159
  codebase_rag/parsers/import_processor.py
152
160
  codebase_rag/parsers/java_generated.py
@@ -289,6 +297,7 @@ codebase_rag/tools/duplicate_detection.py
289
297
  codebase_rag/tools/file_editor.py
290
298
  codebase_rag/tools/file_reader.py
291
299
  codebase_rag/tools/file_writer.py
300
+ codebase_rag/tools/graph_rerank.py
292
301
  codebase_rag/tools/health_checker.py
293
302
  codebase_rag/tools/language.py
294
303
  codebase_rag/tools/research.py
@@ -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 .editing.cli import cli as edits_cli
30
31
  from .editor_links import (
31
32
  EditorTemplateError,
32
33
  diff_command,
@@ -405,6 +406,7 @@ def _delete_hash_cache(repo_path: Path) -> None:
405
406
  cache_path.unlink(missing_ok=True)
406
407
  (repo_path / cs.DIR_MTIMES_FILENAME).unlink(missing_ok=True)
407
408
  (repo_path / cs.PARSER_FINGERPRINT_FILENAME).unlink(missing_ok=True)
409
+ (repo_path / cs.EXCLUSION_STATE_FILENAME).unlink(missing_ok=True)
408
410
 
409
411
 
410
412
  def _resolve_and_validate_repo(repo_path: str | None) -> Path:
@@ -1076,6 +1078,18 @@ def trace_command(ctx: typer.Context) -> None:
1076
1078
  _run_delegated_group(trace_cli, ctx)
1077
1079
 
1078
1080
 
1081
+ @app.command(
1082
+ name=ch.CLICommandName.EDITS,
1083
+ help=ch.CMD_EDITS,
1084
+ short_help=ch.CMD_EDITS,
1085
+ add_help_option=False,
1086
+ context_settings=_DELEGATED_GROUP_CONTEXT,
1087
+ rich_help_panel=ch.PANEL_GRAPH,
1088
+ )
1089
+ def edits_command(ctx: typer.Context) -> None:
1090
+ _run_delegated_group(edits_cli, ctx)
1091
+
1092
+
1079
1093
  @app.command(
1080
1094
  name=ch.CLICommandName.HELP,
1081
1095
  help=ch.CMD_HELP,
@@ -17,6 +17,7 @@ class CLICommandName(StrEnum):
17
17
  DAEMON = "daemon"
18
18
  WORKSPACE = "workspace"
19
19
  TRACE = "trace"
20
+ EDITS = "edits"
20
21
  STOP = "stop"
21
22
  STATUS = "status"
22
23
  HELP = "help"
@@ -72,6 +73,26 @@ CMD_WORKSPACE_REMOVE_REPO = "Remove a repository from a workspace by path"
72
73
 
73
74
  CMD_TRACE = "Ingest runtime call traces as dynamic CALLS edges"
74
75
  CMD_TRACE_GROUP = CMD_TRACE
76
+ CMD_EDITS = (
77
+ "Show or undo recorded edit transactions (multi-file edits applied through cgr)."
78
+ )
79
+ CMD_EDITS_GROUP = CMD_EDITS
80
+ CMD_EDITS_SHOW = (
81
+ "List the last N recorded edit transactions, newest first, with their diffs."
82
+ )
83
+ CMD_EDITS_UNDO = "Reverse the last N recorded edit transactions, newest first; stops at the first file that changed since."
84
+ EPILOG_EDITS = "Run 'cgr help edits COMMAND' for command-specific help."
85
+ EXAMPLES_EDITS_SHOW = (
86
+ "Examples:\n cgr edits show\n cgr edits show -n 5 --repo-path ~/proj"
87
+ )
88
+ EXAMPLES_EDITS_UNDO = (
89
+ "Examples:\n cgr edits undo\n cgr edits undo -n 2 --repo-path ~/proj"
90
+ )
91
+ HELP_EDITS_COUNT = "How many transactions to show or undo."
92
+ HELP_EDITS_REPO_PATH = (
93
+ "Repository root holding .cgr-edit-history.json (default: current directory)."
94
+ )
95
+ HELP_EDITS_DIFF = "Print each transaction's unified diff."
75
96
  CMD_TRACE_INGEST = "Resolve a trace file against a project and write dynamic edges"
76
97
  CMD_TRACE_CONVERT = "Convert a V8 .cpuprofile (node --cpu-prof) to a trace file"
77
98
 
@@ -385,6 +406,7 @@ CLI_COMMANDS: dict[CLICommandName, str] = {
385
406
  CLICommandName.LANGUAGE: CMD_LANGUAGE,
386
407
  CLICommandName.DAEMON: CMD_DAEMON,
387
408
  CLICommandName.TRACE: CMD_TRACE,
409
+ CLICommandName.EDITS: CMD_EDITS,
388
410
  CLICommandName.WORKSPACE: CMD_WORKSPACE,
389
411
  CLICommandName.STOP: CMD_STOP,
390
412
  CLICommandName.STATUS: CMD_STATUS,
@@ -336,6 +336,30 @@ class AppConfig(BaseSettings):
336
336
  CACHE_MEMORY_THRESHOLD_RATIO: float = 0.8
337
337
 
338
338
  QUERY_RESULT_MAX_TOKENS: int = Field(default=16000, gt=0)
339
+ # The model's OUTPUT budget per request. Without it pydantic-ai falls back
340
+ # to the provider default, which on Anthropic is far below what current
341
+ # models support -- a long answer then fails with "Model token limit
342
+ # (provider default) exceeded before any response was generated" and the
343
+ # model never replies at all (issue #1498).
344
+ #
345
+ # Distinct from QUERY_RESULT_MAX_TOKENS above, which trims what goes IN.
346
+ # This bounds what comes back.
347
+ # 8192 rather than something larger: pydantic-ai forwards this value
348
+ # unchanged and exposes no per-model output cap to clamp against, so the
349
+ # default must fit the SMALLEST catalogued model or it breaks working
350
+ # configurations. `gemini-2.0-flash` caps output at 8192 and is
351
+ # selectable today; 16000 was rejected outright by it. This still fixes
352
+ # the reported crash, whose remedy is any value meaningfully above
353
+ # Anthropic's 4096 provider default.
354
+ #
355
+ # Raise it per-deployment when the chosen model allows more. A general
356
+ # clamping table over every model was rejected: it would need
357
+ # hand-maintaining and would silently go stale on every new release,
358
+ # capping a launch below what it supports. Retired snapshots are the
359
+ # exception -- their maxima are frozen -- so `LEGACY_MAX_OUTPUT_TOKENS`
360
+ # lowers this budget for those ids alone, leaving everything else at the
361
+ # configured value.
362
+ MODEL_MAX_TOKENS: int = Field(default=8192, gt=0)
339
363
  QUERY_RESULT_ROW_CAP: int = Field(default=500, gt=0)
340
364
  QUERY_MEMORY_LIMIT_MB: int = Field(default=4096, gt=0)
341
365
  QUERY_TIMEOUT_S: float = Field(default=60.0, gt=0)
@@ -15,6 +15,20 @@ TS_SCALA_GENERIC_FUNCTION = TS_GENERIC_FUNCTION
15
15
  TS_SCALA_FIELD_EXPRESSION = "field_expression"
16
16
  TS_SCALA_INFIX_EXPRESSION = "infix_expression"
17
17
  TS_SCALA_IMPORT_DECLARATION = "import_declaration"
18
+ # `import a.b.{C, D}` / `import a.b.{C => Alias}` / `import a.b._`
19
+ TS_SCALA_NAMESPACE_SELECTORS = "namespace_selectors"
20
+ TS_SCALA_ARROW_RENAMED_IDENTIFIER = "arrow_renamed_identifier"
21
+ TS_SCALA_NAMESPACE_WILDCARD = "namespace_wildcard"
22
+ # Scala 3 spells a rename `as`; Scala 2 spells it `=>`. Different node types.
23
+ TS_SCALA_AS_RENAMED_IDENTIFIER = "as_renamed_identifier"
24
+ TS_SCALA_IMPORT_KEYWORD = "import"
25
+
26
+ # Wrappers the grammar puts between an `extends` clause and the
27
+ # `type_identifier` naming the base. `type_arguments` is deliberately ABSENT:
28
+ # it also holds a type_identifier (the `Int` of `Service[Int]`), so descending
29
+ # into it would return the type ARGUMENT as the base class.
30
+ TS_SCALA_GENERIC_TYPE = "generic_type"
31
+ TS_SCALA_STABLE_TYPE_IDENTIFIER = "stable_type_identifier"
18
32
  TS_SCALA_STRING = "string"
19
33
  TS_SCALA_BLOCK = "block"
20
34
  TS_SCALA_TEMPLATE_BODY = "template_body"
@@ -18,6 +18,8 @@ class KeyBinding(StrEnum):
18
18
  ENTER = "enter"
19
19
  CTRL_C = "c-c"
20
20
  SHIFT_TAB = "s-tab"
21
+ UP = "up"
22
+ DOWN = "down"
21
23
 
22
24
 
23
25
  class PermissionMode(StrEnum):
@@ -478,6 +480,54 @@ INTERACTIVE_BFS_MAX_DEPTH = 10
478
480
  INTERACTIVE_DEFAULT_GROUP = "."
479
481
 
480
482
  MSG_SURGICAL_SUCCESS = "Successfully applied surgical code replacement in: {path}"
483
+ # Span-preserving patchers (issue #1529).
484
+ PATCH_BAD_POSITION = "No such position: line {line}, column {col}"
485
+ PATCH_BAD_OFFSET = "Byte offset {offset} is outside the file"
486
+ PATCH_BAD_SPAN = "Span ({start}, {end}) is outside the file or reversed"
487
+ PATCH_OVERLAP = "Edit ({start}, {end}) overlaps an earlier edit in the same file"
488
+ PATCH_OUTSIDE_ROOT = "Path is outside the repository: {path}"
489
+ PATCH_NO_FILE = "No such file to patch: {path}"
490
+ PATCH_IDENTIFIER_MISMATCH = (
491
+ "{path}:{line}:{col} holds {found!r}, not the identifier {expected!r}"
492
+ )
493
+ PATCH_NOT_AN_IDENTIFIER = "{path}:{line}:{col} is not a whole identifier"
494
+ PATCH_PARSE_FAILED = "{path} no longer parses after the patch"
495
+ PATCH_FORMAT_DRIFT = "{path} applied, but {tool} would reformat it"
496
+ PATCH_OK = "{path}: {count} edit(s) applied"
497
+ # `parses is None` means no grammar was available, so the patch was checked
498
+ # by nothing. Reported apart from PATCH_OK because reporting both as OK is
499
+ # what turned an unverifiable write into an apparently verified one; the
500
+ # write itself is still allowed, since refusing would make edits a silent
501
+ # no-op on a base install where Rust and Go grammars are absent (#1580).
502
+ # The one wording for "checked by nothing", shared so the two messages that
503
+ # carry it cannot drift apart and a caller can match on either.
504
+ PATCH_UNVERIFIED_FRAGMENT = "unverified (no parser for it)"
505
+ PATCH_UNVERIFIED = "{path}: {count} edit(s) applied, " + PATCH_UNVERIFIED_FRAGMENT
506
+ # Both facts, because either alone is misleading here: drift on its own reads
507
+ # as "parsed fine, just reformat it", and a language with no grammar is
508
+ # exactly the case that also has a formatter installed (Rust, Go).
509
+ PATCH_UNVERIFIED_DRIFT = (
510
+ "{path}: {count} edit(s) applied, "
511
+ + PATCH_UNVERIFIED_FRAGMENT
512
+ + "; {tool} would also reformat it"
513
+ )
514
+ # Edit transactions (issue #1528).
515
+ EDIT_NOT_A_FILE = "Staged path is not a regular file: {path}"
516
+ EDIT_RESERVED_PATH = "Path is cgr state, not part of the tree: {path}"
517
+ EDIT_TRANSACTION_FINISHED = "This transaction has already been committed or rolled back"
518
+ EDIT_CONFLICT = "File changed since it was staged; transaction refused: {path}"
519
+ EDIT_NOTHING_STAGED = "Nothing staged; the working tree is untouched"
520
+ EDIT_VERIFICATION_FAILED = (
521
+ "Verification failed; the working tree is untouched: {reason}"
522
+ )
523
+ EDIT_VERIFIER_RAISED = "verifier raised {error!r}"
524
+ EDIT_VERIFIER_FALSE = "verifier returned False"
525
+ EDIT_APPLIED = "Applied {count} file(s)"
526
+ EDIT_UNDO_NONE = "No recorded edit transactions to undo"
527
+ EDIT_UNDO_DONE = "Undid transaction {tx} ({count} file(s))"
528
+ EDIT_UNDO_STOPPED = "Stopped at transaction {tx}: {reason}"
529
+ EDIT_SHOW_NONE = "No recorded edit transactions"
530
+ EDIT_SHOW_HEADER = "{tx} {at} {count} file(s) verification={ok}"
481
531
  MSG_SURGICAL_FAILED = (
482
532
  "Failed to apply surgical replacement in {path}. "
483
533
  "Target code not found or patches failed."
@@ -487,6 +537,7 @@ GREP_SUGGESTION = " Use 'rg' instead of 'grep' for text searching."
487
537
 
488
538
  QUERY_NOT_AVAILABLE = "N/A"
489
539
  DICT_KEY_RESULTS = "results"
540
+ DICT_KEY_QUERY_USED = "query_used"
490
541
  TIKTOKEN_ENCODING = "cl100k_base"
491
542
  QUERY_SUMMARY_SUCCESS = "Successfully retrieved {count} item(s) from the graph."
492
543
  QUERY_SUMMARY_TRUNCATED = (
@@ -497,6 +548,13 @@ QUERY_SUMMARY_TRANSLATION_FAILED = (
497
548
  "I couldn't translate your request into a database query. Error: {error}"
498
549
  )
499
550
  QUERY_SUMMARY_DB_ERROR = "There was an error querying the database: {error}"
551
+ # Refused rather than answered unscoped: rows with no qualified name cannot
552
+ # be attributed to a project, so the requested scope cannot be honoured.
553
+ QUERY_SUMMARY_UNSCOPEABLE = (
554
+ "This query cannot be scoped to project {project!r}: it returns no "
555
+ "qualified name, so results cannot be attributed to a project. Ask for "
556
+ "the qualified name in the query."
557
+ )
500
558
  QUERY_SUMMARY_TIMEOUT = (
501
559
  "Query exceeded the {timeout:.1f}s timeout and was cancelled. "
502
560
  "Avoid unbounded traversals; add depth bounds or use a graph-algorithm procedure."
@@ -18,6 +18,16 @@ ARG_DRY_RUN = "dry_run"
18
18
 
19
19
  SEPARATOR_DOT = "."
20
20
  SEPARATOR_SLASH = "/"
21
+ # Splits "provider:model" both in user-supplied settings and in the model
22
+ # names pydantic-ai enumerates.
23
+ MODEL_STRING_SEPARATOR = ":"
24
+ # `derive_project_name` builds "<name>__<8-hex-digest>", so this marker is
25
+ # what distinguishes a project-qualified name from free text that merely
26
+ # contains dots (a docstring, a file path).
27
+ PROJECT_NAME_DIGEST_MARKER = "__"
28
+ # Hex digits after the marker. Shared so `derive_project_name` and the
29
+ # scoping filter that recognises its output cannot drift apart.
30
+ PROJECT_NAME_DIGEST_LEN = 8
21
31
  # Disambiguates definitions that share one qualified name (if/else import
22
32
  # fallbacks, typing.overload, try/except fallbacks): "<qn>@<start_line>".
23
33
  DUP_QN_MARKER = "@"
@@ -119,14 +129,46 @@ HASH_CACHE_FILENAME = ".cgr-hash-cache.json"
119
129
  DIR_MTIMES_FILENAME = ".cgr-dir-mtimes.json"
120
130
  PARSER_FINGERPRINT_FILENAME = ".cgr-parser-fingerprint"
121
131
  DELOMBOK_STATE_FILENAME = ".cgr-delombok-state.json"
132
+ # The exclusion set the last run indexed under, covering both the excludes and
133
+ # the unignores (which come from `!` lines in .cgrignore/.gitignore and from
134
+ # interactive setup; there is no --unignore flag). Nothing on disk changes when
135
+ # only the CLI --exclude flags do, so without this the sync check cannot tell
136
+ # that the eligible set moved (issue #1606).
137
+ EXCLUSION_STATE_FILENAME = ".cgr-exclusion-state.json"
138
+ # Recorded edit transactions for `cgr edits show|undo` (issue #1528).
139
+ EDIT_HISTORY_FILENAME = ".cgr-edit-history.json"
140
+ EDIT_LOCK_FILENAME = ".cgr-edit-lock"
141
+ PLATFORM_WINDOWS = "win32"
142
+ # Permission bits copied onto a replacement file (rwx for u/g/o, setuid etc.).
143
+ EDIT_MODE_MASK = 0o7777
144
+ # Mode of the exclusively created temp sibling before the target's mode is
145
+ # copied onto it: owner-only, so nothing reads staged bytes mid-write.
146
+ EDIT_TEMP_FILE_MODE = 0o600
122
147
  CGR_STATE_FILENAMES: frozenset[str] = frozenset(
123
148
  {
124
149
  HASH_CACHE_FILENAME,
125
150
  DIR_MTIMES_FILENAME,
126
151
  PARSER_FINGERPRINT_FILENAME,
127
152
  DELOMBOK_STATE_FILENAME,
153
+ EXCLUSION_STATE_FILENAME,
154
+ EDIT_HISTORY_FILENAME,
155
+ EDIT_LOCK_FILENAME,
128
156
  }
129
157
  )
158
+ # Edit transactions (issue #1528).
159
+ EDIT_HISTORY_LIMIT = 50
160
+ EDIT_TRANSACTION_ID_LENGTH = 12
161
+ EDIT_STAGING_PREFIX = "cgr-edit-"
162
+ DIFF_DEV_NULL = "/dev/null"
163
+ EDIT_KEY_ID = "id"
164
+ EDIT_KEY_AT = "at"
165
+ EDIT_KEY_FILES = "files"
166
+ EDIT_KEY_BEFORE = "before"
167
+ EDIT_KEY_AFTER = "after"
168
+ EDIT_KEY_VERIFICATION = "verification"
169
+ EDIT_KEY_OK = "ok"
170
+ EDIT_KEY_MESSAGE = "message"
171
+ EDIT_KEY_MODE = "mode"
130
172
 
131
173
  # Inputs to the parser fingerprint: everything that changes how source files
132
174
  # become graph nodes and edges, plus the installed grammar wheels. Paths are
@@ -90,6 +90,11 @@ AST_FP_DIGEST_SIZE = 8
90
90
  # Analysis defaults (CLI/tool overridable).
91
91
  DUPLICATES_DEFAULT_THRESHOLD = 0.8
92
92
  DUPLICATES_DEFAULT_MIN_NODES = 15
93
+ # Reported groups, largest first. Named rather than inlined because the CLI
94
+ # tool and the MCP tool must default alike: parity means the same call gives
95
+ # the same answer on both surfaces (issue #1342), which two literals agreeing
96
+ # today would not guarantee tomorrow.
97
+ DUPLICATES_DEFAULT_GROUP_LIMIT = 20
93
98
  # Candidate generation is exact prefix filtering (AllPairs/PPJoin): each
94
99
  # function is indexed only under its rarest prefix branches, sized so any
95
100
  # pair clearing the Jaccard threshold is guaranteed to co-occur in a posting
@@ -35,6 +35,29 @@ KEY_START_COL = "start_col"
35
35
  KEY_NAME_START_LINE = "name_start_line"
36
36
  KEY_NAME_START_COL = "name_start_col"
37
37
  KEY_END_LINE = "end_line"
38
+ # Edge-site location properties (issue #1522). Every CALLS / REFERENCES /
39
+ # INSTANTIATES edge records the span of the expression that produced it, and
40
+ # every IMPORTS edge the span of its import statement, so a consumer can jump
41
+ # to, verify, or rewrite the exact site. Lines are 1-based and columns 0-based,
42
+ # matching the node `start_line` / `start_col` convention. Sites are stored as
43
+ # ONE EDGE PER SITE: the site props join the MERGE key (see
44
+ # MERGE_KEY_PROPS_BY_REL), so a caller invoking one callee twice carries two
45
+ # parallel edges. Edges emitted without a site (libclang macro uses, Roslyn
46
+ # facts, dynamic-trace write-back, inferred C# namespace imports) carry none of
47
+ # these keys and keep collapsing on their endpoints.
48
+ KEY_LINE = "line"
49
+ KEY_COL = "col"
50
+ KEY_END_COL = "end_col"
51
+ KEY_ARG_COUNT = "arg_count"
52
+ KEY_KWARG_NAMES = "kwarg_names"
53
+ # IMPORTS only: the name the statement binds in the importing scope (the
54
+ # `as` name when renamed, else the imported/module name) and, for
55
+ # symbol-level imports (`from x import y`, `import { y }`, `use a::b::y`),
56
+ # the symbol's own name. A whole-module import has no `imported_name`.
57
+ KEY_ALIAS = "alias"
58
+ KEY_IMPORTED_NAME = "imported_name"
59
+ # `imported_name` of a wildcard import (`from x import *`, `export * from`).
60
+ IMPORTED_NAME_WILDCARD = "*"
38
61
  KEY_PATH = "path"
39
62
  KEY_ABSOLUTE_PATH = "absolute_path"
40
63
  # Whether flow analysis covered a Module: its language is in the source/sink
@@ -348,7 +371,19 @@ SCHEMA_OPTIONAL_SUFFIX = "?"
348
371
  NODE_PROJECT = NodeLabel.PROJECT
349
372
 
350
373
  KEY_PARAMETERS = "parameters"
374
+ # Declared Markdown front-matter, as sorted "key=value" entries (issue #1448).
375
+ KEY_FRONT_MATTER = "front_matter"
351
376
  KEY_DECORATORS = "decorators"
377
+ # Declared POSITIONAL parameter names of a Python function, receiver included,
378
+ # for arity-TypeError diagnosis (issue #227). Positional-only because CPython's
379
+ # "takes N positional arguments" counts nothing after `*`/`*args`, and
380
+ # receiver-inclusive because it counts the bound `self`.
381
+ #
382
+ # Absent on every other language rather than empty: absent means "kinds
383
+ # unknown", which `diagnose_arity` answers with "cannot corroborate", whereas
384
+ # an empty list would assert "declares zero positional parameters" and produce
385
+ # a false mismatch on correct code.
386
+ KEY_POSITIONAL_PARAMS = "positional_params"
352
387
  # Target-module qn candidates of `#[cfg(test)] mod NAME;` declarations in a
353
388
  # Rust file, stored on the DECLARING module's node (issue #1010). The
354
389
  # ungated counterpart lets a production target's declaration of the SAME
@@ -408,6 +443,7 @@ CYPHER_DELETE_MODULE = (
408
443
  # projects, and a path-only delete would take the sibling's node (issue #897).
409
444
  CYPHER_DELETE_FILE = "MATCH (f:File {absolute_path: $path}) DETACH DELETE f"
410
445
  CYPHER_DELETE_FOLDER = "MATCH (f:Folder {absolute_path: $path}) DETACH DELETE f"
446
+ CYPHER_DELETE_PACKAGE = "MATCH (p:Package {absolute_path: $path}) DETACH DELETE p"
411
447
  CYPHER_DELETE_CALLS = "MATCH ()-[r:CALLS]->() DELETE r"
412
448
  # Removes external import-target Module nodes that no module imports anymore
413
449
  # (e.g. an imported name that was renamed/removed on an incremental rebuild).
@@ -452,6 +488,13 @@ CYPHER_ALL_MODULE_PATHS_INTERNAL = (
452
488
  CYPHER_ALL_FOLDER_PATHS = (
453
489
  "MATCH (f:Folder) RETURN f.path AS path, f.absolute_path AS absolute_path"
454
490
  )
491
+ # Package nodes are pruned against the CURRENT structure, not the disk: a
492
+ # directory whose indicator file (__init__.py, Cargo.toml, ...) went away
493
+ # still exists, as a Folder (issue #1570).
494
+ CYPHER_ALL_PACKAGE_PATHS = (
495
+ "MATCH (p:Package) RETURN p.path AS path, p.absolute_path AS absolute_path, "
496
+ "p.qualified_name AS qualified_name"
497
+ )
455
498
 
456
499
  # Rehydrate the in-memory function registry on an incremental run: returns
457
500
  # every definition node's qualified name and label so call/instantiation
@@ -483,21 +526,48 @@ CYPHER_ALL_MODULE_QNS = (
483
526
  # Re-resolving the callers instead would diverge from a clean index, because
484
527
  # cgr's call resolution is context-sensitive (protocol vs concrete receiver,
485
528
  # import granularity); the original edges already match a clean re-index.
529
+ #
530
+ # The STRUCTURE of this query and of CYPHER_AFFECTED_CALLER_PATHS below is not
531
+ # covered by the unit suite, only their relation lists are. The eval emulator
532
+ # (evals/cgr_graph.py) matches these constants whole, in a `case` that compares
533
+ # the query by VALUE, and never parses the Cypher: it reimplements the
534
+ # semantics in Python over its own frozensets. So an edit to the text here is
535
+ # followed automatically by the `case` while the emulator's behaviour stays
536
+ # hardcoded, and a structural edit keeps every unit test green while breaking
537
+ # production. Measured 2026-08-30: flipping the arrow here to
538
+ # `(caller)<-[r:...]-(target)` left all of test_incremental_implements_edge.py
539
+ # passing (7 passed), and deleting the `caller.path` guard from
540
+ # CYPHER_AFFECTED_CALLER_PATHS left 16 passed across `pytest
541
+ # test_incremental_implements_edge.py test_graph_updater_incremental_rename.py
542
+ # test_cacheless_lookup_failure.py`. Both queries do reach a real backend,
543
+ # via `ingestor.fetch_all` in graph_updater.py (the affected-caller read and
544
+ # `_capture_inbound_edges`), so such an edit ships a broken incremental
545
+ # restore. Verify a change to the MATCH shape or the WHERE clauses against a
546
+ # real graph (the Docker-backed integration tier), not against a green unit
547
+ # run. Two edits the unit suite DOES catch: adding or removing a relation
548
+ # type, and renaming this query's `props` key (test_edge_site_properties.py).
549
+ # CYPHER_AFFECTED_CALLER_PATHS' `caller_path` projection IS pinned, expression
550
+ # and alias both, by test_incremental_implements_edge.py; its other RETURN
551
+ # aliases are not.
486
552
  CYPHER_INBOUND_EDGES = (
487
- "MATCH (caller)-[r:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|OVERRIDES]->(target) "
553
+ "MATCH (caller)-[r:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|IMPLEMENTS|OVERRIDES]->(target) "
488
554
  "WHERE target.path IN $paths AND caller.qualified_name IS NOT NULL "
489
555
  "AND (caller.path IS NULL OR NOT caller.path IN $paths) "
490
556
  "RETURN head(labels(caller)) AS caller_label, "
491
557
  "caller.qualified_name AS caller_qn, type(r) AS rel, "
492
- "head(labels(target)) AS target_label, target.qualified_name AS target_qn"
558
+ "head(labels(target)) AS target_label, target.qualified_name AS target_qn, "
559
+ "properties(r) AS props"
493
560
  )
494
561
  # Files whose code DEPENDS on a re-indexed file (issue #1229 phase 4): a
495
562
  # change there can rebind their calls (a new override shadowing an inherited
496
563
  # method), so restoring their old edges verbatim would freeze a stale
497
564
  # binding. They are re-parsed instead, one level deep: their own definitions
498
- # are unchanged, so their callers' bindings cannot move.
565
+ # are unchanged, so their callers' bindings cannot move. IMPLEMENTS counts
566
+ # like INHERITS: an implementor in the same package holds no import edge into
567
+ # its interface's file, and without this it was neither re-parsed nor
568
+ # restored when that file was re-indexed (issue #1565).
499
569
  CYPHER_AFFECTED_CALLER_PATHS = (
500
- "MATCH (caller)-[:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS]->(target) "
570
+ "MATCH (caller)-[:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|IMPLEMENTS]->(target) "
501
571
  "WHERE target.path IN $paths AND caller.path IS NOT NULL "
502
572
  "AND NOT caller.path IN $paths "
503
573
  "AND caller.qualified_name STARTS WITH $project_prefix "
@@ -581,6 +651,14 @@ REL_TYPE_CALLS = "CALLS"
581
651
  # still dedups on endpoints.
582
652
  MERGE_KEY_PROPS_BY_REL: dict[str, tuple[str, ...]] = {
583
653
  RelationshipType.FLOWS_TO.value: ("via", "kind"),
654
+ # One edge per call/reference/instantiation site (issue #1522); a row
655
+ # without a site still merges on its endpoints alone.
656
+ RelationshipType.CALLS.value: (KEY_LINE, KEY_COL),
657
+ RelationshipType.REFERENCES.value: (KEY_LINE, KEY_COL),
658
+ RelationshipType.INSTANTIATES.value: (KEY_LINE, KEY_COL),
659
+ # One edge per bound name: `from x import a, b` shares a statement span
660
+ # but binds two names, each its own edge.
661
+ RelationshipType.IMPORTS.value: (KEY_LINE, KEY_COL, KEY_ALIAS),
584
662
  }
585
663
 
586
664
  NODE_UNIQUE_CONSTRAINTS: dict[str, str] = {
@@ -150,6 +150,18 @@ LANG_TABLE_PLACEHOLDER = "—"
150
150
 
151
151
  LANG_MSG_AVAILABLE_NODES = "Available nodes for mapping:"
152
152
  LANG_ELLIPSIS = "..."
153
+ # Span-preserving patchers (issue #1529): formatter checks and the identifier
154
+ # node types a rename may target beyond the shared `identifier` family.
155
+ PATCH_GOFMT = "gofmt"
156
+ PATCH_GOFMT_LIST_FLAG = "-l"
157
+ PATCH_RUSTFMT = "rustfmt"
158
+ PATCH_RUSTFMT_CHECK_FLAG = "--check"
159
+ PATCH_RUSTFMT_EDITION_FLAG = "--edition"
160
+ PATCH_RUSTFMT_EDITION = "2021"
161
+ PATCH_FORMATTER_TIMEOUT_S = 60
162
+ PATCH_TS_FIELD_IDENTIFIER = "field_identifier"
163
+ PATCH_TS_NAMESPACE_IDENTIFIER = "namespace_identifier"
164
+ PATCH_TS_STATEMENT_IDENTIFIER = "statement_identifier"
153
165
  LANG_GIT_SUFFIX = ".git"
154
166
  LANG_GITMODULES_FILE = ".gitmodules"
155
167
  LANG_CALL_KEYWORD_EXCLUDE = "call"
@@ -445,9 +445,33 @@ IGNORE_PATTERNS = frozenset(
445
445
  "venv",
446
446
  }
447
447
  )
448
+ # Machine-generated artefacts: never hand-edited, never first-party. Matched
449
+ # against the whole FILENAME with `str.endswith`, not against `Path.suffix`,
450
+ # because two entries here are not suffixes in pathlib's sense:
451
+ # `Path("jquery.min.js").suffix` is ".js" and `Path("notes.py~").suffix` is
452
+ # ".py~", so a `Path.suffix` test silently matched neither (issue #1636).
453
+ # Use `path_utils.is_ignored_filename`; do not re-derive the rule.
448
454
  IGNORE_SUFFIXES = frozenset(
449
- {".tmp", "~", ".pyc", ".pyo", ".o", ".a", ".so", ".dll", ".class"}
455
+ {
456
+ ".tmp",
457
+ "~",
458
+ ".pyc",
459
+ ".pyo",
460
+ ".o",
461
+ ".a",
462
+ ".so",
463
+ ".dll",
464
+ ".class",
465
+ # Vendored bundles that generated API docs (jazzy, YARD, JSDoc,
466
+ # Sphinx) ship alongside the source they document. Their symbols are
467
+ # whatever the minifier emitted, and they outnumber the real ones.
468
+ ".min.js",
469
+ ".min.css",
470
+ }
450
471
  )
472
+ # `str.endswith` takes a tuple, and the repository walk tests every filename,
473
+ # so build it once rather than per file. Derived, never edited separately.
474
+ IGNORE_FILENAME_ENDINGS = tuple(sorted(IGNORE_SUFFIXES))
451
475
 
452
476
  # pathspec style for .cgrignore / --exclude patterns (#495).
453
477
  GITWILDMATCH_STYLE = "gitignore"
@@ -18,6 +18,8 @@ class MCPToolName(StrEnum):
18
18
  SEMANTIC_SEARCH = "semantic_search"
19
19
  STRUCTURAL_SEARCH = "structural_search"
20
20
  STRUCTURAL_REPLACE = "structural_replace"
21
+ FIND_DUPLICATE_CODE = "find_duplicate_code"
22
+ GET_FUNCTION_SOURCE = "get_function_source"
21
23
  ASK_AGENT = "ask_agent"
22
24
  FLOW_VERDICT = "flow_verdict"
23
25
  EXPLAIN_TRACEBACK = "explain_traceback"
@@ -39,6 +41,9 @@ class MCPSchemaType(StrEnum):
39
41
  OBJECT = "object"
40
42
  STRING = "string"
41
43
  INTEGER = "integer"
44
+ # JSON Schema spells a float 'number'; 'integer' would reject a 0.8
45
+ # similarity threshold at the client before the call is even made.
46
+ NUMBER = "number"
42
47
  BOOLEAN = "boolean"
43
48
 
44
49
 
@@ -52,6 +57,9 @@ class MCPSchemaField(StrEnum):
52
57
 
53
58
  class MCPParamName(StrEnum):
54
59
  PROJECT_NAME = "project_name"
60
+ # The per-request retrieval scope (issue #1494). Distinct from
61
+ # PROJECT_NAME, which names the target of delete_project.
62
+ PROJECT = "project"
55
63
  CONFIRM = "confirm"
56
64
  NATURAL_LANGUAGE_QUERY = "natural_language_query"
57
65
  QUALIFIED_NAME = "qualified_name"
@@ -71,6 +79,9 @@ class MCPParamName(StrEnum):
71
79
  SINK_QN = "sink_qualified_name"
72
80
  DRY_RUN = "dry_run"
73
81
  TRACEBACK_TEXT = "traceback_text"
82
+ NODE_ID = "node_id"
83
+ THRESHOLD = "threshold"
84
+ MIN_SIZE = "min_size"
74
85
 
75
86
 
76
87
  # MCP server constants
@@ -95,6 +106,9 @@ MCP_SEMANTIC_NOT_AVAILABLE_RESPONSE = (
95
106
  "Semantic search is not available. Install with: uv sync --extra semantic"
96
107
  )
97
108
  MCP_ASK_AGENT_ERROR = "Error running ask_agent: {error}"
109
+ # Refused rather than answered with zero rows: an empty result for a
110
+ # misspelled project name is indistinguishable from a genuine empty result.
111
+ MCP_UNKNOWN_PROJECT = "Unknown project {project!r}. Indexed projects: {known}"
98
112
  MCP_PROJECT_DELETED = "Successfully deleted project '{project_name}'."
99
113
  MCP_WIPE_CANCELLED = "Database wipe cancelled. Set confirm=true to proceed."
100
114
  MCP_WIPE_SUCCESS = "Database completely wiped. All projects have been removed."