scaffold-ca-python 0.1.3__tar.gz → 0.1.4__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 (321) hide show
  1. scaffold_ca_python-0.1.4/.release-please-manifest.json +3 -0
  2. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/CHANGELOG.md +7 -0
  3. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/PKG-INFO +14 -14
  4. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/README.md +11 -11
  5. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/pyproject.toml +8 -8
  6. scaffold_ca_python-0.1.4/specs/017-pep8-naming-validation/contracts/name-validation.md +103 -0
  7. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md +4 -4
  8. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md +1 -1
  9. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/delete_module.py +6 -21
  10. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_driven_adapter.py +11 -6
  11. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_entry_point.py +7 -5
  12. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_helper.py +4 -4
  13. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_model.py +4 -4
  14. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_project.py +1 -1
  15. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_use_case.py +6 -4
  16. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/module_builder.py +36 -3
  17. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/name_utils.py +14 -0
  18. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/pyproject_writer.py +84 -1
  19. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py +5 -3
  20. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_secrets.py +2 -2
  21. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_agent.py +2 -2
  22. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_mcp.py +7 -7
  23. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_restapi.py +8 -8
  24. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2 +5 -4
  25. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2 +6 -3
  26. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2 +2 -2
  27. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2 +2 -2
  28. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2 +0 -2
  29. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2 +2 -2
  30. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2 +3 -3
  31. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2 +1 -1
  32. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2 +2 -2
  33. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/pyproject_toml.jinja2 +15 -8
  34. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_delete_module.py +10 -4
  35. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_dry_run_checksum.py +2 -2
  36. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_driven_adapter.py +29 -8
  37. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_helper.py +21 -15
  38. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_model.py +9 -3
  39. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_use_case.py +17 -11
  40. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_workflow.py +3 -3
  41. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_name_utils.py +29 -0
  42. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_pyproject_writer.py +118 -0
  43. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_rest_consumer.py +30 -5
  44. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_secrets.py +1 -1
  45. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_agent.py +1 -1
  46. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_mcp.py +5 -5
  47. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_restapi.py +4 -4
  48. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_module_builder.py +101 -0
  49. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_project_templates.py +19 -0
  50. scaffold_ca_python-0.1.4/uv.lock +789 -0
  51. scaffold_ca_python-0.1.3/.release-please-manifest.json +0 -3
  52. scaffold_ca_python-0.1.3/specs/017-pep8-naming-validation/contracts/name-validation.md +0 -65
  53. scaffold_ca_python-0.1.3/uv.lock +0 -666
  54. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/copilot-instructions.md +0 -0
  55. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.analyze.agent.md +0 -0
  56. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.checklist.agent.md +0 -0
  57. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.clarify.agent.md +0 -0
  58. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.constitution.agent.md +0 -0
  59. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.implement.agent.md +0 -0
  60. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.plan.agent.md +0 -0
  61. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.specify.agent.md +0 -0
  62. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.tasks.agent.md +0 -0
  63. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.taskstoissues.agent.md +0 -0
  64. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/issue_template.md +0 -0
  65. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.analyze.prompt.md +0 -0
  66. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.checklist.prompt.md +0 -0
  67. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.clarify.prompt.md +0 -0
  68. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.constitution.prompt.md +0 -0
  69. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.implement.prompt.md +0 -0
  70. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.plan.prompt.md +0 -0
  71. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.specify.prompt.md +0 -0
  72. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.tasks.prompt.md +0 -0
  73. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
  74. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/pull_request_template.md +0 -0
  75. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/build.yml +0 -0
  76. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/dependency-review.yml +0 -0
  77. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/publish.yml +0 -0
  78. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/release-please.yml +0 -0
  79. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/scorecards-analysis.yml +0 -0
  80. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/secret-scanner.yml +0 -0
  81. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.gitignore +0 -0
  82. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.pre-commit-config.yaml +0 -0
  83. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.python-version +0 -0
  84. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/init-options.json +0 -0
  85. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/memory/constitution.md +0 -0
  86. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  87. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/common.sh +0 -0
  88. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/create-new-feature.sh +0 -0
  89. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/setup-plan.sh +0 -0
  90. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/update-agent-context.sh +0 -0
  91. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/agent-file-template.md +0 -0
  92. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/checklist-template.md +0 -0
  93. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/constitution-template.md +0 -0
  94. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/plan-template.md +0 -0
  95. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/spec-template.md +0 -0
  96. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/tasks-template.md +0 -0
  97. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/LICENSE +0 -0
  98. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/SECURITY.md +0 -0
  99. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/release-please-config.json +0 -0
  100. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/checklists/requirements.md +0 -0
  101. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/ca.md +0 -0
  102. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/dm.md +0 -0
  103. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gda.md +0 -0
  104. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gep.md +0 -0
  105. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gh.md +0 -0
  106. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gm.md +0 -0
  107. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gpipe.md +0 -0
  108. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/guc.md +0 -0
  109. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/up.md +0 -0
  110. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/vs.md +0 -0
  111. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/data-model.md +0 -0
  112. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/plan.md +0 -0
  113. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/quickstart.md +0 -0
  114. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/research.md +0 -0
  115. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/spec.md +0 -0
  116. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/tasks.md +0 -0
  117. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/checklists/requirements.md +0 -0
  118. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/plan.md +0 -0
  119. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/spec.md +0 -0
  120. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/tasks.md +0 -0
  121. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/checklists/requirements.md +0 -0
  122. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/clean-architecture.md +0 -0
  123. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gda.md +0 -0
  124. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gep.md +0 -0
  125. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gpipe.md +0 -0
  126. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/data-model.md +0 -0
  127. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/plan.md +0 -0
  128. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/quickstart.md +0 -0
  129. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/research.md +0 -0
  130. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/spec.md +0 -0
  131. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/tasks.md +0 -0
  132. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/checklists/requirements.md +0 -0
  133. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/contracts/gep.md +0 -0
  134. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/data-model.md +0 -0
  135. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/plan.md +0 -0
  136. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/quickstart.md +0 -0
  137. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/research.md +0 -0
  138. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/spec.md +0 -0
  139. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/tasks.md +0 -0
  140. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/checklists/requirements.md +0 -0
  141. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/contracts/gep-restapi.md +0 -0
  142. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/data-model.md +0 -0
  143. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/plan.md +0 -0
  144. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/quickstart.md +0 -0
  145. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/research.md +0 -0
  146. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/spec.md +0 -0
  147. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/tasks.md +0 -0
  148. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/data-model.md +0 -0
  149. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/plan.md +0 -0
  150. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/quickstart.md +0 -0
  151. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/research.md +0 -0
  152. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/spec.md +0 -0
  153. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/tasks.md +0 -0
  154. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/checklists/requirements.md +0 -0
  155. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/data-model.md +0 -0
  156. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/plan.md +0 -0
  157. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/quickstart.md +0 -0
  158. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/research.md +0 -0
  159. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/spec.md +0 -0
  160. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/tasks.md +0 -0
  161. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/checklists/requirements.md +0 -0
  162. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/data-model.md +0 -0
  163. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/plan.md +0 -0
  164. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/quickstart.md +0 -0
  165. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/research.md +0 -0
  166. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/spec.md +0 -0
  167. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/tasks.md +0 -0
  168. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/checklists/requirements.md +0 -0
  169. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/data-model.md +0 -0
  170. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/plan.md +0 -0
  171. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/quickstart.md +0 -0
  172. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/research.md +0 -0
  173. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/spec.md +0 -0
  174. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/tasks.md +0 -0
  175. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/checklists/requirements.md +0 -0
  176. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/data-model.md +0 -0
  177. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/plan.md +0 -0
  178. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/research.md +0 -0
  179. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/spec.md +0 -0
  180. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/tasks.md +0 -0
  181. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/checklists/requirements.md +0 -0
  182. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/data-model.md +0 -0
  183. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/plan.md +0 -0
  184. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/research.md +0 -0
  185. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/spec.md +0 -0
  186. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/tasks.md +0 -0
  187. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/contracts/gep-mcp.md +0 -0
  188. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/data-model.md +0 -0
  189. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/plan.md +0 -0
  190. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/research.md +0 -0
  191. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/spec.md +0 -0
  192. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/tasks.md +0 -0
  193. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/checklists/requirements.md +0 -0
  194. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/contracts/readme-outline.md +0 -0
  195. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/plan.md +0 -0
  196. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/quickstart.md +0 -0
  197. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/research.md +0 -0
  198. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/spec.md +0 -0
  199. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/__init__.py +0 -0
  200. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/cli.py +0 -0
  201. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/__init__.py +0 -0
  202. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_pipeline.py +0 -0
  203. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/update_project.py +0 -0
  204. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/validate_structure.py +0 -0
  205. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/__init__.py +0 -0
  206. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/file_writer.py +0 -0
  207. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/project_detector.py +0 -0
  208. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/structure_validator.py +0 -0
  209. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/template_renderer.py +0 -0
  210. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/__init__.py +0 -0
  211. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/__init__.py +0 -0
  212. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_generic.py +0 -0
  213. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/__init__.py +0 -0
  214. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_generic.py +0 -0
  215. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/__init__.py +0 -0
  216. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/delete_module_factory.py +0 -0
  217. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/helper_factory.py +0 -0
  218. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/model_factory.py +0 -0
  219. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/use_case_factory.py +0 -0
  220. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/__init__.py +0 -0
  221. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/context.py +0 -0
  222. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/file_operation.py +0 -0
  223. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/layer.py +0 -0
  224. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/violation.py +0 -0
  225. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/__init__.py +0 -0
  226. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2 +0 -0
  227. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2 +0 -0
  228. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2 +0 -0
  229. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2 +0 -0
  230. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2 +0 -0
  231. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2 +1 -1
  232. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2 +0 -0
  233. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2 +0 -0
  234. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2 +0 -0
  235. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2 +0 -0
  236. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/card.py.jinja2 +0 -0
  237. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2 +0 -0
  238. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2 +0 -0
  239. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2 +0 -0
  240. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2 +0 -0
  241. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2 +0 -0
  242. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2 +0 -0
  243. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2 +0 -0
  244. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2 +1 -1
  245. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2 +0 -0
  246. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2 +0 -0
  247. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2 +0 -0
  248. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2 +0 -0
  249. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2 +1 -1
  250. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2 +0 -0
  251. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2 +0 -0
  252. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2 +0 -0
  253. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2 +0 -0
  254. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2 +0 -0
  255. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2 +0 -0
  256. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2 +0 -0
  257. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/__init__.py.jinja2 +0 -0
  258. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/helper.py.jinja2 +0 -0
  259. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/test_helper.py.jinja2 +0 -0
  260. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/model.py.jinja2 +0 -0
  261. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/test_model.py.jinja2 +0 -0
  262. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2 +0 -0
  263. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +0 -0
  264. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/README.jinja2 +0 -0
  265. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/__init__.py.jinja2 +0 -0
  266. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/config.py.jinja2 +0 -0
  267. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/container.py.jinja2 +1 -1
  268. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2 +0 -0
  269. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerfile.jinja2 +0 -0
  270. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerignore.jinja2 +0 -0
  271. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/gitignore.jinja2 +0 -0
  272. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/layer_init.jinja2 +0 -0
  273. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/main.py.jinja2 +0 -0
  274. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/mypy_ini.jinja2 +0 -0
  275. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/python_version.jinja2 +0 -0
  276. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/test_use_case.py.jinja2 +0 -0
  277. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/use_case.py.jinja2 +0 -0
  278. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/__init__.py +0 -0
  279. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/__init__.py +0 -0
  280. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_cli.py +0 -0
  281. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_entry_point.py +0 -0
  282. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_pipeline.py +0 -0
  283. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_project.py +0 -0
  284. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_performance.py +0 -0
  285. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_update_project.py +0 -0
  286. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_validate_structure.py +0 -0
  287. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/conftest.py +0 -0
  288. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/__init__.py +0 -0
  289. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_file_writer.py +0 -0
  290. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_project_detector.py +0 -0
  291. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_structure_validator.py +0 -0
  292. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_template_renderer.py +0 -0
  293. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/__init__.py +0 -0
  294. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/__init__.py +0 -0
  295. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_generic.py +0 -0
  296. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/__init__.py +0 -0
  297. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_generic.py +0 -0
  298. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/fixtures/dry_run_baseline.json +0 -0
  299. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/__init__.py +0 -0
  300. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_delete_module_factory.py +0 -0
  301. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_helper_factory.py +0 -0
  302. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_model_factory.py +0 -0
  303. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_use_case_factory.py +0 -0
  304. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_dry_run_parity.py +0 -0
  305. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_extensibility.py +0 -0
  306. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_registry.py +0 -0
  307. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/__init__.py +0 -0
  308. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_context.py +0 -0
  309. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_file_operation.py +0 -0
  310. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_layer.py +0 -0
  311. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_violation.py +0 -0
  312. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/__init__.py +0 -0
  313. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_di_config_templates.py +0 -0
  314. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_docker_templates.py +0 -0
  315. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_driven_adapter_templates.py +0 -0
  316. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_entry_point_templates.py +0 -0
  317. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_entrypoint_main_templates.py +0 -0
  318. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_helper_templates.py +0 -0
  319. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_model_templates.py +0 -0
  320. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_pipeline_templates.py +0 -0
  321. {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_use_case_templates.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.4"
3
+ }
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.4](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.3...v0.1.4) (2026-09-21)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **scaffold:** resolve template generation bugs ([8cd012a](https://github.com/bancolombia/scaffold-clean-architecture-py/commit/8cd012a18eeb2b472875e545dbdbd42b087b13b1))
9
+
3
10
  ## [0.1.3](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.2...v0.1.3) (2026-09-17)
4
11
 
5
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scaffold-ca-python
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Scaffolder to generate Clean Architecture apps
5
5
  Project-URL: Homepage, https://github.com/bancolombia/scaffold-clean-architecture-py
6
6
  Project-URL: Repository, https://github.com/bancolombia/scaffold-clean-architecture-py
@@ -22,11 +22,11 @@ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.13
24
24
  Requires-Dist: jinja2~=3.1.6
25
- Requires-Dist: pydantic~=2.13.3
25
+ Requires-Dist: pydantic~=2.13.5
26
26
  Requires-Dist: pyyaml~=6.0.3
27
27
  Requires-Dist: rich~=15.0.0
28
28
  Requires-Dist: tomli-w~=1.2.0
29
- Requires-Dist: typer~=0.25.1
29
+ Requires-Dist: typer~=0.27.2
30
30
  Description-Content-Type: text/markdown
31
31
 
32
32
  # scaffold-ca-python
@@ -80,7 +80,7 @@ cd my-app
80
80
  3. Generate a domain model.
81
81
 
82
82
  ```bash
83
- scaffold gm --name Order
83
+ scaffold gm --name order
84
84
  ```
85
85
 
86
86
  4. Validate the project structure.
@@ -108,11 +108,11 @@ scaffold ca --name my-project --dry-run
108
108
  Scaffold a Pydantic v2 domain model and its test stub.
109
109
 
110
110
  ```bash
111
- scaffold gm --name Order
111
+ scaffold gm --name order
112
112
  ```
113
113
 
114
114
  ```bash
115
- scaffold gm --name Order --dry-run
115
+ scaffold gm --name order --dry-run
116
116
  ```
117
117
 
118
118
  ### scaffold guc
@@ -120,11 +120,11 @@ scaffold gm --name Order --dry-run
120
120
  Scaffold a use case in `domain/usecase/`.
121
121
 
122
122
  ```bash
123
- scaffold guc --name CreateOrder
123
+ scaffold guc --name create_order
124
124
  ```
125
125
 
126
126
  ```bash
127
- scaffold guc --name CreateOrder --dry-run
127
+ scaffold guc --name create_order --dry-run
128
128
  ```
129
129
 
130
130
  ### scaffold gda
@@ -136,7 +136,7 @@ scaffold gda --type rest-consumer
136
136
  ```
137
137
 
138
138
  ```bash
139
- scaffold gda --type generic --name MyAdapter --dry-run
139
+ scaffold gda --type generic --name my_adapter --dry-run
140
140
  ```
141
141
 
142
142
  ### scaffold gep
@@ -156,11 +156,11 @@ scaffold gep --type mcp --with-resources --with-prompts --dry-run
156
156
  Scaffold a helper utility module and its test stub.
157
157
 
158
158
  ```bash
159
- scaffold gh --name JsonParser
159
+ scaffold gh --name json_parser
160
160
  ```
161
161
 
162
162
  ```bash
163
- scaffold gh --name JsonParser --dry-run
163
+ scaffold gh --name json_parser --dry-run
164
164
  ```
165
165
 
166
166
  ### scaffold gpipe
@@ -192,11 +192,11 @@ scaffold vs --dry-run
192
192
  Delete a previously generated module and its mirrored test file.
193
193
 
194
194
  ```bash
195
- scaffold dm --name Order
195
+ scaffold dm --name order
196
196
  ```
197
197
 
198
198
  ```bash
199
- scaffold dm --name Order --dry-run
199
+ scaffold dm --name order --dry-run
200
200
  ```
201
201
 
202
202
  ### scaffold up
@@ -217,7 +217,7 @@ scaffold update-project --dry-run
217
217
  |----------------|---------|------|
218
218
  | Python | >=3.13 | Runtime |
219
219
  | uv | latest | Dependency management, build, and publish |
220
- | Typer | >=0.25.1 | CLI framework |
220
+ | Typer | >=0.27.2 | CLI framework |
221
221
  | Rich | >=15.0.0 | Terminal output formatting |
222
222
  | Jinja2 | >=3.1 | Template engine for code generation |
223
223
  | Pydantic v2 | >=2.0 | Runtime validation of template context |
@@ -49,7 +49,7 @@ cd my-app
49
49
  3. Generate a domain model.
50
50
 
51
51
  ```bash
52
- scaffold gm --name Order
52
+ scaffold gm --name order
53
53
  ```
54
54
 
55
55
  4. Validate the project structure.
@@ -77,11 +77,11 @@ scaffold ca --name my-project --dry-run
77
77
  Scaffold a Pydantic v2 domain model and its test stub.
78
78
 
79
79
  ```bash
80
- scaffold gm --name Order
80
+ scaffold gm --name order
81
81
  ```
82
82
 
83
83
  ```bash
84
- scaffold gm --name Order --dry-run
84
+ scaffold gm --name order --dry-run
85
85
  ```
86
86
 
87
87
  ### scaffold guc
@@ -89,11 +89,11 @@ scaffold gm --name Order --dry-run
89
89
  Scaffold a use case in `domain/usecase/`.
90
90
 
91
91
  ```bash
92
- scaffold guc --name CreateOrder
92
+ scaffold guc --name create_order
93
93
  ```
94
94
 
95
95
  ```bash
96
- scaffold guc --name CreateOrder --dry-run
96
+ scaffold guc --name create_order --dry-run
97
97
  ```
98
98
 
99
99
  ### scaffold gda
@@ -105,7 +105,7 @@ scaffold gda --type rest-consumer
105
105
  ```
106
106
 
107
107
  ```bash
108
- scaffold gda --type generic --name MyAdapter --dry-run
108
+ scaffold gda --type generic --name my_adapter --dry-run
109
109
  ```
110
110
 
111
111
  ### scaffold gep
@@ -125,11 +125,11 @@ scaffold gep --type mcp --with-resources --with-prompts --dry-run
125
125
  Scaffold a helper utility module and its test stub.
126
126
 
127
127
  ```bash
128
- scaffold gh --name JsonParser
128
+ scaffold gh --name json_parser
129
129
  ```
130
130
 
131
131
  ```bash
132
- scaffold gh --name JsonParser --dry-run
132
+ scaffold gh --name json_parser --dry-run
133
133
  ```
134
134
 
135
135
  ### scaffold gpipe
@@ -161,11 +161,11 @@ scaffold vs --dry-run
161
161
  Delete a previously generated module and its mirrored test file.
162
162
 
163
163
  ```bash
164
- scaffold dm --name Order
164
+ scaffold dm --name order
165
165
  ```
166
166
 
167
167
  ```bash
168
- scaffold dm --name Order --dry-run
168
+ scaffold dm --name order --dry-run
169
169
  ```
170
170
 
171
171
  ### scaffold up
@@ -186,7 +186,7 @@ scaffold update-project --dry-run
186
186
  |----------------|---------|------|
187
187
  | Python | >=3.13 | Runtime |
188
188
  | uv | latest | Dependency management, build, and publish |
189
- | Typer | >=0.25.1 | CLI framework |
189
+ | Typer | >=0.27.2 | CLI framework |
190
190
  | Rich | >=15.0.0 | Terminal output formatting |
191
191
  | Jinja2 | >=3.1 | Template engine for code generation |
192
192
  | Pydantic v2 | >=2.0 | Runtime validation of template context |
@@ -24,25 +24,25 @@ classifiers = [
24
24
  ]
25
25
  dependencies = [
26
26
  "jinja2~=3.1.6",
27
- "pydantic~=2.13.3",
27
+ "pydantic~=2.13.5",
28
28
  "pyyaml~=6.0.3",
29
29
  "tomli-w~=1.2.0",
30
- "typer~=0.25.1",
30
+ "typer~=0.27.2",
31
31
  "rich~=15.0.0",
32
32
  ]
33
33
 
34
34
  [dependency-groups]
35
35
  dev = [
36
36
  { include-group = "tests" },
37
- "prek>=0.3.2",
38
- "types-pyyaml>=6.0.12.20250915",
37
+ "prek>=0.5.3",
38
+ "types-pyyaml>=6.0.12.20260906",
39
39
  ]
40
40
 
41
41
  tests = [
42
- "ruff>=0.15.8",
43
- "mypy>=1.19.1",
44
- "pytest>=9.0.2",
45
- "pytest-benchmark>=5.2.3",
42
+ "ruff>=0.16.8",
43
+ "mypy>=2.3.1",
44
+ "pytest>=9.1.1",
45
+ "pytest-benchmark>=5.3.0",
46
46
  "pytest-cov>=7.1.0",
47
47
  ]
48
48
 
@@ -0,0 +1,103 @@
1
+ # Contract: `--name` Argument Validation
2
+
3
+ **Type**: CLI input validation contract
4
+ **Applies to**: Scaffold commands accepting `--name`
5
+
6
+ The naming policy is split by command family (`gep` takes `--type`, not `--name`):
7
+
8
+ | Command family | Commands | Accepted input |
9
+ |----------------|----------|----------------|
10
+ | Project | `ca` | `kebab-case` **or** `snake_case` |
11
+ | Module/class | `gm`, `guc`, `gh`, `gda --type generic`, `dm` | `snake_case` only |
12
+
13
+ Rationale: `ca` names a project directory and PyPI distribution, where `kebab-case` is
14
+ idiomatic. `gm`/`guc`/`gh`/`gda`/`dm` generate a Python module (`snake_case` file) plus a
15
+ `PascalCase` class; accepting `kebab-case` there is ambiguous noise, so only `snake_case`
16
+ (the PEP8 module form) is allowed.
17
+
18
+ ---
19
+
20
+ ## Accepted Values — `ca` (kebab-case or snake_case)
21
+
22
+ A valid `ca --name` value MUST match:
23
+
24
+ ```
25
+ ^[a-z][a-z0-9]*([_-][a-z0-9]+)*$
26
+ ```
27
+
28
+ | Format | Example | Accepted |
29
+ |--------|---------|----------|
30
+ | Single lowercase word | `order` | ✅ |
31
+ | `snake_case` | `my_project` | ✅ |
32
+ | `kebab-case` | `my-project` | ✅ |
33
+ | Alphanumeric (no separator) | `project2025` | ✅ |
34
+ | `PascalCase` | `MyProject` | ❌ |
35
+ | `camelCase` | `myProject` | ❌ |
36
+ | Consecutive separators | `my--project` | ❌ |
37
+ | Leading/trailing separator | `-my`, `my_` | ❌ |
38
+ | Starts with digit | `1project` | ❌ |
39
+ | Special characters | `my@project` | ❌ |
40
+ | Empty string | `` | ❌ |
41
+
42
+ ## Accepted Values — module/class commands (snake_case only)
43
+
44
+ A valid `--name` value for `gm`/`guc`/`gh`/`gda --type generic`/`dm` MUST match:
45
+
46
+ ```
47
+ ^[a-z][a-z0-9]*(_[a-z0-9]+)*$
48
+ ```
49
+
50
+ | Format | Example | Accepted |
51
+ |--------|---------|----------|
52
+ | Single lowercase word | `order` | ✅ |
53
+ | `snake_case` | `create_order` | ✅ |
54
+ | `kebab-case` | `create-order` | ❌ |
55
+ | `PascalCase` | `CreateOrder` | ❌ |
56
+ | `camelCase` | `createOrder` | ❌ |
57
+
58
+ The error message for these commands MUST mention `snake_case` (e.g.,
59
+ `Invalid name 'create-order'. Use snake_case (e.g., 'create_order').`).
60
+
61
+ ---
62
+
63
+ ## Error Response (invalid name)
64
+
65
+ When validation fails, the tool MUST exit with code **1** and print to stdout:
66
+
67
+ - For `ca`: a message containing both `kebab-case` and `snake_case`.
68
+ ```
69
+ Error: Invalid name 'MyProject'. Use kebab-case (e.g., 'my-project') or snake_case (e.g., 'my_project').
70
+ ```
71
+ - For module/class commands: a message containing `snake_case`.
72
+ ```
73
+ Error: Invalid name 'create-order'. Use snake_case (e.g., 'create_order').
74
+ ```
75
+
76
+ ---
77
+
78
+ ## Internal Normalisation
79
+
80
+ For `ca`, `kebab-case` input is silently normalised to `snake_case` for the Python package
81
+ (`to_snake_case`) and kept as `kebab-case` for the distribution script (`to_kebab_case`); no
82
+ warning is printed. Module/class commands only accept `snake_case`, so their input needs no
83
+ kebab normalisation; the `PascalCase` class name is still derived via `to_pascal_case`.
84
+
85
+ The normalisation helpers themselves remain kebab-tolerant (they are also fed `ProjectContext`/
86
+ `ModuleContext` values built directly in tests):
87
+
88
+ | Input | Module name | Class name |
89
+ |-------|-------------|------------|
90
+ | `create_order` | `create_order` | `CreateOrder` |
91
+ | `order` | `order` | `Order` |
92
+ | `my_order_service` | `my_order_service` | `MyOrderService` |
93
+
94
+ ---
95
+
96
+ ## Invariants
97
+
98
+ 1. **Generated `.py` file names**: always `snake_case` — `[a-z][a-z0-9_]*\.py`
99
+ 2. **Generated `class` names**: always `PascalCase` — `[A-Z][a-zA-Z0-9]*`
100
+ 3. **Validation applies regardless of `--dry-run`**
101
+ 4. **Validation policy is split by command family** — `ca` accepts `kebab-case`/`snake_case`;
102
+ `gm`/`guc`/`gh`/`gda --type generic`/`dm` accept `snake_case` only; `gep` takes `--type`,
103
+ not `--name`. No command bypasses its family's rule.
@@ -107,14 +107,14 @@ Commands covered (10 total):
107
107
  | Command | Alias | Example invocation |
108
108
  |---------|-------|--------------------|
109
109
  | `clean-architecture` | `ca` | `scaffold ca --name my-project` |
110
- | `generate-model` | `gm` | `scaffold gm --name Order` |
111
- | `generate-use-case` | `guc` | `scaffold guc --name CreateOrder` |
110
+ | `generate-model` | `gm` | `scaffold gm --name order` |
111
+ | `generate-use-case` | `guc` | `scaffold guc --name create_order` |
112
112
  | `generate-driven-adapter` | `gda` | `scaffold gda --type rest-consumer` |
113
113
  | `generate-entry-point` | `gep` | `scaffold gep --type restapi` / `--type mcp` |
114
- | `generate-helper` | `gh` | `scaffold gh --name LoggingHelper` |
114
+ | `generate-helper` | `gh` | `scaffold gh --name logging_helper` |
115
115
  | `generate-pipeline` | `gpipe` | `scaffold gpipe --provider github` |
116
116
  | `validate-structure` | `vs` | `scaffold vs` |
117
- | `delete-module` | `dm` | `scaffold dm --name Order` |
117
+ | `delete-module` | `dm` | `scaffold dm --name order` |
118
118
  | `update-project` | `up` | `scaffold up` |
119
119
 
120
120
  ### Technologies table schema
@@ -55,7 +55,7 @@
55
55
  - [X] T009 [US2] Write Section 1 (title + badges) in `README.md` — H1 heading + PyPI version badge + Python badge + MIT license badge (absolute Shields.io URLs)
56
56
  - [X] T010 [US2] Write Section 2 ("What is this?") in `README.md` — 2–4 sentences covering Clean Architecture, Python, CLI code scaffolding (no framework names)
57
57
  - [X] T011 [US2] Write Section 3 ("Installation") in `README.md` — `pip install scaffold-ca-python` and `uv add scaffold-ca-python` fenced blocks + Python ≥3.13 note
58
- - [X] T012 [US2] Write Section 4 ("Quick Start") in `README.md` — numbered 4-step walkthrough: install → `scaffold ca --name my-app` → `scaffold gm --name Order` → `scaffold vs`
58
+ - [X] T012 [US2] Write Section 4 ("Quick Start") in `README.md` — numbered 4-step walkthrough: install → `scaffold ca --name my-app` → `scaffold gm --name order` → `scaffold vs`
59
59
  - [X] T013 [US2] Write Section 5 ("Commands & Examples") in `README.md` — 10 `###` sub-sections (ca, gm, guc, gda, gep, gh, gpipe, vs, dm, up) each with description + fenced `bash` example per contracts/readme-outline.md
60
60
  - [X] T014 [P] [US2] Write Section 6 ("Technologies") in `README.md` — Markdown table (Tool/Library | Version | Role) with all 11 entries from data-model.md §3
61
61
  - [X] T015 [P] [US2] Write Section 7 ("Current Features") in `README.md` — bullet list covering all 10 commands, `--dry-run`, Jinja2 templates, Pydantic v2, Rich output, mypy strict, ruff, 80%+ coverage gate
@@ -10,7 +10,7 @@ import typer
10
10
  from rich.console import Console
11
11
 
12
12
  from scaffold_ca_python.core.module_builder import ModuleBuilder
13
- from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_name
13
+ from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
14
14
  from scaffold_ca_python.core.project_detector import find_project_root, resolve_tests_root
15
15
  from scaffold_ca_python.factory import ModuleFactory
16
16
  from scaffold_ca_python.factory.simple.delete_module_factory import DeleteModuleFactory
@@ -24,7 +24,7 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
24
24
  }
25
25
 
26
26
  _DM_HELP = "Delete a previously generated module and its test mirror. Alias 'dm'."
27
- _DM_EPILOG = "Examples:\n\n * scaffold dm --name Order\n\n * scaffold delete-module --name MyAdapter\n\n"
27
+ _DM_EPILOG = "Examples:\n\n * scaffold dm --name order\n\n * scaffold delete-module --name my_adapter\n\n"
28
28
 
29
29
 
30
30
  # ---------------------------------------------------------------------------
@@ -32,7 +32,7 @@ _DM_EPILOG = "Examples:\n\n * scaffold dm --name Order\n\n * scaffold delete-m
32
32
  # ---------------------------------------------------------------------------
33
33
 
34
34
 
35
- def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Path | None]]:
35
+ def _find_module_targets(pkg: str, project_root: Path, snake: str) -> list[tuple[Path, Path | None]]:
36
36
  """Return a list of (target_path, test_path_or_None) for all matches of *snake*.
37
37
 
38
38
  Searches across:
@@ -42,7 +42,6 @@ def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Pat
42
42
  4. infrastructure/entry_points/<snake>/
43
43
  5. infrastructure/helpers/<snake>/
44
44
  """
45
- pkg = _get_python_package(project_root)
46
45
  src_root = project_root / "src" / pkg
47
46
  tests_root = resolve_tests_root(project_root)
48
47
 
@@ -77,20 +76,6 @@ def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Pat
77
76
  return candidates
78
77
 
79
78
 
80
- def _get_python_package(root: Path) -> str:
81
- pyproject = root / "pyproject.toml"
82
- with pyproject.open("rb") as fh:
83
- data = tomllib.load(fh)
84
- section = data.get("tool", {}).get("scaffold-ca-python", {})
85
- name = section.get("name", root.name)
86
- import re
87
-
88
- s = name.replace("-", "_")
89
- s = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", s)
90
- s = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s)
91
- return s.lower()
92
-
93
-
94
79
  # ---------------------------------------------------------------------------
95
80
  # Implementation
96
81
  # ---------------------------------------------------------------------------
@@ -99,7 +84,7 @@ def _get_python_package(root: Path) -> str:
99
84
  def _delete_module_impl(name: str, confirm: bool, dry_run: bool) -> None:
100
85
  # Validate name
101
86
  try:
102
- validate_name(name)
87
+ validate_module_name(name)
103
88
  except ScaffoldError as exc:
104
89
  console.print(f"[red]Error:[/red] {exc}")
105
90
  raise typer.Exit(code=1) from None
@@ -118,7 +103,7 @@ def _delete_module_impl(name: str, confirm: bool, dry_run: bool) -> None:
118
103
 
119
104
  # Find targets
120
105
  snake = to_snake_case(name)
121
- targets = _find_module_targets(project_root, snake)
106
+ targets = _find_module_targets(project_ctx.python_package, project_root, snake)
122
107
 
123
108
  if not targets:
124
109
  console.print(
@@ -174,7 +159,7 @@ def register(app: typer.Typer) -> None:
174
159
  def delete_module(
175
160
  ctx: typer.Context,
176
161
  name: Annotated[
177
- str | None, typer.Option("--name", help="Module name (PascalCase).", rich_help_panel="Required")
162
+ str | None, typer.Option("--name", help="Module name (snake_case).", rich_help_panel="Required")
178
163
  ] = None,
179
164
  confirm: Annotated[
180
165
  bool,
@@ -8,10 +8,11 @@ from typing import Annotated
8
8
 
9
9
  import typer
10
10
  from rich.console import Console
11
+ from rich.markup import escape
11
12
  from rich.tree import Tree
12
13
 
13
14
  from scaffold_ca_python.core.module_builder import ModuleBuilder
14
- from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_name
15
+ from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
15
16
  from scaffold_ca_python.core.project_detector import find_project_root
16
17
  from scaffold_ca_python.factory import ModuleFactory
17
18
  from scaffold_ca_python.factory.driven_adapters.da_generic import DrivenAdapterGeneric
@@ -37,7 +38,7 @@ _GDA_EPILOG = (
37
38
  " ==================================================\n\n"
38
39
  "Examples:\n\n"
39
40
  " * scaffold gda --type rest-consumer\n\n"
40
- " * scaffold generate-driven-adapter --type generic --name MyAdapter\n\n"
41
+ " * scaffold generate-driven-adapter --type generic --name my_adapter\n\n"
41
42
  )
42
43
 
43
44
 
@@ -55,7 +56,7 @@ def _generate_driven_adapter_impl(type_: str, name: str | None, dry_run: bool) -
55
56
  # --- Validate name if provided ---
56
57
  if name:
57
58
  try:
58
- validate_name(name)
59
+ validate_module_name(name)
59
60
  except ScaffoldError as exc:
60
61
  console.print(f"[red]Error:[/red] {exc}")
61
62
  raise typer.Exit(code=1) from None
@@ -116,8 +117,12 @@ def _generate_driven_adapter_impl(type_: str, name: str | None, dry_run: bool) -
116
117
  for p in sorted(created):
117
118
  tree.add(str(p.relative_to(project_root)))
118
119
  console.print(tree)
119
- if builder._dependencies:
120
- console.print(f"[dim]Would add to [project.dependencies]: {', '.join(builder._dependencies)}[/dim]")
120
+ if builder.pending_dependencies:
121
+ target = escape("[project.dependencies]")
122
+ console.print(f"[dim]Would add to {target}: {', '.join(builder.pending_dependencies)}[/dim]")
123
+ for grp, pkgs in builder.pending_group_dependencies.items():
124
+ target = escape(f"[dependency-groups.{grp}]")
125
+ console.print(f"[dim]Would add to {target}: {', '.join(pkgs)}[/dim]")
121
126
  return
122
127
 
123
128
  console.print(f"[green]✓[/green] Driven adapter [bold]{subdir}[/bold] created. Created {len(created)} file(s).")
@@ -146,7 +151,7 @@ def register(app: typer.Typer) -> None:
146
151
  str | None,
147
152
  typer.Option(
148
153
  "--name",
149
- help="Adapter name (required for --type generic).",
154
+ help="Adapter name in snake_case, e.g. my_adapter (required for --type generic).",
150
155
  rich_help_panel="Options",
151
156
  ),
152
157
  ] = None,
@@ -10,10 +10,11 @@ from typing import Annotated
10
10
  import typer
11
11
  import yaml
12
12
  from rich.console import Console
13
+ from rich.markup import escape
13
14
  from rich.tree import Tree
14
15
 
15
16
  from scaffold_ca_python.core.module_builder import ModuleBuilder
16
- from scaffold_ca_python.core.name_utils import ScaffoldError
17
+ from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case
17
18
  from scaffold_ca_python.core.project_detector import find_project_root
18
19
  from scaffold_ca_python.factory import ModuleFactory
19
20
  from scaffold_ca_python.factory.entry_points.ep_agent import EntryPointAgent
@@ -59,7 +60,7 @@ def _load_project_context(project_root: Path) -> ProjectContext:
59
60
  pyproject_path = project_root / "pyproject.toml"
60
61
  with open(pyproject_path, "rb") as f:
61
62
  data = tomllib.load(f)
62
- project_name = data.get("project", {}).get("name", "project").replace("-", "_")
63
+ project_name = to_snake_case(data.get("project", {}).get("name", "project"))
63
64
  return ProjectContext(name=project_name)
64
65
 
65
66
 
@@ -190,9 +191,10 @@ def _generate_entry_point_impl(
190
191
  tree.add(str(p.relative_to(project_root)))
191
192
  console.print(tree)
192
193
 
193
- # Check if dependencies were collected by looking at builder internals
194
- if builder._dependencies:
195
- console.print(f"[dim]Would add to [project.dependencies]: {', '.join(builder._dependencies)}[/dim]")
194
+ # Report any runtime dependencies queued for injection
195
+ if builder.pending_dependencies:
196
+ target = escape("[project.dependencies]")
197
+ console.print(f"[dim]Would add to {target}: {', '.join(builder.pending_dependencies)}[/dim]")
196
198
 
197
199
  if type_ == "restapi":
198
200
  main_py = project_root / "src" / pkg / "main.py"
@@ -11,7 +11,7 @@ from rich.console import Console
11
11
  from rich.tree import Tree
12
12
 
13
13
  from scaffold_ca_python.core.module_builder import ModuleBuilder
14
- from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_name
14
+ from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
15
15
  from scaffold_ca_python.core.project_detector import find_project_root
16
16
  from scaffold_ca_python.factory import ModuleFactory
17
17
  from scaffold_ca_python.factory.simple.helper_factory import HelperFactory
@@ -25,13 +25,13 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
25
25
  }
26
26
 
27
27
  _GH_HELP = "Scaffold a helper utility module and test stub. Alias 'gh'."
28
- _GH_EPILOG = "Example:\n\n * scaffold gh --name JsonParser\n\n * scaffold generate-helper --name JsonParser\n\n"
28
+ _GH_EPILOG = "Example:\n\n * scaffold gh --name json_parser\n\n * scaffold generate-helper --name json_parser\n\n"
29
29
 
30
30
 
31
31
  def _generate_helper_impl(name: str, dry_run: bool) -> None:
32
32
  # --- Validate name ---
33
33
  try:
34
- validate_name(name)
34
+ validate_module_name(name)
35
35
  except ScaffoldError as exc:
36
36
  console.print(f"[red]Error:[/red] {exc}")
37
37
  raise typer.Exit(code=1) from None
@@ -100,7 +100,7 @@ def register(app: typer.Typer) -> None:
100
100
  def generate_helper(
101
101
  ctx: typer.Context,
102
102
  name: Annotated[
103
- str | None, typer.Option("--name", help="Helper name (PascalCase).", rich_help_panel="Required")
103
+ str | None, typer.Option("--name", help="Helper name (snake_case).", rich_help_panel="Required")
104
104
  ] = None,
105
105
  dry_run: Annotated[
106
106
  bool,
@@ -11,7 +11,7 @@ from rich.console import Console
11
11
  from rich.tree import Tree
12
12
 
13
13
  from scaffold_ca_python.core.module_builder import ModuleBuilder
14
- from scaffold_ca_python.core.name_utils import ScaffoldError, validate_name
14
+ from scaffold_ca_python.core.name_utils import ScaffoldError, validate_module_name
15
15
  from scaffold_ca_python.core.project_detector import find_project_root
16
16
  from scaffold_ca_python.factory import ModuleFactory
17
17
  from scaffold_ca_python.factory.simple.model_factory import ModelFactory
@@ -24,13 +24,13 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
24
24
  "model": ModelFactory,
25
25
  }
26
26
  _GM_HELP = "Scaffold a Pydantic v2 domain model and test stub. Alias 'gm'."
27
- _GM_EPILOG = "Example:\n\n * scaffold gm --name Order\n\n * scaffold generate-model --name Order\n\n"
27
+ _GM_EPILOG = "Example:\n\n * scaffold gm --name order\n\n * scaffold generate-model --name order\n\n"
28
28
 
29
29
 
30
30
  def _generate_model_impl(name: str, dry_run: bool) -> None:
31
31
  # --- Validate name ---
32
32
  try:
33
- validate_name(name)
33
+ validate_module_name(name)
34
34
  except ScaffoldError as exc:
35
35
  console.print(f"[red]Error:[/red] {exc}")
36
36
  raise typer.Exit(code=1) from None
@@ -100,7 +100,7 @@ def register(app: typer.Typer) -> None:
100
100
  def generate_model(
101
101
  ctx: typer.Context,
102
102
  name: Annotated[
103
- str | None, typer.Option("--name", help="Model name (PascalCase).", rich_help_panel="Required")
103
+ str | None, typer.Option("--name", help="Model name (snake_case).", rich_help_panel="Required")
104
104
  ] = None,
105
105
  dry_run: Annotated[
106
106
  bool,
@@ -151,7 +151,7 @@ def register(app: typer.Typer) -> None:
151
151
  str,
152
152
  typer.Option(
153
153
  "--name",
154
- help="Project name (PascalCase or snake_case).",
154
+ help="Project name (kebab-case or snake_case).",
155
155
  rich_help_panel="Required",
156
156
  ),
157
157
  ] = None, # type: ignore[assignment]
@@ -11,7 +11,7 @@ from rich.console import Console
11
11
  from rich.tree import Tree
12
12
 
13
13
  from scaffold_ca_python.core.module_builder import ModuleBuilder
14
- from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_name
14
+ from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
15
15
  from scaffold_ca_python.core.project_detector import find_project_root
16
16
  from scaffold_ca_python.factory import ModuleFactory
17
17
  from scaffold_ca_python.factory.simple.use_case_factory import UseCaseFactory
@@ -24,13 +24,15 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
24
24
  "use_case": UseCaseFactory,
25
25
  }
26
26
  _GUC_HELP = "Scaffold a use case in domain/usecase/. Alias 'guc'."
27
- _GUC_EPILOG = "Example:\n\n * scaffold guc --name CreateOrder\n\n * scaffold generate-use-case --name CreateOrder\n\n"
27
+ _GUC_EPILOG = (
28
+ "Example:\n\n * scaffold guc --name create_order\n\n * scaffold generate-use-case --name create_order\n\n"
29
+ )
28
30
 
29
31
 
30
32
  def _generate_use_case_impl(name: str, dry_run: bool) -> None:
31
33
  # --- Validate name ---
32
34
  try:
33
- validate_name(name)
35
+ validate_module_name(name)
34
36
  except ScaffoldError as exc:
35
37
  console.print(f"[red]Error:[/red] {exc}")
36
38
  raise typer.Exit(code=1) from None
@@ -102,7 +104,7 @@ def register(app: typer.Typer) -> None:
102
104
  def generate_use_case(
103
105
  ctx: typer.Context,
104
106
  name: Annotated[
105
- str | None, typer.Option("--name", help="Use case name (PascalCase).", rich_help_panel="Required")
107
+ str | None, typer.Option("--name", help="Use case name (snake_case).", rich_help_panel="Required")
106
108
  ] = None,
107
109
  dry_run: Annotated[
108
110
  bool,