codegraph-brain 0.6.0__tar.gz → 0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codegraph_brain-0.7.1/.claude-plugin/marketplace.json +31 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.github/workflows/autodoc.yml +0 -1
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.github/workflows/ci.yml +0 -1
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.github/workflows/release-please.yml +0 -1
- codegraph_brain-0.7.1/.release-please-manifest.json +3 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/CHANGELOG.md +21 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/PKG-INFO +28 -1
- codegraph_brain-0.7.1/PRIVACY.md +45 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/README.md +27 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/CURATION.md +18 -1
- codegraph_brain-0.7.1/benchmarks/guardian/pr-278.yaml +22 -0
- codegraph_brain-0.7.1/docs/AUDIT.md +88 -0
- codegraph_brain-0.7.1/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +155 -0
- codegraph_brain-0.7.1/plugin/.claude-plugin/plugin.json +22 -0
- codegraph_brain-0.7.1/plugin/.mcp.json +8 -0
- codegraph_brain-0.7.1/plugin/README.md +45 -0
- codegraph_brain-0.7.1/plugin/skills/cgis/SKILL.md +50 -0
- codegraph_brain-0.7.1/plugin/skills/ingest/SKILL.md +30 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/pyproject.toml +1 -1
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_bench.py +15 -3
- codegraph_brain-0.6.0/.release-please-manifest.json +0 -3
- codegraph_brain-0.6.0/benchmarks/guardian/pr-278.yaml +0 -10
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.github/workflows/guardian.yml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.gitignore +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.pre-commit-config.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/.python-version +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/CLAUDE.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/CONTRIBUTING.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/LICENSE +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/Makefile +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-122.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-140.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-141.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-142.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-143.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/pr-144.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/benchmarks/guardian/results.jsonl +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/data/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/CASE_STUDY.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/HOW_IT_WORKS.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/ONTOLOGY.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/SELF_PORTRAIT.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/diagrams/pipeline_flow.mermaid +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/architecture/health_badge.json +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/examples/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/how-to/AGENT_ONBOARDING.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/how-to/CLI_USAGE.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/how-to/MCP_REFERENCE.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/ontology/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/ontology/core.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/ontology/domains.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/ontology/patterns.yaml +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/BLUEPRINT.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/PRD.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/TDD.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/main.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/release-please-config.json +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/gen_ideal_graph.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/generate_health.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/generate_mcp_ref.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/generate_schema_docs.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/guardian_bench.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/guardian_review.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/inject_readme_graph.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/probe_closure_gap.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/scripts/probe_tier_ladder.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/__main__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/api/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/api/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/api/mcp_server.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/cli.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/core/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/core/models.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/_python_ast.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/_python_classes.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/_python_functions.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/_python_imports.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/_python_types.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/base.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/python_extractor.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/extractors/typescript_extractor.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/bench.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/chunked.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/chunker.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/collector.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/core.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/diff_index.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/findings.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/github_poster.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/metrics.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/prompts.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/providers/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/providers/base.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/providers/gemini.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/providers/mistral.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/providers/ollama.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/recording.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/render.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/runner.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/guardian/skeptic.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/pipeline.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/py.typed +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/analyzer.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/anomaly.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/cohesion.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/health.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/analysis/suggest_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/context/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/context/audit.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/context/context_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/context/prompt.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/context/snippet.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/_scc.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/drift.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/drift_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/fingerprint.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/fractal.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/ontology_init.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/quotient.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/drift/triads.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/engine.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/fqn.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/render/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/render/graph_json.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/render/mermaid.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/query/render/metrics.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/engine.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/indices.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/symbols.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/resolver/uplift.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/storage/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/src/cgis/storage/sqlite_store.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/integration/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/__init__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/conftest.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_architecture.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_drift.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_fractal.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_self_parse.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_self_parse_ts.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/self_parsing/test_suggest.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/.gitkeep +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/conftest.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/guardian_stubs.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test___main__.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_analyzer.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_audit.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_cli.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_cohesion.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_context_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_di_acceptance.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_drift.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_drift_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_fingerprint.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_fqn.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_fractal.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_gen_ideal_graph.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_generate_mcp_ref.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_graph_json.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_chunked.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_chunker.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_collector.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_core.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_diff_index.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_findings.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_metrics.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_poster.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_providers.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_recording.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_render.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_runner.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_guardian_skeptic.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_health_scorer.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_import_acceptance.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_mcp_server.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_mermaid.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_metrics.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_models.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_ontology_compliance.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_ontology_init.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_patterns_yaml.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_pipeline.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_prompt.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_python_extractor.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_quotient.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_resolver.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_resolver_indices.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_resolver_symbols.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_snippet.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_sqlite_store.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_suggest_service.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_triads.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_typescript_extractor.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/tests/unit/test_uplift.py +0 -0
- {codegraph_brain-0.6.0 → codegraph_brain-0.7.1}/uv.lock +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "codegraph-brain",
|
|
4
|
+
"description": "Code Graph Intelligence for AI agents — a deterministic semantic graph of your codebase, exposed as MCP tools.",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "Andrey G",
|
|
7
|
+
"url": "https://github.com/zaebee"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "cgis",
|
|
12
|
+
"source": "./plugin",
|
|
13
|
+
"description": "Gives Claude a deterministic semantic graph of your codebase instead of flat text. Exact callers, real blast radius, and scoped context in a few hundred tokens rather than whole files.",
|
|
14
|
+
"version": "0.6.0",
|
|
15
|
+
"category": "development",
|
|
16
|
+
"author": {
|
|
17
|
+
"name": "Andrey G",
|
|
18
|
+
"url": "https://github.com/zaebee"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/zaebee/codegraph-brain",
|
|
21
|
+
"tags": [
|
|
22
|
+
"code-graph",
|
|
23
|
+
"static-analysis",
|
|
24
|
+
"impact-analysis",
|
|
25
|
+
"architecture",
|
|
26
|
+
"python",
|
|
27
|
+
"typescript"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.7.1](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.7.0...codegraph-brain-v0.7.1) (2026-07-31)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Documentation
|
|
7
|
+
|
|
8
|
+
* add privacy policy ([#293](https://github.com/zaebee/codegraph-brain/issues/293)) ([33e45c2](https://github.com/zaebee/codegraph-brain/commit/33e45c2623d6d4a4c05106631fe2815ce1acf62e))
|
|
9
|
+
* add the architecture audit offering ([#296](https://github.com/zaebee/codegraph-brain/issues/296)) ([086396d](https://github.com/zaebee/codegraph-brain/commit/086396dbfa569a5091439811d6ec00e1b094386f))
|
|
10
|
+
|
|
11
|
+
## [0.7.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.6.0...codegraph-brain-v0.7.0) (2026-07-31)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* **plugin:** ship CGIS as a Claude Code plugin ([#290](https://github.com/zaebee/codegraph-brain/issues/290)) ([c93c7ed](https://github.com/zaebee/codegraph-brain/commit/c93c7ed377943081525c8965bc3a7ce5e5ccf7c1))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Documentation
|
|
20
|
+
|
|
21
|
+
* **plugin:** disclose the PyPI fetch and the local-only guarantee ([#291](https://github.com/zaebee/codegraph-brain/issues/291)) ([278560c](https://github.com/zaebee/codegraph-brain/commit/278560c74d7d9deae076511ce8659c233c41bcfc))
|
|
22
|
+
* **specs:** finder bug-class taxonomy + a real Resource Management fixture ([#258](https://github.com/zaebee/codegraph-brain/issues/258)) ([#288](https://github.com/zaebee/codegraph-brain/issues/288)) ([1e02d06](https://github.com/zaebee/codegraph-brain/commit/1e02d06a1599d87dbc4958cb6e6db6e0acaae605))
|
|
23
|
+
|
|
3
24
|
## [0.6.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.5.0...codegraph-brain-v0.6.0) (2026-07-31)
|
|
4
25
|
|
|
5
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codegraph-brain
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
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
|
|
@@ -124,6 +124,19 @@ cgis impact "my_module.core_function" --depth 5
|
|
|
124
124
|
|
|
125
125
|
---
|
|
126
126
|
|
|
127
|
+
## 🔌 Install as a Claude Code plugin
|
|
128
|
+
|
|
129
|
+
The fastest path — no config files, no paths to wire up:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
/plugin marketplace add zaebee/codegraph-brain
|
|
133
|
+
/plugin install cgis@codegraph-brain
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
That ships the MCP server, a skill that teaches the agent *when* to query the graph instead of reading files, and `/cgis:ingest` to build the graph on first use. The server is pulled from PyPI on demand via `uvx`, so there is nothing to clone or build.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
127
140
|
## 🤖 Agent Integration (MCP)
|
|
128
141
|
|
|
129
142
|
CGIS is designed to be plugged into your AI workflow via the **Model Context Protocol (MCP)**. Once running, your agent gains "Superpowers":
|
|
@@ -222,6 +235,20 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
|
|
|
222
235
|
|
|
223
236
|
---
|
|
224
237
|
|
|
238
|
+
## 💼 Architecture Audit
|
|
239
|
+
|
|
240
|
+
CGIS is free and you can run it yourself. If you would rather have the analysis than the tool, I run a fixed-price audit of your codebase's structure — authorisation coverage, blast radius, coupling, architectural drift — delivered in five working days.
|
|
241
|
+
|
|
242
|
+
**[Read what's included →](docs/AUDIT.md)** — $2,400 fixed, with an explicit list of what the analysis cannot see.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 🔒 Privacy
|
|
247
|
+
|
|
248
|
+
CGIS collects nothing: no telemetry, no analytics, no account. Your code and the graph built from it stay on your machine. See [PRIVACY.md](PRIVACY.md).
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
225
252
|
## 🛠️ Development
|
|
226
253
|
|
|
227
254
|
### Requirements
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Privacy Policy
|
|
2
|
+
|
|
3
|
+
**Last updated:** 31 July 2026
|
|
4
|
+
|
|
5
|
+
This policy covers the **CGIS Claude Code plugin** and the **`codegraph-brain`** package it installs.
|
|
6
|
+
|
|
7
|
+
## The short version
|
|
8
|
+
|
|
9
|
+
CGIS collects nothing. There is no telemetry, no analytics, no usage reporting, no crash reporting, and no account. Your source code and the graph built from it stay on your machine. Nothing is sent to the author of this software, and there is no server to send it to.
|
|
10
|
+
|
|
11
|
+
## What runs where
|
|
12
|
+
|
|
13
|
+
**On your machine.** CGIS parses your source files with Tree-sitter and writes the resulting graph to a SQLite file (`graph.db` by default) in your project directory. Parsing, storage and every query happen locally. The graph contains structural information derived from your code — file paths, symbol names, line numbers and the call relationships between them — and it never leaves your disk.
|
|
14
|
+
|
|
15
|
+
**Over the network, once.** On first use the plugin fetches the `codegraph-brain` package from the Python Package Index using `uvx`. This is an ordinary package download. PyPI is operated by the Python Software Foundation and applies its own logging and privacy practices to that request; see the [PSF Privacy Notice](https://www.python.org/privacy/). After the download is cached, the plugin makes no further network requests.
|
|
16
|
+
|
|
17
|
+
## Data we collect
|
|
18
|
+
|
|
19
|
+
None.
|
|
20
|
+
|
|
21
|
+
We do not collect, transmit, store or have access to: your source code, the graphs built from it, file or repository names, prompts, tool calls, IP addresses, machine identifiers, usage counts, error reports, or anything else. This is not a matter of policy but of architecture — the software has no code that sends data anywhere, and no infrastructure to receive it.
|
|
22
|
+
|
|
23
|
+
## Guardian, and when data does leave your machine
|
|
24
|
+
|
|
25
|
+
The `codegraph-brain` package also contains **Guardian**, a code reviewer that sends diffs and graph context to a large language model. **Guardian is not part of the Claude Code plugin**: the plugin neither ships nor invokes it, and it does nothing unless you configure it and run it deliberately, normally in CI.
|
|
26
|
+
|
|
27
|
+
If you choose to use Guardian, you select the model provider yourself — Google Gemini, Mistral, Cohere, or a local Ollama instance — and supply your own credentials. In that case the code being reviewed is sent to whichever provider you chose, under **that provider's** privacy policy and terms, not this one. Choosing Ollama keeps it local. We never see that traffic and never receive a copy.
|
|
28
|
+
|
|
29
|
+
Credentials for those providers are read from your environment and used only to call the provider they belong to. They are not logged, stored or transmitted anywhere else.
|
|
30
|
+
|
|
31
|
+
## What CGIS never touches
|
|
32
|
+
|
|
33
|
+
CGIS reads source files under the path you point it at. It does not read your SSH keys, cloud credentials, browser data, keychain, clipboard, shell history, or files outside the directory you ingest. The plugin registers no Claude Code hooks, so it observes nothing about sessions, prompts or tool calls beyond its own tool invocations.
|
|
34
|
+
|
|
35
|
+
## Children
|
|
36
|
+
|
|
37
|
+
This is a developer tool and is not directed at children.
|
|
38
|
+
|
|
39
|
+
## Changes
|
|
40
|
+
|
|
41
|
+
Material changes to this policy will be recorded in this file, and its history is public in the repository's git log.
|
|
42
|
+
|
|
43
|
+
## Contact
|
|
44
|
+
|
|
45
|
+
Questions about privacy: open an issue at [github.com/zaebee/codegraph-brain/issues](https://github.com/zaebee/codegraph-brain/issues), or email zaebuntu@gmail.com.
|
|
@@ -74,6 +74,19 @@ cgis impact "my_module.core_function" --depth 5
|
|
|
74
74
|
|
|
75
75
|
---
|
|
76
76
|
|
|
77
|
+
## 🔌 Install as a Claude Code plugin
|
|
78
|
+
|
|
79
|
+
The fastest path — no config files, no paths to wire up:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
/plugin marketplace add zaebee/codegraph-brain
|
|
83
|
+
/plugin install cgis@codegraph-brain
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
That ships the MCP server, a skill that teaches the agent *when* to query the graph instead of reading files, and `/cgis:ingest` to build the graph on first use. The server is pulled from PyPI on demand via `uvx`, so there is nothing to clone or build.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
77
90
|
## 🤖 Agent Integration (MCP)
|
|
78
91
|
|
|
79
92
|
CGIS is designed to be plugged into your AI workflow via the **Model Context Protocol (MCP)**. Once running, your agent gains "Superpowers":
|
|
@@ -172,6 +185,20 @@ classDef externalNode fill:#fff3e0,stroke:#e65100,stroke-width:1px,stroke-dashar
|
|
|
172
185
|
|
|
173
186
|
---
|
|
174
187
|
|
|
188
|
+
## 💼 Architecture Audit
|
|
189
|
+
|
|
190
|
+
CGIS is free and you can run it yourself. If you would rather have the analysis than the tool, I run a fixed-price audit of your codebase's structure — authorisation coverage, blast radius, coupling, architectural drift — delivered in five working days.
|
|
191
|
+
|
|
192
|
+
**[Read what's included →](docs/AUDIT.md)** — $2,400 fixed, with an explicit list of what the analysis cannot see.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 🔒 Privacy
|
|
197
|
+
|
|
198
|
+
CGIS collects nothing: no telemetry, no analytics, no account. Your code and the graph built from it stay on your machine. See [PRIVACY.md](PRIVACY.md).
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
175
202
|
## 🛠️ Development
|
|
176
203
|
|
|
177
204
|
### Requirements
|
|
@@ -172,7 +172,6 @@ Ambiguous (3 declined clips, gemini agreed with rationale):
|
|
|
172
172
|
- **review_head = 6ee175e553c784a363c190e00021be5d365fb8dd** (later commits on
|
|
173
173
|
the branch postdate the review)
|
|
174
174
|
|
|
175
|
-
GT findings: NONE → recall vacuously 1.0; this PR measures precision only.
|
|
176
175
|
Guardian returned 10 findings, all skeptic-confirmed, all refuted (#279):
|
|
177
176
|
|
|
178
177
|
- `base.py:102` remove the "unreachable" `raise AssertionError` — **would break
|
|
@@ -189,3 +188,21 @@ Guardian returned 10 findings, all skeptic-confirmed, all refuted (#279):
|
|
|
189
188
|
module has any; it is a plain dict → JSON
|
|
190
189
|
- two test findings on brittle call counts — one's premise is false, the test
|
|
191
190
|
already derives its expectation from `MAX_ATTEMPTS`
|
|
191
|
+
|
|
192
|
+
### PR 278 — one GT finding added 2026-07-31 (#258)
|
|
193
|
+
|
|
194
|
+
Originally filed with `findings: []` as a pure precision entry. It now carries one:
|
|
195
|
+
|
|
196
|
+
- `gemini-client-never-closed` (`src/cgis/guardian/providers/gemini.py`, lines
|
|
197
|
+
41-58, minor, contract, source `fix-commit`)
|
|
198
|
+
|
|
199
|
+
The diff **modified** the `client = genai.Client(...)` construction line and left
|
|
200
|
+
both httpx pools unclosed. Guardian reviewed that hunk and returned ten findings,
|
|
201
|
+
none about resource cleanup — Resource Management is a class absent from the
|
|
202
|
+
finder's focus areas (see `docs/specs/2026-07-31-finder-bug-class-taxonomy.md`).
|
|
203
|
+
Fixed later by human-directed review as #283 (`b2ae97b`), which is the
|
|
204
|
+
`fix-commit` provenance.
|
|
205
|
+
|
|
206
|
+
Precision is unaffected: `matched` stays 0, so the entry still scores `0/10`. The
|
|
207
|
+
addition supplies a recall signal — a real **0/1** where the empty ground truth
|
|
208
|
+
gave a vacuous 1.0.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# PR 278 — fix(guardian): explicit request timeout + bounded retry. See CURATION.md.
|
|
2
|
+
# Guardian produced 10 findings, skeptic-confirmed 10/10, ALL refuted (#279).
|
|
3
|
+
# head = review head (the snapshot guardian actually ran on); the two later
|
|
4
|
+
# commits on that branch postdate the review.
|
|
5
|
+
# One GT finding added 2026-07-31 (#258): the diff MODIFIED the genai.Client
|
|
6
|
+
# construction line and left both httpx pools unclosed. Guardian saw that hunk
|
|
7
|
+
# and returned 10 findings, none about resource cleanup — a class absent from
|
|
8
|
+
# the finder's focus areas. Fixed later in #283 (b2ae97b).
|
|
9
|
+
# Precision is unchanged by the addition (matched stays 0, so 0/10); what it adds
|
|
10
|
+
# is a recall signal: 0/1 instead of a vacuous 1.0.
|
|
11
|
+
pr: 278
|
|
12
|
+
base: 2e768cef585f10481970697657b0a9b40a411f47
|
|
13
|
+
head: 6ee175e553c784a363c190e00021be5d365fb8dd
|
|
14
|
+
findings:
|
|
15
|
+
- id: gemini-client-never-closed
|
|
16
|
+
file: src/cgis/guardian/providers/gemini.py
|
|
17
|
+
lines: [41, 58]
|
|
18
|
+
severity: minor
|
|
19
|
+
category: contract
|
|
20
|
+
summary: genai.Client opens a sync and an async httpx pool; neither is closed
|
|
21
|
+
source: fix-commit
|
|
22
|
+
ambiguous: []
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 🔎 Architecture Audit
|
|
2
|
+
|
|
3
|
+
**A measured read of your codebase's structure, delivered in five working days. $2,400 fixed.**
|
|
4
|
+
|
|
5
|
+
CGIS is free and you can run it yourself. This is for teams who want the analysis rather than the tool: someone who has read a lot of these graphs telling you what yours says.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What you get
|
|
10
|
+
|
|
11
|
+
A written report, the graph itself, and ninety minutes on a call to walk through it.
|
|
12
|
+
|
|
13
|
+
| Section | Measured with | The question it answers |
|
|
14
|
+
| :--- | :--- | :--- |
|
|
15
|
+
| **Authorisation coverage** | `cgis_audit_reachability` | Does every route handler actually reach its authz guard? |
|
|
16
|
+
| **Blast radius** | `cgis_analyze_impact` | What breaks if we make the three changes we are planning? |
|
|
17
|
+
| **Coupling and god-classes** | `cgis_metrics` | Which parts will fight back hardest during a refactor? |
|
|
18
|
+
| **Architectural drift** | `cgis_drift` | How far has each domain moved from the pattern we said we follow? |
|
|
19
|
+
| **Graph integrity** | `cgis_validate` | How much of this codebase is even amenable to static analysis? |
|
|
20
|
+
|
|
21
|
+
The first row is the one that usually pays for the engagement. *"Is there a route in our API that reaches the database without passing a permission check?"* is a question with money attached, and nobody checks it by hand because on a few hundred endpoints it is a week of tedium. On the graph it is a traversal.
|
|
22
|
+
|
|
23
|
+
The report names specific handlers, files and line numbers. It is not a maturity score out of ten.
|
|
24
|
+
|
|
25
|
+
**You keep the graph.** The `graph.db` is handed over with the report, so your team can keep asking it questions after the engagement ends — including from Claude Code, via the plugin.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## How it runs
|
|
30
|
+
|
|
31
|
+
1. **Access.** A read-only clone or a tarball. No production access, no credentials, no environment.
|
|
32
|
+
2. **Ingest.** Your repositories go into a graph. If resolution comes out unusually low, you hear about it on day one, not in the report.
|
|
33
|
+
3. **Analysis.** The five sections above, plus whatever the graph turns up that I did not expect. That last part is usually the interesting one.
|
|
34
|
+
4. **Report.** Written, specific, with file and line references throughout.
|
|
35
|
+
5. **Walkthrough.** Ninety minutes with whoever needs to act on it. Recorded if you want it.
|
|
36
|
+
|
|
37
|
+
Five working days from receiving the code.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Price
|
|
42
|
+
|
|
43
|
+
**$2,400** for up to **three repositories** and **150,000 lines** of Python and TypeScript.
|
|
44
|
+
|
|
45
|
+
Larger estates are quoted after a look at the tree — the honest number depends on how many resolution edge cases the code has, not on line count alone. There is no hourly rate and no change-order mechanism: the scope above is the scope.
|
|
46
|
+
|
|
47
|
+
**Included:** the report, the graph, the walkthrough, and one round of follow-up questions by email within thirty days.
|
|
48
|
+
|
|
49
|
+
**Not included:** implementing the fixes. If you want the drift gates wired into CI or Guardian reviewing your pull requests, that is separate work and we can talk about it after you have read the report — not before.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## What this is not
|
|
54
|
+
|
|
55
|
+
The graph is static structure. That boundary is real, and it is better stated here than discovered halfway through.
|
|
56
|
+
|
|
57
|
+
- **Not a penetration test.** Authorisation *coverage* means every handler has a static path to a guard. It does not mean the guard is correct, that the logic behind it is sound, or that the endpoint is unexploitable.
|
|
58
|
+
- **Not a runtime analysis.** Nothing is executed. Behaviour that only appears under load, concurrency or real data is out of scope.
|
|
59
|
+
- **Not a business-logic review.** The report says how your code is wired, not whether the wiring implements the right rules.
|
|
60
|
+
- **Not language-complete.** Extractors cover Python and TypeScript. Vue, Astro, Go, Rust and everything else are invisible to the graph, and the report will say which parts of your codebase it could not see.
|
|
61
|
+
- **Not a substitute for judgement.** An empty impact result means *no static callers found*, not *safe to delete*. Dynamic dispatch, registries and framework decorators do not appear in any static graph. The report flags where this matters instead of asserting a safety it cannot see.
|
|
62
|
+
|
|
63
|
+
Roughly a tenth of call edges in a typical Python codebase cannot be resolved statically at all — they are calls on objects typed at runtime. That number is in the report too, because it tells you how much of the analysis to trust.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Who this is for
|
|
68
|
+
|
|
69
|
+
**A good fit if:** you have a Python or TypeScript codebase large enough that no one holds it in their head, you are planning a migration or a significant refactor, you are onboarding AI agents onto the codebase and getting confident nonsense back, or someone has asked whether your authorisation is actually complete and nobody can answer.
|
|
70
|
+
|
|
71
|
+
**A poor fit if:** the codebase is small enough to read, the languages are outside the extractors, or what you actually need is a security assessment — in which case hire a security firm, and this is at best a first pass that tells them where to look.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Evidence
|
|
76
|
+
|
|
77
|
+
Before commissioning anything, read the [case study](CASE_STUDY.md). It is CGIS run against a real twelve-repository estate — 8,146 commits, four languages — with every figure measured and a section on what the analysis could not cover.
|
|
78
|
+
|
|
79
|
+
If that page reads as honest to you, this engagement will run the same way. If it does not, we should not work together.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Get in touch
|
|
84
|
+
|
|
85
|
+
- **Email:** zaebuntu@gmail.com
|
|
86
|
+
- **GitHub:** [open an issue](https://github.com/zaebee/codegraph-brain/issues) — fine for questions about scope, though most people prefer email for anything involving their own codebase
|
|
87
|
+
|
|
88
|
+
Tell me roughly how large the codebase is and what you are trying to decide. If the audit is not the right thing for your situation, I will say so.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Finder bug-class taxonomy — gap analysis (#258)
|
|
2
|
+
|
|
3
|
+
**Status:** research input, **nothing shipped** (2026-07-31)
|
|
4
|
+
**Issue:** #258
|
|
5
|
+
**Lane:** guardian
|
|
6
|
+
|
|
7
|
+
## What this is, and what it deliberately is not
|
|
8
|
+
|
|
9
|
+
#258 asks to broaden the finder's focus areas using
|
|
10
|
+
[alibaba/open-code-review](https://github.com/alibaba/open-code-review) (Apache-2.0)
|
|
11
|
+
as a source. This document does the mining and the gap analysis. It **does not
|
|
12
|
+
change the prompt**, and the reason is in the evidence below: a taxonomy checklist
|
|
13
|
+
is not a proven recall lever in this project, and the one adjacent experiment
|
|
14
|
+
regressed a class the finder was reliably catching.
|
|
15
|
+
|
|
16
|
+
What it produces instead is the two things that were missing before that decision
|
|
17
|
+
can be made: a grounded class list, and a benchmark fixture that contains a real
|
|
18
|
+
instance of the top gap.
|
|
19
|
+
|
|
20
|
+
## The source
|
|
21
|
+
|
|
22
|
+
The taxonomy lives in `internal/config/rules/rule_docs/*.md` — per-language rule
|
|
23
|
+
documents, not a single ruleset file. Read `python.md` (language-specific) and
|
|
24
|
+
`default.md` (language-agnostic axes).
|
|
25
|
+
|
|
26
|
+
`default.md` gives five axes: **Correctness, Security, Performance,
|
|
27
|
+
Maintainability, Test Coverage.**
|
|
28
|
+
|
|
29
|
+
`python.md` names ten classes:
|
|
30
|
+
|
|
31
|
+
| # | class | representative rules |
|
|
32
|
+
|---|-------|----------------------|
|
|
33
|
+
| 1 | Obvious Typos or Spelling Errors | misspellings at declaration sites, in log/exception strings |
|
|
34
|
+
| 2 | Dead Code | unreachable branches, unread variables/imports, commented-out blocks |
|
|
35
|
+
| 3 | Mutable Default Arguments and Shared State | `def f(x=[])`, class-level mutables, loop-variable closures |
|
|
36
|
+
| 4 | Boundary and Edge-Case Handling | empty-collection indexing, off-by-one, `None` reaching non-optional code, **float `==`**, `d[k]` vs `d.get(k)` |
|
|
37
|
+
| 5 | Error Handling and Exceptions | bare `except:`, over-broad `except Exception`, silently discarded exceptions, lost traceback, over-wide `try`, `assert` for runtime validation |
|
|
38
|
+
| 6 | Identity and Equality Comparisons | `is` against literals, `== True`, `== None` |
|
|
39
|
+
| 7 | **Resource Management** | files/sockets/locks/connections without `with`; **"resources acquired in a `try` whose `finally` cleanup is missing or incomplete on the error path"** |
|
|
40
|
+
| 8 | Performance | `+=` string building, list membership tests, loop-invariant recomputation, eager f-strings in logging |
|
|
41
|
+
| 9 | Concurrency and Async | check-then-act races, blocking calls inside `async def`, **asyncio tasks created and never awaited**, unsynchronised shared state |
|
|
42
|
+
| 10 | Security-Sensitive Code | `eval`/`exec`, `subprocess(shell=True)`, `pickle`/`yaml.load` without SafeLoader, string-built SQL, secrets in logs, weak crypto, path traversal |
|
|
43
|
+
|
|
44
|
+
## A framing incompatibility that must not be copied
|
|
45
|
+
|
|
46
|
+
`python.md` opens with:
|
|
47
|
+
|
|
48
|
+
> Favor precision over recall: only raise an issue when you are confident it is a
|
|
49
|
+
> real defect, and stay silent when the surrounding context is unclear.
|
|
50
|
+
|
|
51
|
+
That is the **opposite** of this project's finder, which was deliberately moved to
|
|
52
|
+
the max-recall end in #249 (cap removed, confidence gate dropped, "surface every
|
|
53
|
+
plausible finding") on the recall-then-filter architecture. Their rules also
|
|
54
|
+
repeatedly instruct the model to *confirm with a file read before flagging* —
|
|
55
|
+
an agentic capability our finder does not have.
|
|
56
|
+
|
|
57
|
+
**Borrow the class names. Do not borrow the framing.** Lifting their preamble
|
|
58
|
+
would undo #249.
|
|
59
|
+
|
|
60
|
+
## Gap analysis against the current focus areas
|
|
61
|
+
|
|
62
|
+
`prompts.py` currently names seven: Logic bugs, Unvalidated external data,
|
|
63
|
+
Exact-equality on floats/money, Missing test coverage, Type safety, Library
|
|
64
|
+
boundary contracts, Ontology compliance.
|
|
65
|
+
|
|
66
|
+
Mapped against the source:
|
|
67
|
+
|
|
68
|
+
| source class | our coverage |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Boundary and Edge-Case Handling | **covered** — split across "Logic bugs" and "Exact-equality on floats" |
|
|
71
|
+
| Test Coverage | **covered** — "Missing test coverage" |
|
|
72
|
+
| Security-Sensitive Code | **absent** |
|
|
73
|
+
| Concurrency and Async | **absent** |
|
|
74
|
+
| Resource Management | **absent** |
|
|
75
|
+
| Error Handling and Exceptions | **absent** |
|
|
76
|
+
| Mutable Default Arguments | absent |
|
|
77
|
+
| Identity and Equality Comparisons | absent |
|
|
78
|
+
| Dead Code | absent |
|
|
79
|
+
| Performance | absent |
|
|
80
|
+
| — | "Type safety" and "Ontology compliance" are ours alone (mypy-strict and the cgis graph contract); no counterpart, and correctly so |
|
|
81
|
+
|
|
82
|
+
### Four gaps have evidence in this repository, not just in the abstract
|
|
83
|
+
|
|
84
|
+
- **Resource Management.** PR #278's diff *modified* the
|
|
85
|
+
`client = genai.Client(...)` line in `gemini.py` and left both httpx pools
|
|
86
|
+
unclosed. Guardian reviewed that hunk and returned 10 findings, none about
|
|
87
|
+
resource cleanup. Fixed later by human-directed review as #283. The source's
|
|
88
|
+
wording — cleanup "missing or incomplete on the error path" — even covers the
|
|
89
|
+
follow-on defect found in review of that fix, where a throwing `aclose()`
|
|
90
|
+
skipped `client.close()`.
|
|
91
|
+
- **Error Handling and Exceptions.** The recording guard added in #279 was written
|
|
92
|
+
as `except Exception` and was too broad: it swallowed the `ValueError` a
|
|
93
|
+
mistyped path raises. Caught by an independent reviewer, not by the finder.
|
|
94
|
+
- **Security-Sensitive Code.** This repo parses YAML (`load_ground_truth`,
|
|
95
|
+
`patterns.yaml`) and shells out to `git` and `gh` throughout `guardian_bench.py`
|
|
96
|
+
and `collector.py`. Two of the source's rules — `yaml.load` without `SafeLoader`,
|
|
97
|
+
`subprocess` with `shell=True` — target exactly those surfaces.
|
|
98
|
+
- **Concurrency and Async.** The whole guardian path is async: providers, chunked
|
|
99
|
+
review, `judge_all`'s concurrency. "asyncio tasks created and never awaited" and
|
|
100
|
+
"blocking calls inside `async def`" are live risks here.
|
|
101
|
+
|
|
102
|
+
The remaining four gaps (mutable defaults, identity comparisons, dead code,
|
|
103
|
+
performance) have no observed instance in this codebase. They are candidates, not
|
|
104
|
+
findings.
|
|
105
|
+
|
|
106
|
+
## Why the prompt is not being changed here
|
|
107
|
+
|
|
108
|
+
Two independent pieces of evidence:
|
|
109
|
+
|
|
110
|
+
1. **The lever is unproven.** The deep-research synthesis behind #249 ranked levers
|
|
111
|
+
by vote; "refined checklist raised recall 0.66→0.93" was **killed 0-3**, and
|
|
112
|
+
"few-shot beats taxonomy+CoT" was also killed. The defect checklist was
|
|
113
|
+
explicitly demoted to "a light scaffold, NOT the main bet" — the main bets being
|
|
114
|
+
cap removal, the max-recall instruction, and sampling.
|
|
115
|
+
2. **The adjacent experiment regressed.** Expanding few-shot with a targeted float
|
|
116
|
+
example did not crack the float class *and* dropped pr-144 from a median 3/5 to
|
|
117
|
+
1/5 — it pulled finder attention away from the yaml class it was catching
|
|
118
|
+
reliably. Reverted on no-evidence-no-ship (#247's over-anchoring lesson, which
|
|
119
|
+
#258 itself cites).
|
|
120
|
+
|
|
121
|
+
A compact named-class checklist is a weaker intervention than the few-shot that
|
|
122
|
+
burned us, so it may well be safe. But "may well be" is not a measurement, and
|
|
123
|
+
this system has swung on single-finding deltas before.
|
|
124
|
+
|
|
125
|
+
## What would make the change decidable
|
|
126
|
+
|
|
127
|
+
#258 says to validate "once a suitable fixture exists". One now does:
|
|
128
|
+
`benchmarks/guardian/pr-278.yaml` carries a real Resource Management defect
|
|
129
|
+
(`gemini-client-never-closed`) that the current finder demonstrably missed, on a
|
|
130
|
+
diff whose review head is pinned.
|
|
131
|
+
|
|
132
|
+
Adding the ground truth does not disturb the precision baseline published in #279:
|
|
133
|
+
`precision = matched / (matched + noise)` and matched stays 0, so it remains
|
|
134
|
+
`0/10 = 0.0`. What it adds is a recall signal — a real **0/1** where an empty
|
|
135
|
+
ground truth gave a vacuous 1.0.
|
|
136
|
+
|
|
137
|
+
The experiment that decides #258:
|
|
138
|
+
|
|
139
|
+
1. Freeze a finder set on pr-278 with `--record-finder` (no skeptic).
|
|
140
|
+
2. Replay with the current prompt: expect recall 0.0 on that entry.
|
|
141
|
+
3. Add the compact class checklist and re-run the frozen-set comparison across
|
|
142
|
+
pr-278 **and** the existing entries — the point is not only "does it catch the
|
|
143
|
+
leak" but "does it stop catching what it caught", which is how the float
|
|
144
|
+
experiment failed.
|
|
145
|
+
4. Ship only if recall does not regress elsewhere.
|
|
146
|
+
|
|
147
|
+
Steps 2–4 need a provider key, which is why they are not done here.
|
|
148
|
+
|
|
149
|
+
## Out of scope
|
|
150
|
+
|
|
151
|
+
- Any edit to `prompts.py`.
|
|
152
|
+
- Adopting the source's precision-over-recall framing, or its file-read-before-flag
|
|
153
|
+
instructions (we have no such capability in the finder).
|
|
154
|
+
- Copying rule text verbatim — the source is Apache-2.0 Go/agentic tooling for a
|
|
155
|
+
different stack; #258 asks for the taxonomy only.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cgis",
|
|
3
|
+
"displayName": "CGIS — Code Graph Intelligence",
|
|
4
|
+
"version": "0.6.0",
|
|
5
|
+
"description": "Gives Claude a deterministic semantic graph of your codebase instead of flat text — exact callers, real blast radius, and scoped context in a few hundred tokens rather than whole files. Runs fully locally: on first use it fetches the open-source codegraph-brain package from PyPI via uvx, then analyses your code on your machine. No hooks, no telemetry, nothing sent anywhere.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Andrey G",
|
|
8
|
+
"url": "https://github.com/zaebee"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/zaebee/codegraph-brain",
|
|
11
|
+
"repository": "https://github.com/zaebee/codegraph-brain",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"code-graph",
|
|
15
|
+
"static-analysis",
|
|
16
|
+
"impact-analysis",
|
|
17
|
+
"call-graph",
|
|
18
|
+
"architecture",
|
|
19
|
+
"python",
|
|
20
|
+
"typescript"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# CGIS — Code Graph Intelligence
|
|
2
|
+
|
|
3
|
+
Gives Claude a deterministic semantic graph of your codebase instead of flat text. Exact callers, real blast radius, and scoped context in a few hundred tokens rather than whole files.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
/plugin marketplace add zaebee/codegraph-brain
|
|
7
|
+
/plugin install cgis@codegraph-brain
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Then, in any repository, run `/cgis:ingest` once to build the graph.
|
|
11
|
+
|
|
12
|
+
## What it ships
|
|
13
|
+
|
|
14
|
+
| Component | What it does |
|
|
15
|
+
| :--- | :--- |
|
|
16
|
+
| MCP server `cgis` | 13 tools: impact analysis, flow tracing, structure, symbol search, metrics, architectural drift, authz reachability |
|
|
17
|
+
| Skill `cgis` | Teaches the agent *when* to query the graph instead of reading files |
|
|
18
|
+
| Skill `/cgis:ingest` | Builds the graph on first use and reports what it found |
|
|
19
|
+
|
|
20
|
+
## What it does on your machine
|
|
21
|
+
|
|
22
|
+
**On first use it downloads a package.** The MCP server is the open-source [`codegraph-brain`](https://pypi.org/project/codegraph-brain/) package (MIT), fetched from PyPI with `uvx --from "codegraph-brain>=0.6.0" cgis-mcp` and cached by `uv` afterwards. That download is the only thing this plugin fetches.
|
|
23
|
+
|
|
24
|
+
**Everything else is local.** Your source code is parsed on your machine with Tree-sitter, and the resulting graph is written to `graph.db` in your project root. No source, no graph, and no usage data leaves your machine.
|
|
25
|
+
|
|
26
|
+
- **No hooks.** The plugin registers none, so it observes nothing outside its own tool calls.
|
|
27
|
+
- **No telemetry.** No analytics, usage pings, crash reporting or feature-flag fetches.
|
|
28
|
+
- **No credential access.** It reads source files under the path you point it at; nothing else.
|
|
29
|
+
|
|
30
|
+
`graph.db` should go in your `.gitignore`.
|
|
31
|
+
|
|
32
|
+
## Guardian is not part of this plugin
|
|
33
|
+
|
|
34
|
+
The repository also contains **Guardian**, a graph-aware LLM code reviewer that *does* call an external model provider (Gemini, Mistral, Cohere, or a local Ollama). It is a CI tool, it requires explicit configuration, and this plugin neither ships nor invokes it. See the [repository README](https://github.com/zaebee/codegraph-brain#-guardian-graph-aware-code-review) if you want it in your pipeline.
|
|
35
|
+
|
|
36
|
+
## Coverage
|
|
37
|
+
|
|
38
|
+
Extractors exist for **Python** and **TypeScript** (`.py`, `.ts`, `.tsx`). Other languages are invisible to the graph — see the [case study](https://github.com/zaebee/codegraph-brain/blob/main/docs/CASE_STUDY.md) for measured coverage on a real twelve-repository codebase, including what it misses.
|
|
39
|
+
|
|
40
|
+
## Links
|
|
41
|
+
|
|
42
|
+
- Source: [github.com/zaebee/codegraph-brain](https://github.com/zaebee/codegraph-brain)
|
|
43
|
+
- Package: [pypi.org/project/codegraph-brain](https://pypi.org/project/codegraph-brain/)
|
|
44
|
+
- Licence: MIT
|
|
45
|
+
- Privacy: [PRIVACY.md](https://github.com/zaebee/codegraph-brain/blob/main/PRIVACY.md) — nothing is collected
|