codd-dev 2.14.0__tar.gz → 2.16.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.14.0 → codd_dev-2.16.0}/PKG-INFO +8 -6
- {codd_dev-2.14.0 → codd_dev-2.16.0}/README.md +7 -5
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/cli.py +139 -13
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/builder.py +147 -35
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/transitive_closure.py +22 -3
- codd_dev-2.16.0/codd/fix/__init__.py +22 -0
- codd_dev-2.16.0/codd/fix/candidate_selector.py +306 -0
- codd_dev-2.16.0/codd/fix/design_updater.py +180 -0
- codd_dev-2.16.0/codd/fix/interactive_prompt.py +209 -0
- codd_dev-2.16.0/codd/fix/phenomenon_fixer.py +550 -0
- codd_dev-2.16.0/codd/fix/phenomenon_parser.py +156 -0
- codd_dev-2.16.0/codd/fix/risk_classifier.py +190 -0
- codd_dev-2.16.0/codd/fix/templates_loader.py +40 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/pyproject.toml +1 -1
- {codd_dev-2.14.0 → codd_dev-2.16.0}/.gitignore +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/LICENSE +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/__main__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/assembler.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/bridge.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/clustering.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/config.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/contracts.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/defaults.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployer.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/design_md.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/drift.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/env_refs.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixer.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/generator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/graph.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/implementer.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/inheritance.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/measure.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/parsing.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/planner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/policy.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/propagate.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/propagator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/registry.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/history.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/restore.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/scanner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/synth.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/traceability.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/validator.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/events.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd/wiring.py +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.14.0 → codd_dev-2.16.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.16.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
|
|
@@ -153,11 +153,13 @@ This is what lets CoDD ship one core that works for Next.js, Django, FastAPI, Ra
|
|
|
153
153
|
|
|
154
154
|
## 🧭 Roadmap
|
|
155
155
|
|
|
156
|
-
- **v2.
|
|
157
|
-
- **v2.
|
|
158
|
-
- **v2.
|
|
159
|
-
- **v2.
|
|
160
|
-
- **v2.
|
|
156
|
+
- **v2.16.0 (current)** — `codd fix [PHENOMENON]` — North Star entry-point 2 (cmd_468). Express a desired change in natural language; CoDD identifies affected design docs via Tier-1 lexicon + Tier-2 semantic scoring, updates them with LLM, runs the DAG verify gate. Full interactive HITL (candidate selection, ambiguity clarification, risk confirmation) with `--non-interactive` for CI. 66 new tests, 2908 total PASS, SKIP=0. See [CHANGELOG](CHANGELOG.md).
|
|
157
|
+
- **v2.15.0** — `kind: common` for shared infrastructure (cmd_467). C5 amber −79.2% on dogfood LMS (125 → 26). `**` glob translator fix.
|
|
158
|
+
- **v2.14.0** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) / `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52%); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Red 22 → 0.
|
|
159
|
+
- **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
|
|
160
|
+
- **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
|
|
161
|
+
- **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
|
|
162
|
+
- **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
|
|
161
163
|
|
|
162
164
|
---
|
|
163
165
|
|
|
@@ -113,11 +113,13 @@ This is what lets CoDD ship one core that works for Next.js, Django, FastAPI, Ra
|
|
|
113
113
|
|
|
114
114
|
## 🧭 Roadmap
|
|
115
115
|
|
|
116
|
-
- **v2.
|
|
117
|
-
- **v2.
|
|
118
|
-
- **v2.
|
|
119
|
-
- **v2.
|
|
120
|
-
- **v2.
|
|
116
|
+
- **v2.16.0 (current)** — `codd fix [PHENOMENON]` — North Star entry-point 2 (cmd_468). Express a desired change in natural language; CoDD identifies affected design docs via Tier-1 lexicon + Tier-2 semantic scoring, updates them with LLM, runs the DAG verify gate. Full interactive HITL (candidate selection, ambiguity clarification, risk confirmation) with `--non-interactive` for CI. 66 new tests, 2908 total PASS, SKIP=0. See [CHANGELOG](CHANGELOG.md).
|
|
117
|
+
- **v2.15.0** — `kind: common` for shared infrastructure (cmd_467). C5 amber −79.2% on dogfood LMS (125 → 26). `**` glob translator fix.
|
|
118
|
+
- **v2.14.0** — 8 structural gaps closed (cmd_466 dogfood). Sidecar `<test>.codd.yaml` with `verified_by:` (C6) / `axis_matrix:` (C9); lexicon schema SSoT; completeness_audit batch; `scan.exclude` bug fix (−52%); `codd dag verify --auto-repair`; elicit mock-AI sentinel; AI timeout 3600 s SSoT. Red 22 → 0.
|
|
119
|
+
- **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
|
|
120
|
+
- **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
|
|
121
|
+
- **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
|
|
122
|
+
- **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
|
|
121
123
|
|
|
122
124
|
---
|
|
123
125
|
|
|
@@ -3333,6 +3333,7 @@ def risk(path: str):
|
|
|
3333
3333
|
|
|
3334
3334
|
|
|
3335
3335
|
@main.command()
|
|
3336
|
+
@click.argument("phenomenon", nargs=-1)
|
|
3336
3337
|
@click.option("--path", default=".", help="Project root directory")
|
|
3337
3338
|
@click.option("--max-attempts", default=3, type=click.IntRange(min=1, max=10),
|
|
3338
3339
|
help="Maximum fix attempts (default: 3)")
|
|
@@ -3345,32 +3346,73 @@ def risk(path: str):
|
|
|
3345
3346
|
@click.option("--no-push", is_flag=True, help="Don't push fixes after successful fix")
|
|
3346
3347
|
@click.option("--dry-run", is_flag=True, help="Show what would be fixed without making changes")
|
|
3347
3348
|
@click.option("--ai-cmd", default=None, help="Override AI CLI command")
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
|
|
3349
|
+
@click.option("--non-interactive", is_flag=True,
|
|
3350
|
+
help="PHENOMENON mode: disable interactive prompts (use defaults)")
|
|
3351
|
+
@click.option("--on-ambiguity",
|
|
3352
|
+
type=click.Choice(["abort", "default", "top1"]),
|
|
3353
|
+
default="abort",
|
|
3354
|
+
show_default=True,
|
|
3355
|
+
help="PHENOMENON mode: behavior when candidates are ambiguous in --non-interactive")
|
|
3356
|
+
@click.option("--allow-delete", is_flag=True,
|
|
3357
|
+
help="PHENOMENON mode: allow design_doc to lose existing acceptance criteria / user journeys")
|
|
3358
|
+
def fix(phenomenon: tuple[str, ...], path: str, max_attempts: int,
|
|
3359
|
+
test_results: str | None, ci_log: str | None,
|
|
3360
|
+
ci_only: bool, local_only: bool, no_push: bool, dry_run: bool,
|
|
3361
|
+
ai_cmd: str | None, non_interactive: bool, on_ambiguity: str,
|
|
3362
|
+
allow_delete: bool):
|
|
3363
|
+
"""Fix test/build failures or a user-described PHENOMENON.
|
|
3351
3364
|
|
|
3352
3365
|
\b
|
|
3353
|
-
|
|
3366
|
+
Two modes:
|
|
3367
|
+
codd fix # legacy: auto-detect failures
|
|
3368
|
+
codd fix "ログインがわかりにくい" # PHENOMENON mode
|
|
3369
|
+
|
|
3370
|
+
\b
|
|
3371
|
+
Legacy mode (no positional argument) auto-detects failure source:
|
|
3354
3372
|
1. Explicit --test-results / --ci-log files
|
|
3355
3373
|
2. CI failures via `gh run view`
|
|
3356
3374
|
3. Local test execution
|
|
3357
|
-
|
|
3358
|
-
Maps failures to relevant design documents via the dependency graph,
|
|
3375
|
+
Maps failures to relevant design docs via the dependency graph,
|
|
3359
3376
|
then invokes Claude Code to fix implementation code.
|
|
3360
3377
|
|
|
3378
|
+
\b
|
|
3379
|
+
PHENOMENON mode (with positional argument) drives the second entry
|
|
3380
|
+
point of CoDD's north star: starting from a phenomenon the user wants
|
|
3381
|
+
fixed, CoDD updates the design doc, propagates the change, and
|
|
3382
|
+
verifies — the user touches nothing. Argument-less invocation
|
|
3383
|
+
remains completely unchanged.
|
|
3384
|
+
|
|
3361
3385
|
\b
|
|
3362
3386
|
Examples:
|
|
3363
|
-
codd fix
|
|
3364
|
-
codd fix --ci
|
|
3365
|
-
codd fix --local
|
|
3366
|
-
codd fix --dry-run
|
|
3367
|
-
codd fix --no-push
|
|
3387
|
+
codd fix # auto-detect and fix
|
|
3388
|
+
codd fix --ci # fix latest CI failure
|
|
3389
|
+
codd fix --local # run tests locally and fix
|
|
3390
|
+
codd fix --dry-run # show plan without fixing
|
|
3391
|
+
codd fix --no-push # fix but don't push
|
|
3392
|
+
codd fix "ログインエラーをわかりやすくしたい" # PHENOMENON mode
|
|
3393
|
+
codd fix "Button needs aria-label" --non-interactive
|
|
3368
3394
|
"""
|
|
3369
|
-
from codd.fixer import run_fix
|
|
3370
|
-
|
|
3371
3395
|
project_root = Path(path).resolve()
|
|
3372
3396
|
_require_codd_dir(project_root)
|
|
3373
3397
|
|
|
3398
|
+
phenomenon_text = " ".join(phenomenon).strip()
|
|
3399
|
+
|
|
3400
|
+
if phenomenon_text:
|
|
3401
|
+
_run_phenomenon_fix_cli(
|
|
3402
|
+
project_root,
|
|
3403
|
+
phenomenon_text,
|
|
3404
|
+
ai_cmd=ai_cmd,
|
|
3405
|
+
max_attempts=max_attempts,
|
|
3406
|
+
non_interactive=non_interactive,
|
|
3407
|
+
on_ambiguity=on_ambiguity,
|
|
3408
|
+
allow_delete=allow_delete,
|
|
3409
|
+
dry_run=dry_run,
|
|
3410
|
+
push=not no_push,
|
|
3411
|
+
)
|
|
3412
|
+
return
|
|
3413
|
+
|
|
3414
|
+
from codd.fixer import run_fix
|
|
3415
|
+
|
|
3374
3416
|
if ci_only and local_only:
|
|
3375
3417
|
click.echo("Error: --ci and --local are mutually exclusive.")
|
|
3376
3418
|
raise SystemExit(1)
|
|
@@ -3427,6 +3469,87 @@ def fix(path: str, max_attempts: int, test_results: str | None, ci_log: str | No
|
|
|
3427
3469
|
raise SystemExit(1)
|
|
3428
3470
|
|
|
3429
3471
|
|
|
3472
|
+
def _run_phenomenon_fix_cli(
|
|
3473
|
+
project_root: Path,
|
|
3474
|
+
phenomenon_text: str,
|
|
3475
|
+
*,
|
|
3476
|
+
ai_cmd: str | None,
|
|
3477
|
+
max_attempts: int,
|
|
3478
|
+
non_interactive: bool,
|
|
3479
|
+
on_ambiguity: str,
|
|
3480
|
+
allow_delete: bool,
|
|
3481
|
+
dry_run: bool,
|
|
3482
|
+
push: bool,
|
|
3483
|
+
) -> None:
|
|
3484
|
+
"""CLI adapter for the PHENOMENON-mode fix pipeline."""
|
|
3485
|
+
from codd.fix import run_phenomenon_fix
|
|
3486
|
+
|
|
3487
|
+
if dry_run:
|
|
3488
|
+
click.echo("🔍 Dry run — analyzing phenomenon without applying changes...")
|
|
3489
|
+
click.echo(f"🩺 Phenomenon: {phenomenon_text}")
|
|
3490
|
+
|
|
3491
|
+
result = run_phenomenon_fix(
|
|
3492
|
+
project_root,
|
|
3493
|
+
phenomenon_text,
|
|
3494
|
+
ai_command=ai_cmd,
|
|
3495
|
+
non_interactive=non_interactive,
|
|
3496
|
+
on_ambiguity=on_ambiguity,
|
|
3497
|
+
max_attempts=max_attempts,
|
|
3498
|
+
dry_run=dry_run,
|
|
3499
|
+
push=push,
|
|
3500
|
+
allow_delete=allow_delete,
|
|
3501
|
+
)
|
|
3502
|
+
|
|
3503
|
+
if result.analysis is not None:
|
|
3504
|
+
a = result.analysis
|
|
3505
|
+
click.echo(
|
|
3506
|
+
f" intent={a.intent}, ambiguity={a.ambiguity_score:.2f}, "
|
|
3507
|
+
f"subject_terms={a.subject_terms[:4]}"
|
|
3508
|
+
)
|
|
3509
|
+
|
|
3510
|
+
if result.aborted:
|
|
3511
|
+
click.echo(f"❌ Aborted: {result.abort_reason}")
|
|
3512
|
+
raise SystemExit(1)
|
|
3513
|
+
|
|
3514
|
+
if result.selection is not None:
|
|
3515
|
+
cands = result.selection.candidates
|
|
3516
|
+
click.echo(f" {len(cands)} candidate design doc(s) considered.")
|
|
3517
|
+
|
|
3518
|
+
if not result.attempts:
|
|
3519
|
+
click.echo("ℹ️ No candidate produced a usable update.")
|
|
3520
|
+
raise SystemExit(1)
|
|
3521
|
+
|
|
3522
|
+
applied_any = False
|
|
3523
|
+
for att in result.attempts:
|
|
3524
|
+
status = "✅" if att.applied else ("🔸" if att.aborted_reason == "dry_run: not applying" else "❌")
|
|
3525
|
+
target_id = att.target.node_id if att.target else "(no target)"
|
|
3526
|
+
click.echo(f"{status} Attempt {att.attempt} on {target_id}")
|
|
3527
|
+
if att.update is not None and att.update.diff:
|
|
3528
|
+
for line in att.update.diff.splitlines()[:40]:
|
|
3529
|
+
click.echo(f" {line}")
|
|
3530
|
+
extra = len(att.update.diff.splitlines()) - 40
|
|
3531
|
+
if extra > 0:
|
|
3532
|
+
click.echo(f" ... (+{extra} more diff lines)")
|
|
3533
|
+
if att.risk is not None and att.risk.risky:
|
|
3534
|
+
click.echo(f" ⚠️ risk: {', '.join(att.risk.categories) or 'unspecified'} — {att.risk.summary}")
|
|
3535
|
+
if att.aborted_reason:
|
|
3536
|
+
click.echo(f" reason: {att.aborted_reason}")
|
|
3537
|
+
if att.applied:
|
|
3538
|
+
applied_any = True
|
|
3539
|
+
|
|
3540
|
+
if dry_run:
|
|
3541
|
+
click.echo("\n🔎 Dry run complete — no files were modified.")
|
|
3542
|
+
return
|
|
3543
|
+
|
|
3544
|
+
if applied_any:
|
|
3545
|
+
click.echo(f"\n✅ Updated {len(result.applied_paths)} design doc(s): "
|
|
3546
|
+
f"{', '.join(result.applied_paths)}")
|
|
3547
|
+
click.echo(" Review the diff above and commit when satisfied.")
|
|
3548
|
+
else:
|
|
3549
|
+
click.echo("\n❌ No design doc was updated.")
|
|
3550
|
+
raise SystemExit(1)
|
|
3551
|
+
|
|
3552
|
+
|
|
3430
3553
|
@main.command()
|
|
3431
3554
|
@click.option("--path", default=".", help="Project root directory")
|
|
3432
3555
|
def policy(path: str):
|
|
@@ -5275,6 +5398,9 @@ def _dag_result_details(result: Any) -> list[str]:
|
|
|
5275
5398
|
details.append(f"{key}: {rendered}")
|
|
5276
5399
|
else:
|
|
5277
5400
|
details.append(f"{key}: {value}")
|
|
5401
|
+
common_count = _dag_result_value(result, "common_node_count")
|
|
5402
|
+
if isinstance(common_count, int) and common_count > 0:
|
|
5403
|
+
details.append(f"common_node_count: {common_count}")
|
|
5278
5404
|
return details
|
|
5279
5405
|
|
|
5280
5406
|
|
|
@@ -125,11 +125,14 @@ def load_dag_settings(project_root: Path, settings: dict[str, Any] | None = None
|
|
|
125
125
|
merged["test_suffixes"] = test_suffixes
|
|
126
126
|
_apply_scan_patterns(merged, project_config)
|
|
127
127
|
_apply_scan_patterns(merged, requested_settings)
|
|
128
|
+
_apply_common_node_patterns(merged, project_config)
|
|
129
|
+
_apply_common_node_patterns(merged, requested_settings)
|
|
128
130
|
merged["coherence"] = _coherence_settings(project_config, requested_settings)
|
|
129
131
|
merged["extraction"] = _extraction_settings(project_config, requested_settings)
|
|
130
132
|
merged.setdefault("design_doc_patterns", [])
|
|
131
133
|
merged.setdefault("impl_file_patterns", [])
|
|
132
134
|
merged.setdefault("test_file_patterns", [])
|
|
135
|
+
merged.setdefault("common_node_patterns", [])
|
|
133
136
|
# cmd_444 v2.11.0: implementation_plan.md is no longer the entry point.
|
|
134
137
|
# `codd implement` now takes design_node + output_paths directly. Any
|
|
135
138
|
# `plan_task_file` value present in legacy codd.yaml is silently ignored.
|
|
@@ -233,11 +236,16 @@ def _add_design_docs(dag: DAG, project_root: Path, settings: dict[str, Any]) ->
|
|
|
233
236
|
metadata = extract_design_doc_metadata(md_path, frontmatter_alias=frontmatter_alias)
|
|
234
237
|
attributes = metadata.get("attributes") or {}
|
|
235
238
|
_validate_design_doc_journey_attributes(node_id, attributes)
|
|
239
|
+
node_kind = (
|
|
240
|
+
"common"
|
|
241
|
+
if _design_doc_declares_common(metadata.get("frontmatter"), attributes)
|
|
242
|
+
else "design_doc"
|
|
243
|
+
)
|
|
236
244
|
_add_node_once(
|
|
237
245
|
dag,
|
|
238
246
|
Node(
|
|
239
247
|
id=node_id,
|
|
240
|
-
kind=
|
|
248
|
+
kind=node_kind,
|
|
241
249
|
path=node_id,
|
|
242
250
|
attributes={
|
|
243
251
|
"frontmatter": metadata["frontmatter"],
|
|
@@ -260,6 +268,8 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
260
268
|
impl_nodes: dict[str, Path] = {}
|
|
261
269
|
capability_patterns = _capability_patterns(settings)
|
|
262
270
|
implementation_suffixes = _suffix_tuple(settings.get("implementation_suffixes")) or LEGACY_IMPLEMENTATION_SUFFIXES
|
|
271
|
+
common_patterns = _common_node_patterns(settings)
|
|
272
|
+
project_root_resolved = Path(project_root).resolve()
|
|
263
273
|
for file_path in _glob_project_paths(
|
|
264
274
|
project_root,
|
|
265
275
|
settings.get("impl_file_patterns", []),
|
|
@@ -273,11 +283,16 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
273
283
|
continue
|
|
274
284
|
node_id = _relative_id(file_path, project_root)
|
|
275
285
|
impl_nodes[node_id] = file_path.resolve()
|
|
286
|
+
kind = "impl_file"
|
|
287
|
+
if common_patterns and _path_matches_any_pattern(
|
|
288
|
+
file_path, project_root_resolved, common_patterns
|
|
289
|
+
):
|
|
290
|
+
kind = "common"
|
|
276
291
|
_add_node_once(
|
|
277
292
|
dag,
|
|
278
293
|
Node(
|
|
279
294
|
id=node_id,
|
|
280
|
-
kind=
|
|
295
|
+
kind=kind,
|
|
281
296
|
path=node_id,
|
|
282
297
|
attributes={
|
|
283
298
|
"language": _language_for_path(file_path),
|
|
@@ -292,6 +307,8 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
292
307
|
def _add_test_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> dict[str, Path]:
|
|
293
308
|
test_nodes: dict[str, Path] = {}
|
|
294
309
|
test_suffixes = _suffix_tuple(settings.get("test_suffixes")) or LEGACY_TEST_SUFFIXES
|
|
310
|
+
common_patterns = _common_node_patterns(settings)
|
|
311
|
+
project_root_resolved = Path(project_root).resolve()
|
|
295
312
|
for file_path in _glob_project_paths(
|
|
296
313
|
project_root,
|
|
297
314
|
settings.get("test_file_patterns", []),
|
|
@@ -301,11 +318,16 @@ def _add_test_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
301
318
|
continue
|
|
302
319
|
node_id = _relative_id(file_path, project_root)
|
|
303
320
|
test_nodes[node_id] = file_path.resolve()
|
|
321
|
+
kind = "test_file"
|
|
322
|
+
if common_patterns and _path_matches_any_pattern(
|
|
323
|
+
file_path, project_root_resolved, common_patterns
|
|
324
|
+
):
|
|
325
|
+
kind = "common"
|
|
304
326
|
_add_node_once(
|
|
305
327
|
dag,
|
|
306
328
|
Node(
|
|
307
329
|
id=node_id,
|
|
308
|
-
kind=
|
|
330
|
+
kind=kind,
|
|
309
331
|
path=node_id,
|
|
310
332
|
attributes={
|
|
311
333
|
"language": _language_for_path(file_path),
|
|
@@ -1118,44 +1140,60 @@ def _path_matches_any_pattern(
|
|
|
1118
1140
|
except ValueError:
|
|
1119
1141
|
return False
|
|
1120
1142
|
rel_text = relative.as_posix()
|
|
1121
|
-
parts = relative.parts
|
|
1122
1143
|
|
|
1123
1144
|
for pattern in patterns:
|
|
1124
|
-
if
|
|
1145
|
+
if _glob_pattern_to_regex(pattern).match(rel_text):
|
|
1125
1146
|
return True
|
|
1126
|
-
# Honour shell-style "any depth" wildcards by stripping the outer
|
|
1127
|
-
# ``**/`` and ``/**`` decorations and looking for the inner pattern
|
|
1128
|
-
# against any path slice. Examples:
|
|
1129
|
-
# **/node_modules/** -> "node_modules" must appear as a path component
|
|
1130
|
-
# **/dist/** -> "dist" must appear as a path component
|
|
1131
|
-
# src/**/*.py -> not stripped here; falls back to fnmatch above
|
|
1132
|
-
inner = pattern
|
|
1133
|
-
stripped = True
|
|
1134
|
-
while stripped:
|
|
1135
|
-
stripped = False
|
|
1136
|
-
if inner.startswith("**/"):
|
|
1137
|
-
inner = inner[3:]
|
|
1138
|
-
stripped = True
|
|
1139
|
-
if inner.endswith("/**"):
|
|
1140
|
-
inner = inner[:-3]
|
|
1141
|
-
stripped = True
|
|
1142
|
-
if not inner or inner == pattern:
|
|
1143
|
-
continue
|
|
1144
|
-
if "/" not in inner and "*" not in inner:
|
|
1145
|
-
if inner in parts:
|
|
1146
|
-
return True
|
|
1147
|
-
continue
|
|
1148
|
-
# Inner still contains glob syntax: check every contiguous slice of
|
|
1149
|
-
# the relative path against ``inner`` so e.g. ``a/b/c/d`` matches
|
|
1150
|
-
# ``a/b`` or ``c/d`` etc.
|
|
1151
|
-
for start in range(len(parts)):
|
|
1152
|
-
for end in range(start + 1, len(parts) + 1):
|
|
1153
|
-
candidate = "/".join(parts[start:end])
|
|
1154
|
-
if fnmatch.fnmatch(candidate, inner):
|
|
1155
|
-
return True
|
|
1156
1147
|
return False
|
|
1157
1148
|
|
|
1158
1149
|
|
|
1150
|
+
_GLOB_REGEX_CACHE: dict[str, "re.Pattern[str]"] = {}
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
def _glob_pattern_to_regex(pattern: str) -> "re.Pattern[str]":
|
|
1154
|
+
"""Translate a glob pattern (with ``**`` recursion) into a regex.
|
|
1155
|
+
|
|
1156
|
+
Recognised tokens:
|
|
1157
|
+
|
|
1158
|
+
* ``**/`` — zero or more path segments (greedy across separators).
|
|
1159
|
+
* ``**`` — anything (including ``/``); used at end of a pattern.
|
|
1160
|
+
* ``*`` — any chars except ``/``.
|
|
1161
|
+
* ``?`` — single char except ``/``.
|
|
1162
|
+
* Anything else — literal.
|
|
1163
|
+
|
|
1164
|
+
Patterns such as ``**/dist/**`` match a path containing ``dist`` at any
|
|
1165
|
+
depth, ``src/lib/**/*.ts`` matches both ``src/lib/x.ts`` and
|
|
1166
|
+
``src/lib/sub/x.ts``.
|
|
1167
|
+
"""
|
|
1168
|
+
|
|
1169
|
+
cached = _GLOB_REGEX_CACHE.get(pattern)
|
|
1170
|
+
if cached is not None:
|
|
1171
|
+
return cached
|
|
1172
|
+
|
|
1173
|
+
parts: list[str] = []
|
|
1174
|
+
i = 0
|
|
1175
|
+
n = len(pattern)
|
|
1176
|
+
while i < n:
|
|
1177
|
+
if pattern[i : i + 3] == "**/":
|
|
1178
|
+
parts.append("(?:[^/]+/)*")
|
|
1179
|
+
i += 3
|
|
1180
|
+
elif pattern[i : i + 2] == "**":
|
|
1181
|
+
parts.append(".*")
|
|
1182
|
+
i += 2
|
|
1183
|
+
elif pattern[i] == "*":
|
|
1184
|
+
parts.append("[^/]*")
|
|
1185
|
+
i += 1
|
|
1186
|
+
elif pattern[i] == "?":
|
|
1187
|
+
parts.append("[^/]")
|
|
1188
|
+
i += 1
|
|
1189
|
+
else:
|
|
1190
|
+
parts.append(re.escape(pattern[i]))
|
|
1191
|
+
i += 1
|
|
1192
|
+
compiled = re.compile("^" + "".join(parts) + "$")
|
|
1193
|
+
_GLOB_REGEX_CACHE[pattern] = compiled
|
|
1194
|
+
return compiled
|
|
1195
|
+
|
|
1196
|
+
|
|
1159
1197
|
def _expand_braces(pattern: str) -> list[str]:
|
|
1160
1198
|
match = re.search(r"\{([^{}]+)\}", pattern)
|
|
1161
1199
|
if not match:
|
|
@@ -1365,6 +1403,80 @@ def _capability_patterns(settings: dict[str, Any]) -> dict[str, Any]:
|
|
|
1365
1403
|
return patterns if isinstance(patterns, dict) else {}
|
|
1366
1404
|
|
|
1367
1405
|
|
|
1406
|
+
def _apply_common_node_patterns(settings: dict[str, Any], config: dict[str, Any]) -> None:
|
|
1407
|
+
"""Capture ``common_node_patterns`` from project / requested config.
|
|
1408
|
+
|
|
1409
|
+
Recognises both ``common_node_patterns:`` at the top level (preferred,
|
|
1410
|
+
sibling of ``scan:``) and ``scan.common_node_patterns:`` (nested under
|
|
1411
|
+
scan for users who prefer to colocate scan-related knobs). Both feed
|
|
1412
|
+
the same ``settings['common_node_patterns']`` list.
|
|
1413
|
+
"""
|
|
1414
|
+
|
|
1415
|
+
if not isinstance(config, dict):
|
|
1416
|
+
return
|
|
1417
|
+
patterns: list[str] = []
|
|
1418
|
+
top = config.get("common_node_patterns")
|
|
1419
|
+
if isinstance(top, list):
|
|
1420
|
+
patterns.extend(
|
|
1421
|
+
str(item) for item in top if isinstance(item, str) and item.strip()
|
|
1422
|
+
)
|
|
1423
|
+
scan = config.get("scan")
|
|
1424
|
+
if isinstance(scan, dict):
|
|
1425
|
+
nested = scan.get("common_node_patterns")
|
|
1426
|
+
if isinstance(nested, list):
|
|
1427
|
+
patterns.extend(
|
|
1428
|
+
str(item) for item in nested if isinstance(item, str) and item.strip()
|
|
1429
|
+
)
|
|
1430
|
+
if patterns:
|
|
1431
|
+
_extend_unique(settings, "common_node_patterns", patterns)
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
def _design_doc_declares_common(
|
|
1435
|
+
frontmatter: Any, attributes: Any
|
|
1436
|
+
) -> bool:
|
|
1437
|
+
"""Return True when a design doc opts into ``kind="common"`` via frontmatter.
|
|
1438
|
+
|
|
1439
|
+
Recognised keys (any one wins):
|
|
1440
|
+
* ``codd.node_type`` (preferred, lives under the ``codd:`` block)
|
|
1441
|
+
* top-level ``node_type`` (legacy / convenience)
|
|
1442
|
+
"""
|
|
1443
|
+
|
|
1444
|
+
for source in (frontmatter, attributes):
|
|
1445
|
+
if not isinstance(source, dict):
|
|
1446
|
+
continue
|
|
1447
|
+
node_type = source.get("node_type")
|
|
1448
|
+
if isinstance(node_type, str) and node_type.strip().lower() == "common":
|
|
1449
|
+
return True
|
|
1450
|
+
codd_block = source.get("codd")
|
|
1451
|
+
if isinstance(codd_block, dict):
|
|
1452
|
+
value = codd_block.get("node_type")
|
|
1453
|
+
if isinstance(value, str) and value.strip().lower() == "common":
|
|
1454
|
+
return True
|
|
1455
|
+
return False
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
def _common_node_patterns(settings: dict[str, Any]) -> list[str]:
|
|
1459
|
+
"""Return glob patterns that should be classified as ``kind='common'``.
|
|
1460
|
+
|
|
1461
|
+
Common nodes represent shared infrastructure (DB clients, middleware,
|
|
1462
|
+
framework config, generated artifacts) that exist outside any single
|
|
1463
|
+
design document's scope. They participate in the DAG so that change
|
|
1464
|
+
impact can be traced, but they are exempt from C5 transitive_closure
|
|
1465
|
+
unreachable_nodes since requiring every common file to have a parent
|
|
1466
|
+
design_doc would force the entire codebase to be re-modelled as a tree.
|
|
1467
|
+
"""
|
|
1468
|
+
|
|
1469
|
+
raw = settings.get("common_node_patterns")
|
|
1470
|
+
if not isinstance(raw, list):
|
|
1471
|
+
return []
|
|
1472
|
+
expanded: list[str] = []
|
|
1473
|
+
for pattern in raw:
|
|
1474
|
+
if not isinstance(pattern, str) or not pattern.strip():
|
|
1475
|
+
continue
|
|
1476
|
+
expanded.extend(_expand_braces(pattern.strip()))
|
|
1477
|
+
return expanded
|
|
1478
|
+
|
|
1479
|
+
|
|
1368
1480
|
def _runtime_evidence_for_file(file_path: Path, node_id: str, capability_patterns: dict[str, Any]) -> list[dict]:
|
|
1369
1481
|
evidence = scan_capability_evidence(file_path, capability_patterns)
|
|
1370
1482
|
absolute_prefix = f"{file_path.as_posix()}:"
|
|
@@ -15,12 +15,20 @@ class TransitiveClosureResult:
|
|
|
15
15
|
check_name: str = "transitive_closure"
|
|
16
16
|
severity: str = "amber"
|
|
17
17
|
unreachable_nodes: list[str] = field(default_factory=list)
|
|
18
|
+
common_node_count: int = 0
|
|
18
19
|
passed: bool = True
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
@register_dag_check("transitive_closure")
|
|
22
23
|
class TransitiveClosureCheck:
|
|
23
|
-
"""Report nodes unreachable from root design docs without blocking deploy.
|
|
24
|
+
"""Report nodes unreachable from root design docs without blocking deploy.
|
|
25
|
+
|
|
26
|
+
Nodes with ``kind == "common"`` (shared infrastructure declared via
|
|
27
|
+
``common_node_patterns`` or frontmatter ``node_type: common``) are exempt
|
|
28
|
+
from unreachable detection. They participate in the DAG so change-impact
|
|
29
|
+
analysis still sees them, but they do not need to be the descendant of a
|
|
30
|
+
single design document.
|
|
31
|
+
"""
|
|
24
32
|
|
|
25
33
|
def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
|
|
26
34
|
self.dag = dag
|
|
@@ -45,8 +53,19 @@ class TransitiveClosureCheck:
|
|
|
45
53
|
]
|
|
46
54
|
|
|
47
55
|
visited = self._reachable_from(dag, roots)
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
common_count = sum(
|
|
57
|
+
1 for node in dag.nodes.values() if node.kind == "common"
|
|
58
|
+
)
|
|
59
|
+
unreachable = [
|
|
60
|
+
node_id
|
|
61
|
+
for node_id, node in dag.nodes.items()
|
|
62
|
+
if node_id not in visited and node.kind != "common"
|
|
63
|
+
]
|
|
64
|
+
return TransitiveClosureResult(
|
|
65
|
+
unreachable_nodes=unreachable,
|
|
66
|
+
common_node_count=common_count,
|
|
67
|
+
passed=True,
|
|
68
|
+
)
|
|
50
69
|
|
|
51
70
|
def _reachable_from(self, dag, roots: list[str]) -> set[str]:
|
|
52
71
|
visited: set[str] = set()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""CoDD fix — PHENOMENON-driven (operational feedback) mode.
|
|
2
|
+
|
|
3
|
+
Implements the second entry point of CoDD's north star:
|
|
4
|
+
"Given a phenomenon the user wants fixed, CoDD updates the design doc,
|
|
5
|
+
implementation, and tests in one shot — the user touches nothing."
|
|
6
|
+
|
|
7
|
+
The existing `codd fix` (argument-less, test/CI failure driven) is the
|
|
8
|
+
first entry point. This package adds the second one as an additive,
|
|
9
|
+
opt-in code path. The legacy run_fix() is not modified.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from codd.fix.phenomenon_fixer import (
|
|
13
|
+
PhenomenonFixResult,
|
|
14
|
+
PhenomenonFixAttempt,
|
|
15
|
+
run_phenomenon_fix,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"PhenomenonFixResult",
|
|
20
|
+
"PhenomenonFixAttempt",
|
|
21
|
+
"run_phenomenon_fix",
|
|
22
|
+
]
|