codd-dev 1.36.0__tar.gz → 1.37.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-1.36.0 → codd_dev-1.37.0}/PKG-INFO +1 -1
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/cli.py +101 -1
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/finding.py +37 -3
- {codd_dev-1.36.0 → codd_dev-1.37.0}/pyproject.toml +1 -1
- {codd_dev-1.36.0 → codd_dev-1.37.0}/.gitignore +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/LICENSE +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/README.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/__main__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/_git_helper.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/assembler.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/bridge.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/clustering.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/coherence_engine.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/config.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/contracts.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/builder.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/dag/runner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/defaults.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployer.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/design_md.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/diff/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/diff/apply.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/diff/engine.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/diff/persistence.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/drift.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/e2e_generator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/e2e_runner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/apply.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/engine.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/env_refs.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/extract_ai.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixer.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixup_drift.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/generator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/graph.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hitl_session.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/implementer.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/inheritance.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/lexicon.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/approval.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/parser.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/mcp_server.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/measure.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/parsing.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/planner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/policy.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/propagate.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/propagator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/registry.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/engine.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/history.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/loop.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/schema.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/repair_slice.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/require.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/require_plugins.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/require_propagate.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/restore.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/routes_extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/scanner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/schema_refs.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/synth.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/traceability.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/validator.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/__init__.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/events.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/watch/watcher.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/codd/wiring.py +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.0}/docs/requirements/README.md +0 -0
- {codd_dev-1.36.0 → codd_dev-1.37.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: 1.
|
|
3
|
+
Version: 1.37.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
|
|
@@ -1024,6 +1024,75 @@ def elicit_apply_cmd(input_file: Path, format_name: str, project_path: str) -> N
|
|
|
1024
1024
|
click.echo(f"Updated: {file_path}")
|
|
1025
1025
|
|
|
1026
1026
|
|
|
1027
|
+
@main.command("brownfield")
|
|
1028
|
+
@click.argument("target_path", type=click.Path(file_okay=False, path_type=Path))
|
|
1029
|
+
@click.option(
|
|
1030
|
+
"--requirements",
|
|
1031
|
+
"requirements_path",
|
|
1032
|
+
type=click.Path(dir_okay=False, path_type=Path),
|
|
1033
|
+
default=None,
|
|
1034
|
+
help="Requirements file (default: <target>/.codd/requirements.md; skipped if absent).",
|
|
1035
|
+
)
|
|
1036
|
+
@click.option(
|
|
1037
|
+
"--lexicon",
|
|
1038
|
+
"lexicon_path",
|
|
1039
|
+
type=click.Path(path_type=Path),
|
|
1040
|
+
default=None,
|
|
1041
|
+
help="Lexicon directory or manifest (default: <target>/.codd/lexicon; discovery mode if absent).",
|
|
1042
|
+
)
|
|
1043
|
+
@click.option(
|
|
1044
|
+
"--format",
|
|
1045
|
+
"format_name",
|
|
1046
|
+
type=click.Choice(["json", "md"]),
|
|
1047
|
+
default="md",
|
|
1048
|
+
show_default=True,
|
|
1049
|
+
help="Integrated report format.",
|
|
1050
|
+
)
|
|
1051
|
+
@click.option("--output", type=click.Path(dir_okay=False, path_type=Path), default=None, help="Output report file.")
|
|
1052
|
+
@click.option(
|
|
1053
|
+
"--ai-cmd",
|
|
1054
|
+
default=None,
|
|
1055
|
+
help="Override AI CLI command for diff and elicit engines.",
|
|
1056
|
+
)
|
|
1057
|
+
def brownfield_cmd(
|
|
1058
|
+
target_path: Path,
|
|
1059
|
+
requirements_path: Path | None,
|
|
1060
|
+
lexicon_path: Path | None,
|
|
1061
|
+
format_name: str,
|
|
1062
|
+
output: Path | None,
|
|
1063
|
+
ai_cmd: str | None,
|
|
1064
|
+
) -> None:
|
|
1065
|
+
"""Run brownfield extract, diff, elicit, and merged reporting."""
|
|
1066
|
+
from codd.brownfield.pipeline import BrownfieldPipeline, format_brownfield_result
|
|
1067
|
+
|
|
1068
|
+
project_root = target_path.expanduser().resolve()
|
|
1069
|
+
try:
|
|
1070
|
+
result = BrownfieldPipeline(ai_command=ai_cmd).run(
|
|
1071
|
+
project_root,
|
|
1072
|
+
requirements_path=requirements_path,
|
|
1073
|
+
lexicon_path=lexicon_path,
|
|
1074
|
+
)
|
|
1075
|
+
formatted = format_brownfield_result(result, format_name)
|
|
1076
|
+
output_path = _project_file(
|
|
1077
|
+
project_root,
|
|
1078
|
+
output,
|
|
1079
|
+
f".codd/brownfield_report.{format_name}",
|
|
1080
|
+
)
|
|
1081
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1082
|
+
output_path.write_text(formatted, encoding="utf-8")
|
|
1083
|
+
except (OSError, TypeError, ValueError, json.JSONDecodeError, yaml.YAMLError) as exc:
|
|
1084
|
+
click.echo(f"Error: {exc}")
|
|
1085
|
+
raise SystemExit(1)
|
|
1086
|
+
|
|
1087
|
+
click.echo(
|
|
1088
|
+
"Brownfield pipeline complete: "
|
|
1089
|
+
f"diff_findings={len(result.diff_findings)}, "
|
|
1090
|
+
f"elicit_findings={len(result.elicit_findings)}, "
|
|
1091
|
+
f"merged_findings={len(result.merged_findings)}"
|
|
1092
|
+
)
|
|
1093
|
+
click.echo(f"Output: {_display_path(output_path, project_root)}")
|
|
1094
|
+
|
|
1095
|
+
|
|
1027
1096
|
@main.group("diff", invoke_without_command=True)
|
|
1028
1097
|
@click.option("--extract-input", type=click.Path(dir_okay=False, path_type=Path), default=None)
|
|
1029
1098
|
@click.option("--requirements", "requirements_path", type=click.Path(dir_okay=False, path_type=Path), default=None)
|
|
@@ -1064,7 +1133,7 @@ def diff_cmd(
|
|
|
1064
1133
|
from codd.elicit.formatters.md import MdFormatter
|
|
1065
1134
|
|
|
1066
1135
|
project_root = Path(project_path).resolve()
|
|
1067
|
-
extract_path =
|
|
1136
|
+
extract_path = _resolve_diff_extract_input(project_root, extract_input)
|
|
1068
1137
|
req_path = _project_file(project_root, requirements_path, "docs/requirements/requirements.md")
|
|
1069
1138
|
output_path = _project_file(project_root, output, "drift_findings.md") if output is not None or format_name == "md" else None
|
|
1070
1139
|
|
|
@@ -1157,6 +1226,37 @@ def _project_file(project_root: Path, value: Path | None, default: str) -> Path:
|
|
|
1157
1226
|
return project_root / path
|
|
1158
1227
|
|
|
1159
1228
|
|
|
1229
|
+
def _resolve_diff_extract_input(project_root: Path, value: Path | None) -> Path:
|
|
1230
|
+
"""Locate the extract-input file, preferring isolated `.codd/extract/` output.
|
|
1231
|
+
|
|
1232
|
+
Order of resolution:
|
|
1233
|
+
1. Explicit ``--extract-input`` value (absolute or project-relative).
|
|
1234
|
+
2. ``.codd/extract/extracted.md`` (default Issue #17 isolation target).
|
|
1235
|
+
3. Top-level ``extracted.md`` aggregated output if present.
|
|
1236
|
+
4. First ``.codd/extract/modules/*.md`` module file (deterministic by name).
|
|
1237
|
+
5. Legacy fallback ``codd/extracted.md`` (preserved for older projects).
|
|
1238
|
+
"""
|
|
1239
|
+
if value is not None:
|
|
1240
|
+
candidate = value.expanduser()
|
|
1241
|
+
return candidate if candidate.is_absolute() else project_root / candidate
|
|
1242
|
+
|
|
1243
|
+
candidates: list[Path] = [
|
|
1244
|
+
project_root / ".codd" / "extract" / "extracted.md",
|
|
1245
|
+
project_root / "extracted.md",
|
|
1246
|
+
]
|
|
1247
|
+
modules_dir = project_root / ".codd" / "extract" / "modules"
|
|
1248
|
+
if modules_dir.is_dir():
|
|
1249
|
+
module_files = sorted(modules_dir.glob("*.md"))
|
|
1250
|
+
if module_files:
|
|
1251
|
+
candidates.append(module_files[0])
|
|
1252
|
+
candidates.append(project_root / "codd" / "extracted.md")
|
|
1253
|
+
|
|
1254
|
+
for candidate in candidates:
|
|
1255
|
+
if candidate.is_file():
|
|
1256
|
+
return candidate
|
|
1257
|
+
return candidates[0]
|
|
1258
|
+
|
|
1259
|
+
|
|
1160
1260
|
def _build_diff_engine(engine_cls: Any, ai_cmd: str | None, project_root: Path) -> Any:
|
|
1161
1261
|
attempts = (
|
|
1162
1262
|
lambda: engine_cls(llm_client=ai_cmd, project_root=project_root),
|
|
@@ -41,13 +41,12 @@ class Finding:
|
|
|
41
41
|
|
|
42
42
|
finding_id = str(payload.get("id", "")).strip()
|
|
43
43
|
kind = str(payload.get("kind", "")).strip()
|
|
44
|
-
|
|
44
|
+
raw_severity = str(payload.get("severity", "")).strip()
|
|
45
45
|
if not finding_id:
|
|
46
46
|
raise ValueError("Finding id is required")
|
|
47
47
|
if not kind:
|
|
48
48
|
raise ValueError("Finding kind is required")
|
|
49
|
-
|
|
50
|
-
raise ValueError(f"Finding severity must be one of {sorted(_SEVERITIES)}")
|
|
49
|
+
severity = _coerce_severity(raw_severity)
|
|
51
50
|
|
|
52
51
|
source = str(payload.get("source", "greenfield")).strip() or "greenfield"
|
|
53
52
|
if source not in _SOURCES:
|
|
@@ -85,6 +84,41 @@ def _optional_text(value: Any) -> str | None:
|
|
|
85
84
|
return text if text else None
|
|
86
85
|
|
|
87
86
|
|
|
87
|
+
_SEVERITY_ALIASES = {
|
|
88
|
+
"blocker": "critical",
|
|
89
|
+
"fatal": "critical",
|
|
90
|
+
"severe": "critical",
|
|
91
|
+
"urgent": "critical",
|
|
92
|
+
"error": "high",
|
|
93
|
+
"major": "high",
|
|
94
|
+
"important": "high",
|
|
95
|
+
"warn": "medium",
|
|
96
|
+
"warning": "medium",
|
|
97
|
+
"moderate": "medium",
|
|
98
|
+
"minor": "info",
|
|
99
|
+
"low": "info",
|
|
100
|
+
"informational": "info",
|
|
101
|
+
"note": "info",
|
|
102
|
+
"trivial": "info",
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _coerce_severity(raw: str) -> str:
|
|
107
|
+
"""Map a raw severity string into the canonical Literal set, with a safe fallback.
|
|
108
|
+
|
|
109
|
+
Strict membership is preserved for canonical values; common synonyms are mapped
|
|
110
|
+
deterministically; anything unknown defaults to ``info`` so downstream tools stay
|
|
111
|
+
operational rather than aborting on LLM drift. Generic mapping only — no stack /
|
|
112
|
+
framework / domain literals.
|
|
113
|
+
"""
|
|
114
|
+
cleaned = raw.lower().strip()
|
|
115
|
+
if cleaned in _SEVERITIES:
|
|
116
|
+
return cleaned
|
|
117
|
+
if cleaned in _SEVERITY_ALIASES:
|
|
118
|
+
return _SEVERITY_ALIASES[cleaned]
|
|
119
|
+
return "info"
|
|
120
|
+
|
|
121
|
+
|
|
88
122
|
@dataclass
|
|
89
123
|
class ElicitResult:
|
|
90
124
|
findings: list[Finding] = field(default_factory=list)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/defaults/runtime_capability_inference.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/assertion_handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codd_dev-1.36.0 → codd_dev-1.37.0}/codd/deployment/providers/verification/form_strategies.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|