codd-dev 3.7.0__tar.gz → 3.7.2__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.0 → codd_dev-3.7.2}/PKG-INFO +1 -1
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/__init__.py +1 -1
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/cli.py +33 -1
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/builder.py +109 -9
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/ci_health.py +47 -2
- codd_dev-3.7.2/codd/dag/checks/transitive_closure.py +211 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extract_ai.py +303 -31
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/__init__.py +1 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/_shared.py +19 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/python_ast.py +71 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/regex_strategies.py +11 -1
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/treesitter.py +81 -17
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/codd.yaml.tmpl +28 -43
- {codd_dev-3.7.0 → codd_dev-3.7.2}/pyproject.toml +1 -1
- codd_dev-3.7.0/codd/dag/checks/transitive_closure.py +0 -116
- {codd_dev-3.7.0 → codd_dev-3.7.2}/.gitignore +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/LICENSE +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/bench_fixture/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/__main__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/_git_helper.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/action_outcome.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ai_invoke.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ai_patch.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifact_contract.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifact_ids.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/assembler.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/bridge.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/capability_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/claude_cli.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/clustering.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coherence_engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/confidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/config.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/config_schema.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/cardinality_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/extraction_diagnostics.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/negative_space.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/resource_flow_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/semantic_contract_conflict.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/stale_evidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/impact.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/materiality.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/metadata_access.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/result_status.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/defaults.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/defaults.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/design_md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/apply.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/persistence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/discovery.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_generator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_harness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/apply.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/finding.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/gap_to_ask.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/promote.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/routing.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/env_refs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extract_paths.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/impact_planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/frontmatter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/generator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/git_evidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/graph.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hitl_session.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/iac_nfr.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/import_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/inheritance.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/compat.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/contract.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profile.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/approval.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/parser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/mcp_server.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/measure.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/operations_derive.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/iac.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/path_safety.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/policy.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/project_types.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagate.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagation_common.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/reference_resolution.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/history.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/loop.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/schema.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair_slice.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require_plugins.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require_propagate.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirements_meta.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/restoration_report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/restore.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/routes_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/scanner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/schema_refs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_override.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/lock.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/obligations.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profile.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/project.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/resolve.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/synth.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/test_detection.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/traceability.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/events.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/watcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/wiring.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/requirements/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/examples/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.2}/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.2
|
|
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", {})
|
|
@@ -5862,6 +5892,8 @@ def extract(
|
|
|
5862
5892
|
click.echo(f"Output: {output_display}/")
|
|
5863
5893
|
for f in result.generated_files:
|
|
5864
5894
|
click.echo(f" {f.name}")
|
|
5895
|
+
for warning in getattr(result, "parse_warnings", []):
|
|
5896
|
+
click.echo(f" WARNING: {warning}")
|
|
5865
5897
|
if generated_config:
|
|
5866
5898
|
click.echo(f"Generated: {config_display} (minimal brownfield config)")
|
|
5867
5899
|
|
|
@@ -44,7 +44,6 @@ LEGACY_IMPLEMENTATION_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".
|
|
|
44
44
|
LEGACY_TEST_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".bats")
|
|
45
45
|
PLAN_HEADER_RE = re.compile(r"^#{2,6}\s+([A-Za-z0-9]+(?:[-_.][A-Za-z0-9]+)*)(?:\s+(.+))?$", re.MULTILINE)
|
|
46
46
|
OUTPUTS_RE = re.compile(r"(?im)^outputs?[ \t]*:[ \t]*(.*)$")
|
|
47
|
-
PY_IMPORT_RE = re.compile(r"(?m)^\s*(?:from\s+([A-Za-z_][\w.]*)(?:\s+import\s+)|import\s+([A-Za-z_][\w.]*))")
|
|
48
47
|
LEXICON_OUTPUT_PREFIX = "lexicon:"
|
|
49
48
|
EXPECTED_ARTIFACT_ATTRIBUTE_KEYS = (
|
|
50
49
|
"id",
|
|
@@ -298,7 +297,7 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
298
297
|
path=node_id,
|
|
299
298
|
attributes={
|
|
300
299
|
"language": _language_for_path(file_path),
|
|
301
|
-
"imports":
|
|
300
|
+
"imports": _extract_impl_imports(file_path),
|
|
302
301
|
"runtime_evidence": _runtime_evidence_for_file(file_path, node_id, capability_patterns),
|
|
303
302
|
},
|
|
304
303
|
),
|
|
@@ -913,13 +912,28 @@ def _resolve_import_target(
|
|
|
913
912
|
aliases: dict[str, list[str]],
|
|
914
913
|
) -> str | None:
|
|
915
914
|
candidates: list[Path] = []
|
|
916
|
-
if import_ref
|
|
915
|
+
if _is_js_relative_specifier(import_ref):
|
|
916
|
+
# JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
|
|
917
|
+
# exactly as before (a path with a separator after the dots).
|
|
917
918
|
candidates.append((file_path.parent / import_ref).resolve())
|
|
919
|
+
elif import_ref.startswith("."):
|
|
920
|
+
# Python relative: ``.b`` / ``..pkg.x`` / ``.`` — leading dots select a
|
|
921
|
+
# package directory (1 dot = current package, 2 = parent, …) and the
|
|
922
|
+
# dotted remainder maps to a sub-path. Distinct from JS ``./`` because
|
|
923
|
+
# Python uses ``.`` as the component separator, so ``pkg/.b`` (the old
|
|
924
|
+
# JS-style join) never matched ``pkg/b.py``.
|
|
925
|
+
candidates.extend(_python_relative_candidates(import_ref, file_path))
|
|
918
926
|
elif import_ref.startswith("/"):
|
|
919
927
|
candidates.append((project_root / import_ref.lstrip("/")).resolve())
|
|
920
928
|
else:
|
|
921
929
|
candidates.extend(_alias_candidates(import_ref, project_root, aliases))
|
|
922
930
|
candidates.append((project_root / import_ref).resolve())
|
|
931
|
+
# Absolute dotted module specifier (``pkg.c`` / ``a.b.c``): also try the
|
|
932
|
+
# dotted→path mapping rooted at the project, so a Python absolute import
|
|
933
|
+
# resolves to ``pkg/c.py`` (``__init__.py`` handled downstream). The
|
|
934
|
+
# plain join above keeps ``pkg/sub`` directory-style specifiers working.
|
|
935
|
+
if "." in import_ref:
|
|
936
|
+
candidates.append((project_root / Path(*import_ref.split("."))).resolve())
|
|
923
937
|
|
|
924
938
|
for candidate in candidates:
|
|
925
939
|
resolved = _resolve_file_candidate(candidate, path_to_node)
|
|
@@ -928,6 +942,45 @@ def _resolve_import_target(
|
|
|
928
942
|
return None
|
|
929
943
|
|
|
930
944
|
|
|
945
|
+
def _is_js_relative_specifier(import_ref: str) -> bool:
|
|
946
|
+
"""True for JS/TS relative specifiers (``./x`` / ``../x`` / ``.`` / ``..``).
|
|
947
|
+
|
|
948
|
+
The discriminator is purely the SHAPE of the specifier (data), not a
|
|
949
|
+
language flag: JS relative imports put a path separator after the leading
|
|
950
|
+
dots (or are the bare ``.`` / ``..`` directory refs), whereas Python
|
|
951
|
+
relative imports use ``.`` as the module-component separator (``.b``,
|
|
952
|
+
``..pkg.mod``). Keeping the JS branch byte-identical preserves the existing
|
|
953
|
+
TS/JS edge behavior.
|
|
954
|
+
"""
|
|
955
|
+
|
|
956
|
+
if import_ref in (".", ".."):
|
|
957
|
+
return True
|
|
958
|
+
return import_ref.startswith("./") or import_ref.startswith("../")
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
|
|
962
|
+
"""Resolve a Python relative import specifier to filesystem candidates.
|
|
963
|
+
|
|
964
|
+
Mirrors Python's own relative-import semantics: ``leading_dots`` counts the
|
|
965
|
+
package levels (1 = the importing file's package == its directory, 2 = the
|
|
966
|
+
parent package, …); the remaining dotted name becomes sub-directories.
|
|
967
|
+
``_resolve_file_candidate`` then appends the real suffix / ``__init__.py``.
|
|
968
|
+
"""
|
|
969
|
+
|
|
970
|
+
leading_dots = len(import_ref) - len(import_ref.lstrip("."))
|
|
971
|
+
remainder = import_ref[leading_dots:]
|
|
972
|
+
|
|
973
|
+
# 1 dot → current package dir (the file's own directory); each extra dot
|
|
974
|
+
# walks one package up.
|
|
975
|
+
base = file_path.parent
|
|
976
|
+
for _ in range(leading_dots - 1):
|
|
977
|
+
base = base.parent
|
|
978
|
+
|
|
979
|
+
if not remainder:
|
|
980
|
+
return [base.resolve()]
|
|
981
|
+
return [(base / Path(*remainder.split("."))).resolve()]
|
|
982
|
+
|
|
983
|
+
|
|
931
984
|
def _infer_test_targets(
|
|
932
985
|
test_path: Path,
|
|
933
986
|
project_root: Path,
|
|
@@ -954,14 +1007,48 @@ def _infer_test_targets(
|
|
|
954
1007
|
return targets
|
|
955
1008
|
|
|
956
1009
|
|
|
1010
|
+
def _extract_python_import_specifiers(file_path: Path) -> list[str]:
|
|
1011
|
+
"""Return raw Python import specifiers (relative dots preserved) via AST.
|
|
1012
|
+
|
|
1013
|
+
Dispatches to the registry's Python ``source`` backend
|
|
1014
|
+
(:class:`codd.parsing.PythonAstExtractor`) so the SAME stdlib-``ast``
|
|
1015
|
+
extraction that the scanner uses produces the DAG's specifiers — including
|
|
1016
|
+
relative imports (``.b`` / ``from . import d`` / ``..pkg.x``) that the old
|
|
1017
|
+
line-anchored regex (a ``from ([A-Za-z_]…)`` pattern that could not match a
|
|
1018
|
+
leading-dot module) silently dropped. Selection is registry-DATA-driven
|
|
1019
|
+
(``get_extractor``), not a ``language ==`` branch.
|
|
1020
|
+
"""
|
|
1021
|
+
|
|
1022
|
+
from codd.parsing import get_extractor
|
|
1023
|
+
|
|
1024
|
+
content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
1025
|
+
return get_extractor("python", "source").extract_import_specifiers(content)
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
def _extract_impl_imports(file_path: Path) -> list[str]:
|
|
1029
|
+
"""Return raw import specifiers for an implementation file.
|
|
1030
|
+
|
|
1031
|
+
Python impl files go through AST-based specifier extraction (the same path
|
|
1032
|
+
test files use) so impl→impl import edges form for Python — the core of the
|
|
1033
|
+
fix. Every other language keeps the existing quoted-specifier extractor
|
|
1034
|
+
(``extract_imports``: JS/TS ``from '…'`` / ``require('…')``), unchanged.
|
|
1035
|
+
Dispatch is by file suffix (DATA), mirroring ``_extract_test_imports``.
|
|
1036
|
+
"""
|
|
1037
|
+
|
|
1038
|
+
if file_path.suffix == ".py":
|
|
1039
|
+
return _extract_python_import_specifiers(file_path)
|
|
1040
|
+
return extract_imports(file_path)
|
|
1041
|
+
|
|
1042
|
+
|
|
957
1043
|
def _extract_test_imports(file_path: Path) -> list[str]:
|
|
958
1044
|
imports = extract_imports(file_path)
|
|
959
1045
|
if file_path.suffix != ".py":
|
|
960
1046
|
return imports
|
|
961
1047
|
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
1048
|
+
# AST-based Python specifiers (relative imports included). Combined with the
|
|
1049
|
+
# quoted-specifier pass above so a polyglot test file (e.g. a ``.py`` test
|
|
1050
|
+
# that also embeds a JS ``require('…')`` literal in a string) keeps both.
|
|
1051
|
+
return [*imports, *_extract_python_import_specifiers(file_path)]
|
|
965
1052
|
|
|
966
1053
|
|
|
967
1054
|
def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
|
|
@@ -1056,6 +1143,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
|
|
|
1056
1143
|
return candidates
|
|
1057
1144
|
|
|
1058
1145
|
|
|
1146
|
+
_TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
|
|
1147
|
+
|
|
1148
|
+
|
|
1059
1149
|
def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
1060
1150
|
relative_parts = _relative_id(file_path, project_root).split("/")
|
|
1061
1151
|
name = file_path.name
|
|
@@ -1066,9 +1156,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
|
1066
1156
|
return True
|
|
1067
1157
|
if file_path.suffix == ".bats":
|
|
1068
1158
|
return True
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1159
|
+
in_test_dir = any(part in _TEST_DIR_NAMES for part in relative_parts[:-1])
|
|
1160
|
+
if file_path.suffix == ".py":
|
|
1161
|
+
# Python keeps the stricter pytest/unittest convention even under a test
|
|
1162
|
+
# directory (``test_*.py`` / ``*_test.py``) to avoid pulling fixtures.
|
|
1163
|
+
if in_test_dir:
|
|
1164
|
+
return name.startswith("test_") or name.endswith("_test.py")
|
|
1165
|
+
return False
|
|
1166
|
+
# Other languages: a source file living under a conventional test directory
|
|
1167
|
+
# is a test even without a ``.test.`` infix — e.g. Mocha/Tape ``test/app.js``
|
|
1168
|
+
# (Express) or ``spec/foo.js``. The caller already gates on ``test_suffixes``
|
|
1169
|
+
# and the configured ``test_file_patterns`` (scoped to the project's test
|
|
1170
|
+
# dirs), so this never sweeps in arbitrary source files.
|
|
1171
|
+
return in_test_dir
|
|
1072
1172
|
|
|
1073
1173
|
|
|
1074
1174
|
def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
|
|
@@ -24,10 +24,19 @@ _DEFAULT_PROVIDER = "github" + "_actions"
|
|
|
24
24
|
_OPT_OUT_PROVIDER = "none"
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
# GitHub Actions officially loads workflow files with EITHER ``.yml`` or
|
|
28
|
+
# ``.yaml``. The default glob therefore matches both extensions (comma-separated
|
|
29
|
+
# union — see ``_locate_workflows``). A user who narrows ``workflow_glob`` to a
|
|
30
|
+
# single pattern keeps exact control (an explicit ``*.yaml`` pulls in only
|
|
31
|
+
# ``.yaml``); only the DEFAULT spans both so the common ``.yaml``-only project
|
|
32
|
+
# (e.g. Flask) is not mis-RED-flagged ``ci_workflow_missing``.
|
|
33
|
+
_DEFAULT_WORKFLOW_GLOB = ".github/workflows/*.yml,.github/workflows/*.yaml"
|
|
34
|
+
|
|
35
|
+
|
|
27
36
|
@dataclass
|
|
28
37
|
class CiConfig:
|
|
29
38
|
provider: str = _DEFAULT_PROVIDER
|
|
30
|
-
workflow_glob: str =
|
|
39
|
+
workflow_glob: str = _DEFAULT_WORKFLOW_GLOB
|
|
31
40
|
required_triggers: list[str] = field(default_factory=lambda: ["push", "pull_request"])
|
|
32
41
|
runtime_check: bool = False
|
|
33
42
|
staleness_days: int = 14
|
|
@@ -241,7 +250,43 @@ class CiHealthCheck(DagCheck):
|
|
|
241
250
|
project_root: Path,
|
|
242
251
|
workflow_glob: str,
|
|
243
252
|
) -> tuple[list[Path], list[str]]:
|
|
244
|
-
"""Resolve in-root workflow files
|
|
253
|
+
"""Resolve in-root workflow files for one OR MORE comma-separated globs.
|
|
254
|
+
|
|
255
|
+
``workflow_glob`` may carry several patterns separated by commas (the
|
|
256
|
+
default spans both ``*.yml`` and ``*.yaml`` because GitHub Actions loads
|
|
257
|
+
either extension). Each sub-glob is resolved independently through the
|
|
258
|
+
shared path_safety jail (see :meth:`_locate_one_glob`); the in-root
|
|
259
|
+
matches are unioned + de-duplicated, and any out-of-root markers are
|
|
260
|
+
accumulated so a single escaping sub-glob still surfaces a structured red
|
|
261
|
+
finding. A single (comma-free) pattern behaves exactly as before, so a
|
|
262
|
+
user who narrows ``workflow_glob`` to one pattern keeps exact control.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
sub_globs = [part.strip() for part in workflow_glob.split(",") if part.strip()]
|
|
266
|
+
if not sub_globs:
|
|
267
|
+
return [], []
|
|
268
|
+
|
|
269
|
+
seen: set[Path] = set()
|
|
270
|
+
in_root: list[Path] = []
|
|
271
|
+
out_of_root: list[str] = []
|
|
272
|
+
for sub in sub_globs:
|
|
273
|
+
files, escaped = self._locate_one_glob(project_root, sub)
|
|
274
|
+
for path in files:
|
|
275
|
+
if path not in seen:
|
|
276
|
+
seen.add(path)
|
|
277
|
+
in_root.append(path)
|
|
278
|
+
for marker in escaped:
|
|
279
|
+
if marker not in out_of_root:
|
|
280
|
+
out_of_root.append(marker)
|
|
281
|
+
in_root.sort()
|
|
282
|
+
return in_root, out_of_root
|
|
283
|
+
|
|
284
|
+
def _locate_one_glob(
|
|
285
|
+
self,
|
|
286
|
+
project_root: Path,
|
|
287
|
+
workflow_glob: str,
|
|
288
|
+
) -> tuple[list[Path], list[str]]:
|
|
289
|
+
"""Resolve in-root workflow files for ONE glob via the path_safety jail.
|
|
245
290
|
|
|
246
291
|
The glob root is validated *before* enumeration. An absolute
|
|
247
292
|
``workflow_glob`` whose static (non-magic) base escapes the project root
|
|
@@ -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
|