better-code-review-graph 3.26.22__tar.gz → 3.26.24__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.22 → better_code_review_graph-3.26.24}/.claude-plugin/plugin.json +1 -1
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/workflows/cd.yml +2 -2
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.jules/bolt.md +8 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/CHANGELOG.md +31 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/Dockerfile +1 -1
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/PKG-INFO +1 -1
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/pyproject.toml +3 -3
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/server.json +2 -2
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/credential_state.py +1 -1
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/relay_setup.py +4 -4
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/tools.py +4 -4
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_payload_estimation.py +12 -14
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/uv.lock +145 -170
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.agents/skills/build-graph/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.agents/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.agents/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.coderabbit.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.dockerignore +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/CODEOWNERS +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/review-learnings.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/rulesets/main.json +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/workflows/ci.yml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.gitignore +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.infisical.json +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.jules/sentinel.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.pre-commit-config.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/AGENTS.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/BREAKING_CHANGES.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/CLAUDE.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/CODE_OF_CONDUCT.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/CONTRIBUTING.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/LICENSE +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/LICENSE-MIT +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/NOTICE +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/README.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/SECURITY.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/alembic.ini +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/docs/HANDOVER.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/hooks/_graph_state.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/hooks/branch-sync-check.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/hooks/hooks.json +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/hooks/stale-graph-check.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/README +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/env.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/script.py.mako +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/001_baseline.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/002_summary_columns.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/003_federation.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/004_security_tags.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/005_temporal_columns.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/migrations/versions/006_commits_table.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/renovate.json +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/heuristic/cwe-22-path-traversal.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/heuristic/cwe-78-shell-command-sink.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/heuristic/cwe-89-sql-string-format.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/heuristic/cwe-95-eval-on-input.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/heuristic/hardcoded-secret.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/rules/semgrep/curated.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/scripts/benchmark_row_deserialization.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/scripts/enforce-commit.sh +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/scripts/preserve-diacritics.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/scripts/test_preserve_diacritics.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/semantic-release.toml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/impact-audit/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/onboard-repo/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/refactor-check/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/review-delta/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/review-pr/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/skills/security-sweep/SKILL.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/smithery.yaml +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/__main__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/cli.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/config.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/config.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/graph.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/query.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/recipes.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/review.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/docs/security.md +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/embeddings.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/exporter.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/federation.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/graph.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/importer.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/incremental.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/parser.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/py.typed +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/relay_schema.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/reranker.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/_types.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/fallback.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/go.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/java.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/python.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/rust.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/resolver/typescript.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/security/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/security/heuristic.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/security/semgrep_engine.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/server.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/summarizer.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/temporal.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/src/better_code_review_graph/xpia.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/conftest.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/conftest_e2e.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/e2e_mcp_protocol_test.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/Sample.cs +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/SampleJava.java +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/callback_refs.js +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/caller_example.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/multi_call_example.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.c +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.cpp +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.kt +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.php +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.rb +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.sol +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample.swift +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample_go.go +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample_python.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample_rust.rs +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/sample_typescript.ts +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/fixtures/test_sample.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/integration/__init__.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/integration/test_multi_user_remote.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_alembic_baseline.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_as_of_diff.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_auto_resolve_ambiguity.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_bare_suffix_correctness.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_callers_not_found_reason.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_callers_of_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_cli.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_cli_contracts.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_cohere_dimensions.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_commits_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_config_open_relay_registered.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_coverage_gaps.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_credential_state.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_credential_state_stdio_no_fallback.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_credential_state_store_errors.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_crg_protocol_harness.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_custom_local_model.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_dynamic_dispatch_hints.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_e2e.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_embedder_retry_classification.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_embedding_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_embeddings.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_embeddings_extra.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_export_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_export_graph_dispatch_path_traversal.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_exporter.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_federation.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_federation_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_federation_smoke.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_full_live.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_g6_ux_status_accuracy.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_get_docs_section_error_path.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_get_review_context_no_diff.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_graph.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_graph_batch_fetch.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_graph_extra.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_graph_get_edges_by_targets_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_graph_stats_error_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_handle_not_found_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_help_recipes.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_heuristic.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_home_isolation.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_impact_payload_truncation.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_implements_edges.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_import_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_importer.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_incremental.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_incremental_extra.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_kind_filter_optimization.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_kinds_error_path.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_list_graph_stats_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_list_kinds_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_live_mcp.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_local_reranker.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_lookup_node_directly.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_multi_user.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_multi_user_dispatch.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_multilang.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_no_stale_package_name.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_oci_publication_sunset.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_oserror_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_parser.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_parser_extra.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_parser_grammar_failure.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_parser_source_text.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_path_resolution_fallback.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_per_plugin_storage_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_per_sub_graph_db.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_performance_n1.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_performance_n1_embeddings.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_phase_3_smoke.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_plugin_assets.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_pre_2_0_backup.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_relay_schema.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_relay_setup.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_renamed_in_diff.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_renamed_in_diff_exception.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_repo_filter.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_repo_filter_batching.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_repo_id_persistence.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolve_search_candidates.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_dispatcher.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_fallback.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_go.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_java.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_python.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_rust.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_resolver_typescript.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_response_header.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_response_payload_honesty.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_review_delta_line_shifts.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_review_languages_filter.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_reviewer_summary.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_search_edges_by_target_names.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_search_keyword_warning.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_security_injection.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_security_path_traversal.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_security_scan_batching.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_security_tags_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_security_tool.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_semgrep_engine.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_server.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_server_help_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_serverinfo_version.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_setup_tool.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_shares_state_edges.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_spot_check.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_sql_security.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_stdio_direct.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_summarize_graph_dispatch.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_summarizer.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_summary_schema.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_temporal.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_temporal_migration.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_tested_by_edges.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_tools.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_tools_build_error_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_tools_full.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_tools_get_docs_section_coverage.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_typescript_coverage_gaps.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_v17_coverage_gaps.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_xpia.py +0 -0
- {better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/tests/test_xpia_adversarial.py +0 -0
{better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.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.26.
|
|
4
|
+
"version": "3.26.24",
|
|
5
5
|
"userConfig": {
|
|
6
6
|
"EMBEDDING_MODELS": {
|
|
7
7
|
"type": "string",
|
{better_code_review_graph-3.26.22 → better_code_review_graph-3.26.24}/.github/workflows/cd.yml
RENAMED
|
@@ -64,7 +64,7 @@ jobs:
|
|
|
64
64
|
# learn the version it WOULD publish, so the PyPI-collision guard below can fire
|
|
65
65
|
# BEFORE the real run creates a git tag or GitHub Release. Same action + SHA and
|
|
66
66
|
# same prerelease inputs as the real step, run against the same untouched checkout.
|
|
67
|
-
- uses: n24q02m/better-semantic-release@
|
|
67
|
+
- uses: n24q02m/better-semantic-release@a994102ce3aa588fe3038e79707ae7ae3971b336 # v1.7.0
|
|
68
68
|
id: dryrun
|
|
69
69
|
if: inputs.publish_existing_tag == ''
|
|
70
70
|
with:
|
|
@@ -131,7 +131,7 @@ jobs:
|
|
|
131
131
|
echo "::error::Could not verify whether ${PKG}==${COMPUTED_VERSION} exists on PyPI: unexpected HTTP status ${http_code} from ${URL} (likely a transient network/registry error, rate limit, or outage). Refusing to proceed so a genuine collision cannot slip through as a false 'free'. Re-run the release once the registry is reachable."
|
|
132
132
|
exit 1
|
|
133
133
|
|
|
134
|
-
- uses: n24q02m/better-semantic-release@
|
|
134
|
+
- uses: n24q02m/better-semantic-release@a994102ce3aa588fe3038e79707ae7ae3971b336 # v1.7.0
|
|
135
135
|
id: release
|
|
136
136
|
if: inputs.publish_existing_tag == ''
|
|
137
137
|
with:
|
|
@@ -113,3 +113,11 @@ Subquery 2 is not correlated, so SQLite already hoists it behind an `OP_Once` gu
|
|
|
113
113
|
**Learning:** When exporting the full code review graph via `export_crg`, materializing the entire graph's nodes and edges into lists of Python dictionaries before passing them to `json.dumps()` causes massive peak memory overhead, especially for large repositories.
|
|
114
114
|
|
|
115
115
|
**Action:** Replace full list materialization (`[dict(row) for row in cursor]`) with a generator that iterates over the `sqlite3.Cursor` directly. Yield incrementally-dumped JSON string chunks (`json.dumps(dict(row), indent=2).replace("\\n", "\\n ")`) to construct the final payload efficiently on-the-fly.
|
|
116
|
+
|
|
117
|
+
### 2026-09-12 - Speed up large payload size estimation via json.dumps
|
|
118
|
+
|
|
119
|
+
**Anchor:** `N/A` (to be committed)
|
|
120
|
+
|
|
121
|
+
**Learning:** When estimating the size of large list/dictionary payloads (e.g. in `_estimate_payload_bytes` for truncation limits), converting parts to string format using `repr(p)` in a loop is a significant bottleneck. `json.dumps()` is measurably faster (approx. 30-40%) because it relies on C-level optimizations for serialization.
|
|
122
|
+
|
|
123
|
+
**Action:** Use `json.dumps()` instead of `repr()` when performing size estimations of dictionaries/lists to minimize string overhead on hot paths.
|
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v3.26.24 (2026-09-24)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **deps**: Lock file maintenance ([#1088](https://github.com/n24q02m/crg/pull/1088),
|
|
10
|
+
[`9981680`](https://github.com/n24q02m/crg/commit/9981680029cc3d0f89b8d76d986b8595c6d1f7a8))
|
|
11
|
+
|
|
12
|
+
- **deps**: Update patch dependencies ([#1086](https://github.com/n24q02m/crg/pull/1086),
|
|
13
|
+
[`eba5ee0`](https://github.com/n24q02m/crg/commit/eba5ee09528e8c2d05233dd8749abdcac5baf0e7))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## v3.26.23 (2026-09-21)
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
- Bolt optimization speed up impact payload truncation
|
|
21
|
+
([#1077](https://github.com/n24q02m/crg/pull/1077),
|
|
22
|
+
[`be88254`](https://github.com/n24q02m/crg/commit/be8825418fea99e8c2c0109f8ed753dfc5399e4f))
|
|
23
|
+
|
|
24
|
+
- Sentinel [MEDIUM] Upgrade exception logging to warning to prevent masking failures
|
|
25
|
+
([#1060](https://github.com/n24q02m/crg/pull/1060),
|
|
26
|
+
[`ddf02c7`](https://github.com/n24q02m/crg/commit/ddf02c710473754a5a2ec4c07459335596a3c574))
|
|
27
|
+
|
|
28
|
+
- **deps**: Update minor dependencies ([#1057](https://github.com/n24q02m/crg/pull/1057),
|
|
29
|
+
[`1667bff`](https://github.com/n24q02m/crg/commit/1667bff15bf77d8d98e009b1fb6b45f4274fde7d))
|
|
30
|
+
|
|
31
|
+
- **deps**: Update python:3.13-slim-bookworm Docker digest to 2325bb2
|
|
32
|
+
([#1064](https://github.com/n24q02m/crg/pull/1064),
|
|
33
|
+
[`e93f200`](https://github.com/n24q02m/crg/commit/e93f200793583ba8c214cbe69ea90a547bebc4a2))
|
|
34
|
+
|
|
35
|
+
|
|
5
36
|
## v3.26.22 (2026-09-20)
|
|
6
37
|
|
|
7
38
|
### Bug Fixes
|
|
@@ -24,7 +24,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \
|
|
|
24
24
|
# ========================
|
|
25
25
|
# Stage 2: Runtime base (shared by stdio + http targets)
|
|
26
26
|
# ========================
|
|
27
|
-
FROM python:3.13-slim-bookworm@sha256:
|
|
27
|
+
FROM python:3.13-slim-bookworm@sha256:2325bb286ec344af3e5898cc224b5844e2707ac6e26b1632516fd3edc84a5e26 AS runtime
|
|
28
28
|
LABEL io.modelcontextprotocol.server.name="io.github.n24q02m/better-code-review-graph"
|
|
29
29
|
RUN groupadd -r appuser && useradd -r -g appuser -d /app appuser
|
|
30
30
|
WORKDIR /app
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "better-code-review-graph"
|
|
7
|
-
version = "3.26.
|
|
7
|
+
version = "3.26.24"
|
|
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"
|
|
@@ -68,9 +68,9 @@ dev = [
|
|
|
68
68
|
"pytest-asyncio==1.4.0",
|
|
69
69
|
"pytest-cov",
|
|
70
70
|
"pytest-timeout",
|
|
71
|
-
"ruff==0.16.
|
|
71
|
+
"ruff==0.16.8",
|
|
72
72
|
"syrupy",
|
|
73
|
-
"ty==0.0.
|
|
73
|
+
"ty==0.0.82",
|
|
74
74
|
]
|
|
75
75
|
|
|
76
76
|
[tool.hatch.build.targets.wheel]
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/n24q02m/crg.git",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "3.26.
|
|
9
|
+
"version": "3.26.24",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "better-code-review-graph",
|
|
14
|
-
"version": "3.26.
|
|
14
|
+
"version": "3.26.24",
|
|
15
15
|
"runtimeHint": "uvx",
|
|
16
16
|
"runtimeArgs": [
|
|
17
17
|
"--python",
|
|
@@ -345,7 +345,7 @@ def reset_state() -> None:
|
|
|
345
345
|
clear_mode(SERVER_NAME)
|
|
346
346
|
PerPluginStore(PLUGIN_NAME).clear()
|
|
347
347
|
except Exception as e:
|
|
348
|
-
logger.
|
|
348
|
+
logger.warning("Exception in %s: %s", __name__, e)
|
|
349
349
|
|
|
350
350
|
|
|
351
351
|
# ---------------------------------------------------------------------------
|
|
@@ -70,7 +70,7 @@ async def ensure_config() -> dict[str, str] | None:
|
|
|
70
70
|
os.environ.setdefault(key, value)
|
|
71
71
|
return saved
|
|
72
72
|
except Exception as e:
|
|
73
|
-
logger.
|
|
73
|
+
logger.warning("Exception in %s: %s", __name__, e)
|
|
74
74
|
|
|
75
75
|
# 3. No local credentials found -- trigger relay setup.
|
|
76
76
|
# Per mode-matrix 2.5, better-code-review-graph default is `http local relay`;
|
|
@@ -93,7 +93,7 @@ async def ensure_config() -> dict[str, str] | None:
|
|
|
93
93
|
# relay UI keys — see relay_schema.py for details.
|
|
94
94
|
session = await create_session(relay_url, SERVER_NAME, RELAY_SCHEMA) # ty: ignore[invalid-argument-type]
|
|
95
95
|
except Exception:
|
|
96
|
-
logger.
|
|
96
|
+
logger.warning(
|
|
97
97
|
"Cannot reach relay server at %s. Using local mode.",
|
|
98
98
|
relay_url,
|
|
99
99
|
exc_info=True,
|
|
@@ -132,7 +132,7 @@ async def ensure_config() -> dict[str, str] | None:
|
|
|
132
132
|
},
|
|
133
133
|
)
|
|
134
134
|
except Exception as e:
|
|
135
|
-
logger.
|
|
135
|
+
logger.warning("Exception in %s: %s", __name__, e)
|
|
136
136
|
|
|
137
137
|
# Inject into environment
|
|
138
138
|
for key, value in config.items():
|
|
@@ -146,5 +146,5 @@ async def ensure_config() -> dict[str, str] | None:
|
|
|
146
146
|
elif "timed out" in str(e).lower():
|
|
147
147
|
logger.info("Relay setup timed out. Using local mode.")
|
|
148
148
|
else:
|
|
149
|
-
logger.
|
|
149
|
+
logger.warning("Relay setup ended: %s", e)
|
|
150
150
|
return None
|
|
@@ -596,11 +596,11 @@ _DEFAULT_IMPACT_PAYLOAD_BYTES = 500_000 # #315: ~500KB ceiling on impact JSON
|
|
|
596
596
|
def _estimate_payload_bytes(*payloads: list[dict] | dict) -> int:
|
|
597
597
|
"""Cheap upper-bound estimator for serialized JSON size.
|
|
598
598
|
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
599
|
+
Bolt optimization: Using json.dumps() with C-level optimizations is measurably
|
|
600
|
+
faster (approx. 30-40%) than Python's native repr() when serializing large arrays
|
|
601
|
+
of dictionary objects for truncation limits, minimizing string overhead.
|
|
602
602
|
"""
|
|
603
|
-
return sum(len(
|
|
603
|
+
return sum(len(json.dumps(p, separators=(",", ":"))) for p in payloads)
|
|
604
604
|
|
|
605
605
|
|
|
606
606
|
# ---------------------------------------------------------------------------
|
|
@@ -10,35 +10,33 @@ def test_estimate_payload_bytes_empty():
|
|
|
10
10
|
def test_estimate_payload_bytes_single_dict():
|
|
11
11
|
d = {"key": "value", "int": 123, "bool": True, "none": None}
|
|
12
12
|
estimate = _estimate_payload_bytes(d)
|
|
13
|
-
actual_json_len = len(json.dumps(d))
|
|
14
|
-
|
|
15
|
-
# repr uses True while json uses true
|
|
16
|
-
# repr uses None while json uses null
|
|
17
|
-
assert estimate >= actual_json_len
|
|
13
|
+
actual_json_len = len(json.dumps(d, separators=(",", ":")))
|
|
14
|
+
assert estimate == actual_json_len
|
|
18
15
|
assert isinstance(estimate, int)
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
def test_estimate_payload_bytes_list_of_dicts():
|
|
22
19
|
payload = [{"a": 1}, {"b": 2}]
|
|
23
20
|
estimate = _estimate_payload_bytes(payload)
|
|
24
|
-
actual_json_len = len(json.dumps(payload))
|
|
25
|
-
assert estimate
|
|
21
|
+
actual_json_len = len(json.dumps(payload, separators=(",", ":")))
|
|
22
|
+
assert estimate == actual_json_len
|
|
26
23
|
|
|
27
24
|
|
|
28
25
|
def test_estimate_payload_bytes_multiple_args():
|
|
29
26
|
d1 = {"a": 1}
|
|
30
27
|
d2 = {"b": 2}
|
|
31
28
|
l1 = [{"c": 3}]
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
expected = (
|
|
30
|
+
len(json.dumps(d1, separators=(",", ":")))
|
|
31
|
+
+ len(json.dumps(d2, separators=(",", ":")))
|
|
32
|
+
+ len(json.dumps(l1, separators=(",", ":")))
|
|
33
|
+
)
|
|
34
34
|
assert _estimate_payload_bytes(d1, d2, l1) == expected
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
def test_estimate_payload_bytes_overestimation():
|
|
38
|
-
#
|
|
38
|
+
# Because estimate_payload_bytes now uses json.dumps directly, the length is exact
|
|
39
39
|
d = {"key": "it's a string with single quote"}
|
|
40
|
-
# repr(d) -> "{'key': \"it's a string with single quote\"}"
|
|
41
|
-
# json.dumps(d) -> '{"key": "it\'s a string with single quote"}'
|
|
42
40
|
estimate = _estimate_payload_bytes(d)
|
|
43
|
-
actual_json_len = len(json.dumps(d))
|
|
44
|
-
assert estimate
|
|
41
|
+
actual_json_len = len(json.dumps(d, separators=(",", ":")))
|
|
42
|
+
assert estimate == actual_json_len
|