codegraph-brain 0.22.0__tar.gz → 0.23.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.23.0/.release-please-manifest.json +3 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/CHANGELOG.md +7 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/PKG-INFO +1 -1
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/pyproject.toml +1 -1
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/server.json +2 -2
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/api/mcp_server.py +245 -40
- codegraph_brain-0.23.0/tests/unit/test_mcp_tool_schemas.py +47 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/uv.lock +1 -1
- codegraph_brain-0.22.0/.release-please-manifest.json +0 -3
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.claude-plugin/marketplace.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.gitattributes +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/test-count-baseline +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/workflows/autodoc.yml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/workflows/ci.yml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/workflows/guardian.yml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/workflows/pr-title.yml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.github/workflows/release-please.yml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.gitignore +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.pre-commit-config.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/.python-version +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/CLAUDE.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/CONTRIBUTING.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/LICENSE +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/Makefile +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/PRIVACY.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/CURATION.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/calibration.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-122.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-140.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-141.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-142.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-143.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-144.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-278.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/pr-313.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/guardian/results.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/cal_dot_com.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/discourse.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/grafana.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/keycloak.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian/sentry.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-judged.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-p3-run1.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-p3-run2.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-p3-run3.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-plan.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/benchmarks/martian-reviews.jsonl +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/data/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/AUDIT.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/CASE_STUDY.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/ONTOLOGY.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/diagrams/pipeline_flow.mermaid +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/architecture/health_badge.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/assets/.gitignore +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/assets/cgis-app-avatar.png +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/assets/cgis-app-avatar.svg +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/assets/generate_avatar.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/examples/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/how-to/CLI_USAGE.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/how-to/MCP_REFERENCE.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/ontology/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/ontology/core.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/ontology/domains.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/ontology/patterns.yaml +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/ontology/tolerances.lock +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/BLUEPRINT.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/PRD.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/TDD.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/glama.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/main.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/plugin/.claude-plugin/plugin.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/plugin/.mcp.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/plugin/README.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/plugin/skills/cgis/SKILL.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/plugin/skills/ingest/SKILL.md +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/release-please-config.json +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/check_pytest_raises.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/check_test_count.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/colab_bench.sh +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/gen_ideal_graph.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/generate_health.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/generate_mcp_ref.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/generate_schema_docs.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/guardian_bench.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/guardian_calibrate.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/guardian_martian.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/guardian_review.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/inject_architecture_graph.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/ollama_visitor.sh +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/probe_closure_gap.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/probe_tier_ladder.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/recordings_from_corpus.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/scripts/skeptic_arms.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/__main__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/api/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/api/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/cli.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/coverage.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/freshness.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/generated.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/js_globals.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/models.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/core/paths.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_annotations.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_ast.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_classes.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_functions.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_imports.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_python_types.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/_typescript_bindings.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/base.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/python_extractor.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/registry.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/extractors/typescript_extractor.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/axes.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/bench.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/calibrate.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/chunked.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/chunker.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/collector.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/core.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/diff_index.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/evidence.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/findings.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/github_poster.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/martian.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/metrics.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/prompts.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/base.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/gemini.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/mistral.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/ollama.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/providers/openrouter.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/recording.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/render.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/review_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/runner.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/guardian/skeptic.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/pipeline.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/py.typed +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/analyzer.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/anomaly.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/cohesion.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/health.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/analysis/suggest_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/audit.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/context_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/orphans.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/prompt.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/context/snippet.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/_scc.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/drift.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/drift_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/fractal.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/ontology_init.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/quotient.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/drift/triads.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/engine.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/fqn.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/render/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/render/graph_json.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/render/mermaid.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/query/render/metrics.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/engine.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/indices.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/js_builtins.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/symbols.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/resolver/uplift.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/storage/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/src/cgis/storage/sqlite_store.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/integration/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/__init__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/conftest.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_annotation_calibration.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_architecture.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_drift.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_fractal.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_self_parse.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_self_parse_ts.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/self_parsing/test_suggest.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/.gitkeep +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/conftest.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/guardian_stubs.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/review_path_inventory.txt +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test___main__.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_analyzer.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_annotation_edges.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_audit.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_check_pytest_raises.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_check_test_count.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_cli.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_cohesion.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_context_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_di_acceptance.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_drift.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_drift_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_extractor_registry.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_fingerprint.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_fqn.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_fractal.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_freshness.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_gen_ideal_graph.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_generate_mcp_ref.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_generated.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_graph_json.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_axes.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_bench.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_bench_script.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_calibrate.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_chunked.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_chunker.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_collector.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_core.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_diff_index.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_evidence.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_findings.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_martian.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_martian_script.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_martian_union.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_metrics.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_openrouter.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_poster.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_providers.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_providers_name.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_recording.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_render.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_review_script.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_runner.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_salvage.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_guardian_skeptic.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_health_scorer.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_import_acceptance.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_inject_architecture_graph.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_mcp_server.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_mermaid.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_metrics.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_models.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_name_load_positions.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_ontology_compliance.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_ontology_init.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_orphans.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_paths.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_patterns_yaml.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_pipeline.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_pipeline_incremental_symbols.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_prompt.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_python_annotations.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_python_extractor.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_query_coverage.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_quotient.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_recordings_from_corpus.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_resolver.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_resolver_indices.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_resolver_js_builtins.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_resolver_language_scope.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_resolver_symbols.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_review_fingerprint_record.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_self_types.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_skeptic_arms.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_snippet.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_sqlite_store.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_suggest_service.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_temperature_source.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_triads.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_typescript_extractor.py +0 -0
- {codegraph_brain-0.22.0 → codegraph_brain-0.23.0}/tests/unit/test_uplift.py +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.23.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.22.0...codegraph-brain-v0.23.0) (2026-09-17)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **mcp:** describe every tool parameter and announce the server version ([#466](https://github.com/zaebee/codegraph-brain/issues/466)) ([1863a11](https://github.com/zaebee/codegraph-brain/commit/1863a111a752d01303de482b88cee46322184b16))
|
|
9
|
+
|
|
3
10
|
## [0.22.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.21.0...codegraph-brain-v0.22.0) (2026-09-17)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: codegraph-brain
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.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
|
|
@@ -7,7 +7,7 @@ packages = ["src/cgis"]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "codegraph-brain"
|
|
10
|
-
version = "0.
|
|
10
|
+
version = "0.23.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.23.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.23.0",
|
|
18
18
|
"runtimeHint": "uvx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -8,11 +8,13 @@ import dataclasses
|
|
|
8
8
|
import json
|
|
9
9
|
import sys
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import Any
|
|
11
|
+
from typing import Annotated, Any
|
|
12
12
|
|
|
13
13
|
import structlog
|
|
14
14
|
from mcp.server.mcpserver import MCPServer
|
|
15
|
+
from pydantic import Field
|
|
15
16
|
|
|
17
|
+
from cgis import __version__
|
|
16
18
|
from cgis.core.coverage import TraversalCoverage
|
|
17
19
|
from cgis.core.freshness import Freshness, FreshnessState
|
|
18
20
|
from cgis.core.models import Edge, Node, NodeType
|
|
@@ -37,7 +39,7 @@ print("CGIS MCP Server starting…", file=sys.stderr)
|
|
|
37
39
|
|
|
38
40
|
logger = structlog.getLogger(__name__)
|
|
39
41
|
|
|
40
|
-
mcp: MCPServer = MCPServer("cgis-code-graph")
|
|
42
|
+
mcp: MCPServer = MCPServer("cgis-code-graph", version=__version__)
|
|
41
43
|
|
|
42
44
|
_EXTRACTORS = {
|
|
43
45
|
".py": PythonExtractor(),
|
|
@@ -46,6 +48,31 @@ _EXTRACTORS = {
|
|
|
46
48
|
}
|
|
47
49
|
_DEFAULT_DB = "graph.db"
|
|
48
50
|
|
|
51
|
+
# Agents choose arguments from the JSON schema, and the SDK does not copy
|
|
52
|
+
# docstring prose into it — each parameter's meaning has to be declared here.
|
|
53
|
+
DbPath = Annotated[
|
|
54
|
+
str,
|
|
55
|
+
Field(
|
|
56
|
+
description="SQLite graph built by cgis_ingest. A relative path resolves against the "
|
|
57
|
+
"MCP server's working directory, not the agent's — prefer an absolute path."
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
Fqn = Annotated[
|
|
61
|
+
str,
|
|
62
|
+
Field(
|
|
63
|
+
description="Fully qualified name, e.g. pkg.module.Class.method. A unique dot-boundary "
|
|
64
|
+
"suffix also resolves; an ambiguous one returns candidates. Use cgis_find_symbol "
|
|
65
|
+
"to look a name up."
|
|
66
|
+
),
|
|
67
|
+
]
|
|
68
|
+
OutputFormat = Annotated[
|
|
69
|
+
str,
|
|
70
|
+
Field(
|
|
71
|
+
description='"mermaid" for a diagram, or "json" for a payload with real FQNs '
|
|
72
|
+
"(case-insensitive). Any other value returns an error."
|
|
73
|
+
),
|
|
74
|
+
]
|
|
75
|
+
|
|
49
76
|
|
|
50
77
|
def _resolution_error(fqn: str, candidates: list[str], truncated: bool = False) -> str:
|
|
51
78
|
"""Render a not-found / ambiguous FQN error for tool output."""
|
|
@@ -246,7 +273,27 @@ def _with_freshness(db_path: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
|
246
273
|
|
|
247
274
|
|
|
248
275
|
@mcp.tool()
|
|
249
|
-
def cgis_ingest(
|
|
276
|
+
def cgis_ingest(
|
|
277
|
+
project_path: Annotated[
|
|
278
|
+
str,
|
|
279
|
+
Field(
|
|
280
|
+
description="Root directory of the project to scan. A relative path resolves "
|
|
281
|
+
"against the MCP server's working directory."
|
|
282
|
+
),
|
|
283
|
+
],
|
|
284
|
+
db_path: Annotated[
|
|
285
|
+
str,
|
|
286
|
+
Field(
|
|
287
|
+
description="Where to write the graph: must end in .db, .sqlite or .sqlite3, in a "
|
|
288
|
+
"directory that already exists, and must not be an existing non-SQLite file. "
|
|
289
|
+
"A relative path resolves against the server's working directory."
|
|
290
|
+
),
|
|
291
|
+
] = _DEFAULT_DB,
|
|
292
|
+
full_rebuild: Annotated[
|
|
293
|
+
bool,
|
|
294
|
+
Field(description="Re-scan every file from scratch instead of the incremental default."),
|
|
295
|
+
] = False,
|
|
296
|
+
) -> str:
|
|
250
297
|
"""Scan a local directory, extract all symbols, resolve links, and build the graph DB.
|
|
251
298
|
|
|
252
299
|
Use this to initialise or refresh the code knowledge graph for a project.
|
|
@@ -311,7 +358,17 @@ def cgis_ingest(project_path: str, db_path: str = _DEFAULT_DB, full_rebuild: boo
|
|
|
311
358
|
|
|
312
359
|
@mcp.tool()
|
|
313
360
|
def cgis_trace_flow(
|
|
314
|
-
fqn:
|
|
361
|
+
fqn: Fqn,
|
|
362
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
363
|
+
depth: Annotated[
|
|
364
|
+
int,
|
|
365
|
+
Field(
|
|
366
|
+
description="Maximum edge hops downstream. Every edge type counts as a hop — "
|
|
367
|
+
"CALLS, but also IMPORTS, CONTAINS and REFERENCES — so from a module the first "
|
|
368
|
+
"hops are mostly imports and structure."
|
|
369
|
+
),
|
|
370
|
+
] = 3,
|
|
371
|
+
output_format: OutputFormat = "mermaid",
|
|
315
372
|
) -> str:
|
|
316
373
|
"""Trace the execution call-graph starting from a specific FQN downwards.
|
|
317
374
|
|
|
@@ -354,7 +411,17 @@ def cgis_trace_flow(
|
|
|
354
411
|
|
|
355
412
|
@mcp.tool()
|
|
356
413
|
def cgis_analyze_impact(
|
|
357
|
-
fqn:
|
|
414
|
+
fqn: Fqn,
|
|
415
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
416
|
+
depth: Annotated[
|
|
417
|
+
int,
|
|
418
|
+
Field(
|
|
419
|
+
description="Maximum edge hops upstream. Every edge type counts as a hop — "
|
|
420
|
+
"CALLS, but also IMPORTS, CONTAINS and REFERENCES — so modules importing the "
|
|
421
|
+
"target and the file containing it appear alongside its callers."
|
|
422
|
+
),
|
|
423
|
+
] = 3,
|
|
424
|
+
output_format: OutputFormat = "mermaid",
|
|
358
425
|
) -> str:
|
|
359
426
|
"""Analyse transitive upstream callers of a specific FQN.
|
|
360
427
|
|
|
@@ -397,7 +464,12 @@ def cgis_analyze_impact(
|
|
|
397
464
|
|
|
398
465
|
@mcp.tool()
|
|
399
466
|
def cgis_get_structure(
|
|
400
|
-
fqn:
|
|
467
|
+
fqn: Fqn,
|
|
468
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
469
|
+
depth: Annotated[
|
|
470
|
+
int, Field(description="Maximum containment levels to descend (module → class → method).")
|
|
471
|
+
] = 2,
|
|
472
|
+
output_format: OutputFormat = "mermaid",
|
|
401
473
|
) -> str:
|
|
402
474
|
"""Show the structural layout (CONTAINS/DECLARES) of a module or class.
|
|
403
475
|
|
|
@@ -427,11 +499,35 @@ def cgis_get_structure(
|
|
|
427
499
|
|
|
428
500
|
@mcp.tool()
|
|
429
501
|
def cgis_drift(
|
|
430
|
-
db_path:
|
|
431
|
-
patterns_path:
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
502
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
503
|
+
patterns_path: Annotated[
|
|
504
|
+
str,
|
|
505
|
+
Field(
|
|
506
|
+
description="patterns.yaml (.yaml or .yml) declaring each domain's expected "
|
|
507
|
+
"pattern and tolerance, relative to the server's working directory. "
|
|
508
|
+
"cgis_init_ontology proposes one."
|
|
509
|
+
),
|
|
510
|
+
] = "docs/ontology/patterns.yaml",
|
|
511
|
+
max_drift: Annotated[
|
|
512
|
+
float,
|
|
513
|
+
Field(
|
|
514
|
+
description="Drift tolerance for domains that declare no drift_tolerance of their own."
|
|
515
|
+
),
|
|
516
|
+
] = 0.50,
|
|
517
|
+
profile: Annotated[
|
|
518
|
+
str | None,
|
|
519
|
+
Field(
|
|
520
|
+
description="Score only domains with this profile, plus profile-less ones — e.g. one "
|
|
521
|
+
"language when patterns.yaml mixes several."
|
|
522
|
+
),
|
|
523
|
+
] = None,
|
|
524
|
+
max_residual: Annotated[
|
|
525
|
+
float,
|
|
526
|
+
Field(
|
|
527
|
+
description="Distance to the nearest template beyond which a domain's fit band is "
|
|
528
|
+
'"none" (no template fits).'
|
|
529
|
+
),
|
|
530
|
+
] = 0.45,
|
|
435
531
|
) -> str:
|
|
436
532
|
"""Report per-domain architectural drift against declared ideal patterns.
|
|
437
533
|
|
|
@@ -490,10 +586,24 @@ def cgis_drift(
|
|
|
490
586
|
|
|
491
587
|
@mcp.tool()
|
|
492
588
|
def cgis_suggest_packages(
|
|
493
|
-
db_path:
|
|
494
|
-
prefix:
|
|
495
|
-
|
|
496
|
-
|
|
589
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
590
|
+
prefix: Annotated[
|
|
591
|
+
str | None,
|
|
592
|
+
Field(
|
|
593
|
+
description="FQN prefix of the package to analyse, e.g. cgis.query, matched on whole "
|
|
594
|
+
"dot-segments. Needed in practice: without it the verdict is no_signal."
|
|
595
|
+
),
|
|
596
|
+
] = None,
|
|
597
|
+
with_calls: Annotated[
|
|
598
|
+
bool, Field(description="Use the combined import + call graph instead of imports only.")
|
|
599
|
+
] = False,
|
|
600
|
+
min_q: Annotated[
|
|
601
|
+
float,
|
|
602
|
+
Field(
|
|
603
|
+
description="Modularity threshold: at or above it, a package whose layout "
|
|
604
|
+
"disagrees with its communities is flagged split (or consolidate, if over-split)."
|
|
605
|
+
),
|
|
606
|
+
] = 0.35,
|
|
497
607
|
) -> str:
|
|
498
608
|
"""Suggest sub-package boundaries for a package from its dependency communities.
|
|
499
609
|
|
|
@@ -516,7 +626,12 @@ def cgis_suggest_packages(
|
|
|
516
626
|
|
|
517
627
|
|
|
518
628
|
@mcp.tool()
|
|
519
|
-
def cgis_validate(
|
|
629
|
+
def cgis_validate(
|
|
630
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
631
|
+
threshold: Annotated[
|
|
632
|
+
float, Field(description="Highest unresolved-edge ratio (0-1) still reported as healthy.")
|
|
633
|
+
] = 0.30,
|
|
634
|
+
) -> str:
|
|
520
635
|
"""Report graph integrity as JSON: edge resolution stats + health verdict.
|
|
521
636
|
|
|
522
637
|
Check this before trusting ``cgis_analyze_impact`` output — a high
|
|
@@ -547,11 +662,30 @@ def cgis_validate(db_path: str = _DEFAULT_DB, threshold: float = 0.30) -> str:
|
|
|
547
662
|
|
|
548
663
|
@mcp.tool()
|
|
549
664
|
def cgis_find_symbol(
|
|
550
|
-
query:
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
665
|
+
query: Annotated[
|
|
666
|
+
str,
|
|
667
|
+
Field(
|
|
668
|
+
description="Leaf symbol name to search for, without dots (e.g. get_flow_result) — "
|
|
669
|
+
"not an FQN. Case-insensitive substring match, ranked exact > prefix > substring."
|
|
670
|
+
),
|
|
671
|
+
],
|
|
672
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
673
|
+
kind: Annotated[
|
|
674
|
+
str | None,
|
|
675
|
+
Field(
|
|
676
|
+
description="Only return this node type, e.g. FUNCTION, METHOD or CLASS (any case). "
|
|
677
|
+
"An unknown type matches nothing rather than raising an error."
|
|
678
|
+
),
|
|
679
|
+
] = None,
|
|
680
|
+
fqn_prefix: Annotated[
|
|
681
|
+
str | None,
|
|
682
|
+
Field(
|
|
683
|
+
description="Only return symbols at or under this FQN prefix, matched on whole "
|
|
684
|
+
"dot-segments: app.svc does not match app.svc_alt, and a partial segment "
|
|
685
|
+
"matches nothing."
|
|
686
|
+
),
|
|
687
|
+
] = None,
|
|
688
|
+
limit: Annotated[int, Field(description="Maximum number of candidates to return.")] = 20,
|
|
555
689
|
) -> str:
|
|
556
690
|
"""Resolve a partial symbol name to candidate FQNs (substring match, ranked).
|
|
557
691
|
|
|
@@ -594,10 +728,22 @@ def cgis_find_symbol(
|
|
|
594
728
|
|
|
595
729
|
@mcp.tool()
|
|
596
730
|
def cgis_init_ontology(
|
|
597
|
-
db_path:
|
|
598
|
-
margin:
|
|
599
|
-
|
|
600
|
-
|
|
731
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
732
|
+
margin: Annotated[
|
|
733
|
+
float,
|
|
734
|
+
Field(description="Headroom added to each measured score to form the proposed tolerance."),
|
|
735
|
+
] = 0.03,
|
|
736
|
+
min_nodes: Annotated[
|
|
737
|
+
int,
|
|
738
|
+
Field(description="Domains with fewer nodes stay hygiene-only instead of getting a label."),
|
|
739
|
+
] = 10,
|
|
740
|
+
depth: Annotated[
|
|
741
|
+
int | None,
|
|
742
|
+
Field(
|
|
743
|
+
description="Fixed FQN segment depth for domain discovery (positive); omit to pick it "
|
|
744
|
+
"automatically."
|
|
745
|
+
),
|
|
746
|
+
] = None,
|
|
601
747
|
) -> str:
|
|
602
748
|
"""Propose a starter patterns.yaml from the measured graph (read-only).
|
|
603
749
|
|
|
@@ -623,7 +769,21 @@ def cgis_init_ontology(
|
|
|
623
769
|
|
|
624
770
|
@mcp.tool()
|
|
625
771
|
def cgis_context(
|
|
626
|
-
fqn:
|
|
772
|
+
fqn: Fqn,
|
|
773
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
774
|
+
depth: Annotated[
|
|
775
|
+
int,
|
|
776
|
+
Field(description="Call hops around the focal node; 1 means direct callers and callees."),
|
|
777
|
+
] = 1,
|
|
778
|
+
source_root: Annotated[
|
|
779
|
+
str,
|
|
780
|
+
Field(
|
|
781
|
+
description="Directory the graph's stored file paths are relative to — normally the "
|
|
782
|
+
"project_path given to cgis_ingest; prefer an absolute path. Empty means the "
|
|
783
|
+
"server's working directory, so source shows as unavailable when the server runs "
|
|
784
|
+
"elsewhere."
|
|
785
|
+
),
|
|
786
|
+
] = "",
|
|
627
787
|
) -> str:
|
|
628
788
|
"""Compile an agent-facing GraphRAG context package for a focal FQN (#19).
|
|
629
789
|
|
|
@@ -659,10 +819,22 @@ def cgis_context(
|
|
|
659
819
|
|
|
660
820
|
@mcp.tool()
|
|
661
821
|
def cgis_metrics(
|
|
662
|
-
db_path:
|
|
663
|
-
limit: int = 10,
|
|
664
|
-
exclude:
|
|
665
|
-
|
|
822
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
823
|
+
limit: Annotated[int, Field(description="Top-N rows returned per section.")] = 10,
|
|
824
|
+
exclude: Annotated[
|
|
825
|
+
list[str] | None,
|
|
826
|
+
Field(
|
|
827
|
+
description='Drop nodes whose FQN contains any of these dot-segments, e.g. ["tests"]; '
|
|
828
|
+
"they are removed from PageRank propagation too."
|
|
829
|
+
),
|
|
830
|
+
] = None,
|
|
831
|
+
scope: Annotated[
|
|
832
|
+
list[str] | None,
|
|
833
|
+
Field(
|
|
834
|
+
description="Keep only nodes under any of these dot-prefixes, e.g. "
|
|
835
|
+
'["domains.billing"]; rank still propagates over the whole graph.'
|
|
836
|
+
),
|
|
837
|
+
] = None,
|
|
666
838
|
) -> str:
|
|
667
839
|
"""Whole-graph architectural metrics — coupling bottlenecks + God classes (#16).
|
|
668
840
|
|
|
@@ -706,10 +878,21 @@ def cgis_metrics(
|
|
|
706
878
|
|
|
707
879
|
@mcp.tool()
|
|
708
880
|
def cgis_find_orphans(
|
|
709
|
-
db_path:
|
|
710
|
-
prefix:
|
|
711
|
-
|
|
712
|
-
|
|
881
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
882
|
+
prefix: Annotated[
|
|
883
|
+
str | None,
|
|
884
|
+
Field(description="Only consider classes under this FQN prefix, cut on a dot boundary."),
|
|
885
|
+
] = None,
|
|
886
|
+
include_tests: Annotated[
|
|
887
|
+
bool,
|
|
888
|
+
Field(
|
|
889
|
+
description="Count test code as a user, so the report means "
|
|
890
|
+
'"unreachable from anywhere".'
|
|
891
|
+
),
|
|
892
|
+
] = False,
|
|
893
|
+
include_generated: Annotated[
|
|
894
|
+
bool, Field(description="Include machine-generated classes, which are hidden by default.")
|
|
895
|
+
] = False,
|
|
713
896
|
) -> str:
|
|
714
897
|
"""Classes nothing in production builds, extends or names — dead-code candidates (#415).
|
|
715
898
|
|
|
@@ -764,11 +947,33 @@ def cgis_find_orphans(
|
|
|
764
947
|
|
|
765
948
|
@mcp.tool()
|
|
766
949
|
def cgis_audit_reachability(
|
|
767
|
-
target:
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
950
|
+
target: Annotated[
|
|
951
|
+
str,
|
|
952
|
+
Field(
|
|
953
|
+
description="FQN of the checkpoint every source must reach, e.g. an ownership check. "
|
|
954
|
+
"A unique dot-boundary suffix also resolves."
|
|
955
|
+
),
|
|
956
|
+
],
|
|
957
|
+
db_path: DbPath = _DEFAULT_DB,
|
|
958
|
+
from_type: Annotated[
|
|
959
|
+
str | None,
|
|
960
|
+
Field(
|
|
961
|
+
description="NodeType of the sources to audit, e.g. ROUTE_HANDLER, API_ENDPOINT or "
|
|
962
|
+
"FUNCTION (any case). Give this, from_prefix, or both."
|
|
963
|
+
),
|
|
964
|
+
] = None,
|
|
965
|
+
from_prefix: Annotated[
|
|
966
|
+
str | None,
|
|
967
|
+
Field(
|
|
968
|
+
description="Only audit sources at or under this FQN prefix, matched on whole "
|
|
969
|
+
"dot-segments — a partial segment selects nothing and returns an empty audit, "
|
|
970
|
+
"not a clean one. Combined with from_type when both are given."
|
|
971
|
+
),
|
|
972
|
+
] = None,
|
|
973
|
+
depth: Annotated[
|
|
974
|
+
int,
|
|
975
|
+
Field(description="Maximum reachability depth; a longer path is reported as a gap."),
|
|
976
|
+
] = 5,
|
|
772
977
|
) -> str:
|
|
773
978
|
"""Reachability/authorization audit — which sources never reach a checkpoint (#172).
|
|
774
979
|
|
|
@@ -817,7 +1022,7 @@ def cgis_audit_reachability(
|
|
|
817
1022
|
|
|
818
1023
|
|
|
819
1024
|
@mcp.tool()
|
|
820
|
-
def cgis_fractal(db_path:
|
|
1025
|
+
def cgis_fractal(db_path: DbPath = _DEFAULT_DB) -> str:
|
|
821
1026
|
"""Report the motif census across the repository's structural tiers.
|
|
822
1027
|
|
|
823
1028
|
Coarsens the graph along its own structure — symbol, class, module, then
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""The MCP tool schemas an agent actually receives.
|
|
2
|
+
|
|
3
|
+
An agent picks arguments from the JSON schema, not from the docstring: the SDK
|
|
4
|
+
copies a docstring into the tool description but leaves every parameter bare.
|
|
5
|
+
Directories score this too — Glama rated all 53 parameters undescribed, and the
|
|
6
|
+
server announced an empty version to every client that connected.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from cgis import __version__
|
|
14
|
+
from cgis.api.mcp_server import mcp
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _tool_params() -> list[tuple[str, str, dict[str, object]]]:
|
|
18
|
+
tools = asyncio.run(mcp.list_tools())
|
|
19
|
+
return [
|
|
20
|
+
(tool.name, name, prop)
|
|
21
|
+
for tool in tools
|
|
22
|
+
for name, prop in tool.input_schema.get("properties", {}).items()
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
_PARAMS = _tool_params()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_every_tool_exposes_parameters() -> None:
|
|
30
|
+
"""Guards the parametrized test below from passing over an empty list."""
|
|
31
|
+
assert len(_PARAMS) >= 50
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.mark.parametrize(
|
|
35
|
+
("tool", "param", "schema"), _PARAMS, ids=[f"{t}.{p}" for t, p, _ in _PARAMS]
|
|
36
|
+
)
|
|
37
|
+
def test_every_parameter_is_described(tool: str, param: str, schema: dict[str, object]) -> None:
|
|
38
|
+
"""Each argument carries a description in the schema the client sees."""
|
|
39
|
+
description = schema.get("description")
|
|
40
|
+
assert isinstance(description, str), f"{tool}.{param} has no description"
|
|
41
|
+
assert len(description) >= 15, f"{tool}.{param}: {description!r} says too little"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_server_announces_the_package_version() -> None:
|
|
45
|
+
"""`initialize` reports the installed version, not an empty string."""
|
|
46
|
+
assert mcp.version == __version__
|
|
47
|
+
assert mcp.version
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|