codegraph-brain 0.19.0__tar.gz → 0.21.0__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 (366) hide show
  1. codegraph_brain-0.21.0/.github/test-count-baseline +1 -0
  2. codegraph_brain-0.21.0/.release-please-manifest.json +3 -0
  3. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CHANGELOG.md +32 -0
  4. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/PKG-INFO +24 -17
  5. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/README.md +23 -16
  6. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/diagrams/pipeline_flow.mermaid +13 -8
  7. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/MCP_REFERENCE.md +18 -8
  8. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/pyproject.toml +1 -1
  9. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/mcp_server.py +66 -24
  10. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/cli.py +59 -40
  11. codegraph_brain-0.21.0/src/cgis/core/coverage.py +57 -0
  12. codegraph_brain-0.21.0/src/cgis/core/js_globals.py +116 -0
  13. codegraph_brain-0.21.0/src/cgis/extractors/_typescript_bindings.py +155 -0
  14. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/typescript_extractor.py +4 -0
  15. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/pipeline.py +167 -35
  16. codegraph_brain-0.21.0/src/cgis/query/engine.py +340 -0
  17. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/graph_json.py +16 -3
  18. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/engine.py +32 -9
  19. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/indices.py +27 -1
  20. codegraph_brain-0.21.0/src/cgis/resolver/js_builtins.py +44 -0
  21. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/storage/sqlite_store.py +80 -7
  22. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_annotation_calibration.py +7 -2
  23. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_self_parse_ts.py +58 -1
  24. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_cli.py +176 -0
  25. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_graph_json.py +28 -0
  26. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_mcp_server.py +68 -0
  27. codegraph_brain-0.21.0/tests/unit/test_pipeline_incremental_symbols.py +332 -0
  28. codegraph_brain-0.21.0/tests/unit/test_query_coverage.py +395 -0
  29. codegraph_brain-0.21.0/tests/unit/test_resolver_js_builtins.py +230 -0
  30. codegraph_brain-0.21.0/tests/unit/test_resolver_language_scope.py +128 -0
  31. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/uv.lock +1 -1
  32. codegraph_brain-0.19.0/.github/test-count-baseline +0 -1
  33. codegraph_brain-0.19.0/.release-please-manifest.json +0 -3
  34. codegraph_brain-0.19.0/src/cgis/query/engine.py +0 -170
  35. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.claude-plugin/marketplace.json +0 -0
  36. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.gitattributes +0 -0
  37. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/autodoc.yml +0 -0
  38. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/ci.yml +0 -0
  39. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/guardian.yml +0 -0
  40. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/pr-title.yml +0 -0
  41. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/release-please.yml +0 -0
  42. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.gitignore +0 -0
  43. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.pre-commit-config.yaml +0 -0
  44. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.python-version +0 -0
  45. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CLAUDE.md +0 -0
  46. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CONTRIBUTING.md +0 -0
  47. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/LICENSE +0 -0
  48. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/Makefile +0 -0
  49. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/PRIVACY.md +0 -0
  50. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/CURATION.md +0 -0
  51. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/calibration.jsonl +0 -0
  52. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
  53. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
  54. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
  55. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
  56. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
  57. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
  58. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
  59. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
  60. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
  61. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-122.yaml +0 -0
  62. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-140.yaml +0 -0
  63. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-141.yaml +0 -0
  64. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-142.yaml +0 -0
  65. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-143.yaml +0 -0
  66. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-144.yaml +0 -0
  67. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-278.yaml +0 -0
  68. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-313.yaml +0 -0
  69. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/results.jsonl +0 -0
  70. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/README.md +0 -0
  71. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/cal_dot_com.json +0 -0
  72. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/discourse.json +0 -0
  73. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/grafana.json +0 -0
  74. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/keycloak.json +0 -0
  75. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/sentry.json +0 -0
  76. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-judged.jsonl +0 -0
  77. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
  78. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
  79. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run1.jsonl +0 -0
  80. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run2.jsonl +0 -0
  81. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run3.jsonl +0 -0
  82. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-plan.json +0 -0
  83. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
  84. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
  85. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-reviews.jsonl +0 -0
  86. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/data/.gitkeep +0 -0
  87. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/AUDIT.md +0 -0
  88. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/CASE_STUDY.md +0 -0
  89. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
  90. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
  91. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
  92. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/ONTOLOGY.md +0 -0
  93. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
  94. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
  95. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/health_badge.json +0 -0
  96. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/.gitignore +0 -0
  97. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/cgis-app-avatar.png +0 -0
  98. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/cgis-app-avatar.svg +0 -0
  99. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/generate_avatar.py +0 -0
  100. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/examples/.gitkeep +0 -0
  101. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
  102. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/CLI_USAGE.md +0 -0
  103. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
  104. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/.gitkeep +0 -0
  105. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/core.yaml +0 -0
  106. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/domains.yaml +0 -0
  107. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/patterns.yaml +0 -0
  108. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/tolerances.lock +0 -0
  109. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
  110. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
  111. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
  112. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
  113. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
  114. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
  115. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
  116. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
  117. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
  118. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
  119. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
  120. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
  121. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
  122. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
  123. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
  124. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
  125. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
  126. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
  127. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
  128. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
  129. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
  130. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
  131. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
  132. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
  133. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
  134. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
  135. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
  136. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
  137. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
  138. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
  139. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
  140. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
  141. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
  142. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/BLUEPRINT.md +0 -0
  143. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/PRD.md +0 -0
  144. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/TDD.md +0 -0
  145. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
  146. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
  147. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
  148. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
  149. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
  150. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
  151. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
  152. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
  153. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
  154. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
  155. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
  156. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
  157. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
  158. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
  159. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
  160. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
  161. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
  162. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
  163. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
  164. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
  165. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/main.py +0 -0
  166. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/.claude-plugin/plugin.json +0 -0
  167. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/.mcp.json +0 -0
  168. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/README.md +0 -0
  169. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/skills/cgis/SKILL.md +0 -0
  170. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/skills/ingest/SKILL.md +0 -0
  171. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/release-please-config.json +0 -0
  172. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/backfill_calibration_fingerprint.py +0 -0
  173. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/backfill_review_fingerprint.py +0 -0
  174. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/check_pytest_raises.py +0 -0
  175. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/check_test_count.py +0 -0
  176. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/colab_bench.sh +0 -0
  177. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/gen_ideal_graph.py +0 -0
  178. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_health.py +0 -0
  179. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_mcp_ref.py +0 -0
  180. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_schema_docs.py +0 -0
  181. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_bench.py +0 -0
  182. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_calibrate.py +0 -0
  183. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_martian.py +0 -0
  184. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_replay_skeptic.py +0 -0
  185. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_review.py +0 -0
  186. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/inject_readme_graph.py +0 -0
  187. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/ollama_visitor.sh +0 -0
  188. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/probe_closure_gap.py +0 -0
  189. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/probe_tier_ladder.py +0 -0
  190. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/recordings_from_corpus.py +0 -0
  191. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/skeptic_arms.py +0 -0
  192. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/__init__.py +0 -0
  193. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/__main__.py +0 -0
  194. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/.gitkeep +0 -0
  195. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/__init__.py +0 -0
  196. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/.gitkeep +0 -0
  197. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/freshness.py +0 -0
  198. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/generated.py +0 -0
  199. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/models.py +0 -0
  200. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/paths.py +0 -0
  201. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/.gitkeep +0 -0
  202. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_annotations.py +0 -0
  203. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_ast.py +0 -0
  204. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_classes.py +0 -0
  205. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_functions.py +0 -0
  206. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_imports.py +0 -0
  207. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_types.py +0 -0
  208. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/base.py +0 -0
  209. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/python_extractor.py +0 -0
  210. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/registry.py +0 -0
  211. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/__init__.py +0 -0
  212. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/axes.py +0 -0
  213. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/bench.py +0 -0
  214. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/calibrate.py +0 -0
  215. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/chunked.py +0 -0
  216. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/chunker.py +0 -0
  217. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/collector.py +0 -0
  218. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/core.py +0 -0
  219. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/diff_index.py +0 -0
  220. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/evidence.py +0 -0
  221. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/findings.py +0 -0
  222. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/github_poster.py +0 -0
  223. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/martian.py +0 -0
  224. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/metrics.py +0 -0
  225. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/prompts.py +0 -0
  226. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/__init__.py +0 -0
  227. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/base.py +0 -0
  228. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/gemini.py +0 -0
  229. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/mistral.py +0 -0
  230. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/ollama.py +0 -0
  231. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/openrouter.py +0 -0
  232. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/recording.py +0 -0
  233. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/render.py +0 -0
  234. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/review_fingerprint.py +0 -0
  235. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/runner.py +0 -0
  236. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/skeptic.py +0 -0
  237. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/py.typed +0 -0
  238. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/__init__.py +0 -0
  239. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/analyzer.py +0 -0
  240. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/anomaly.py +0 -0
  241. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/cohesion.py +0 -0
  242. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/health.py +0 -0
  243. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/suggest_service.py +0 -0
  244. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/__init__.py +0 -0
  245. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/audit.py +0 -0
  246. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/context_service.py +0 -0
  247. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/orphans.py +0 -0
  248. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/prompt.py +0 -0
  249. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/snippet.py +0 -0
  250. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/__init__.py +0 -0
  251. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/_scc.py +0 -0
  252. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/drift.py +0 -0
  253. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/drift_service.py +0 -0
  254. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/fingerprint.py +0 -0
  255. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/fractal.py +0 -0
  256. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/ontology_init.py +0 -0
  257. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/quotient.py +0 -0
  258. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/triads.py +0 -0
  259. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/fqn.py +0 -0
  260. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/__init__.py +0 -0
  261. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/mermaid.py +0 -0
  262. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/metrics.py +0 -0
  263. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/.gitkeep +0 -0
  264. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/__init__.py +0 -0
  265. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/symbols.py +0 -0
  266. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/uplift.py +0 -0
  267. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/storage/.gitkeep +0 -0
  268. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/integration/.gitkeep +0 -0
  269. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/.gitkeep +0 -0
  270. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/__init__.py +0 -0
  271. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/conftest.py +0 -0
  272. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_architecture.py +0 -0
  273. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_drift.py +0 -0
  274. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_fractal.py +0 -0
  275. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
  276. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
  277. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_self_parse.py +0 -0
  278. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_suggest.py +0 -0
  279. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/.gitkeep +0 -0
  280. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/conftest.py +0 -0
  281. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/guardian_stubs.py +0 -0
  282. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/review_path_inventory.txt +0 -0
  283. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test___main__.py +0 -0
  284. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_analyzer.py +0 -0
  285. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_annotation_edges.py +0 -0
  286. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_audit.py +0 -0
  287. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
  288. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
  289. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_check_pytest_raises.py +0 -0
  290. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_check_test_count.py +0 -0
  291. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_cohesion.py +0 -0
  292. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_context_service.py +0 -0
  293. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_di_acceptance.py +0 -0
  294. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_drift.py +0 -0
  295. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_drift_service.py +0 -0
  296. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_extractor_registry.py +0 -0
  297. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fingerprint.py +0 -0
  298. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fqn.py +0 -0
  299. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fractal.py +0 -0
  300. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_freshness.py +0 -0
  301. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_gen_ideal_graph.py +0 -0
  302. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_generate_mcp_ref.py +0 -0
  303. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_generated.py +0 -0
  304. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_axes.py +0 -0
  305. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_bench.py +0 -0
  306. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_bench_script.py +0 -0
  307. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_calibrate.py +0 -0
  308. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
  309. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_chunked.py +0 -0
  310. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_chunker.py +0 -0
  311. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_collector.py +0 -0
  312. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_core.py +0 -0
  313. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_diff_index.py +0 -0
  314. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_evidence.py +0 -0
  315. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_findings.py +0 -0
  316. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian.py +0 -0
  317. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian_script.py +0 -0
  318. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian_union.py +0 -0
  319. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_metrics.py +0 -0
  320. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
  321. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
  322. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
  323. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_openrouter.py +0 -0
  324. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_poster.py +0 -0
  325. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_providers.py +0 -0
  326. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_providers_name.py +0 -0
  327. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_recording.py +0 -0
  328. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_render.py +0 -0
  329. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
  330. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_review_script.py +0 -0
  331. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_runner.py +0 -0
  332. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_salvage.py +0 -0
  333. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_skeptic.py +0 -0
  334. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_health_scorer.py +0 -0
  335. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_import_acceptance.py +0 -0
  336. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_mermaid.py +0 -0
  337. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_metrics.py +0 -0
  338. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_models.py +0 -0
  339. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_name_load_positions.py +0 -0
  340. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_ontology_compliance.py +0 -0
  341. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_ontology_init.py +0 -0
  342. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_orphans.py +0 -0
  343. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_paths.py +0 -0
  344. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_patterns_yaml.py +0 -0
  345. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_pipeline.py +0 -0
  346. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_prompt.py +0 -0
  347. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_python_annotations.py +0 -0
  348. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_python_extractor.py +0 -0
  349. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_quotient.py +0 -0
  350. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_recordings_from_corpus.py +0 -0
  351. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver.py +0 -0
  352. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver_indices.py +0 -0
  353. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver_symbols.py +0 -0
  354. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
  355. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
  356. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
  357. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_record.py +0 -0
  358. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_self_types.py +0 -0
  359. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_skeptic_arms.py +0 -0
  360. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_snippet.py +0 -0
  361. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_sqlite_store.py +0 -0
  362. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_suggest_service.py +0 -0
  363. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_temperature_source.py +0 -0
  364. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_triads.py +0 -0
  365. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_typescript_extractor.py +0 -0
  366. {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_uplift.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.21.0"
3
+ }
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.21.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.20.0...codegraph-brain-v0.21.0) (2026-09-16)
4
+
5
+
6
+ ### Features
7
+
8
+ * **resolver:** resolve JS/TS runtime globals into js_builtins.* ([#111](https://github.com/zaebee/codegraph-brain/issues/111)) ([#453](https://github.com/zaebee/codegraph-brain/issues/453)) ([84e790b](https://github.com/zaebee/codegraph-brain/commit/84e790b404f7a515e048f7a2370b8865b71912ff))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **cli:** a full ingest into a database records file hashes ([#461](https://github.com/zaebee/codegraph-brain/issues/461)) ([e0a4a5e](https://github.com/zaebee/codegraph-brain/commit/e0a4a5ec34f8b0b34220f3f318ce0edc99ed1d9b))
14
+ * **pipeline:** rebuild when a change alters what other files resolve against ([#38](https://github.com/zaebee/codegraph-brain/issues/38)) ([#458](https://github.com/zaebee/codegraph-brain/issues/458)) ([8126fd6](https://github.com/zaebee/codegraph-brain/commit/8126fd6377c82613f9f8a76f33253a8cd9e636f0))
15
+ * **resolver:** Python stdlib names are STDLIB only in Python sources ([#454](https://github.com/zaebee/codegraph-brain/issues/454)) ([#457](https://github.com/zaebee/codegraph-brain/issues/457)) ([15e7ba1](https://github.com/zaebee/codegraph-brain/commit/15e7ba17ae49e2e3c10a2ef9f6cf1f11e663edfb))
16
+
17
+
18
+ ### Documentation
19
+
20
+ * auto-sync architecture graph and MCP reference ([#456](https://github.com/zaebee/codegraph-brain/issues/456)) ([ae24054](https://github.com/zaebee/codegraph-brain/commit/ae24054361935dbb1a1f9471eea7b4b949ab8a10))
21
+ * auto-sync architecture graph and MCP reference ([#460](https://github.com/zaebee/codegraph-brain/issues/460)) ([a341063](https://github.com/zaebee/codegraph-brain/commit/a3410631511802bdc9851decadbbbf25b40d8d22))
22
+
23
+ ## [0.20.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.19.0...codegraph-brain-v0.20.0) (2026-09-11)
24
+
25
+
26
+ ### Features
27
+
28
+ * **query:** a traversal says how much of its neighbourhood resolved ([#201](https://github.com/zaebee/codegraph-brain/issues/201)) ([#448](https://github.com/zaebee/codegraph-brain/issues/448)) ([0c63469](https://github.com/zaebee/codegraph-brain/commit/0c634697789f5264316c8a218e993f13a9a0f73f))
29
+
30
+
31
+ ### Documentation
32
+
33
+ * auto-sync architecture graph and MCP reference ([#449](https://github.com/zaebee/codegraph-brain/issues/449)) ([e9eccae](https://github.com/zaebee/codegraph-brain/commit/e9eccae8d43e8dc264ca87f8ea0a45752471f079))
34
+
3
35
  ## [0.19.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.18.0...codegraph-brain-v0.19.0) (2026-09-09)
4
36
 
5
37
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codegraph-brain
3
- Version: 0.19.0
3
+ Version: 0.21.0
4
4
  Summary: Semantic code graph for AI agents — deterministic FQN resolution, impact analysis and architectural drift gates, exposed over MCP.
5
5
  Project-URL: Homepage, https://github.com/zaebee/codegraph-brain
6
6
  Project-URL: Repository, https://github.com/zaebee/codegraph-brain
@@ -202,31 +202,36 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
202
202
  models_Node["Node (models.py:85)"]:::classNode
203
203
  end
204
204
  subgraph sg_pipeline["pipeline.py"]
205
- pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:252)"]:::methodNode
206
- pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:192)"]:::methodNode
207
- pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:211)"]:::methodNode
208
- pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:157)"]:::methodNode
209
- pipeline_IngestionPipeline_run["run (pipeline.py:53)"]:::methodNode
205
+ pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:249)"]:::methodNode
206
+ pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:384)"]:::methodNode
207
+ pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:310)"]:::methodNode
208
+ pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:334)"]:::methodNode
209
+ pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:212)"]:::methodNode
210
+ pipeline_IngestionPipeline_run["run (pipeline.py:99)"]:::methodNode
211
+ pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:82)"]:::methodNode
210
212
  end
211
213
  subgraph sg_engine["engine.py"]
212
- engine_ResolverEngine["ResolverEngine (engine.py:19)"]:::classNode
213
- engine_ResolverEngine_resolve["resolve (engine.py:36)"]:::methodNode
214
+ engine_ResolverEngine["ResolverEngine (engine.py:20)"]:::classNode
215
+ engine_ResolverEngine_resolve["resolve (engine.py:37)"]:::methodNode
214
216
  end
215
217
  subgraph sg_uplift["uplift.py"]
216
218
  uplift_SemanticUpliftEngine["SemanticUpliftEngine (uplift.py:66)"]:::classNode
217
219
  uplift_SemanticUpliftEngine_execute_uplift["execute_uplift (uplift.py:91)"]:::methodNode
218
220
  end
219
221
  subgraph sg_sqlite_store["sqlite_store.py"]
220
- sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:40)"]:::classNode
222
+ sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:42)"]:::classNode
221
223
  end
222
224
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Node
223
225
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Edge
224
226
  pipeline_IngestionPipeline_run -->|REFERENCES| sqlite_store_SQLiteStore
227
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_workspace_root
225
228
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_get_extractor
226
229
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_process_file
227
230
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_is_noop_incremental
228
231
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine
229
232
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine_resolve
233
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_cross_file_inputs_changed
234
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_run
230
235
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_persist_incremental
231
236
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine_execute_uplift
232
237
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine
@@ -236,16 +241,18 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
236
241
  |--------|------|------|
237
242
  | `Node` | CLASS | [`models.py:85`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L85) |
238
243
  | `Edge` | CLASS | [`models.py:142`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L142) |
239
- | `run` | METHOD | [`pipeline.py:53`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L53) |
240
- | `_process_file` | METHOD | [`pipeline.py:157`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L157) |
241
- | `_is_noop_incremental` | METHOD | [`pipeline.py:192`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L192) |
242
- | `_persist_incremental` | METHOD | [`pipeline.py:211`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L211) |
243
- | `_get_extractor` | METHOD | [`pipeline.py:252`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L252) |
244
- | `ResolverEngine` | CLASS | [`engine.py:19`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L19) |
245
- | `resolve` | METHOD | [`engine.py:36`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L36) |
244
+ | `workspace_root` | METHOD | [`pipeline.py:82`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L82) |
245
+ | `run` | METHOD | [`pipeline.py:99`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L99) |
246
+ | `_process_file` | METHOD | [`pipeline.py:212`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L212) |
247
+ | `_cross_file_inputs_changed` | METHOD | [`pipeline.py:249`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L249) |
248
+ | `_is_noop_incremental` | METHOD | [`pipeline.py:310`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L310) |
249
+ | `_persist_incremental` | METHOD | [`pipeline.py:334`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L334) |
250
+ | `_get_extractor` | METHOD | [`pipeline.py:384`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L384) |
251
+ | `ResolverEngine` | CLASS | [`engine.py:20`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L20) |
252
+ | `resolve` | METHOD | [`engine.py:37`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L37) |
246
253
  | `SemanticUpliftEngine` | CLASS | [`uplift.py:66`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L66) |
247
254
  | `execute_uplift` | METHOD | [`uplift.py:91`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L91) |
248
- | `SQLiteStore` | CLASS | [`sqlite_store.py:40`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/storage/sqlite_store.py#L40) |
255
+ | `SQLiteStore` | CLASS | [`sqlite_store.py:42`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/storage/sqlite_store.py#L42) |
249
256
  <!-- END_CGIS_GRAPH -->
250
257
 
251
258
  ---
@@ -152,31 +152,36 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
152
152
  models_Node["Node (models.py:85)"]:::classNode
153
153
  end
154
154
  subgraph sg_pipeline["pipeline.py"]
155
- pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:252)"]:::methodNode
156
- pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:192)"]:::methodNode
157
- pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:211)"]:::methodNode
158
- pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:157)"]:::methodNode
159
- pipeline_IngestionPipeline_run["run (pipeline.py:53)"]:::methodNode
155
+ pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:249)"]:::methodNode
156
+ pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:384)"]:::methodNode
157
+ pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:310)"]:::methodNode
158
+ pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:334)"]:::methodNode
159
+ pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:212)"]:::methodNode
160
+ pipeline_IngestionPipeline_run["run (pipeline.py:99)"]:::methodNode
161
+ pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:82)"]:::methodNode
160
162
  end
161
163
  subgraph sg_engine["engine.py"]
162
- engine_ResolverEngine["ResolverEngine (engine.py:19)"]:::classNode
163
- engine_ResolverEngine_resolve["resolve (engine.py:36)"]:::methodNode
164
+ engine_ResolverEngine["ResolverEngine (engine.py:20)"]:::classNode
165
+ engine_ResolverEngine_resolve["resolve (engine.py:37)"]:::methodNode
164
166
  end
165
167
  subgraph sg_uplift["uplift.py"]
166
168
  uplift_SemanticUpliftEngine["SemanticUpliftEngine (uplift.py:66)"]:::classNode
167
169
  uplift_SemanticUpliftEngine_execute_uplift["execute_uplift (uplift.py:91)"]:::methodNode
168
170
  end
169
171
  subgraph sg_sqlite_store["sqlite_store.py"]
170
- sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:40)"]:::classNode
172
+ sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:42)"]:::classNode
171
173
  end
172
174
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Node
173
175
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Edge
174
176
  pipeline_IngestionPipeline_run -->|REFERENCES| sqlite_store_SQLiteStore
177
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_workspace_root
175
178
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_get_extractor
176
179
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_process_file
177
180
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_is_noop_incremental
178
181
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine
179
182
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine_resolve
183
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_cross_file_inputs_changed
184
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_run
180
185
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_persist_incremental
181
186
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine_execute_uplift
182
187
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine
@@ -186,16 +191,18 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
186
191
  |--------|------|------|
187
192
  | `Node` | CLASS | [`models.py:85`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L85) |
188
193
  | `Edge` | CLASS | [`models.py:142`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L142) |
189
- | `run` | METHOD | [`pipeline.py:53`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L53) |
190
- | `_process_file` | METHOD | [`pipeline.py:157`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L157) |
191
- | `_is_noop_incremental` | METHOD | [`pipeline.py:192`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L192) |
192
- | `_persist_incremental` | METHOD | [`pipeline.py:211`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L211) |
193
- | `_get_extractor` | METHOD | [`pipeline.py:252`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L252) |
194
- | `ResolverEngine` | CLASS | [`engine.py:19`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L19) |
195
- | `resolve` | METHOD | [`engine.py:36`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L36) |
194
+ | `workspace_root` | METHOD | [`pipeline.py:82`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L82) |
195
+ | `run` | METHOD | [`pipeline.py:99`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L99) |
196
+ | `_process_file` | METHOD | [`pipeline.py:212`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L212) |
197
+ | `_cross_file_inputs_changed` | METHOD | [`pipeline.py:249`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L249) |
198
+ | `_is_noop_incremental` | METHOD | [`pipeline.py:310`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L310) |
199
+ | `_persist_incremental` | METHOD | [`pipeline.py:334`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L334) |
200
+ | `_get_extractor` | METHOD | [`pipeline.py:384`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L384) |
201
+ | `ResolverEngine` | CLASS | [`engine.py:20`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L20) |
202
+ | `resolve` | METHOD | [`engine.py:37`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L37) |
196
203
  | `SemanticUpliftEngine` | CLASS | [`uplift.py:66`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L66) |
197
204
  | `execute_uplift` | METHOD | [`uplift.py:91`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L91) |
198
- | `SQLiteStore` | CLASS | [`sqlite_store.py:40`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/storage/sqlite_store.py#L40) |
205
+ | `SQLiteStore` | CLASS | [`sqlite_store.py:42`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/storage/sqlite_store.py#L42) |
199
206
  <!-- END_CGIS_GRAPH -->
200
207
 
201
208
  ---
@@ -12,31 +12,36 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
12
12
  models_Node["Node (models.py:85)"]:::classNode
13
13
  end
14
14
  subgraph sg_pipeline["pipeline.py"]
15
- pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:252)"]:::methodNode
16
- pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:192)"]:::methodNode
17
- pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:211)"]:::methodNode
18
- pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:157)"]:::methodNode
19
- pipeline_IngestionPipeline_run["run (pipeline.py:53)"]:::methodNode
15
+ pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:249)"]:::methodNode
16
+ pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:384)"]:::methodNode
17
+ pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:310)"]:::methodNode
18
+ pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:334)"]:::methodNode
19
+ pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:212)"]:::methodNode
20
+ pipeline_IngestionPipeline_run["run (pipeline.py:99)"]:::methodNode
21
+ pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:82)"]:::methodNode
20
22
  end
21
23
  subgraph sg_engine["engine.py"]
22
- engine_ResolverEngine["ResolverEngine (engine.py:19)"]:::classNode
23
- engine_ResolverEngine_resolve["resolve (engine.py:36)"]:::methodNode
24
+ engine_ResolverEngine["ResolverEngine (engine.py:20)"]:::classNode
25
+ engine_ResolverEngine_resolve["resolve (engine.py:37)"]:::methodNode
24
26
  end
25
27
  subgraph sg_uplift["uplift.py"]
26
28
  uplift_SemanticUpliftEngine["SemanticUpliftEngine (uplift.py:66)"]:::classNode
27
29
  uplift_SemanticUpliftEngine_execute_uplift["execute_uplift (uplift.py:91)"]:::methodNode
28
30
  end
29
31
  subgraph sg_sqlite_store["sqlite_store.py"]
30
- sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:40)"]:::classNode
32
+ sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:42)"]:::classNode
31
33
  end
32
34
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Node
33
35
  pipeline_IngestionPipeline_run -->|REFERENCES| models_Edge
34
36
  pipeline_IngestionPipeline_run -->|REFERENCES| sqlite_store_SQLiteStore
37
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_workspace_root
35
38
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_get_extractor
36
39
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_process_file
37
40
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_is_noop_incremental
38
41
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine
39
42
  pipeline_IngestionPipeline_run -->|CALLS| engine_ResolverEngine_resolve
43
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_cross_file_inputs_changed
44
+ pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_run
40
45
  pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_persist_incremental
41
46
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine_execute_uplift
42
47
  pipeline_IngestionPipeline_run -->|CALLS| uplift_SemanticUpliftEngine
@@ -10,9 +10,13 @@
10
10
  Analyse transitive upstream callers of a specific FQN.
11
11
 
12
12
  Answers "what breaks if I change X?". ``output_format="mermaid"`` (default)
13
- returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges}``
14
- payload with real FQNs — letting an agent compute set differences (e.g.
15
- "which route handlers never reach ``verify_ownership``?") directly.
13
+ returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges,
14
+ coverage}`` payload with real FQNs — letting an agent compute set
15
+ differences (e.g. "which route handlers never reach ``verify_ownership``?")
16
+ directly. ``coverage`` counts unresolved calls whose name matches a
17
+ traversed function, method or class: callers that may be missing, named in
18
+ ``top_unresolved``. It is an upper bound — a common name matches calls on
19
+ unrelated objects, which the names make visible.
16
20
 
17
21
  | Argument | Type | Required | Description |
18
22
  | :--- | :--- | :---: | :--- |
@@ -233,9 +237,11 @@ Scan a local directory, extract all symbols, resolve links, and build the graph
233
237
 
234
238
  By default the ingest is **incremental**: only changed/new files are
235
239
  re-scanned, and the summary reports both what changed this run and the
236
- whole-graph total. Set ``full_rebuild=True`` to re-scan every file and
237
- overwrite the database from scratch — use this to drop nodes for files that
238
- were deleted or renamed, which an incremental run leaves behind.
240
+ whole-graph total. When a change alters what other files resolve against — a
241
+ renamed, removed or added symbol, a deleted or new file, a changed base class
242
+ or re-export — the incremental run rebuilds the whole graph itself, so edges
243
+ in unchanged files never point at symbols that no longer exist. Set
244
+ ``full_rebuild=True`` to force a re-scan of every file from scratch.
239
245
 
240
246
  | Argument | Type | Required | Description |
241
247
  | :--- | :--- | :---: | :--- |
@@ -325,8 +331,12 @@ Suggest sub-package boundaries for a package from its dependency communities.
325
331
  Trace the execution call-graph starting from a specific FQN downwards.
326
332
 
327
333
  ``output_format="mermaid"`` (default) returns a human-readable diagram;
328
- ``"json"`` returns a joinable ``{root, nodes, edges}`` payload with real
329
- FQNs (not display hashes) for agent/CI use. Use ``cgis_ingest`` first if
334
+ ``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
335
+ with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
336
+ the calls the traversed functions make that resolved to nothing, and
337
+ ``top_unresolved`` names the most frequent. Read the names, not only the
338
+ ratio: in Python most are methods on untyped locals (``logger.info``,
339
+ ``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
330
340
  the database does not exist yet.
331
341
 
332
342
  | Argument | Type | Required | Description |
@@ -7,7 +7,7 @@ packages = ["src/cgis"]
7
7
 
8
8
  [project]
9
9
  name = "codegraph-brain"
10
- version = "0.19.0"
10
+ version = "0.21.0"
11
11
  description = "Semantic code graph for AI agents — deterministic FQN resolution, impact analysis and architectural drift gates, exposed over MCP."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.12"
@@ -13,6 +13,7 @@ from typing import Any
13
13
  import structlog
14
14
  from mcp.server.mcpserver import MCPServer
15
15
 
16
+ from cgis.core.coverage import TraversalCoverage
16
17
  from cgis.core.freshness import Freshness, FreshnessState
17
18
  from cgis.core.models import Edge, Node, NodeType
18
19
  from cgis.extractors.python_extractor import PythonExtractor
@@ -64,6 +65,11 @@ def _blank_fqn_error(fqn: str) -> str | None:
64
65
  return None
65
66
 
66
67
 
68
+ def _wants_json(output_format: str) -> bool:
69
+ """True when a traversal will be rendered as JSON — the only shape that carries coverage."""
70
+ return output_format.strip().lower() == "json"
71
+
72
+
67
73
  def _render_subgraph_with_freshness(
68
74
  db_path: str,
69
75
  output_format: str,
@@ -72,10 +78,11 @@ def _render_subgraph_with_freshness(
72
78
  title: str,
73
79
  nodes: list[Node],
74
80
  edges: list[Edge],
81
+ coverage: TraversalCoverage | None = None,
75
82
  ) -> str:
76
83
  """`_render_subgraph`, with this database's freshness measured for it (#175)."""
77
84
  return _render_subgraph(
78
- output_format, root, note, title, nodes, edges, _graph_freshness(db_path)
85
+ output_format, root, note, title, nodes, edges, _graph_freshness(db_path), coverage
79
86
  )
80
87
 
81
88
 
@@ -87,6 +94,7 @@ def _render_subgraph(
87
94
  nodes: list[Node],
88
95
  edges: list[Edge],
89
96
  freshness: "Freshness | None" = None,
97
+ coverage: TraversalCoverage | None = None,
90
98
  ) -> str:
91
99
  """Render a traversal result as a Mermaid diagram or joinable JSON (#171).
92
100
 
@@ -98,11 +106,12 @@ def _render_subgraph(
98
106
  ``freshness`` is placed differently in each: a key inside the JSON object,
99
107
  a prose note above the diagram. Prefixing the JSON would make it unparseable
100
108
  exactly when the graph goes stale, and this renderer is the only place that
101
- knows which shape it is about to produce (#175).
109
+ knows which shape it is about to produce (#175). ``coverage`` (#201) rides
110
+ in the JSON only.
102
111
  """
103
112
  fmt = output_format.strip().lower()
104
113
  if fmt == "json":
105
- payload = graph_to_json(root, nodes, edges)
114
+ payload = graph_to_json(root, nodes, edges, coverage)
106
115
  if freshness is not None and freshness.state is not FreshnessState.FRESH:
107
116
  payload = {**payload, "freshness": freshness.model_dump()}
108
117
  return json.dumps(payload, indent=2)
@@ -251,9 +260,11 @@ def cgis_ingest(project_path: str, db_path: str = _DEFAULT_DB, full_rebuild: boo
251
260
 
252
261
  By default the ingest is **incremental**: only changed/new files are
253
262
  re-scanned, and the summary reports both what changed this run and the
254
- whole-graph total. Set ``full_rebuild=True`` to re-scan every file and
255
- overwrite the database from scratch — use this to drop nodes for files that
256
- were deleted or renamed, which an incremental run leaves behind.
263
+ whole-graph total. When a change alters what other files resolve against — a
264
+ renamed, removed or added symbol, a deleted or new file, a changed base class
265
+ or re-export — the incremental run rebuilds the whole graph itself, so edges
266
+ in unchanged files never point at symbols that no longer exist. Set
267
+ ``full_rebuild=True`` to force a re-scan of every file from scratch.
257
268
  """
258
269
  refusal = _reject_db_path(db_path)
259
270
  if refusal is not None:
@@ -263,13 +274,12 @@ def cgis_ingest(project_path: str, db_path: str = _DEFAULT_DB, full_rebuild: boo
263
274
  pipeline = IngestionPipeline(_EXTRACTORS)
264
275
  try:
265
276
  with SQLiteStore(db_path) as store:
266
- if full_rebuild:
267
- # Clear first, then run incrementally over an empty DB: this drops
268
- # deleted-file nodes, repopulates files_state correctly, and runs
269
- # uplift inside the pipeline (store provided) — all in one path.
270
- store.clear()
271
- _nodes, _raw, resolved = pipeline.run(project_path, store=store)
272
- store.record_ingest(project_path)
277
+ # A rebuild replaces the stored graph in the transaction that writes the
278
+ # new one: deleted-file nodes and stale hashes go, uplift runs inside
279
+ # the pipeline, and a failure part-way leaves the old graph intact.
280
+ nodes, _raw, resolved = pipeline.run(project_path, store=store, rebuild=full_rebuild)
281
+ if nodes:
282
+ store.record_ingest(project_path)
273
283
  total_nodes = store.get_node_count()
274
284
  total_edges = store.get_edge_count()
275
285
  except Exception as exc:
@@ -283,8 +293,14 @@ def cgis_ingest(project_path: str, db_path: str = _DEFAULT_DB, full_rebuild: boo
283
293
  total_edges=total_edges,
284
294
  db=db_path,
285
295
  )
286
- lines = [f"✅ Ingested: {project_path} (mode: {mode})"]
287
- if not full_rebuild and not resolved:
296
+ if not nodes:
297
+ # Nothing extracted: a rebuild kept the stored graph, and neither mode
298
+ # records this path as the graph's fresh root.
299
+ kept = "the stored graph was kept" if full_rebuild else "the graph now holds none"
300
+ lines = [f"⚠️ No source files extracted from {project_path} (mode: {mode}); {kept}."]
301
+ else:
302
+ lines = [f"✅ Ingested: {project_path} (mode: {mode})"]
303
+ if nodes and not full_rebuild and not resolved:
288
304
  # Incremental no-op: an empty resolved set means no files changed. Say so
289
305
  # explicitly so the stable total below doesn't read as a shrunken graph (#192).
290
306
  lines.append("No files changed since the last ingest.")
@@ -300,8 +316,12 @@ def cgis_trace_flow(
300
316
  """Trace the execution call-graph starting from a specific FQN downwards.
301
317
 
302
318
  ``output_format="mermaid"`` (default) returns a human-readable diagram;
303
- ``"json"`` returns a joinable ``{root, nodes, edges}`` payload with real
304
- FQNs (not display hashes) for agent/CI use. Use ``cgis_ingest`` first if
319
+ ``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
320
+ with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
321
+ the calls the traversed functions make that resolved to nothing, and
322
+ ``top_unresolved`` names the most frequent. Read the names, not only the
323
+ ratio: in Python most are methods on untyped locals (``logger.info``,
324
+ ``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
305
325
  the database does not exist yet.
306
326
  """
307
327
  if blank := _blank_fqn_error(fqn):
@@ -313,13 +333,22 @@ def cgis_trace_flow(
313
333
  res = resolve_fqn(store, fqn)
314
334
  if res.resolved is None:
315
335
  return _resolution_error(fqn, res.candidates, res.truncated)
316
- nodes, edges = QueryEngine(store).get_flow_graph(res.resolved, max_depth=depth)
336
+ result = QueryEngine(store).get_flow_result(
337
+ res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
338
+ )
317
339
  except Exception as exc:
318
340
  return f"❌ {exc}"
319
341
 
320
342
  note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
321
343
  return _render_subgraph_with_freshness(
322
- db_path, output_format, res.resolved, note, "Execution flow for", nodes, edges
344
+ db_path,
345
+ output_format,
346
+ res.resolved,
347
+ note,
348
+ "Execution flow for",
349
+ result.nodes,
350
+ result.edges,
351
+ result.coverage,
323
352
  )
324
353
 
325
354
 
@@ -330,9 +359,13 @@ def cgis_analyze_impact(
330
359
  """Analyse transitive upstream callers of a specific FQN.
331
360
 
332
361
  Answers "what breaks if I change X?". ``output_format="mermaid"`` (default)
333
- returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges}``
334
- payload with real FQNs — letting an agent compute set differences (e.g.
335
- "which route handlers never reach ``verify_ownership``?") directly.
362
+ returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges,
363
+ coverage}`` payload with real FQNs — letting an agent compute set
364
+ differences (e.g. "which route handlers never reach ``verify_ownership``?")
365
+ directly. ``coverage`` counts unresolved calls whose name matches a
366
+ traversed function, method or class: callers that may be missing, named in
367
+ ``top_unresolved``. It is an upper bound — a common name matches calls on
368
+ unrelated objects, which the names make visible.
336
369
  """
337
370
  if blank := _blank_fqn_error(fqn):
338
371
  return blank
@@ -343,13 +376,22 @@ def cgis_analyze_impact(
343
376
  res = resolve_fqn(store, fqn)
344
377
  if res.resolved is None:
345
378
  return _resolution_error(fqn, res.candidates, res.truncated)
346
- nodes, edges = QueryEngine(store).get_impact_graph(res.resolved, max_depth=depth)
379
+ result = QueryEngine(store).get_impact_result(
380
+ res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
381
+ )
347
382
  except Exception as exc:
348
383
  return f"❌ {exc}"
349
384
 
350
385
  note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
351
386
  return _render_subgraph_with_freshness(
352
- db_path, output_format, res.resolved, note, "Impact analysis for", nodes, edges
387
+ db_path,
388
+ output_format,
389
+ res.resolved,
390
+ note,
391
+ "Impact analysis for",
392
+ result.nodes,
393
+ result.edges,
394
+ result.coverage,
353
395
  )
354
396
 
355
397