better-code-review-graph 3.27.0__tar.gz → 3.27.2__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.27.0 → better_code_review_graph-3.27.2}/.claude-plugin/plugin.json +1 -1
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/workflows/ci.yml +1 -1
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/AGENTS.md +12 -14
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CHANGELOG.md +24 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CLAUDE.md +11 -36
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/PKG-INFO +11 -49
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/README.md +10 -48
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/pyproject.toml +2 -2
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/server.json +3 -3
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/config.md +8 -5
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/server.py +2 -2
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/uv.lock +222 -39
- better_code_review_graph-3.27.0/tests/e2e_mcp_protocol_test.py +0 -289
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/build-graph/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.coderabbit.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.dockerignore +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/CODEOWNERS +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/review-learnings.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/rulesets/main.json +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/workflows/cd.yml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.gitignore +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.infisical.json +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.jules/bolt.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.jules/sentinel.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.pre-commit-config.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/BREAKING_CHANGES.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CODE_OF_CONDUCT.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CONTRIBUTING.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/Dockerfile +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/LICENSE +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/LICENSE-MIT +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/NOTICE +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/SECURITY.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/alembic.ini +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/docs/HANDOVER.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/_graph_state.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/branch-sync-check.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/hooks.json +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/stale-graph-check.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/README +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/env.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/script.py.mako +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/001_baseline.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/002_summary_columns.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/003_federation.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/004_security_tags.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/005_temporal_columns.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/006_commits_table.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/renovate.json +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-22-path-traversal.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-78-shell-command-sink.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-89-sql-string-format.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-95-eval-on-input.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/hardcoded-secret.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/semgrep/curated.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/benchmark_row_deserialization.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/enforce-commit.sh +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/preserve-diacritics.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/test_preserve_diacritics.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/semantic-release.toml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/impact-audit/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/onboard-repo/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/refactor-check/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/security-sweep/SKILL.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/smithery.yaml +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/__main__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/cli.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/config.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/credential_state.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/graph.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/query.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/recipes.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/review.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/security.md +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/embeddings.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/exporter.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/federation.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/graph.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/importer.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/incremental.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/parser.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/py.typed +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/reranker.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/_types.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/fallback.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/go.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/java.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/python.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/rust.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/typescript.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/security/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/security/heuristic.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/security/semgrep_engine.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/summarizer.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/temporal.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/tools.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/xpia.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/conftest.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/conftest_e2e.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/Sample.cs +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/SampleJava.java +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/callback_refs.js +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/caller_example.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/multi_call_example.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.c +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.cpp +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.kt +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.php +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.rb +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.sol +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.swift +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_go.go +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_python.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_rust.rs +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_typescript.ts +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/test_sample.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/integration/__init__.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/integration/test_multi_user_remote.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_alembic_baseline.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_as_of_diff.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_auto_resolve_ambiguity.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_bare_suffix_correctness.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_callers_not_found_reason.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_callers_of_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cli.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cli_contracts.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cohere_dimensions.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_commits_migration.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_coverage_gaps.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_credential_state_dehosted.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_crg_protocol_harness.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_custom_local_model.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_dynamic_dispatch_hints.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_e2e.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embedder_retry_classification.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embedding_migration.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embeddings.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embeddings_extra.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_export_graph_dispatch.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_export_graph_dispatch_path_traversal.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_exporter.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation_migration.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation_smoke.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_full_live.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_g6_ux_status_accuracy.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_get_docs_section_error_path.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_get_review_context_no_diff.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_batch_fetch.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_extra.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_get_edges_by_targets_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_stats_error_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_handle_not_found_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_help_recipes.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_heuristic.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_impact_payload_truncation.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_implements_edges.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_import_graph_dispatch.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_importer.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_incremental.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_incremental_extra.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_kind_filter_optimization.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_kinds_error_path.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_list_graph_stats_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_list_kinds_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_live_mcp.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_local_reranker.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_lookup_node_directly.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_multilang.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_no_stale_package_name.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_oci_publication_sunset.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_oserror_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_extra.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_grammar_failure.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_source_text.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_path_resolution_fallback.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_payload_estimation.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_per_sub_graph_db.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_performance_n1.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_performance_n1_embeddings.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_phase_3_smoke.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_plugin_assets.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_pre_2_0_backup.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_renamed_in_diff.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_renamed_in_diff_exception.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_filter.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_filter_batching.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_id_persistence.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolve_search_candidates.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_dispatcher.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_fallback.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_go.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_java.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_python.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_rust.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_typescript.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_response_header.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_response_payload_honesty.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_review_delta_line_shifts.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_review_languages_filter.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_reviewer_summary.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_search_edges_by_target_names.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_search_keyword_warning.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_injection.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_path_traversal.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_scan_batching.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_tags_migration.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_tool.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_semgrep_engine.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_server.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_server_help_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_serverinfo_version.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_setup_tool.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_shares_state_edges.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_spot_check.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_sql_security.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_stdio_direct.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summarize_graph_dispatch.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summarizer.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summary_schema.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_temporal.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_temporal_migration.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tested_by_edges.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_build_error_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_full.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_get_docs_section_coverage.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_typescript_coverage_gaps.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_v17_coverage_gaps.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_xpia.py +0 -0
- {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_xpia_adversarial.py +0 -0
{better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.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.27.
|
|
4
|
+
"version": "3.27.2",
|
|
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,30 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v3.27.2 (2026-09-26)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **deps**: Lock file maintenance ([#1095](https://github.com/n24q02m/crg/pull/1095),
|
|
10
|
+
[`56c05f2`](https://github.com/n24q02m/crg/commit/56c05f213efcdaeabd97fc96445d02017e44ade3))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v3.27.1 (2026-09-26)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- **ci**: Keep uv sources for git-pinned hull-core
|
|
18
|
+
([`0f8eec1`](https://github.com/n24q02m/crg/commit/0f8eec1ceddf33c93e40d299d750a2b8fd7eb3ae))
|
|
19
|
+
|
|
20
|
+
### Chores
|
|
21
|
+
|
|
22
|
+
- Re-pin hull-core for chat null-content fallback
|
|
23
|
+
([`d2d890f`](https://github.com/n24q02m/crg/commit/d2d890f9d32362c2282e651f8a00f2bbab985ef1))
|
|
24
|
+
|
|
25
|
+
- Scrub WP2 residuals (dead e2e script, open_relay string, doc sweep)
|
|
26
|
+
([`debd924`](https://github.com/n24q02m/crg/commit/debd9247ec886cbe9322e0618ea475f83aecf6ac))
|
|
27
|
+
|
|
28
|
+
|
|
5
29
|
## v3.27.0 (2026-09-26)
|
|
6
30
|
|
|
7
31
|
### 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.27.
|
|
3
|
+
Version: 3.27.2
|
|
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
|
|
@@ -243,9 +243,6 @@ another provider. Summarizers require a chat-completion model.
|
|
|
243
243
|
| `openrouter/` | `OPENROUTER_API_KEY` | <https://openrouter.ai/settings/keys> |
|
|
244
244
|
| `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | <https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview> |
|
|
245
245
|
|
|
246
|
-
Any other [litellm provider](https://docs.litellm.ai/docs/providers) works via
|
|
247
|
-
its standard `<PROVIDER>_API_KEY`.
|
|
248
|
-
|
|
249
246
|
### Advanced
|
|
250
247
|
|
|
251
248
|
| Variable | Purpose |
|
|
@@ -296,39 +293,15 @@ not invoke the reranker.
|
|
|
296
293
|
|
|
297
294
|
Cohere embedding is paid. Authorize a bounded budget before a live index/query;
|
|
298
295
|
the Minimax-free completion choice does not make embeddings free. This example
|
|
299
|
-
does not add a process-wide model override:
|
|
300
|
-
|
|
301
|
-
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.
|
|
302
298
|
|
|
303
299
|
CRG currently has **no cloud rerank call**: `LOCAL_RERANK_MODEL` is its only
|
|
304
300
|
reranking path. Setting `RERANK_MODELS` or `RERANK_API_BASE` does not enable one.
|
|
305
301
|
|
|
306
|
-
You can also configure cloud keys interactively in HTTP mode via the relay
|
|
307
|
-
setup form (`config(action="setup_start")` returns the browser URL). See the
|
|
308
|
-
[modes overview](https://mcp.n24q02m.com/get-started/modes-overview/) and
|
|
309
|
-
[multi-user setup](https://mcp.n24q02m.com/get-started/multi-user/).
|
|
310
|
-
|
|
311
|
-
### Workspace username (HTTP setup form)
|
|
312
|
-
|
|
313
|
-
The relay setup form has an optional **workspace username** field. Entering the
|
|
314
|
-
same username always lands you in the same per-`sub` bucket, so your keys and
|
|
315
|
-
graph stay reachable across a re-authorization and across devices, instead of
|
|
316
|
-
being tied to the one-off subject minted for each `/authorize` round-trip.
|
|
317
|
-
Leaving it blank keeps the previous per-authorize behaviour.
|
|
318
|
-
|
|
319
|
-
Trust boundary: when the form is gated by a *shared* `MCP_RELAY_PASSWORD`, the
|
|
320
|
-
username is a partition key, not a secret -- anyone who knows that password can
|
|
321
|
-
type any username and reach that bucket. That is fine for a trusted group; an
|
|
322
|
-
untrusted multi-tenant deployment needs a per-user secret or delegated OAuth
|
|
323
|
-
instead.
|
|
324
|
-
|
|
325
|
-
**One-time migration:** existing users must re-enter their credentials once after
|
|
326
|
-
this change. Nothing is deleted; credentials stored under the old random subject
|
|
327
|
-
are simply no longer addressed.
|
|
328
|
-
|
|
329
302
|
## Tools
|
|
330
303
|
|
|
331
|
-
|
|
304
|
+
Six tools, each grouping related actions to keep the tool surface small.
|
|
332
305
|
|
|
333
306
|
### `graph` -- Graph lifecycle
|
|
334
307
|
|
|
@@ -378,11 +351,11 @@ Actions: `status` | `set` | `cache_clear` | `setup_status` | `setup_start` | `se
|
|
|
378
351
|
| `status` | Server info: version, graph path, node/edge counts, embedding backend, embeddings count. |
|
|
379
352
|
| `set` | Update a runtime setting (`key=log_level`). |
|
|
380
353
|
| `cache_clear` | Remove all computed embeddings. |
|
|
381
|
-
| `setup_status` | Show current credential state
|
|
382
|
-
| `setup_start` |
|
|
383
|
-
| `setup_skip` | Set local mode (
|
|
384
|
-
| `setup_reset` |
|
|
385
|
-
| `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. |
|
|
386
359
|
|
|
387
360
|
### `security` -- Security scanning
|
|
388
361
|
|
|
@@ -405,13 +378,6 @@ Topics: `graph` | `query` | `review` | `config` | `security` | `recipes`
|
|
|
405
378
|
Returns complete documentation for each tool. Use when the compressed
|
|
406
379
|
descriptions above are insufficient.
|
|
407
380
|
|
|
408
|
-
### `config__open_relay` -- Re-trigger the relay setup form
|
|
409
|
-
|
|
410
|
-
Registered automatically from [mcp-core](https://github.com/n24q02m/mcp-core).
|
|
411
|
-
In HTTP mode it returns `<PUBLIC_URL>/authorize` so the agent can re-open the
|
|
412
|
-
browser setup form (e.g. after credential expiry); in stdio mode it returns
|
|
413
|
-
`status: 'stdio_unsupported'`.
|
|
414
|
-
|
|
415
381
|
## CLI
|
|
416
382
|
|
|
417
383
|
The package installs two console scripts: **`crg`** (primary) and
|
|
@@ -451,12 +417,8 @@ crg security scan --engine heuristic
|
|
|
451
417
|
| `query spot_check` / `query renamed_in_diff` / `query diff` | Inspect callsites, line shifts, or commit-to-commit graph changes. |
|
|
452
418
|
| `review context` / `review delta` | Generate review context or diff buckets for a code change. |
|
|
453
419
|
| `security scan` / `security report` / `security suppress` / `security rule_list` | Run and manage heuristic/Semgrep security findings. |
|
|
454
|
-
| `config status` / `config delete` | Show or remove stored credential config (`--yes` skips confirmation). |
|
|
455
|
-
| `doctor` | Environment self-check from shared `mcp-core` CLI. |
|
|
456
|
-
| `relay status` / `relay open` / `relay reset` | Inspect, open, or clear the relay setup session. |
|
|
457
420
|
|
|
458
|
-
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
459
|
-
`config`, `doctor`, and `relay` subcommands come from shared `mcp-core`.
|
|
421
|
+
CLI subcommands print structured JSON and exit non-zero on an error.
|
|
460
422
|
|
|
461
423
|
|
|
462
424
|
## Features
|
|
@@ -469,7 +431,7 @@ What this fork fixes versus the upstream [code-review-graph](https://github.com/
|
|
|
469
431
|
| callers_of/callees_of | Empty results (bare name targets) | Qualified name resolution + bare fallback |
|
|
470
432
|
| Embedding | sentence-transformers + torch (1.1 GB) | fastretrieval ONNX + cloud (200 MB), dual-mode |
|
|
471
433
|
| Output size | Unbounded (500K+ chars) | Paginated (max_results, truncated flag) |
|
|
472
|
-
| Tool design | 9 individual tools |
|
|
434
|
+
| Tool design | 9 individual tools | 6 grouped tools: graph + query + review + config + security + help |
|
|
473
435
|
| Plugin hooks | Invalid PostEdit/PostGit | Valid PostToolUse |
|
|
474
436
|
|
|
475
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
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "better-code-review-graph"
|
|
7
|
-
version = "3.27.
|
|
7
|
+
version = "3.27.2"
|
|
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"
|
|
@@ -38,7 +38,7 @@ dependencies = [
|
|
|
38
38
|
]
|
|
39
39
|
|
|
40
40
|
[tool.uv.sources]
|
|
41
|
-
hull-core = { git = "https://github.com/n24q02m/hull", subdirectory = "packages/core-py", rev = "
|
|
41
|
+
hull-core = { git = "https://github.com/n24q02m/hull", subdirectory = "packages/core-py", rev = "14841d05488c801d303b0f3d3cd97426f94a6e1a" }
|
|
42
42
|
|
|
43
43
|
[project.scripts]
|
|
44
44
|
better-code-review-graph = "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.27.
|
|
9
|
+
"version": "3.27.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "better-code-review-graph",
|
|
14
|
-
"version": "3.27.
|
|
14
|
+
"version": "3.27.2",
|
|
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"
|
|
@@ -78,8 +78,11 @@ Remove all computed embeddings from the graph database. After clearing, run `gra
|
|
|
78
78
|
|
|
79
79
|
## Setup Actions
|
|
80
80
|
|
|
81
|
+
Setup actions manage host-owned model cells — there is no browser or relay
|
|
82
|
+
flow; the host owns all credential material.
|
|
83
|
+
|
|
81
84
|
### setup_status
|
|
82
|
-
Show current credential state and
|
|
85
|
+
Show current credential state and which model cells have keys.
|
|
83
86
|
|
|
84
87
|
**Example:**
|
|
85
88
|
```json
|
|
@@ -89,7 +92,7 @@ Show current credential state and relay setup URL (if any).
|
|
|
89
92
|
---
|
|
90
93
|
|
|
91
94
|
### setup_start
|
|
92
|
-
|
|
95
|
+
Explain where the host configures API keys.
|
|
93
96
|
|
|
94
97
|
**Parameters:**
|
|
95
98
|
- `force`: If true, reconfigure even when already configured (default: false)
|
|
@@ -102,7 +105,7 @@ Start relay setup session to configure API keys via browser.
|
|
|
102
105
|
---
|
|
103
106
|
|
|
104
107
|
### setup_skip
|
|
105
|
-
Set local mode
|
|
108
|
+
Set local mode — local ONNX embedding, no cloud cells.
|
|
106
109
|
|
|
107
110
|
**Example:**
|
|
108
111
|
```json
|
|
@@ -112,7 +115,7 @@ Set local mode permanently — relay will not trigger on next restart.
|
|
|
112
115
|
---
|
|
113
116
|
|
|
114
117
|
### setup_reset
|
|
115
|
-
|
|
118
|
+
Reset state to local; the host config re-resolves on next call.
|
|
116
119
|
|
|
117
120
|
**Example:**
|
|
118
121
|
```json
|
|
@@ -122,7 +125,7 @@ Clear saved credentials and reset to awaiting_setup state.
|
|
|
122
125
|
---
|
|
123
126
|
|
|
124
127
|
### setup_complete
|
|
125
|
-
Re-resolve
|
|
128
|
+
Re-resolve credential state from the host configuration.
|
|
126
129
|
|
|
127
130
|
**Example:**
|
|
128
131
|
```json
|
|
@@ -163,10 +163,10 @@ mcp = FastMCP(
|
|
|
163
163
|
version=_pkg_version,
|
|
164
164
|
instructions=(
|
|
165
165
|
"Persistent incremental knowledge graph for token-efficient, "
|
|
166
|
-
"context-aware code reviews.
|
|
166
|
+
"context-aware code reviews. 6 tools: graph (build/embed/stats), "
|
|
167
167
|
"query (search/impact/patterns), review (code review context), "
|
|
168
168
|
"config (status/set/setup_*), security (scan/report/rule_list), "
|
|
169
|
-
"help (full docs)
|
|
169
|
+
"help (full docs)."
|
|
170
170
|
),
|
|
171
171
|
)
|
|
172
172
|
|