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