codegraph-brain 0.19.0__tar.gz → 0.20.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.20.0/.release-please-manifest.json +3 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CHANGELOG.md +12 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/PKG-INFO +1 -1
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/MCP_REFERENCE.md +13 -5
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/pyproject.toml +1 -1
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/mcp_server.py +47 -12
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/cli.py +27 -6
- codegraph_brain-0.20.0/src/cgis/core/coverage.py +57 -0
- codegraph_brain-0.20.0/src/cgis/query/engine.py +340 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/graph_json.py +16 -3
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/storage/sqlite_store.py +26 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_cli.py +35 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_graph_json.py +28 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_mcp_server.py +30 -0
- codegraph_brain-0.20.0/tests/unit/test_query_coverage.py +395 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/uv.lock +1 -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.20.0}/.claude-plugin/marketplace.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.gitattributes +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/test-count-baseline +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/autodoc.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/ci.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/guardian.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/pr-title.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/release-please.yml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.gitignore +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.pre-commit-config.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.python-version +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CLAUDE.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CONTRIBUTING.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/LICENSE +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/Makefile +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/PRIVACY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/CURATION.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/calibration.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-122.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-140.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-141.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-142.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-143.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-144.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-278.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-313.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/results.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/cal_dot_com.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/discourse.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/grafana.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/keycloak.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/sentry.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-judged.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run1.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run2.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run3.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-plan.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-reviews.jsonl +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/data/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/AUDIT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/CASE_STUDY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/ONTOLOGY.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/diagrams/pipeline_flow.mermaid +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/health_badge.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/.gitignore +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/cgis-app-avatar.png +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/cgis-app-avatar.svg +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/generate_avatar.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/examples/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/CLI_USAGE.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/core.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/domains.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/patterns.yaml +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/tolerances.lock +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/BLUEPRINT.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/PRD.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/TDD.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/main.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/.claude-plugin/plugin.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/.mcp.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/README.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/skills/cgis/SKILL.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/skills/ingest/SKILL.md +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/release-please-config.json +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/check_pytest_raises.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/check_test_count.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/colab_bench.sh +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/gen_ideal_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_health.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_mcp_ref.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_schema_docs.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_review.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/inject_readme_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/ollama_visitor.sh +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/probe_closure_gap.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/probe_tier_ladder.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/recordings_from_corpus.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/skeptic_arms.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/__main__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/freshness.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/generated.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/models.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/paths.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_annotations.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_ast.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_classes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_functions.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_imports.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_types.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/base.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/python_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/registry.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/typescript_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/axes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/chunked.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/chunker.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/collector.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/core.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/diff_index.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/evidence.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/findings.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/github_poster.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/prompts.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/base.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/gemini.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/mistral.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/ollama.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/openrouter.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/recording.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/render.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/runner.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/pipeline.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/py.typed +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/analyzer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/anomaly.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/cohesion.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/health.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/suggest_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/audit.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/context_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/orphans.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/prompt.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/snippet.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/_scc.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/drift_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/ontology_init.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/quotient.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/triads.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/fqn.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/mermaid.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/engine.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/indices.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/symbols.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/uplift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/storage/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/integration/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/__init__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/conftest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_annotation_calibration.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_architecture.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_self_parse.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_self_parse_ts.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_suggest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/.gitkeep +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/conftest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/guardian_stubs.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/review_path_inventory.txt +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test___main__.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_analyzer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_annotation_edges.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_audit.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_check_pytest_raises.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_check_test_count.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_cohesion.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_context_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_di_acceptance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_drift.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_drift_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_extractor_registry.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fingerprint.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fqn.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fractal.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_freshness.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_gen_ideal_graph.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_generate_mcp_ref.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_generated.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_axes.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_bench.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_bench_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_calibrate.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_chunked.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_chunker.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_collector.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_core.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_diff_index.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_evidence.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_findings.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian_union.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_openrouter.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_poster.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_providers.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_providers_name.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_recording.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_render.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_review_script.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_runner.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_salvage.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_skeptic.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_health_scorer.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_import_acceptance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_mermaid.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_metrics.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_models.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_name_load_positions.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_ontology_compliance.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_ontology_init.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_orphans.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_paths.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_patterns_yaml.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_pipeline.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_prompt.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_python_annotations.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_python_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_quotient.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_recordings_from_corpus.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver_indices.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver_symbols.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_record.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_self_types.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_skeptic_arms.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_snippet.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_sqlite_store.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_suggest_service.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_temperature_source.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_triads.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_typescript_extractor.py +0 -0
- {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_uplift.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.20.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.19.0...codegraph-brain-v0.20.0) (2026-09-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **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))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Documentation
|
|
12
|
+
|
|
13
|
+
* 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))
|
|
14
|
+
|
|
3
15
|
## [0.19.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.18.0...codegraph-brain-v0.19.0) (2026-09-09)
|
|
4
16
|
|
|
5
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: codegraph-brain
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.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
|
|
@@ -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
|
| :--- | :--- | :---: | :--- |
|
|
@@ -325,8 +329,12 @@ Suggest sub-package boundaries for a package from its dependency communities.
|
|
|
325
329
|
Trace the execution call-graph starting from a specific FQN downwards.
|
|
326
330
|
|
|
327
331
|
``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.
|
|
332
|
+
``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
|
|
333
|
+
with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
|
|
334
|
+
the calls the traversed functions make that resolved to nothing, and
|
|
335
|
+
``top_unresolved`` names the most frequent. Read the names, not only the
|
|
336
|
+
ratio: in Python most are methods on untyped locals (``logger.info``,
|
|
337
|
+
``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
|
|
330
338
|
the database does not exist yet.
|
|
331
339
|
|
|
332
340
|
| 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.20.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)
|
|
@@ -300,8 +309,12 @@ def cgis_trace_flow(
|
|
|
300
309
|
"""Trace the execution call-graph starting from a specific FQN downwards.
|
|
301
310
|
|
|
302
311
|
``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.
|
|
312
|
+
``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
|
|
313
|
+
with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
|
|
314
|
+
the calls the traversed functions make that resolved to nothing, and
|
|
315
|
+
``top_unresolved`` names the most frequent. Read the names, not only the
|
|
316
|
+
ratio: in Python most are methods on untyped locals (``logger.info``,
|
|
317
|
+
``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
|
|
305
318
|
the database does not exist yet.
|
|
306
319
|
"""
|
|
307
320
|
if blank := _blank_fqn_error(fqn):
|
|
@@ -313,13 +326,22 @@ def cgis_trace_flow(
|
|
|
313
326
|
res = resolve_fqn(store, fqn)
|
|
314
327
|
if res.resolved is None:
|
|
315
328
|
return _resolution_error(fqn, res.candidates, res.truncated)
|
|
316
|
-
|
|
329
|
+
result = QueryEngine(store).get_flow_result(
|
|
330
|
+
res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
|
|
331
|
+
)
|
|
317
332
|
except Exception as exc:
|
|
318
333
|
return f"❌ {exc}"
|
|
319
334
|
|
|
320
335
|
note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
|
|
321
336
|
return _render_subgraph_with_freshness(
|
|
322
|
-
db_path,
|
|
337
|
+
db_path,
|
|
338
|
+
output_format,
|
|
339
|
+
res.resolved,
|
|
340
|
+
note,
|
|
341
|
+
"Execution flow for",
|
|
342
|
+
result.nodes,
|
|
343
|
+
result.edges,
|
|
344
|
+
result.coverage,
|
|
323
345
|
)
|
|
324
346
|
|
|
325
347
|
|
|
@@ -330,9 +352,13 @@ def cgis_analyze_impact(
|
|
|
330
352
|
"""Analyse transitive upstream callers of a specific FQN.
|
|
331
353
|
|
|
332
354
|
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``?")
|
|
355
|
+
returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges,
|
|
356
|
+
coverage}`` payload with real FQNs — letting an agent compute set
|
|
357
|
+
differences (e.g. "which route handlers never reach ``verify_ownership``?")
|
|
358
|
+
directly. ``coverage`` counts unresolved calls whose name matches a
|
|
359
|
+
traversed function, method or class: callers that may be missing, named in
|
|
360
|
+
``top_unresolved``. It is an upper bound — a common name matches calls on
|
|
361
|
+
unrelated objects, which the names make visible.
|
|
336
362
|
"""
|
|
337
363
|
if blank := _blank_fqn_error(fqn):
|
|
338
364
|
return blank
|
|
@@ -343,13 +369,22 @@ def cgis_analyze_impact(
|
|
|
343
369
|
res = resolve_fqn(store, fqn)
|
|
344
370
|
if res.resolved is None:
|
|
345
371
|
return _resolution_error(fqn, res.candidates, res.truncated)
|
|
346
|
-
|
|
372
|
+
result = QueryEngine(store).get_impact_result(
|
|
373
|
+
res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
|
|
374
|
+
)
|
|
347
375
|
except Exception as exc:
|
|
348
376
|
return f"❌ {exc}"
|
|
349
377
|
|
|
350
378
|
note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
|
|
351
379
|
return _render_subgraph_with_freshness(
|
|
352
|
-
db_path,
|
|
380
|
+
db_path,
|
|
381
|
+
output_format,
|
|
382
|
+
res.resolved,
|
|
383
|
+
note,
|
|
384
|
+
"Impact analysis for",
|
|
385
|
+
result.nodes,
|
|
386
|
+
result.edges,
|
|
387
|
+
result.coverage,
|
|
353
388
|
)
|
|
354
389
|
|
|
355
390
|
|
|
@@ -31,6 +31,7 @@ from rich.table import Table
|
|
|
31
31
|
from rich.tree import Tree
|
|
32
32
|
|
|
33
33
|
from cgis import __app_name__, __version__
|
|
34
|
+
from cgis.core.coverage import TraversalCoverage
|
|
34
35
|
from cgis.core.freshness import FreshnessState
|
|
35
36
|
from cgis.core.models import VIRTUAL_FILE_PATH, Edge, EdgeType, Node, NodeNamespace, NodeType
|
|
36
37
|
from cgis.extractors.python_extractor import file_path_to_module_fqn
|
|
@@ -287,12 +288,17 @@ def _render_graph(
|
|
|
287
288
|
nodes: list[Node],
|
|
288
289
|
edges: list[Edge],
|
|
289
290
|
internal_only: bool = False,
|
|
291
|
+
coverage: TraversalCoverage | None = None,
|
|
290
292
|
) -> str:
|
|
291
|
-
"""Render a subgraph for a non-text format (Mermaid for eyes, JSON for agents).
|
|
293
|
+
"""Render a subgraph for a non-text format (Mermaid for eyes, JSON for agents).
|
|
294
|
+
|
|
295
|
+
``coverage`` was measured by the engine before ``internal_only`` filters
|
|
296
|
+
anything, so the filter cannot hide the unresolved calls it removes (#201).
|
|
297
|
+
"""
|
|
292
298
|
if internal_only:
|
|
293
299
|
nodes, edges = _filter_internal(nodes, edges)
|
|
294
300
|
if output_format == OutputFormat.JSON:
|
|
295
|
-
return _json.dumps(graph_to_json(root, nodes, edges), indent=2)
|
|
301
|
+
return _json.dumps(graph_to_json(root, nodes, edges, coverage), indent=2)
|
|
296
302
|
return MermaidCompiler().compile(nodes, edges)
|
|
297
303
|
|
|
298
304
|
|
|
@@ -412,14 +418,19 @@ def trace(
|
|
|
412
418
|
raise typer.Exit(code=1)
|
|
413
419
|
|
|
414
420
|
if output_format != OutputFormat.TEXT:
|
|
415
|
-
|
|
421
|
+
flow = QueryEngine(store).get_flow_result(
|
|
416
422
|
start,
|
|
423
|
+
with_coverage=output_format == OutputFormat.JSON,
|
|
417
424
|
max_depth=depth,
|
|
418
425
|
allowed_edge_types=allowed,
|
|
419
426
|
show_external=show_external,
|
|
420
427
|
min_confidence=min_confidence,
|
|
421
428
|
)
|
|
422
|
-
typer.echo(
|
|
429
|
+
typer.echo(
|
|
430
|
+
_render_graph(
|
|
431
|
+
output_format, start, flow.nodes, flow.edges, internal_only, flow.coverage
|
|
432
|
+
)
|
|
433
|
+
)
|
|
423
434
|
else:
|
|
424
435
|
if internal_only:
|
|
425
436
|
raise typer.BadParameter(_INTERNAL_ONLY_TEXT_ERR)
|
|
@@ -544,14 +555,24 @@ def impact(
|
|
|
544
555
|
raise typer.Exit(code=1)
|
|
545
556
|
|
|
546
557
|
if output_format != OutputFormat.TEXT:
|
|
547
|
-
|
|
558
|
+
impact_result = QueryEngine(store).get_impact_result(
|
|
548
559
|
target,
|
|
560
|
+
with_coverage=output_format == OutputFormat.JSON,
|
|
549
561
|
max_depth=depth,
|
|
550
562
|
allowed_edge_types=allowed,
|
|
551
563
|
show_external=show_external,
|
|
552
564
|
min_confidence=min_confidence,
|
|
553
565
|
)
|
|
554
|
-
typer.echo(
|
|
566
|
+
typer.echo(
|
|
567
|
+
_render_graph(
|
|
568
|
+
output_format,
|
|
569
|
+
target,
|
|
570
|
+
impact_result.nodes,
|
|
571
|
+
impact_result.edges,
|
|
572
|
+
internal_only,
|
|
573
|
+
impact_result.coverage,
|
|
574
|
+
)
|
|
575
|
+
)
|
|
555
576
|
else:
|
|
556
577
|
if internal_only:
|
|
557
578
|
raise typer.BadParameter(_INTERNAL_ONLY_TEXT_ERR)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""How much of a traversal's neighbourhood the graph could actually place (#201).
|
|
2
|
+
|
|
3
|
+
`cgis validate` reports resolution health for the whole graph. An agent holding
|
|
4
|
+
one `trace_flow` or `analyze_impact` answer needs the local version: were the
|
|
5
|
+
calls around *this* result resolved, or is the answer short because they were not?
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from collections.abc import Mapping
|
|
9
|
+
from typing import Literal
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field, computed_field
|
|
12
|
+
|
|
13
|
+
#: How many unresolved targets a coverage report names. The counts cover all of them.
|
|
14
|
+
TOP_UNRESOLVED_LIMIT = 10
|
|
15
|
+
|
|
16
|
+
#: What `calls_unresolved` counts, which differs by traversal direction.
|
|
17
|
+
#:
|
|
18
|
+
#: ``unresolved_calls_made`` — calls the expanded nodes make that resolved to
|
|
19
|
+
#: nothing: dead ends downstream. Exact.
|
|
20
|
+
#:
|
|
21
|
+
#: ``unresolved_calls_by_name`` — unresolved calls anywhere in the graph whose
|
|
22
|
+
#: called name matches an expanded node: callers that may be missing upstream.
|
|
23
|
+
#: An upper bound — a name is not an identity, and a common one (``items``)
|
|
24
|
+
#: matches calls on unrelated objects.
|
|
25
|
+
CoverageBasis = Literal["unresolved_calls_made", "unresolved_calls_by_name"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def rank_unresolved(counts: Mapping[str, int]) -> list[tuple[str, int]]:
|
|
29
|
+
"""The most frequent unresolved targets first, ties by name, at most `TOP_UNRESOLVED_LIMIT`."""
|
|
30
|
+
return sorted(counts.items(), key=lambda item: (-item[1], item[0]))[:TOP_UNRESOLVED_LIMIT]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TraversalCoverage(BaseModel):
|
|
34
|
+
"""Resolution coverage of the CALLS edges around one traversal result.
|
|
35
|
+
|
|
36
|
+
``top_unresolved`` names what the counts are made of, because a ratio alone
|
|
37
|
+
cannot tell ``logger.info`` from ``billing.charge``. On cgis's own
|
|
38
|
+
``IngestionPipeline.run`` (``cgis trace --depth 3`` at 7eb324b) 92 of 235
|
|
39
|
+
calls are unresolved, and the most frequent are ``logger.info``,
|
|
40
|
+
``edge.model_copy`` and ``resolved_edges.append`` — methods on untyped
|
|
41
|
+
locals, none of them a first-party call the flow is missing.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
model_config = ConfigDict(frozen=True)
|
|
45
|
+
|
|
46
|
+
basis: CoverageBasis
|
|
47
|
+
calls_examined: int
|
|
48
|
+
calls_unresolved: int
|
|
49
|
+
top_unresolved: list[tuple[str, int]] = Field(default_factory=list)
|
|
50
|
+
|
|
51
|
+
@computed_field # type: ignore[prop-decorator]
|
|
52
|
+
@property
|
|
53
|
+
def unresolved_ratio(self) -> float:
|
|
54
|
+
"""Share of the examined calls that are unresolved; 0.0 when none were examined."""
|
|
55
|
+
if not self.calls_examined:
|
|
56
|
+
return 0.0
|
|
57
|
+
return self.calls_unresolved / self.calls_examined
|