codd-dev 1.32.0__tar.gz → 1.34.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.32.0 → codd_dev-1.34.0}/PKG-INFO +1 -1
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/cli.py +32 -4
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_browser.py +19 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/typecheck_loop.py +14 -2
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/__init__.py +2 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/history.py +22 -4
- codd_dev-1.34.0/codd/repair/loop.py +736 -0
- codd_dev-1.34.0/codd/repair/primary_picker.py +171 -0
- codd_dev-1.34.0/codd/repair/repair_result.py +25 -0
- codd_dev-1.34.0/codd/repair/repairability_classifier.py +263 -0
- codd_dev-1.34.0/codd/repair/templates/repairability_meta.md +24 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/verify_runner.py +1 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/pyproject.toml +1 -1
- codd_dev-1.32.0/codd/repair/loop.py +0 -298
- {codd_dev-1.32.0 → codd_dev-1.34.0}/.gitignore +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/LICENSE +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/README.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/__main__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/_git_helper.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/assembler.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/bridge.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/clustering.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coherence_engine.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/config.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/contracts.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/builder.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/runner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/defaults.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployer.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/design_md.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/drift.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_generator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_runner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/env_refs.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/extract_ai.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixer.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/generator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/graph.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hitl_session.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/inheritance.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/lexicon.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/approval.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/parser.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/mcp_server.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/measure.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/parsing.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/planner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/policy.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/propagate.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/propagator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/registry.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/engine.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/schema.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair_slice.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require_plugins.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require_propagate.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/restore.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/routes_extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/scanner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/schema_refs.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/synth.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/traceability.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/validator.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/__init__.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/events.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/watcher.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/wiring.py +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.0}/docs/requirements/README.md +0 -0
- {codd_dev-1.32.0 → codd_dev-1.34.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.34.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
|
|
@@ -30,6 +30,7 @@ class _CliVerificationResult:
|
|
|
30
30
|
passed: bool
|
|
31
31
|
exit_code: int
|
|
32
32
|
failure: Any | None = None
|
|
33
|
+
failures: list[Any] | None = None
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
@dataclass(frozen=True)
|
|
@@ -1733,6 +1734,7 @@ def assemble(path: str, output_dir: str | None, ai_cmd: str | None):
|
|
|
1733
1734
|
)
|
|
1734
1735
|
@click.option("--auto-repair", is_flag=True, default=False, help="Run RepairLoop when verification fails")
|
|
1735
1736
|
@click.option("--max-attempts", default=None, type=click.IntRange(min=1), help="Maximum repair attempts")
|
|
1737
|
+
@click.option("--baseline-ref", default=None, help="Baseline git ref for repair classification")
|
|
1736
1738
|
@click.option("--engine", "engine_name", default=None, help="Repair engine name")
|
|
1737
1739
|
def verify(
|
|
1738
1740
|
path: str,
|
|
@@ -1743,6 +1745,7 @@ def verify(
|
|
|
1743
1745
|
design_md: bool,
|
|
1744
1746
|
auto_repair: bool,
|
|
1745
1747
|
max_attempts: int | None,
|
|
1748
|
+
baseline_ref: str | None,
|
|
1746
1749
|
engine_name: str | None,
|
|
1747
1750
|
) -> None:
|
|
1748
1751
|
"""Run build + test verification and trace failures to design documents."""
|
|
@@ -1772,8 +1775,10 @@ def verify(
|
|
|
1772
1775
|
result.failure,
|
|
1773
1776
|
repair_config=repair_config,
|
|
1774
1777
|
max_attempts=max_attempts,
|
|
1778
|
+
baseline_ref=baseline_ref,
|
|
1775
1779
|
engine_name=engine_name,
|
|
1776
1780
|
verify_callable=lambda: _run_verify_once(path=path, sprint=sprint, prefer_standalone=True),
|
|
1781
|
+
initial_verify_result=result,
|
|
1777
1782
|
)
|
|
1778
1783
|
click.echo(f"Repair outcome: {outcome.status}")
|
|
1779
1784
|
click.echo(f"Repair history: {_display_path(outcome.history_session_dir, project_root)}")
|
|
@@ -3586,6 +3591,7 @@ def _cli_result_from_standalone_verify(result: Any) -> _CliVerificationResult:
|
|
|
3586
3591
|
passed=bool(result.passed),
|
|
3587
3592
|
exit_code=0 if result.passed else 1,
|
|
3588
3593
|
failure=getattr(result, "failure", None),
|
|
3594
|
+
failures=list(getattr(result, "failures", []) or []),
|
|
3589
3595
|
)
|
|
3590
3596
|
|
|
3591
3597
|
|
|
@@ -3619,9 +3625,12 @@ def _run_repair_loop(
|
|
|
3619
3625
|
*,
|
|
3620
3626
|
repair_config: dict[str, Any],
|
|
3621
3627
|
max_attempts: int | None,
|
|
3628
|
+
baseline_ref: str | None = None,
|
|
3622
3629
|
engine_name: str | None,
|
|
3623
3630
|
verify_callable,
|
|
3631
|
+
initial_verify_result: Any | None = None,
|
|
3624
3632
|
):
|
|
3633
|
+
from codd.deployment.providers.ai_command import SubprocessAiCommand
|
|
3625
3634
|
from codd.dag import DAG
|
|
3626
3635
|
from codd.dag.builder import build_dag
|
|
3627
3636
|
from codd.repair import RepairLoop, RepairLoopConfig
|
|
@@ -3641,16 +3650,24 @@ def _run_repair_loop(
|
|
|
3641
3650
|
approval_mode=str(repair.get("approval_mode") or "required"), # type: ignore[arg-type]
|
|
3642
3651
|
history_dir=Path(str(repair.get("history_dir") or ".codd/repair_history")),
|
|
3643
3652
|
engine_name=str(engine_name or repair.get("engine_name") or repair.get("engine") or "llm"),
|
|
3653
|
+
llm_client=SubprocessAiCommand(project_root=project_root, config=repair_config),
|
|
3654
|
+
repo_path=project_root,
|
|
3655
|
+
)
|
|
3656
|
+
return RepairLoop(config, project_root).run(
|
|
3657
|
+
resolved_failure,
|
|
3658
|
+
dag,
|
|
3659
|
+
verify_callable=verify_callable,
|
|
3660
|
+
baseline_ref=baseline_ref,
|
|
3661
|
+
initial_verify_result=initial_verify_result,
|
|
3644
3662
|
)
|
|
3645
|
-
return RepairLoop(config, project_root).run(resolved_failure, dag, verify_callable=verify_callable)
|
|
3646
3663
|
|
|
3647
3664
|
|
|
3648
3665
|
def _repair_max_attempts(repair: dict[str, Any], max_attempts: int | None) -> int:
|
|
3649
|
-
raw = max_attempts if max_attempts is not None else repair.get("max_attempts",
|
|
3666
|
+
raw = max_attempts if max_attempts is not None else repair.get("max_attempts", 10)
|
|
3650
3667
|
try:
|
|
3651
3668
|
return max(1, int(raw))
|
|
3652
3669
|
except (TypeError, ValueError):
|
|
3653
|
-
return
|
|
3670
|
+
return 10
|
|
3654
3671
|
|
|
3655
3672
|
|
|
3656
3673
|
def _dag_snapshot(dag: Any, project_root: Path) -> dict[str, Any]:
|
|
@@ -3686,6 +3703,8 @@ def _utc_timestamp() -> str:
|
|
|
3686
3703
|
def _repair_exit_code(status: str) -> int:
|
|
3687
3704
|
return {
|
|
3688
3705
|
"REPAIR_SUCCESS": 0,
|
|
3706
|
+
"PARTIAL_SUCCESS": 2,
|
|
3707
|
+
"MAX_ATTEMPTS_REACHED": 2,
|
|
3689
3708
|
"REPAIR_REJECTED_BY_HITL": 1,
|
|
3690
3709
|
"REPAIR_EXHAUSTED": 2,
|
|
3691
3710
|
"REPAIR_FAILED": 3,
|
|
@@ -3790,9 +3809,17 @@ def _load_repair_proposal(path: Path) -> Any:
|
|
|
3790
3809
|
@click.option("--from-report", "from_report", type=click.Path(exists=True, dir_okay=False, path_type=Path))
|
|
3791
3810
|
@click.option("--path", "project_path", default=".", help="Project root directory")
|
|
3792
3811
|
@click.option("--max-attempts", default=None, type=click.IntRange(min=1), help="Maximum repair attempts")
|
|
3812
|
+
@click.option("--baseline-ref", default=None, help="Baseline git ref for repair classification")
|
|
3793
3813
|
@click.option("--engine", "engine_name", default=None, help="Repair engine name")
|
|
3794
3814
|
@click.pass_context
|
|
3795
|
-
def repair(
|
|
3815
|
+
def repair(
|
|
3816
|
+
ctx,
|
|
3817
|
+
from_report: Path | None,
|
|
3818
|
+
project_path: str,
|
|
3819
|
+
max_attempts: int | None,
|
|
3820
|
+
baseline_ref: str | None,
|
|
3821
|
+
engine_name: str | None,
|
|
3822
|
+
):
|
|
3796
3823
|
"""Run and inspect repair sessions."""
|
|
3797
3824
|
if ctx.invoked_subcommand is not None:
|
|
3798
3825
|
return
|
|
@@ -3812,6 +3839,7 @@ def repair(ctx, from_report: Path | None, project_path: str, max_attempts: int |
|
|
|
3812
3839
|
failure,
|
|
3813
3840
|
repair_config=repair_config,
|
|
3814
3841
|
max_attempts=max_attempts,
|
|
3842
|
+
baseline_ref=baseline_ref,
|
|
3815
3843
|
engine_name=engine_name,
|
|
3816
3844
|
verify_callable=lambda: _run_verify_once(path=str(project_root), sprint=None),
|
|
3817
3845
|
)
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
|
+
import importlib.util
|
|
6
7
|
import subprocess
|
|
7
8
|
import time
|
|
8
9
|
from collections.abc import Callable, Mapping
|
|
@@ -91,6 +92,7 @@ class CdpBrowser(VerificationTemplate):
|
|
|
91
92
|
|
|
92
93
|
try:
|
|
93
94
|
plan = _parse_plan(command)
|
|
95
|
+
_import_project_cdp_plugins(_optional_project_root(plan))
|
|
94
96
|
config = self._resolve_config(plan)
|
|
95
97
|
timeout_seconds = _float_config(config, "timeout_seconds", 60.0)
|
|
96
98
|
step_timeout = _float_config(config, "step_timeout_seconds", timeout_seconds)
|
|
@@ -432,6 +434,23 @@ def _optional_project_root(plan: Mapping[str, Any]) -> Path | None:
|
|
|
432
434
|
return Path(str(value)).resolve()
|
|
433
435
|
|
|
434
436
|
|
|
437
|
+
def _import_project_cdp_plugins(project_root: Path | None) -> None:
|
|
438
|
+
if project_root is None:
|
|
439
|
+
return
|
|
440
|
+
plugin_root = project_root / "codd_plugins" / "cdp_browser"
|
|
441
|
+
if not plugin_root.is_dir():
|
|
442
|
+
return
|
|
443
|
+
for path in sorted(plugin_root.rglob("*.py")):
|
|
444
|
+
if path.name == "__init__.py":
|
|
445
|
+
continue
|
|
446
|
+
module_name = "codd_project_cdp_plugin_" + "_".join(path.relative_to(plugin_root).with_suffix("").parts)
|
|
447
|
+
spec = importlib.util.spec_from_file_location(module_name, path)
|
|
448
|
+
if spec is None or spec.loader is None:
|
|
449
|
+
raise ValueError(f"cannot load CDP plug-in: {path}")
|
|
450
|
+
module = importlib.util.module_from_spec(spec)
|
|
451
|
+
spec.loader.exec_module(module)
|
|
452
|
+
|
|
453
|
+
|
|
435
454
|
def _steps(plan: Mapping[str, Any]) -> list[Mapping[str, Any]]:
|
|
436
455
|
steps = plan.get("steps", [])
|
|
437
456
|
if not isinstance(steps, list):
|
|
@@ -103,10 +103,22 @@ class TypecheckRepairLoop:
|
|
|
103
103
|
"failure": None if final_run.passed else _typecheck_failure(final_run, scoped_files, dag),
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
from codd.deployment.providers.ai_command import SubprocessAiCommand
|
|
107
|
+
|
|
108
|
+
config = RepairLoopConfig(
|
|
109
|
+
max_attempts=self.max_attempts,
|
|
110
|
+
engine_name=self.engine_name,
|
|
111
|
+
llm_client=SubprocessAiCommand(command=ai_command, project_root=project_root),
|
|
112
|
+
repo_path=project_root,
|
|
113
|
+
)
|
|
107
114
|
repair_loop = self.repair_loop_factory(config, project_root)
|
|
108
115
|
outcome = repair_loop.run(failure, dag, verify_callable=verify_callable)
|
|
109
|
-
status: TypecheckLoopStatus =
|
|
116
|
+
status: TypecheckLoopStatus = (
|
|
117
|
+
"REPAIR_SUCCESS"
|
|
118
|
+
if getattr(outcome, "status", None) == "REPAIR_SUCCESS"
|
|
119
|
+
or (getattr(outcome, "status", None) is None and outcome.success)
|
|
120
|
+
else "REPAIR_EXHAUSTED"
|
|
121
|
+
)
|
|
110
122
|
return TypecheckLoopResult(status, _attempts_to_dicts(outcome), final_run.output)
|
|
111
123
|
|
|
112
124
|
def _run_typecheck(self, project_root: Path) -> _TypecheckRun:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from codd.repair.llm_repair_engine import LlmRepairEngine, RepairFailed
|
|
4
4
|
from codd.repair.loop import RepairLoop, RepairLoopConfig, RepairLoopOutcome
|
|
5
|
+
from codd.repair.repair_result import RepairResult
|
|
5
6
|
from codd.repair.verify_runner import VerificationResult, VerifyRunner
|
|
6
7
|
|
|
7
8
|
__all__ = [
|
|
@@ -10,6 +11,7 @@ __all__ = [
|
|
|
10
11
|
"RepairLoop",
|
|
11
12
|
"RepairLoopConfig",
|
|
12
13
|
"RepairLoopOutcome",
|
|
14
|
+
"RepairResult",
|
|
13
15
|
"VerificationResult",
|
|
14
16
|
"VerifyRunner",
|
|
15
17
|
]
|
|
@@ -53,15 +53,25 @@ class RepairHistory:
|
|
|
53
53
|
_write_yaml(attempt_dir / "apply_result.yaml", apply_result)
|
|
54
54
|
_write_yaml(attempt_dir / "post_repair_verify.yaml", post_verify)
|
|
55
55
|
|
|
56
|
-
def finalize(self, session_dir: Path, outcome: str) -> None:
|
|
56
|
+
def finalize(self, session_dir: Path, outcome: str, details: dict[str, Any] | None = None) -> None:
|
|
57
57
|
"""Write the final repair session outcome."""
|
|
58
58
|
|
|
59
|
-
allowed = {
|
|
59
|
+
allowed = {
|
|
60
|
+
"REPAIR_SUCCESS",
|
|
61
|
+
"PARTIAL_SUCCESS",
|
|
62
|
+
"MAX_ATTEMPTS_REACHED",
|
|
63
|
+
"REPAIR_EXHAUSTED",
|
|
64
|
+
"REPAIR_REJECTED_BY_HITL",
|
|
65
|
+
"REPAIR_FAILED",
|
|
66
|
+
}
|
|
60
67
|
if outcome not in allowed:
|
|
61
68
|
raise ValueError(f"outcome must be one of {sorted(allowed)}")
|
|
69
|
+
payload = {"outcome": outcome, "timestamp": _timestamp()}
|
|
70
|
+
if details:
|
|
71
|
+
payload.update(details)
|
|
62
72
|
_write_yaml(
|
|
63
73
|
Path(session_dir) / "final_status.yaml",
|
|
64
|
-
|
|
74
|
+
payload,
|
|
65
75
|
)
|
|
66
76
|
|
|
67
77
|
def load_session(self, session_dir: Path) -> dict:
|
|
@@ -111,7 +121,15 @@ def _read_yaml(path: Path) -> Any:
|
|
|
111
121
|
|
|
112
122
|
def _to_plain_data(value: Any) -> Any:
|
|
113
123
|
if is_dataclass(value) and not isinstance(value, type):
|
|
114
|
-
return asdict(value)
|
|
124
|
+
return _to_plain_data(asdict(value))
|
|
125
|
+
if isinstance(value, dict):
|
|
126
|
+
return {str(key): _to_plain_data(item) for key, item in value.items()}
|
|
127
|
+
if isinstance(value, list):
|
|
128
|
+
return [_to_plain_data(item) for item in value]
|
|
129
|
+
if isinstance(value, tuple):
|
|
130
|
+
return [_to_plain_data(item) for item in value]
|
|
131
|
+
if isinstance(value, Path):
|
|
132
|
+
return str(value)
|
|
115
133
|
return value
|
|
116
134
|
|
|
117
135
|
|