codd-dev 3.7.1__tar.gz → 3.7.3__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.
- {codd_dev-3.7.1 → codd_dev-3.7.3}/PKG-INFO +1 -1
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/__init__.py +1 -1
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/cli.py +31 -1
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/builder.py +214 -16
- codd_dev-3.7.3/codd/dag/checks/transitive_closure.py +211 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extract_ai.py +72 -4
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extractor.py +21 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/regex_strategies.py +136 -5
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/treesitter.py +309 -16
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/synth.py +17 -1
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/codd.yaml.tmpl +25 -25
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/api-contract.md.j2 +2 -2
- {codd_dev-3.7.1 → codd_dev-3.7.3}/pyproject.toml +1 -1
- codd_dev-3.7.1/codd/dag/checks/transitive_closure.py +0 -116
- {codd_dev-3.7.1 → codd_dev-3.7.3}/.gitignore +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/LICENSE +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/bench_fixture/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/__main__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/_git_helper.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/action_outcome.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ai_invoke.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ai_patch.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifact_contract.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifact_ids.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/assembler.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/bridge.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/capability_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/claude_cli.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/clustering.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coherence_engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/confidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/config.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/config_schema.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/cardinality_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/extraction_diagnostics.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/negative_space.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/resource_flow_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/semantic_contract_conflict.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/stale_evidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/impact.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/materiality.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/metadata_access.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/result_status.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/defaults.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/defaults.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/design_md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/apply.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/persistence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/discovery.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_generator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_harness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/apply.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/finding.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/gap_to_ask.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/promote.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/routing.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/env_refs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extract_paths.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/impact_planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/frontmatter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/generator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/git_evidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/graph.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hitl_session.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/iac_nfr.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/import_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/inheritance.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/compat.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/contract.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profile.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/approval.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/parser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/mcp_server.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/measure.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/operations_derive.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/_shared.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/iac.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/python_ast.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/path_safety.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/policy.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/project_types.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagate.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagation_common.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/reference_resolution.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/history.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/loop.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/schema.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair_slice.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require_plugins.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require_propagate.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirements_meta.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/restoration_report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/restore.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/routes_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/scanner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/schema_refs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_override.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/lock.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/obligations.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profile.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/project.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/resolve.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/test_detection.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/traceability.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/events.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/watcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/wiring.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/requirements/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/examples/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.3}/tests/integration/standalone_repair_skeleton/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codd-dev
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.3
|
|
4
4
|
Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
|
|
5
5
|
Project-URL: Homepage, https://github.com/yohey-w/codd-dev
|
|
6
6
|
Project-URL: Repository, https://github.com/yohey-w/codd-dev
|
|
@@ -434,6 +434,30 @@ def _display_path(path: Path, project_root: Path) -> str:
|
|
|
434
434
|
return path.as_posix()
|
|
435
435
|
|
|
436
436
|
|
|
437
|
+
def _detect_bootstrap_test_dirs(project_root: Path) -> list[str]:
|
|
438
|
+
"""Detect the project's test directories for the bootstrap codd.yaml.
|
|
439
|
+
|
|
440
|
+
Reuses the extractor's inventory (``test``/``tests``/``spec``/``__tests__``)
|
|
441
|
+
so a project that uses ``test/`` is not silently excluded by a hardcoded
|
|
442
|
+
``tests/`` default (which yields a vacuous task_completion). Falls back to the
|
|
443
|
+
conventional ``tests/`` when none exist so the config stays valid + editable.
|
|
444
|
+
"""
|
|
445
|
+
from codd.extractor import _detect_test_dirs
|
|
446
|
+
|
|
447
|
+
found = _detect_test_dirs(project_root)
|
|
448
|
+
return [f"{d}/" for d in found] if found else ["tests/"]
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def _detect_bootstrap_doc_dirs(project_root: Path) -> list[str]:
|
|
452
|
+
"""Detect the project's documentation directories for the bootstrap codd.yaml.
|
|
453
|
+
|
|
454
|
+
Mirrors :func:`_detect_bootstrap_test_dirs`: prefer what exists (``docs``
|
|
455
|
+
vs ``doc``), fall back to the conventional ``docs/`` when none exist.
|
|
456
|
+
"""
|
|
457
|
+
found = [d for d in ("docs", "doc", "documentation") if (project_root / d).is_dir()]
|
|
458
|
+
return [f"{d}/" for d in found] if found else ["docs/"]
|
|
459
|
+
|
|
460
|
+
|
|
437
461
|
def _ensure_bootstrap_codd_yaml(
|
|
438
462
|
project_root: Path,
|
|
439
463
|
*,
|
|
@@ -456,6 +480,8 @@ def _ensure_bootstrap_codd_yaml(
|
|
|
456
480
|
"project_name": project_root.name,
|
|
457
481
|
"language": language,
|
|
458
482
|
"source_dirs": _format_yaml_list(source_dirs),
|
|
483
|
+
"test_dirs": _format_yaml_list(_detect_bootstrap_test_dirs(project_root)),
|
|
484
|
+
"doc_dirs": _format_yaml_list(_detect_bootstrap_doc_dirs(project_root)),
|
|
459
485
|
"graph_path": f"{codd_dir_name}/scan",
|
|
460
486
|
},
|
|
461
487
|
)
|
|
@@ -2323,11 +2349,15 @@ def init(
|
|
|
2323
2349
|
(codd_dir / "reports").mkdir(parents=True)
|
|
2324
2350
|
(codd_dir / "scan").mkdir(exist_ok=True)
|
|
2325
2351
|
|
|
2326
|
-
# Copy templates
|
|
2352
|
+
# Copy templates. Greenfield init uses the conventional test/doc layout
|
|
2353
|
+
# (brownfield extract detects the project's real dirs instead — see
|
|
2354
|
+
# _ensure_bootstrap_codd_yaml).
|
|
2327
2355
|
_render_template("codd.yaml.tmpl", codd_dir / "codd.yaml", {
|
|
2328
2356
|
"project_name": project_name,
|
|
2329
2357
|
"language": language,
|
|
2330
2358
|
"source_dirs": _format_yaml_list(["src/"]),
|
|
2359
|
+
"test_dirs": _format_yaml_list(["tests/"]),
|
|
2360
|
+
"doc_dirs": _format_yaml_list(["docs/"]),
|
|
2331
2361
|
"graph_path": f"{config_dir}/scan",
|
|
2332
2362
|
})
|
|
2333
2363
|
_render_template("gitignore.tmpl", codd_dir / ".gitignore", {})
|
|
@@ -10,7 +10,7 @@ import warnings
|
|
|
10
10
|
from copy import deepcopy
|
|
11
11
|
from datetime import datetime, timezone
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
13
|
+
from typing import Any, Callable
|
|
14
14
|
|
|
15
15
|
import yaml
|
|
16
16
|
|
|
@@ -911,6 +911,19 @@ def _resolve_import_target(
|
|
|
911
911
|
path_to_node: dict[Path, str],
|
|
912
912
|
aliases: dict[str, list[str]],
|
|
913
913
|
) -> str | None:
|
|
914
|
+
# Java FQN specifiers (``com.x.Y`` / ``static com.x.Y.m`` / ``com.x.*`` /
|
|
915
|
+
# ``package com.x``) are dispatched by the IMPORTING file's ``.java`` suffix
|
|
916
|
+
# (DATA, not a ``language ==`` core branch) because their dotted shape
|
|
917
|
+
# otherwise collides with Python's project-rooted dotted resolution. Java
|
|
918
|
+
# types live under a source root (``src/main/java``), not the project root.
|
|
919
|
+
if file_path.suffix == ".java":
|
|
920
|
+
candidates = _java_import_candidates(import_ref, file_path, project_root, path_to_node)
|
|
921
|
+
for candidate in candidates:
|
|
922
|
+
resolved = _resolve_file_candidate(candidate, path_to_node)
|
|
923
|
+
if resolved:
|
|
924
|
+
return resolved
|
|
925
|
+
return None
|
|
926
|
+
|
|
914
927
|
candidates: list[Path] = []
|
|
915
928
|
if _is_js_relative_specifier(import_ref):
|
|
916
929
|
# JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
|
|
@@ -981,6 +994,119 @@ def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
|
|
|
981
994
|
return [(base / Path(*remainder.split("."))).resolve()]
|
|
982
995
|
|
|
983
996
|
|
|
997
|
+
#: Conventional Java/JVM source-root segment chains (Maven/Gradle). A type whose
|
|
998
|
+
#: FQN is ``com.x.Y`` lives at ``<root>/com/x/Y.java`` under one of these roots.
|
|
999
|
+
_JAVA_SOURCE_ROOT_SEGMENTS = (
|
|
1000
|
+
("src", "main", "java"),
|
|
1001
|
+
("src", "test", "java"),
|
|
1002
|
+
("src", "main", "kotlin"),
|
|
1003
|
+
("src", "test", "kotlin"),
|
|
1004
|
+
)
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
def _java_source_roots(project_root: Path, path_to_node: dict[Path, str]) -> list[Path]:
|
|
1008
|
+
"""Return candidate Java source roots (deepest-first), derived from DATA.
|
|
1009
|
+
|
|
1010
|
+
Built from the actual node file-set rather than hard-coded paths: every
|
|
1011
|
+
``…/src/main/java`` (etc.) prefix that some node file sits under becomes a
|
|
1012
|
+
root, plus the project root itself as a last resort (flat layouts / default
|
|
1013
|
+
package). Deeper roots are tried first so ``src/main/java`` wins over the
|
|
1014
|
+
project root when both could match.
|
|
1015
|
+
"""
|
|
1016
|
+
roots: dict[str, Path] = {}
|
|
1017
|
+
for file_path in path_to_node:
|
|
1018
|
+
parts = file_path.parts
|
|
1019
|
+
for segments in _JAVA_SOURCE_ROOT_SEGMENTS:
|
|
1020
|
+
idx = _find_segment_chain(parts, segments)
|
|
1021
|
+
if idx is not None:
|
|
1022
|
+
root = Path(*parts[: idx + len(segments)])
|
|
1023
|
+
roots[str(root)] = root
|
|
1024
|
+
ordered = sorted(roots.values(), key=lambda path: len(path.parts), reverse=True)
|
|
1025
|
+
ordered.append(project_root.resolve())
|
|
1026
|
+
return ordered
|
|
1027
|
+
|
|
1028
|
+
|
|
1029
|
+
def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int | None:
|
|
1030
|
+
"""Return the start index where ``chain`` appears contiguously in ``parts``."""
|
|
1031
|
+
if not chain:
|
|
1032
|
+
return None
|
|
1033
|
+
for start in range(len(parts) - len(chain) + 1):
|
|
1034
|
+
if parts[start : start + len(chain)] == chain:
|
|
1035
|
+
return start
|
|
1036
|
+
return None
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
def _java_import_candidates(
|
|
1040
|
+
import_ref: str,
|
|
1041
|
+
file_path: Path,
|
|
1042
|
+
project_root: Path,
|
|
1043
|
+
path_to_node: dict[Path, str],
|
|
1044
|
+
) -> list[Path]:
|
|
1045
|
+
"""Map a Java specifier to filesystem candidates under the source roots.
|
|
1046
|
+
|
|
1047
|
+
Handles the four shapes emitted by the Java specifier extractor:
|
|
1048
|
+
|
|
1049
|
+
* ``package com.x`` → the file's OWN package dir, so same-package implicit
|
|
1050
|
+
references (Java needs no import for siblings) yield edges to the package's
|
|
1051
|
+
other files (the caller skips the self-edge).
|
|
1052
|
+
* ``com.x.*`` (wildcard) → the package directory; the caller links to the
|
|
1053
|
+
in-package files found there (or skips cleanly when none are nodes).
|
|
1054
|
+
* ``static com.x.Y.m`` → the owning class file ``com/x/Y.java`` (member
|
|
1055
|
+
``m`` stripped).
|
|
1056
|
+
* ``com.x.Y`` (normal) → ``com/x/Y.java``.
|
|
1057
|
+
|
|
1058
|
+
``_resolve_file_candidate`` appends the real ``.java`` suffix once a directory
|
|
1059
|
+
candidate is produced, so package/wildcard dirs resolve to a sibling file.
|
|
1060
|
+
"""
|
|
1061
|
+
roots = _java_source_roots(project_root, path_to_node)
|
|
1062
|
+
|
|
1063
|
+
if import_ref.startswith("package "):
|
|
1064
|
+
package = import_ref[len("package "):].strip()
|
|
1065
|
+
return _java_package_dir_candidates(package, roots)
|
|
1066
|
+
|
|
1067
|
+
if import_ref.endswith(".*"):
|
|
1068
|
+
package = import_ref[:-2].strip()
|
|
1069
|
+
return _java_package_dir_candidates(package, roots)
|
|
1070
|
+
|
|
1071
|
+
fqn = import_ref
|
|
1072
|
+
if fqn.startswith("static "):
|
|
1073
|
+
# ``static com.x.Y.member`` → owning class ``com.x.Y`` (drop the member).
|
|
1074
|
+
fqn = fqn[len("static "):].strip()
|
|
1075
|
+
parts = fqn.split(".")
|
|
1076
|
+
if len(parts) >= 2:
|
|
1077
|
+
fqn = ".".join(parts[:-1])
|
|
1078
|
+
|
|
1079
|
+
parts = [part for part in fqn.split(".") if part]
|
|
1080
|
+
if not parts:
|
|
1081
|
+
return []
|
|
1082
|
+
return [(root / Path(*parts)).resolve() for root in roots]
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
def _java_package_dir_candidates(package: str, roots: list[Path]) -> list[Path]:
|
|
1086
|
+
parts = [part for part in package.split(".") if part]
|
|
1087
|
+
if not parts:
|
|
1088
|
+
return []
|
|
1089
|
+
candidates: list[Path] = []
|
|
1090
|
+
for root in roots:
|
|
1091
|
+
package_dir = (root / Path(*parts)).resolve()
|
|
1092
|
+
# List the package dir's in-tree files as candidates (same-package /
|
|
1093
|
+
# wildcard linkage). ``_resolve_file_candidate`` matches exact node paths,
|
|
1094
|
+
# so we hand it each existing ``.java`` file directly.
|
|
1095
|
+
for node_path in _sorted_java_dir_files(package_dir):
|
|
1096
|
+
candidates.append(node_path)
|
|
1097
|
+
return candidates
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
|
|
1101
|
+
if not package_dir.is_dir():
|
|
1102
|
+
return []
|
|
1103
|
+
return sorted(
|
|
1104
|
+
child.resolve()
|
|
1105
|
+
for child in package_dir.iterdir()
|
|
1106
|
+
if child.is_file() and child.suffix == ".java"
|
|
1107
|
+
)
|
|
1108
|
+
|
|
1109
|
+
|
|
984
1110
|
def _infer_test_targets(
|
|
985
1111
|
test_path: Path,
|
|
986
1112
|
project_root: Path,
|
|
@@ -1025,30 +1151,89 @@ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
|
|
|
1025
1151
|
return get_extractor("python", "source").extract_import_specifiers(content)
|
|
1026
1152
|
|
|
1027
1153
|
|
|
1154
|
+
# Regex fallback for Java ``import`` / ``package`` specifiers, used only when the
|
|
1155
|
+
# tree-sitter-java binding is unavailable (otherwise the registry backend's AST
|
|
1156
|
+
# extractor is preferred). Mirrors the SHAPES emitted by
|
|
1157
|
+
# ``treesitter._extract_java_import_specifiers`` (``static`` keyword + ``.*``
|
|
1158
|
+
# wildcard + ``package`` line preserved) so the Java resolver branch is agnostic
|
|
1159
|
+
# to which extractor produced the specifier.
|
|
1160
|
+
_JAVA_IMPORT_SPECIFIER_RE = re.compile(
|
|
1161
|
+
r"^\s*import\s+(static\s+)?([\w.]+(?:\.\*)?)\s*;",
|
|
1162
|
+
re.MULTILINE,
|
|
1163
|
+
)
|
|
1164
|
+
_JAVA_PACKAGE_SPECIFIER_RE = re.compile(r"^\s*package\s+([\w.]+)\s*;", re.MULTILINE)
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
def _extract_java_import_specifiers(file_path: Path) -> list[str]:
|
|
1168
|
+
"""Return raw Java ``import``/``package`` specifiers for DAG edge building.
|
|
1169
|
+
|
|
1170
|
+
Prefers the registry's Java ``source`` backend (tree-sitter-java) so the SAME
|
|
1171
|
+
extraction the scanner uses produces the DAG specifiers; degrades to a regex
|
|
1172
|
+
when the binding is absent. Either way the SHAPES (``static …`` / ``….*`` /
|
|
1173
|
+
``package …``) match, so ``_resolve_import_target``'s Java branch — dispatched
|
|
1174
|
+
by the ``.java`` suffix (DATA), not a ``language ==`` core branch — resolves
|
|
1175
|
+
them identically. Mirrors ``_extract_python_import_specifiers``.
|
|
1176
|
+
"""
|
|
1177
|
+
|
|
1178
|
+
from codd.parsing import get_extractor
|
|
1179
|
+
|
|
1180
|
+
content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
1181
|
+
specifiers = get_extractor("java", "source").extract_import_specifiers(content)
|
|
1182
|
+
if specifiers:
|
|
1183
|
+
return specifiers
|
|
1184
|
+
# Fallback: tree-sitter-java unavailable → RegexExtractor returned []. Recover
|
|
1185
|
+
# the same specifier shapes from a line regex so Java edges still form.
|
|
1186
|
+
fallback: list[str] = []
|
|
1187
|
+
package_match = _JAVA_PACKAGE_SPECIFIER_RE.search(content)
|
|
1188
|
+
if package_match:
|
|
1189
|
+
fallback.append(f"package {package_match.group(1)}")
|
|
1190
|
+
for static_kw, name in _JAVA_IMPORT_SPECIFIER_RE.findall(content):
|
|
1191
|
+
if name.endswith(".*"):
|
|
1192
|
+
fallback.append(name)
|
|
1193
|
+
elif static_kw:
|
|
1194
|
+
fallback.append(f"static {name}")
|
|
1195
|
+
else:
|
|
1196
|
+
fallback.append(name)
|
|
1197
|
+
return fallback
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
#: Suffix → raw-specifier extractor (DATA dispatch). A source file whose language
|
|
1201
|
+
#: carries its intra-tree dependency graph in DOTTED specifiers (Python modules,
|
|
1202
|
+
#: Java FQNs) resolves edges from these, instead of the builder's quoted-string
|
|
1203
|
+
#: ``extract_imports`` seam (JS/TS ``from '…'`` / ``require('…')``). Adding a
|
|
1204
|
+
#: language here is pure data — no core ``if language ==`` branch.
|
|
1205
|
+
_SUFFIX_SPECIFIER_EXTRACTORS: dict[str, "Callable[[Path], list[str]]"] = {
|
|
1206
|
+
".py": _extract_python_import_specifiers,
|
|
1207
|
+
".java": _extract_java_import_specifiers,
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
|
|
1028
1211
|
def _extract_impl_imports(file_path: Path) -> list[str]:
|
|
1029
1212
|
"""Return raw import specifiers for an implementation file.
|
|
1030
1213
|
|
|
1031
|
-
Python impl files go through
|
|
1032
|
-
test files use) so impl→impl import edges form for
|
|
1033
|
-
fix. Every other language keeps the existing
|
|
1034
|
-
(``extract_imports``: JS/TS ``from '…'`` /
|
|
1035
|
-
Dispatch is by file suffix (DATA)
|
|
1214
|
+
Python and Java impl files go through their registry-backed specifier
|
|
1215
|
+
extractors (the same path test files use) so impl→impl import edges form for
|
|
1216
|
+
them — the core of the fix. Every other language keeps the existing
|
|
1217
|
+
quoted-specifier extractor (``extract_imports``: JS/TS ``from '…'`` /
|
|
1218
|
+
``require('…')``), unchanged. Dispatch is by file suffix (DATA).
|
|
1036
1219
|
"""
|
|
1037
1220
|
|
|
1038
|
-
|
|
1039
|
-
|
|
1221
|
+
extractor = _SUFFIX_SPECIFIER_EXTRACTORS.get(file_path.suffix)
|
|
1222
|
+
if extractor is not None:
|
|
1223
|
+
return extractor(file_path)
|
|
1040
1224
|
return extract_imports(file_path)
|
|
1041
1225
|
|
|
1042
1226
|
|
|
1043
1227
|
def _extract_test_imports(file_path: Path) -> list[str]:
|
|
1044
1228
|
imports = extract_imports(file_path)
|
|
1045
|
-
|
|
1229
|
+
extractor = _SUFFIX_SPECIFIER_EXTRACTORS.get(file_path.suffix)
|
|
1230
|
+
if extractor is None:
|
|
1046
1231
|
return imports
|
|
1047
1232
|
|
|
1048
|
-
#
|
|
1049
|
-
# quoted-specifier pass above so a polyglot test file
|
|
1050
|
-
#
|
|
1051
|
-
return [*imports, *
|
|
1233
|
+
# Registry-backed dotted specifiers (Python relative imports / Java FQNs)
|
|
1234
|
+
# combined with the quoted-specifier pass above so a polyglot test file keeps
|
|
1235
|
+
# both seams' results.
|
|
1236
|
+
return [*imports, *extractor(file_path)]
|
|
1052
1237
|
|
|
1053
1238
|
|
|
1054
1239
|
def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
|
|
@@ -1143,6 +1328,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
|
|
|
1143
1328
|
return candidates
|
|
1144
1329
|
|
|
1145
1330
|
|
|
1331
|
+
_TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
|
|
1332
|
+
|
|
1333
|
+
|
|
1146
1334
|
def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
1147
1335
|
relative_parts = _relative_id(file_path, project_root).split("/")
|
|
1148
1336
|
name = file_path.name
|
|
@@ -1153,9 +1341,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
|
1153
1341
|
return True
|
|
1154
1342
|
if file_path.suffix == ".bats":
|
|
1155
1343
|
return True
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1344
|
+
in_test_dir = any(part in _TEST_DIR_NAMES for part in relative_parts[:-1])
|
|
1345
|
+
if file_path.suffix == ".py":
|
|
1346
|
+
# Python keeps the stricter pytest/unittest convention even under a test
|
|
1347
|
+
# directory (``test_*.py`` / ``*_test.py``) to avoid pulling fixtures.
|
|
1348
|
+
if in_test_dir:
|
|
1349
|
+
return name.startswith("test_") or name.endswith("_test.py")
|
|
1350
|
+
return False
|
|
1351
|
+
# Other languages: a source file living under a conventional test directory
|
|
1352
|
+
# is a test even without a ``.test.`` infix — e.g. Mocha/Tape ``test/app.js``
|
|
1353
|
+
# (Express) or ``spec/foo.js``. The caller already gates on ``test_suffixes``
|
|
1354
|
+
# and the configured ``test_file_patterns`` (scoped to the project's test
|
|
1355
|
+
# dirs), so this never sweeps in arbitrary source files.
|
|
1356
|
+
return in_test_dir
|
|
1159
1357
|
|
|
1160
1358
|
|
|
1161
1359
|
def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""Transitive closure DAG completeness check."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections import deque
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from codd.dag.checks import register_dag_check
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class TransitiveClosureResult:
|
|
15
|
+
check_name: str = "transitive_closure"
|
|
16
|
+
severity: str = "amber"
|
|
17
|
+
unreachable_nodes: list[str] = field(default_factory=list)
|
|
18
|
+
common_node_count: int = 0
|
|
19
|
+
passed: bool = True
|
|
20
|
+
# ``status``/``skipped``/``checked_count`` close a vacuous-pass hole: an empty
|
|
21
|
+
# DAG (or one whose every node is ``common`` and therefore exempt from
|
|
22
|
+
# reachability) used to return a green PASS having examined zero nodes.
|
|
23
|
+
# ``checked_count`` is the number of non-common nodes whose reachability was
|
|
24
|
+
# actually evaluated; when it is 0 the run is a SKIP, not a clean pass.
|
|
25
|
+
status: str = "pass"
|
|
26
|
+
skipped: bool = False
|
|
27
|
+
checked_count: int = 0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Edge kinds that represent an in-project source-import dependency
|
|
31
|
+
# (importer -> imported). Used to identify *code-entry roots*: source nodes that
|
|
32
|
+
# nothing in the project imports. This is a structural classification of edges,
|
|
33
|
+
# not a language/framework branch.
|
|
34
|
+
_IMPORT_EDGE_KINDS = frozenset({"imports"})
|
|
35
|
+
|
|
36
|
+
# Node kinds that are NOT first-class source nodes for entry-root detection:
|
|
37
|
+
# design docs are handled by their own root rule, and ``common`` nodes are shared
|
|
38
|
+
# infrastructure exempt from reachability. Anything else (``impl_file`` and any
|
|
39
|
+
# future source kind) is treated as a source node — no per-language literal.
|
|
40
|
+
_NON_SOURCE_KINDS = frozenset({"design_doc", "common"})
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@register_dag_check("transitive_closure")
|
|
44
|
+
class TransitiveClosureCheck:
|
|
45
|
+
"""Report unreachable nodes without blocking deploy.
|
|
46
|
+
|
|
47
|
+
A node is *reachable* if it can be reached from **any entry root**:
|
|
48
|
+
|
|
49
|
+
- **design_doc roots** — ``design_doc`` nodes with no incoming edge (the
|
|
50
|
+
classic "every artifact descends from a design document" model); and
|
|
51
|
+
- **code-entry roots** — source nodes (everything that is neither a
|
|
52
|
+
``design_doc`` nor a ``common`` node) with no incoming in-project *import*
|
|
53
|
+
edge, i.e. the package's public entry points (e.g. a package
|
|
54
|
+
``__init__`` or a CLI ``__main__`` that nothing else imports).
|
|
55
|
+
|
|
56
|
+
Seeding from the *union* of these makes reachability meaningful on doc-less
|
|
57
|
+
BROWNFIELD projects (raw external code with zero design docs but a fully
|
|
58
|
+
connected import graph) while leaving doc-rooted projects unchanged:
|
|
59
|
+
code-entry roots are purely additive. Only nodes unreachable from ALL entries
|
|
60
|
+
are flagged — genuine orphans.
|
|
61
|
+
|
|
62
|
+
Entry-root detection is structural (incoming-edge analysis on import-kind
|
|
63
|
+
edges), never a ``language ==`` branch.
|
|
64
|
+
|
|
65
|
+
Cycle / no-entry fallback: if a project has source nodes but none qualify as
|
|
66
|
+
a code-entry root (every source node has an in-project importer — a pure
|
|
67
|
+
cycle), reachability falls back to seeding from *all* source nodes for that
|
|
68
|
+
project, so connectivity is still measured rather than reported as a false
|
|
69
|
+
"everything unreachable". Cycles are traversed safely (visited-set guard).
|
|
70
|
+
|
|
71
|
+
Nodes with ``kind == "common"`` (shared infrastructure declared via
|
|
72
|
+
``common_node_patterns`` or frontmatter ``node_type: common``) remain exempt
|
|
73
|
+
from unreachable detection. They participate in the DAG so change-impact
|
|
74
|
+
analysis still sees them, but they do not need to be the descendant of a
|
|
75
|
+
single design document.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
|
|
79
|
+
self.dag = dag
|
|
80
|
+
self.project_root = project_root
|
|
81
|
+
self.settings = settings or {}
|
|
82
|
+
|
|
83
|
+
def run(
|
|
84
|
+
self,
|
|
85
|
+
dag=None,
|
|
86
|
+
project_root: Path | None = None,
|
|
87
|
+
settings: dict[str, Any] | None = None,
|
|
88
|
+
) -> TransitiveClosureResult:
|
|
89
|
+
dag = dag or self.dag
|
|
90
|
+
if dag is None or not dag.nodes:
|
|
91
|
+
# No nodes at all → reachability examined nothing → SKIP (not a
|
|
92
|
+
# vacuous green PASS).
|
|
93
|
+
return TransitiveClosureResult(
|
|
94
|
+
status="skip",
|
|
95
|
+
skipped=True,
|
|
96
|
+
checked_count=0,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
to_ids = {edge.to_id for edge in dag.edges}
|
|
100
|
+
design_roots = [
|
|
101
|
+
node.id
|
|
102
|
+
for node in dag.nodes.values()
|
|
103
|
+
if node.kind == "design_doc" and node.id not in to_ids
|
|
104
|
+
]
|
|
105
|
+
code_roots = self._code_entry_roots(dag)
|
|
106
|
+
|
|
107
|
+
# Reachable from ANY entry: design-doc roots OR code-entry roots. The
|
|
108
|
+
# union keeps doc-rooted projects unchanged (design roots still seed) and
|
|
109
|
+
# makes doc-less brownfield projects measurable (code roots seed the
|
|
110
|
+
# connected impl graph).
|
|
111
|
+
roots = list(dict.fromkeys([*design_roots, *code_roots]))
|
|
112
|
+
|
|
113
|
+
visited = self._reachable_from(dag, roots)
|
|
114
|
+
common_count = sum(
|
|
115
|
+
1 for node in dag.nodes.values() if node.kind == "common"
|
|
116
|
+
)
|
|
117
|
+
# Common nodes are exempt from unreachable detection, so the number of
|
|
118
|
+
# nodes whose reachability is actually evaluated is the non-common set.
|
|
119
|
+
checked = sum(1 for node in dag.nodes.values() if node.kind != "common")
|
|
120
|
+
unreachable = [
|
|
121
|
+
node_id
|
|
122
|
+
for node_id, node in dag.nodes.items()
|
|
123
|
+
if node_id not in visited and node.kind != "common"
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
if checked == 0:
|
|
127
|
+
# Every node is exempt (all ``common``): reachability examined nothing.
|
|
128
|
+
# A clean PASS here is a vacuous false-green → SKIP instead.
|
|
129
|
+
return TransitiveClosureResult(
|
|
130
|
+
unreachable_nodes=[],
|
|
131
|
+
common_node_count=common_count,
|
|
132
|
+
passed=True,
|
|
133
|
+
status="skip",
|
|
134
|
+
skipped=True,
|
|
135
|
+
checked_count=0,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
return TransitiveClosureResult(
|
|
139
|
+
unreachable_nodes=unreachable,
|
|
140
|
+
common_node_count=common_count,
|
|
141
|
+
passed=True,
|
|
142
|
+
status="pass",
|
|
143
|
+
skipped=False,
|
|
144
|
+
checked_count=checked,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
def _code_entry_roots(self, dag) -> list[str]:
|
|
148
|
+
"""Public entry points of the import graph (heads nothing imports).
|
|
149
|
+
|
|
150
|
+
A *source node* is any node that is neither a ``design_doc`` (handled by
|
|
151
|
+
its own root rule) nor a ``common`` node (exempt infrastructure). A source
|
|
152
|
+
node is a *code-entry root* when it **participates in the import graph as a
|
|
153
|
+
head**: it has at least one outgoing in-project import edge (it imports
|
|
154
|
+
something) AND no incoming import edge (nothing imports it). These are the
|
|
155
|
+
package's public entry points (e.g. ``__init__`` / ``__main__``).
|
|
156
|
+
|
|
157
|
+
Requiring an *outgoing* import edge is what preserves no-false-green: a
|
|
158
|
+
node with zero import edges (isolated -- imported by nothing and importing
|
|
159
|
+
nothing) is a genuine orphan, NOT an entry root, and therefore stays
|
|
160
|
+
flagged. Only nodes that actually anchor an import chain seed reachability.
|
|
161
|
+
|
|
162
|
+
Fallback (pure cycle / no head): if no source node qualifies as a head but
|
|
163
|
+
some source nodes still *participate* in the import graph (a cycle where
|
|
164
|
+
every node has an importer), seed from all participating source nodes so
|
|
165
|
+
connectivity is still measured instead of a false "everything
|
|
166
|
+
unreachable". Isolated orphans (no import edges) are never seeded and stay
|
|
167
|
+
flagged even in the fallback.
|
|
168
|
+
"""
|
|
169
|
+
source_ids = {
|
|
170
|
+
node.id
|
|
171
|
+
for node in dag.nodes.values()
|
|
172
|
+
if node.kind not in _NON_SOURCE_KINDS
|
|
173
|
+
}
|
|
174
|
+
if not source_ids:
|
|
175
|
+
return []
|
|
176
|
+
|
|
177
|
+
import_to: set[str] = set()
|
|
178
|
+
import_from: set[str] = set()
|
|
179
|
+
for edge in dag.edges:
|
|
180
|
+
if edge.kind in _IMPORT_EDGE_KINDS:
|
|
181
|
+
import_to.add(edge.to_id)
|
|
182
|
+
import_from.add(edge.from_id)
|
|
183
|
+
|
|
184
|
+
# Heads: import something in-project, imported by nothing in-project.
|
|
185
|
+
entry_roots = [
|
|
186
|
+
nid
|
|
187
|
+
for nid in source_ids
|
|
188
|
+
if nid in import_from and nid not in import_to
|
|
189
|
+
]
|
|
190
|
+
if entry_roots:
|
|
191
|
+
return entry_roots
|
|
192
|
+
|
|
193
|
+
# No clean head (pure cycle): seed from source nodes that participate in
|
|
194
|
+
# the import graph at all, so connectivity is still measured. Nodes with
|
|
195
|
+
# no import edges remain genuine orphans (never seeded here).
|
|
196
|
+
return [nid for nid in source_ids if nid in import_to or nid in import_from]
|
|
197
|
+
|
|
198
|
+
def _reachable_from(self, dag, roots: list[str]) -> set[str]:
|
|
199
|
+
visited: set[str] = set()
|
|
200
|
+
queue = deque(roots)
|
|
201
|
+
|
|
202
|
+
while queue:
|
|
203
|
+
current = queue.popleft()
|
|
204
|
+
if current in visited:
|
|
205
|
+
continue
|
|
206
|
+
visited.add(current)
|
|
207
|
+
for edge in dag.edges:
|
|
208
|
+
if edge.from_id == current and edge.to_id not in visited:
|
|
209
|
+
queue.append(edge.to_id)
|
|
210
|
+
|
|
211
|
+
return visited
|
|
@@ -57,6 +57,60 @@ CONFIG_FILES = [
|
|
|
57
57
|
# IaC patterns
|
|
58
58
|
IAC_EXTENSIONS = {".bicep", ".bicepparam", ".tf", ".tfvars", ".hcl"}
|
|
59
59
|
|
|
60
|
+
|
|
61
|
+
def ai_command_has_tools(ai_command: str) -> bool:
|
|
62
|
+
"""Return whether ``ai_command`` grants the model file/shell tools.
|
|
63
|
+
|
|
64
|
+
The extract prompt's "Extraction Procedure" enumerates the codebase via bash
|
|
65
|
+
(``find``/``ls``/``rg``). That only works when the AI CLI can actually shell
|
|
66
|
+
out. The default ``ai_command`` disables tools (``--tools ""``), and agentic
|
|
67
|
+
CLIs are hardened to read-only from an empty workspace elsewhere — so the
|
|
68
|
+
procedural bash framing pushes the model into agentic mode and it stubs or
|
|
69
|
+
hangs. We therefore treat NO TOOLS as the safe default and require an
|
|
70
|
+
explicit grant to keep the tool-enabled path.
|
|
71
|
+
|
|
72
|
+
Tools are considered AVAILABLE only when a ``--tools``/``--allowedTools``
|
|
73
|
+
flag carries a non-empty value. ``--tools ""`` (or the flag absent) → no
|
|
74
|
+
tools. Unparseable commands fail closed to no-tools (context-only is always
|
|
75
|
+
correct because the full PROJECT CONTEXT is embedded in the prompt).
|
|
76
|
+
"""
|
|
77
|
+
import shlex
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
parts = shlex.split(ai_command)
|
|
81
|
+
except ValueError:
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
tool_flags = {"--tools", "--allowedTools", "--allowed-tools"}
|
|
85
|
+
for i, part in enumerate(parts):
|
|
86
|
+
flag, sep, inline = part.partition("=")
|
|
87
|
+
if flag in tool_flags:
|
|
88
|
+
value = inline if sep else (parts[i + 1] if i + 1 < len(parts) else "")
|
|
89
|
+
if value.strip():
|
|
90
|
+
return True
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Prepended to the prompt when the AI CLI has no tools: it overrides the
|
|
95
|
+
# template's bash "Extraction Procedure" so the model extracts from the embedded
|
|
96
|
+
# PROJECT CONTEXT instead of trying to shell out (which it cannot do).
|
|
97
|
+
_NO_TOOLS_DIRECTIVE = """# ═══ EXECUTION MODE: NO TOOLS (context-only) ═══
|
|
98
|
+
|
|
99
|
+
You are running WITHOUT shell or file-system tools. Do NOT call any tool, do NOT
|
|
100
|
+
run bash/`find`/`ls`/`rg`/`cat`, and do NOT attempt to read files from disk.
|
|
101
|
+
|
|
102
|
+
The COMPLETE pre-scanned codebase — the directory tree plus the full contents of
|
|
103
|
+
every relevant source, config, IaC, and test file — is embedded verbatim under
|
|
104
|
+
"PROJECT CONTEXT (pre-scanned)" further down this prompt. That embedded context
|
|
105
|
+
is your ONLY source of truth.
|
|
106
|
+
|
|
107
|
+
When the "Extraction Procedure" below shows ```bash``` enumeration commands,
|
|
108
|
+
treat them as a DESCRIPTION of what to look for, NOT as commands to execute.
|
|
109
|
+
Instead, derive the same information by reading the embedded file contents
|
|
110
|
+
directly. Produce the full output document set in one response from that context.
|
|
111
|
+
|
|
112
|
+
"""
|
|
113
|
+
|
|
60
114
|
# Schema file patterns
|
|
61
115
|
SCHEMA_PATTERNS = [
|
|
62
116
|
"prisma/schema.prisma", "db/schema.rb", "alembic/versions",
|
|
@@ -360,10 +414,20 @@ def pre_scan(project_root: Path) -> PreScanResult:
|
|
|
360
414
|
# Phase 2: AI prompt building
|
|
361
415
|
# ═══════════════════════════════════════════════════════════
|
|
362
416
|
|
|
363
|
-
def _build_prompt(scan: PreScanResult) -> str:
|
|
364
|
-
"""Build the AI prompt from pre-scan results + extract template.
|
|
417
|
+
def _build_prompt(scan: PreScanResult, *, tools_available: bool = False) -> str:
|
|
418
|
+
"""Build the AI prompt from pre-scan results + extract template.
|
|
419
|
+
|
|
420
|
+
``tools_available`` reflects whether the AI CLI can shell out (see
|
|
421
|
+
:func:`ai_command_has_tools`). When False (the default for ``--tools ""``),
|
|
422
|
+
a NO-TOOLS directive is prepended so the model extracts from the embedded
|
|
423
|
+
PROJECT CONTEXT instead of trying to run the template's bash procedure.
|
|
424
|
+
"""
|
|
365
425
|
sections: list[str] = []
|
|
366
426
|
|
|
427
|
+
# No-tools mode: override the template's bash procedure up front.
|
|
428
|
+
if not tools_available:
|
|
429
|
+
sections.append(_NO_TOOLS_DIRECTIVE)
|
|
430
|
+
|
|
367
431
|
# Load prompt template
|
|
368
432
|
if PROMPT_TEMPLATE_FILE.exists():
|
|
369
433
|
template = PROMPT_TEMPLATE_FILE.read_text(encoding="utf-8")
|
|
@@ -810,6 +874,10 @@ def run_extract_ai(
|
|
|
810
874
|
# Phase 1: Pre-scan
|
|
811
875
|
scan = pre_scan(project_root)
|
|
812
876
|
|
|
877
|
+
# Whether the AI CLI can shell out. The default ``--tools ""`` disables
|
|
878
|
+
# tools, so the prompt must NOT lean on its bash enumeration procedure.
|
|
879
|
+
tools_available = ai_command_has_tools(ai_command)
|
|
880
|
+
|
|
813
881
|
# Phase 2: Build prompt (custom or baseline)
|
|
814
882
|
if prompt_file:
|
|
815
883
|
custom_path = Path(prompt_file)
|
|
@@ -819,10 +887,10 @@ def run_extract_ai(
|
|
|
819
887
|
# Temporarily swap template for custom prompt
|
|
820
888
|
import codd.extract_ai as _self
|
|
821
889
|
_self.PROMPT_TEMPLATE_FILE = custom_path
|
|
822
|
-
prompt = _build_prompt(scan)
|
|
890
|
+
prompt = _build_prompt(scan, tools_available=tools_available)
|
|
823
891
|
_self.PROMPT_TEMPLATE_FILE = original_template
|
|
824
892
|
else:
|
|
825
|
-
prompt = _build_prompt(scan)
|
|
893
|
+
prompt = _build_prompt(scan, tools_available=tools_available)
|
|
826
894
|
|
|
827
895
|
# Phase 3: AI invocation
|
|
828
896
|
raw_output = _invoke_ai_command(ai_command, prompt)
|