codd-dev 2.44.0__tar.gz → 2.45.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codd_dev-2.44.0 → codd_dev-2.45.0}/PKG-INFO +1 -1
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/__init__.py +1 -1
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/defaults/verification_templates.yaml +2 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/extractor.py +21 -4
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/__init__.py +2 -0
- codd_dev-2.45.0/codd/deployment/providers/verification/pytest_http.py +197 -0
- codd_dev-2.45.0/codd/e2e_harness.py +177 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/generator.py +129 -5
- {codd_dev-2.44.0 → codd_dev-2.45.0}/pyproject.toml +1 -1
- {codd_dev-2.44.0 → codd_dev-2.45.0}/.gitignore +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/LICENSE +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/__main__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/assembler.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/bridge.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/cli.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/clustering.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/confidence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/config.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/config_schema.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/defaults.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployer.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/design_md.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/discovery.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/drift.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/env_refs.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixer.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/graph.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/implementer.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/inheritance.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/measure.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/planner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/policy.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/project_types.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/propagate.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/propagator.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/reference_resolution.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/registry.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/history.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/require.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/restore.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/scanner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/synth.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/test_detection.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/traceability.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/validator.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/events.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd/wiring.py +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/dogfood/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/examples/README.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.44.0 → codd_dev-2.45.0}/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: 2.
|
|
3
|
+
Version: 2.45.0
|
|
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
|
|
@@ -40,11 +40,21 @@ SMOKE_TEST_PATTERNS = (
|
|
|
40
40
|
)
|
|
41
41
|
# All globs are kept: Playwright's convention is ``*.spec.ts``, a CLI
|
|
42
42
|
# (vitest/jest) e2e is commonly ``*.test.ts``, and ``*.e2e.ts`` is the explicit
|
|
43
|
-
# e2e naming convention codex emits unprompted.
|
|
44
|
-
#
|
|
43
|
+
# e2e naming convention codex emits unprompted. The ``test_*.py``/``*_test.py``
|
|
44
|
+
# globs discover Python HTTP e2e tests (pytest convention) emitted by the
|
|
45
|
+
# language-aware web harness (:mod:`codd.e2e_harness`) for Python projects;
|
|
46
|
+
# bare ``tests/e2e/*.py`` is intentionally NOT a pattern (it would wrongly grab
|
|
47
|
+
# ``__init__.py`` / helper modules). Routing to the right RUNNER happens in
|
|
48
|
+
# :func:`_verification_template_ref` (by extension + ``e2e_modality``); discovery
|
|
45
49
|
# must see every shape so a generated e2e test is not silently dropped (an
|
|
46
|
-
# undiscovered
|
|
47
|
-
E2E_TEST_PATTERNS = (
|
|
50
|
+
# undiscovered e2e means the verify stage never RUNS it).
|
|
51
|
+
E2E_TEST_PATTERNS = (
|
|
52
|
+
"tests/e2e/*.spec.ts",
|
|
53
|
+
"tests/e2e/*.test.ts",
|
|
54
|
+
"tests/e2e/*.e2e.ts",
|
|
55
|
+
"tests/e2e/test_*.py",
|
|
56
|
+
"tests/e2e/*_test.py",
|
|
57
|
+
)
|
|
48
58
|
RUNTIME_CAPABILITY_INFERENCE_DEFAULTS = Path(__file__).parent / "defaults" / "runtime_capability_inference.yaml"
|
|
49
59
|
|
|
50
60
|
DEPLOYMENT_SECTION_IMPL_PATTERNS: dict[str, tuple[str, ...]] = {
|
|
@@ -934,6 +944,11 @@ def _verification_template_ref(
|
|
|
934
944
|
|
|
935
945
|
``device`` modality has no built-in runner template yet, so it also keeps
|
|
936
946
|
the legacy ``playwright`` default rather than silently dropping the test.
|
|
947
|
+
|
|
948
|
+
A ``.py`` e2e file routes to ``pytest_http`` (Python HTTP e2e), the
|
|
949
|
+
language-native runner emitted by the language-aware web harness
|
|
950
|
+
(:mod:`codd.e2e_harness`). The TS/JS modality routing and ``.sh`` → ``curl``
|
|
951
|
+
behavior are unchanged (generality: node-targeting behavior must not move).
|
|
937
952
|
"""
|
|
938
953
|
if cdp_browser_journey:
|
|
939
954
|
return "cdp_browser"
|
|
@@ -942,6 +957,8 @@ def _verification_template_ref(
|
|
|
942
957
|
if modality == "cli":
|
|
943
958
|
return "vitest"
|
|
944
959
|
return "playwright"
|
|
960
|
+
if path.suffix == ".py":
|
|
961
|
+
return "pytest_http"
|
|
945
962
|
if path.suffix == ".sh":
|
|
946
963
|
return "curl"
|
|
947
964
|
return "document"
|
|
@@ -8,6 +8,7 @@ from . import cdp_wire as cdp_wire
|
|
|
8
8
|
from . import curl as curl
|
|
9
9
|
from . import form_strategies as form_strategies
|
|
10
10
|
from . import playwright as playwright
|
|
11
|
+
from . import pytest_http as pytest_http
|
|
11
12
|
from . import vitest as vitest
|
|
12
13
|
|
|
13
14
|
__all__ = [
|
|
@@ -19,5 +20,6 @@ __all__ = [
|
|
|
19
20
|
"curl",
|
|
20
21
|
"form_strategies",
|
|
21
22
|
"playwright",
|
|
23
|
+
"pytest_http",
|
|
22
24
|
"vitest",
|
|
23
25
|
]
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""pytest HTTP end-to-end verification template (Python-native web E2E).
|
|
2
|
+
|
|
3
|
+
The Playwright template (``playwright.py``) drives a BROWSER e2e against
|
|
4
|
+
``*.spec.ts`` files under a node toolchain. For a **Python** web app with an
|
|
5
|
+
HTTP surface and no explicit browser requirement, that is the wrong runner — the
|
|
6
|
+
project has no ``package.json`` and verify fails with ``Cannot find module
|
|
7
|
+
'@playwright/test'`` (the harness, not the code, is broken). The language-aware
|
|
8
|
+
harness resolver (:mod:`codd.e2e_harness`) routes such projects to a Python
|
|
9
|
+
``pytest`` HTTP e2e harness, and the extractor (:func:`_verification_template_ref`)
|
|
10
|
+
sends generated ``tests/e2e/test_*.py`` e2e nodes here.
|
|
11
|
+
|
|
12
|
+
This template runs a single Python e2e file (or the e2e directory) under
|
|
13
|
+
``python -m pytest -q`` and applies the same ANTI-FALSE-GREEN executed-count
|
|
14
|
+
discipline the rest of the verify layer enforces (mirroring ``vitest.py``): a run
|
|
15
|
+
that COLLECTS/RUNS ZERO tests is a HARD FAIL — pytest exits ``5`` and prints "no
|
|
16
|
+
tests ran" / "collected 0 items" when it finds nothing, which must never count as
|
|
17
|
+
green-on-nothing.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import re
|
|
23
|
+
import shlex
|
|
24
|
+
import subprocess
|
|
25
|
+
import time
|
|
26
|
+
from collections.abc import Mapping
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
import yaml
|
|
31
|
+
|
|
32
|
+
from codd.deployment.providers import (
|
|
33
|
+
VerificationResult,
|
|
34
|
+
VerificationTemplate,
|
|
35
|
+
register_verification_template,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
DEFAULTS_PATH = Path(__file__).parents[2] / "defaults" / "verification_templates.yaml"
|
|
40
|
+
|
|
41
|
+
#: pytest's exit code when NO tests were collected (``EXIT_NOTESTSCOLLECTED``).
|
|
42
|
+
_PYTEST_NO_TESTS_EXIT_CODE = 5
|
|
43
|
+
|
|
44
|
+
#: pytest's "nothing ran" signatures. pytest exits 5 (not 0) when it collects no
|
|
45
|
+
#: tests, so the exit code alone normally suffices — but we additionally scan the
|
|
46
|
+
#: output so a wrapper/plugin that swallows exit 5 (or a ``-p no:cacheprovider``
|
|
47
|
+
#: style harness) still cannot pass on zero collected tests.
|
|
48
|
+
_NO_TESTS_MARKERS: tuple[str, ...] = (
|
|
49
|
+
"no tests ran",
|
|
50
|
+
"no tests collected",
|
|
51
|
+
"collected 0 items",
|
|
52
|
+
"collected 0 item",
|
|
53
|
+
)
|
|
54
|
+
#: ``collected <N> item(s)`` / ``<N> passed`` / ``<N> failed`` — a positive
|
|
55
|
+
#: collected/ran signal. ``collected 0 items`` is handled by the markers above
|
|
56
|
+
#: (this regex requires a non-zero leading digit).
|
|
57
|
+
_COLLECTED_RE = re.compile(r"collected\s+([1-9]\d*)\s+items?", re.IGNORECASE)
|
|
58
|
+
_RAN_RE = re.compile(r"\b\d+\s+(?:passed|failed|error|errors)\b", re.IGNORECASE)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _load_timeout_seconds() -> float:
|
|
62
|
+
try:
|
|
63
|
+
defaults = yaml.safe_load(DEFAULTS_PATH.read_text(encoding="utf-8")) or {}
|
|
64
|
+
except OSError:
|
|
65
|
+
return 120.0
|
|
66
|
+
timeout = defaults.get("templates", {}).get("pytest_http", {}).get("timeout", 120000)
|
|
67
|
+
try:
|
|
68
|
+
timeout_value = float(timeout)
|
|
69
|
+
except (TypeError, ValueError):
|
|
70
|
+
return 120.0
|
|
71
|
+
return timeout_value / 1000 if timeout_value > 1000 else timeout_value
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _project_root(runtime_state: Any) -> Path:
|
|
75
|
+
root = getattr(runtime_state, "project_root", None) or getattr(runtime_state, "root", None)
|
|
76
|
+
return Path(root) if root else Path.cwd()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@register_verification_template("pytest_http")
|
|
80
|
+
class PytestHttpTemplate(VerificationTemplate):
|
|
81
|
+
"""Generate and execute ``python -m pytest`` commands for Python HTTP e2e tests."""
|
|
82
|
+
|
|
83
|
+
def __init__(self, timeout: float | None = None, config: Mapping[str, Any] | None = None) -> None:
|
|
84
|
+
config_map = dict(config) if isinstance(config, Mapping) else {}
|
|
85
|
+
configured_timeout = _positive_float(config_map.get("timeout"))
|
|
86
|
+
self.timeout = timeout if timeout is not None else configured_timeout or _load_timeout_seconds()
|
|
87
|
+
|
|
88
|
+
def generate_test_command(self, runtime_state, test_kind: str) -> str:
|
|
89
|
+
actual_check_command = getattr(runtime_state, "actual_check_command", None)
|
|
90
|
+
if actual_check_command:
|
|
91
|
+
return str(actual_check_command)
|
|
92
|
+
|
|
93
|
+
kind = test_kind.lower()
|
|
94
|
+
project_root = _project_root(runtime_state)
|
|
95
|
+
test_target = _specific_test_target(runtime_state, kind, project_root)
|
|
96
|
+
if test_target is None:
|
|
97
|
+
test_target = "tests/e2e/" if kind == "e2e" else "tests/smoke/"
|
|
98
|
+
# ``python -m pytest`` (not bare ``pytest``) so the project's interpreter
|
|
99
|
+
# /venv resolves the runner; the positional scopes the run to the e2e
|
|
100
|
+
# file/dir so an e2e node runs its OWN test, not the whole suite.
|
|
101
|
+
return f"python -m pytest -q {shlex.quote(test_target)}"
|
|
102
|
+
|
|
103
|
+
def execute(self, command: str, cwd: Path | None = None) -> VerificationResult:
|
|
104
|
+
started_at = time.monotonic()
|
|
105
|
+
try:
|
|
106
|
+
completed = subprocess.run(
|
|
107
|
+
command,
|
|
108
|
+
shell=True,
|
|
109
|
+
cwd=cwd,
|
|
110
|
+
capture_output=True,
|
|
111
|
+
text=True,
|
|
112
|
+
timeout=self.timeout,
|
|
113
|
+
)
|
|
114
|
+
except subprocess.TimeoutExpired as exc:
|
|
115
|
+
duration = time.monotonic() - started_at
|
|
116
|
+
output = exc.stderr or exc.stdout or f"Timed out after {self.timeout:g}s"
|
|
117
|
+
return VerificationResult(passed=False, output=str(output), duration=duration)
|
|
118
|
+
|
|
119
|
+
duration = time.monotonic() - started_at
|
|
120
|
+
combined = "\n".join(part for part in (completed.stdout, completed.stderr) if part)
|
|
121
|
+
# ANTI-FALSE-GREEN: pytest exits 5 with "no tests ran" — a collected/ran
|
|
122
|
+
# count of ZERO is a HARD FAIL regardless of exit code (even 0).
|
|
123
|
+
if completed.returncode == _PYTEST_NO_TESTS_EXIT_CODE or _collected_zero(combined):
|
|
124
|
+
return VerificationResult(
|
|
125
|
+
passed=False,
|
|
126
|
+
output=(
|
|
127
|
+
"pytest collected/ran 0 tests (no tests ran) — "
|
|
128
|
+
"treated as a hard failure (anti-false-green).\n" + combined
|
|
129
|
+
),
|
|
130
|
+
duration=duration,
|
|
131
|
+
)
|
|
132
|
+
if completed.returncode == 0:
|
|
133
|
+
return VerificationResult(passed=True, output=completed.stdout, duration=duration)
|
|
134
|
+
return VerificationResult(
|
|
135
|
+
passed=False,
|
|
136
|
+
output=completed.stderr or completed.stdout,
|
|
137
|
+
duration=duration,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
#: Python test-file shapes a pytest e2e run can collect: the pytest
|
|
141
|
+
#: ``test_*.py`` / ``*_test.py`` conventions the generator emits under
|
|
142
|
+
#: ``tests/e2e/``. Discovery in the extractor must see the same shapes.
|
|
143
|
+
_RUNNABLE_PY_GLOBS: tuple[str, ...] = ("test_*.py", "*_test.py")
|
|
144
|
+
|
|
145
|
+
def find_spec_files(self, project_root: Path, test_kind: str) -> list[Path]:
|
|
146
|
+
base = "tests/e2e" if test_kind.lower() == "e2e" else "tests/smoke"
|
|
147
|
+
found: dict[str, Path] = {}
|
|
148
|
+
for leaf in self._RUNNABLE_PY_GLOBS:
|
|
149
|
+
for path in project_root.glob(f"{base}/**/{leaf}"):
|
|
150
|
+
found[str(path)] = path
|
|
151
|
+
return sorted(found.values())
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _collected_zero(output: str) -> bool:
|
|
155
|
+
"""True when the pytest output proves NO test was collected/run.
|
|
156
|
+
|
|
157
|
+
Conservative: an explicit "no tests ran" / "collected 0 items" marker is a
|
|
158
|
+
definite zero. A run that shows a positive ``collected N items`` OR an
|
|
159
|
+
``N passed/failed/error`` summary is treated as non-zero. Absent any of
|
|
160
|
+
those signals we do NOT force-fail here (the exit-code check in ``execute``
|
|
161
|
+
already catches pytest's exit 5); this guard exists to defeat a wrapper that
|
|
162
|
+
masks exit 5 while printing a "no tests ran" banner.
|
|
163
|
+
"""
|
|
164
|
+
lowered = output.lower()
|
|
165
|
+
if any(marker in lowered for marker in _NO_TESTS_MARKERS):
|
|
166
|
+
return True
|
|
167
|
+
return False
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _positive_float(value: Any) -> float | None:
|
|
171
|
+
try:
|
|
172
|
+
parsed = float(value)
|
|
173
|
+
except (TypeError, ValueError):
|
|
174
|
+
return None
|
|
175
|
+
return parsed if parsed > 0 else None
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _specific_test_target(runtime_state: Any, test_kind: str, project_root: Path) -> str | None:
|
|
179
|
+
source = getattr(runtime_state, "source", None)
|
|
180
|
+
if not source:
|
|
181
|
+
return None
|
|
182
|
+
source_text = str(source).strip()
|
|
183
|
+
if not source_text:
|
|
184
|
+
return None
|
|
185
|
+
expected_prefix = "tests/e2e/" if test_kind == "e2e" else "tests/smoke/"
|
|
186
|
+
normalized = source_text.replace("\\", "/")
|
|
187
|
+
if not normalized.startswith(expected_prefix):
|
|
188
|
+
return None
|
|
189
|
+
|
|
190
|
+
path = Path(source_text)
|
|
191
|
+
candidate = path if path.is_absolute() else project_root / path
|
|
192
|
+
if not candidate.is_file():
|
|
193
|
+
return None
|
|
194
|
+
try:
|
|
195
|
+
return candidate.relative_to(project_root).as_posix()
|
|
196
|
+
except ValueError:
|
|
197
|
+
return str(candidate)
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Deterministic web/HTTP end-to-end harness selection (language-aware).
|
|
2
|
+
|
|
3
|
+
Historically CoDD's generation pipeline selected a browser E2E harness
|
|
4
|
+
(Playwright/TypeScript ``*.spec.ts``) for ANY project whose capability profile
|
|
5
|
+
declared ``e2e_modality == "browser"`` — regardless of the project's host
|
|
6
|
+
language. A Python Flask web app with an HTTP surface and no node toolchain
|
|
7
|
+
therefore honest-failed at verify time with ``Cannot find module
|
|
8
|
+
'@playwright/test'``: CoDD chose a TS/node verification harness it had no way to
|
|
9
|
+
run. The CLI branch was already language-native ("invoke the built CLI as a
|
|
10
|
+
subprocess; do NOT use Playwright"); the web branch was not.
|
|
11
|
+
|
|
12
|
+
This module is the single, DETERMINISTIC decision point that makes web/HTTP E2E
|
|
13
|
+
harness selection language-aware, mirroring the CLI branch. The rules below are
|
|
14
|
+
pure functions of ``project_language`` + ``capabilities`` (+ explicit
|
|
15
|
+
``constraints``); they NEVER infer intent from LLM prose. The North-Star
|
|
16
|
+
contract is anti-false-green-safe: when browser automation is NOT explicitly
|
|
17
|
+
required, a Python project gets a Python ``pytest`` HTTP E2E harness instead of
|
|
18
|
+
TS Playwright. The worst case of preferring HTTP E2E for an ambiguous project is
|
|
19
|
+
a false-RED / coverage gap (an honest fail), never a false-GREEN.
|
|
20
|
+
|
|
21
|
+
The matrix is generic (host-language × modality), not Python+Playwright
|
|
22
|
+
special-cased: TypeScript/node browser projects keep the existing Playwright
|
|
23
|
+
path BYTE-FOR-BYTE; a non-Python HTTP surface keeps today's behavior.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from collections.abc import Mapping
|
|
29
|
+
from dataclasses import dataclass
|
|
30
|
+
from typing import Any
|
|
31
|
+
|
|
32
|
+
from codd.project_types import ProjectCapabilities
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = ["E2EHarnessSpec", "resolve_e2e_harness"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#: Config/constraint keys whose VALUE explicitly selects a node/Playwright
|
|
39
|
+
#: browser-automation harness. Matching is exact (lower-cased) — prose is never
|
|
40
|
+
#: parsed. Keeping this a small allow-list (rather than a substring scan) is what
|
|
41
|
+
#: keeps the resolver deterministic and free of LLM-inference.
|
|
42
|
+
_EXPLICIT_BROWSER_HARNESS_VALUES = frozenset(
|
|
43
|
+
{"playwright", "playwright_node", "cypress", "browser", "node"}
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
#: Constraint keys that, when truthy, declare browser automation is required.
|
|
47
|
+
_EXPLICIT_BROWSER_FLAG_KEYS = frozenset(
|
|
48
|
+
{"browser_automation_required", "requires_browser", "browser_required"}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
#: Constraint keys whose value is read as an explicit harness selector.
|
|
52
|
+
_E2E_HARNESS_SELECTOR_KEYS = frozenset({"e2e_harness", "e2e_runner", "harness"})
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class E2EHarnessSpec:
|
|
57
|
+
"""The resolved web/HTTP E2E harness for a project.
|
|
58
|
+
|
|
59
|
+
``runner`` — logical runner id (``pytest_http`` | ``playwright`` |
|
|
60
|
+
``native_cli`` | ``none``).
|
|
61
|
+
``language`` — host language the generated tests are written in.
|
|
62
|
+
``output_ext``— file extension for generated E2E test files (``.py`` | ``.ts``).
|
|
63
|
+
``template_ref`` — the verification template the extractor/verify layer
|
|
64
|
+
routes this harness to (``pytest_http`` | ``playwright`` |
|
|
65
|
+
``native_cli`` | ``none``).
|
|
66
|
+
``requires_node_manifest`` — True when the harness needs a node manifest
|
|
67
|
+
(``package.json``) to run (Playwright). Consumed by the
|
|
68
|
+
conditional node-manifest scaffold (deferred) and the
|
|
69
|
+
toolchain-coherence gate; never inferred from prose.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
runner: str
|
|
73
|
+
language: str
|
|
74
|
+
output_ext: str
|
|
75
|
+
template_ref: str
|
|
76
|
+
requires_node_manifest: bool = False
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _explicit_browser_required(constraints: Mapping[str, Any] | None) -> bool:
|
|
80
|
+
"""True ONLY when constraints/config EXPLICITLY declare browser automation.
|
|
81
|
+
|
|
82
|
+
Deterministic: a truthy boolean flag key (e.g. ``browser_automation_required:
|
|
83
|
+
true``) OR a harness-selector key whose value names a browser/node runner
|
|
84
|
+
(e.g. ``e2e_harness: playwright_node``). Ambiguous/absent → False, which
|
|
85
|
+
routes Python projects to ``pytest_http`` (at worst a false-RED / coverage
|
|
86
|
+
gap, never a false-GREEN). LLM prose is NEVER parsed.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
if not isinstance(constraints, Mapping):
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
for key, value in constraints.items():
|
|
93
|
+
if not isinstance(key, str):
|
|
94
|
+
continue
|
|
95
|
+
normalized_key = key.strip().lower()
|
|
96
|
+
if normalized_key in _EXPLICIT_BROWSER_FLAG_KEYS and bool(value):
|
|
97
|
+
return True
|
|
98
|
+
if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
|
|
99
|
+
if value.strip().lower() in _EXPLICIT_BROWSER_HARNESS_VALUES:
|
|
100
|
+
return True
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def resolve_e2e_harness(
|
|
105
|
+
*,
|
|
106
|
+
project_language: str | None,
|
|
107
|
+
capabilities: ProjectCapabilities,
|
|
108
|
+
constraints: Mapping[str, Any] | None = None,
|
|
109
|
+
) -> E2EHarnessSpec:
|
|
110
|
+
"""Deterministically resolve the E2E harness for a project.
|
|
111
|
+
|
|
112
|
+
Rules (pure function of inputs; no prose inference):
|
|
113
|
+
|
|
114
|
+
* ``e2e_modality == "cli"`` → native CLI harness (subprocess on the built
|
|
115
|
+
CLI). Output ext follows host language (``.py`` for Python, else ``.ts``).
|
|
116
|
+
The CLI branch already works end-to-end; this is here for completeness so
|
|
117
|
+
the resolver is the single decision point.
|
|
118
|
+
* ``e2e_modality == "browser"``:
|
|
119
|
+
- Python AND NOT explicit-browser-required → ``pytest_http`` / ``.py``.
|
|
120
|
+
- else → ``playwright`` / ``.ts`` (requires a node manifest).
|
|
121
|
+
* non-browser HTTP surface (``network_surface == "http"``) → ``pytest_http``
|
|
122
|
+
/ ``.py`` for Python; for any other language keep today's behavior by
|
|
123
|
+
routing to the Playwright/node path (``.ts``) so generality holds.
|
|
124
|
+
* otherwise → a ``none`` spec (no E2E layer applies).
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
lang = (project_language or "").strip().lower()
|
|
128
|
+
is_python = lang == "python"
|
|
129
|
+
modality = capabilities.e2e_modality
|
|
130
|
+
|
|
131
|
+
if modality == "cli":
|
|
132
|
+
return E2EHarnessSpec(
|
|
133
|
+
runner="native_cli",
|
|
134
|
+
language=lang or "python",
|
|
135
|
+
output_ext=".py" if is_python else ".ts",
|
|
136
|
+
template_ref="native_cli",
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
if modality == "browser":
|
|
140
|
+
if is_python and not _explicit_browser_required(constraints):
|
|
141
|
+
return E2EHarnessSpec(
|
|
142
|
+
runner="pytest_http",
|
|
143
|
+
language="python",
|
|
144
|
+
output_ext=".py",
|
|
145
|
+
template_ref="pytest_http",
|
|
146
|
+
)
|
|
147
|
+
return E2EHarnessSpec(
|
|
148
|
+
runner="playwright",
|
|
149
|
+
language="typescript",
|
|
150
|
+
output_ext=".ts",
|
|
151
|
+
template_ref="playwright",
|
|
152
|
+
requires_node_manifest=True,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if capabilities.network_surface == "http":
|
|
156
|
+
if is_python:
|
|
157
|
+
return E2EHarnessSpec(
|
|
158
|
+
runner="pytest_http",
|
|
159
|
+
language="python",
|
|
160
|
+
output_ext=".py",
|
|
161
|
+
template_ref="pytest_http",
|
|
162
|
+
)
|
|
163
|
+
# Non-Python HTTP surface: preserve today's TS/Playwright behavior.
|
|
164
|
+
return E2EHarnessSpec(
|
|
165
|
+
runner="playwright",
|
|
166
|
+
language=lang or "typescript",
|
|
167
|
+
output_ext=".ts",
|
|
168
|
+
template_ref="playwright",
|
|
169
|
+
requires_node_manifest=True,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
return E2EHarnessSpec(
|
|
173
|
+
runner="none",
|
|
174
|
+
language=lang or "python",
|
|
175
|
+
output_ext=".py" if is_python else ".ts",
|
|
176
|
+
template_ref="none",
|
|
177
|
+
)
|