better-code-review-graph 3.26.26__tar.gz → 3.27.1__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.
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.claude-plugin/plugin.json +1 -1
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/workflows/ci.yml +1 -1
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/AGENTS.md +12 -14
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CHANGELOG.md +43 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CLAUDE.md +11 -36
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/PKG-INFO +12 -51
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/README.md +10 -48
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/005_temporal_columns.py +44 -1
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/pyproject.toml +9 -17
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/server.json +3 -3
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/cli.py +59 -17
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/config.py +33 -0
- better_code_review_graph-3.27.1/src/better_code_review_graph/credential_state.py +160 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/config.md +8 -5
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/embeddings.py +138 -174
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/server.py +87 -162
- better_code_review_graph-3.27.1/src/better_code_review_graph/summarizer.py +290 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/tools.py +6 -11
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/conftest.py +22 -27
- better_code_review_graph-3.27.1/tests/integration/test_multi_user_remote.py +72 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cohere_dimensions.py +49 -45
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_coverage_gaps.py +65 -54
- better_code_review_graph-3.27.1/tests/test_credential_state_dehosted.py +114 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_crg_protocol_harness.py +0 -1
- better_code_review_graph-3.27.1/tests/test_embedder_retry_classification.py +130 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embeddings.py +339 -159
- better_code_review_graph-3.27.1/tests/test_g6_ux_status_accuracy.py +120 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_oci_publication_sunset.py +15 -2
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_source_text.py +27 -7
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_server.py +7 -7
- better_code_review_graph-3.27.1/tests/test_setup_tool.py +197 -0
- better_code_review_graph-3.27.1/tests/test_summarizer.py +468 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_temporal_migration.py +57 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_v17_coverage_gaps.py +8 -7
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/uv.lock +16 -489
- better_code_review_graph-3.26.26/src/better_code_review_graph/credential_state.py +0 -363
- better_code_review_graph-3.26.26/src/better_code_review_graph/relay_schema.py +0 -133
- better_code_review_graph-3.26.26/src/better_code_review_graph/relay_setup.py +0 -150
- better_code_review_graph-3.26.26/src/better_code_review_graph/summarizer.py +0 -325
- better_code_review_graph-3.26.26/tests/e2e_mcp_protocol_test.py +0 -289
- better_code_review_graph-3.26.26/tests/integration/test_multi_user_remote.py +0 -43
- better_code_review_graph-3.26.26/tests/test_config_open_relay_registered.py +0 -66
- better_code_review_graph-3.26.26/tests/test_credential_state.py +0 -435
- better_code_review_graph-3.26.26/tests/test_credential_state_stdio_no_fallback.py +0 -210
- better_code_review_graph-3.26.26/tests/test_credential_state_store_errors.py +0 -164
- better_code_review_graph-3.26.26/tests/test_embedder_retry_classification.py +0 -139
- better_code_review_graph-3.26.26/tests/test_g6_ux_status_accuracy.py +0 -120
- better_code_review_graph-3.26.26/tests/test_home_isolation.py +0 -113
- better_code_review_graph-3.26.26/tests/test_multi_user.py +0 -181
- better_code_review_graph-3.26.26/tests/test_multi_user_dispatch.py +0 -513
- better_code_review_graph-3.26.26/tests/test_per_plugin_storage_migration.py +0 -38
- better_code_review_graph-3.26.26/tests/test_relay_schema.py +0 -56
- better_code_review_graph-3.26.26/tests/test_relay_setup.py +0 -365
- better_code_review_graph-3.26.26/tests/test_setup_tool.py +0 -312
- better_code_review_graph-3.26.26/tests/test_summarizer.py +0 -967
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/build-graph/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.coderabbit.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.dockerignore +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/CODEOWNERS +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/review-learnings.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/rulesets/main.json +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/workflows/cd.yml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.gitignore +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.infisical.json +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.jules/bolt.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.jules/sentinel.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.pre-commit-config.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/BREAKING_CHANGES.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CODE_OF_CONDUCT.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CONTRIBUTING.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/Dockerfile +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/LICENSE +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/LICENSE-MIT +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/NOTICE +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/SECURITY.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/alembic.ini +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/docs/HANDOVER.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/_graph_state.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/branch-sync-check.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/hooks.json +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/stale-graph-check.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/README +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/env.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/script.py.mako +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/001_baseline.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/002_summary_columns.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/003_federation.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/004_security_tags.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/006_commits_table.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/renovate.json +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-22-path-traversal.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-78-shell-command-sink.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-89-sql-string-format.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-95-eval-on-input.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/hardcoded-secret.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/semgrep/curated.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/benchmark_row_deserialization.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/enforce-commit.sh +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/preserve-diacritics.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/test_preserve_diacritics.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/semantic-release.toml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/impact-audit/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/onboard-repo/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/refactor-check/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/security-sweep/SKILL.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/smithery.yaml +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/__main__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/graph.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/query.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/recipes.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/review.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/security.md +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/exporter.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/federation.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/graph.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/importer.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/incremental.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/parser.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/py.typed +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/reranker.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/_types.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/fallback.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/go.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/java.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/python.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/rust.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/typescript.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/heuristic.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/semgrep_engine.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/temporal.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/xpia.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/conftest_e2e.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/Sample.cs +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/SampleJava.java +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/callback_refs.js +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/caller_example.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/multi_call_example.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.c +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.cpp +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.kt +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.php +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.rb +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.sol +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.swift +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_go.go +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_python.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_rust.rs +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_typescript.ts +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/test_sample.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/integration/__init__.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_alembic_baseline.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_as_of_diff.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_auto_resolve_ambiguity.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_bare_suffix_correctness.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_callers_not_found_reason.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_callers_of_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cli.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cli_contracts.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_commits_migration.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_custom_local_model.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_dynamic_dispatch_hints.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_e2e.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embedding_migration.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embeddings_extra.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_export_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_export_graph_dispatch_path_traversal.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_exporter.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation_migration.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation_smoke.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_full_live.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_get_docs_section_error_path.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_get_review_context_no_diff.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_batch_fetch.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_extra.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_get_edges_by_targets_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_stats_error_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_handle_not_found_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_help_recipes.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_heuristic.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_impact_payload_truncation.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_implements_edges.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_import_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_importer.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_incremental.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_incremental_extra.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_kind_filter_optimization.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_kinds_error_path.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_list_graph_stats_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_list_kinds_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_live_mcp.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_local_reranker.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_lookup_node_directly.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_multilang.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_no_stale_package_name.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_oserror_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_extra.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_grammar_failure.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_path_resolution_fallback.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_payload_estimation.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_per_sub_graph_db.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_performance_n1.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_performance_n1_embeddings.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_phase_3_smoke.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_plugin_assets.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_pre_2_0_backup.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_renamed_in_diff.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_renamed_in_diff_exception.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_filter.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_filter_batching.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_id_persistence.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolve_search_candidates.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_dispatcher.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_fallback.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_go.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_java.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_python.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_rust.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_typescript.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_response_header.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_response_payload_honesty.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_review_delta_line_shifts.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_review_languages_filter.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_reviewer_summary.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_search_edges_by_target_names.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_search_keyword_warning.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_injection.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_path_traversal.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_scan_batching.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_tags_migration.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_tool.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_semgrep_engine.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_server_help_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_serverinfo_version.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_shares_state_edges.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_spot_check.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_sql_security.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_stdio_direct.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_summarize_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_summary_schema.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_temporal.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tested_by_edges.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_build_error_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_full.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_get_docs_section_coverage.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_typescript_coverage_gaps.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_xpia.py +0 -0
- {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_xpia_adversarial.py +0 -0
{better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.claude-plugin/plugin.json
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-code-review-graph",
|
|
3
3
|
"description": "Knowledge graph for token-efficient code reviews -- semantic search and call-graph resolution across your codebase.",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.27.1",
|
|
5
5
|
"userConfig": {
|
|
6
6
|
"EMBEDDING_MODELS": {
|
|
7
7
|
"type": "string",
|
|
@@ -7,12 +7,12 @@ See `AGENTS.md` va `README.md` de hieu architecture va configuration.
|
|
|
7
7
|
## Cau truc
|
|
8
8
|
|
|
9
9
|
- `src/better_code_review_graph/` -- Package chinh (src layout)
|
|
10
|
-
- `server.py` -- FastMCP server,
|
|
10
|
+
- `server.py` -- FastMCP server, 6 tools: graph + query + review (3 main) + config + security + help
|
|
11
11
|
- `tools.py` -- MCP tool implementations (build, query, impact, review, search, embed, stats, docs, large functions)
|
|
12
12
|
- `parser.py` -- Tree-sitter parsing (14 langs) + call target resolution
|
|
13
13
|
- `graph.py` -- SQLite GraphStore, search, impact radius, NetworkX cache
|
|
14
14
|
- `incremental.py` -- Git integration, file watching, incremental updates
|
|
15
|
-
- `embeddings.py` -- Dual-mode embedding: local ONNX through the fastretrieval registry + cloud chain (`EMBEDDING_MODELS`) via
|
|
15
|
+
- `embeddings.py` -- Dual-mode embedding: local ONNX through the fastretrieval registry + cloud chain (`EMBEDDING_MODELS`) via OpenAI-compatible HTTP clients (`hull_core.providers`)
|
|
16
16
|
- `docs/` -- Help tool documentation (graph.md, query.md, review.md, config.md)
|
|
17
17
|
- `cli.py` -- local CLI: no args starts MCP stdio; positional subcommands expose graph/query/review/security over the same domain services
|
|
18
18
|
|
|
@@ -62,27 +62,26 @@ Source files --> Tree-sitter parser --> SQLite graph (nodes + edges)
|
|
|
62
62
|
|
|
|
63
63
|
Embedding store --> Semantic search
|
|
64
64
|
|
|
|
65
|
-
FastMCP server --> secondary MCP adapter (
|
|
65
|
+
FastMCP server --> secondary MCP adapter (6 tools: graph + query + review + config + security + help)
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
- **Parser** (parser.py): Tree-sitter extracts nodes (File, Class, Function, Type, Test) and edges (CALLS, IMPORTS_FROM, INHERITS, IMPLEMENTS, CONTAINS, TESTED_BY, DEPENDS_ON). Resolves same-file bare call targets to qualified names.
|
|
69
69
|
- **Graph** (graph.py): SQLite with WAL mode. Multi-word AND-logic search. GraphNode/GraphEdge dataclasses.
|
|
70
70
|
- **Incremental** (incremental.py): Git diff detection, file hash tracking, re-parses only changed files.
|
|
71
|
-
- **Embeddings** (embeddings.py): Dual-mode -- local ONNX through the fastretrieval registry (default, zero-config) or cloud via the `EMBEDDING_MODELS` chain (
|
|
71
|
+
- **Embeddings** (embeddings.py): Dual-mode -- local ONNX through the fastretrieval registry (default, zero-config) or cloud via the `EMBEDDING_MODELS` chain (OpenAI-compatible HTTP clients; order = fallback, empty = local). Fixed 768-dim storage.
|
|
72
72
|
- **Tools** (tools.py): Implementation layer for all graph operations. Output pagination via max_results.
|
|
73
|
-
- **Server** (server.py):
|
|
73
|
+
- **Server** (server.py): 6 tools — graph (build/update/stats/embed/export/summarize), query (query/search/impact/large_functions/spot_check/renamed_in_diff/diff), review, config, security, help. Returns structured dict payloads over MCP; the CLI serializes them as JSON.
|
|
74
74
|
|
|
75
75
|
## Embedding backends
|
|
76
76
|
|
|
77
|
-
Embedding (cloud backend) + the LLM summarizer
|
|
78
|
-
|
|
79
|
-
provider SDKs are imported directly.
|
|
77
|
+
Embedding (cloud backend) + the LLM summarizer dispatch through
|
|
78
|
+
OpenAI-compatible HTTP clients (`hull_core.providers.openai_spec`).
|
|
80
79
|
|
|
81
|
-
Per-task model chains, CSV `provider/model,provider/model`, order =
|
|
80
|
+
Per-task model chains, CSV `provider/model,provider/model`, order = fallback. Provider is inferred from the model prefix.
|
|
82
81
|
|
|
83
82
|
- `EMBEDDING_MODELS` -- chain embedding. Empty = local ONNX from the fastretrieval built-in registry.
|
|
84
83
|
- **Local (default)**: fastretrieval ONNX registry -- zero-config, ~570MB download on first use, 768-dim MRL truncation
|
|
85
|
-
- API key follows the
|
|
84
|
+
- API key follows the `<PROVIDER>_API_KEY` convention. The 7 providers documented below:
|
|
86
85
|
|
|
87
86
|
| model prefix | key env var | get it at |
|
|
88
87
|
|---|---|---|
|
|
@@ -94,7 +93,6 @@ Per-task model chains, CSV `provider/model,provider/model`, order = litellm fall
|
|
|
94
93
|
| `anthropic/` | `ANTHROPIC_API_KEY` | console.anthropic.com |
|
|
95
94
|
| `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview |
|
|
96
95
|
|
|
97
|
-
For any other litellm provider (used via env passthrough), see https://docs.litellm.ai/docs/providers/<provider> for its `<PROVIDER>_API_KEY` name.
|
|
98
96
|
- Custom endpoint (SSRF-guarded): `EMBEDDING_API_BASE` -- custom OpenAI-compatible base URL for cloud embedding (optional)
|
|
99
97
|
- `DISABLE_LOCAL_EMBED` -- skip the local ONNX download; embedding is `unavailable` unless a cloud chain is configured (`resolve_backend` 3-way: cloud / local / unavailable)
|
|
100
98
|
- Fixed 768-dim storage keeps the table schema valid across providers. Switching embedding MODEL changes the vector space; embeddings are tagged per provider (`embeddings.provider` column) and `EmbeddingStore.search` restricts the cosine scan to the active provider, so a provider switch just re-embeds rather than mixing incomparable vectors.
|
|
@@ -132,8 +130,8 @@ chối, không tự rơi về model mặc định.
|
|
|
132
130
|
|
|
133
131
|
## LLM summarizer (graph `summarize` action)
|
|
134
132
|
|
|
135
|
-
- `SUMMARY_MODELS` -- ordered summarizer model chain (CSV `provider/model,...`, order =
|
|
136
|
-
- Dispatches through `
|
|
133
|
+
- `SUMMARY_MODELS` -- ordered summarizer model chain (CSV `provider/model,...`, order = fallback). Empty = summaries disabled. Provider is inferred from the model prefix and must expose a chat-completion API (Jina/Cohere do not).
|
|
134
|
+
- Dispatches through OpenAI-compatible chat completions (`hull_core.providers.openai_spec`).
|
|
137
135
|
- `LLM_API_BASE` -- custom OpenAI-compatible base URL for the summarizer (SSRF-guarded, optional)
|
|
138
136
|
- Deprecated (honored one release with a warning): singular `SUMMARY_MODEL` -- folded into `SUMMARY_MODELS`.
|
|
139
137
|
|
|
@@ -160,7 +158,7 @@ chối, không tự rơi về model mặc định.
|
|
|
160
158
|
|
|
161
159
|
## Luu y quan trong
|
|
162
160
|
|
|
163
|
-
- Lazy imports cho heavy deps (tree-sitter, fastretrieval,
|
|
161
|
+
- Lazy imports cho heavy deps (tree-sitter, fastretrieval, hull_core cloud clients, numpy) -- tranh startup cost
|
|
164
162
|
- MCP tools return structured error payloads (`{"error": ...}`) and close local resources on every path.
|
|
165
163
|
- GraphStore.upsert_edge takes EdgeInfo (fields: source, target), GraphEdge uses source_qualified/target_qualified
|
|
166
164
|
- `_make_qualified()` builds qualified names as `file_path::name` or `file_path::parent.name`
|
|
@@ -2,6 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v3.27.1 (2026-09-26)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **ci**: Keep uv sources for git-pinned hull-core
|
|
10
|
+
([`0f8eec1`](https://github.com/n24q02m/crg/commit/0f8eec1ceddf33c93e40d299d750a2b8fd7eb3ae))
|
|
11
|
+
|
|
12
|
+
### Chores
|
|
13
|
+
|
|
14
|
+
- Re-pin hull-core for chat null-content fallback
|
|
15
|
+
([`d2d890f`](https://github.com/n24q02m/crg/commit/d2d890f9d32362c2282e651f8a00f2bbab985ef1))
|
|
16
|
+
|
|
17
|
+
- Scrub WP2 residuals (dead e2e script, open_relay string, doc sweep)
|
|
18
|
+
([`debd924`](https://github.com/n24q02m/crg/commit/debd9247ec886cbe9322e0618ea475f83aecf6ac))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## v3.27.0 (2026-09-26)
|
|
22
|
+
|
|
23
|
+
### Bug Fixes
|
|
24
|
+
|
|
25
|
+
- **migrations**: 005 skip git guard for per-subject data-dir stores
|
|
26
|
+
([`5944956`](https://github.com/n24q02m/crg/commit/5944956259acd70ce76d02dd160587dbb9fa832c))
|
|
27
|
+
|
|
28
|
+
- **server**: Drop dead _maybe_include_setup_hint hook (BYOK cut residual)
|
|
29
|
+
([`87c9ce4`](https://github.com/n24q02m/crg/commit/87c9ce454501aaa2ec39373f3731739ae7247054))
|
|
30
|
+
|
|
31
|
+
- **server,tools**: Remove deleted-member imports on search/setup/http paths
|
|
32
|
+
([`edc7b5f`](https://github.com/n24q02m/crg/commit/edc7b5f24d61bd1cf8eec1089396e269750694ab))
|
|
33
|
+
|
|
34
|
+
- **wp2**: Drop mcp-core entirely; port residual tests to hull seams
|
|
35
|
+
([`91b1ddb`](https://github.com/n24q02m/crg/commit/91b1ddb20ca4957ef32bbf40b478c01a8419a5a7))
|
|
36
|
+
|
|
37
|
+
### Features
|
|
38
|
+
|
|
39
|
+
- **wp2**: De-host onto hull-core — auth scoping, model cells, config bridge
|
|
40
|
+
([`0683c62`](https://github.com/n24q02m/crg/commit/0683c62d88fbaf11aa8666a3adcf21cd357c9a63))
|
|
41
|
+
|
|
42
|
+
### Testing
|
|
43
|
+
|
|
44
|
+
- Port suite to the post-de-host surface (hull cells, no litellm/relay)
|
|
45
|
+
([`fd7795d`](https://github.com/n24q02m/crg/commit/fd7795da0f3ac268430e5d22cbef4756a2120f0d))
|
|
46
|
+
|
|
47
|
+
|
|
5
48
|
## v3.26.26 (2026-09-25)
|
|
6
49
|
|
|
7
50
|
### Bug Fixes
|
|
@@ -7,14 +7,12 @@ See `AGENTS.md` va `README.md` de hieu architecture va configuration.
|
|
|
7
7
|
## Cau truc
|
|
8
8
|
|
|
9
9
|
- `src/better_code_review_graph/` -- Package chinh (src layout)
|
|
10
|
-
- `server.py` -- FastMCP server,
|
|
10
|
+
- `server.py` -- FastMCP server, 6 tools: graph + query + review (3 main) + config (incl. setup_*) + security + help
|
|
11
11
|
- `tools.py` -- MCP tool implementations (build, query, impact, review, search, embed, stats, docs, large functions)
|
|
12
12
|
- `parser.py` -- Tree-sitter parsing (14 langs) + call target resolution
|
|
13
13
|
- `graph.py` -- SQLite GraphStore, search, impact radius, NetworkX cache
|
|
14
14
|
- `incremental.py` -- Git integration, file watching, incremental updates
|
|
15
|
-
- `embeddings.py` -- Dual-mode embedding: local ONNX through the fastretrieval registry + cloud chain (`EMBEDDING_MODELS`) via
|
|
16
|
-
- `relay_setup.py` -- `apply_config` env-applier used by the OAuth setup form (live setup UX = OAuth-AS browser form at `<PUBLIC_URL>/authorize`; the `ensure_config` create-session/poll path is legacy/unused)
|
|
17
|
-
- `relay_schema.py` -- Relay form schema (embedding provider fields)
|
|
15
|
+
- `embeddings.py` -- Dual-mode embedding: local ONNX through the fastretrieval registry + cloud chain (`EMBEDDING_MODELS`) via OpenAI-compatible HTTP clients (`hull_core.providers`)
|
|
18
16
|
- `docs/` -- Help tool documentation (graph.md, query.md, review.md, config.md, recipes.md, security.md)
|
|
19
17
|
- `cli.py` -- local CLI: no args starts MCP stdio; positional subcommands expose graph/query/review/security over the same domain services
|
|
20
18
|
- `__init__.py` -- Version export
|
|
@@ -62,27 +60,26 @@ Source files --> Tree-sitter parser --> SQLite graph (nodes + edges)
|
|
|
62
60
|
NetworkX BFS --> Impact radius
|
|
63
61
|
|
|
|
64
62
|
Embedding store --> Semantic search
|
|
65
|
-
FastMCP server --> secondary MCP adapter (
|
|
63
|
+
FastMCP server --> secondary MCP adapter (6 tools: graph + query + review + config + security + help)
|
|
66
64
|
```
|
|
67
65
|
|
|
68
66
|
- **Parser** (parser.py): Tree-sitter extracts nodes (File, Class, Function, Type, Test) and edges (CALLS, IMPORTS_FROM, INHERITS, IMPLEMENTS, CONTAINS, TESTED_BY, DEPENDS_ON). Resolves same-file bare call targets to qualified names.
|
|
69
67
|
- **Graph** (graph.py): SQLite with WAL mode. Multi-word AND-logic search. GraphNode/GraphEdge dataclasses.
|
|
70
68
|
- **Incremental** (incremental.py): Git diff detection, file hash tracking, re-parses only changed files.
|
|
71
|
-
- **Embeddings** (embeddings.py): Dual-mode -- local ONNX through the fastretrieval registry (default, zero-config) or cloud via the `EMBEDDING_MODELS` chain (
|
|
72
|
-
- **Server** (server.py):
|
|
69
|
+
- **Embeddings** (embeddings.py): Dual-mode -- local ONNX through the fastretrieval registry (default, zero-config) or cloud via the `EMBEDDING_MODELS` chain (OpenAI-compatible HTTP clients; order = fallback, empty = local). Fixed 768-dim storage.
|
|
70
|
+
- **Server** (server.py): 6 tools — graph (build/update/stats/embed/export/summarize), query (query/search/impact/large_functions/spot_check/renamed_in_diff/diff), review, config (status/set/cache_clear + setup_status/setup_start/setup_skip/setup_reset/setup_complete), security (scan/report/suppress/rule_list), help. Returns structured dict payloads over MCP; the CLI serializes them as JSON.
|
|
73
71
|
|
|
74
72
|
## Embedding + LLM backends
|
|
75
73
|
|
|
76
|
-
Embedding (cloud backend) + the LLM summarizer dispatch through
|
|
77
|
-
|
|
78
|
-
imported directly.
|
|
74
|
+
Embedding (cloud backend) + the LLM summarizer dispatch through
|
|
75
|
+
OpenAI-compatible HTTP clients (`hull_core.providers.openai_spec`).
|
|
79
76
|
|
|
80
|
-
Per-task model chains, CSV `provider/model,provider/model`, order =
|
|
77
|
+
Per-task model chains, CSV `provider/model,provider/model`, order = fallback. Provider is inferred from the model prefix.
|
|
81
78
|
|
|
82
79
|
- `EMBEDDING_MODELS` -- chain embedding. Empty = local ONNX from the fastretrieval built-in registry.
|
|
83
80
|
- `SUMMARY_MODELS` -- chain summarizer (graph `summarize` action). Empty = summaries disabled.
|
|
84
81
|
- **Local (default)**: fastretrieval ONNX registry -- zero-config, ~570MB download on first use, 768-dim MRL truncation
|
|
85
|
-
- API key theo convention
|
|
82
|
+
- API key theo convention `<PROVIDER>_API_KEY`. 7 provider servers goi y:
|
|
86
83
|
|
|
87
84
|
| model prefix | key env var | get it at |
|
|
88
85
|
|---|---|---|
|
|
@@ -94,7 +91,7 @@ Per-task model chains, CSV `provider/model,provider/model`, order = litellm fall
|
|
|
94
91
|
| `anthropic/` | `ANTHROPIC_API_KEY` | console.anthropic.com |
|
|
95
92
|
| `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview |
|
|
96
93
|
|
|
97
|
-
|
|
94
|
+
Summarizer providers must expose a chat-completion API (Jina/Cohere do not).
|
|
98
95
|
- Custom endpoint (SSRF-guarded): `EMBEDDING_API_BASE` (embedding), `LLM_API_BASE` (summarizer)
|
|
99
96
|
- `DISABLE_LOCAL_EMBED` -- skip local ONNX download; `resolve_backend` returns `unavailable` (not local) when no cloud chain is configured
|
|
100
97
|
- Fixed 768-dim storage keeps the table schema valid across providers. Switching embedding MODEL changes the vector space; embeddings are tagged per provider and the cosine search restricts to the active provider, so a provider switch re-embeds rather than mixing incomparable vectors.
|
|
@@ -159,30 +156,8 @@ chối, không tự rơi về model mặc định.
|
|
|
159
156
|
|
|
160
157
|
## Luu y quan trong
|
|
161
158
|
|
|
162
|
-
- Lazy imports cho heavy deps (tree-sitter, fastretrieval,
|
|
159
|
+
- Lazy imports cho heavy deps (tree-sitter, fastretrieval, hull_core cloud clients, numpy) -- tranh startup cost
|
|
163
160
|
- MCP tools return structured error payloads (`{"error": ...}`) and close local resources on every path.
|
|
164
161
|
- GraphStore.upsert_edge takes EdgeInfo (fields: source, target), GraphEdge uses source_qualified/target_qualified
|
|
165
162
|
- `_make_qualified()` builds qualified names as `file_path::name` or `file_path::parent.name`
|
|
166
163
|
- Supported languages: Python, TypeScript, JavaScript, Go, Rust, Java, C#, Ruby, Kotlin, Swift, PHP, C/C++, Solidity
|
|
167
|
-
|
|
168
|
-
## E2E
|
|
169
|
-
|
|
170
|
-
Driven by `mcp-core/scripts/e2e/` (matrix-locked, 15 configs). Run a single config from this repo via `make e2e` (proxy) or directly:
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
cd ../mcp-core && uv run --project scripts/e2e python -m e2e.driver <config-id>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
Configs for this repo: `crg`.
|
|
177
|
-
|
|
178
|
-
t2-non-interaction: paste optional cloud LLM keys (Jina/Gemini/OpenAI/Cohere).
|
|
179
|
-
|
|
180
|
-
Tier policy:
|
|
181
|
-
|
|
182
|
-
- **T0** (precommit + CI on PR / main push) - runs without upstream identity. Skret keys not required.
|
|
183
|
-
- **T2 non-interaction** (`make e2e-config CONFIG=<id>` locally) - driver pre-fills relay form from skret AWS SSM `/better-code-review-graph/prod` (`ap-southeast-1`). No user gate.
|
|
184
|
-
- **T2 interaction** - driver fills relay form, then prints upstream user-gate URL; user signs in / types OTP at provider. Driver enforces per-flow timeouts (device-code 900s, oauth-redirect 300s, browser-form 600s) and emits `[poll] elapsed=Xs remaining=Ys status=<body>` every 30s. On timeout, container logs + last `setup-status` are saved to `<tmp>/e2e-diag/` BEFORE teardown for post-mortem.
|
|
185
|
-
|
|
186
|
-
Multi-user remote mode (deployment property; not a separate config) requires `MCP_DCR_SERVER_SECRET` in the same skret namespace - driver refuses to start the container without it when `PUBLIC_URL` is set.
|
|
187
|
-
|
|
188
|
-
References: `mcp-core/scripts/e2e/matrix.yaml`, `~/.claude/skills/mcp-dev/references/e2e-full-matrix.md` (harness-readiness gate), `~/.claude/skills/mcp-dev/references/secrets-skret.md` (per-server credential layout), `~/.claude/skills/mcp-dev/references/multi-user-pattern.md` (per-JWT-sub isolation).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: better-code-review-graph
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.27.1
|
|
4
4
|
Summary: Token-efficient code review knowledge graph: semantic search and call-graph resolution.
|
|
5
5
|
Author: n24q02m
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -18,9 +18,8 @@ Requires-Dist: defusedxml>=0.7.1
|
|
|
18
18
|
Requires-Dist: fastmcp<4,>=3.4.7
|
|
19
19
|
Requires-Dist: fastretrieval<2,>=1.8.2
|
|
20
20
|
Requires-Dist: httpx
|
|
21
|
-
Requires-Dist:
|
|
21
|
+
Requires-Dist: hull-core
|
|
22
22
|
Requires-Dist: mcp<2,>=1.30.0
|
|
23
|
-
Requires-Dist: n24q02m-mcp-core[llm]==1.24.6
|
|
24
23
|
Requires-Dist: networkx<4,>=3.7
|
|
25
24
|
Requires-Dist: pydantic-settings
|
|
26
25
|
Requires-Dist: pygments>=2.21.0
|
|
@@ -244,9 +243,6 @@ another provider. Summarizers require a chat-completion model.
|
|
|
244
243
|
| `openrouter/` | `OPENROUTER_API_KEY` | <https://openrouter.ai/settings/keys> |
|
|
245
244
|
| `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | <https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview> |
|
|
246
245
|
|
|
247
|
-
Any other [litellm provider](https://docs.litellm.ai/docs/providers) works via
|
|
248
|
-
its standard `<PROVIDER>_API_KEY`.
|
|
249
|
-
|
|
250
246
|
### Advanced
|
|
251
247
|
|
|
252
248
|
| Variable | Purpose |
|
|
@@ -297,39 +293,15 @@ not invoke the reranker.
|
|
|
297
293
|
|
|
298
294
|
Cohere embedding is paid. Authorize a bounded budget before a live index/query;
|
|
299
295
|
the Minimax-free completion choice does not make embeddings free. This example
|
|
300
|
-
does not add a process-wide model override:
|
|
301
|
-
|
|
302
|
-
credentials fail closed rather than inheriting the server environment.
|
|
296
|
+
does not add a process-wide model override: missing subject credentials fail
|
|
297
|
+
closed rather than inheriting the server environment.
|
|
303
298
|
|
|
304
299
|
CRG currently has **no cloud rerank call**: `LOCAL_RERANK_MODEL` is its only
|
|
305
300
|
reranking path. Setting `RERANK_MODELS` or `RERANK_API_BASE` does not enable one.
|
|
306
301
|
|
|
307
|
-
You can also configure cloud keys interactively in HTTP mode via the relay
|
|
308
|
-
setup form (`config(action="setup_start")` returns the browser URL). See the
|
|
309
|
-
[modes overview](https://mcp.n24q02m.com/get-started/modes-overview/) and
|
|
310
|
-
[multi-user setup](https://mcp.n24q02m.com/get-started/multi-user/).
|
|
311
|
-
|
|
312
|
-
### Workspace username (HTTP setup form)
|
|
313
|
-
|
|
314
|
-
The relay setup form has an optional **workspace username** field. Entering the
|
|
315
|
-
same username always lands you in the same per-`sub` bucket, so your keys and
|
|
316
|
-
graph stay reachable across a re-authorization and across devices, instead of
|
|
317
|
-
being tied to the one-off subject minted for each `/authorize` round-trip.
|
|
318
|
-
Leaving it blank keeps the previous per-authorize behaviour.
|
|
319
|
-
|
|
320
|
-
Trust boundary: when the form is gated by a *shared* `MCP_RELAY_PASSWORD`, the
|
|
321
|
-
username is a partition key, not a secret -- anyone who knows that password can
|
|
322
|
-
type any username and reach that bucket. That is fine for a trusted group; an
|
|
323
|
-
untrusted multi-tenant deployment needs a per-user secret or delegated OAuth
|
|
324
|
-
instead.
|
|
325
|
-
|
|
326
|
-
**One-time migration:** existing users must re-enter their credentials once after
|
|
327
|
-
this change. Nothing is deleted; credentials stored under the old random subject
|
|
328
|
-
are simply no longer addressed.
|
|
329
|
-
|
|
330
302
|
## Tools
|
|
331
303
|
|
|
332
|
-
|
|
304
|
+
Six tools, each grouping related actions to keep the tool surface small.
|
|
333
305
|
|
|
334
306
|
### `graph` -- Graph lifecycle
|
|
335
307
|
|
|
@@ -379,11 +351,11 @@ Actions: `status` | `set` | `cache_clear` | `setup_status` | `setup_start` | `se
|
|
|
379
351
|
| `status` | Server info: version, graph path, node/edge counts, embedding backend, embeddings count. |
|
|
380
352
|
| `set` | Update a runtime setting (`key=log_level`). |
|
|
381
353
|
| `cache_clear` | Remove all computed embeddings. |
|
|
382
|
-
| `setup_status` | Show current credential state
|
|
383
|
-
| `setup_start` |
|
|
384
|
-
| `setup_skip` | Set local mode (
|
|
385
|
-
| `setup_reset` |
|
|
386
|
-
| `setup_complete` | Re-resolve
|
|
354
|
+
| `setup_status` | Show current credential state and which model cells have keys. |
|
|
355
|
+
| `setup_start` | Explain where the host configures API keys (host-owned model cells). |
|
|
356
|
+
| `setup_skip` | Set local mode (local ONNX embedding, no cloud cells). |
|
|
357
|
+
| `setup_reset` | Reset state to local; host config re-resolves on next call. |
|
|
358
|
+
| `setup_complete` | Re-resolve credential state from host config. |
|
|
387
359
|
|
|
388
360
|
### `security` -- Security scanning
|
|
389
361
|
|
|
@@ -406,13 +378,6 @@ Topics: `graph` | `query` | `review` | `config` | `security` | `recipes`
|
|
|
406
378
|
Returns complete documentation for each tool. Use when the compressed
|
|
407
379
|
descriptions above are insufficient.
|
|
408
380
|
|
|
409
|
-
### `config__open_relay` -- Re-trigger the relay setup form
|
|
410
|
-
|
|
411
|
-
Registered automatically from [mcp-core](https://github.com/n24q02m/mcp-core).
|
|
412
|
-
In HTTP mode it returns `<PUBLIC_URL>/authorize` so the agent can re-open the
|
|
413
|
-
browser setup form (e.g. after credential expiry); in stdio mode it returns
|
|
414
|
-
`status: 'stdio_unsupported'`.
|
|
415
|
-
|
|
416
381
|
## CLI
|
|
417
382
|
|
|
418
383
|
The package installs two console scripts: **`crg`** (primary) and
|
|
@@ -452,12 +417,8 @@ crg security scan --engine heuristic
|
|
|
452
417
|
| `query spot_check` / `query renamed_in_diff` / `query diff` | Inspect callsites, line shifts, or commit-to-commit graph changes. |
|
|
453
418
|
| `review context` / `review delta` | Generate review context or diff buckets for a code change. |
|
|
454
419
|
| `security scan` / `security report` / `security suppress` / `security rule_list` | Run and manage heuristic/Semgrep security findings. |
|
|
455
|
-
| `config status` / `config delete` | Show or remove stored credential config (`--yes` skips confirmation). |
|
|
456
|
-
| `doctor` | Environment self-check from shared `mcp-core` CLI. |
|
|
457
|
-
| `relay status` / `relay open` / `relay reset` | Inspect, open, or clear the relay setup session. |
|
|
458
420
|
|
|
459
|
-
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
460
|
-
`config`, `doctor`, and `relay` subcommands come from shared `mcp-core`.
|
|
421
|
+
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
461
422
|
|
|
462
423
|
|
|
463
424
|
## Features
|
|
@@ -470,7 +431,7 @@ What this fork fixes versus the upstream [code-review-graph](https://github.com/
|
|
|
470
431
|
| callers_of/callees_of | Empty results (bare name targets) | Qualified name resolution + bare fallback |
|
|
471
432
|
| Embedding | sentence-transformers + torch (1.1 GB) | fastretrieval ONNX + cloud (200 MB), dual-mode |
|
|
472
433
|
| Output size | Unbounded (500K+ chars) | Paginated (max_results, truncated flag) |
|
|
473
|
-
| Tool design | 9 individual tools |
|
|
434
|
+
| Tool design | 9 individual tools | 6 grouped tools: graph + query + review + config + security + help |
|
|
474
435
|
| Plugin hooks | Invalid PostEdit/PostGit | Valid PostToolUse |
|
|
475
436
|
|
|
476
437
|
## Comparison
|
|
@@ -211,9 +211,6 @@ another provider. Summarizers require a chat-completion model.
|
|
|
211
211
|
| `openrouter/` | `OPENROUTER_API_KEY` | <https://openrouter.ai/settings/keys> |
|
|
212
212
|
| `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | <https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview> |
|
|
213
213
|
|
|
214
|
-
Any other [litellm provider](https://docs.litellm.ai/docs/providers) works via
|
|
215
|
-
its standard `<PROVIDER>_API_KEY`.
|
|
216
|
-
|
|
217
214
|
### Advanced
|
|
218
215
|
|
|
219
216
|
| Variable | Purpose |
|
|
@@ -264,39 +261,15 @@ not invoke the reranker.
|
|
|
264
261
|
|
|
265
262
|
Cohere embedding is paid. Authorize a bounded budget before a live index/query;
|
|
266
263
|
the Minimax-free completion choice does not make embeddings free. This example
|
|
267
|
-
does not add a process-wide model override:
|
|
268
|
-
|
|
269
|
-
credentials fail closed rather than inheriting the server environment.
|
|
264
|
+
does not add a process-wide model override: missing subject credentials fail
|
|
265
|
+
closed rather than inheriting the server environment.
|
|
270
266
|
|
|
271
267
|
CRG currently has **no cloud rerank call**: `LOCAL_RERANK_MODEL` is its only
|
|
272
268
|
reranking path. Setting `RERANK_MODELS` or `RERANK_API_BASE` does not enable one.
|
|
273
269
|
|
|
274
|
-
You can also configure cloud keys interactively in HTTP mode via the relay
|
|
275
|
-
setup form (`config(action="setup_start")` returns the browser URL). See the
|
|
276
|
-
[modes overview](https://mcp.n24q02m.com/get-started/modes-overview/) and
|
|
277
|
-
[multi-user setup](https://mcp.n24q02m.com/get-started/multi-user/).
|
|
278
|
-
|
|
279
|
-
### Workspace username (HTTP setup form)
|
|
280
|
-
|
|
281
|
-
The relay setup form has an optional **workspace username** field. Entering the
|
|
282
|
-
same username always lands you in the same per-`sub` bucket, so your keys and
|
|
283
|
-
graph stay reachable across a re-authorization and across devices, instead of
|
|
284
|
-
being tied to the one-off subject minted for each `/authorize` round-trip.
|
|
285
|
-
Leaving it blank keeps the previous per-authorize behaviour.
|
|
286
|
-
|
|
287
|
-
Trust boundary: when the form is gated by a *shared* `MCP_RELAY_PASSWORD`, the
|
|
288
|
-
username is a partition key, not a secret -- anyone who knows that password can
|
|
289
|
-
type any username and reach that bucket. That is fine for a trusted group; an
|
|
290
|
-
untrusted multi-tenant deployment needs a per-user secret or delegated OAuth
|
|
291
|
-
instead.
|
|
292
|
-
|
|
293
|
-
**One-time migration:** existing users must re-enter their credentials once after
|
|
294
|
-
this change. Nothing is deleted; credentials stored under the old random subject
|
|
295
|
-
are simply no longer addressed.
|
|
296
|
-
|
|
297
270
|
## Tools
|
|
298
271
|
|
|
299
|
-
|
|
272
|
+
Six tools, each grouping related actions to keep the tool surface small.
|
|
300
273
|
|
|
301
274
|
### `graph` -- Graph lifecycle
|
|
302
275
|
|
|
@@ -346,11 +319,11 @@ Actions: `status` | `set` | `cache_clear` | `setup_status` | `setup_start` | `se
|
|
|
346
319
|
| `status` | Server info: version, graph path, node/edge counts, embedding backend, embeddings count. |
|
|
347
320
|
| `set` | Update a runtime setting (`key=log_level`). |
|
|
348
321
|
| `cache_clear` | Remove all computed embeddings. |
|
|
349
|
-
| `setup_status` | Show current credential state
|
|
350
|
-
| `setup_start` |
|
|
351
|
-
| `setup_skip` | Set local mode (
|
|
352
|
-
| `setup_reset` |
|
|
353
|
-
| `setup_complete` | Re-resolve
|
|
322
|
+
| `setup_status` | Show current credential state and which model cells have keys. |
|
|
323
|
+
| `setup_start` | Explain where the host configures API keys (host-owned model cells). |
|
|
324
|
+
| `setup_skip` | Set local mode (local ONNX embedding, no cloud cells). |
|
|
325
|
+
| `setup_reset` | Reset state to local; host config re-resolves on next call. |
|
|
326
|
+
| `setup_complete` | Re-resolve credential state from host config. |
|
|
354
327
|
|
|
355
328
|
### `security` -- Security scanning
|
|
356
329
|
|
|
@@ -373,13 +346,6 @@ Topics: `graph` | `query` | `review` | `config` | `security` | `recipes`
|
|
|
373
346
|
Returns complete documentation for each tool. Use when the compressed
|
|
374
347
|
descriptions above are insufficient.
|
|
375
348
|
|
|
376
|
-
### `config__open_relay` -- Re-trigger the relay setup form
|
|
377
|
-
|
|
378
|
-
Registered automatically from [mcp-core](https://github.com/n24q02m/mcp-core).
|
|
379
|
-
In HTTP mode it returns `<PUBLIC_URL>/authorize` so the agent can re-open the
|
|
380
|
-
browser setup form (e.g. after credential expiry); in stdio mode it returns
|
|
381
|
-
`status: 'stdio_unsupported'`.
|
|
382
|
-
|
|
383
349
|
## CLI
|
|
384
350
|
|
|
385
351
|
The package installs two console scripts: **`crg`** (primary) and
|
|
@@ -419,12 +385,8 @@ crg security scan --engine heuristic
|
|
|
419
385
|
| `query spot_check` / `query renamed_in_diff` / `query diff` | Inspect callsites, line shifts, or commit-to-commit graph changes. |
|
|
420
386
|
| `review context` / `review delta` | Generate review context or diff buckets for a code change. |
|
|
421
387
|
| `security scan` / `security report` / `security suppress` / `security rule_list` | Run and manage heuristic/Semgrep security findings. |
|
|
422
|
-
| `config status` / `config delete` | Show or remove stored credential config (`--yes` skips confirmation). |
|
|
423
|
-
| `doctor` | Environment self-check from shared `mcp-core` CLI. |
|
|
424
|
-
| `relay status` / `relay open` / `relay reset` | Inspect, open, or clear the relay setup session. |
|
|
425
388
|
|
|
426
|
-
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
427
|
-
`config`, `doctor`, and `relay` subcommands come from shared `mcp-core`.
|
|
389
|
+
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
428
390
|
|
|
429
391
|
|
|
430
392
|
## Features
|
|
@@ -437,7 +399,7 @@ What this fork fixes versus the upstream [code-review-graph](https://github.com/
|
|
|
437
399
|
| callers_of/callees_of | Empty results (bare name targets) | Qualified name resolution + bare fallback |
|
|
438
400
|
| Embedding | sentence-transformers + torch (1.1 GB) | fastretrieval ONNX + cloud (200 MB), dual-mode |
|
|
439
401
|
| Output size | Unbounded (500K+ chars) | Paginated (max_results, truncated flag) |
|
|
440
|
-
| Tool design | 9 individual tools |
|
|
402
|
+
| Tool design | 9 individual tools | 6 grouped tools: graph + query + review + config + security + help |
|
|
441
403
|
| Plugin hooks | Invalid PostEdit/PostGit | Valid PostToolUse |
|
|
442
404
|
|
|
443
405
|
## Comparison
|
|
@@ -118,6 +118,15 @@ _SHA_RE = re.compile(r"^[0-9a-f]{40}$|^[0-9a-f]{64}$")
|
|
|
118
118
|
# git-init its own tmp dir, which conflicts with tests that
|
|
119
119
|
# construct ``tmp_path / ".git"`` themselves.
|
|
120
120
|
#
|
|
121
|
+
# 3. The DB is a per-subject store under the crg data directory
|
|
122
|
+
# (``<CRG_DATA_DIR>/subs/<sub>/graph.db``, ``~/.crg`` default).
|
|
123
|
+
# Multi-user (hull mode-3) deployments scope each namespace's
|
|
124
|
+
# graph to its own data-directory DB precisely so it does NOT
|
|
125
|
+
# live inside any analyzed repo — there is no single HEAD to
|
|
126
|
+
# backfill with, so the sentinel is the correct value. Repo
|
|
127
|
+
# stores (``<repo>/.better-code-review-graph/graph.db``) still
|
|
128
|
+
# require git.
|
|
129
|
+
#
|
|
121
130
|
# Production code paths leave ``CRG_TEST_ALLOW_NO_GIT`` unset, so the
|
|
122
131
|
# migration still aborts with the actionable :class:`RuntimeError`
|
|
123
132
|
# whenever a file-backed DB has no reachable repo — production data
|
|
@@ -152,6 +161,35 @@ def _extract_db_path_from_url(url: str) -> Path | None:
|
|
|
152
161
|
return Path(raw).resolve()
|
|
153
162
|
|
|
154
163
|
|
|
164
|
+
def _data_dir_subs_base() -> Path:
|
|
165
|
+
"""Return the resolved ``subs`` root of the crg data directory.
|
|
166
|
+
|
|
167
|
+
Mirrors ``credential_state._sub_data_dir``: ``$CRG_DATA_DIR`` when
|
|
168
|
+
set, otherwise ``~/.crg``. Per-subject stores (multi-user HTTP
|
|
169
|
+
mode) live at ``<base>/subs/<sub>/graph.db`` under this root.
|
|
170
|
+
"""
|
|
171
|
+
base = Path(os.environ.get("CRG_DATA_DIR", str(Path.home() / ".crg")))
|
|
172
|
+
return (base / "subs").resolve()
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _is_data_dir_store(db_path: Path) -> bool:
|
|
176
|
+
"""True iff ``db_path`` is a per-subject store under the crg data dir.
|
|
177
|
+
|
|
178
|
+
Multi-user (hull mode-3) deployments scope each namespace's graph to
|
|
179
|
+
``<CRG_DATA_DIR>/subs/<sub>/graph.db`` — a data-directory DB that
|
|
180
|
+
intentionally does NOT live inside any analyzed repo (the analyzed
|
|
181
|
+
repo directory is not a safe shared location for a per-tenant DB).
|
|
182
|
+
Such a store has no single HEAD to backfill ``valid_from_sha``
|
|
183
|
+
with, so the 40-zero sentinel applies. Repo stores
|
|
184
|
+
(``<repo>/.better-code-review-graph/graph.db``) keep the hard git
|
|
185
|
+
requirement enforced by :func:`_find_repo_root`.
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
return db_path.resolve().is_relative_to(_data_dir_subs_base())
|
|
189
|
+
except (OSError, ValueError):
|
|
190
|
+
return False
|
|
191
|
+
|
|
192
|
+
|
|
155
193
|
def _find_repo_root(db_path: Path) -> Path:
|
|
156
194
|
"""Walk parents of ``db_path`` looking for a ``.git`` entry.
|
|
157
195
|
|
|
@@ -291,7 +329,10 @@ def _resolve_head_sha() -> str:
|
|
|
291
329
|
process so the value is only the DDL default for transient tests, OR
|
|
292
330
|
* the file-backed DB has no reachable ``.git`` ancestor AND the
|
|
293
331
|
operator has opted in to the test-only escape hatch via
|
|
294
|
-
``CRG_TEST_ALLOW_NO_GIT=1
|
|
332
|
+
``CRG_TEST_ALLOW_NO_GIT=1``, OR
|
|
333
|
+
* the DB is a per-subject store under the crg data directory
|
|
334
|
+
(``<CRG_DATA_DIR>/subs/<sub>/graph.db``) — a data-directory DB
|
|
335
|
+
intentionally outside every repo, so there is no HEAD to read.
|
|
295
336
|
|
|
296
337
|
File-backed DBs without a reachable ``.git`` ancestor and without
|
|
297
338
|
the test escape hatch still raise the actionable
|
|
@@ -307,6 +348,8 @@ def _resolve_head_sha() -> str:
|
|
|
307
348
|
db_path = _extract_db_path_from_url(url)
|
|
308
349
|
if db_path is None:
|
|
309
350
|
return _IN_MEMORY_SENTINEL_SHA
|
|
351
|
+
if _is_data_dir_store(db_path):
|
|
352
|
+
return _IN_MEMORY_SENTINEL_SHA
|
|
310
353
|
try:
|
|
311
354
|
repo_root = _find_repo_root(db_path)
|
|
312
355
|
return _read_head_sha(repo_root)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "better-code-review-graph"
|
|
7
|
-
version = "3.
|
|
7
|
+
version = "3.27.1"
|
|
8
8
|
description = "Token-efficient code review knowledge graph: semantic search and call-graph resolution."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -27,27 +27,19 @@ dependencies = [
|
|
|
27
27
|
"fastretrieval>=1.8.2,<2",
|
|
28
28
|
"httpx",
|
|
29
29
|
"pydantic-settings",
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
# sorts below its own stable under PEP 440 and does not require it.
|
|
36
|
-
"n24q02m-mcp-core[llm]==1.24.6",
|
|
37
|
-
# litellm security floor (transitive via mcp-core[llm]). 1.83.x-1.87.x carry 4
|
|
38
|
-
# advisories in litellm's PROXY server: GHSA-r75f-5x8p-qvmc (SQLi in proxy key
|
|
39
|
-
# verify), GHSA-xqmj-j6mv-4862 (SSTI /prompts/test), GHSA-v4p8-mg3p-g94g (cmd-exec
|
|
40
|
-
# proxy MCP endpoints), GHSA-wxxx-gvqv-xp7p (sandbox escape custom-code guardrail).
|
|
41
|
-
# We use litellm LIBRARY mode only (no proxy) so none are in our attack surface,
|
|
42
|
-
# but Dependency Review flags the package version. 1.88.0+ clears all four.
|
|
43
|
-
# crg's optional semgrep extra otherwise pins the resolver to litellm 1.83.0; this
|
|
44
|
-
# floor lifts it (semgrep resolves to 1.79.x, fine for a dev-only SAST tool).
|
|
45
|
-
"litellm>=1.102.0",
|
|
30
|
+
# De-hosted shared core (WP1): token auth (3 modes), per-task model cells
|
|
31
|
+
# (plain-HTTP OpenAI-spec, no litellm), server lifecycle lock. Vendored via
|
|
32
|
+
# git because hull-core is not published to PyPI (spec 2026-09-26 §3);
|
|
33
|
+
# rev pins the WP1-verified hull commit.
|
|
34
|
+
"hull-core",
|
|
46
35
|
"Pygments>=2.21.0",
|
|
47
36
|
"alembic>=1.20.0,<2",
|
|
48
37
|
"defusedxml>=0.7.1",
|
|
49
38
|
]
|
|
50
39
|
|
|
40
|
+
[tool.uv.sources]
|
|
41
|
+
hull-core = { git = "https://github.com/n24q02m/hull", subdirectory = "packages/core-py", rev = "14841d05488c801d303b0f3d3cd97426f94a6e1a" }
|
|
42
|
+
|
|
51
43
|
[project.scripts]
|
|
52
44
|
better-code-review-graph = "better_code_review_graph.cli:main"
|
|
53
45
|
crg = "better_code_review_graph.cli:main"
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/n24q02m/crg.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "3.
|
|
9
|
+
"version": "3.27.1",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "better-code-review-graph",
|
|
14
|
-
"version": "3.
|
|
14
|
+
"version": "3.27.1",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
16
|
"runtimeArgs": [
|
|
17
17
|
"--python",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"name": "LLM_API_BASE"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
|
-
"description": "DEPRECATED (honored one release): single summarizer model
|
|
103
|
+
"description": "DEPRECATED (honored one release): single summarizer model string. Use SUMMARY_MODELS instead.",
|
|
104
104
|
"isRequired": false,
|
|
105
105
|
"isSecret": false,
|
|
106
106
|
"name": "SUMMARY_MODEL"
|