better-code-review-graph 3.26.26__tar.gz → 3.27.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.claude-plugin/plugin.json +1 -1
  2. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/workflows/ci.yml +1 -1
  3. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/AGENTS.md +12 -14
  4. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CHANGELOG.md +43 -0
  5. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CLAUDE.md +11 -36
  6. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/PKG-INFO +12 -51
  7. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/README.md +10 -48
  8. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/005_temporal_columns.py +44 -1
  9. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/pyproject.toml +9 -17
  10. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/server.json +3 -3
  11. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/cli.py +59 -17
  12. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/config.py +33 -0
  13. better_code_review_graph-3.27.1/src/better_code_review_graph/credential_state.py +160 -0
  14. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/config.md +8 -5
  15. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/embeddings.py +138 -174
  16. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/server.py +87 -162
  17. better_code_review_graph-3.27.1/src/better_code_review_graph/summarizer.py +290 -0
  18. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/tools.py +6 -11
  19. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/conftest.py +22 -27
  20. better_code_review_graph-3.27.1/tests/integration/test_multi_user_remote.py +72 -0
  21. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cohere_dimensions.py +49 -45
  22. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_coverage_gaps.py +65 -54
  23. better_code_review_graph-3.27.1/tests/test_credential_state_dehosted.py +114 -0
  24. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_crg_protocol_harness.py +0 -1
  25. better_code_review_graph-3.27.1/tests/test_embedder_retry_classification.py +130 -0
  26. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embeddings.py +339 -159
  27. better_code_review_graph-3.27.1/tests/test_g6_ux_status_accuracy.py +120 -0
  28. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_oci_publication_sunset.py +15 -2
  29. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_source_text.py +27 -7
  30. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_server.py +7 -7
  31. better_code_review_graph-3.27.1/tests/test_setup_tool.py +197 -0
  32. better_code_review_graph-3.27.1/tests/test_summarizer.py +468 -0
  33. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_temporal_migration.py +57 -0
  34. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_v17_coverage_gaps.py +8 -7
  35. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/uv.lock +16 -489
  36. better_code_review_graph-3.26.26/src/better_code_review_graph/credential_state.py +0 -363
  37. better_code_review_graph-3.26.26/src/better_code_review_graph/relay_schema.py +0 -133
  38. better_code_review_graph-3.26.26/src/better_code_review_graph/relay_setup.py +0 -150
  39. better_code_review_graph-3.26.26/src/better_code_review_graph/summarizer.py +0 -325
  40. better_code_review_graph-3.26.26/tests/e2e_mcp_protocol_test.py +0 -289
  41. better_code_review_graph-3.26.26/tests/integration/test_multi_user_remote.py +0 -43
  42. better_code_review_graph-3.26.26/tests/test_config_open_relay_registered.py +0 -66
  43. better_code_review_graph-3.26.26/tests/test_credential_state.py +0 -435
  44. better_code_review_graph-3.26.26/tests/test_credential_state_stdio_no_fallback.py +0 -210
  45. better_code_review_graph-3.26.26/tests/test_credential_state_store_errors.py +0 -164
  46. better_code_review_graph-3.26.26/tests/test_embedder_retry_classification.py +0 -139
  47. better_code_review_graph-3.26.26/tests/test_g6_ux_status_accuracy.py +0 -120
  48. better_code_review_graph-3.26.26/tests/test_home_isolation.py +0 -113
  49. better_code_review_graph-3.26.26/tests/test_multi_user.py +0 -181
  50. better_code_review_graph-3.26.26/tests/test_multi_user_dispatch.py +0 -513
  51. better_code_review_graph-3.26.26/tests/test_per_plugin_storage_migration.py +0 -38
  52. better_code_review_graph-3.26.26/tests/test_relay_schema.py +0 -56
  53. better_code_review_graph-3.26.26/tests/test_relay_setup.py +0 -365
  54. better_code_review_graph-3.26.26/tests/test_setup_tool.py +0 -312
  55. better_code_review_graph-3.26.26/tests/test_summarizer.py +0 -967
  56. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/build-graph/SKILL.md +0 -0
  57. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/review-delta/SKILL.md +0 -0
  58. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.agents/skills/review-pr/SKILL.md +0 -0
  59. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.coderabbit.yaml +0 -0
  60. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.dockerignore +0 -0
  61. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/CODEOWNERS +0 -0
  62. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  63. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  64. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  65. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/review-learnings.md +0 -0
  66. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/rulesets/main.json +0 -0
  67. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.github/workflows/cd.yml +0 -0
  68. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.gitignore +0 -0
  69. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.infisical.json +0 -0
  70. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.jules/bolt.md +0 -0
  71. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.jules/sentinel.md +0 -0
  72. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/.pre-commit-config.yaml +0 -0
  73. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/BREAKING_CHANGES.md +0 -0
  74. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CODE_OF_CONDUCT.md +0 -0
  75. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/CONTRIBUTING.md +0 -0
  76. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/Dockerfile +0 -0
  77. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/LICENSE +0 -0
  78. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/LICENSE-MIT +0 -0
  79. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/NOTICE +0 -0
  80. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/SECURITY.md +0 -0
  81. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/alembic.ini +0 -0
  82. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/docs/HANDOVER.md +0 -0
  83. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/_graph_state.py +0 -0
  84. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/branch-sync-check.py +0 -0
  85. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/hooks.json +0 -0
  86. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/hooks/stale-graph-check.py +0 -0
  87. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/README +0 -0
  88. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/env.py +0 -0
  89. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/script.py.mako +0 -0
  90. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/001_baseline.py +0 -0
  91. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/002_summary_columns.py +0 -0
  92. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/003_federation.py +0 -0
  93. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/004_security_tags.py +0 -0
  94. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/migrations/versions/006_commits_table.py +0 -0
  95. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/renovate.json +0 -0
  96. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-22-path-traversal.yaml +0 -0
  97. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-78-shell-command-sink.yaml +0 -0
  98. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-89-sql-string-format.yaml +0 -0
  99. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/cwe-95-eval-on-input.yaml +0 -0
  100. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/heuristic/hardcoded-secret.yaml +0 -0
  101. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/rules/semgrep/curated.yaml +0 -0
  102. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/benchmark_row_deserialization.py +0 -0
  103. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/enforce-commit.sh +0 -0
  104. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/preserve-diacritics.py +0 -0
  105. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/scripts/test_preserve_diacritics.py +0 -0
  106. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/semantic-release.toml +0 -0
  107. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/impact-audit/SKILL.md +0 -0
  108. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/onboard-repo/SKILL.md +0 -0
  109. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/refactor-check/SKILL.md +0 -0
  110. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/review-delta/SKILL.md +0 -0
  111. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/review-pr/SKILL.md +0 -0
  112. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/skills/security-sweep/SKILL.md +0 -0
  113. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/smithery.yaml +0 -0
  114. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/__init__.py +0 -0
  115. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/__main__.py +0 -0
  116. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/__init__.py +0 -0
  117. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/graph.md +0 -0
  118. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/query.md +0 -0
  119. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/recipes.md +0 -0
  120. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/review.md +0 -0
  121. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/docs/security.md +0 -0
  122. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/exporter.py +0 -0
  123. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/federation.py +0 -0
  124. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/graph.py +0 -0
  125. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/importer.py +0 -0
  126. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/incremental.py +0 -0
  127. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/parser.py +0 -0
  128. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/py.typed +0 -0
  129. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/reranker.py +0 -0
  130. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/__init__.py +0 -0
  131. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/_types.py +0 -0
  132. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/fallback.py +0 -0
  133. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/go.py +0 -0
  134. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/java.py +0 -0
  135. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/python.py +0 -0
  136. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/rust.py +0 -0
  137. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/resolver/typescript.py +0 -0
  138. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/__init__.py +0 -0
  139. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/heuristic.py +0 -0
  140. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/security/semgrep_engine.py +0 -0
  141. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/temporal.py +0 -0
  142. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/src/better_code_review_graph/xpia.py +0 -0
  143. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/__init__.py +0 -0
  144. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/conftest_e2e.py +0 -0
  145. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/Sample.cs +0 -0
  146. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/SampleJava.java +0 -0
  147. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/callback_refs.js +0 -0
  148. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/caller_example.py +0 -0
  149. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/multi_call_example.py +0 -0
  150. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.c +0 -0
  151. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.cpp +0 -0
  152. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.kt +0 -0
  153. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.php +0 -0
  154. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.rb +0 -0
  155. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.sol +0 -0
  156. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample.swift +0 -0
  157. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_go.go +0 -0
  158. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_python.py +0 -0
  159. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_rust.rs +0 -0
  160. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/sample_typescript.ts +0 -0
  161. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/fixtures/test_sample.py +0 -0
  162. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/integration/__init__.py +0 -0
  163. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_alembic_baseline.py +0 -0
  164. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_as_of_diff.py +0 -0
  165. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_auto_resolve_ambiguity.py +0 -0
  166. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_bare_suffix_correctness.py +0 -0
  167. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_callers_not_found_reason.py +0 -0
  168. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_callers_of_coverage.py +0 -0
  169. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cli.py +0 -0
  170. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_cli_contracts.py +0 -0
  171. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_commits_migration.py +0 -0
  172. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_custom_local_model.py +0 -0
  173. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_dynamic_dispatch_hints.py +0 -0
  174. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_e2e.py +0 -0
  175. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embedding_migration.py +0 -0
  176. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_embeddings_extra.py +0 -0
  177. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_export_graph_dispatch.py +0 -0
  178. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_export_graph_dispatch_path_traversal.py +0 -0
  179. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_exporter.py +0 -0
  180. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation.py +0 -0
  181. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation_migration.py +0 -0
  182. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_federation_smoke.py +0 -0
  183. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_full_live.py +0 -0
  184. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_get_docs_section_error_path.py +0 -0
  185. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_get_review_context_no_diff.py +0 -0
  186. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph.py +0 -0
  187. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_batch_fetch.py +0 -0
  188. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_extra.py +0 -0
  189. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_get_edges_by_targets_coverage.py +0 -0
  190. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_graph_stats_error_coverage.py +0 -0
  191. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_handle_not_found_coverage.py +0 -0
  192. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_help_recipes.py +0 -0
  193. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_heuristic.py +0 -0
  194. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_impact_payload_truncation.py +0 -0
  195. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_implements_edges.py +0 -0
  196. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_import_graph_dispatch.py +0 -0
  197. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_importer.py +0 -0
  198. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_incremental.py +0 -0
  199. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_incremental_extra.py +0 -0
  200. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_kind_filter_optimization.py +0 -0
  201. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_kinds_error_path.py +0 -0
  202. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_list_graph_stats_coverage.py +0 -0
  203. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_list_kinds_coverage.py +0 -0
  204. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_live_mcp.py +0 -0
  205. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_local_reranker.py +0 -0
  206. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_lookup_node_directly.py +0 -0
  207. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_multilang.py +0 -0
  208. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_no_stale_package_name.py +0 -0
  209. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_oserror_coverage.py +0 -0
  210. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser.py +0 -0
  211. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_extra.py +0 -0
  212. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_parser_grammar_failure.py +0 -0
  213. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_path_resolution_fallback.py +0 -0
  214. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_payload_estimation.py +0 -0
  215. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_per_sub_graph_db.py +0 -0
  216. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_performance_n1.py +0 -0
  217. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_performance_n1_embeddings.py +0 -0
  218. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_phase_3_smoke.py +0 -0
  219. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_plugin_assets.py +0 -0
  220. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_pre_2_0_backup.py +0 -0
  221. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_renamed_in_diff.py +0 -0
  222. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_renamed_in_diff_exception.py +0 -0
  223. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_filter.py +0 -0
  224. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_filter_batching.py +0 -0
  225. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_repo_id_persistence.py +0 -0
  226. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolve_search_candidates.py +0 -0
  227. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_dispatcher.py +0 -0
  228. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_fallback.py +0 -0
  229. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_go.py +0 -0
  230. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_java.py +0 -0
  231. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_python.py +0 -0
  232. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_rust.py +0 -0
  233. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_resolver_typescript.py +0 -0
  234. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_response_header.py +0 -0
  235. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_response_payload_honesty.py +0 -0
  236. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_review_delta_line_shifts.py +0 -0
  237. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_review_languages_filter.py +0 -0
  238. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_reviewer_summary.py +0 -0
  239. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_search_edges_by_target_names.py +0 -0
  240. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_search_keyword_warning.py +0 -0
  241. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_injection.py +0 -0
  242. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_path_traversal.py +0 -0
  243. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_scan_batching.py +0 -0
  244. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_tags_migration.py +0 -0
  245. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_security_tool.py +0 -0
  246. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_semgrep_engine.py +0 -0
  247. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_server_help_coverage.py +0 -0
  248. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_serverinfo_version.py +0 -0
  249. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_shares_state_edges.py +0 -0
  250. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_spot_check.py +0 -0
  251. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_sql_security.py +0 -0
  252. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_stdio_direct.py +0 -0
  253. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_summarize_graph_dispatch.py +0 -0
  254. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_summary_schema.py +0 -0
  255. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_temporal.py +0 -0
  256. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tested_by_edges.py +0 -0
  257. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools.py +0 -0
  258. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_build_error_coverage.py +0 -0
  259. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_full.py +0 -0
  260. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_tools_get_docs_section_coverage.py +0 -0
  261. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_typescript_coverage_gaps.py +0 -0
  262. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/tests/test_xpia.py +0 -0
  263. {better_code_review_graph-3.26.26 → better_code_review_graph-3.27.1}/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.26.26",
4
+ "version": "3.27.1",
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,49 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v3.27.1 (2026-09-26)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **ci**: Keep uv sources for git-pinned hull-core
10
+ ([`0f8eec1`](https://github.com/n24q02m/crg/commit/0f8eec1ceddf33c93e40d299d750a2b8fd7eb3ae))
11
+
12
+ ### Chores
13
+
14
+ - Re-pin hull-core for chat null-content fallback
15
+ ([`d2d890f`](https://github.com/n24q02m/crg/commit/d2d890f9d32362c2282e651f8a00f2bbab985ef1))
16
+
17
+ - Scrub WP2 residuals (dead e2e script, open_relay string, doc sweep)
18
+ ([`debd924`](https://github.com/n24q02m/crg/commit/debd9247ec886cbe9322e0618ea475f83aecf6ac))
19
+
20
+
21
+ ## v3.27.0 (2026-09-26)
22
+
23
+ ### Bug Fixes
24
+
25
+ - **migrations**: 005 skip git guard for per-subject data-dir stores
26
+ ([`5944956`](https://github.com/n24q02m/crg/commit/5944956259acd70ce76d02dd160587dbb9fa832c))
27
+
28
+ - **server**: Drop dead _maybe_include_setup_hint hook (BYOK cut residual)
29
+ ([`87c9ce4`](https://github.com/n24q02m/crg/commit/87c9ce454501aaa2ec39373f3731739ae7247054))
30
+
31
+ - **server,tools**: Remove deleted-member imports on search/setup/http paths
32
+ ([`edc7b5f`](https://github.com/n24q02m/crg/commit/edc7b5f24d61bd1cf8eec1089396e269750694ab))
33
+
34
+ - **wp2**: Drop mcp-core entirely; port residual tests to hull seams
35
+ ([`91b1ddb`](https://github.com/n24q02m/crg/commit/91b1ddb20ca4957ef32bbf40b478c01a8419a5a7))
36
+
37
+ ### Features
38
+
39
+ - **wp2**: De-host onto hull-core — auth scoping, model cells, config bridge
40
+ ([`0683c62`](https://github.com/n24q02m/crg/commit/0683c62d88fbaf11aa8666a3adcf21cd357c9a63))
41
+
42
+ ### Testing
43
+
44
+ - Port suite to the post-de-host surface (hull cells, no litellm/relay)
45
+ ([`fd7795d`](https://github.com/n24q02m/crg/commit/fd7795da0f3ac268430e5d22cbef4756a2120f0d))
46
+
47
+
5
48
  ## v3.26.26 (2026-09-25)
6
49
 
7
50
  ### Bug Fixes
@@ -7,14 +7,12 @@ See `AGENTS.md` va `README.md` de hieu architecture va configuration.
7
7
  ## Cau truc
8
8
 
9
9
  - `src/better_code_review_graph/` -- Package chinh (src layout)
10
- - `server.py` -- FastMCP server, 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.26.26
3
+ Version: 3.27.1
4
4
  Summary: Token-efficient code review knowledge graph: semantic search and call-graph resolution.
5
5
  Author: n24q02m
6
6
  License-Expression: Apache-2.0
@@ -18,9 +18,8 @@ Requires-Dist: defusedxml>=0.7.1
18
18
  Requires-Dist: fastmcp<4,>=3.4.7
19
19
  Requires-Dist: fastretrieval<2,>=1.8.2
20
20
  Requires-Dist: httpx
21
- Requires-Dist: litellm>=1.102.0
21
+ Requires-Dist: hull-core
22
22
  Requires-Dist: mcp<2,>=1.30.0
23
- Requires-Dist: n24q02m-mcp-core[llm]==1.24.6
24
23
  Requires-Dist: networkx<4,>=3.7
25
24
  Requires-Dist: pydantic-settings
26
25
  Requires-Dist: pygments>=2.21.0
@@ -244,9 +243,6 @@ another provider. Summarizers require a chat-completion model.
244
243
  | `openrouter/` | `OPENROUTER_API_KEY` | <https://openrouter.ai/settings/keys> |
245
244
  | `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | <https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview> |
246
245
 
247
- Any other [litellm provider](https://docs.litellm.ai/docs/providers) works via
248
- its standard `<PROVIDER>_API_KEY`.
249
-
250
246
  ### Advanced
251
247
 
252
248
  | Variable | Purpose |
@@ -297,39 +293,15 @@ not invoke the reranker.
297
293
 
298
294
  Cohere embedding is paid. Authorize a bounded budget before a live index/query;
299
295
  the Minimax-free completion choice does not make embeddings free. This example
300
- does not add a process-wide model override: in remote mode each authenticated
301
- subject's relay record supplies its models, endpoints and keys. Missing subject
302
- credentials fail closed rather than inheriting the server environment.
296
+ does not add a process-wide model override: missing subject credentials fail
297
+ closed rather than inheriting the server environment.
303
298
 
304
299
  CRG currently has **no cloud rerank call**: `LOCAL_RERANK_MODEL` is its only
305
300
  reranking path. Setting `RERANK_MODELS` or `RERANK_API_BASE` does not enable one.
306
301
 
307
- You can also configure cloud keys interactively in HTTP mode via the relay
308
- setup form (`config(action="setup_start")` returns the browser URL). See the
309
- [modes overview](https://mcp.n24q02m.com/get-started/modes-overview/) and
310
- [multi-user setup](https://mcp.n24q02m.com/get-started/multi-user/).
311
-
312
- ### Workspace username (HTTP setup form)
313
-
314
- The relay setup form has an optional **workspace username** field. Entering the
315
- same username always lands you in the same per-`sub` bucket, so your keys and
316
- graph stay reachable across a re-authorization and across devices, instead of
317
- being tied to the one-off subject minted for each `/authorize` round-trip.
318
- Leaving it blank keeps the previous per-authorize behaviour.
319
-
320
- Trust boundary: when the form is gated by a *shared* `MCP_RELAY_PASSWORD`, the
321
- username is a partition key, not a secret -- anyone who knows that password can
322
- type any username and reach that bucket. That is fine for a trusted group; an
323
- untrusted multi-tenant deployment needs a per-user secret or delegated OAuth
324
- instead.
325
-
326
- **One-time migration:** existing users must re-enter their credentials once after
327
- this change. Nothing is deleted; credentials stored under the old random subject
328
- are simply no longer addressed.
329
-
330
302
  ## Tools
331
303
 
332
- 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.
333
305
 
334
306
  ### `graph` -- Graph lifecycle
335
307
 
@@ -379,11 +351,11 @@ Actions: `status` | `set` | `cache_clear` | `setup_status` | `setup_start` | `se
379
351
  | `status` | Server info: version, graph path, node/edge counts, embedding backend, embeddings count. |
380
352
  | `set` | Update a runtime setting (`key=log_level`). |
381
353
  | `cache_clear` | Remove all computed embeddings. |
382
- | `setup_status` | Show current credential state, providers configured, and setup URL. |
383
- | `setup_start` | Start relay setup to configure API keys via browser (HTTP mode). |
384
- | `setup_skip` | Set local mode (skip relay permanently, use ONNX only). |
385
- | `setup_reset` | Clear credentials and reset state. |
386
- | `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. |
387
359
 
388
360
  ### `security` -- Security scanning
389
361
 
@@ -406,13 +378,6 @@ Topics: `graph` | `query` | `review` | `config` | `security` | `recipes`
406
378
  Returns complete documentation for each tool. Use when the compressed
407
379
  descriptions above are insufficient.
408
380
 
409
- ### `config__open_relay` -- Re-trigger the relay setup form
410
-
411
- Registered automatically from [mcp-core](https://github.com/n24q02m/mcp-core).
412
- In HTTP mode it returns `<PUBLIC_URL>/authorize` so the agent can re-open the
413
- browser setup form (e.g. after credential expiry); in stdio mode it returns
414
- `status: 'stdio_unsupported'`.
415
-
416
381
  ## CLI
417
382
 
418
383
  The package installs two console scripts: **`crg`** (primary) and
@@ -452,12 +417,8 @@ crg security scan --engine heuristic
452
417
  | `query spot_check` / `query renamed_in_diff` / `query diff` | Inspect callsites, line shifts, or commit-to-commit graph changes. |
453
418
  | `review context` / `review delta` | Generate review context or diff buckets for a code change. |
454
419
  | `security scan` / `security report` / `security suppress` / `security rule_list` | Run and manage heuristic/Semgrep security findings. |
455
- | `config status` / `config delete` | Show or remove stored credential config (`--yes` skips confirmation). |
456
- | `doctor` | Environment self-check from shared `mcp-core` CLI. |
457
- | `relay status` / `relay open` / `relay reset` | Inspect, open, or clear the relay setup session. |
458
420
 
459
- CLI subcommands print structured JSON and exit non-zero on an error. The
460
- `config`, `doctor`, and `relay` subcommands come from shared `mcp-core`.
421
+ CLI subcommands print structured JSON and exit non-zero on an error.
461
422
 
462
423
 
463
424
  ## Features
@@ -470,7 +431,7 @@ What this fork fixes versus the upstream [code-review-graph](https://github.com/
470
431
  | callers_of/callees_of | Empty results (bare name targets) | Qualified name resolution + bare fallback |
471
432
  | Embedding | sentence-transformers + torch (1.1 GB) | fastretrieval ONNX + cloud (200 MB), dual-mode |
472
433
  | Output size | Unbounded (500K+ chars) | Paginated (max_results, truncated flag) |
473
- | Tool design | 9 individual tools | 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 |
474
435
  | Plugin hooks | Invalid PostEdit/PostGit | Valid PostToolUse |
475
436
 
476
437
  ## Comparison
@@ -211,9 +211,6 @@ another provider. Summarizers require a chat-completion model.
211
211
  | `openrouter/` | `OPENROUTER_API_KEY` | <https://openrouter.ai/settings/keys> |
212
212
  | `vertex_express/` | `GOOGLE_VERTEX_EXPRESS_API_KEY` | <https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview> |
213
213
 
214
- Any other [litellm provider](https://docs.litellm.ai/docs/providers) works via
215
- its standard `<PROVIDER>_API_KEY`.
216
-
217
214
  ### Advanced
218
215
 
219
216
  | Variable | Purpose |
@@ -264,39 +261,15 @@ not invoke the reranker.
264
261
 
265
262
  Cohere embedding is paid. Authorize a bounded budget before a live index/query;
266
263
  the Minimax-free completion choice does not make embeddings free. This example
267
- does not add a process-wide model override: 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
@@ -118,6 +118,15 @@ _SHA_RE = re.compile(r"^[0-9a-f]{40}$|^[0-9a-f]{64}$")
118
118
  # git-init its own tmp dir, which conflicts with tests that
119
119
  # construct ``tmp_path / ".git"`` themselves.
120
120
  #
121
+ # 3. The DB is a per-subject store under the crg data directory
122
+ # (``<CRG_DATA_DIR>/subs/<sub>/graph.db``, ``~/.crg`` default).
123
+ # Multi-user (hull mode-3) deployments scope each namespace's
124
+ # graph to its own data-directory DB precisely so it does NOT
125
+ # live inside any analyzed repo — there is no single HEAD to
126
+ # backfill with, so the sentinel is the correct value. Repo
127
+ # stores (``<repo>/.better-code-review-graph/graph.db``) still
128
+ # require git.
129
+ #
121
130
  # Production code paths leave ``CRG_TEST_ALLOW_NO_GIT`` unset, so the
122
131
  # migration still aborts with the actionable :class:`RuntimeError`
123
132
  # whenever a file-backed DB has no reachable repo — production data
@@ -152,6 +161,35 @@ def _extract_db_path_from_url(url: str) -> Path | None:
152
161
  return Path(raw).resolve()
153
162
 
154
163
 
164
+ def _data_dir_subs_base() -> Path:
165
+ """Return the resolved ``subs`` root of the crg data directory.
166
+
167
+ Mirrors ``credential_state._sub_data_dir``: ``$CRG_DATA_DIR`` when
168
+ set, otherwise ``~/.crg``. Per-subject stores (multi-user HTTP
169
+ mode) live at ``<base>/subs/<sub>/graph.db`` under this root.
170
+ """
171
+ base = Path(os.environ.get("CRG_DATA_DIR", str(Path.home() / ".crg")))
172
+ return (base / "subs").resolve()
173
+
174
+
175
+ def _is_data_dir_store(db_path: Path) -> bool:
176
+ """True iff ``db_path`` is a per-subject store under the crg data dir.
177
+
178
+ Multi-user (hull mode-3) deployments scope each namespace's graph to
179
+ ``<CRG_DATA_DIR>/subs/<sub>/graph.db`` — a data-directory DB that
180
+ intentionally does NOT live inside any analyzed repo (the analyzed
181
+ repo directory is not a safe shared location for a per-tenant DB).
182
+ Such a store has no single HEAD to backfill ``valid_from_sha``
183
+ with, so the 40-zero sentinel applies. Repo stores
184
+ (``<repo>/.better-code-review-graph/graph.db``) keep the hard git
185
+ requirement enforced by :func:`_find_repo_root`.
186
+ """
187
+ try:
188
+ return db_path.resolve().is_relative_to(_data_dir_subs_base())
189
+ except (OSError, ValueError):
190
+ return False
191
+
192
+
155
193
  def _find_repo_root(db_path: Path) -> Path:
156
194
  """Walk parents of ``db_path`` looking for a ``.git`` entry.
157
195
 
@@ -291,7 +329,10 @@ def _resolve_head_sha() -> str:
291
329
  process so the value is only the DDL default for transient tests, OR
292
330
  * the file-backed DB has no reachable ``.git`` ancestor AND the
293
331
  operator has opted in to the test-only escape hatch via
294
- ``CRG_TEST_ALLOW_NO_GIT=1``.
332
+ ``CRG_TEST_ALLOW_NO_GIT=1``, OR
333
+ * the DB is a per-subject store under the crg data directory
334
+ (``<CRG_DATA_DIR>/subs/<sub>/graph.db``) — a data-directory DB
335
+ intentionally outside every repo, so there is no HEAD to read.
295
336
 
296
337
  File-backed DBs without a reachable ``.git`` ancestor and without
297
338
  the test escape hatch still raise the actionable
@@ -307,6 +348,8 @@ def _resolve_head_sha() -> str:
307
348
  db_path = _extract_db_path_from_url(url)
308
349
  if db_path is None:
309
350
  return _IN_MEMORY_SENTINEL_SHA
351
+ if _is_data_dir_store(db_path):
352
+ return _IN_MEMORY_SENTINEL_SHA
310
353
  try:
311
354
  repo_root = _find_repo_root(db_path)
312
355
  return _read_head_sha(repo_root)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "better-code-review-graph"
7
- version = "3.26.26"
7
+ version = "3.27.1"
8
8
  description = "Token-efficient code review knowledge graph: semantic search and call-graph resolution."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = "Apache-2.0"
@@ -27,27 +27,19 @@ dependencies = [
27
27
  "fastretrieval>=1.8.2,<2",
28
28
  "httpx",
29
29
  "pydantic-settings",
30
- # Floor tracks the current mcp-core stable for cascade parity with
31
- # wet/mnemo. Carries the build_cli `config`/`doctor` PerPluginStore key
32
- # fix (#666) for servers whose plugin slug differs from server_name
33
- # (this repo's slug == server_name already, so no CLI regression here).
34
- # Keep this on a stable release -- a prerelease floor such as 1.20.0b2
35
- # sorts below its own stable under PEP 440 and does not require it.
36
- "n24q02m-mcp-core[llm]==1.24.6",
37
- # litellm security floor (transitive via mcp-core[llm]). 1.83.x-1.87.x carry 4
38
- # advisories in litellm's PROXY server: GHSA-r75f-5x8p-qvmc (SQLi in proxy key
39
- # verify), GHSA-xqmj-j6mv-4862 (SSTI /prompts/test), GHSA-v4p8-mg3p-g94g (cmd-exec
40
- # proxy MCP endpoints), GHSA-wxxx-gvqv-xp7p (sandbox escape custom-code guardrail).
41
- # We use litellm LIBRARY mode only (no proxy) so none are in our attack surface,
42
- # but Dependency Review flags the package version. 1.88.0+ clears all four.
43
- # crg's optional semgrep extra otherwise pins the resolver to litellm 1.83.0; this
44
- # floor lifts it (semgrep resolves to 1.79.x, fine for a dev-only SAST tool).
45
- "litellm>=1.102.0",
30
+ # De-hosted shared core (WP1): token auth (3 modes), per-task model cells
31
+ # (plain-HTTP OpenAI-spec, no litellm), server lifecycle lock. Vendored via
32
+ # git because hull-core is not published to PyPI (spec 2026-09-26 §3);
33
+ # rev pins the WP1-verified hull commit.
34
+ "hull-core",
46
35
  "Pygments>=2.21.0",
47
36
  "alembic>=1.20.0,<2",
48
37
  "defusedxml>=0.7.1",
49
38
  ]
50
39
 
40
+ [tool.uv.sources]
41
+ hull-core = { git = "https://github.com/n24q02m/hull", subdirectory = "packages/core-py", rev = "14841d05488c801d303b0f3d3cd97426f94a6e1a" }
42
+
51
43
  [project.scripts]
52
44
  better-code-review-graph = "better_code_review_graph.cli:main"
53
45
  crg = "better_code_review_graph.cli:main"
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/n24q02m/crg.git",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.26.26",
9
+ "version": "3.27.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "pypi",
13
13
  "identifier": "better-code-review-graph",
14
- "version": "3.26.26",
14
+ "version": "3.27.1",
15
15
  "runtimeHint": "uvx",
16
16
  "runtimeArgs": [
17
17
  "--python",
@@ -100,7 +100,7 @@
100
100
  "name": "LLM_API_BASE"
101
101
  },
102
102
  {
103
- "description": "DEPRECATED (honored one release): single summarizer model 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"