codegraph-brain 0.26.0__tar.gz → 0.27.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.27.0/.release-please-manifest.json +3 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/CHANGELOG.md +22 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/PKG-INFO +1 -1
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/HOW_IT_WORKS.md +27 -24
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/diagrams/pipeline_flow.mermaid +14 -12
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/how-to/AGENT_ONBOARDING.md +54 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/how-to/MCP_REFERENCE.md +15 -2
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +25 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/pyproject.toml +1 -1
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/server.json +2 -2
- codegraph_brain-0.27.0/src/cgis/api/auto_refresh.py +110 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/api/mcp_server.py +48 -4
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/cli.py +42 -11
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/python_extractor.py +33 -12
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/import_names.py +20 -9
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/pipeline.py +27 -1
- codegraph_brain-0.27.0/src/cgis/python_dependencies.py +154 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/cohesion.py +35 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/suggest_service.py +88 -32
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/orphans.py +42 -4
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/engine.py +8 -3
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/indices.py +55 -1
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/symbols.py +5 -2
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/storage/sqlite_store.py +71 -14
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_suggest.py +25 -2
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_audit.py +44 -0
- codegraph_brain-0.27.0/tests/unit/test_auto_refresh.py +143 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_cli.py +26 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_cohesion.py +21 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_freshness.py +92 -1
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_orphans.py +77 -0
- codegraph_brain-0.27.0/tests/unit/test_python_dependencies.py +193 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver.py +45 -8
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_indices.py +86 -1
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_suggest_service.py +86 -4
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/uv.lock +4 -4
- codegraph_brain-0.26.0/.release-please-manifest.json +0 -3
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.claude-plugin/marketplace.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.gitattributes +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/test-count-baseline +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/autodoc.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/ci.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/guardian.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/mcp-registry.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/pr-title.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/release-please.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.github/workflows/ui.yml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.gitignore +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.pre-commit-config.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/.python-version +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/CLAUDE.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/CONTRIBUTING.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/LICENSE +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/Makefile +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/PRIVACY.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/CURATION.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/calibration.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-122.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-140.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-141.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-142.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-143.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-144.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-278.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/pr-313.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/guardian/results.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/cal_dot_com.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/discourse.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/grafana.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/keycloak.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian/sentry.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-judged.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-p3-run1.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-p3-run2.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-p3-run3.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-plan.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/benchmarks/martian-reviews.jsonl +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/data/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/AUDIT.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/CASE_STUDY.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/ONTOLOGY.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/health_badge.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/assets/.gitignore +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/assets/cgis-app-avatar.png +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/assets/cgis-app-avatar.svg +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/assets/generate_avatar.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/examples/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/how-to/CLI_USAGE.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/ontology/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/ontology/core.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/ontology/domains.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/ontology/patterns.yaml +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/ontology/tolerances.lock +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/BLUEPRINT.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/PRD.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/TDD.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/glama.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/main.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/plugin/.claude-plugin/plugin.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/plugin/.mcp.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/plugin/README.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/plugin/skills/cgis/SKILL.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/plugin/skills/ingest/SKILL.md +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/release-please-config.json +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/check_pytest_raises.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/check_test_count.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/colab_bench.sh +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/gen_ideal_graph.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/generate_health.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/generate_mcp_ref.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/generate_schema_docs.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/guardian_bench.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/guardian_calibrate.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/guardian_martian.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/guardian_review.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/inject_architecture_graph.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/mcp_registry_gate.sh +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/ollama_visitor.sh +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/probe_closure_gap.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/probe_tier_ladder.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/recordings_from_corpus.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/scripts/skeptic_arms.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/__main__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/api/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/api/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/coverage.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/freshness.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/generated.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/js_globals.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/models.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/core/paths.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_annotations.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_ast.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_classes.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_functions.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_imports.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_python_types.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/_typescript_bindings.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/base.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/registry.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/extractors/typescript_extractor.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/axes.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/bench.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/calibrate.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/chunked.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/chunker.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/collector.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/core.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/diff_index.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/evidence.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/findings.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/github_poster.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/martian.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/metrics.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/prompts.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/base.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/gemini.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/mistral.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/ollama.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/providers/openrouter.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/recording.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/render.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/review_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/runner.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/guardian/skeptic.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/py.typed +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/analyzer.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/anomaly.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/health.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/analysis/overview.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/audit.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/context_service.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/prompt.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/context/snippet.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/_scc.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/catalog.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/drift.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/drift_service.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/fractal.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/ontology_init.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/quotient.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/scoring.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/drift/triads.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/engine.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/fqn.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/render/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/render/graph_json.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/render/mermaid.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/query/render/metrics.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/js_builtins.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/resolver/uplift.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/storage/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/tsconfig_paths.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/src/cgis/workspaces.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/integration/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/__init__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/conftest.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_annotation_calibration.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_architecture.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_drift.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_fractal.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_overview.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_self_parse.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/self_parsing/test_self_parse_ts.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/.gitkeep +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/conftest.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/guardian_stubs.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/review_path_inventory.txt +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test___main__.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_analyzer.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_annotation_edges.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_check_pytest_raises.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_check_test_count.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_class_cohesion.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_context_service.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_di_acceptance.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_drift.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_drift_service.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_extractor_registry.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_features_source.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_fingerprint.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_fqn.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_fractal.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_gen_ideal_graph.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_generate_mcp_ref.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_generated.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_graph_json.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_axes.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_bench.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_bench_script.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_calibrate.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_chunked.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_chunker.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_collector.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_core.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_diff_index.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_evidence.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_findings.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_martian.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_martian_script.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_martian_union.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_metrics.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_openrouter.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_poster.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_providers.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_providers_name.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_recording.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_render.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_review_script.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_runner.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_salvage.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_guardian_skeptic.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_health_scorer.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_import_acceptance.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_inject_architecture_graph.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_mcp_server.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_mcp_tool_schemas.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_mermaid.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_metrics.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_metrics_file_coupling.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_metrics_resolution.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_models.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_name_load_positions.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_ontology_compliance.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_ontology_init.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_overview.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_overview_tools.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_package_view.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_paths.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_patterns_yaml.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_pipeline.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_pipeline_incremental_symbols.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_pipeline_ts_workspaces.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_prompt.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_python_annotations.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_python_extractor.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_query_coverage.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_quotient.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_recordings_from_corpus.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_import_layout.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_js_builtins.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_language_scope.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_phantom_internal.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_symbols.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_ts_declarations.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_resolver_ts_workspaces.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_review_fingerprint_record.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_self_types.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_skeptic_arms.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_snippet.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_sqlite_store.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_temperature_source.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_triads.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_tsconfig_paths.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_type_checking_imports.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_typescript_extractor.py +0 -0
- {codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/tests/unit/test_uplift.py +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.27.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.26.0...codegraph-brain-v0.27.0) (2026-10-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **mcp:** opt-in refresh of a stale graph before read tools answer ([#538](https://github.com/zaebee/codegraph-brain/issues/538)) ([b26a2c8](https://github.com/zaebee/codegraph-brain/commit/b26a2c8d335fbb2f19a217fcaced715f16454664))
|
|
9
|
+
* **orphans:** consider module-level classes only by default ([#432](https://github.com/zaebee/codegraph-brain/issues/432)) ([#534](https://github.com/zaebee/codegraph-brain/issues/534)) ([731d93a](https://github.com/zaebee/codegraph-brain/commit/731d93a8b81fd02fe6b5e71892a408341d034239))
|
|
10
|
+
* **suggest-packages:** judge a package by its direct children ([#446](https://github.com/zaebee/codegraph-brain/issues/446)) ([#536](https://github.com/zaebee/codegraph-brain/issues/536)) ([fd6f05b](https://github.com/zaebee/codegraph-brain/commit/fd6f05b003ea006392e6384170a4bead227f5e85))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **freshness:** report a write made during ingest as stale ([#535](https://github.com/zaebee/codegraph-brain/issues/535)) ([4121919](https://github.com/zaebee/codegraph-brain/commit/4121919148affbad202156d43d01fca458beca23))
|
|
16
|
+
* **resolver:** classify declared Python dependencies as external ([#495](https://github.com/zaebee/codegraph-brain/issues/495)) ([#531](https://github.com/zaebee/codegraph-brain/issues/531)) ([ca4c01d](https://github.com/zaebee/codegraph-brain/commit/ca4c01d1ffa8e8c754317af73ffcf06d534a61d7))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Documentation
|
|
20
|
+
|
|
21
|
+
* auto-sync architecture graph and MCP reference ([#532](https://github.com/zaebee/codegraph-brain/issues/532)) ([13c90fd](https://github.com/zaebee/codegraph-brain/commit/13c90fd3ebcc38271b697f514d292c7033d4f81d))
|
|
22
|
+
* auto-sync architecture graph and MCP reference ([#537](https://github.com/zaebee/codegraph-brain/issues/537)) ([c03f60d](https://github.com/zaebee/codegraph-brain/commit/c03f60d4211e3029d02a624ef9d6b4fa92f184df))
|
|
23
|
+
* **onboarding:** refresh the graph from hooks instead of a watcher ([#541](https://github.com/zaebee/codegraph-brain/issues/541)) ([809169d](https://github.com/zaebee/codegraph-brain/commit/809169d19797e280b0810f049215950b3eedf1df)), closes [#175](https://github.com/zaebee/codegraph-brain/issues/175)
|
|
24
|
+
|
|
3
25
|
## [0.26.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.25.4...codegraph-brain-v0.26.0) (2026-10-02)
|
|
4
26
|
|
|
5
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: codegraph-brain
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.27.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
|
|
@@ -188,35 +188,37 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
|
|
|
188
188
|
models_Node["Node (models.py:85)"]:::classNode
|
|
189
189
|
end
|
|
190
190
|
subgraph sg_import_names["import_names.py"]
|
|
191
|
-
import_names_ImportNameCollector["ImportNameCollector (import_names.py:
|
|
192
|
-
import_names_ImportNameCollector_collect["collect (import_names.py:
|
|
193
|
-
import_names_ImportNameCollector_note["note (import_names.py:
|
|
191
|
+
import_names_ImportNameCollector["ImportNameCollector (import_names.py:58)"]:::classNode
|
|
192
|
+
import_names_ImportNameCollector_collect["collect (import_names.py:74)"]:::methodNode
|
|
193
|
+
import_names_ImportNameCollector_note["note (import_names.py:67)"]:::methodNode
|
|
194
194
|
end
|
|
195
195
|
subgraph sg_pipeline["pipeline.py"]
|
|
196
|
-
pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:
|
|
197
|
-
pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:
|
|
198
|
-
pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:
|
|
199
|
-
pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:
|
|
200
|
-
pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:
|
|
201
|
-
pipeline_IngestionPipeline_run["run (pipeline.py:
|
|
202
|
-
pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:
|
|
196
|
+
pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:292)"]:::methodNode
|
|
197
|
+
pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:427)"]:::methodNode
|
|
198
|
+
pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:353)"]:::methodNode
|
|
199
|
+
pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:377)"]:::methodNode
|
|
200
|
+
pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:252)"]:::methodNode
|
|
201
|
+
pipeline_IngestionPipeline_run["run (pipeline.py:115)"]:::methodNode
|
|
202
|
+
pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:98)"]:::methodNode
|
|
203
|
+
pipeline_observe["_observe (pipeline.py:56)"]:::funcNode
|
|
203
204
|
end
|
|
204
205
|
subgraph sg_engine["engine.py"]
|
|
205
206
|
engine_ResolverEngine["ResolverEngine (engine.py:49)"]:::classNode
|
|
206
|
-
engine_ResolverEngine_resolve["resolve (engine.py:
|
|
207
|
+
engine_ResolverEngine_resolve["resolve (engine.py:85)"]:::methodNode
|
|
207
208
|
end
|
|
208
209
|
subgraph sg_uplift["uplift.py"]
|
|
209
210
|
uplift_SemanticUpliftEngine["SemanticUpliftEngine (uplift.py:66)"]:::classNode
|
|
210
211
|
uplift_SemanticUpliftEngine_execute_uplift["execute_uplift (uplift.py:91)"]:::methodNode
|
|
211
212
|
end
|
|
212
213
|
subgraph sg_sqlite_store["sqlite_store.py"]
|
|
213
|
-
sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:
|
|
214
|
+
sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:63)"]:::classNode
|
|
214
215
|
end
|
|
215
216
|
pipeline_IngestionPipeline_run -->|REFERENCES| models_Node
|
|
216
217
|
pipeline_IngestionPipeline_run -->|REFERENCES| models_Edge
|
|
217
218
|
pipeline_IngestionPipeline_run -->|REFERENCES| sqlite_store_SQLiteStore
|
|
218
219
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_workspace_root
|
|
219
220
|
pipeline_IngestionPipeline_run -->|CALLS| import_names_ImportNameCollector
|
|
221
|
+
pipeline_IngestionPipeline_run -->|CALLS| pipeline_observe
|
|
220
222
|
pipeline_IngestionPipeline_run -->|CALLS| import_names_ImportNameCollector_note
|
|
221
223
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_get_extractor
|
|
222
224
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_process_file
|
|
@@ -235,19 +237,20 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
|
|
|
235
237
|
|--------|------|------|
|
|
236
238
|
| `Node` | CLASS | [`models.py:85`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L85) |
|
|
237
239
|
| `Edge` | CLASS | [`models.py:142`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/core/models.py#L142) |
|
|
238
|
-
| `ImportNameCollector` | CLASS | [`import_names.py:
|
|
239
|
-
| `note` | METHOD | [`import_names.py:
|
|
240
|
-
| `collect` | METHOD | [`import_names.py:
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
| `
|
|
246
|
-
| `
|
|
247
|
-
| `
|
|
240
|
+
| `ImportNameCollector` | CLASS | [`import_names.py:58`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/import_names.py#L58) |
|
|
241
|
+
| `note` | METHOD | [`import_names.py:67`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/import_names.py#L67) |
|
|
242
|
+
| `collect` | METHOD | [`import_names.py:74`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/import_names.py#L74) |
|
|
243
|
+
| `_observe` | FUNCTION | [`pipeline.py:56`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L56) |
|
|
244
|
+
| `workspace_root` | METHOD | [`pipeline.py:98`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L98) |
|
|
245
|
+
| `run` | METHOD | [`pipeline.py:115`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L115) |
|
|
246
|
+
| `_process_file` | METHOD | [`pipeline.py:252`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L252) |
|
|
247
|
+
| `_cross_file_inputs_changed` | METHOD | [`pipeline.py:292`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L292) |
|
|
248
|
+
| `_is_noop_incremental` | METHOD | [`pipeline.py:353`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L353) |
|
|
249
|
+
| `_persist_incremental` | METHOD | [`pipeline.py:377`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L377) |
|
|
250
|
+
| `_get_extractor` | METHOD | [`pipeline.py:427`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/pipeline.py#L427) |
|
|
248
251
|
| `ResolverEngine` | CLASS | [`engine.py:49`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L49) |
|
|
249
|
-
| `resolve` | METHOD | [`engine.py:
|
|
252
|
+
| `resolve` | METHOD | [`engine.py:85`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/engine.py#L85) |
|
|
250
253
|
| `SemanticUpliftEngine` | CLASS | [`uplift.py:66`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L66) |
|
|
251
254
|
| `execute_uplift` | METHOD | [`uplift.py:91`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/resolver/uplift.py#L91) |
|
|
252
|
-
| `SQLiteStore` | CLASS | [`sqlite_store.py:
|
|
255
|
+
| `SQLiteStore` | CLASS | [`sqlite_store.py:63`](https://github.com/zaebee/codegraph-brain/blob/main/src/cgis/storage/sqlite_store.py#L63) |
|
|
253
256
|
<!-- END_CGIS_GRAPH -->
|
{codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/architecture/diagrams/pipeline_flow.mermaid
RENAMED
|
@@ -12,35 +12,37 @@ 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_import_names["import_names.py"]
|
|
15
|
-
import_names_ImportNameCollector["ImportNameCollector (import_names.py:
|
|
16
|
-
import_names_ImportNameCollector_collect["collect (import_names.py:
|
|
17
|
-
import_names_ImportNameCollector_note["note (import_names.py:
|
|
15
|
+
import_names_ImportNameCollector["ImportNameCollector (import_names.py:58)"]:::classNode
|
|
16
|
+
import_names_ImportNameCollector_collect["collect (import_names.py:74)"]:::methodNode
|
|
17
|
+
import_names_ImportNameCollector_note["note (import_names.py:67)"]:::methodNode
|
|
18
18
|
end
|
|
19
19
|
subgraph sg_pipeline["pipeline.py"]
|
|
20
|
-
pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:
|
|
21
|
-
pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:
|
|
22
|
-
pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:
|
|
23
|
-
pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:
|
|
24
|
-
pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:
|
|
25
|
-
pipeline_IngestionPipeline_run["run (pipeline.py:
|
|
26
|
-
pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:
|
|
20
|
+
pipeline_IngestionPipeline_cross_file_inputs_changed["_cross_file_inputs_changed (pipeline.py:292)"]:::methodNode
|
|
21
|
+
pipeline_IngestionPipeline_get_extractor["_get_extractor (pipeline.py:427)"]:::methodNode
|
|
22
|
+
pipeline_IngestionPipeline_is_noop_incremental["_is_noop_incremental (pipeline.py:353)"]:::methodNode
|
|
23
|
+
pipeline_IngestionPipeline_persist_incremental["_persist_incremental (pipeline.py:377)"]:::methodNode
|
|
24
|
+
pipeline_IngestionPipeline_process_file["_process_file (pipeline.py:252)"]:::methodNode
|
|
25
|
+
pipeline_IngestionPipeline_run["run (pipeline.py:115)"]:::methodNode
|
|
26
|
+
pipeline_IngestionPipeline_workspace_root["workspace_root (pipeline.py:98)"]:::methodNode
|
|
27
|
+
pipeline_observe["_observe (pipeline.py:56)"]:::funcNode
|
|
27
28
|
end
|
|
28
29
|
subgraph sg_engine["engine.py"]
|
|
29
30
|
engine_ResolverEngine["ResolverEngine (engine.py:49)"]:::classNode
|
|
30
|
-
engine_ResolverEngine_resolve["resolve (engine.py:
|
|
31
|
+
engine_ResolverEngine_resolve["resolve (engine.py:85)"]:::methodNode
|
|
31
32
|
end
|
|
32
33
|
subgraph sg_uplift["uplift.py"]
|
|
33
34
|
uplift_SemanticUpliftEngine["SemanticUpliftEngine (uplift.py:66)"]:::classNode
|
|
34
35
|
uplift_SemanticUpliftEngine_execute_uplift["execute_uplift (uplift.py:91)"]:::methodNode
|
|
35
36
|
end
|
|
36
37
|
subgraph sg_sqlite_store["sqlite_store.py"]
|
|
37
|
-
sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:
|
|
38
|
+
sqlite_store_SQLiteStore["SQLiteStore (sqlite_store.py:63)"]:::classNode
|
|
38
39
|
end
|
|
39
40
|
pipeline_IngestionPipeline_run -->|REFERENCES| models_Node
|
|
40
41
|
pipeline_IngestionPipeline_run -->|REFERENCES| models_Edge
|
|
41
42
|
pipeline_IngestionPipeline_run -->|REFERENCES| sqlite_store_SQLiteStore
|
|
42
43
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_workspace_root
|
|
43
44
|
pipeline_IngestionPipeline_run -->|CALLS| import_names_ImportNameCollector
|
|
45
|
+
pipeline_IngestionPipeline_run -->|CALLS| pipeline_observe
|
|
44
46
|
pipeline_IngestionPipeline_run -->|CALLS| import_names_ImportNameCollector_note
|
|
45
47
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_get_extractor
|
|
46
48
|
pipeline_IngestionPipeline_run -->|CALLS| pipeline_IngestionPipeline_process_file
|
|
@@ -55,6 +55,60 @@ Point `--output` at a `.db` file. For large repos, add `--incremental` to skip u
|
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
+
### Keeping the graph current (opt-in)
|
|
59
|
+
|
|
60
|
+
Set `"CGIS_AUTO_REFRESH": "1"` in the server's `env` and every graph-reading
|
|
61
|
+
tool first checks whether the files behind the graph changed since the last
|
|
62
|
+
ingest; if they did, it runs an incremental `cgis_ingest` from the recorded
|
|
63
|
+
root with the recorded `--source-root`/`--domains` options before answering.
|
|
64
|
+
A fresh graph costs a few milliseconds of `stat` calls. A stale one costs an
|
|
65
|
+
incremental ingest: under a second for a body edit, a full rebuild when a
|
|
66
|
+
symbol was added, renamed or removed. It never creates a missing database,
|
|
67
|
+
and a graph ingested before this option existed is only reported stale, not
|
|
68
|
+
refreshed, until it is ingested once more.
|
|
69
|
+
|
|
70
|
+
### Refreshing outside the MCP server: hooks, not a watcher
|
|
71
|
+
|
|
72
|
+
cgis has no watch mode, on purpose (#175). A watcher re-ingests on every save,
|
|
73
|
+
and an agent's multi-file edit is a burst of saves, each of which can cost a
|
|
74
|
+
full rebuild; the graph only needs to be current when something reads it. If
|
|
75
|
+
you query from the CLI, or want the graph current before the agent's next
|
|
76
|
+
turn, hang an incremental ingest on an event that ends a burst instead. Use the
|
|
77
|
+
same path and `--source-root`/`--domains` the graph was built with (`./src`
|
|
78
|
+
as in Step 1); a different path renames every node.
|
|
79
|
+
|
|
80
|
+
**Claude Code** — once per finished turn, not once per edit
|
|
81
|
+
(`.claude/settings.json`):
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"hooks": {
|
|
86
|
+
"Stop": [
|
|
87
|
+
{
|
|
88
|
+
"hooks": [
|
|
89
|
+
{
|
|
90
|
+
"type": "command",
|
|
91
|
+
"command": "cd \"$CLAUDE_PROJECT_DIR\" && cgis ingest ./src -o graph.db -i >/dev/null 2>&1 || true"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**git** — after a checkout, pull or rebase swaps many files at once
|
|
101
|
+
(`.git/hooks/post-checkout`, and the same body in `post-merge` and
|
|
102
|
+
`post-rewrite`; make each executable):
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
#!/bin/sh
|
|
106
|
+
cgis ingest ./src -o graph.db -i >/dev/null 2>&1 || true
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`|| true` keeps a failed ingest from failing the hook; the read commands will
|
|
110
|
+
still say the graph is stale.
|
|
111
|
+
|
|
58
112
|
---
|
|
59
113
|
|
|
60
114
|
## Step 3: Available MCP tools
|
|
@@ -160,7 +160,14 @@ Classes nothing in production builds, extends or names — dead-code candidates.
|
|
|
160
160
|
reported orphans were generated entities and the sixth a nested pydantic
|
|
161
161
|
``Config``: the unfiltered report had no actionable row in it (#432).
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
Only **module-level** classes are considered by default; ``include_nested``
|
|
164
|
+
adds classes defined inside a class or function. Across eight measured
|
|
165
|
+
repositories none of the 46 nested rows was dead: most were a ``Meta`` /
|
|
166
|
+
``Config`` a metaclass reads, the rest live classes reached as
|
|
167
|
+
``self.Nested(...)``, which the resolver does not follow (#432).
|
|
168
|
+
|
|
169
|
+
Returns JSON ``{orphans, considered, test_sources, generated_excluded,
|
|
170
|
+
nested_excluded}``;
|
|
164
171
|
each orphan carries ``fqn``/``file``/``line``. **A listing is a candidate for
|
|
165
172
|
deletion, not a proof** — a class named only inside a decorator (#429) or
|
|
166
173
|
arriving through a star import is invisible here, so the sweep errs towards
|
|
@@ -177,6 +184,7 @@ Classes nothing in production builds, extends or names — dead-code candidates.
|
|
|
177
184
|
| `prefix` | `any` | | Only consider classes under this FQN prefix, cut on a dot boundary. |
|
|
178
185
|
| `include_tests` | `boolean` | | Count test code as a user, so the report means "unreachable from anywhere". |
|
|
179
186
|
| `include_generated` | `boolean` | | Include machine-generated classes, which are hidden by default. |
|
|
187
|
+
| `include_nested` | `boolean` | | Include classes nested in a class or function, which are hidden by default. |
|
|
180
188
|
|
|
181
189
|
---
|
|
182
190
|
|
|
@@ -377,10 +385,14 @@ Suggest sub-package boundaries for a package from its dependency communities.
|
|
|
377
385
|
|
|
378
386
|
Returns JSON: modularity_q, divergence, direction (under/over/matched),
|
|
379
387
|
verdict (split/consolidate/aligned/leave/borderline/no_signal), the detected
|
|
380
|
-
communities (id +
|
|
388
|
+
communities (id + members), the cross-community bridge edges (cost of
|
|
381
389
|
splitting), and the thresholds used. Default layer is IMPORTS; set
|
|
382
390
|
``with_calls`` for the combined import+call graph. Run ``cgis_ingest`` first.
|
|
383
391
|
|
|
392
|
+
Members are the package's direct children by default, each sub-package one
|
|
393
|
+
node, so the verdict says whether to regroup them; ``level`` in the result
|
|
394
|
+
says which. ``all_descendants`` clusters every file below the package.
|
|
395
|
+
|
|
384
396
|
A mis-rooted graph (import targets resolve to no internal file) returns
|
|
385
397
|
``no_signal`` with a diagnostic note rather than a silent clean verdict.
|
|
386
398
|
|
|
@@ -390,6 +402,7 @@ Suggest sub-package boundaries for a package from its dependency communities.
|
|
|
390
402
|
| `prefix` | `any` | | FQN prefix of the package to analyse, e.g. cgis.query, matched on whole dot-segments. Needed in practice: without it the verdict is no_signal. |
|
|
391
403
|
| `with_calls` | `boolean` | | Use the combined import + call graph instead of imports only. |
|
|
392
404
|
| `min_q` | `number` | | Modularity threshold: at or above it, a package whose layout disagrees with its communities is flagged split (or consolidate, if over-split). |
|
|
405
|
+
| `all_descendants` | `boolean` | | Cluster every file below the package and compare with its sub-directories, instead of treating each sub-package as one node. |
|
|
393
406
|
|
|
394
407
|
---
|
|
395
408
|
|
{codegraph_brain-0.26.0 → codegraph_brain-0.27.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md
RENAMED
|
@@ -135,6 +135,31 @@ parameter also matched case (b) (an explicit `Depends` inside its
|
|
|
135
135
|
`raw_dep:` candidate for the *outer* annotation is still emitted too — it
|
|
136
136
|
will resolve to a CLASS/external and be dropped; no dedup logic needed.
|
|
137
137
|
|
|
138
|
+
**d) DI in a route decorator (#429, added after slice 1).**
|
|
139
|
+
`@router.post(..., dependencies=[Depends(guard)])` declares a guard at the
|
|
140
|
+
decorator instead of the signature. The `Depends`/`Security` call there is
|
|
141
|
+
handled by the same hook as §3.2b, with one deliberate exception to the rule
|
|
142
|
+
that an edge's source is its lexical owner: the DEPENDS_ON edge is sourced at
|
|
143
|
+
the **decorated function**, not the module the decorator sits in. FastAPI runs
|
|
144
|
+
the dependency before that function, and `cgis audit` reads DEPENDS_ON as the
|
|
145
|
+
evidence a route is guarded, so a module-sourced edge would be accurate about
|
|
146
|
+
location and useless as evidence.
|
|
147
|
+
|
|
148
|
+
- Only a decorated `function_definition` / `async_function_definition`
|
|
149
|
+
(including methods) gets the edge. A decorated **class** keeps the
|
|
150
|
+
CALLS-only treatment: FastAPI never treats a class decorator as a
|
|
151
|
+
dependant.
|
|
152
|
+
- Name-extraction rules are §3.2b's: first positional argument only; argless
|
|
153
|
+
and keyword-only (`Depends(dependency=guard)`) calls emit no edge.
|
|
154
|
+
- This is the only place the exception applies. Calls and name references in
|
|
155
|
+
decorators were already sourced at the decorated definition (#434) — a
|
|
156
|
+
decorator has no other owner — so the exception is confined to DI, which is
|
|
157
|
+
the edge kind that carries "this runs before that" semantics.
|
|
158
|
+
|
|
159
|
+
Population note: on owner-api at `b7d02fe6` one route declared its guard this
|
|
160
|
+
way, against 238 in the signature. The edge is cheap and closes a false
|
|
161
|
+
"unguarded" in a security-facing report; it is not expected to move counts.
|
|
162
|
+
|
|
138
163
|
### 3.3 Resolver (`src/cgis/resolver/engine.py`)
|
|
139
164
|
|
|
140
165
|
- `RAW_DEP_PREFIX = "raw_dep:"` defined here as a module-level constant,
|
|
@@ -7,7 +7,7 @@ packages = ["src/cgis"]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "codegraph-brain"
|
|
10
|
-
version = "0.
|
|
10
|
+
version = "0.27.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"
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"source": "github",
|
|
9
9
|
"id": "1260843154"
|
|
10
10
|
},
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "0.27.0",
|
|
12
12
|
"packages": [
|
|
13
13
|
{
|
|
14
14
|
"registryType": "pypi",
|
|
15
15
|
"registryBaseUrl": "https://pypi.org",
|
|
16
16
|
"identifier": "codegraph-brain",
|
|
17
|
-
"version": "0.
|
|
17
|
+
"version": "0.27.0",
|
|
18
18
|
"runtimeHint": "uvx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Refresh a stale graph before a read tool answers from it (#175).
|
|
2
|
+
|
|
3
|
+
Opt-in: set `CGIS_AUTO_REFRESH=1` in the MCP server's environment. Off by
|
|
4
|
+
default, because it turns every graph-reading tool into one that may write
|
|
5
|
+
the database and take as long as a full rebuild.
|
|
6
|
+
|
|
7
|
+
A refresh is an incremental ingest from the recorded root with the recorded
|
|
8
|
+
options, so it is the same graph `cgis_ingest` would leave, not a guess at it.
|
|
9
|
+
It never runs on a missing database (there is no root to ingest from), on an
|
|
10
|
+
`UNKNOWN` graph, or on one whose ingest options were never recorded. Whatever
|
|
11
|
+
it declines or fails to do, the tool still answers and its freshness note
|
|
12
|
+
still says the graph is stale.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import threading
|
|
17
|
+
import time
|
|
18
|
+
from collections.abc import Callable
|
|
19
|
+
from functools import wraps
|
|
20
|
+
from inspect import signature
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
import structlog
|
|
24
|
+
|
|
25
|
+
from cgis.core.freshness import FreshnessState
|
|
26
|
+
from cgis.extractors.registry import build_extractors
|
|
27
|
+
from cgis.pipeline import IngestionPipeline
|
|
28
|
+
from cgis.storage.sqlite_store import SQLiteStore
|
|
29
|
+
|
|
30
|
+
logger = structlog.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
#: The environment variable that turns refreshing on.
|
|
33
|
+
AUTO_REFRESH_ENV = "CGIS_AUTO_REFRESH"
|
|
34
|
+
_TRUTHY = frozenset({"1", "true", "yes", "on"})
|
|
35
|
+
|
|
36
|
+
#: One refresh at a time in this process. A second caller waits, then finds the
|
|
37
|
+
#: graph fresh and returns, rather than racing the first into "database is
|
|
38
|
+
#: locked" once a rebuild outlasts SQLite's busy timeout.
|
|
39
|
+
_LOCK = threading.Lock()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def auto_refresh_enabled() -> bool:
|
|
43
|
+
"""True when the server's environment opts in to refreshing stale graphs."""
|
|
44
|
+
return os.environ.get(AUTO_REFRESH_ENV, "").strip().lower() in _TRUTHY
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def refresh_if_stale(db_path: str) -> bool:
|
|
48
|
+
"""Bring `db_path` up to date if it is stale and can be refreshed; True if it ran.
|
|
49
|
+
|
|
50
|
+
Never raises: a refresh is a courtesy on top of the query the caller asked
|
|
51
|
+
for, and a failed one leaves the stored graph as it was.
|
|
52
|
+
"""
|
|
53
|
+
if not auto_refresh_enabled() or not Path(db_path).is_file():
|
|
54
|
+
return False
|
|
55
|
+
with _LOCK:
|
|
56
|
+
try:
|
|
57
|
+
return _refresh(db_path)
|
|
58
|
+
except Exception as exc:
|
|
59
|
+
logger.warning("Auto-refresh failed; answering from the stored graph", error=str(exc))
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _refresh(db_path: str) -> bool:
|
|
64
|
+
"""The refresh itself, run under the lock: freshness is re-read here, not before."""
|
|
65
|
+
with SQLiteStore(db_path) as store:
|
|
66
|
+
if store.freshness().state is not FreshnessState.STALE:
|
|
67
|
+
return False
|
|
68
|
+
recorded = store.get_ingest_state()
|
|
69
|
+
options = store.get_ingest_options()
|
|
70
|
+
if recorded is None or options is None:
|
|
71
|
+
logger.info("Graph is stale but its ingest options were never recorded; not refreshing")
|
|
72
|
+
return False
|
|
73
|
+
root = recorded[0]
|
|
74
|
+
source_roots, domains = options
|
|
75
|
+
if domains is not None and not Path(domains).is_file():
|
|
76
|
+
logger.info(
|
|
77
|
+
"Graph is stale but its domains file is gone; not refreshing", domains=domains
|
|
78
|
+
)
|
|
79
|
+
return False
|
|
80
|
+
started = time.perf_counter()
|
|
81
|
+
pipeline = IngestionPipeline(build_extractors(source_roots), domains_config=domains)
|
|
82
|
+
nodes, _raw, _resolved = pipeline.run(root, store=store)
|
|
83
|
+
if nodes:
|
|
84
|
+
store.record_ingest(root, pipeline.observed_mtimes)
|
|
85
|
+
logger.info(
|
|
86
|
+
"Auto-refreshed stale graph",
|
|
87
|
+
db=db_path,
|
|
88
|
+
root=root,
|
|
89
|
+
seconds=round(time.perf_counter() - started, 3),
|
|
90
|
+
)
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def refreshes_graph[**P, R](tool: Callable[P, R]) -> Callable[P, R]:
|
|
95
|
+
"""Refresh the tool's `db_path` graph, if opted in and stale, before the tool runs.
|
|
96
|
+
|
|
97
|
+
`wraps` keeps the signature the MCP SDK builds the tool's schema from.
|
|
98
|
+
"""
|
|
99
|
+
params = signature(tool)
|
|
100
|
+
|
|
101
|
+
@wraps(tool)
|
|
102
|
+
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
|
|
103
|
+
bound = params.bind(*args, **kwargs)
|
|
104
|
+
bound.apply_defaults()
|
|
105
|
+
db_path = bound.arguments.get("db_path")
|
|
106
|
+
if isinstance(db_path, str):
|
|
107
|
+
refresh_if_stale(db_path)
|
|
108
|
+
return tool(*args, **kwargs)
|
|
109
|
+
|
|
110
|
+
return wrapper
|