codd-dev 2.15.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.15.0 → codd_dev-2.16.0}/PKG-INFO +4 -3
- {codd_dev-2.15.0 → codd_dev-2.16.0}/README.md +3 -2
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/cli.py +136 -13
- 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.15.0 → codd_dev-2.16.0}/pyproject.toml +1 -1
- {codd_dev-2.15.0 → codd_dev-2.16.0}/.gitignore +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/LICENSE +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/__main__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/assembler.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/bridge.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/clustering.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/config.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/contracts.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/defaults.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployer.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/design_md.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/drift.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/env_refs.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixer.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/generator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/graph.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/implementer.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/inheritance.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/measure.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/parsing.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/planner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/policy.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/propagate.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/propagator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/registry.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/history.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/require.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/restore.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/scanner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/synth.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/traceability.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/validator.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/events.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd/wiring.py +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.15.0 → codd_dev-2.16.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.15.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,12 +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.
|
|
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.
|
|
157
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.
|
|
158
159
|
- **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
|
|
159
160
|
- **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
|
|
160
161
|
- **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
|
|
161
|
-
- **v2.
|
|
162
|
+
- **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
|
|
162
163
|
|
|
163
164
|
---
|
|
164
165
|
|
|
@@ -113,12 +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.
|
|
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.
|
|
117
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.
|
|
118
119
|
- **v2.13.0** — Opt-out protection: `OptOutPolicy` requires `justification` + `expires_at`. Silent SKIP abolished; severity preserved.
|
|
119
120
|
- **v2.12.0** — Test-completeness gates: C7 amber promotion + C8 `ci_health` static check.
|
|
120
121
|
- **v2.11.0** — Sprint-less `codd implement` (`--design <path> --output <dir>` directly).
|
|
121
|
-
- **v2.
|
|
122
|
+
- **v2.17.0 (next)** — impl/test auto-propagation from PHENOMENON (AC #8 completion); Codex wrapper for PHENOMENON mode.
|
|
122
123
|
|
|
123
124
|
---
|
|
124
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):
|
|
@@ -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
|
+
]
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""Select relevant design_doc candidates for a PHENOMENON analysis."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Callable, Iterable
|
|
10
|
+
|
|
11
|
+
from codd.dag import DAG, Node
|
|
12
|
+
from codd.fix.phenomenon_parser import PhenomenonAnalysis
|
|
13
|
+
from codd.fix.templates_loader import load_template
|
|
14
|
+
|
|
15
|
+
AiInvoke = Callable[[str], str]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class Candidate:
|
|
20
|
+
"""A scored design document candidate."""
|
|
21
|
+
|
|
22
|
+
node_id: str
|
|
23
|
+
path: str
|
|
24
|
+
score: float
|
|
25
|
+
tier_1_score: float = 0.0
|
|
26
|
+
tier_2_score: float = 0.0
|
|
27
|
+
reasons: list[str] = field(default_factory=list)
|
|
28
|
+
kind: str = "design_doc"
|
|
29
|
+
|
|
30
|
+
def to_display(self) -> str:
|
|
31
|
+
reason = "; ".join(self.reasons) or "(no reason)"
|
|
32
|
+
return f"{self.node_id} (score={self.score:.2f}) — {reason}"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class CandidateSelection:
|
|
37
|
+
"""Result of candidate_selector.select()."""
|
|
38
|
+
|
|
39
|
+
candidates: list[Candidate] = field(default_factory=list)
|
|
40
|
+
is_clear_winner: bool = False
|
|
41
|
+
top_margin: float = 0.0
|
|
42
|
+
fallback_reason: str = ""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def select_candidates(
|
|
46
|
+
analysis: PhenomenonAnalysis,
|
|
47
|
+
*,
|
|
48
|
+
dag: DAG,
|
|
49
|
+
project_root: Path,
|
|
50
|
+
ai_invoke: AiInvoke | None = None,
|
|
51
|
+
max_candidates: int = 5,
|
|
52
|
+
score_threshold: float = 0.15,
|
|
53
|
+
tier2_weight: float = 0.6,
|
|
54
|
+
include_common: bool = True,
|
|
55
|
+
) -> CandidateSelection:
|
|
56
|
+
"""Score design_doc / common nodes against the phenomenon analysis.
|
|
57
|
+
|
|
58
|
+
Tier 1 (lexicon-driven, exact substring match): score += 1.0 per hit.
|
|
59
|
+
Tier 2 (semantic, LLM-driven): 0.0-1.0 per candidate, weighted by
|
|
60
|
+
tier2_weight. Tier 2 is skipped when ai_invoke is None.
|
|
61
|
+
"""
|
|
62
|
+
nodes = _collect_design_nodes(dag, include_common=include_common)
|
|
63
|
+
if not nodes:
|
|
64
|
+
return CandidateSelection(
|
|
65
|
+
candidates=[],
|
|
66
|
+
fallback_reason="no design_doc nodes in DAG",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
tier1: dict[str, tuple[float, list[str]]] = {}
|
|
70
|
+
for node in nodes:
|
|
71
|
+
score, reasons = _tier1_score(node, analysis, project_root)
|
|
72
|
+
if score > 0.0:
|
|
73
|
+
tier1[node.id] = (score, reasons)
|
|
74
|
+
|
|
75
|
+
tier2: dict[str, tuple[float, list[str]]] = {}
|
|
76
|
+
if ai_invoke is not None and analysis.subject_terms:
|
|
77
|
+
tier2 = _tier2_score(
|
|
78
|
+
nodes=nodes,
|
|
79
|
+
analysis=analysis,
|
|
80
|
+
ai_invoke=ai_invoke,
|
|
81
|
+
project_root=project_root,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
scored: list[Candidate] = []
|
|
85
|
+
candidate_ids = set(tier1) | set(tier2)
|
|
86
|
+
for node_id in candidate_ids:
|
|
87
|
+
node = next((n for n in nodes if n.id == node_id), None)
|
|
88
|
+
if node is None:
|
|
89
|
+
continue
|
|
90
|
+
t1, t1_reasons = tier1.get(node_id, (0.0, []))
|
|
91
|
+
t2, t2_reasons = tier2.get(node_id, (0.0, []))
|
|
92
|
+
combined = t1 + tier2_weight * t2
|
|
93
|
+
if combined <= 0.0:
|
|
94
|
+
continue
|
|
95
|
+
scored.append(
|
|
96
|
+
Candidate(
|
|
97
|
+
node_id=node.id,
|
|
98
|
+
path=node.path or node.id,
|
|
99
|
+
score=combined,
|
|
100
|
+
tier_1_score=t1,
|
|
101
|
+
tier_2_score=t2,
|
|
102
|
+
reasons=t1_reasons + t2_reasons,
|
|
103
|
+
kind=node.kind,
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
scored.sort(key=lambda c: c.score, reverse=True)
|
|
108
|
+
top = scored[: max(1, max_candidates)]
|
|
109
|
+
|
|
110
|
+
if not top:
|
|
111
|
+
return CandidateSelection(
|
|
112
|
+
candidates=[],
|
|
113
|
+
fallback_reason="no candidate matched lexicon or semantic search",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
is_clear = False
|
|
117
|
+
margin = 0.0
|
|
118
|
+
if len(top) == 1:
|
|
119
|
+
is_clear = True
|
|
120
|
+
else:
|
|
121
|
+
margin = top[0].score - top[1].score
|
|
122
|
+
is_clear = margin > score_threshold
|
|
123
|
+
|
|
124
|
+
return CandidateSelection(
|
|
125
|
+
candidates=top,
|
|
126
|
+
is_clear_winner=is_clear,
|
|
127
|
+
top_margin=margin,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _collect_design_nodes(dag: DAG, *, include_common: bool) -> list[Node]:
|
|
132
|
+
kinds = {"design_doc"}
|
|
133
|
+
if include_common:
|
|
134
|
+
kinds.add("common")
|
|
135
|
+
return [node for node in dag.nodes.values() if node.kind in kinds]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
_WORD_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]+|[-ヿ一-鿿]+")
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _tier1_score(
|
|
142
|
+
node: Node,
|
|
143
|
+
analysis: PhenomenonAnalysis,
|
|
144
|
+
project_root: Path,
|
|
145
|
+
) -> tuple[float, list[str]]:
|
|
146
|
+
"""Lexicon-driven exact match against frontmatter description and body."""
|
|
147
|
+
text = _read_node_text(node, project_root)
|
|
148
|
+
if not text:
|
|
149
|
+
return 0.0, []
|
|
150
|
+
|
|
151
|
+
text_lower = text.lower()
|
|
152
|
+
score = 0.0
|
|
153
|
+
reasons: list[str] = []
|
|
154
|
+
|
|
155
|
+
for lex in analysis.lexicon_hits:
|
|
156
|
+
key = lex.strip().lower()
|
|
157
|
+
if not key:
|
|
158
|
+
continue
|
|
159
|
+
if key in text_lower:
|
|
160
|
+
score += 1.0
|
|
161
|
+
reasons.append(f"lexicon hit: {lex}")
|
|
162
|
+
|
|
163
|
+
for term in analysis.subject_terms:
|
|
164
|
+
key = term.strip().lower()
|
|
165
|
+
if not key or len(key) < 2:
|
|
166
|
+
continue
|
|
167
|
+
if key in text_lower:
|
|
168
|
+
score += 0.25
|
|
169
|
+
reasons.append(f"subject term: {term}")
|
|
170
|
+
|
|
171
|
+
return score, reasons
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _read_node_text(node: Node, project_root: Path) -> str:
|
|
175
|
+
if not node.path:
|
|
176
|
+
return ""
|
|
177
|
+
path = project_root / node.path
|
|
178
|
+
if not path.exists():
|
|
179
|
+
return ""
|
|
180
|
+
try:
|
|
181
|
+
return path.read_text(encoding="utf-8")
|
|
182
|
+
except (UnicodeDecodeError, OSError):
|
|
183
|
+
return ""
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _tier2_score(
|
|
187
|
+
*,
|
|
188
|
+
nodes: list[Node],
|
|
189
|
+
analysis: PhenomenonAnalysis,
|
|
190
|
+
ai_invoke: AiInvoke,
|
|
191
|
+
project_root: Path,
|
|
192
|
+
) -> dict[str, tuple[float, list[str]]]:
|
|
193
|
+
summaries = _node_summaries(nodes, project_root)
|
|
194
|
+
if not summaries:
|
|
195
|
+
return {}
|
|
196
|
+
|
|
197
|
+
prompt = _build_tier2_prompt(analysis, summaries)
|
|
198
|
+
try:
|
|
199
|
+
raw = ai_invoke(prompt)
|
|
200
|
+
except Exception: # noqa: BLE001
|
|
201
|
+
return {}
|
|
202
|
+
|
|
203
|
+
payload = _extract_json_object(raw)
|
|
204
|
+
if not isinstance(payload, dict):
|
|
205
|
+
return {}
|
|
206
|
+
|
|
207
|
+
raw_scores = payload.get("scores")
|
|
208
|
+
if not isinstance(raw_scores, dict):
|
|
209
|
+
return {}
|
|
210
|
+
|
|
211
|
+
out: dict[str, tuple[float, list[str]]] = {}
|
|
212
|
+
for node_id, entry in raw_scores.items():
|
|
213
|
+
score, reason = _coerce_tier2_entry(entry)
|
|
214
|
+
if score > 0.0:
|
|
215
|
+
out[str(node_id)] = (score, [f"semantic: {reason}" if reason else "semantic match"])
|
|
216
|
+
return out
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _node_summaries(nodes: Iterable[Node], project_root: Path) -> dict[str, str]:
|
|
220
|
+
out: dict[str, str] = {}
|
|
221
|
+
for node in nodes:
|
|
222
|
+
text = _read_node_text(node, project_root)
|
|
223
|
+
if not text:
|
|
224
|
+
continue
|
|
225
|
+
summary = _summarize_doc(text)
|
|
226
|
+
if summary:
|
|
227
|
+
out[node.id] = summary
|
|
228
|
+
return out
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _summarize_doc(text: str, *, max_len: int = 360) -> str:
|
|
232
|
+
"""Extract a short summary: frontmatter description or first paragraph."""
|
|
233
|
+
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n?", text, re.DOTALL)
|
|
234
|
+
if fm_match:
|
|
235
|
+
fm_text = fm_match.group(1)
|
|
236
|
+
body = text[fm_match.end():]
|
|
237
|
+
desc_match = re.search(r"^description:\s*(.+)$", fm_text, re.MULTILINE)
|
|
238
|
+
if desc_match:
|
|
239
|
+
description = desc_match.group(1).strip().strip('"').strip("'")
|
|
240
|
+
if description:
|
|
241
|
+
return description[:max_len]
|
|
242
|
+
else:
|
|
243
|
+
body = text
|
|
244
|
+
|
|
245
|
+
for line in body.splitlines():
|
|
246
|
+
stripped = line.strip()
|
|
247
|
+
if stripped and not stripped.startswith("#") and not stripped.startswith("```"):
|
|
248
|
+
return stripped[:max_len]
|
|
249
|
+
return ""
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _build_tier2_prompt(analysis: PhenomenonAnalysis, summaries: dict[str, str]) -> str:
|
|
253
|
+
summaries_block = "\n".join(
|
|
254
|
+
f"- {node_id}: {summary}" for node_id, summary in summaries.items()
|
|
255
|
+
)
|
|
256
|
+
analysis_block = json.dumps(analysis.to_dict(), ensure_ascii=False)
|
|
257
|
+
return (
|
|
258
|
+
"You are CoDD's semantic matcher. Given a phenomenon analysis and a\n"
|
|
259
|
+
"list of design document summaries, score each summary 0.0-1.0 by\n"
|
|
260
|
+
"how likely it is the right place to make a change. Return JSON only.\n\n"
|
|
261
|
+
"PHENOMENON_ANALYSIS:\n"
|
|
262
|
+
f"{analysis_block}\n\n"
|
|
263
|
+
"DESIGN_DOC_SUMMARIES:\n"
|
|
264
|
+
f"{summaries_block}\n\n"
|
|
265
|
+
"Return JSON of shape:\n"
|
|
266
|
+
'{"scores": {"<node_id>": {"score": 0.0, "reason": "<short>"}}}\n'
|
|
267
|
+
"Omit nodes with score 0. Include at most 8 entries.\n"
|
|
268
|
+
"JSON OUTPUT:\n"
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def _coerce_tier2_entry(entry: Any) -> tuple[float, str]:
|
|
273
|
+
if isinstance(entry, (int, float)):
|
|
274
|
+
return max(0.0, min(1.0, float(entry))), ""
|
|
275
|
+
if isinstance(entry, dict):
|
|
276
|
+
try:
|
|
277
|
+
score = float(entry.get("score", 0.0))
|
|
278
|
+
except (TypeError, ValueError):
|
|
279
|
+
score = 0.0
|
|
280
|
+
reason = str(entry.get("reason", "") or "").strip()
|
|
281
|
+
return max(0.0, min(1.0, score)), reason[:160]
|
|
282
|
+
return 0.0, ""
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
_JSON_FENCE_RE = re.compile(r"```(?:json)?\s*\n(.*?)```", re.DOTALL)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def _extract_json_object(raw: str) -> dict[str, Any] | None:
|
|
289
|
+
if not raw:
|
|
290
|
+
return None
|
|
291
|
+
text = raw.strip()
|
|
292
|
+
fenced = _JSON_FENCE_RE.search(text)
|
|
293
|
+
if fenced:
|
|
294
|
+
text = fenced.group(1).strip()
|
|
295
|
+
try:
|
|
296
|
+
return json.loads(text)
|
|
297
|
+
except json.JSONDecodeError:
|
|
298
|
+
pass
|
|
299
|
+
start = text.find("{")
|
|
300
|
+
end = text.rfind("}")
|
|
301
|
+
if start == -1 or end == -1:
|
|
302
|
+
return None
|
|
303
|
+
try:
|
|
304
|
+
return json.loads(text[start : end + 1])
|
|
305
|
+
except json.JSONDecodeError:
|
|
306
|
+
return None
|