codd-dev 3.7.1__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.1 → codd_dev-3.7.2}/PKG-INFO +1 -1
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/__init__.py +1 -1
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/cli.py +31 -1
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/builder.py +16 -3
- codd_dev-3.7.2/codd/dag/checks/transitive_closure.py +211 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extract_ai.py +72 -4
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/regex_strategies.py +11 -1
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/treesitter.py +81 -17
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/codd.yaml.tmpl +25 -25
- {codd_dev-3.7.1 → codd_dev-3.7.2}/pyproject.toml +1 -1
- codd_dev-3.7.1/codd/dag/checks/transitive_closure.py +0 -116
- {codd_dev-3.7.1 → codd_dev-3.7.2}/.gitignore +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/LICENSE +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/bench_fixture/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/__main__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/_git_helper.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/action_outcome.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ai_invoke.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ai_patch.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifact_contract.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifact_ids.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/assembler.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/bridge.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/capability_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/claude_cli.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/clustering.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coherence_engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/confidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/config.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/config_schema.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/cardinality_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/extraction_diagnostics.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/negative_space.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/resource_flow_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/semantic_contract_conflict.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/stale_evidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/impact.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/materiality.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/metadata_access.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/result_status.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/defaults.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/defaults.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/design_md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/apply.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/persistence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/discovery.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_generator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_harness.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/apply.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/finding.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/gap_to_ask.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/promote.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/routing.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/env_refs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extract_paths.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/impact_planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/frontmatter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/generator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/git_evidence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/graph.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hitl_session.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/iac_nfr.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/import_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/inheritance.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/compat.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/contract.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profile.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/approval.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/parser.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/mcp_server.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/measure.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/operations_derive.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/_shared.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/iac.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/python_ast.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/path_safety.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/planner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/policy.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/project_types.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagate.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagation_common.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/reference_resolution.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/history.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/loop.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/schema.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair_slice.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require_plugins.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require_propagate.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirements_meta.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/restoration_report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/restore.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/routes_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/scanner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/schema_refs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_override.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/compose.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/loader.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/lock.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/obligations.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profile.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/project.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/registry.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/resolve.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/synth.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/test_detection.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/traceability.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/validator.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/__init__.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/events.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/watcher.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/wiring.py +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/requirements/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/examples/README.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.7.1 → 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", {})
|
|
@@ -1143,6 +1143,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
|
|
|
1143
1143
|
return candidates
|
|
1144
1144
|
|
|
1145
1145
|
|
|
1146
|
+
_TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
|
|
1147
|
+
|
|
1148
|
+
|
|
1146
1149
|
def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
1147
1150
|
relative_parts = _relative_id(file_path, project_root).split("/")
|
|
1148
1151
|
name = file_path.name
|
|
@@ -1153,9 +1156,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
|
|
|
1153
1156
|
return True
|
|
1154
1157
|
if file_path.suffix == ".bats":
|
|
1155
1158
|
return True
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
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
|
|
1159
1172
|
|
|
1160
1173
|
|
|
1161
1174
|
def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""Transitive closure DAG completeness check."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections import deque
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from codd.dag.checks import register_dag_check
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class TransitiveClosureResult:
|
|
15
|
+
check_name: str = "transitive_closure"
|
|
16
|
+
severity: str = "amber"
|
|
17
|
+
unreachable_nodes: list[str] = field(default_factory=list)
|
|
18
|
+
common_node_count: int = 0
|
|
19
|
+
passed: bool = True
|
|
20
|
+
# ``status``/``skipped``/``checked_count`` close a vacuous-pass hole: an empty
|
|
21
|
+
# DAG (or one whose every node is ``common`` and therefore exempt from
|
|
22
|
+
# reachability) used to return a green PASS having examined zero nodes.
|
|
23
|
+
# ``checked_count`` is the number of non-common nodes whose reachability was
|
|
24
|
+
# actually evaluated; when it is 0 the run is a SKIP, not a clean pass.
|
|
25
|
+
status: str = "pass"
|
|
26
|
+
skipped: bool = False
|
|
27
|
+
checked_count: int = 0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Edge kinds that represent an in-project source-import dependency
|
|
31
|
+
# (importer -> imported). Used to identify *code-entry roots*: source nodes that
|
|
32
|
+
# nothing in the project imports. This is a structural classification of edges,
|
|
33
|
+
# not a language/framework branch.
|
|
34
|
+
_IMPORT_EDGE_KINDS = frozenset({"imports"})
|
|
35
|
+
|
|
36
|
+
# Node kinds that are NOT first-class source nodes for entry-root detection:
|
|
37
|
+
# design docs are handled by their own root rule, and ``common`` nodes are shared
|
|
38
|
+
# infrastructure exempt from reachability. Anything else (``impl_file`` and any
|
|
39
|
+
# future source kind) is treated as a source node — no per-language literal.
|
|
40
|
+
_NON_SOURCE_KINDS = frozenset({"design_doc", "common"})
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@register_dag_check("transitive_closure")
|
|
44
|
+
class TransitiveClosureCheck:
|
|
45
|
+
"""Report unreachable nodes without blocking deploy.
|
|
46
|
+
|
|
47
|
+
A node is *reachable* if it can be reached from **any entry root**:
|
|
48
|
+
|
|
49
|
+
- **design_doc roots** — ``design_doc`` nodes with no incoming edge (the
|
|
50
|
+
classic "every artifact descends from a design document" model); and
|
|
51
|
+
- **code-entry roots** — source nodes (everything that is neither a
|
|
52
|
+
``design_doc`` nor a ``common`` node) with no incoming in-project *import*
|
|
53
|
+
edge, i.e. the package's public entry points (e.g. a package
|
|
54
|
+
``__init__`` or a CLI ``__main__`` that nothing else imports).
|
|
55
|
+
|
|
56
|
+
Seeding from the *union* of these makes reachability meaningful on doc-less
|
|
57
|
+
BROWNFIELD projects (raw external code with zero design docs but a fully
|
|
58
|
+
connected import graph) while leaving doc-rooted projects unchanged:
|
|
59
|
+
code-entry roots are purely additive. Only nodes unreachable from ALL entries
|
|
60
|
+
are flagged — genuine orphans.
|
|
61
|
+
|
|
62
|
+
Entry-root detection is structural (incoming-edge analysis on import-kind
|
|
63
|
+
edges), never a ``language ==`` branch.
|
|
64
|
+
|
|
65
|
+
Cycle / no-entry fallback: if a project has source nodes but none qualify as
|
|
66
|
+
a code-entry root (every source node has an in-project importer — a pure
|
|
67
|
+
cycle), reachability falls back to seeding from *all* source nodes for that
|
|
68
|
+
project, so connectivity is still measured rather than reported as a false
|
|
69
|
+
"everything unreachable". Cycles are traversed safely (visited-set guard).
|
|
70
|
+
|
|
71
|
+
Nodes with ``kind == "common"`` (shared infrastructure declared via
|
|
72
|
+
``common_node_patterns`` or frontmatter ``node_type: common``) remain exempt
|
|
73
|
+
from unreachable detection. They participate in the DAG so change-impact
|
|
74
|
+
analysis still sees them, but they do not need to be the descendant of a
|
|
75
|
+
single design document.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
|
|
79
|
+
self.dag = dag
|
|
80
|
+
self.project_root = project_root
|
|
81
|
+
self.settings = settings or {}
|
|
82
|
+
|
|
83
|
+
def run(
|
|
84
|
+
self,
|
|
85
|
+
dag=None,
|
|
86
|
+
project_root: Path | None = None,
|
|
87
|
+
settings: dict[str, Any] | None = None,
|
|
88
|
+
) -> TransitiveClosureResult:
|
|
89
|
+
dag = dag or self.dag
|
|
90
|
+
if dag is None or not dag.nodes:
|
|
91
|
+
# No nodes at all → reachability examined nothing → SKIP (not a
|
|
92
|
+
# vacuous green PASS).
|
|
93
|
+
return TransitiveClosureResult(
|
|
94
|
+
status="skip",
|
|
95
|
+
skipped=True,
|
|
96
|
+
checked_count=0,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
to_ids = {edge.to_id for edge in dag.edges}
|
|
100
|
+
design_roots = [
|
|
101
|
+
node.id
|
|
102
|
+
for node in dag.nodes.values()
|
|
103
|
+
if node.kind == "design_doc" and node.id not in to_ids
|
|
104
|
+
]
|
|
105
|
+
code_roots = self._code_entry_roots(dag)
|
|
106
|
+
|
|
107
|
+
# Reachable from ANY entry: design-doc roots OR code-entry roots. The
|
|
108
|
+
# union keeps doc-rooted projects unchanged (design roots still seed) and
|
|
109
|
+
# makes doc-less brownfield projects measurable (code roots seed the
|
|
110
|
+
# connected impl graph).
|
|
111
|
+
roots = list(dict.fromkeys([*design_roots, *code_roots]))
|
|
112
|
+
|
|
113
|
+
visited = self._reachable_from(dag, roots)
|
|
114
|
+
common_count = sum(
|
|
115
|
+
1 for node in dag.nodes.values() if node.kind == "common"
|
|
116
|
+
)
|
|
117
|
+
# Common nodes are exempt from unreachable detection, so the number of
|
|
118
|
+
# nodes whose reachability is actually evaluated is the non-common set.
|
|
119
|
+
checked = sum(1 for node in dag.nodes.values() if node.kind != "common")
|
|
120
|
+
unreachable = [
|
|
121
|
+
node_id
|
|
122
|
+
for node_id, node in dag.nodes.items()
|
|
123
|
+
if node_id not in visited and node.kind != "common"
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
if checked == 0:
|
|
127
|
+
# Every node is exempt (all ``common``): reachability examined nothing.
|
|
128
|
+
# A clean PASS here is a vacuous false-green → SKIP instead.
|
|
129
|
+
return TransitiveClosureResult(
|
|
130
|
+
unreachable_nodes=[],
|
|
131
|
+
common_node_count=common_count,
|
|
132
|
+
passed=True,
|
|
133
|
+
status="skip",
|
|
134
|
+
skipped=True,
|
|
135
|
+
checked_count=0,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
return TransitiveClosureResult(
|
|
139
|
+
unreachable_nodes=unreachable,
|
|
140
|
+
common_node_count=common_count,
|
|
141
|
+
passed=True,
|
|
142
|
+
status="pass",
|
|
143
|
+
skipped=False,
|
|
144
|
+
checked_count=checked,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
def _code_entry_roots(self, dag) -> list[str]:
|
|
148
|
+
"""Public entry points of the import graph (heads nothing imports).
|
|
149
|
+
|
|
150
|
+
A *source node* is any node that is neither a ``design_doc`` (handled by
|
|
151
|
+
its own root rule) nor a ``common`` node (exempt infrastructure). A source
|
|
152
|
+
node is a *code-entry root* when it **participates in the import graph as a
|
|
153
|
+
head**: it has at least one outgoing in-project import edge (it imports
|
|
154
|
+
something) AND no incoming import edge (nothing imports it). These are the
|
|
155
|
+
package's public entry points (e.g. ``__init__`` / ``__main__``).
|
|
156
|
+
|
|
157
|
+
Requiring an *outgoing* import edge is what preserves no-false-green: a
|
|
158
|
+
node with zero import edges (isolated -- imported by nothing and importing
|
|
159
|
+
nothing) is a genuine orphan, NOT an entry root, and therefore stays
|
|
160
|
+
flagged. Only nodes that actually anchor an import chain seed reachability.
|
|
161
|
+
|
|
162
|
+
Fallback (pure cycle / no head): if no source node qualifies as a head but
|
|
163
|
+
some source nodes still *participate* in the import graph (a cycle where
|
|
164
|
+
every node has an importer), seed from all participating source nodes so
|
|
165
|
+
connectivity is still measured instead of a false "everything
|
|
166
|
+
unreachable". Isolated orphans (no import edges) are never seeded and stay
|
|
167
|
+
flagged even in the fallback.
|
|
168
|
+
"""
|
|
169
|
+
source_ids = {
|
|
170
|
+
node.id
|
|
171
|
+
for node in dag.nodes.values()
|
|
172
|
+
if node.kind not in _NON_SOURCE_KINDS
|
|
173
|
+
}
|
|
174
|
+
if not source_ids:
|
|
175
|
+
return []
|
|
176
|
+
|
|
177
|
+
import_to: set[str] = set()
|
|
178
|
+
import_from: set[str] = set()
|
|
179
|
+
for edge in dag.edges:
|
|
180
|
+
if edge.kind in _IMPORT_EDGE_KINDS:
|
|
181
|
+
import_to.add(edge.to_id)
|
|
182
|
+
import_from.add(edge.from_id)
|
|
183
|
+
|
|
184
|
+
# Heads: import something in-project, imported by nothing in-project.
|
|
185
|
+
entry_roots = [
|
|
186
|
+
nid
|
|
187
|
+
for nid in source_ids
|
|
188
|
+
if nid in import_from and nid not in import_to
|
|
189
|
+
]
|
|
190
|
+
if entry_roots:
|
|
191
|
+
return entry_roots
|
|
192
|
+
|
|
193
|
+
# No clean head (pure cycle): seed from source nodes that participate in
|
|
194
|
+
# the import graph at all, so connectivity is still measured. Nodes with
|
|
195
|
+
# no import edges remain genuine orphans (never seeded here).
|
|
196
|
+
return [nid for nid in source_ids if nid in import_to or nid in import_from]
|
|
197
|
+
|
|
198
|
+
def _reachable_from(self, dag, roots: list[str]) -> set[str]:
|
|
199
|
+
visited: set[str] = set()
|
|
200
|
+
queue = deque(roots)
|
|
201
|
+
|
|
202
|
+
while queue:
|
|
203
|
+
current = queue.popleft()
|
|
204
|
+
if current in visited:
|
|
205
|
+
continue
|
|
206
|
+
visited.add(current)
|
|
207
|
+
for edge in dag.edges:
|
|
208
|
+
if edge.from_id == current and edge.to_id not in visited:
|
|
209
|
+
queue.append(edge.to_id)
|
|
210
|
+
|
|
211
|
+
return visited
|
|
@@ -57,6 +57,60 @@ CONFIG_FILES = [
|
|
|
57
57
|
# IaC patterns
|
|
58
58
|
IAC_EXTENSIONS = {".bicep", ".bicepparam", ".tf", ".tfvars", ".hcl"}
|
|
59
59
|
|
|
60
|
+
|
|
61
|
+
def ai_command_has_tools(ai_command: str) -> bool:
|
|
62
|
+
"""Return whether ``ai_command`` grants the model file/shell tools.
|
|
63
|
+
|
|
64
|
+
The extract prompt's "Extraction Procedure" enumerates the codebase via bash
|
|
65
|
+
(``find``/``ls``/``rg``). That only works when the AI CLI can actually shell
|
|
66
|
+
out. The default ``ai_command`` disables tools (``--tools ""``), and agentic
|
|
67
|
+
CLIs are hardened to read-only from an empty workspace elsewhere — so the
|
|
68
|
+
procedural bash framing pushes the model into agentic mode and it stubs or
|
|
69
|
+
hangs. We therefore treat NO TOOLS as the safe default and require an
|
|
70
|
+
explicit grant to keep the tool-enabled path.
|
|
71
|
+
|
|
72
|
+
Tools are considered AVAILABLE only when a ``--tools``/``--allowedTools``
|
|
73
|
+
flag carries a non-empty value. ``--tools ""`` (or the flag absent) → no
|
|
74
|
+
tools. Unparseable commands fail closed to no-tools (context-only is always
|
|
75
|
+
correct because the full PROJECT CONTEXT is embedded in the prompt).
|
|
76
|
+
"""
|
|
77
|
+
import shlex
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
parts = shlex.split(ai_command)
|
|
81
|
+
except ValueError:
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
tool_flags = {"--tools", "--allowedTools", "--allowed-tools"}
|
|
85
|
+
for i, part in enumerate(parts):
|
|
86
|
+
flag, sep, inline = part.partition("=")
|
|
87
|
+
if flag in tool_flags:
|
|
88
|
+
value = inline if sep else (parts[i + 1] if i + 1 < len(parts) else "")
|
|
89
|
+
if value.strip():
|
|
90
|
+
return True
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Prepended to the prompt when the AI CLI has no tools: it overrides the
|
|
95
|
+
# template's bash "Extraction Procedure" so the model extracts from the embedded
|
|
96
|
+
# PROJECT CONTEXT instead of trying to shell out (which it cannot do).
|
|
97
|
+
_NO_TOOLS_DIRECTIVE = """# ═══ EXECUTION MODE: NO TOOLS (context-only) ═══
|
|
98
|
+
|
|
99
|
+
You are running WITHOUT shell or file-system tools. Do NOT call any tool, do NOT
|
|
100
|
+
run bash/`find`/`ls`/`rg`/`cat`, and do NOT attempt to read files from disk.
|
|
101
|
+
|
|
102
|
+
The COMPLETE pre-scanned codebase — the directory tree plus the full contents of
|
|
103
|
+
every relevant source, config, IaC, and test file — is embedded verbatim under
|
|
104
|
+
"PROJECT CONTEXT (pre-scanned)" further down this prompt. That embedded context
|
|
105
|
+
is your ONLY source of truth.
|
|
106
|
+
|
|
107
|
+
When the "Extraction Procedure" below shows ```bash``` enumeration commands,
|
|
108
|
+
treat them as a DESCRIPTION of what to look for, NOT as commands to execute.
|
|
109
|
+
Instead, derive the same information by reading the embedded file contents
|
|
110
|
+
directly. Produce the full output document set in one response from that context.
|
|
111
|
+
|
|
112
|
+
"""
|
|
113
|
+
|
|
60
114
|
# Schema file patterns
|
|
61
115
|
SCHEMA_PATTERNS = [
|
|
62
116
|
"prisma/schema.prisma", "db/schema.rb", "alembic/versions",
|
|
@@ -360,10 +414,20 @@ def pre_scan(project_root: Path) -> PreScanResult:
|
|
|
360
414
|
# Phase 2: AI prompt building
|
|
361
415
|
# ═══════════════════════════════════════════════════════════
|
|
362
416
|
|
|
363
|
-
def _build_prompt(scan: PreScanResult) -> str:
|
|
364
|
-
"""Build the AI prompt from pre-scan results + extract template.
|
|
417
|
+
def _build_prompt(scan: PreScanResult, *, tools_available: bool = False) -> str:
|
|
418
|
+
"""Build the AI prompt from pre-scan results + extract template.
|
|
419
|
+
|
|
420
|
+
``tools_available`` reflects whether the AI CLI can shell out (see
|
|
421
|
+
:func:`ai_command_has_tools`). When False (the default for ``--tools ""``),
|
|
422
|
+
a NO-TOOLS directive is prepended so the model extracts from the embedded
|
|
423
|
+
PROJECT CONTEXT instead of trying to run the template's bash procedure.
|
|
424
|
+
"""
|
|
365
425
|
sections: list[str] = []
|
|
366
426
|
|
|
427
|
+
# No-tools mode: override the template's bash procedure up front.
|
|
428
|
+
if not tools_available:
|
|
429
|
+
sections.append(_NO_TOOLS_DIRECTIVE)
|
|
430
|
+
|
|
367
431
|
# Load prompt template
|
|
368
432
|
if PROMPT_TEMPLATE_FILE.exists():
|
|
369
433
|
template = PROMPT_TEMPLATE_FILE.read_text(encoding="utf-8")
|
|
@@ -810,6 +874,10 @@ def run_extract_ai(
|
|
|
810
874
|
# Phase 1: Pre-scan
|
|
811
875
|
scan = pre_scan(project_root)
|
|
812
876
|
|
|
877
|
+
# Whether the AI CLI can shell out. The default ``--tools ""`` disables
|
|
878
|
+
# tools, so the prompt must NOT lean on its bash enumeration procedure.
|
|
879
|
+
tools_available = ai_command_has_tools(ai_command)
|
|
880
|
+
|
|
813
881
|
# Phase 2: Build prompt (custom or baseline)
|
|
814
882
|
if prompt_file:
|
|
815
883
|
custom_path = Path(prompt_file)
|
|
@@ -819,10 +887,10 @@ def run_extract_ai(
|
|
|
819
887
|
# Temporarily swap template for custom prompt
|
|
820
888
|
import codd.extract_ai as _self
|
|
821
889
|
_self.PROMPT_TEMPLATE_FILE = custom_path
|
|
822
|
-
prompt = _build_prompt(scan)
|
|
890
|
+
prompt = _build_prompt(scan, tools_available=tools_available)
|
|
823
891
|
_self.PROMPT_TEMPLATE_FILE = original_template
|
|
824
892
|
else:
|
|
825
|
-
prompt = _build_prompt(scan)
|
|
893
|
+
prompt = _build_prompt(scan, tools_available=tools_available)
|
|
826
894
|
|
|
827
895
|
# Phase 3: AI invocation
|
|
828
896
|
raw_output = _invoke_ai_command(ai_command, prompt)
|
|
@@ -189,12 +189,22 @@ def _imports_python(content, project_root, src_dir, file_path):
|
|
|
189
189
|
return internal, external
|
|
190
190
|
|
|
191
191
|
|
|
192
|
+
# Capture the module specifier from every JS/TS import form: ESM
|
|
193
|
+
# ``import .. from '..'`` / ``from '..'``, plus CommonJS ``require('..')`` and
|
|
194
|
+
# dynamic ``import('..')``. Mirrors codd.dag.extractor._IMPORT_SPECIFIER_RE so the
|
|
195
|
+
# scan-path parser and the DAG builder agree on a CommonJS codebase's internal
|
|
196
|
+
# dependency graph.
|
|
197
|
+
_TS_JS_IMPORT_SPECIFIER_RE = re.compile(
|
|
198
|
+
r'''(?:import|from|require\(\s*|import\(\s*)\s*['"]([^'"]+)['"]'''
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
192
202
|
def _imports_ts_js(content, project_root, src_dir, file_path):
|
|
193
203
|
internal: dict[str, list[str]] = {}
|
|
194
204
|
external: set[str] = set()
|
|
195
205
|
|
|
196
206
|
for line in content.splitlines():
|
|
197
|
-
m =
|
|
207
|
+
m = _TS_JS_IMPORT_SPECIFIER_RE.search(line)
|
|
198
208
|
if not m:
|
|
199
209
|
continue
|
|
200
210
|
import_path = m.group(1)
|
|
@@ -34,6 +34,20 @@ _JS_IMPORT_SUFFIXES = {
|
|
|
34
34
|
"typescript": ("", ".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", "/index.ts", "/index.tsx"),
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
|
|
38
|
+
def _strip_js_comments(src: str) -> str:
|
|
39
|
+
"""Remove ``/* block */`` (including JSDoc) and ``// line`` comments.
|
|
40
|
+
|
|
41
|
+
Used to keep route-path extraction from reading example routes embedded in
|
|
42
|
+
documentation comments. String-literal edge cases are tolerated: route
|
|
43
|
+
specifiers of interest are app-relative paths (``/users``), never URLs that
|
|
44
|
+
would carry a ``//`` sequence inside a string literal.
|
|
45
|
+
"""
|
|
46
|
+
src = re.sub(r"/\*.*?\*/", "", src, flags=re.S)
|
|
47
|
+
src = re.sub(r"//[^\n]*", "", src)
|
|
48
|
+
return src
|
|
49
|
+
|
|
50
|
+
|
|
37
51
|
class TreeSitterExtractor:
|
|
38
52
|
"""Tree-sitter backend for Python and TypeScript/JavaScript source files."""
|
|
39
53
|
|
|
@@ -540,26 +554,71 @@ def _extract_typescript_imports_ast(
|
|
|
540
554
|
external: set[str] = set()
|
|
541
555
|
|
|
542
556
|
for node in _iter_named_nodes(root):
|
|
543
|
-
if node.type
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
557
|
+
if node.type in {"export_statement", "import_statement"}:
|
|
558
|
+
source_node = node.child_by_field_name("source")
|
|
559
|
+
if source_node is None:
|
|
560
|
+
continue
|
|
561
|
+
import_path = _extract_string_literal(_node_text(content_bytes, source_node))
|
|
562
|
+
if not import_path:
|
|
563
|
+
continue
|
|
564
|
+
_record_js_import(
|
|
565
|
+
import_path,
|
|
566
|
+
_normalize_ws(_node_text(content_bytes, node)),
|
|
567
|
+
internal,
|
|
568
|
+
external,
|
|
569
|
+
file_path=file_path,
|
|
570
|
+
src_dir=src_dir,
|
|
571
|
+
language=language,
|
|
572
|
+
)
|
|
550
573
|
continue
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
574
|
+
|
|
575
|
+
# CommonJS ``require('..')`` and dynamic ``import('..')`` are
|
|
576
|
+
# call_expressions, not import_statements. A CommonJS codebase (e.g.
|
|
577
|
+
# Express) carries its entire internal dependency graph here, so the AST
|
|
578
|
+
# walk must capture it too — otherwise the scan reports no inter-module
|
|
579
|
+
# dependencies. Mirrors codd.dag.extractor._IMPORT_SPECIFIER_RE.
|
|
580
|
+
if node.type == "call_expression":
|
|
581
|
+
import_path = _call_expression_module_specifier(content_bytes, node)
|
|
582
|
+
if not import_path:
|
|
583
|
+
continue
|
|
584
|
+
_record_js_import(
|
|
585
|
+
import_path,
|
|
586
|
+
_normalize_ws(_node_text(content_bytes, node)),
|
|
587
|
+
internal,
|
|
588
|
+
external,
|
|
589
|
+
file_path=file_path,
|
|
590
|
+
src_dir=src_dir,
|
|
591
|
+
language=language,
|
|
592
|
+
)
|
|
560
593
|
|
|
561
594
|
return internal, external
|
|
562
595
|
|
|
596
|
+
|
|
597
|
+
def _call_expression_module_specifier(content_bytes: bytes, node: Any) -> str | None:
|
|
598
|
+
"""Return the module specifier of a ``require('..')`` / ``import('..')`` call.
|
|
599
|
+
|
|
600
|
+
Returns ``None`` for any other call expression (including ``require(var)``
|
|
601
|
+
with a non-literal argument — only statically resolvable specifiers count).
|
|
602
|
+
"""
|
|
603
|
+
func_node = node.child_by_field_name("function")
|
|
604
|
+
if func_node is None:
|
|
605
|
+
return None
|
|
606
|
+
callee = _node_text(content_bytes, func_node).strip()
|
|
607
|
+
# ``import(...)`` parses with an ``import`` callee; ``require(...)`` with an
|
|
608
|
+
# identifier callee. Accept both; reject everything else.
|
|
609
|
+
if callee != "require" and func_node.type != "import":
|
|
610
|
+
return None
|
|
611
|
+
args_node = node.child_by_field_name("arguments")
|
|
612
|
+
if args_node is None:
|
|
613
|
+
return None
|
|
614
|
+
for child in getattr(args_node, "named_children", []):
|
|
615
|
+
if child.type in {"string", "template_string"}:
|
|
616
|
+
return _extract_string_literal(_node_text(content_bytes, child))
|
|
617
|
+
# A non-literal first argument (e.g. require(modName)) is not statically
|
|
618
|
+
# resolvable — stop at the first argument either way.
|
|
619
|
+
break
|
|
620
|
+
return None
|
|
621
|
+
|
|
563
622
|
def _detect_python_code_patterns(mod: ModuleInfo, root: Any, content: str) -> None:
|
|
564
623
|
content_bytes = content.encode("utf-8", errors="ignore")
|
|
565
624
|
routes: list[str] = []
|
|
@@ -624,9 +683,14 @@ def _detect_typescript_code_patterns(mod: ModuleInfo, root: Any, content: str) -
|
|
|
624
683
|
if orm_models:
|
|
625
684
|
mod.patterns["db_models"] = f"ORM models: {', '.join(sorted(set(orm_models)))}"
|
|
626
685
|
|
|
686
|
+
# Strip /* block */ (incl. JSDoc) and // line comments BEFORE pulling route
|
|
687
|
+
# path strings: framework docs embed example routes such as
|
|
688
|
+
# ``app.get('/user/:uid/photos/:file', ...)`` inside @example JSDoc blocks
|
|
689
|
+
# (e.g. express/lib/response.js), which would otherwise register as real
|
|
690
|
+
# endpoints (false positives).
|
|
627
691
|
route_matches = re.findall(
|
|
628
692
|
r'(?:app|router)\.(?:get|post|put|delete|patch)\s*\(\s*["\']([^"\']+)["\']',
|
|
629
|
-
content,
|
|
693
|
+
_strip_js_comments(content),
|
|
630
694
|
)
|
|
631
695
|
if route_matches:
|
|
632
696
|
mod.patterns["api_routes"] = f"HTTP route handlers: {', '.join(sorted(set(route_matches)))}"
|
|
@@ -4,10 +4,10 @@ codd_required_version: null
|
|
|
4
4
|
codd_required_version_strict: false
|
|
5
5
|
|
|
6
6
|
project:
|
|
7
|
-
name: "{{project_name}}"
|
|
8
|
-
language: "{{language}}"
|
|
9
|
-
frameworks: []
|
|
10
|
-
|
|
7
|
+
name: "{{project_name}}"
|
|
8
|
+
language: "{{language}}"
|
|
9
|
+
frameworks: []
|
|
10
|
+
|
|
11
11
|
ai_command: "claude --print --permission-mode bypassPermissions --dangerously-skip-permissions --model claude-opus-4-8 --effort max --tools \"\""
|
|
12
12
|
|
|
13
13
|
# codex_app_server:
|
|
@@ -46,27 +46,27 @@ coding_principles: null
|
|
|
46
46
|
scan:
|
|
47
47
|
source_dirs:
|
|
48
48
|
{{source_dirs}}
|
|
49
|
-
test_dirs:
|
|
50
|
-
|
|
51
|
-
doc_dirs:
|
|
52
|
-
|
|
53
|
-
config_files: []
|
|
54
|
-
exclude:
|
|
55
|
-
- "**/node_modules/**"
|
|
56
|
-
- "**/__pycache__/**"
|
|
57
|
-
- "**/dist/**"
|
|
58
|
-
|
|
59
|
-
graph:
|
|
60
|
-
store: "jsonl"
|
|
61
|
-
path: "{{graph_path}}"
|
|
62
|
-
|
|
63
|
-
bands:
|
|
64
|
-
green:
|
|
65
|
-
min_confidence: 0.90
|
|
66
|
-
min_evidence_count: 2
|
|
67
|
-
amber:
|
|
68
|
-
min_confidence: 0.50
|
|
69
|
-
|
|
49
|
+
test_dirs:
|
|
50
|
+
{{test_dirs}}
|
|
51
|
+
doc_dirs:
|
|
52
|
+
{{doc_dirs}}
|
|
53
|
+
config_files: []
|
|
54
|
+
exclude:
|
|
55
|
+
- "**/node_modules/**"
|
|
56
|
+
- "**/__pycache__/**"
|
|
57
|
+
- "**/dist/**"
|
|
58
|
+
|
|
59
|
+
graph:
|
|
60
|
+
store: "jsonl"
|
|
61
|
+
path: "{{graph_path}}"
|
|
62
|
+
|
|
63
|
+
bands:
|
|
64
|
+
green:
|
|
65
|
+
min_confidence: 0.90
|
|
66
|
+
min_evidence_count: 2
|
|
67
|
+
amber:
|
|
68
|
+
min_confidence: 0.50
|
|
69
|
+
|
|
70
70
|
propagation:
|
|
71
71
|
max_depth: 10
|
|
72
72
|
stop_at_contract_boundary: true
|