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.
Files changed (205) hide show
  1. {codd_dev-1.32.0 → codd_dev-1.34.0}/PKG-INFO +1 -1
  2. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/cli.py +32 -4
  3. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_browser.py +19 -0
  4. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/typecheck_loop.py +14 -2
  5. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/__init__.py +2 -0
  6. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/history.py +22 -4
  7. codd_dev-1.34.0/codd/repair/loop.py +736 -0
  8. codd_dev-1.34.0/codd/repair/primary_picker.py +171 -0
  9. codd_dev-1.34.0/codd/repair/repair_result.py +25 -0
  10. codd_dev-1.34.0/codd/repair/repairability_classifier.py +263 -0
  11. codd_dev-1.34.0/codd/repair/templates/repairability_meta.md +24 -0
  12. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/verify_runner.py +1 -0
  13. {codd_dev-1.32.0 → codd_dev-1.34.0}/pyproject.toml +1 -1
  14. codd_dev-1.32.0/codd/repair/loop.py +0 -298
  15. {codd_dev-1.32.0 → codd_dev-1.34.0}/.gitignore +0 -0
  16. {codd_dev-1.32.0 → codd_dev-1.34.0}/LICENSE +0 -0
  17. {codd_dev-1.32.0 → codd_dev-1.34.0}/README.md +0 -0
  18. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/__init__.py +0 -0
  19. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/__main__.py +0 -0
  20. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/_git_helper.py +0 -0
  21. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/ask_user_question_adapter.py +0 -0
  22. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/assembler.py +0 -0
  23. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/bridge.py +0 -0
  24. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/clustering.py +0 -0
  25. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coherence_adapters.py +0 -0
  26. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coherence_engine.py +0 -0
  27. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/config.py +0 -0
  28. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/contracts.py +0 -0
  29. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coverage_auditor.py +0 -0
  30. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/coverage_metrics.py +0 -0
  31. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/__init__.py +0 -0
  32. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/builder.py +0 -0
  33. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/__init__.py +0 -0
  34. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  35. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/deployment_completeness.py +0 -0
  36. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/edge_validity.py +0 -0
  37. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/environment_coverage.py +0 -0
  38. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/implementation_coverage.py +0 -0
  39. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/node_completeness.py +0 -0
  40. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/task_completion.py +0 -0
  41. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/transitive_closure.py +0 -0
  42. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  43. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/coverage_axes.py +0 -0
  44. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/cli.yaml +0 -0
  45. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  46. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/csharp.yaml +0 -0
  47. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/elixir.yaml +0 -0
  48. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/generic.yaml +0 -0
  49. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/iot.yaml +0 -0
  50. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/java.yaml +0 -0
  51. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/kotlin.yaml +0 -0
  52. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/mobile.yaml +0 -0
  53. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/ruby.yaml +0 -0
  54. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/rust.yaml +0 -0
  55. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/scala.yaml +0 -0
  56. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/swift.yaml +0 -0
  57. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  58. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/defaults/web.yaml +0 -0
  59. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/extractor.py +0 -0
  60. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/dag/runner.py +0 -0
  61. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/defaults.yaml +0 -0
  62. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/__init__.py +0 -0
  63. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/app_service.py +0 -0
  64. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/base.py +0 -0
  65. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deploy_targets/docker_compose.py +0 -0
  66. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployer.py +0 -0
  67. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/__init__.py +0 -0
  68. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/checks/__init__.py +0 -0
  69. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  70. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  71. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  72. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  73. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/extractor.py +0 -0
  74. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/__init__.py +0 -0
  75. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/ai_command.py +0 -0
  76. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/llm_consideration.py +0 -0
  77. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/schema/__init__.py +0 -0
  78. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/schema/prisma.py +0 -0
  79. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/target/__init__.py +0 -0
  80. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  81. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/__init__.py +0 -0
  82. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  83. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  84. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  85. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  86. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/curl.py +0 -0
  87. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  88. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  89. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/deployment/providers/verification/playwright.py +0 -0
  90. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/design_md.py +0 -0
  91. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/drift.py +0 -0
  92. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_extractor.py +0 -0
  93. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_generator.py +0 -0
  94. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/e2e_runner.py +0 -0
  95. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/env_refs.py +0 -0
  96. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/extract_ai.py +0 -0
  97. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/extractor.py +0 -0
  98. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixer.py +0 -0
  99. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift.py +0 -0
  100. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  101. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  102. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  103. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  104. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/generator.py +0 -0
  105. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/graph.py +0 -0
  106. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hitl_session.py +0 -0
  107. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/__init__.py +0 -0
  108. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/pre-commit +0 -0
  109. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  110. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  111. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  112. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  113. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/__init__.py +0 -0
  114. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer/chunked_runner.py +0 -0
  115. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/implementer.py +0 -0
  116. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/inheritance.py +0 -0
  117. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/knowledge_fetcher.py +0 -0
  118. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/lexicon.py +0 -0
  119. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/__init__.py +0 -0
  120. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/approval.py +0 -0
  121. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/best_practice_augmenter.py +0 -0
  122. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/criteria_expander.py +0 -0
  123. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/design_doc_extractor.py +0 -0
  124. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/impl_step_deriver.py +0 -0
  125. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/means_catalog_loader.py +0 -0
  126. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/parser.py +0 -0
  127. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/plan_deriver.py +0 -0
  128. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/prompt_builder.py +0 -0
  129. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/strategy_validator.py +0 -0
  130. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  131. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  132. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  133. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  134. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  135. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/meta_instruction.md +0 -0
  136. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  137. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  138. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/mcp_server.py +0 -0
  139. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/measure.py +0 -0
  140. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/parsing.py +0 -0
  141. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/planner.py +0 -0
  142. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/policy.py +0 -0
  143. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/__init__.py +0 -0
  144. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/cli.yaml +0 -0
  145. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/iot.yaml +0 -0
  146. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/mobile.yaml +0 -0
  147. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/preflight/defaults/web.yaml +0 -0
  148. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/propagate.py +0 -0
  149. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/propagator.py +0 -0
  150. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/registry.py +0 -0
  151. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/approval_repair.py +0 -0
  152. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/engine.py +0 -0
  153. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/git_patcher.py +0 -0
  154. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/llm_repair_engine.py +0 -0
  155. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/schema.py +0 -0
  156. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/templates/analyze_meta.md +0 -0
  157. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair/templates/propose_meta.md +0 -0
  158. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/repair_slice.py +0 -0
  159. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require.py +0 -0
  160. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require_plugins.py +0 -0
  161. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/require_propagate.py +0 -0
  162. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  163. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  164. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  165. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  166. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/required_artifacts_deriver.py +0 -0
  167. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  168. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  169. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  170. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  171. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/requirement_completeness_auditor.py +0 -0
  172. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/restore.py +0 -0
  173. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/routes_extractor.py +0 -0
  174. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/scanner.py +0 -0
  175. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/schema_refs.py +0 -0
  176. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_flow_validator.py +0 -0
  177. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_transition_extractor.py +0 -0
  178. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/screen_transitions/defaults.yaml +0 -0
  179. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/synth.py +0 -0
  180. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/codd.yaml.tmpl +0 -0
  181. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/conventions.yaml.tmpl +0 -0
  182. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  183. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  184. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  185. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  186. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  187. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  188. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  189. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  190. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/gitignore.tmpl +0 -0
  191. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/lexicon_questions.md +0 -0
  192. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/lexicon_schema.yaml +0 -0
  193. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/templates/overrides.yaml.tmpl +0 -0
  194. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/traceability.py +0 -0
  195. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/validator.py +0 -0
  196. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/__init__.py +0 -0
  197. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/events.py +0 -0
  198. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/propagation_log.py +0 -0
  199. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/propagation_pipeline.py +0 -0
  200. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/test_runner.py +0 -0
  201. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/watch/watcher.py +0 -0
  202. {codd_dev-1.32.0 → codd_dev-1.34.0}/codd/wiring.py +0 -0
  203. {codd_dev-1.32.0 → codd_dev-1.34.0}/docs/cookbook/cdp_browser/README.md +0 -0
  204. {codd_dev-1.32.0 → codd_dev-1.34.0}/docs/requirements/README.md +0 -0
  205. {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.32.0
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", 3)
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 3
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(ctx, from_report: Path | None, project_path: str, max_attempts: int | None, engine_name: str | None):
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
- config = RepairLoopConfig(max_attempts=self.max_attempts, engine_name=self.engine_name)
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 = "REPAIR_SUCCESS" if outcome.success else "REPAIR_EXHAUSTED"
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 = {"REPAIR_SUCCESS", "REPAIR_EXHAUSTED", "REPAIR_REJECTED_BY_HITL", "REPAIR_FAILED"}
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
- {"outcome": outcome, "timestamp": _timestamp()},
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