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.
Files changed (244) hide show
  1. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.claude-plugin/plugin.json +1 -1
  2. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/workflows/ci.yml +1 -1
  3. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/AGENTS.md +12 -14
  4. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CHANGELOG.md +24 -0
  5. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CLAUDE.md +11 -36
  6. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/PKG-INFO +11 -49
  7. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/README.md +10 -48
  8. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/pyproject.toml +2 -2
  9. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/server.json +3 -3
  10. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/config.md +8 -5
  11. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/server.py +2 -2
  12. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/uv.lock +222 -39
  13. better_code_review_graph-3.27.0/tests/e2e_mcp_protocol_test.py +0 -289
  14. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/build-graph/SKILL.md +0 -0
  15. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/review-delta/SKILL.md +0 -0
  16. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.agents/skills/review-pr/SKILL.md +0 -0
  17. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.coderabbit.yaml +0 -0
  18. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.dockerignore +0 -0
  19. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/CODEOWNERS +0 -0
  20. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  22. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/review-learnings.md +0 -0
  24. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/rulesets/main.json +0 -0
  25. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.github/workflows/cd.yml +0 -0
  26. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.gitignore +0 -0
  27. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.infisical.json +0 -0
  28. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.jules/bolt.md +0 -0
  29. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.jules/sentinel.md +0 -0
  30. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/.pre-commit-config.yaml +0 -0
  31. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/BREAKING_CHANGES.md +0 -0
  32. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CODE_OF_CONDUCT.md +0 -0
  33. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/CONTRIBUTING.md +0 -0
  34. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/Dockerfile +0 -0
  35. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/LICENSE +0 -0
  36. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/LICENSE-MIT +0 -0
  37. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/NOTICE +0 -0
  38. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/SECURITY.md +0 -0
  39. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/alembic.ini +0 -0
  40. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/docs/HANDOVER.md +0 -0
  41. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/_graph_state.py +0 -0
  42. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/branch-sync-check.py +0 -0
  43. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/hooks.json +0 -0
  44. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/hooks/stale-graph-check.py +0 -0
  45. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/README +0 -0
  46. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/env.py +0 -0
  47. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/script.py.mako +0 -0
  48. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/001_baseline.py +0 -0
  49. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/002_summary_columns.py +0 -0
  50. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/003_federation.py +0 -0
  51. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/004_security_tags.py +0 -0
  52. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/005_temporal_columns.py +0 -0
  53. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/migrations/versions/006_commits_table.py +0 -0
  54. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/renovate.json +0 -0
  55. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-22-path-traversal.yaml +0 -0
  56. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-78-shell-command-sink.yaml +0 -0
  57. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-89-sql-string-format.yaml +0 -0
  58. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/cwe-95-eval-on-input.yaml +0 -0
  59. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/heuristic/hardcoded-secret.yaml +0 -0
  60. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/rules/semgrep/curated.yaml +0 -0
  61. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/benchmark_row_deserialization.py +0 -0
  62. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/enforce-commit.sh +0 -0
  63. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/preserve-diacritics.py +0 -0
  64. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/scripts/test_preserve_diacritics.py +0 -0
  65. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/semantic-release.toml +0 -0
  66. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/impact-audit/SKILL.md +0 -0
  67. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/onboard-repo/SKILL.md +0 -0
  68. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/refactor-check/SKILL.md +0 -0
  69. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/review-delta/SKILL.md +0 -0
  70. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/review-pr/SKILL.md +0 -0
  71. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/skills/security-sweep/SKILL.md +0 -0
  72. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/smithery.yaml +0 -0
  73. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/__init__.py +0 -0
  74. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/__main__.py +0 -0
  75. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/cli.py +0 -0
  76. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/config.py +0 -0
  77. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/credential_state.py +0 -0
  78. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/__init__.py +0 -0
  79. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/graph.md +0 -0
  80. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/query.md +0 -0
  81. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/recipes.md +0 -0
  82. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/review.md +0 -0
  83. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/docs/security.md +0 -0
  84. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/embeddings.py +0 -0
  85. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/exporter.py +0 -0
  86. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/federation.py +0 -0
  87. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/graph.py +0 -0
  88. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/importer.py +0 -0
  89. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/incremental.py +0 -0
  90. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/parser.py +0 -0
  91. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/py.typed +0 -0
  92. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/reranker.py +0 -0
  93. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/__init__.py +0 -0
  94. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/_types.py +0 -0
  95. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/fallback.py +0 -0
  96. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/go.py +0 -0
  97. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/java.py +0 -0
  98. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/python.py +0 -0
  99. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/rust.py +0 -0
  100. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/resolver/typescript.py +0 -0
  101. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/security/__init__.py +0 -0
  102. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/security/heuristic.py +0 -0
  103. {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
  104. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/summarizer.py +0 -0
  105. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/temporal.py +0 -0
  106. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/tools.py +0 -0
  107. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/src/better_code_review_graph/xpia.py +0 -0
  108. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/__init__.py +0 -0
  109. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/conftest.py +0 -0
  110. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/conftest_e2e.py +0 -0
  111. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/Sample.cs +0 -0
  112. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/SampleJava.java +0 -0
  113. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/callback_refs.js +0 -0
  114. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/caller_example.py +0 -0
  115. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/multi_call_example.py +0 -0
  116. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.c +0 -0
  117. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.cpp +0 -0
  118. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.kt +0 -0
  119. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.php +0 -0
  120. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.rb +0 -0
  121. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.sol +0 -0
  122. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample.swift +0 -0
  123. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_go.go +0 -0
  124. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_python.py +0 -0
  125. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_rust.rs +0 -0
  126. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/sample_typescript.ts +0 -0
  127. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/fixtures/test_sample.py +0 -0
  128. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/integration/__init__.py +0 -0
  129. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/integration/test_multi_user_remote.py +0 -0
  130. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_alembic_baseline.py +0 -0
  131. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_as_of_diff.py +0 -0
  132. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_auto_resolve_ambiguity.py +0 -0
  133. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_bare_suffix_correctness.py +0 -0
  134. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_callers_not_found_reason.py +0 -0
  135. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_callers_of_coverage.py +0 -0
  136. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cli.py +0 -0
  137. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cli_contracts.py +0 -0
  138. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_cohere_dimensions.py +0 -0
  139. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_commits_migration.py +0 -0
  140. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_coverage_gaps.py +0 -0
  141. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_credential_state_dehosted.py +0 -0
  142. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_crg_protocol_harness.py +0 -0
  143. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_custom_local_model.py +0 -0
  144. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_dynamic_dispatch_hints.py +0 -0
  145. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_e2e.py +0 -0
  146. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embedder_retry_classification.py +0 -0
  147. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embedding_migration.py +0 -0
  148. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embeddings.py +0 -0
  149. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_embeddings_extra.py +0 -0
  150. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_export_graph_dispatch.py +0 -0
  151. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_export_graph_dispatch_path_traversal.py +0 -0
  152. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_exporter.py +0 -0
  153. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation.py +0 -0
  154. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation_migration.py +0 -0
  155. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_federation_smoke.py +0 -0
  156. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_full_live.py +0 -0
  157. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_g6_ux_status_accuracy.py +0 -0
  158. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_get_docs_section_error_path.py +0 -0
  159. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_get_review_context_no_diff.py +0 -0
  160. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph.py +0 -0
  161. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_batch_fetch.py +0 -0
  162. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_extra.py +0 -0
  163. {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
  164. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_graph_stats_error_coverage.py +0 -0
  165. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_handle_not_found_coverage.py +0 -0
  166. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_help_recipes.py +0 -0
  167. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_heuristic.py +0 -0
  168. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_impact_payload_truncation.py +0 -0
  169. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_implements_edges.py +0 -0
  170. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_import_graph_dispatch.py +0 -0
  171. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_importer.py +0 -0
  172. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_incremental.py +0 -0
  173. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_incremental_extra.py +0 -0
  174. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_kind_filter_optimization.py +0 -0
  175. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_kinds_error_path.py +0 -0
  176. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_list_graph_stats_coverage.py +0 -0
  177. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_list_kinds_coverage.py +0 -0
  178. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_live_mcp.py +0 -0
  179. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_local_reranker.py +0 -0
  180. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_lookup_node_directly.py +0 -0
  181. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_multilang.py +0 -0
  182. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_no_stale_package_name.py +0 -0
  183. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_oci_publication_sunset.py +0 -0
  184. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_oserror_coverage.py +0 -0
  185. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser.py +0 -0
  186. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_extra.py +0 -0
  187. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_grammar_failure.py +0 -0
  188. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_parser_source_text.py +0 -0
  189. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_path_resolution_fallback.py +0 -0
  190. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_payload_estimation.py +0 -0
  191. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_per_sub_graph_db.py +0 -0
  192. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_performance_n1.py +0 -0
  193. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_performance_n1_embeddings.py +0 -0
  194. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_phase_3_smoke.py +0 -0
  195. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_plugin_assets.py +0 -0
  196. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_pre_2_0_backup.py +0 -0
  197. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_renamed_in_diff.py +0 -0
  198. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_renamed_in_diff_exception.py +0 -0
  199. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_filter.py +0 -0
  200. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_filter_batching.py +0 -0
  201. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_repo_id_persistence.py +0 -0
  202. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolve_search_candidates.py +0 -0
  203. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_dispatcher.py +0 -0
  204. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_fallback.py +0 -0
  205. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_go.py +0 -0
  206. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_java.py +0 -0
  207. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_python.py +0 -0
  208. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_rust.py +0 -0
  209. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_resolver_typescript.py +0 -0
  210. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_response_header.py +0 -0
  211. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_response_payload_honesty.py +0 -0
  212. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_review_delta_line_shifts.py +0 -0
  213. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_review_languages_filter.py +0 -0
  214. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_reviewer_summary.py +0 -0
  215. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_search_edges_by_target_names.py +0 -0
  216. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_search_keyword_warning.py +0 -0
  217. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_injection.py +0 -0
  218. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_path_traversal.py +0 -0
  219. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_scan_batching.py +0 -0
  220. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_tags_migration.py +0 -0
  221. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_security_tool.py +0 -0
  222. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_semgrep_engine.py +0 -0
  223. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_server.py +0 -0
  224. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_server_help_coverage.py +0 -0
  225. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_serverinfo_version.py +0 -0
  226. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_setup_tool.py +0 -0
  227. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_shares_state_edges.py +0 -0
  228. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_spot_check.py +0 -0
  229. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_sql_security.py +0 -0
  230. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_stdio_direct.py +0 -0
  231. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summarize_graph_dispatch.py +0 -0
  232. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summarizer.py +0 -0
  233. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_summary_schema.py +0 -0
  234. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_temporal.py +0 -0
  235. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_temporal_migration.py +0 -0
  236. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tested_by_edges.py +0 -0
  237. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools.py +0 -0
  238. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_build_error_coverage.py +0 -0
  239. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_full.py +0 -0
  240. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_tools_get_docs_section_coverage.py +0 -0
  241. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_typescript_coverage_gaps.py +0 -0
  242. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_v17_coverage_gaps.py +0 -0
  243. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_xpia.py +0 -0
  244. {better_code_review_graph-3.27.0 → better_code_review_graph-3.27.2}/tests/test_xpia_adversarial.py +0 -0
@@ -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.0",
4
+ "version": "3.27.2",
5
5
  "userConfig": {
6
6
  "EMBEDDING_MODELS": {
7
7
  "type": "string",
@@ -86,7 +86,7 @@ jobs:
86
86
  python-version: "3.13"
87
87
 
88
88
  - name: Install dependencies
89
- run: uv sync --group dev --no-sources
89
+ run: uv sync --group dev
90
90
 
91
91
  - name: Run Ruff check
92
92
  run: uv run --no-sync ruff check .
@@ -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, 7 tools: graph + query + review (3 main) + config + security + help + config__open_relay (mcp-core relay helper)
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 litellm passthrough (`mcp_core.llm`)
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 (7 tools: graph + query + review + config + security + help + config__open_relay)
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 (litellm passthrough, `mcp_core.llm`; order = fallback, empty = local). Fixed 768-dim storage.
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): 7 tools — graph (build/update/stats/embed/export/summarize), query (query/search/impact/large_functions/spot_check/renamed_in_diff/diff), review, config, security, help, config__open_relay (mcp-core relay helper). Returns structured dict payloads over MCP; the CLI serializes them as JSON.
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 both dispatch through
78
- `mcp_core.llm` (litellm passthrough, `n24q02m-mcp-core[llm]`). No native
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 = litellm fallback. Provider is inferred from the model prefix.
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 litellm convention `<PROVIDER>_API_KEY`. The 7 providers the server suggests:
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 = litellm fallback). Empty = summaries disabled. Provider is inferred from the model prefix and must expose a chat-completion API (Jina/Cohere do not).
136
- - Dispatches through `mcp_core.llm.completion`.
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, litellm via `mcp_core.llm`, numpy) -- tranh startup cost
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, 7 tools: graph + query + review (3 main) + config (incl. setup_*) + security + help + config__open_relay (mcp-core relay helper)
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 litellm passthrough (`mcp_core.llm`)
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 (7 tools: graph + query + review + config + security + help + config__open_relay)
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 (litellm passthrough, `mcp_core.llm`; order = fallback, empty = local). Fixed 768-dim storage.
72
- - **Server** (server.py): 7 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, config__open_relay (mcp-core relay helper). Returns structured dict payloads over MCP; the CLI serializes them as JSON.
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 `mcp_core.llm`
77
- (litellm passthrough, `n24q02m-mcp-core[llm]`). No native provider SDKs are
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 = litellm fallback. Provider is inferred from the model prefix.
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 litellm `<PROVIDER>_API_KEY`. 7 provider servers goi y:
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
- For any other litellm provider (used via env passthrough), see https://docs.litellm.ai/docs/providers/<provider> for its `<PROVIDER>_API_KEY` name. Summarizer providers must expose a chat-completion API (Jina/Cohere do not).
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, litellm via `mcp_core.llm`, numpy) -- tranh startup cost
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.0
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: in remote mode each authenticated
300
- subject's relay record supplies its models, endpoints and keys. Missing subject
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
- Seven tools, each grouping related actions to keep the tool surface small.
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, providers configured, and setup URL. |
382
- | `setup_start` | Start relay setup to configure API keys via browser (HTTP mode). |
383
- | `setup_skip` | Set local mode (skip relay permanently, use ONNX only). |
384
- | `setup_reset` | Clear credentials and reset state. |
385
- | `setup_complete` | Re-resolve credentials from environment variables. |
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. The
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 | 7 grouped tools: graph + query + review + config + security + help + config__open_relay |
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: in remote mode each authenticated
268
- subject's relay record supplies its models, endpoints and keys. Missing subject
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
- Seven tools, each grouping related actions to keep the tool surface small.
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, providers configured, and setup URL. |
350
- | `setup_start` | Start relay setup to configure API keys via browser (HTTP mode). |
351
- | `setup_skip` | Set local mode (skip relay permanently, use ONNX only). |
352
- | `setup_reset` | Clear credentials and reset state. |
353
- | `setup_complete` | Re-resolve credentials from environment variables. |
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. The
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 | 7 grouped tools: graph + query + review + config + security + help + config__open_relay |
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.0"
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 = "5262d54f4f0c1214dcedaef20531da98f9519bdf" }
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.0",
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.0",
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 as a litellm 'provider/model' string. Use SUMMARY_MODELS instead.",
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 relay setup URL (if any).
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
- Start relay setup session to configure API keys via browser.
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 permanently — relay will not trigger on next restart.
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
- Clear saved credentials and reset to awaiting_setup state.
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 credentials from current environment variables (picks up manually set API keys).
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. 7 tools: graph (build/embed/stats), "
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), config__open_relay (re-trigger relay form)."
169
+ "help (full docs)."
170
170
  ),
171
171
  )
172
172