codd-dev 3.7.1__tar.gz → 3.7.3__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 (638) hide show
  1. {codd_dev-3.7.1 → codd_dev-3.7.3}/PKG-INFO +1 -1
  2. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/__init__.py +1 -1
  3. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/cli.py +31 -1
  4. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/builder.py +214 -16
  5. codd_dev-3.7.3/codd/dag/checks/transitive_closure.py +211 -0
  6. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extract_ai.py +72 -4
  7. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extractor.py +21 -0
  8. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/regex_strategies.py +136 -5
  9. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/treesitter.py +309 -16
  10. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/synth.py +17 -1
  11. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/codd.yaml.tmpl +25 -25
  12. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/api-contract.md.j2 +2 -2
  13. {codd_dev-3.7.1 → codd_dev-3.7.3}/pyproject.toml +1 -1
  14. codd_dev-3.7.1/codd/dag/checks/transitive_closure.py +0 -116
  15. {codd_dev-3.7.1 → codd_dev-3.7.3}/.gitignore +0 -0
  16. {codd_dev-3.7.1 → codd_dev-3.7.3}/LICENSE +0 -0
  17. {codd_dev-3.7.1 → codd_dev-3.7.3}/README.md +0 -0
  18. {codd_dev-3.7.1 → codd_dev-3.7.3}/bench_fixture/README.md +0 -0
  19. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/__main__.py +0 -0
  20. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/_git_helper.py +0 -0
  21. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/action_outcome.py +0 -0
  22. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ai_invoke.py +0 -0
  23. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ai_patch.py +0 -0
  24. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifact_contract.py +0 -0
  25. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifact_ids.py +0 -0
  26. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/artifacts/catalog.yaml +0 -0
  27. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/ask_user_question_adapter.py +0 -0
  28. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/assembler.py +0 -0
  29. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/bridge.py +0 -0
  30. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/brownfield/__init__.py +0 -0
  31. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/brownfield/pipeline.py +0 -0
  32. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/capability_completeness.py +0 -0
  33. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/claude_cli.py +0 -0
  34. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/clustering.py +0 -0
  35. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coherence_adapters.py +0 -0
  36. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coherence_engine.py +0 -0
  37. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/confidence.py +0 -0
  38. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/config.py +0 -0
  39. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/config_schema.py +0 -0
  40. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts.py +0 -0
  41. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/__init__.py +0 -0
  42. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/__main__.py +0 -0
  43. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/certify.py +0 -0
  44. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/generate_matrix.py +0 -0
  45. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/contracts_registry/registry.py +0 -0
  46. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_auditor.py +0 -0
  47. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_execution_coherence.py +0 -0
  48. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/coverage_metrics.py +0 -0
  49. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/__init__.py +0 -0
  50. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/auto_repair.py +0 -0
  51. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/__init__.py +0 -0
  52. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/_one_to_many_detection.py +0 -0
  53. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/artifact_contract_check.py +0 -0
  54. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/cardinality_coverage.py +0 -0
  55. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/ci_health.py +0 -0
  56. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/dependency_freshness.py +0 -0
  57. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/depends_on_consistency.py +0 -0
  58. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/deployment_completeness.py +0 -0
  59. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/edge_validity.py +0 -0
  60. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/environment_coverage.py +0 -0
  61. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/extraction_diagnostics.py +0 -0
  62. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/implementation_coverage.py +0 -0
  63. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/negative_space.py +0 -0
  64. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/node_completeness.py +0 -0
  65. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/opt_out.py +0 -0
  66. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/resource_flow_coherence.py +0 -0
  67. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/semantic_contract_conflict.py +0 -0
  68. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/stale_evidence.py +0 -0
  69. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/task_completion.py +0 -0
  70. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/ui_coherence.py +0 -0
  71. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/checks/user_journey_coherence.py +0 -0
  72. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/coverage_axes.py +0 -0
  73. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/cli.yaml +0 -0
  74. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  75. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/csharp.yaml +0 -0
  76. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/elixir.yaml +0 -0
  77. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/generic.yaml +0 -0
  78. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/iot.yaml +0 -0
  79. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/java.yaml +0 -0
  80. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/kotlin.yaml +0 -0
  81. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/mobile.yaml +0 -0
  82. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/ruby.yaml +0 -0
  83. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/rust.yaml +0 -0
  84. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/scala.yaml +0 -0
  85. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/swift.yaml +0 -0
  86. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/test_frameworks.yaml +0 -0
  87. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/defaults/web.yaml +0 -0
  88. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/extractor.py +0 -0
  89. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/impact.py +0 -0
  90. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/materiality.py +0 -0
  91. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/metadata_access.py +0 -0
  92. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/result_status.py +0 -0
  93. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dag/runner.py +0 -0
  94. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/defaults.py +0 -0
  95. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/defaults.yaml +0 -0
  96. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/dependency_lock_coherence.py +0 -0
  97. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/__init__.py +0 -0
  98. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/app_service.py +0 -0
  99. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/base.py +0 -0
  100. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deploy_targets/docker_compose.py +0 -0
  101. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployer.py +0 -0
  102. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/__init__.py +0 -0
  103. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/checks/__init__.py +0 -0
  104. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  105. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  106. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/schema_providers.yaml +0 -0
  107. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/defaults/verification_templates.yaml +0 -0
  108. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/extractor.py +0 -0
  109. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/__init__.py +0 -0
  110. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/ai_command.py +0 -0
  111. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/ai_command_factory.py +0 -0
  112. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/codex_app_server.py +0 -0
  113. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/llm_consideration.py +0 -0
  114. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/schema/__init__.py +0 -0
  115. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/schema/prisma.py +0 -0
  116. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/target/__init__.py +0 -0
  117. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/target/docker_compose.py +0 -0
  118. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/__init__.py +0 -0
  119. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  120. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  121. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  122. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  123. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  124. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/curl.py +0 -0
  125. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/form_strategies.py +0 -0
  126. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/means_catalog.py +0 -0
  127. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/playwright.py +0 -0
  128. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/pytest_http.py +0 -0
  129. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/deployment/providers/verification/vitest.py +0 -0
  130. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/design_md.py +0 -0
  131. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/__init__.py +0 -0
  132. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/apply.py +0 -0
  133. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/engine.py +0 -0
  134. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/persistence.py +0 -0
  135. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/diff/templates/diff_prompt.md +0 -0
  136. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/discovery.py +0 -0
  137. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/drift.py +0 -0
  138. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_contract_coherence.py +0 -0
  139. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_extractor.py +0 -0
  140. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_generator.py +0 -0
  141. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_harness.py +0 -0
  142. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/e2e_runner.py +0 -0
  143. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/__init__.py +0 -0
  144. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/apply.py +0 -0
  145. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/engine.py +0 -0
  146. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/finding.py +0 -0
  147. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/__init__.py +0 -0
  148. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/base.py +0 -0
  149. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/interactive.py +0 -0
  150. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/json_fmt.py +0 -0
  151. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/formatters/md.py +0 -0
  152. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/gap_to_ask.py +0 -0
  153. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/lexicon_loader.py +0 -0
  154. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/persistence.py +0 -0
  155. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/promote.py +0 -0
  156. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/routing.py +0 -0
  157. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  158. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/env_refs.py +0 -0
  159. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/extract_paths.py +0 -0
  160. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/__init__.py +0 -0
  161. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/candidate_selector.py +0 -0
  162. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/design_updater.py +0 -0
  163. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/impact_planner.py +0 -0
  164. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/impl_propagation.py +0 -0
  165. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/interactive_prompt.py +0 -0
  166. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/phenomenon_fixer.py +0 -0
  167. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/phenomenon_parser.py +0 -0
  168. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/risk_classifier.py +0 -0
  169. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/clarification_question.txt +0 -0
  170. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/design_update.txt +0 -0
  171. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/impl_update.txt +0 -0
  172. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/phenomenon_parse.txt +0 -0
  173. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates/risk_assessment.txt +0 -0
  174. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fix/templates_loader.py +0 -0
  175. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixer.py +0 -0
  176. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift.py +0 -0
  177. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/__init__.py +0 -0
  178. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  179. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  180. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/fixup_drift_strategies/url_drift.py +0 -0
  181. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/frontmatter.py +0 -0
  182. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/generator.py +0 -0
  183. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/git_evidence.py +0 -0
  184. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/graph.py +0 -0
  185. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/greenfield/__init__.py +0 -0
  186. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/greenfield/pipeline.py +0 -0
  187. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hitl_session.py +0 -0
  188. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/__init__.py +0 -0
  189. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/pre-commit +0 -0
  190. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  191. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/claude_settings_example.json +0 -0
  192. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/codex_hook.sh +0 -0
  193. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/git_post_commit.sh +0 -0
  194. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  195. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/iac_nfr.py +0 -0
  196. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle.py +0 -0
  197. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle_scope.py +0 -0
  198. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implement_oracle_types.py +0 -0
  199. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/__init__.py +0 -0
  200. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/chunked_runner.py +0 -0
  201. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer/typecheck_loop.py +0 -0
  202. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/implementer.py +0 -0
  203. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/import_coherence.py +0 -0
  204. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/inheritance.py +0 -0
  205. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/__init__.py +0 -0
  206. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/lexicon_suggest.py +0 -0
  207. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/llm_lexicon_suggester.py +0 -0
  208. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/init/stack_detector.py +0 -0
  209. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/knowledge_fetcher.py +0 -0
  210. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/__init__.py +0 -0
  211. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/__init__.py +0 -0
  212. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/implement_oracle.py +0 -0
  213. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_go.py +0 -0
  214. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_python.py +0 -0
  215. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/oracle_typescript.py +0 -0
  216. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/adapters/runner_report.py +0 -0
  217. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/builtin_adapters.py +0 -0
  218. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/compat.py +0 -0
  219. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/contract.py +0 -0
  220. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/loader.py +0 -0
  221. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/oracle_executor.py +0 -0
  222. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/path_planner.py +0 -0
  223. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profile.py +0 -0
  224. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/go.yaml +0 -0
  225. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/python.yaml +0 -0
  226. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/profiles/typescript.yaml +0 -0
  227. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/registry.py +0 -0
  228. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/verify_executor.py +0 -0
  229. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/languages/verify_plan.py +0 -0
  230. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon.py +0 -0
  231. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/__init__.py +0 -0
  232. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/__init__.py +0 -0
  233. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/html.py +0 -0
  234. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  235. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/formatters/md.py +0 -0
  236. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/inspector.py +0 -0
  237. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/manager.py +0 -0
  238. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/reporter.py +0 -0
  239. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/lexicon_cli/threshold.py +0 -0
  240. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/__init__.py +0 -0
  241. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/approval.py +0 -0
  242. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/best_practice_augmenter.py +0 -0
  243. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/criteria_expander.py +0 -0
  244. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/design_doc_extractor.py +0 -0
  245. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/impl_step_deriver.py +0 -0
  246. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/means_catalog_loader.py +0 -0
  247. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/parser.py +0 -0
  248. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/plan_deriver.py +0 -0
  249. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/prompt_builder.py +0 -0
  250. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/strategy_validator.py +0 -0
  251. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  252. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/criteria_expand_meta.md +0 -0
  253. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  254. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  255. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  256. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/meta_instruction.md +0 -0
  257. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/plan_derive_meta.md +0 -0
  258. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  259. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/mcp_server.py +0 -0
  260. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/measure.py +0 -0
  261. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/operational_e2e_audit.py +0 -0
  262. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/operations_derive.py +0 -0
  263. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/__init__.py +0 -0
  264. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/_shared.py +0 -0
  265. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/api_specs.py +0 -0
  266. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/extractor_registry.py +0 -0
  267. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/filesystem_routes.py +0 -0
  268. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/iac.py +0 -0
  269. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/python_ast.py +0 -0
  270. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/schemas.py +0 -0
  271. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/parsing/tests_builddeps.py +0 -0
  272. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/path_safety.py +0 -0
  273. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/planner.py +0 -0
  274. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/policy.py +0 -0
  275. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/__init__.py +0 -0
  276. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/cli.yaml +0 -0
  277. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/generic.yaml +0 -0
  278. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/iot.yaml +0 -0
  279. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/mobile.yaml +0 -0
  280. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/preflight/defaults/web.yaml +0 -0
  281. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/project_types.py +0 -0
  282. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagate.py +0 -0
  283. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagation_common.py +0 -0
  284. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/propagator.py +0 -0
  285. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/reconciliation_ledger.py +0 -0
  286. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/reference_resolution.py +0 -0
  287. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/registry.py +0 -0
  288. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/__init__.py +0 -0
  289. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/approval_repair.py +0 -0
  290. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/auto_scope_guard.py +0 -0
  291. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/engine.py +0 -0
  292. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/git_patcher.py +0 -0
  293. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/history.py +0 -0
  294. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/llm_repair_engine.py +0 -0
  295. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/loop.py +0 -0
  296. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/primary_picker.py +0 -0
  297. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/proof_breaks.py +0 -0
  298. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/repair_result.py +0 -0
  299. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/repairability_classifier.py +0 -0
  300. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/schema.py +0 -0
  301. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/analyze_meta.md +0 -0
  302. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/propose_meta.md +0 -0
  303. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/repair_strategy_meta.md +0 -0
  304. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/templates/repairability_meta.md +0 -0
  305. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/test_failure_attribution.py +0 -0
  306. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair/verify_runner.py +0 -0
  307. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/repair_slice.py +0 -0
  308. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require.py +0 -0
  309. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require_plugins.py +0 -0
  310. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/require_propagate.py +0 -0
  311. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/cli.yaml +0 -0
  312. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/generic.yaml +0 -0
  313. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/iot.yaml +0 -0
  314. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  315. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts/defaults/web.yaml +0 -0
  316. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/required_artifacts_deriver.py +0 -0
  317. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  318. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  319. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  320. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  321. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness/defaults/web.yaml +0 -0
  322. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_completeness_auditor.py +0 -0
  323. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirement_reconciliation.py +0 -0
  324. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/requirements_meta.py +0 -0
  325. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/restoration_report.py +0 -0
  326. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/restore.py +0 -0
  327. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/routes_extractor.py +0 -0
  328. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/__init__.py +0 -0
  329. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/checks.py +0 -0
  330. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/config.py +0 -0
  331. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/report.py +0 -0
  332. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/runtime_smoke/runner.py +0 -0
  333. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/scanner.py +0 -0
  334. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/schema_refs.py +0 -0
  335. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_flow_validator.py +0 -0
  336. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_transition_extractor.py +0 -0
  337. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/screen_transitions/defaults.yaml +0 -0
  338. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/__init__.py +0 -0
  339. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/discovery.py +0 -0
  340. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/manager.py +0 -0
  341. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/skills_cli/paths.py +0 -0
  342. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/__init__.py +0 -0
  343. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/__init__.py +0 -0
  344. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/_base.py +0 -0
  345. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/nextjs.py +0 -0
  346. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/playwright.py +0 -0
  347. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/adapters/prisma.py +0 -0
  348. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_authenticity.py +0 -0
  349. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_override.py +0 -0
  350. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/command_plan.py +0 -0
  351. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/compose.py +0 -0
  352. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/loader.py +0 -0
  353. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/lock.py +0 -0
  354. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/obligations.py +0 -0
  355. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profile.py +0 -0
  356. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/addons/playwright.yaml +0 -0
  357. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/addons/prisma.yaml +0 -0
  358. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  359. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/project.py +0 -0
  360. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/registry.py +0 -0
  361. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/replacement_proof.py +0 -0
  362. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/stack/resolve.py +0 -0
  363. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/surface_reconciliation.py +0 -0
  364. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/conventions.yaml.tmpl +0 -0
  365. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  366. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/doc_links.yaml.tmpl +0 -0
  367. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  368. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  369. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/module-detail.md.j2 +0 -0
  370. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/schema-design.md.j2 +0 -0
  371. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/extracted/system-context.md.j2 +0 -0
  372. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/gitignore.tmpl +0 -0
  373. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/lexicon_questions.md +0 -0
  374. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/lexicon_schema.yaml +0 -0
  375. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/templates/overrides.yaml.tmpl +0 -0
  376. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/test_detection.py +0 -0
  377. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/test_import_coherence.py +0 -0
  378. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/traceability.py +0 -0
  379. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/validator.py +0 -0
  380. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/vb_marker_authenticity.py +0 -0
  381. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/vb_rerun_scope.py +0 -0
  382. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/verifiable_behavior_audit.py +0 -0
  383. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/__init__.py +0 -0
  384. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/events.py +0 -0
  385. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/propagation_log.py +0 -0
  386. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/propagation_pipeline.py +0 -0
  387. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/test_runner.py +0 -0
  388. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/watch/watcher.py +0 -0
  389. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd/wiring.py +0 -0
  390. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  391. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  392. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  393. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  394. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  395. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  396. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  397. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  398. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  399. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  400. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  401. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  402. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  403. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  404. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  405. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  406. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  407. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  408. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  409. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  410. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  411. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  412. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  413. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  414. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  415. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  416. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  417. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  418. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  419. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  420. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  421. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  422. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  423. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  424. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  425. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  426. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  427. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  428. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  429. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  430. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  431. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  432. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  433. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  434. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  435. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  436. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  437. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  438. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  439. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  440. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  441. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  442. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  443. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  444. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  445. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  446. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  447. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  448. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  449. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  450. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  451. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  452. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  453. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  454. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  455. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  456. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  457. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  458. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  459. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  460. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  461. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  462. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  463. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  464. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  465. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  466. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  467. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  468. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  469. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  470. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  471. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  472. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  473. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  474. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  475. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  476. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  477. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  478. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  479. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  480. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  481. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  482. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  483. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  484. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  485. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  486. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  487. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  488. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  489. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  490. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  491. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  492. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  493. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  494. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  495. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  496. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  497. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  498. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  499. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  500. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  501. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  502. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  503. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  504. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  505. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  506. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  507. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  508. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  509. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  510. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  511. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  512. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  513. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  514. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  515. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  516. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  517. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  518. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  519. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  520. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  521. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  522. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  523. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  524. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  525. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  526. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  527. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  528. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  529. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  530. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  531. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  532. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  533. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  534. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  535. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  536. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  537. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  538. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  539. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  540. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  541. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  542. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  543. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  544. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  545. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  546. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  547. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  548. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  549. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  550. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  551. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  552. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  553. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  554. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  555. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  556. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  557. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  558. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  559. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  560. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  561. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  562. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  563. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  564. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  565. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  566. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  567. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  568. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  569. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  570. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  571. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  572. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  573. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  574. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  575. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  576. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  577. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  578. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  579. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  580. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  581. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  582. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  583. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  584. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  585. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  586. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  587. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  588. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  589. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  590. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  591. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  592. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  593. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  594. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  595. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  596. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  597. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  598. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  599. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  600. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  601. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  602. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  603. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  604. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  605. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  606. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  607. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  608. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  609. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  610. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  611. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  612. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  613. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  614. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  615. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  616. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  617. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  618. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  619. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  620. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  621. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  622. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  623. {codd_dev-3.7.1 → codd_dev-3.7.3}/codd_plugins/stack_map.yaml +0 -0
  624. {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/cookbook/cdp_browser/README.md +0 -0
  625. {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/cookbook/presentation_aggregation/README.md +0 -0
  626. {codd_dev-3.7.1 → codd_dev-3.7.3}/docs/requirements/README.md +0 -0
  627. {codd_dev-3.7.1 → codd_dev-3.7.3}/examples/README.md +0 -0
  628. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-assemble/SKILL.md +0 -0
  629. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-evolve/SKILL.md +0 -0
  630. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-generate/SKILL.md +0 -0
  631. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-greenfield/SKILL.md +0 -0
  632. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-impact/SKILL.md +0 -0
  633. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-init/SKILL.md +0 -0
  634. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-propagate/SKILL.md +0 -0
  635. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-restore/SKILL.md +0 -0
  636. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-scan/SKILL.md +0 -0
  637. {codd_dev-3.7.1 → codd_dev-3.7.3}/skills/codd-validate/SKILL.md +0 -0
  638. {codd_dev-3.7.1 → codd_dev-3.7.3}/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: 3.7.1
3
+ Version: 3.7.3
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
@@ -1,3 +1,3 @@
1
1
  """CoDD — Coherence-Driven Development."""
2
2
 
3
- __version__ = "3.7.1"
3
+ __version__ = "3.7.3"
@@ -434,6 +434,30 @@ def _display_path(path: Path, project_root: Path) -> str:
434
434
  return path.as_posix()
435
435
 
436
436
 
437
+ def _detect_bootstrap_test_dirs(project_root: Path) -> list[str]:
438
+ """Detect the project's test directories for the bootstrap codd.yaml.
439
+
440
+ Reuses the extractor's inventory (``test``/``tests``/``spec``/``__tests__``)
441
+ so a project that uses ``test/`` is not silently excluded by a hardcoded
442
+ ``tests/`` default (which yields a vacuous task_completion). Falls back to the
443
+ conventional ``tests/`` when none exist so the config stays valid + editable.
444
+ """
445
+ from codd.extractor import _detect_test_dirs
446
+
447
+ found = _detect_test_dirs(project_root)
448
+ return [f"{d}/" for d in found] if found else ["tests/"]
449
+
450
+
451
+ def _detect_bootstrap_doc_dirs(project_root: Path) -> list[str]:
452
+ """Detect the project's documentation directories for the bootstrap codd.yaml.
453
+
454
+ Mirrors :func:`_detect_bootstrap_test_dirs`: prefer what exists (``docs``
455
+ vs ``doc``), fall back to the conventional ``docs/`` when none exist.
456
+ """
457
+ found = [d for d in ("docs", "doc", "documentation") if (project_root / d).is_dir()]
458
+ return [f"{d}/" for d in found] if found else ["docs/"]
459
+
460
+
437
461
  def _ensure_bootstrap_codd_yaml(
438
462
  project_root: Path,
439
463
  *,
@@ -456,6 +480,8 @@ def _ensure_bootstrap_codd_yaml(
456
480
  "project_name": project_root.name,
457
481
  "language": language,
458
482
  "source_dirs": _format_yaml_list(source_dirs),
483
+ "test_dirs": _format_yaml_list(_detect_bootstrap_test_dirs(project_root)),
484
+ "doc_dirs": _format_yaml_list(_detect_bootstrap_doc_dirs(project_root)),
459
485
  "graph_path": f"{codd_dir_name}/scan",
460
486
  },
461
487
  )
@@ -2323,11 +2349,15 @@ def init(
2323
2349
  (codd_dir / "reports").mkdir(parents=True)
2324
2350
  (codd_dir / "scan").mkdir(exist_ok=True)
2325
2351
 
2326
- # Copy templates
2352
+ # Copy templates. Greenfield init uses the conventional test/doc layout
2353
+ # (brownfield extract detects the project's real dirs instead — see
2354
+ # _ensure_bootstrap_codd_yaml).
2327
2355
  _render_template("codd.yaml.tmpl", codd_dir / "codd.yaml", {
2328
2356
  "project_name": project_name,
2329
2357
  "language": language,
2330
2358
  "source_dirs": _format_yaml_list(["src/"]),
2359
+ "test_dirs": _format_yaml_list(["tests/"]),
2360
+ "doc_dirs": _format_yaml_list(["docs/"]),
2331
2361
  "graph_path": f"{config_dir}/scan",
2332
2362
  })
2333
2363
  _render_template("gitignore.tmpl", codd_dir / ".gitignore", {})
@@ -10,7 +10,7 @@ import warnings
10
10
  from copy import deepcopy
11
11
  from datetime import datetime, timezone
12
12
  from pathlib import Path
13
- from typing import Any
13
+ from typing import Any, Callable
14
14
 
15
15
  import yaml
16
16
 
@@ -911,6 +911,19 @@ def _resolve_import_target(
911
911
  path_to_node: dict[Path, str],
912
912
  aliases: dict[str, list[str]],
913
913
  ) -> str | None:
914
+ # Java FQN specifiers (``com.x.Y`` / ``static com.x.Y.m`` / ``com.x.*`` /
915
+ # ``package com.x``) are dispatched by the IMPORTING file's ``.java`` suffix
916
+ # (DATA, not a ``language ==`` core branch) because their dotted shape
917
+ # otherwise collides with Python's project-rooted dotted resolution. Java
918
+ # types live under a source root (``src/main/java``), not the project root.
919
+ if file_path.suffix == ".java":
920
+ candidates = _java_import_candidates(import_ref, file_path, project_root, path_to_node)
921
+ for candidate in candidates:
922
+ resolved = _resolve_file_candidate(candidate, path_to_node)
923
+ if resolved:
924
+ return resolved
925
+ return None
926
+
914
927
  candidates: list[Path] = []
915
928
  if _is_js_relative_specifier(import_ref):
916
929
  # JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
@@ -981,6 +994,119 @@ def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
981
994
  return [(base / Path(*remainder.split("."))).resolve()]
982
995
 
983
996
 
997
+ #: Conventional Java/JVM source-root segment chains (Maven/Gradle). A type whose
998
+ #: FQN is ``com.x.Y`` lives at ``<root>/com/x/Y.java`` under one of these roots.
999
+ _JAVA_SOURCE_ROOT_SEGMENTS = (
1000
+ ("src", "main", "java"),
1001
+ ("src", "test", "java"),
1002
+ ("src", "main", "kotlin"),
1003
+ ("src", "test", "kotlin"),
1004
+ )
1005
+
1006
+
1007
+ def _java_source_roots(project_root: Path, path_to_node: dict[Path, str]) -> list[Path]:
1008
+ """Return candidate Java source roots (deepest-first), derived from DATA.
1009
+
1010
+ Built from the actual node file-set rather than hard-coded paths: every
1011
+ ``…/src/main/java`` (etc.) prefix that some node file sits under becomes a
1012
+ root, plus the project root itself as a last resort (flat layouts / default
1013
+ package). Deeper roots are tried first so ``src/main/java`` wins over the
1014
+ project root when both could match.
1015
+ """
1016
+ roots: dict[str, Path] = {}
1017
+ for file_path in path_to_node:
1018
+ parts = file_path.parts
1019
+ for segments in _JAVA_SOURCE_ROOT_SEGMENTS:
1020
+ idx = _find_segment_chain(parts, segments)
1021
+ if idx is not None:
1022
+ root = Path(*parts[: idx + len(segments)])
1023
+ roots[str(root)] = root
1024
+ ordered = sorted(roots.values(), key=lambda path: len(path.parts), reverse=True)
1025
+ ordered.append(project_root.resolve())
1026
+ return ordered
1027
+
1028
+
1029
+ def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int | None:
1030
+ """Return the start index where ``chain`` appears contiguously in ``parts``."""
1031
+ if not chain:
1032
+ return None
1033
+ for start in range(len(parts) - len(chain) + 1):
1034
+ if parts[start : start + len(chain)] == chain:
1035
+ return start
1036
+ return None
1037
+
1038
+
1039
+ def _java_import_candidates(
1040
+ import_ref: str,
1041
+ file_path: Path,
1042
+ project_root: Path,
1043
+ path_to_node: dict[Path, str],
1044
+ ) -> list[Path]:
1045
+ """Map a Java specifier to filesystem candidates under the source roots.
1046
+
1047
+ Handles the four shapes emitted by the Java specifier extractor:
1048
+
1049
+ * ``package com.x`` → the file's OWN package dir, so same-package implicit
1050
+ references (Java needs no import for siblings) yield edges to the package's
1051
+ other files (the caller skips the self-edge).
1052
+ * ``com.x.*`` (wildcard) → the package directory; the caller links to the
1053
+ in-package files found there (or skips cleanly when none are nodes).
1054
+ * ``static com.x.Y.m`` → the owning class file ``com/x/Y.java`` (member
1055
+ ``m`` stripped).
1056
+ * ``com.x.Y`` (normal) → ``com/x/Y.java``.
1057
+
1058
+ ``_resolve_file_candidate`` appends the real ``.java`` suffix once a directory
1059
+ candidate is produced, so package/wildcard dirs resolve to a sibling file.
1060
+ """
1061
+ roots = _java_source_roots(project_root, path_to_node)
1062
+
1063
+ if import_ref.startswith("package "):
1064
+ package = import_ref[len("package "):].strip()
1065
+ return _java_package_dir_candidates(package, roots)
1066
+
1067
+ if import_ref.endswith(".*"):
1068
+ package = import_ref[:-2].strip()
1069
+ return _java_package_dir_candidates(package, roots)
1070
+
1071
+ fqn = import_ref
1072
+ if fqn.startswith("static "):
1073
+ # ``static com.x.Y.member`` → owning class ``com.x.Y`` (drop the member).
1074
+ fqn = fqn[len("static "):].strip()
1075
+ parts = fqn.split(".")
1076
+ if len(parts) >= 2:
1077
+ fqn = ".".join(parts[:-1])
1078
+
1079
+ parts = [part for part in fqn.split(".") if part]
1080
+ if not parts:
1081
+ return []
1082
+ return [(root / Path(*parts)).resolve() for root in roots]
1083
+
1084
+
1085
+ def _java_package_dir_candidates(package: str, roots: list[Path]) -> list[Path]:
1086
+ parts = [part for part in package.split(".") if part]
1087
+ if not parts:
1088
+ return []
1089
+ candidates: list[Path] = []
1090
+ for root in roots:
1091
+ package_dir = (root / Path(*parts)).resolve()
1092
+ # List the package dir's in-tree files as candidates (same-package /
1093
+ # wildcard linkage). ``_resolve_file_candidate`` matches exact node paths,
1094
+ # so we hand it each existing ``.java`` file directly.
1095
+ for node_path in _sorted_java_dir_files(package_dir):
1096
+ candidates.append(node_path)
1097
+ return candidates
1098
+
1099
+
1100
+ def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
1101
+ if not package_dir.is_dir():
1102
+ return []
1103
+ return sorted(
1104
+ child.resolve()
1105
+ for child in package_dir.iterdir()
1106
+ if child.is_file() and child.suffix == ".java"
1107
+ )
1108
+
1109
+
984
1110
  def _infer_test_targets(
985
1111
  test_path: Path,
986
1112
  project_root: Path,
@@ -1025,30 +1151,89 @@ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
1025
1151
  return get_extractor("python", "source").extract_import_specifiers(content)
1026
1152
 
1027
1153
 
1154
+ # Regex fallback for Java ``import`` / ``package`` specifiers, used only when the
1155
+ # tree-sitter-java binding is unavailable (otherwise the registry backend's AST
1156
+ # extractor is preferred). Mirrors the SHAPES emitted by
1157
+ # ``treesitter._extract_java_import_specifiers`` (``static`` keyword + ``.*``
1158
+ # wildcard + ``package`` line preserved) so the Java resolver branch is agnostic
1159
+ # to which extractor produced the specifier.
1160
+ _JAVA_IMPORT_SPECIFIER_RE = re.compile(
1161
+ r"^\s*import\s+(static\s+)?([\w.]+(?:\.\*)?)\s*;",
1162
+ re.MULTILINE,
1163
+ )
1164
+ _JAVA_PACKAGE_SPECIFIER_RE = re.compile(r"^\s*package\s+([\w.]+)\s*;", re.MULTILINE)
1165
+
1166
+
1167
+ def _extract_java_import_specifiers(file_path: Path) -> list[str]:
1168
+ """Return raw Java ``import``/``package`` specifiers for DAG edge building.
1169
+
1170
+ Prefers the registry's Java ``source`` backend (tree-sitter-java) so the SAME
1171
+ extraction the scanner uses produces the DAG specifiers; degrades to a regex
1172
+ when the binding is absent. Either way the SHAPES (``static …`` / ``….*`` /
1173
+ ``package …``) match, so ``_resolve_import_target``'s Java branch — dispatched
1174
+ by the ``.java`` suffix (DATA), not a ``language ==`` core branch — resolves
1175
+ them identically. Mirrors ``_extract_python_import_specifiers``.
1176
+ """
1177
+
1178
+ from codd.parsing import get_extractor
1179
+
1180
+ content = file_path.read_text(encoding="utf-8", errors="ignore")
1181
+ specifiers = get_extractor("java", "source").extract_import_specifiers(content)
1182
+ if specifiers:
1183
+ return specifiers
1184
+ # Fallback: tree-sitter-java unavailable → RegexExtractor returned []. Recover
1185
+ # the same specifier shapes from a line regex so Java edges still form.
1186
+ fallback: list[str] = []
1187
+ package_match = _JAVA_PACKAGE_SPECIFIER_RE.search(content)
1188
+ if package_match:
1189
+ fallback.append(f"package {package_match.group(1)}")
1190
+ for static_kw, name in _JAVA_IMPORT_SPECIFIER_RE.findall(content):
1191
+ if name.endswith(".*"):
1192
+ fallback.append(name)
1193
+ elif static_kw:
1194
+ fallback.append(f"static {name}")
1195
+ else:
1196
+ fallback.append(name)
1197
+ return fallback
1198
+
1199
+
1200
+ #: Suffix → raw-specifier extractor (DATA dispatch). A source file whose language
1201
+ #: carries its intra-tree dependency graph in DOTTED specifiers (Python modules,
1202
+ #: Java FQNs) resolves edges from these, instead of the builder's quoted-string
1203
+ #: ``extract_imports`` seam (JS/TS ``from '…'`` / ``require('…')``). Adding a
1204
+ #: language here is pure data — no core ``if language ==`` branch.
1205
+ _SUFFIX_SPECIFIER_EXTRACTORS: dict[str, "Callable[[Path], list[str]]"] = {
1206
+ ".py": _extract_python_import_specifiers,
1207
+ ".java": _extract_java_import_specifiers,
1208
+ }
1209
+
1210
+
1028
1211
  def _extract_impl_imports(file_path: Path) -> list[str]:
1029
1212
  """Return raw import specifiers for an implementation file.
1030
1213
 
1031
- Python impl files go through AST-based specifier extraction (the same path
1032
- test files use) so impl→impl import edges form for Python — the core of the
1033
- fix. Every other language keeps the existing quoted-specifier extractor
1034
- (``extract_imports``: JS/TS ``from '…'`` / ``require('…')``), unchanged.
1035
- Dispatch is by file suffix (DATA), mirroring ``_extract_test_imports``.
1214
+ Python and Java impl files go through their registry-backed specifier
1215
+ extractors (the same path test files use) so impl→impl import edges form for
1216
+ them — the core of the fix. Every other language keeps the existing
1217
+ quoted-specifier extractor (``extract_imports``: JS/TS ``from '…'`` /
1218
+ ``require('…')``), unchanged. Dispatch is by file suffix (DATA).
1036
1219
  """
1037
1220
 
1038
- if file_path.suffix == ".py":
1039
- return _extract_python_import_specifiers(file_path)
1221
+ extractor = _SUFFIX_SPECIFIER_EXTRACTORS.get(file_path.suffix)
1222
+ if extractor is not None:
1223
+ return extractor(file_path)
1040
1224
  return extract_imports(file_path)
1041
1225
 
1042
1226
 
1043
1227
  def _extract_test_imports(file_path: Path) -> list[str]:
1044
1228
  imports = extract_imports(file_path)
1045
- if file_path.suffix != ".py":
1229
+ extractor = _SUFFIX_SPECIFIER_EXTRACTORS.get(file_path.suffix)
1230
+ if extractor is None:
1046
1231
  return imports
1047
1232
 
1048
- # AST-based Python specifiers (relative imports included). Combined with the
1049
- # quoted-specifier pass above so a polyglot test file (e.g. a ``.py`` test
1050
- # that also embeds a JS ``require('…')`` literal in a string) keeps both.
1051
- return [*imports, *_extract_python_import_specifiers(file_path)]
1233
+ # Registry-backed dotted specifiers (Python relative imports / Java FQNs)
1234
+ # combined with the quoted-specifier pass above so a polyglot test file keeps
1235
+ # both seams' results.
1236
+ return [*imports, *extractor(file_path)]
1052
1237
 
1053
1238
 
1054
1239
  def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
@@ -1143,6 +1328,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
1143
1328
  return candidates
1144
1329
 
1145
1330
 
1331
+ _TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
1332
+
1333
+
1146
1334
  def _is_test_file(file_path: Path, project_root: Path) -> bool:
1147
1335
  relative_parts = _relative_id(file_path, project_root).split("/")
1148
1336
  name = file_path.name
@@ -1153,9 +1341,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
1153
1341
  return True
1154
1342
  if file_path.suffix == ".bats":
1155
1343
  return True
1156
- if file_path.suffix == ".py" and any(part in {"tests", "test"} for part in relative_parts[:-1]):
1157
- return name.startswith("test_") or name.endswith("_test.py")
1158
- return False
1344
+ in_test_dir = any(part in _TEST_DIR_NAMES for part in relative_parts[:-1])
1345
+ if file_path.suffix == ".py":
1346
+ # Python keeps the stricter pytest/unittest convention even under a test
1347
+ # directory (``test_*.py`` / ``*_test.py``) to avoid pulling fixtures.
1348
+ if in_test_dir:
1349
+ return name.startswith("test_") or name.endswith("_test.py")
1350
+ return False
1351
+ # Other languages: a source file living under a conventional test directory
1352
+ # is a test even without a ``.test.`` infix — e.g. Mocha/Tape ``test/app.js``
1353
+ # (Express) or ``spec/foo.js``. The caller already gates on ``test_suffixes``
1354
+ # and the configured ``test_file_patterns`` (scoped to the project's test
1355
+ # dirs), so this never sweeps in arbitrary source files.
1356
+ return in_test_dir
1159
1357
 
1160
1358
 
1161
1359
  def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
@@ -0,0 +1,211 @@
1
+ """Transitive closure DAG completeness check."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections import deque
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ from codd.dag.checks import register_dag_check
11
+
12
+
13
+ @dataclass
14
+ class TransitiveClosureResult:
15
+ check_name: str = "transitive_closure"
16
+ severity: str = "amber"
17
+ unreachable_nodes: list[str] = field(default_factory=list)
18
+ common_node_count: int = 0
19
+ passed: bool = True
20
+ # ``status``/``skipped``/``checked_count`` close a vacuous-pass hole: an empty
21
+ # DAG (or one whose every node is ``common`` and therefore exempt from
22
+ # reachability) used to return a green PASS having examined zero nodes.
23
+ # ``checked_count`` is the number of non-common nodes whose reachability was
24
+ # actually evaluated; when it is 0 the run is a SKIP, not a clean pass.
25
+ status: str = "pass"
26
+ skipped: bool = False
27
+ checked_count: int = 0
28
+
29
+
30
+ # Edge kinds that represent an in-project source-import dependency
31
+ # (importer -> imported). Used to identify *code-entry roots*: source nodes that
32
+ # nothing in the project imports. This is a structural classification of edges,
33
+ # not a language/framework branch.
34
+ _IMPORT_EDGE_KINDS = frozenset({"imports"})
35
+
36
+ # Node kinds that are NOT first-class source nodes for entry-root detection:
37
+ # design docs are handled by their own root rule, and ``common`` nodes are shared
38
+ # infrastructure exempt from reachability. Anything else (``impl_file`` and any
39
+ # future source kind) is treated as a source node — no per-language literal.
40
+ _NON_SOURCE_KINDS = frozenset({"design_doc", "common"})
41
+
42
+
43
+ @register_dag_check("transitive_closure")
44
+ class TransitiveClosureCheck:
45
+ """Report unreachable nodes without blocking deploy.
46
+
47
+ A node is *reachable* if it can be reached from **any entry root**:
48
+
49
+ - **design_doc roots** — ``design_doc`` nodes with no incoming edge (the
50
+ classic "every artifact descends from a design document" model); and
51
+ - **code-entry roots** — source nodes (everything that is neither a
52
+ ``design_doc`` nor a ``common`` node) with no incoming in-project *import*
53
+ edge, i.e. the package's public entry points (e.g. a package
54
+ ``__init__`` or a CLI ``__main__`` that nothing else imports).
55
+
56
+ Seeding from the *union* of these makes reachability meaningful on doc-less
57
+ BROWNFIELD projects (raw external code with zero design docs but a fully
58
+ connected import graph) while leaving doc-rooted projects unchanged:
59
+ code-entry roots are purely additive. Only nodes unreachable from ALL entries
60
+ are flagged — genuine orphans.
61
+
62
+ Entry-root detection is structural (incoming-edge analysis on import-kind
63
+ edges), never a ``language ==`` branch.
64
+
65
+ Cycle / no-entry fallback: if a project has source nodes but none qualify as
66
+ a code-entry root (every source node has an in-project importer — a pure
67
+ cycle), reachability falls back to seeding from *all* source nodes for that
68
+ project, so connectivity is still measured rather than reported as a false
69
+ "everything unreachable". Cycles are traversed safely (visited-set guard).
70
+
71
+ Nodes with ``kind == "common"`` (shared infrastructure declared via
72
+ ``common_node_patterns`` or frontmatter ``node_type: common``) remain exempt
73
+ from unreachable detection. They participate in the DAG so change-impact
74
+ analysis still sees them, but they do not need to be the descendant of a
75
+ single design document.
76
+ """
77
+
78
+ def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
79
+ self.dag = dag
80
+ self.project_root = project_root
81
+ self.settings = settings or {}
82
+
83
+ def run(
84
+ self,
85
+ dag=None,
86
+ project_root: Path | None = None,
87
+ settings: dict[str, Any] | None = None,
88
+ ) -> TransitiveClosureResult:
89
+ dag = dag or self.dag
90
+ if dag is None or not dag.nodes:
91
+ # No nodes at all → reachability examined nothing → SKIP (not a
92
+ # vacuous green PASS).
93
+ return TransitiveClosureResult(
94
+ status="skip",
95
+ skipped=True,
96
+ checked_count=0,
97
+ )
98
+
99
+ to_ids = {edge.to_id for edge in dag.edges}
100
+ design_roots = [
101
+ node.id
102
+ for node in dag.nodes.values()
103
+ if node.kind == "design_doc" and node.id not in to_ids
104
+ ]
105
+ code_roots = self._code_entry_roots(dag)
106
+
107
+ # Reachable from ANY entry: design-doc roots OR code-entry roots. The
108
+ # union keeps doc-rooted projects unchanged (design roots still seed) and
109
+ # makes doc-less brownfield projects measurable (code roots seed the
110
+ # connected impl graph).
111
+ roots = list(dict.fromkeys([*design_roots, *code_roots]))
112
+
113
+ visited = self._reachable_from(dag, roots)
114
+ common_count = sum(
115
+ 1 for node in dag.nodes.values() if node.kind == "common"
116
+ )
117
+ # Common nodes are exempt from unreachable detection, so the number of
118
+ # nodes whose reachability is actually evaluated is the non-common set.
119
+ checked = sum(1 for node in dag.nodes.values() if node.kind != "common")
120
+ unreachable = [
121
+ node_id
122
+ for node_id, node in dag.nodes.items()
123
+ if node_id not in visited and node.kind != "common"
124
+ ]
125
+
126
+ if checked == 0:
127
+ # Every node is exempt (all ``common``): reachability examined nothing.
128
+ # A clean PASS here is a vacuous false-green → SKIP instead.
129
+ return TransitiveClosureResult(
130
+ unreachable_nodes=[],
131
+ common_node_count=common_count,
132
+ passed=True,
133
+ status="skip",
134
+ skipped=True,
135
+ checked_count=0,
136
+ )
137
+
138
+ return TransitiveClosureResult(
139
+ unreachable_nodes=unreachable,
140
+ common_node_count=common_count,
141
+ passed=True,
142
+ status="pass",
143
+ skipped=False,
144
+ checked_count=checked,
145
+ )
146
+
147
+ def _code_entry_roots(self, dag) -> list[str]:
148
+ """Public entry points of the import graph (heads nothing imports).
149
+
150
+ A *source node* is any node that is neither a ``design_doc`` (handled by
151
+ its own root rule) nor a ``common`` node (exempt infrastructure). A source
152
+ node is a *code-entry root* when it **participates in the import graph as a
153
+ head**: it has at least one outgoing in-project import edge (it imports
154
+ something) AND no incoming import edge (nothing imports it). These are the
155
+ package's public entry points (e.g. ``__init__`` / ``__main__``).
156
+
157
+ Requiring an *outgoing* import edge is what preserves no-false-green: a
158
+ node with zero import edges (isolated -- imported by nothing and importing
159
+ nothing) is a genuine orphan, NOT an entry root, and therefore stays
160
+ flagged. Only nodes that actually anchor an import chain seed reachability.
161
+
162
+ Fallback (pure cycle / no head): if no source node qualifies as a head but
163
+ some source nodes still *participate* in the import graph (a cycle where
164
+ every node has an importer), seed from all participating source nodes so
165
+ connectivity is still measured instead of a false "everything
166
+ unreachable". Isolated orphans (no import edges) are never seeded and stay
167
+ flagged even in the fallback.
168
+ """
169
+ source_ids = {
170
+ node.id
171
+ for node in dag.nodes.values()
172
+ if node.kind not in _NON_SOURCE_KINDS
173
+ }
174
+ if not source_ids:
175
+ return []
176
+
177
+ import_to: set[str] = set()
178
+ import_from: set[str] = set()
179
+ for edge in dag.edges:
180
+ if edge.kind in _IMPORT_EDGE_KINDS:
181
+ import_to.add(edge.to_id)
182
+ import_from.add(edge.from_id)
183
+
184
+ # Heads: import something in-project, imported by nothing in-project.
185
+ entry_roots = [
186
+ nid
187
+ for nid in source_ids
188
+ if nid in import_from and nid not in import_to
189
+ ]
190
+ if entry_roots:
191
+ return entry_roots
192
+
193
+ # No clean head (pure cycle): seed from source nodes that participate in
194
+ # the import graph at all, so connectivity is still measured. Nodes with
195
+ # no import edges remain genuine orphans (never seeded here).
196
+ return [nid for nid in source_ids if nid in import_to or nid in import_from]
197
+
198
+ def _reachable_from(self, dag, roots: list[str]) -> set[str]:
199
+ visited: set[str] = set()
200
+ queue = deque(roots)
201
+
202
+ while queue:
203
+ current = queue.popleft()
204
+ if current in visited:
205
+ continue
206
+ visited.add(current)
207
+ for edge in dag.edges:
208
+ if edge.from_id == current and edge.to_id not in visited:
209
+ queue.append(edge.to_id)
210
+
211
+ return visited
@@ -57,6 +57,60 @@ CONFIG_FILES = [
57
57
  # IaC patterns
58
58
  IAC_EXTENSIONS = {".bicep", ".bicepparam", ".tf", ".tfvars", ".hcl"}
59
59
 
60
+
61
+ def ai_command_has_tools(ai_command: str) -> bool:
62
+ """Return whether ``ai_command`` grants the model file/shell tools.
63
+
64
+ The extract prompt's "Extraction Procedure" enumerates the codebase via bash
65
+ (``find``/``ls``/``rg``). That only works when the AI CLI can actually shell
66
+ out. The default ``ai_command`` disables tools (``--tools ""``), and agentic
67
+ CLIs are hardened to read-only from an empty workspace elsewhere — so the
68
+ procedural bash framing pushes the model into agentic mode and it stubs or
69
+ hangs. We therefore treat NO TOOLS as the safe default and require an
70
+ explicit grant to keep the tool-enabled path.
71
+
72
+ Tools are considered AVAILABLE only when a ``--tools``/``--allowedTools``
73
+ flag carries a non-empty value. ``--tools ""`` (or the flag absent) → no
74
+ tools. Unparseable commands fail closed to no-tools (context-only is always
75
+ correct because the full PROJECT CONTEXT is embedded in the prompt).
76
+ """
77
+ import shlex
78
+
79
+ try:
80
+ parts = shlex.split(ai_command)
81
+ except ValueError:
82
+ return False
83
+
84
+ tool_flags = {"--tools", "--allowedTools", "--allowed-tools"}
85
+ for i, part in enumerate(parts):
86
+ flag, sep, inline = part.partition("=")
87
+ if flag in tool_flags:
88
+ value = inline if sep else (parts[i + 1] if i + 1 < len(parts) else "")
89
+ if value.strip():
90
+ return True
91
+ return False
92
+
93
+
94
+ # Prepended to the prompt when the AI CLI has no tools: it overrides the
95
+ # template's bash "Extraction Procedure" so the model extracts from the embedded
96
+ # PROJECT CONTEXT instead of trying to shell out (which it cannot do).
97
+ _NO_TOOLS_DIRECTIVE = """# ═══ EXECUTION MODE: NO TOOLS (context-only) ═══
98
+
99
+ You are running WITHOUT shell or file-system tools. Do NOT call any tool, do NOT
100
+ run bash/`find`/`ls`/`rg`/`cat`, and do NOT attempt to read files from disk.
101
+
102
+ The COMPLETE pre-scanned codebase — the directory tree plus the full contents of
103
+ every relevant source, config, IaC, and test file — is embedded verbatim under
104
+ "PROJECT CONTEXT (pre-scanned)" further down this prompt. That embedded context
105
+ is your ONLY source of truth.
106
+
107
+ When the "Extraction Procedure" below shows ```bash``` enumeration commands,
108
+ treat them as a DESCRIPTION of what to look for, NOT as commands to execute.
109
+ Instead, derive the same information by reading the embedded file contents
110
+ directly. Produce the full output document set in one response from that context.
111
+
112
+ """
113
+
60
114
  # Schema file patterns
61
115
  SCHEMA_PATTERNS = [
62
116
  "prisma/schema.prisma", "db/schema.rb", "alembic/versions",
@@ -360,10 +414,20 @@ def pre_scan(project_root: Path) -> PreScanResult:
360
414
  # Phase 2: AI prompt building
361
415
  # ═══════════════════════════════════════════════════════════
362
416
 
363
- def _build_prompt(scan: PreScanResult) -> str:
364
- """Build the AI prompt from pre-scan results + extract template."""
417
+ def _build_prompt(scan: PreScanResult, *, tools_available: bool = False) -> str:
418
+ """Build the AI prompt from pre-scan results + extract template.
419
+
420
+ ``tools_available`` reflects whether the AI CLI can shell out (see
421
+ :func:`ai_command_has_tools`). When False (the default for ``--tools ""``),
422
+ a NO-TOOLS directive is prepended so the model extracts from the embedded
423
+ PROJECT CONTEXT instead of trying to run the template's bash procedure.
424
+ """
365
425
  sections: list[str] = []
366
426
 
427
+ # No-tools mode: override the template's bash procedure up front.
428
+ if not tools_available:
429
+ sections.append(_NO_TOOLS_DIRECTIVE)
430
+
367
431
  # Load prompt template
368
432
  if PROMPT_TEMPLATE_FILE.exists():
369
433
  template = PROMPT_TEMPLATE_FILE.read_text(encoding="utf-8")
@@ -810,6 +874,10 @@ def run_extract_ai(
810
874
  # Phase 1: Pre-scan
811
875
  scan = pre_scan(project_root)
812
876
 
877
+ # Whether the AI CLI can shell out. The default ``--tools ""`` disables
878
+ # tools, so the prompt must NOT lean on its bash enumeration procedure.
879
+ tools_available = ai_command_has_tools(ai_command)
880
+
813
881
  # Phase 2: Build prompt (custom or baseline)
814
882
  if prompt_file:
815
883
  custom_path = Path(prompt_file)
@@ -819,10 +887,10 @@ def run_extract_ai(
819
887
  # Temporarily swap template for custom prompt
820
888
  import codd.extract_ai as _self
821
889
  _self.PROMPT_TEMPLATE_FILE = custom_path
822
- prompt = _build_prompt(scan)
890
+ prompt = _build_prompt(scan, tools_available=tools_available)
823
891
  _self.PROMPT_TEMPLATE_FILE = original_template
824
892
  else:
825
- prompt = _build_prompt(scan)
893
+ prompt = _build_prompt(scan, tools_available=tools_available)
826
894
 
827
895
  # Phase 3: AI invocation
828
896
  raw_output = _invoke_ai_command(ai_command, prompt)