code-graph-rag 0.0.187__tar.gz → 0.0.245__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.
- {code_graph_rag-0.0.187/code_graph_rag.egg-info → code_graph_rag-0.0.245}/PKG-INFO +3 -2
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/PYPI_README.md +1 -1
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/README.md +24 -16
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245/code_graph_rag.egg-info}/PKG-INFO +3 -2
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/code_graph_rag.egg-info/SOURCES.txt +6 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/code_graph_rag.egg-info/requires.txt +1 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/cli.py +24 -4
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/cli_help.py +5 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/config.py +29 -3
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/constants.py +456 -9
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/cypher_queries.py +112 -12
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/graph_updater.py +240 -11
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/language_spec.py +27 -9
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/logs.py +5 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/main.py +13 -9
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/mcp/tools.py +2 -2
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parser_loader.py +16 -2
- code_graph_rag-0.0.245/codebase_rag/parsers/call_processor.py +3165 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/call_resolver.py +673 -18
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/identity.py +12 -5
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/mixin.py +209 -8
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/relationships.py +18 -2
- code_graph_rag-0.0.245/codebase_rag/parsers/cpp/__init__.py +5 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/cpp/type_inference.py +313 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/cpp/utils.py +51 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/cpp_frontend/frontend.py +20 -3
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/definition_processor.py +35 -4
- code_graph_rag-0.0.245/codebase_rag/parsers/export_detection.py +160 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/factory.py +5 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/function_ingest.py +75 -6
- code_graph_rag-0.0.245/codebase_rag/parsers/go/__init__.py +16 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/go/module_paths.py +65 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/go/type_inference.py +198 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/go/utils.py +63 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/registry.py +1 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/import_processor.py +305 -7
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/method_resolver.py +33 -1
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/type_inference.py +14 -10
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/type_resolver.py +26 -1
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/js_ts/ingest.py +28 -1
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/js_ts/type_inference.py +4 -6
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/ast_analyzer.py +5 -15
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/expression_analyzer.py +20 -4
- code_graph_rag-0.0.245/codebase_rag/parsers/python_source_roots.py +150 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/rs/__init__.py +3 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/rs/type_inference.py +314 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/rs/utils.py +45 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/stdlib_extractor.py +5 -1
- code_graph_rag-0.0.245/codebase_rag/parsers/type_inference.py +410 -0
- code_graph_rag-0.0.245/codebase_rag/parsers/utils.py +706 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/prompts.py +62 -4
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/services/llm.py +5 -5
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/services/protobuf_service.py +1 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/health_checker.py +1 -1
- code_graph_rag-0.0.245/codebase_rag/tools/semantic_search.py +162 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/types_defs.py +10 -1
- code_graph_rag-0.0.245/codebase_rag/utils/path_utils.py +125 -0
- code_graph_rag-0.0.245/codec/schema_pb2.py +75 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codec/schema_pb2.pyi +82 -98
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/pyproject.toml +2 -1
- code_graph_rag-0.0.187/codebase_rag/parsers/call_processor.py +0 -1487
- code_graph_rag-0.0.187/codebase_rag/parsers/go/__init__.py +0 -6
- code_graph_rag-0.0.187/codebase_rag/parsers/go/utils.py +0 -36
- code_graph_rag-0.0.187/codebase_rag/parsers/type_inference.py +0 -151
- code_graph_rag-0.0.187/codebase_rag/parsers/utils.py +0 -350
- code_graph_rag-0.0.187/codebase_rag/tools/semantic_search.py +0 -164
- code_graph_rag-0.0.187/codebase_rag/utils/__init__.py +0 -0
- code_graph_rag-0.0.187/codebase_rag/utils/path_utils.py +0 -87
- code_graph_rag-0.0.187/codec/__init__.py +0 -0
- code_graph_rag-0.0.187/codec/schema_pb2.py +0 -62
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/LICENSE +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/cgr/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/code_graph_rag.egg-info/dependency_links.txt +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/code_graph_rag.egg-info/entry_points.txt +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/code_graph_rag.egg-info/top_level.txt +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/cgr_state.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/decorators.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/docker-compose.yaml +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/embedder.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/exceptions.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/graph_loader.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/mcp/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/mcp/client.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/mcp/server.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/models.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/cpp_modules.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/method_override.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/node_type.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/parent_extraction.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/class_ingest/utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/cpp_frontend/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/cpp_frontend/constants.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/cpp_frontend/qn.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/dependency_parser.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/base.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/cpp.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/java.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/js_ts.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/lua.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/php.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/protocol.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/python.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/handlers/rust.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/java/variable_analyzer.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/js_ts/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/js_ts/module_system.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/js_ts/utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/lua/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/lua/type_inference.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/lua/utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/type_inference.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/py/variable_analyzer.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/parsers/structure_processor.py +0 -0
- {code_graph_rag-0.0.187/codebase_rag/parsers/cpp → code_graph_rag-0.0.245/codebase_rag/providers}/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/providers/base.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/providers/litellm.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/readme_sections.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/schema_builder.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/schemas.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/services/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/services/anthropic_token_counter.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/services/graph_service.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/stack/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/stack/cli.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/stack/constants.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/stack/health.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/stack/manager.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tool_errors.py +0 -0
- {code_graph_rag-0.0.187/codebase_rag/parsers/rs → code_graph_rag-0.0.245/codebase_rag/tools}/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/code_retrieval.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/codebase_query.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/directory_lister.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/file_editor.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/file_reader.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/file_writer.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/language.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/shell_command.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/tools/tool_descriptions.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/unixcoder.py +0 -0
- {code_graph_rag-0.0.187/codebase_rag/providers → code_graph_rag-0.0.245/codebase_rag/utils}/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/utils/dependencies.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/utils/fqn_resolver.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/utils/rich_markdown.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/utils/source_extraction.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/utils/token_utils.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/vector_store.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/workspaces/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/workspaces/cli.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/workspaces/constants.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/workspaces/models.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/codebase_rag/workspaces/storage.py +0 -0
- {code_graph_rag-0.0.187/codebase_rag/tools → code_graph_rag-0.0.245/codec}/__init__.py +0 -0
- {code_graph_rag-0.0.187 → code_graph_rag-0.0.245}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-graph-rag
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.245
|
|
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
|
|
@@ -38,6 +38,7 @@ Requires-Dist: protobuf>=6.33.5
|
|
|
38
38
|
Requires-Dist: defusedxml>=0.7.1
|
|
39
39
|
Requires-Dist: huggingface-hub[hf-xet]>=1.7.2
|
|
40
40
|
Requires-Dist: griffe<2,>=1.0
|
|
41
|
+
Requires-Dist: pathspec>=1.0.4
|
|
41
42
|
Provides-Extra: test
|
|
42
43
|
Requires-Dist: pytest>=8.4.1; extra == "test"
|
|
43
44
|
Requires-Dist: pytest-asyncio>=1.0.0; extra == "test"
|
|
@@ -99,7 +100,7 @@ The package installs a `cgr` command.
|
|
|
99
100
|
**Start Memgraph, parse a repo, and query it:**
|
|
100
101
|
|
|
101
102
|
```bash
|
|
102
|
-
|
|
103
|
+
cgr daemon up # start Memgraph + Qdrant
|
|
103
104
|
cgr start --repo-path ./my-project \
|
|
104
105
|
--update-graph --clean # parse & launch interactive chat
|
|
105
106
|
```
|
|
@@ -34,7 +34,7 @@ The package installs a `cgr` command.
|
|
|
34
34
|
**Start Memgraph, parse a repo, and query it:**
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
|
|
37
|
+
cgr daemon up # start Memgraph + Qdrant
|
|
38
38
|
cgr start --repo-path ./my-project \
|
|
39
39
|
--update-graph --clean # parse & launch interactive chat
|
|
40
40
|
```
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<img src="https://img.shields.io/github/forks/vitali87/code-graph-rag?style=social" alt="GitHub forks" />
|
|
21
21
|
</a>
|
|
22
22
|
-->
|
|
23
|
-
<!-- Codecov, SonarCloud, and OpenSSF Scorecard badges
|
|
23
|
+
<!-- Codecov, SonarCloud, and OpenSSF Scorecard badges are fed by GitHub-side CI. Uncomment once that CI is confirmed to publish to these services again.
|
|
24
24
|
<a href="https://codecov.io/gh/vitali87/code-graph-rag">
|
|
25
25
|
<img src="https://codecov.io/gh/vitali87/code-graph-rag/graph/badge.svg" alt="Codecov" />
|
|
26
26
|
</a>
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
<a href="https://pepy.tech/projects/code-graph-rag">
|
|
40
40
|
<img src="https://static.pepy.tech/personalized-badge/code-graph-rag?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads" alt="PyPI Downloads" />
|
|
41
41
|
</a>
|
|
42
|
-
<!-- OpenSSF Scorecard only tracks GitHub-hosted repos.
|
|
42
|
+
<!-- OpenSSF Scorecard only tracks GitHub-hosted repos. Uncomment once the Scorecard workflow is confirmed running on the authoritative GitHub repo.
|
|
43
43
|
<a href="https://scorecard.dev/viewer/?uri=github.com/vitali87/code-graph-rag">
|
|
44
44
|
<img src="https://api.scorecard.dev/projects/github.com/vitali87/code-graph-rag/badge" alt="OpenSSF Scorecard" />
|
|
45
45
|
</a>
|
|
@@ -82,7 +82,8 @@ An accurate Retrieval-Augmented Generation (RAG) system that analyzes multi-lang
|
|
|
82
82
|
| PHP | Fully Supported | .php | ✓ | ✓ | ✓ | - | Classes, interfaces, traits, enums, namespaces, PHP 8 attributes |
|
|
83
83
|
| Python | Fully Supported | .py | ✓ | ✓ | ✓ | ✓ | Type inference, decorators, nested functions |
|
|
84
84
|
| Rust | Fully Supported | .rs | ✓ | ✓ | ✓ | ✓ | impl blocks, associated functions |
|
|
85
|
-
| TypeScript | Fully Supported | .
|
|
85
|
+
| TypeScript (TSX) | Fully Supported | .tsx | ✓ | ✓ | ✓ | - | All TypeScript features plus JSX elements and components |
|
|
86
|
+
| TypeScript | Fully Supported | .ts | ✓ | ✓ | ✓ | - | Interfaces, type aliases, enums, namespaces, ES6/CommonJS modules |
|
|
86
87
|
| Go | In Development | .go | ✓ | ✓ | ✓ | - | Methods, type declarations |
|
|
87
88
|
| Scala | In Development | .scala, .sc | ✓ | ✓ | ✓ | - | Case classes, objects |
|
|
88
89
|
<!-- /SECTION:supported_languages -->
|
|
@@ -187,7 +188,7 @@ volumes (`memgraph_data`, `memgraph_log`, `qdrant_storage`).
|
|
|
187
188
|
### Local development install
|
|
188
189
|
|
|
189
190
|
```bash
|
|
190
|
-
git clone https://
|
|
191
|
+
git clone https://github.com/vitali87/code-graph-rag.git
|
|
191
192
|
cd code-graph-rag
|
|
192
193
|
```
|
|
193
194
|
|
|
@@ -292,7 +293,7 @@ ollama pull llama3.2
|
|
|
292
293
|
|
|
293
294
|
4. **Start Memgraph database**:
|
|
294
295
|
```bash
|
|
295
|
-
|
|
296
|
+
cgr daemon up
|
|
296
297
|
```
|
|
297
298
|
|
|
298
299
|
5. **Verify installation**:
|
|
@@ -331,6 +332,7 @@ Use the Makefile for common development tasks:
|
|
|
331
332
|
| `make format` | Run ruff format |
|
|
332
333
|
| `make typecheck` | Run type checking with ty |
|
|
333
334
|
| `make check` | Run all checks: lint, typecheck, test |
|
|
335
|
+
| `make release` | Build, verify, and publish the current pyproject version to PyPI, then tag and create a GitHub Release |
|
|
334
336
|
| `make pre-commit` | Run all pre-commit checks locally (comprehensive test before commit) |
|
|
335
337
|
<!-- /SECTION:makefile_commands -->
|
|
336
338
|
|
|
@@ -674,6 +676,7 @@ The knowledge graph uses the following node types and relationships:
|
|
|
674
676
|
| ModuleInterface | `{qualified_name: string, name: string, path: string, absolute_path: string}` |
|
|
675
677
|
| ModuleImplementation | `{qualified_name: string, name: string, path: string, absolute_path: string, implements_module: string}` |
|
|
676
678
|
| ExternalPackage | `{name: string, version_spec: string}` |
|
|
679
|
+
| ExternalModule | `{qualified_name: string, name: string, path: string}` |
|
|
677
680
|
<!-- /SECTION:node_schemas -->
|
|
678
681
|
|
|
679
682
|
### Language-Specific Mappings
|
|
@@ -687,6 +690,7 @@ The knowledge graph uses the following node types and relationships:
|
|
|
687
690
|
- **PHP**: `anonymous_function`, `arrow_function`, `class_declaration`, `enum_declaration`, `function_definition`, `interface_declaration`, `method_declaration`, `trait_declaration`
|
|
688
691
|
- **Python**: `class_definition`, `function_definition`
|
|
689
692
|
- **Rust**: `closure_expression`, `enum_item`, `function_item`, `function_signature_item`, `impl_item`, `struct_item`, `trait_item`, `type_item`, `union_item`
|
|
693
|
+
- **TypeScript (TSX)**: `abstract_class_declaration`, `arrow_function`, `class`, `class_declaration`, `enum_declaration`, `function_declaration`, `function_expression`, `function_signature`, `generator_function_declaration`, `interface_declaration`, `internal_module`, `method_definition`, `type_alias_declaration`
|
|
690
694
|
- **TypeScript**: `abstract_class_declaration`, `arrow_function`, `class`, `class_declaration`, `enum_declaration`, `function_declaration`, `function_expression`, `function_signature`, `generator_function_declaration`, `interface_declaration`, `internal_module`, `method_definition`, `type_alias_declaration`
|
|
691
695
|
- **Go**: `function_declaration`, `method_declaration`, `type_alias`, `type_spec`
|
|
692
696
|
- **Scala**: `class_definition`, `function_declaration`, `function_definition`, `object_definition`, `trait_definition`
|
|
@@ -703,7 +707,7 @@ The knowledge graph uses the following node types and relationships:
|
|
|
703
707
|
| Project, Package, Folder | CONTAINS_MODULE | Module |
|
|
704
708
|
| Module | DEFINES | Class, Function |
|
|
705
709
|
| Class | DEFINES_METHOD | Method |
|
|
706
|
-
| Module | IMPORTS | Module |
|
|
710
|
+
| Module | IMPORTS | Module, ExternalModule |
|
|
707
711
|
| Module | EXPORTS | Class, Function |
|
|
708
712
|
| Module | EXPORTS_MODULE | ModuleInterface |
|
|
709
713
|
| Module | IMPLEMENTS_MODULE | ModuleImplementation |
|
|
@@ -713,6 +717,8 @@ The knowledge graph uses the following node types and relationships:
|
|
|
713
717
|
| ModuleImplementation | IMPLEMENTS | ModuleInterface |
|
|
714
718
|
| Project | DEPENDS_ON_EXTERNAL | ExternalPackage |
|
|
715
719
|
| Function, Method | CALLS | Function, Method |
|
|
720
|
+
| Module, Function, Method | REFERENCES | Function, Method, Class |
|
|
721
|
+
| Module, Function, Method | INSTANTIATES | Class |
|
|
716
722
|
<!-- /SECTION:relationship_schemas -->
|
|
717
723
|
|
|
718
724
|
## 🔧 Configuration
|
|
@@ -754,27 +760,28 @@ Configuration is managed through environment variables in `.env` file:
|
|
|
754
760
|
|
|
755
761
|
### Custom Ignore Patterns
|
|
756
762
|
|
|
757
|
-
You can specify additional directories to exclude by creating a `.cgrignore` file in your repository root:
|
|
763
|
+
You can specify additional files and directories to exclude by creating a `.cgrignore` file in your repository root. Patterns follow `.gitignore` conventions:
|
|
758
764
|
|
|
759
765
|
```
|
|
760
766
|
# Comments start with #
|
|
761
767
|
vendor
|
|
762
|
-
.
|
|
763
|
-
|
|
768
|
+
*.gen.ts
|
|
769
|
+
docs/*.md
|
|
770
|
+
/generated
|
|
771
|
+
!bin/keep.py
|
|
764
772
|
```
|
|
765
773
|
|
|
766
|
-
-
|
|
767
|
-
- Lines starting with
|
|
768
|
-
-
|
|
769
|
-
- Patterns are
|
|
770
|
-
- Patterns from `.cgrignore` are merged with `--exclude` flags and auto-detected directories
|
|
774
|
+
- Gitignore syntax: `*` matches within a segment, `**` crosses segments, bare names match at any depth, slash-containing patterns are anchored to the root, trailing slash matches directories only
|
|
775
|
+
- Lines starting with `!` un-ignore paths that a default exclusion would skip (explicit excludes always win)
|
|
776
|
+
- Lines starting with `#` are comments; blank lines are ignored
|
|
777
|
+
- Patterns from `.cgrignore` are merged with `--exclude` flags (same syntax) and auto-detected directories
|
|
771
778
|
|
|
772
779
|
### Key Dependencies
|
|
773
780
|
|
|
774
781
|
<!-- SECTION:dependencies -->
|
|
775
782
|
- **loguru**: Python logging made (stupidly) simple
|
|
776
783
|
- **mcp**: Model Context Protocol SDK
|
|
777
|
-
- **pydantic-ai**: Agent Framework
|
|
784
|
+
- **pydantic-ai**: AI Agent Framework, the Pydantic way
|
|
778
785
|
- **pydantic-settings**: Settings management using Pydantic
|
|
779
786
|
- **pymgclient**: Memgraph database adapter for Python language
|
|
780
787
|
- **python-dotenv**: Read key-value pairs from a .env file and set them as environment variables
|
|
@@ -792,6 +799,7 @@ my_build_output
|
|
|
792
799
|
- **defusedxml**: XML bomb protection for Python stdlib modules
|
|
793
800
|
- **huggingface-hub**: Client library to download and publish models, datasets and other repos on the huggingface.co hub
|
|
794
801
|
- **griffe**: Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API.
|
|
802
|
+
- **pathspec**: Utility library for gitignore style pattern matching of file paths.
|
|
795
803
|
<!-- /SECTION:dependencies -->
|
|
796
804
|
|
|
797
805
|
## 🤖 Agentic Workflow & Tools
|
|
@@ -835,7 +843,7 @@ Code-Graph-RAG makes it easy to add support for any language that has a Tree-sit
|
|
|
835
843
|
|
|
836
844
|
> **⚠️ Recommendation**: While you can add languages yourself, we recommend waiting for official full support to ensure optimal parsing quality, comprehensive feature coverage, and robust integration. The languages marked as "In Development" above will receive dedicated optimization and testing.
|
|
837
845
|
|
|
838
|
-
> **💡 Request Support**: If you want a specific language to be officially supported, please [submit an issue](https://
|
|
846
|
+
> **💡 Request Support**: If you want a specific language to be officially supported, please [submit an issue](https://github.com/vitali87/code-graph-rag/issues) with your language request.
|
|
839
847
|
|
|
840
848
|
#### Quick Start: Add a Language
|
|
841
849
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-graph-rag
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.245
|
|
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
|
|
@@ -38,6 +38,7 @@ Requires-Dist: protobuf>=6.33.5
|
|
|
38
38
|
Requires-Dist: defusedxml>=0.7.1
|
|
39
39
|
Requires-Dist: huggingface-hub[hf-xet]>=1.7.2
|
|
40
40
|
Requires-Dist: griffe<2,>=1.0
|
|
41
|
+
Requires-Dist: pathspec>=1.0.4
|
|
41
42
|
Provides-Extra: test
|
|
42
43
|
Requires-Dist: pytest>=8.4.1; extra == "test"
|
|
43
44
|
Requires-Dist: pytest-asyncio>=1.0.0; extra == "test"
|
|
@@ -99,7 +100,7 @@ The package installs a `cgr` command.
|
|
|
99
100
|
**Start Memgraph, parse a repo, and query it:**
|
|
100
101
|
|
|
101
102
|
```bash
|
|
102
|
-
|
|
103
|
+
cgr daemon up # start Memgraph + Qdrant
|
|
103
104
|
cgr start --repo-path ./my-project \
|
|
104
105
|
--update-graph --clean # parse & launch interactive chat
|
|
105
106
|
```
|
|
@@ -44,9 +44,11 @@ codebase_rag/parsers/call_processor.py
|
|
|
44
44
|
codebase_rag/parsers/call_resolver.py
|
|
45
45
|
codebase_rag/parsers/definition_processor.py
|
|
46
46
|
codebase_rag/parsers/dependency_parser.py
|
|
47
|
+
codebase_rag/parsers/export_detection.py
|
|
47
48
|
codebase_rag/parsers/factory.py
|
|
48
49
|
codebase_rag/parsers/function_ingest.py
|
|
49
50
|
codebase_rag/parsers/import_processor.py
|
|
51
|
+
codebase_rag/parsers/python_source_roots.py
|
|
50
52
|
codebase_rag/parsers/stdlib_extractor.py
|
|
51
53
|
codebase_rag/parsers/structure_processor.py
|
|
52
54
|
codebase_rag/parsers/type_inference.py
|
|
@@ -61,12 +63,15 @@ codebase_rag/parsers/class_ingest/parent_extraction.py
|
|
|
61
63
|
codebase_rag/parsers/class_ingest/relationships.py
|
|
62
64
|
codebase_rag/parsers/class_ingest/utils.py
|
|
63
65
|
codebase_rag/parsers/cpp/__init__.py
|
|
66
|
+
codebase_rag/parsers/cpp/type_inference.py
|
|
64
67
|
codebase_rag/parsers/cpp/utils.py
|
|
65
68
|
codebase_rag/parsers/cpp_frontend/__init__.py
|
|
66
69
|
codebase_rag/parsers/cpp_frontend/constants.py
|
|
67
70
|
codebase_rag/parsers/cpp_frontend/frontend.py
|
|
68
71
|
codebase_rag/parsers/cpp_frontend/qn.py
|
|
69
72
|
codebase_rag/parsers/go/__init__.py
|
|
73
|
+
codebase_rag/parsers/go/module_paths.py
|
|
74
|
+
codebase_rag/parsers/go/type_inference.py
|
|
70
75
|
codebase_rag/parsers/go/utils.py
|
|
71
76
|
codebase_rag/parsers/handlers/__init__.py
|
|
72
77
|
codebase_rag/parsers/handlers/base.py
|
|
@@ -100,6 +105,7 @@ codebase_rag/parsers/py/type_inference.py
|
|
|
100
105
|
codebase_rag/parsers/py/utils.py
|
|
101
106
|
codebase_rag/parsers/py/variable_analyzer.py
|
|
102
107
|
codebase_rag/parsers/rs/__init__.py
|
|
108
|
+
codebase_rag/parsers/rs/type_inference.py
|
|
103
109
|
codebase_rag/parsers/rs/utils.py
|
|
104
110
|
codebase_rag/providers/__init__.py
|
|
105
111
|
codebase_rag/providers/base.py
|
|
@@ -2,6 +2,7 @@ import asyncio
|
|
|
2
2
|
import json
|
|
3
3
|
import time
|
|
4
4
|
from collections.abc import Callable
|
|
5
|
+
from fnmatch import fnmatch
|
|
5
6
|
from functools import partial
|
|
6
7
|
from importlib.metadata import version as get_version
|
|
7
8
|
from pathlib import Path
|
|
@@ -16,7 +17,7 @@ from . import cgr_state
|
|
|
16
17
|
from . import cli_help as ch
|
|
17
18
|
from . import constants as cs
|
|
18
19
|
from . import logs as ls
|
|
19
|
-
from .config import
|
|
20
|
+
from .config import load_ignore_patterns, settings
|
|
20
21
|
from .graph_updater import GraphUpdater
|
|
21
22
|
from .main import (
|
|
22
23
|
_create_configuration_table,
|
|
@@ -192,7 +193,7 @@ def _run_graph_sync(
|
|
|
192
193
|
clean: bool = False,
|
|
193
194
|
output: str | None = None,
|
|
194
195
|
) -> None:
|
|
195
|
-
cgrignore =
|
|
196
|
+
cgrignore = load_ignore_patterns(repo)
|
|
196
197
|
cli_excludes = frozenset(exclude) if exclude else frozenset()
|
|
197
198
|
exclude_paths = cli_excludes | cgrignore.exclude or None
|
|
198
199
|
unignore_paths: frozenset[str] | None
|
|
@@ -535,7 +536,7 @@ def index(
|
|
|
535
536
|
|
|
536
537
|
_info(style(cs.CLI_MSG_OUTPUT_TO.format(path=output_proto_dir), cs.Color.CYAN))
|
|
537
538
|
|
|
538
|
-
cgrignore =
|
|
539
|
+
cgrignore = load_ignore_patterns(repo_to_index)
|
|
539
540
|
cli_excludes = frozenset(exclude) if exclude else frozenset()
|
|
540
541
|
exclude_paths = cli_excludes | cgrignore.exclude or None
|
|
541
542
|
unignore_paths: frozenset[str] | None = None
|
|
@@ -941,6 +942,22 @@ def _dead_code_params(
|
|
|
941
942
|
}
|
|
942
943
|
|
|
943
944
|
|
|
945
|
+
def _filter_excluded_rows(rows: list[ResultRow], exclude: list[str]) -> list[ResultRow]:
|
|
946
|
+
# (H) Drop candidates whose file path matches an exclude glob (generated dirs
|
|
947
|
+
# (H) like client/core or *.gen.* have no in-repo caller, so every symbol
|
|
948
|
+
# (H) reports as dead). fnmatch treats '*' as spanning '/', so '*client/core*'
|
|
949
|
+
# (H) matches at any depth.
|
|
950
|
+
if not exclude:
|
|
951
|
+
return rows
|
|
952
|
+
return [
|
|
953
|
+
row
|
|
954
|
+
for row in rows
|
|
955
|
+
if not any(
|
|
956
|
+
fnmatch(str(row.get(cs.KEY_PATH) or ""), pattern) for pattern in exclude
|
|
957
|
+
)
|
|
958
|
+
]
|
|
959
|
+
|
|
960
|
+
|
|
944
961
|
def _to_dead_code_row(row: ResultRow) -> DeadCodeRow:
|
|
945
962
|
start = row.get(cs.KEY_START_LINE, 0)
|
|
946
963
|
end = row.get(cs.KEY_END_LINE, 0)
|
|
@@ -1028,6 +1045,7 @@ def dead_code(
|
|
|
1028
1045
|
decorator_root: list[str] = typer.Option(
|
|
1029
1046
|
[], "--decorator-root", help=ch.HELP_DEADCODE_DECORATOR_ROOT
|
|
1030
1047
|
),
|
|
1048
|
+
exclude: list[str] = typer.Option([], "--exclude", help=ch.HELP_DEADCODE_EXCLUDE),
|
|
1031
1049
|
include_tests: bool = typer.Option(
|
|
1032
1050
|
True,
|
|
1033
1051
|
"--include-tests/--no-include-tests",
|
|
@@ -1083,7 +1101,9 @@ def dead_code(
|
|
|
1083
1101
|
app_context.console.print(style(message, cs.Color.RED))
|
|
1084
1102
|
raise typer.Exit(1)
|
|
1085
1103
|
|
|
1086
|
-
candidates = [
|
|
1104
|
+
candidates = [
|
|
1105
|
+
_to_dead_code_row(row) for row in _filter_excluded_rows(rows, exclude)
|
|
1106
|
+
]
|
|
1087
1107
|
_emit_dead_code(candidates, output_format, output, resolved)
|
|
1088
1108
|
|
|
1089
1109
|
if fail_on_found and candidates:
|
|
@@ -191,6 +191,11 @@ HELP_DEADCODE_DECORATOR_ROOT = (
|
|
|
191
191
|
"Treat functions/methods carrying this decorator as reachable roots. "
|
|
192
192
|
"Extends the built-in set (route, task, fixture, command, ...). Repeatable."
|
|
193
193
|
)
|
|
194
|
+
HELP_DEADCODE_EXCLUDE = (
|
|
195
|
+
"Glob matched against a symbol's file path to exclude from the report "
|
|
196
|
+
"(e.g. '*client/core*', '*.gen.*' for generated code). '*' spans '/'. "
|
|
197
|
+
"Repeatable."
|
|
198
|
+
)
|
|
194
199
|
HELP_DEADCODE_INCLUDE_TESTS = (
|
|
195
200
|
"Treat test code as reachable roots so production code it exercises is "
|
|
196
201
|
"not reported. On by default."
|
|
@@ -360,13 +360,13 @@ class AppConfig(BaseSettings):
|
|
|
360
360
|
settings = AppConfig()
|
|
361
361
|
|
|
362
362
|
CGRIGNORE_FILENAME = ".cgrignore"
|
|
363
|
+
GITIGNORE_FILENAME = ".gitignore"
|
|
363
364
|
|
|
364
365
|
|
|
365
366
|
EMPTY_CGRIGNORE = CgrignorePatterns(exclude=frozenset(), unignore=frozenset())
|
|
366
367
|
|
|
367
368
|
|
|
368
|
-
def
|
|
369
|
-
ignore_file = repo_path / CGRIGNORE_FILENAME
|
|
369
|
+
def _load_ignore_file(ignore_file: Path) -> CgrignorePatterns:
|
|
370
370
|
if not ignore_file.is_file():
|
|
371
371
|
return EMPTY_CGRIGNORE
|
|
372
372
|
|
|
@@ -394,11 +394,37 @@ def load_cgrignore_patterns(repo_path: Path) -> CgrignorePatterns:
|
|
|
394
394
|
exclude=frozenset(exclude),
|
|
395
395
|
unignore=frozenset(unignore),
|
|
396
396
|
)
|
|
397
|
-
except OSError as e:
|
|
397
|
+
except (OSError, ValueError) as e:
|
|
398
398
|
logger.warning(logs.CGRIGNORE_READ_FAILED.format(path=ignore_file, error=e))
|
|
399
399
|
return EMPTY_CGRIGNORE
|
|
400
400
|
|
|
401
401
|
|
|
402
|
+
def load_cgrignore_patterns(repo_path: Path) -> CgrignorePatterns:
|
|
403
|
+
return _load_ignore_file(repo_path / CGRIGNORE_FILENAME)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def load_ignore_patterns(repo_path: Path) -> CgrignorePatterns:
|
|
407
|
+
# (H) Merged exclude/unignore set for indexing: root .gitignore (gitignored
|
|
408
|
+
# (H) paths are build artifacts / generated output whose symbols pollute the
|
|
409
|
+
# (H) graph and the dead-code report) plus .cgrignore, which stays the
|
|
410
|
+
# (H) authoritative cgr-specific channel. The runtime skip check gives
|
|
411
|
+
# (H) excludes precedence over unignores, so a negation can only override a
|
|
412
|
+
# (H) .gitignore exclude by CANCELLING the exact same pattern string here at
|
|
413
|
+
# (H) load time (`!generated/` drops `generated/`). .cgrignore excludes are
|
|
414
|
+
# (H) never cancelled by .gitignore negations.
|
|
415
|
+
# (H) ponytail: root .gitignore only, exact-string cancellation only; a
|
|
416
|
+
# (H) finer-grained negation (`!dist/keep.py` under excluded `dist/`) still
|
|
417
|
+
# (H) cannot rescue -- an ordered PathSpec soft layer in should_skip_path is
|
|
418
|
+
# (H) the upgrade path if real repos need it.
|
|
419
|
+
cgr = _load_ignore_file(repo_path / CGRIGNORE_FILENAME)
|
|
420
|
+
git = _load_ignore_file(repo_path / GITIGNORE_FILENAME)
|
|
421
|
+
negations = cgr.unignore | git.unignore
|
|
422
|
+
return CgrignorePatterns(
|
|
423
|
+
exclude=cgr.exclude | (git.exclude - negations),
|
|
424
|
+
unignore=negations,
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
|
|
402
428
|
CGR_INSTRUCTIONS_FILENAME = ".cgr.md"
|
|
403
429
|
GLOBAL_CGR_INSTRUCTIONS_PATH = Path.home() / CGR_INSTRUCTIONS_FILENAME
|
|
404
430
|
|