codd-dev 2.7.0__tar.gz → 2.9.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 (424) hide show
  1. {codd_dev-2.7.0 → codd_dev-2.9.0}/PKG-INFO +1 -1
  2. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/cli.py +101 -2
  3. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/coverage_auditor.py +3 -3
  4. codd_dev-2.9.0/codd/init/llm_lexicon_suggester.py +242 -0
  5. {codd_dev-2.7.0 → codd_dev-2.9.0}/pyproject.toml +1 -1
  6. {codd_dev-2.7.0 → codd_dev-2.9.0}/.gitignore +0 -0
  7. {codd_dev-2.7.0 → codd_dev-2.9.0}/LICENSE +0 -0
  8. {codd_dev-2.7.0 → codd_dev-2.9.0}/README.md +0 -0
  9. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/__init__.py +0 -0
  10. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/__main__.py +0 -0
  11. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/_git_helper.py +0 -0
  12. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/ask_user_question_adapter.py +0 -0
  13. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/assembler.py +0 -0
  14. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/bridge.py +0 -0
  15. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/brownfield/__init__.py +0 -0
  16. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/brownfield/pipeline.py +0 -0
  17. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/clustering.py +0 -0
  18. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/coherence_adapters.py +0 -0
  19. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/coherence_engine.py +0 -0
  20. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/config.py +0 -0
  21. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/contracts.py +0 -0
  22. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/coverage_metrics.py +0 -0
  23. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/__init__.py +0 -0
  24. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/builder.py +0 -0
  25. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/__init__.py +0 -0
  26. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/depends_on_consistency.py +0 -0
  27. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/deployment_completeness.py +0 -0
  28. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/edge_validity.py +0 -0
  29. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/environment_coverage.py +0 -0
  30. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/implementation_coverage.py +0 -0
  31. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/node_completeness.py +0 -0
  32. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/task_completion.py +0 -0
  33. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/transitive_closure.py +0 -0
  34. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/checks/user_journey_coherence.py +0 -0
  35. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/coverage_axes.py +0 -0
  36. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/cli.yaml +0 -0
  37. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  38. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/csharp.yaml +0 -0
  39. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/elixir.yaml +0 -0
  40. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/generic.yaml +0 -0
  41. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/iot.yaml +0 -0
  42. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/java.yaml +0 -0
  43. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/kotlin.yaml +0 -0
  44. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/mobile.yaml +0 -0
  45. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/ruby.yaml +0 -0
  46. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/rust.yaml +0 -0
  47. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/scala.yaml +0 -0
  48. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/swift.yaml +0 -0
  49. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
  50. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/defaults/web.yaml +0 -0
  51. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/extractor.py +0 -0
  52. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/dag/runner.py +0 -0
  53. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/defaults.yaml +0 -0
  54. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deploy_targets/__init__.py +0 -0
  55. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deploy_targets/app_service.py +0 -0
  56. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deploy_targets/base.py +0 -0
  57. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deploy_targets/docker_compose.py +0 -0
  58. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployer.py +0 -0
  59. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/__init__.py +0 -0
  60. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/checks/__init__.py +0 -0
  61. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  62. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  63. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
  64. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
  65. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/extractor.py +0 -0
  66. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/__init__.py +0 -0
  67. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/ai_command.py +0 -0
  68. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/llm_consideration.py +0 -0
  69. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/schema/__init__.py +0 -0
  70. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/schema/prisma.py +0 -0
  71. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/target/__init__.py +0 -0
  72. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/target/docker_compose.py +0 -0
  73. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/__init__.py +0 -0
  74. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  75. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  76. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  77. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  78. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  79. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/curl.py +0 -0
  80. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
  81. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
  82. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/deployment/providers/verification/playwright.py +0 -0
  83. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/design_md.py +0 -0
  84. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/diff/__init__.py +0 -0
  85. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/diff/apply.py +0 -0
  86. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/diff/engine.py +0 -0
  87. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/diff/persistence.py +0 -0
  88. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/diff/templates/diff_prompt.md +0 -0
  89. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/drift.py +0 -0
  90. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/e2e_extractor.py +0 -0
  91. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/e2e_generator.py +0 -0
  92. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/e2e_runner.py +0 -0
  93. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/__init__.py +0 -0
  94. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/apply.py +0 -0
  95. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/engine.py +0 -0
  96. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/finding.py +0 -0
  97. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/formatters/__init__.py +0 -0
  98. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/formatters/base.py +0 -0
  99. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/formatters/interactive.py +0 -0
  100. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/formatters/json_fmt.py +0 -0
  101. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/formatters/md.py +0 -0
  102. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/lexicon_loader.py +0 -0
  103. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/persistence.py +0 -0
  104. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  105. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/env_refs.py +0 -0
  106. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/extract_ai.py +0 -0
  107. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/extractor.py +0 -0
  108. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixer.py +0 -0
  109. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixup_drift.py +0 -0
  110. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixup_drift_strategies/__init__.py +0 -0
  111. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  112. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  113. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
  114. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/generator.py +0 -0
  115. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/graph.py +0 -0
  116. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hitl_session.py +0 -0
  117. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/__init__.py +0 -0
  118. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/pre-commit +0 -0
  119. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
  120. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/recipes/codex_hook.sh +0 -0
  121. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
  122. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  123. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/implementer/__init__.py +0 -0
  124. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/implementer/chunked_runner.py +0 -0
  125. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/implementer/typecheck_loop.py +0 -0
  126. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/implementer.py +0 -0
  127. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/inheritance.py +0 -0
  128. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/init/__init__.py +0 -0
  129. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/init/lexicon_suggest.py +0 -0
  130. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/init/stack_detector.py +0 -0
  131. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/knowledge_fetcher.py +0 -0
  132. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon.py +0 -0
  133. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/__init__.py +0 -0
  134. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
  135. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/formatters/html.py +0 -0
  136. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  137. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/formatters/md.py +0 -0
  138. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/inspector.py +0 -0
  139. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/manager.py +0 -0
  140. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/reporter.py +0 -0
  141. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/lexicon_cli/threshold.py +0 -0
  142. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/__init__.py +0 -0
  143. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/approval.py +0 -0
  144. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/best_practice_augmenter.py +0 -0
  145. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/criteria_expander.py +0 -0
  146. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/design_doc_extractor.py +0 -0
  147. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/impl_step_deriver.py +0 -0
  148. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/means_catalog_loader.py +0 -0
  149. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/parser.py +0 -0
  150. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/plan_deriver.py +0 -0
  151. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/prompt_builder.py +0 -0
  152. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/strategy_validator.py +0 -0
  153. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  154. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
  155. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  156. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  157. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  158. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/meta_instruction.md +0 -0
  159. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/plan_derive_meta.md +0 -0
  160. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  161. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/mcp_server.py +0 -0
  162. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/measure.py +0 -0
  163. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/parsing.py +0 -0
  164. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/planner.py +0 -0
  165. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/policy.py +0 -0
  166. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/preflight/__init__.py +0 -0
  167. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/preflight/defaults/cli.yaml +0 -0
  168. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/preflight/defaults/iot.yaml +0 -0
  169. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/preflight/defaults/mobile.yaml +0 -0
  170. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/preflight/defaults/web.yaml +0 -0
  171. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/propagate.py +0 -0
  172. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/propagator.py +0 -0
  173. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/registry.py +0 -0
  174. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/__init__.py +0 -0
  175. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/approval_repair.py +0 -0
  176. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/engine.py +0 -0
  177. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/git_patcher.py +0 -0
  178. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/history.py +0 -0
  179. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/llm_repair_engine.py +0 -0
  180. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/loop.py +0 -0
  181. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/primary_picker.py +0 -0
  182. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/proof_breaks.py +0 -0
  183. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/repair_result.py +0 -0
  184. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/repairability_classifier.py +0 -0
  185. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/schema.py +0 -0
  186. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/templates/analyze_meta.md +0 -0
  187. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/templates/propose_meta.md +0 -0
  188. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
  189. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/templates/repairability_meta.md +0 -0
  190. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair/verify_runner.py +0 -0
  191. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/repair_slice.py +0 -0
  192. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/require.py +0 -0
  193. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/require_plugins.py +0 -0
  194. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/require_propagate.py +0 -0
  195. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
  196. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
  197. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  198. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/required_artifacts/defaults/web.yaml +0 -0
  199. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/required_artifacts_deriver.py +0 -0
  200. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  201. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  202. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  203. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
  204. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/requirement_completeness_auditor.py +0 -0
  205. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/restore.py +0 -0
  206. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/routes_extractor.py +0 -0
  207. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/scanner.py +0 -0
  208. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/schema_refs.py +0 -0
  209. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/screen_flow_validator.py +0 -0
  210. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/screen_transition_extractor.py +0 -0
  211. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/screen_transitions/defaults.yaml +0 -0
  212. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/synth.py +0 -0
  213. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/codd.yaml.tmpl +0 -0
  214. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/conventions.yaml.tmpl +0 -0
  215. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  216. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/doc_links.yaml.tmpl +0 -0
  217. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  218. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
  219. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  220. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
  221. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
  222. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/extracted/system-context.md.j2 +0 -0
  223. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/gitignore.tmpl +0 -0
  224. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/lexicon_questions.md +0 -0
  225. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/lexicon_schema.yaml +0 -0
  226. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/templates/overrides.yaml.tmpl +0 -0
  227. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/traceability.py +0 -0
  228. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/validator.py +0 -0
  229. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/__init__.py +0 -0
  230. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/events.py +0 -0
  231. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/propagation_log.py +0 -0
  232. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/propagation_pipeline.py +0 -0
  233. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/test_runner.py +0 -0
  234. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/watch/watcher.py +0 -0
  235. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd/wiring.py +0 -0
  236. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  237. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  238. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  239. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  240. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  241. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  242. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  243. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  244. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  245. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  246. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  247. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  248. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  249. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  250. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  251. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  252. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  253. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  254. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  255. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  256. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  257. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  258. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  259. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  260. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  261. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  262. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  263. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  264. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  265. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  266. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  267. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  268. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  269. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  270. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  271. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  272. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  273. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  274. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  275. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  276. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  277. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  278. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  279. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  280. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  281. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  282. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  283. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  284. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  285. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  286. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  287. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  288. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  289. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  290. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  291. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  292. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  293. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  294. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  295. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  296. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  297. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  298. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  299. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  300. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  301. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  302. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  303. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  304. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  305. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  306. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  307. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  308. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  309. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  310. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  311. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  312. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  313. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  314. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  315. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  316. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  317. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  318. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  319. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  320. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  321. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  322. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  323. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  324. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  325. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  326. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  327. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  328. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  329. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  330. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  331. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  332. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  333. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  334. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  335. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  336. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  337. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  338. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  339. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  340. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  341. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  342. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  343. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  344. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  345. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  346. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  347. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  348. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  349. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  350. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  351. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  352. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  353. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  354. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  355. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  356. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  357. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  358. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  359. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  360. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  361. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  362. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  363. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  364. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  365. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  366. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  367. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  368. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  369. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  370. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  371. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  372. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  373. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  374. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  375. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  376. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  377. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  378. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  379. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  380. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  381. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  382. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  383. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  384. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  385. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  386. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  387. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  388. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  389. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  390. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  391. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  392. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  393. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  394. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  395. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  396. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  397. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  398. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  399. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  400. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  401. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  402. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  403. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  404. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  405. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  406. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  407. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  408. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  409. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  410. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  411. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  412. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  413. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  414. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  415. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  416. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  417. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  418. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  419. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  420. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  421. {codd_dev-2.7.0 → codd_dev-2.9.0}/codd_plugins/stack_map.yaml +0 -0
  422. {codd_dev-2.7.0 → codd_dev-2.9.0}/docs/cookbook/cdp_browser/README.md +0 -0
  423. {codd_dev-2.7.0 → codd_dev-2.9.0}/docs/requirements/README.md +0 -0
  424. {codd_dev-2.7.0 → codd_dev-2.9.0}/tests/integration/standalone_repair_skeleton/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codd-dev
3
- Version: 2.7.0
3
+ Version: 2.9.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
@@ -463,6 +463,18 @@ def _format_preflight_ntfy(result: Any) -> str:
463
463
  default=True,
464
464
  help="Detect project manifests and offer lexicon plug-in suggestions.",
465
465
  )
466
+ @click.option(
467
+ "--llm-enhanced",
468
+ is_flag=True,
469
+ default=False,
470
+ help="Use AI to recommend lexicons from requirements and design context.",
471
+ )
472
+ @click.option(
473
+ "--auto-approve",
474
+ is_flag=True,
475
+ default=False,
476
+ help="Apply high and medium confidence AI lexicon recommendations without prompting.",
477
+ )
466
478
  def init(
467
479
  project_name: str,
468
480
  language: str,
@@ -470,6 +482,8 @@ def init(
470
482
  requirements: str | None,
471
483
  config_dir: str,
472
484
  suggest_lexicons: bool,
485
+ llm_enhanced: bool,
486
+ auto_approve: bool,
473
487
  ):
474
488
  """Initialize CoDD in a project directory."""
475
489
  dest_path = Path(dest).resolve()
@@ -521,10 +535,15 @@ def init(
521
535
  click.echo(f" or: codd generate --wave 2 (auto-generates everything)")
522
536
 
523
537
  if suggest_lexicons:
524
- _offer_lexicon_suggestions(dest_path)
538
+ _offer_lexicon_suggestions(dest_path, llm_enhanced=llm_enhanced, auto_approve=auto_approve)
525
539
 
526
540
 
527
- def _offer_lexicon_suggestions(project_root: Path) -> None:
541
+ def _offer_lexicon_suggestions(
542
+ project_root: Path,
543
+ *,
544
+ llm_enhanced: bool = False,
545
+ auto_approve: bool = False,
546
+ ) -> None:
528
547
  from codd.init.lexicon_suggest import (
529
548
  append_suggested_lexicons,
530
549
  describe_lexicons,
@@ -533,6 +552,41 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
533
552
  )
534
553
  from codd.init.stack_detector import StackDetector
535
554
 
555
+ if llm_enhanced:
556
+ from codd.init.llm_lexicon_suggester import llm_recommend_lexicons
557
+
558
+ llm_result = llm_recommend_lexicons(project_root)
559
+ if llm_result.recommendations:
560
+ descriptions = describe_lexicons(rec.lexicon_id for rec in llm_result.recommendations)
561
+ click.echo("")
562
+ click.echo("[LLM-enhanced] Analyzing project ...")
563
+ click.echo("[LLM-enhanced] Detected:")
564
+ click.echo(f" - Data types: {_format_detected_items(llm_result.detected_data_types)}")
565
+ click.echo(f" - Function traits: {_format_detected_items(llm_result.detected_function_traits)}")
566
+ click.echo(f" - Tech stack: {_format_detected_items(llm_result.detected_tech_stack)}")
567
+ click.echo("")
568
+ click.echo("[LLM-enhanced] Recommended lexicons:")
569
+ for index, recommendation in enumerate(llm_result.recommendations, start=1):
570
+ description = descriptions.get(recommendation.lexicon_id, "")
571
+ suffix = f" ({description})" if description else ""
572
+ click.echo(
573
+ f" {index}. {_confidence_icon(recommendation.confidence)} "
574
+ f"{recommendation.lexicon_id}{suffix} [{recommendation.confidence}]"
575
+ )
576
+ if recommendation.reason:
577
+ click.echo(f" {recommendation.reason}")
578
+
579
+ selected = _select_llm_recommendations(llm_result, auto_approve=auto_approve)
580
+ if not selected:
581
+ click.echo("LLM-enhanced lexicons not added.")
582
+ return
583
+ path = append_suggested_lexicons(project_root, selected)
584
+ rel_path = path.relative_to(project_root).as_posix()
585
+ click.echo(f"{rel_path} updated ({len(selected)} suggested lexicons)")
586
+ return
587
+ click.echo("")
588
+ click.echo("[LLM-enhanced] No usable recommendation; falling back to stack-based suggestions.")
589
+
536
590
  detection = StackDetector().detect(project_root)
537
591
  if not detection.stack_hints:
538
592
  return
@@ -559,6 +613,51 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
559
613
  click.echo(f"{rel_path} updated ({len(suggestions)} suggested lexicons)")
560
614
 
561
615
 
616
+ def _format_detected_items(items: list[str]) -> str:
617
+ return ", ".join(items) if items else "none"
618
+
619
+
620
+ def _confidence_icon(confidence: str) -> str:
621
+ return {"high": "✅", "medium": "⚠️", "low": "△"}.get(confidence, "△")
622
+
623
+
624
+ def _select_llm_recommendations(llm_result: Any, *, auto_approve: bool) -> list[str]:
625
+ if auto_approve:
626
+ return [
627
+ recommendation.lexicon_id
628
+ for recommendation in llm_result.recommendations
629
+ if recommendation.confidence in {"high", "medium"}
630
+ ]
631
+
632
+ choice = click.prompt("Apply all recommended? [Y/n/select]", default="Y", show_default=False).strip().lower()
633
+ if choice in {"y", "yes", ""}:
634
+ return [
635
+ recommendation.lexicon_id
636
+ for recommendation in llm_result.recommendations
637
+ if recommendation.confidence in {"high", "medium"}
638
+ ]
639
+ if choice in {"n", "no"}:
640
+ return []
641
+ if choice != "select":
642
+ click.echo("Invalid selection; suggested lexicons not added.")
643
+ return []
644
+
645
+ raw_numbers = click.prompt("Select recommendation numbers", default="", show_default=False).strip()
646
+ selected: list[str] = []
647
+ for token in re.split(r"[\s,]+", raw_numbers):
648
+ if not token:
649
+ continue
650
+ try:
651
+ index = int(token)
652
+ except ValueError:
653
+ continue
654
+ if 1 <= index <= len(llm_result.recommendations):
655
+ lexicon_id = llm_result.recommendations[index - 1].lexicon_id
656
+ if lexicon_id not in selected:
657
+ selected.append(lexicon_id)
658
+ return selected
659
+
660
+
562
661
  @main.group("lexicon")
563
662
  def lexicon_cmd() -> None:
564
663
  """Manage bundled lexicon plug-ins."""
@@ -109,7 +109,7 @@ class CoverageAuditor:
109
109
  lowered = text.lower()
110
110
  text_terms = _terms(lowered)
111
111
  if (
112
- {"lms", "e-learning", "elearning"} & text_terms
112
+ {"e-learning", "elearning"} & text_terms
113
113
  or "learning management" in lowered
114
114
  or len(
115
115
  {
@@ -244,7 +244,7 @@ class CoverageAuditor:
244
244
  },
245
245
  ]
246
246
 
247
- lms = [
247
+ learning_platform = [
248
248
  *base_web,
249
249
  *self._build_auth_ui_surface_checklist(),
250
250
  {
@@ -362,7 +362,7 @@ class CoverageAuditor:
362
362
  ]
363
363
 
364
364
  checklists = {
365
- "LMS/EdTech": lms,
365
+ "LMS/EdTech": learning_platform,
366
366
  "FinTech": [
367
367
  *base_web,
368
368
  {
@@ -0,0 +1,242 @@
1
+ """LLM-backed lexicon recommendation from project context."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ import json
7
+ from pathlib import Path
8
+ from typing import Any, Literal, Protocol
9
+
10
+ import yaml
11
+
12
+ from codd.deployment.providers.ai_command import AiCommandError, SubprocessAiCommand
13
+ from codd.init.lexicon_suggest import default_lexicon_root
14
+ from codd.init.stack_detector import StackDetector
15
+
16
+
17
+ Confidence = Literal["high", "medium", "low"]
18
+ _CONFIDENCES: set[str] = {"high", "medium", "low"}
19
+ _MAX_DOC_CHARS = 24_000
20
+ _MAX_FILE_CHARS = 4_000
21
+
22
+
23
+ class AiCommand(Protocol):
24
+ def invoke(self, prompt: str, model: str | None = None) -> str:
25
+ """Return an AI response for the supplied prompt."""
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class LlmLexiconRecommendation:
30
+ lexicon_id: str
31
+ confidence: Confidence
32
+ reason: str
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class LlmLexiconResult:
37
+ detected_data_types: list[str]
38
+ detected_function_traits: list[str]
39
+ detected_tech_stack: list[str]
40
+ recommendations: list[LlmLexiconRecommendation]
41
+
42
+
43
+ def llm_recommend_lexicons(
44
+ project_root: Path,
45
+ *,
46
+ ai_command: AiCommand | None = None,
47
+ ) -> LlmLexiconResult:
48
+ """Recommend lexicons via AI, returning an empty result on unusable input."""
49
+
50
+ root = Path(project_root)
51
+ context = _collect_project_context(root)
52
+ if not context["requirements"]:
53
+ return _empty_result()
54
+
55
+ available = _available_lexicons()
56
+ if not available:
57
+ return _empty_result()
58
+
59
+ command = ai_command or SubprocessAiCommand(project_root=root)
60
+ prompt = _build_prompt(context, available)
61
+ try:
62
+ raw_output = command.invoke(prompt)
63
+ payload = json.loads(_extract_json_object(raw_output))
64
+ except (AiCommandError, OSError, TypeError, ValueError, json.JSONDecodeError):
65
+ return _empty_result()
66
+ return _result_from_payload(payload, set(available))
67
+
68
+
69
+ def _collect_project_context(project_root: Path) -> dict[str, Any]:
70
+ requirements = _read_matching_files(
71
+ project_root,
72
+ [
73
+ "requirements.md",
74
+ ".codd/requirements.md",
75
+ "codd/requirements.md",
76
+ "docs/requirements.md",
77
+ "docs/requirements*.md",
78
+ "docs/requirements/**/*.md",
79
+ ],
80
+ )
81
+ designs = _read_matching_files(
82
+ project_root,
83
+ [
84
+ "design/*.md",
85
+ ".codd/design/*.md",
86
+ "codd/design/*.md",
87
+ "docs/design/*.md",
88
+ ],
89
+ )
90
+ detection = StackDetector().detect(project_root)
91
+ return {
92
+ "requirements": requirements,
93
+ "designs": designs,
94
+ "tech_stack_hints": detection.stack_hints,
95
+ "detected_signals": detection.detected_signals,
96
+ }
97
+
98
+
99
+ def _read_matching_files(project_root: Path, patterns: list[str]) -> list[dict[str, str]]:
100
+ seen: set[Path] = set()
101
+ files: list[dict[str, str]] = []
102
+ budget = _MAX_DOC_CHARS
103
+ for pattern in patterns:
104
+ for path in sorted(project_root.glob(pattern)):
105
+ if path in seen or not path.is_file():
106
+ continue
107
+ seen.add(path)
108
+ if budget <= 0:
109
+ return files
110
+ text = path.read_text(encoding="utf-8", errors="replace")[: min(_MAX_FILE_CHARS, budget)]
111
+ budget -= len(text)
112
+ files.append({"path": path.relative_to(project_root).as_posix(), "content": text})
113
+ return files
114
+
115
+
116
+ def _available_lexicons() -> dict[str, str]:
117
+ root = default_lexicon_root()
118
+ available: dict[str, str] = {}
119
+ if not root.is_dir():
120
+ return available
121
+ for manifest in sorted(root.glob("*/manifest.yaml")):
122
+ try:
123
+ payload = yaml.safe_load(manifest.read_text(encoding="utf-8")) or {}
124
+ except (OSError, yaml.YAMLError):
125
+ continue
126
+ if not isinstance(payload, dict):
127
+ continue
128
+ lexicon_id = manifest.parent.name
129
+ if not lexicon_id:
130
+ continue
131
+ available[lexicon_id] = str(payload.get("description") or "").strip()
132
+ return available
133
+
134
+
135
+ def _build_prompt(context: dict[str, Any], available_lexicons: dict[str, str]) -> str:
136
+ payload = {
137
+ "available_lexicons": available_lexicons,
138
+ "project_context": context,
139
+ "required_output_schema": {
140
+ "detected_data_types": ["string"],
141
+ "detected_function_traits": ["string"],
142
+ "detected_tech_stack": ["string"],
143
+ "recommendations": [
144
+ {
145
+ "lexicon_id": "string from available_lexicons keys",
146
+ "confidence": "high | medium | low",
147
+ "reason": "short explanation referencing a data type or function trait",
148
+ }
149
+ ],
150
+ },
151
+ }
152
+ return (
153
+ "You are a requirements engineer. Analyze this project's documentation and tech stack.\n"
154
+ "Identify:\n"
155
+ "- Data types handled (personal information / credit card data / medical records / "
156
+ "video content / etc.)\n"
157
+ "- Function traits present (authentication flow / payment processing / public API / "
158
+ "video streaming / etc.)\n"
159
+ "- Tech stack (frameworks, databases, cloud platforms)\n\n"
160
+ "Reasoning rules (apply dynamically):\n"
161
+ "- personal information present -> recommend data_governance_appi_gdpr (or GDPR equivalent)\n"
162
+ "- credit card data present -> recommend compliance_pci_dss_4\n"
163
+ "- medical data present -> recommend compliance_hipaa\n"
164
+ "- authentication flow present -> consider web_authn_webauthn\n"
165
+ "- public REST API present -> recommend api_rest_openapi\n"
166
+ "- etc.\n\n"
167
+ "From the available lexicons, recommend the most relevant ones with lexicon_id, "
168
+ "confidence (high/medium/low), and reason referencing the data type or function trait. "
169
+ "Return JSON only. Do not include Markdown fences or prose.\n\n"
170
+ f"{json.dumps(payload, ensure_ascii=False, indent=2)}"
171
+ )
172
+
173
+
174
+ def _extract_json_object(raw_output: str) -> str:
175
+ text = raw_output.strip()
176
+ if text.startswith("```"):
177
+ lines = text.splitlines()
178
+ if lines and lines[0].startswith("```"):
179
+ lines = lines[1:]
180
+ if lines and lines[-1].strip() == "```":
181
+ lines = lines[:-1]
182
+ text = "\n".join(lines).strip()
183
+ start = text.find("{")
184
+ end = text.rfind("}")
185
+ if start == -1 or end == -1 or end < start:
186
+ raise ValueError("LLM output did not contain a JSON object")
187
+ return text[start : end + 1]
188
+
189
+
190
+ def _result_from_payload(payload: Any, available_ids: set[str]) -> LlmLexiconResult:
191
+ if not isinstance(payload, dict):
192
+ return _empty_result()
193
+
194
+ recommendations: list[LlmLexiconRecommendation] = []
195
+ seen: set[str] = set()
196
+ rows = payload.get("recommendations", [])
197
+ if isinstance(rows, list):
198
+ for row in rows:
199
+ if not isinstance(row, dict):
200
+ continue
201
+ lexicon_id = str(row.get("lexicon_id") or "").strip()
202
+ confidence = str(row.get("confidence") or "").strip().lower()
203
+ if lexicon_id not in available_ids or confidence not in _CONFIDENCES or lexicon_id in seen:
204
+ continue
205
+ seen.add(lexicon_id)
206
+ recommendations.append(
207
+ LlmLexiconRecommendation(
208
+ lexicon_id=lexicon_id,
209
+ confidence=confidence, # type: ignore[arg-type]
210
+ reason=str(row.get("reason") or "").strip(),
211
+ )
212
+ )
213
+
214
+ return LlmLexiconResult(
215
+ detected_data_types=_string_list(payload.get("detected_data_types")),
216
+ detected_function_traits=_string_list(payload.get("detected_function_traits")),
217
+ detected_tech_stack=_string_list(payload.get("detected_tech_stack")),
218
+ recommendations=recommendations,
219
+ )
220
+
221
+
222
+ def _string_list(value: Any) -> list[str]:
223
+ if not isinstance(value, list):
224
+ return []
225
+ return [str(item).strip() for item in value if str(item).strip()]
226
+
227
+
228
+ def _empty_result() -> LlmLexiconResult:
229
+ return LlmLexiconResult(
230
+ detected_data_types=[],
231
+ detected_function_traits=[],
232
+ detected_tech_stack=[],
233
+ recommendations=[],
234
+ )
235
+
236
+
237
+ __all__ = [
238
+ "AiCommand",
239
+ "LlmLexiconRecommendation",
240
+ "LlmLexiconResult",
241
+ "llm_recommend_lexicons",
242
+ ]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "2.7.0"
7
+ version = "2.9.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