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.
- codegraph_brain-0.21.0/.github/test-count-baseline +1 -0
- codegraph_brain-0.21.0/.release-please-manifest.json +3 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CHANGELOG.md +32 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/PKG-INFO +24 -17
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/README.md +23 -16
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/diagrams/pipeline_flow.mermaid +13 -8
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/MCP_REFERENCE.md +18 -8
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/pyproject.toml +1 -1
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/mcp_server.py +66 -24
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/cli.py +59 -40
- codegraph_brain-0.21.0/src/cgis/core/coverage.py +57 -0
- codegraph_brain-0.21.0/src/cgis/core/js_globals.py +116 -0
- codegraph_brain-0.21.0/src/cgis/extractors/_typescript_bindings.py +155 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/typescript_extractor.py +4 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/pipeline.py +167 -35
- codegraph_brain-0.21.0/src/cgis/query/engine.py +340 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/graph_json.py +16 -3
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/engine.py +32 -9
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/indices.py +27 -1
- codegraph_brain-0.21.0/src/cgis/resolver/js_builtins.py +44 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/storage/sqlite_store.py +80 -7
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_annotation_calibration.py +7 -2
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_self_parse_ts.py +58 -1
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_cli.py +176 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_graph_json.py +28 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_mcp_server.py +68 -0
- codegraph_brain-0.21.0/tests/unit/test_pipeline_incremental_symbols.py +332 -0
- codegraph_brain-0.21.0/tests/unit/test_query_coverage.py +395 -0
- codegraph_brain-0.21.0/tests/unit/test_resolver_js_builtins.py +230 -0
- codegraph_brain-0.21.0/tests/unit/test_resolver_language_scope.py +128 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/uv.lock +1 -1
- codegraph_brain-0.19.0/.github/test-count-baseline +0 -1
- codegraph_brain-0.19.0/.release-please-manifest.json +0 -3
- codegraph_brain-0.19.0/src/cgis/query/engine.py +0 -170
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.claude-plugin/marketplace.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.gitattributes +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/autodoc.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/ci.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/guardian.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/pr-title.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.github/workflows/release-please.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.gitignore +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.pre-commit-config.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/.python-version +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CLAUDE.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/CONTRIBUTING.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/LICENSE +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/Makefile +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/PRIVACY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/CURATION.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/calibration.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
- {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
- {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
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-122.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-140.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-141.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-142.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-143.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-144.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-278.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/pr-313.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/guardian/results.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/cal_dot_com.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/discourse.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/grafana.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/keycloak.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian/sentry.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-judged.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run1.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run2.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-p3-run3.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-plan.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/benchmarks/martian-reviews.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/data/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/AUDIT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/CASE_STUDY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/ONTOLOGY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/health_badge.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/.gitignore +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/cgis-app-avatar.png +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/cgis-app-avatar.svg +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/assets/generate_avatar.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/examples/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/how-to/CLI_USAGE.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/core.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/domains.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/patterns.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/ontology/tolerances.lock +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/BLUEPRINT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/PRD.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/TDD.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/main.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/.claude-plugin/plugin.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/.mcp.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/skills/cgis/SKILL.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/plugin/skills/ingest/SKILL.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/release-please-config.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/check_pytest_raises.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/check_test_count.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/colab_bench.sh +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/gen_ideal_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_health.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_mcp_ref.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/generate_schema_docs.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/guardian_review.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/inject_readme_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/ollama_visitor.sh +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/probe_closure_gap.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/probe_tier_ladder.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/recordings_from_corpus.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/scripts/skeptic_arms.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/__main__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/api/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/freshness.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/generated.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/models.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/core/paths.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_annotations.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_ast.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_classes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_functions.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_imports.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/_python_types.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/base.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/python_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/extractors/registry.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/axes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/chunked.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/chunker.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/collector.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/core.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/diff_index.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/evidence.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/findings.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/github_poster.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/prompts.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/base.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/gemini.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/mistral.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/ollama.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/providers/openrouter.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/recording.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/render.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/runner.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/guardian/skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/py.typed +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/analyzer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/anomaly.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/cohesion.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/health.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/analysis/suggest_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/audit.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/context_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/orphans.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/prompt.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/context/snippet.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/_scc.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/drift_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/ontology_init.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/quotient.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/drift/triads.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/fqn.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/mermaid.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/query/render/metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/symbols.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/resolver/uplift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/src/cgis/storage/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/integration/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/conftest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_architecture.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_self_parse.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/self_parsing/test_suggest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/conftest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/guardian_stubs.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/review_path_inventory.txt +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test___main__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_analyzer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_annotation_edges.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_audit.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_check_pytest_raises.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_check_test_count.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_cohesion.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_context_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_di_acceptance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_drift_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_extractor_registry.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fqn.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_freshness.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_gen_ideal_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_generate_mcp_ref.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_generated.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_axes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_bench_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_chunked.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_chunker.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_collector.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_core.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_diff_index.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_evidence.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_findings.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_martian_union.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_openrouter.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_poster.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_providers.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_providers_name.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_recording.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_render.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_review_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_runner.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_salvage.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_guardian_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_health_scorer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_import_acceptance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_mermaid.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_models.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_name_load_positions.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_ontology_compliance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_ontology_init.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_orphans.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_paths.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_patterns_yaml.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_pipeline.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_prompt.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_python_annotations.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_python_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_quotient.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_recordings_from_corpus.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver_indices.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_resolver_symbols.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_review_fingerprint_record.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_self_types.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_skeptic_arms.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_snippet.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_sqlite_store.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_suggest_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_temperature_source.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_triads.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_typescript_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/tests/unit/test_uplift.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2459
|
|
@@ -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.
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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:
|
|
213
|
-
engine_ResolverEngine_resolve["resolve (engine.py:
|
|
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:
|
|
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
|
-
| `
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
| `
|
|
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:
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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:
|
|
163
|
-
engine_ResolverEngine_resolve["resolve (engine.py:
|
|
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:
|
|
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
|
-
| `
|
|
190
|
-
| `
|
|
191
|
-
| `
|
|
192
|
-
| `
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
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:
|
|
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
|
---
|
{codegraph_brain-0.19.0 → codegraph_brain-0.21.0}/docs/architecture/diagrams/pipeline_flow.mermaid
RENAMED
|
@@ -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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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:
|
|
23
|
-
engine_ResolverEngine_resolve["resolve (engine.py:
|
|
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:
|
|
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
|
|
15
|
-
"which route handlers never reach ``verify_ownership``?")
|
|
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.
|
|
237
|
-
|
|
238
|
-
|
|
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
|
|
329
|
-
FQNs (not display hashes) for agent/CI use.
|
|
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.
|
|
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.
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
287
|
-
|
|
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
|
|
304
|
-
FQNs (not display hashes) for agent/CI use.
|
|
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
|
-
|
|
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,
|
|
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
|
|
335
|
-
"which route handlers never reach ``verify_ownership``?")
|
|
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
|
-
|
|
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,
|
|
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
|
|