scaffold-ca-python 0.1.2__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 (327) hide show
  1. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/copilot-instructions.md +7 -5
  2. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.pre-commit-config.yaml +5 -0
  3. scaffold_ca_python-0.1.4/.release-please-manifest.json +3 -0
  4. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/memory/constitution.md +1 -1
  5. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/CHANGELOG.md +14 -0
  6. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/PKG-INFO +18 -18
  7. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/README.md +15 -15
  8. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/pyproject.toml +8 -8
  9. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/tasks.md +11 -11
  10. scaffold_ca_python-0.1.4/specs/017-pep8-naming-validation/contracts/name-validation.md +103 -0
  11. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/plan.md +2 -2
  12. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md +4 -4
  13. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md +1 -1
  14. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/delete_module.py +6 -21
  15. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_driven_adapter.py +11 -6
  16. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_entry_point.py +7 -5
  17. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_helper.py +4 -4
  18. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_model.py +4 -4
  19. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_project.py +1 -1
  20. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_use_case.py +6 -4
  21. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/module_builder.py +36 -3
  22. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/name_utils.py +14 -0
  23. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/pyproject_writer.py +84 -1
  24. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py +5 -3
  25. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_secrets.py +2 -2
  26. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_agent.py +2 -2
  27. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_mcp.py +7 -7
  28. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_restapi.py +8 -8
  29. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2 +5 -4
  30. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2 +6 -3
  31. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2 +2 -2
  32. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2 +2 -2
  33. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2 +0 -2
  34. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2 +2 -2
  35. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2 +3 -3
  36. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2 +1 -1
  37. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2 +2 -2
  38. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/pyproject_toml.jinja2 +15 -8
  39. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_delete_module.py +10 -4
  40. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_dry_run_checksum.py +2 -2
  41. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_driven_adapter.py +29 -8
  42. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_helper.py +21 -15
  43. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_model.py +9 -3
  44. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_use_case.py +17 -11
  45. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_workflow.py +3 -3
  46. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_name_utils.py +29 -0
  47. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_pyproject_writer.py +118 -0
  48. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_rest_consumer.py +30 -5
  49. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_secrets.py +1 -1
  50. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_agent.py +1 -1
  51. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_mcp.py +5 -5
  52. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_restapi.py +4 -4
  53. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/fixtures/dry_run_baseline.json +9 -2
  54. scaffold_ca_python-0.1.4/tests/factory/test_dry_run_parity.py +96 -0
  55. scaffold_ca_python-0.1.4/tests/factory/test_extensibility.py +46 -0
  56. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/test_module_builder.py +101 -0
  57. scaffold_ca_python-0.1.4/tests/factory/test_registry.py +54 -0
  58. scaffold_ca_python-0.1.4/tests/templates/__init__.py +0 -0
  59. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_project_templates.py +19 -0
  60. scaffold_ca_python-0.1.4/uv.lock +789 -0
  61. scaffold_ca_python-0.1.2/.release-please-manifest.json +0 -3
  62. scaffold_ca_python-0.1.2/specs/010-fix-restapi-cleanup/checklists/requirements.md +0 -34
  63. scaffold_ca_python-0.1.2/specs/010-fix-restapi-cleanup/spec.md +0 -76
  64. scaffold_ca_python-0.1.2/specs/013-tests-in-src/spec.md +0 -128
  65. scaffold_ca_python-0.1.2/specs/017-pep8-naming-validation/contracts/name-validation.md +0 -65
  66. scaffold_ca_python-0.1.2/specs/018-mcp-entry-point-restructure/checklists/requirements.md +0 -37
  67. scaffold_ca_python-0.1.2/specs/019-mcp-entry-point-restructure/spec.md +0 -128
  68. scaffold_ca_python-0.1.2/src/scaffold_ca_python/__init__.py +0 -1
  69. scaffold_ca_python-0.1.2/uv.lock +0 -666
  70. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.analyze.agent.md +0 -0
  71. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.checklist.agent.md +0 -0
  72. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.clarify.agent.md +0 -0
  73. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.constitution.agent.md +0 -0
  74. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.implement.agent.md +0 -0
  75. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.plan.agent.md +0 -0
  76. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.specify.agent.md +0 -0
  77. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.tasks.agent.md +0 -0
  78. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.taskstoissues.agent.md +0 -0
  79. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/issue_template.md +0 -0
  80. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.analyze.prompt.md +0 -0
  81. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.checklist.prompt.md +0 -0
  82. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.clarify.prompt.md +0 -0
  83. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.constitution.prompt.md +0 -0
  84. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.implement.prompt.md +0 -0
  85. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.plan.prompt.md +0 -0
  86. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.specify.prompt.md +0 -0
  87. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.tasks.prompt.md +0 -0
  88. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
  89. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/pull_request_template.md +0 -0
  90. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/build.yml +0 -0
  91. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/dependency-review.yml +0 -0
  92. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/publish.yml +0 -0
  93. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/release-please.yml +0 -0
  94. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/scorecards-analysis.yml +0 -0
  95. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/secret-scanner.yml +0 -0
  96. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.gitignore +0 -0
  97. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.python-version +0 -0
  98. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/init-options.json +0 -0
  99. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  100. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/common.sh +0 -0
  101. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/create-new-feature.sh +0 -0
  102. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/setup-plan.sh +0 -0
  103. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/update-agent-context.sh +0 -0
  104. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/agent-file-template.md +0 -0
  105. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/checklist-template.md +0 -0
  106. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/constitution-template.md +0 -0
  107. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/plan-template.md +0 -0
  108. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/spec-template.md +0 -0
  109. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/tasks-template.md +0 -0
  110. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/LICENSE +0 -0
  111. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/SECURITY.md +0 -0
  112. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/release-please-config.json +0 -0
  113. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/checklists/requirements.md +0 -0
  114. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/ca.md +0 -0
  115. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/dm.md +0 -0
  116. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gda.md +0 -0
  117. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gep.md +0 -0
  118. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gh.md +0 -0
  119. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gm.md +0 -0
  120. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gpipe.md +0 -0
  121. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/guc.md +0 -0
  122. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/up.md +0 -0
  123. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/vs.md +0 -0
  124. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/data-model.md +0 -0
  125. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/plan.md +0 -0
  126. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/quickstart.md +0 -0
  127. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/research.md +0 -0
  128. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/spec.md +0 -0
  129. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/tasks.md +0 -0
  130. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/checklists/requirements.md +0 -0
  131. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/plan.md +0 -0
  132. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/spec.md +0 -0
  133. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/tasks.md +0 -0
  134. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/checklists/requirements.md +0 -0
  135. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/clean-architecture.md +0 -0
  136. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gda.md +0 -0
  137. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gep.md +0 -0
  138. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gpipe.md +0 -0
  139. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/data-model.md +0 -0
  140. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/plan.md +0 -0
  141. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/quickstart.md +0 -0
  142. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/research.md +0 -0
  143. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/spec.md +0 -0
  144. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/tasks.md +0 -0
  145. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/checklists/requirements.md +0 -0
  146. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/contracts/gep.md +0 -0
  147. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/data-model.md +0 -0
  148. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/plan.md +0 -0
  149. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/quickstart.md +0 -0
  150. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/research.md +0 -0
  151. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/spec.md +0 -0
  152. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/tasks.md +0 -0
  153. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/checklists/requirements.md +0 -0
  154. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/contracts/gep-restapi.md +0 -0
  155. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/data-model.md +0 -0
  156. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/plan.md +0 -0
  157. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/quickstart.md +0 -0
  158. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/research.md +0 -0
  159. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/spec.md +0 -0
  160. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/tasks.md +0 -0
  161. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/data-model.md +0 -0
  162. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/plan.md +0 -0
  163. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/quickstart.md +0 -0
  164. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/research.md +0 -0
  165. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/spec.md +0 -0
  166. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/tasks.md +0 -0
  167. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/checklists/requirements.md +0 -0
  168. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/data-model.md +0 -0
  169. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/plan.md +0 -0
  170. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/quickstart.md +0 -0
  171. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/research.md +0 -0
  172. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/spec.md +0 -0
  173. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/tasks.md +0 -0
  174. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/checklists/requirements.md +0 -0
  175. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/data-model.md +0 -0
  176. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/plan.md +0 -0
  177. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/quickstart.md +0 -0
  178. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/research.md +0 -0
  179. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/spec.md +0 -0
  180. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/tasks.md +0 -0
  181. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/checklists/requirements.md +0 -0
  182. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/data-model.md +0 -0
  183. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/plan.md +0 -0
  184. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/quickstart.md +0 -0
  185. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/research.md +0 -0
  186. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/spec.md +0 -0
  187. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/checklists/requirements.md +0 -0
  188. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/data-model.md +0 -0
  189. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/plan.md +0 -0
  190. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/research.md +0 -0
  191. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/spec.md +0 -0
  192. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/tasks.md +0 -0
  193. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/checklists/requirements.md +0 -0
  194. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/data-model.md +0 -0
  195. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/plan.md +0 -0
  196. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/research.md +0 -0
  197. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/spec.md +0 -0
  198. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/tasks.md +0 -0
  199. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/contracts/gep-mcp.md +0 -0
  200. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/data-model.md +0 -0
  201. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/research.md +0 -0
  202. {scaffold_ca_python-0.1.2/specs/018-mcp-entry-point-restructure → scaffold_ca_python-0.1.4/specs/019-mcp-entry-point-restructure}/spec.md +0 -0
  203. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/tasks.md +0 -0
  204. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/checklists/requirements.md +0 -0
  205. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/contracts/readme-outline.md +0 -0
  206. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/plan.md +0 -0
  207. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/quickstart.md +0 -0
  208. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/research.md +0 -0
  209. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/spec.md +0 -0
  210. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/commands → scaffold_ca_python-0.1.4/src/scaffold_ca_python}/__init__.py +0 -0
  211. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/cli.py +0 -0
  212. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/core → scaffold_ca_python-0.1.4/src/scaffold_ca_python/commands}/__init__.py +0 -0
  213. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_pipeline.py +0 -0
  214. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/update_project.py +0 -0
  215. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/validate_structure.py +0 -0
  216. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/factory/driven_adapters → scaffold_ca_python-0.1.4/src/scaffold_ca_python/core}/__init__.py +0 -0
  217. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/file_writer.py +0 -0
  218. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/project_detector.py +0 -0
  219. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/structure_validator.py +0 -0
  220. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/template_renderer.py +0 -0
  221. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/__init__.py +0 -0
  222. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/factory/entry_points → scaffold_ca_python-0.1.4/src/scaffold_ca_python/factory/driven_adapters}/__init__.py +0 -0
  223. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_generic.py +0 -0
  224. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/factory/simple → scaffold_ca_python-0.1.4/src/scaffold_ca_python/factory/entry_points}/__init__.py +0 -0
  225. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_generic.py +0 -0
  226. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/models → scaffold_ca_python-0.1.4/src/scaffold_ca_python/factory/simple}/__init__.py +0 -0
  227. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/delete_module_factory.py +0 -0
  228. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/helper_factory.py +0 -0
  229. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/model_factory.py +0 -0
  230. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/use_case_factory.py +0 -0
  231. {scaffold_ca_python-0.1.2/src/scaffold_ca_python/templates → scaffold_ca_python-0.1.4/src/scaffold_ca_python/models}/__init__.py +0 -0
  232. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/context.py +0 -0
  233. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/file_operation.py +0 -0
  234. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/layer.py +0 -0
  235. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/violation.py +0 -0
  236. {scaffold_ca_python-0.1.2/tests → scaffold_ca_python-0.1.4/src/scaffold_ca_python/templates}/__init__.py +0 -0
  237. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2 +0 -0
  238. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2 +0 -0
  239. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2 +0 -0
  240. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2 +0 -0
  241. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2 +0 -0
  242. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2 +1 -1
  243. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2 +0 -0
  244. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2 +0 -0
  245. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2 +0 -0
  246. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2 +0 -0
  247. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/card.py.jinja2 +0 -0
  248. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2 +0 -0
  249. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2 +0 -0
  250. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2 +0 -0
  251. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2 +0 -0
  252. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2 +0 -0
  253. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2 +0 -0
  254. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2 +0 -0
  255. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2 +1 -1
  256. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2 +0 -0
  257. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2 +0 -0
  258. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2 +0 -0
  259. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2 +0 -0
  260. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2 +1 -1
  261. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2 +0 -0
  262. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2 +0 -0
  263. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2 +0 -0
  264. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2 +0 -0
  265. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2 +0 -0
  266. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2 +0 -0
  267. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2 +0 -0
  268. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/__init__.py.jinja2 +0 -0
  269. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/helper.py.jinja2 +0 -0
  270. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/test_helper.py.jinja2 +0 -0
  271. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/model.py.jinja2 +0 -0
  272. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/test_model.py.jinja2 +0 -0
  273. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2 +0 -0
  274. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +0 -0
  275. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/README.jinja2 +0 -0
  276. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/__init__.py.jinja2 +0 -0
  277. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/config.py.jinja2 +0 -0
  278. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/container.py.jinja2 +1 -1
  279. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2 +0 -0
  280. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerfile.jinja2 +0 -0
  281. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerignore.jinja2 +0 -0
  282. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/gitignore.jinja2 +0 -0
  283. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/layer_init.jinja2 +0 -0
  284. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/main.py.jinja2 +0 -0
  285. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/mypy_ini.jinja2 +0 -0
  286. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/python_version.jinja2 +0 -0
  287. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/test_use_case.py.jinja2 +0 -0
  288. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/use_case.py.jinja2 +0 -0
  289. {scaffold_ca_python-0.1.2/tests/commands → scaffold_ca_python-0.1.4/tests}/__init__.py +0 -0
  290. {scaffold_ca_python-0.1.2/tests/core → scaffold_ca_python-0.1.4/tests/commands}/__init__.py +0 -0
  291. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_cli.py +0 -0
  292. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_entry_point.py +0 -0
  293. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_pipeline.py +0 -0
  294. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_project.py +0 -0
  295. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_performance.py +0 -0
  296. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_update_project.py +0 -0
  297. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_validate_structure.py +0 -0
  298. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/conftest.py +0 -0
  299. {scaffold_ca_python-0.1.2/tests/factory → scaffold_ca_python-0.1.4/tests/core}/__init__.py +0 -0
  300. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_file_writer.py +0 -0
  301. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_project_detector.py +0 -0
  302. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_structure_validator.py +0 -0
  303. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_template_renderer.py +0 -0
  304. {scaffold_ca_python-0.1.2/tests/factory/driven_adapters → scaffold_ca_python-0.1.4/tests/factory}/__init__.py +0 -0
  305. {scaffold_ca_python-0.1.2/tests/factory/entry_points → scaffold_ca_python-0.1.4/tests/factory/driven_adapters}/__init__.py +0 -0
  306. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_generic.py +0 -0
  307. {scaffold_ca_python-0.1.2/tests/factory/simple → scaffold_ca_python-0.1.4/tests/factory/entry_points}/__init__.py +0 -0
  308. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_generic.py +0 -0
  309. {scaffold_ca_python-0.1.2/tests/models → scaffold_ca_python-0.1.4/tests/factory/simple}/__init__.py +0 -0
  310. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_delete_module_factory.py +0 -0
  311. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_helper_factory.py +0 -0
  312. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_model_factory.py +0 -0
  313. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_use_case_factory.py +0 -0
  314. {scaffold_ca_python-0.1.2/tests/templates → scaffold_ca_python-0.1.4/tests/models}/__init__.py +0 -0
  315. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_context.py +0 -0
  316. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_file_operation.py +0 -0
  317. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_layer.py +0 -0
  318. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_violation.py +0 -0
  319. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_di_config_templates.py +0 -0
  320. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_docker_templates.py +0 -0
  321. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_driven_adapter_templates.py +0 -0
  322. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_entry_point_templates.py +0 -0
  323. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_entrypoint_main_templates.py +0 -0
  324. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_helper_templates.py +0 -0
  325. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_model_templates.py +0 -0
  326. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_pipeline_templates.py +0 -0
  327. {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_use_case_templates.py +0 -0
@@ -7,7 +7,7 @@ Auto-generated from all feature plans. Last updated: 2026-04-20
7
7
  - N/A — file I/O only via `FileWriter` / `TemplateRenderer` (008-fastapi-entrypoint-baseline)
8
8
  - Python 3.13 + FastAPI ≥ 0.135.2, uvicorn[standard] ≥ 0.20, dependency-injector ≥ 4.49.0, pydantic-settings ≥ 2.13.1, Jinja2 ≥ 3.1, pydantic ≥ 2.0, typer ≥ 0.16, rich ≥ 14.1 (009-app-factory-split)
9
9
  - N/A (code-generation tool; no database) (009-app-factory-split)
10
- - Python 3.13 + yper, Rich (CLI); tomllib + tomli_w (TOML read/write); pytest + pytest-cov (testing); ruff (lint/format); mypy strict (types) (011-fix-restapi-cleanup)
10
+ - Python 3.13 + Typer, Rich (CLI); tomllib + tomli_w (TOML read/write); pytest + pytest-cov (testing); ruff (lint/format); mypy strict (types) (011-fix-restapi-cleanup)
11
11
  - Local filesystem — `pyproject.toml` (TOML), `main.py` (plain file delete) (011-fix-restapi-cleanup)
12
12
  - Python 3.13 + Jinja2 (template rendering), Pydantic v2 (generated schema model), FastAPI + Starlette (generated test client), pytest + pytest-cov (testing), ruff (lint/format), mypy strict (types), uv (package management) (012-fix-restapi-test-templates)
13
13
  - Local filesystem — Jinja2 `.jinja2` template files (012-fix-restapi-test-templates)
@@ -15,9 +15,9 @@ Auto-generated from all feature plans. Last updated: 2026-04-20
15
15
  - Local filesystem — Path operations only (014-tests-in-src)
16
16
  - Python 3.13 + Typer ≥ 0.16, Rich ≥ 14.1, Jinja2 ≥ 3.1, Pydantic v2, uv (015-factory-builder-refactor)
17
17
  - File system only (pyproject.toml + generated project files) (015-factory-builder-refactor)
18
- - Python 3.13+ + yper>=0.16.0, rich>=14.1.0; ruff (linter/formatter), mypy strict (type checker) (016-dedup-command-aliases)
18
+ - Python 3.13+ + Typer>=0.16.0, rich>=14.1.0; ruff (linter/formatter), mypy strict (type checker) (016-dedup-command-aliases)
19
19
  - N/A — CLI tool, no database (016-dedup-command-aliases)
20
- - Python 3.13+ + yper ≥ 0.16, pydantic ≥ 2.0, rich ≥ 14.1, jinja2 ≥ 3.1 (017-pep8-naming-validation)
20
+ - Python 3.13+ + Typer ≥ 0.16, pydantic ≥ 2.0, rich ≥ 14.1, jinja2 ≥ 3.1 (017-pep8-naming-validation)
21
21
  - N/A (file generation only) (017-pep8-naming-validation)
22
22
  - Python 3.13+ + Typer (CLI), Rich (output), Jinja2 (templates), Pydantic v2 (context models), `mcp>=1.0` (generated project dep), `starlette` (generated project dep), `uvicorn` (generated project dep), `dependency-injector` (generated project dep) (019-mcp-entry-point-restructure)
23
23
  - N/A — file system writes only (019-mcp-entry-point-restructure)
@@ -35,7 +35,9 @@ tests/
35
35
 
36
36
  ## Commands
37
37
 
38
- cd src [ONLY COMMANDS FOR ACTIVE TECHNOLOGIES][ONLY COMMANDS FOR ACTIVE TECHNOLOGIES] pytest [ONLY COMMANDS FOR ACTIVE TECHNOLOGIES][ONLY COMMANDS FOR ACTIVE TECHNOLOGIES] ruff check .
38
+ uv run pytest
39
+ uv run ruff check src tests
40
+ uv run mypy src
39
41
 
40
42
  ## Code Style
41
43
 
@@ -44,7 +46,7 @@ Python 3.13: Follow standard conventions
44
46
  ## Recent Changes
45
47
  - 020-pypi-publish-readme: Added Python 3.13+ + hatchling (build backend), uv-dynamic-versioning (git-tag versioning, PEP 440), uv (build + publish)
46
48
  - 019-mcp-entry-point-restructure: Added Python 3.13+ + Typer (CLI), Rich (output), Jinja2 (templates), Pydantic v2 (context models), `mcp>=1.0` (generated project dep), `starlette` (generated project dep), `uvicorn` (generated project dep), `dependency-injector` (generated project dep)
47
- - 017-pep8-naming-validation: Added Python 3.13+ + yper ≥ 0.16, pydantic ≥ 2.0, rich ≥ 14.1, jinja2 ≥ 3.1
49
+ - 017-pep8-naming-validation: Added Python 3.13+ + Typer ≥ 0.16, pydantic ≥ 2.0, rich ≥ 14.1, jinja2 ≥ 3.1
48
50
 
49
51
 
50
52
  <!-- MANUAL ADDITIONS START -->
@@ -1,5 +1,10 @@
1
1
  # See https://pre-commit.com for more information
2
2
  # See https://pre-commit.com/hooks.html for more hooks
3
+
4
+ # SDD documentation and Spec-Kit tooling are authored artifacts, not source code:
5
+ # keep the fixer/formatter hooks out of them so runs stay scoped to code changes.
6
+ exclude: '^(\.specify/|specs/|\.github/agents/)'
7
+
3
8
  repos:
4
9
  - repo: https://github.com/pre-commit/pre-commit-hooks
5
10
  rev: v5.0.0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.4"
3
+ }
@@ -258,4 +258,4 @@ dependencies listed in Principle III, installed via `uv` at generation time.
258
258
  - Compliance reviews MUST occur at the start of each new feature branch and before
259
259
  merging to `main`.
260
260
 
261
- **Version**: 1.0.0 | **Ratified**: 2026-03-25 | **Last Amended**: 2026-03-25
261
+ **Version**: 2.0.3 | **Ratified**: 2026-03-25 | **Last Amended**: 2026-04-10
@@ -1,5 +1,19 @@
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
+
10
+ ## [0.1.3](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.2...v0.1.3) (2026-09-17)
11
+
12
+
13
+ ### Documentation
14
+
15
+ * clean up SDD specification audit artifacts ([1a0374e](https://github.com/bancolombia/scaffold-clean-architecture-py/commit/1a0374e5895864718b9c6ee7b0990023942441fa))
16
+
3
17
  ## [0.1.2](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.1...v0.1.2) (2026-09-16)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scaffold-ca-python
3
- Version: 0.1.2
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,8 +217,8 @@ 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.16.0 | CLI framework |
221
- | Rich | >=14.1.0 | Terminal output formatting |
220
+ | Typer | >=0.27.2 | CLI framework |
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 |
224
224
  | hatchling | latest | Build backend |
@@ -248,12 +248,12 @@ scaffold update-project --dry-run
248
248
 
249
249
  ## Contributing
250
250
 
251
- 1. Fork the upstream repository on GitHub: https://github.com/santicalleg/scaffold-ca-python
251
+ 1. Fork the upstream repository on GitHub: https://github.com/bancolombia/scaffold-clean-architecture-py
252
252
  2. Clone your fork.
253
253
 
254
254
  ```bash
255
- git clone https://github.com/YOUR-USER/scaffold-ca-python.git
256
- cd scaffold-ca-python
255
+ git clone https://github.com/YOUR-USER/scaffold-clean-architecture-py.git
256
+ cd scaffold-clean-architecture-py
257
257
  ```
258
258
 
259
259
  3. Set up the development environment.
@@ -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,8 +186,8 @@ 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.16.0 | CLI framework |
190
- | Rich | >=14.1.0 | Terminal output formatting |
189
+ | Typer | >=0.27.2 | CLI framework |
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 |
193
193
  | hatchling | latest | Build backend |
@@ -217,12 +217,12 @@ scaffold update-project --dry-run
217
217
 
218
218
  ## Contributing
219
219
 
220
- 1. Fork the upstream repository on GitHub: https://github.com/santicalleg/scaffold-ca-python
220
+ 1. Fork the upstream repository on GitHub: https://github.com/bancolombia/scaffold-clean-architecture-py
221
221
  2. Clone your fork.
222
222
 
223
223
  ```bash
224
- git clone https://github.com/YOUR-USER/scaffold-ca-python.git
225
- cd scaffold-ca-python
224
+ git clone https://github.com/YOUR-USER/scaffold-clean-architecture-py.git
225
+ cd scaffold-clean-architecture-py
226
226
  ```
227
227
 
228
228
  3. Set up the development environment.
@@ -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
 
@@ -78,8 +78,8 @@ command tests pass with no modifications.
78
78
  [x] T027 [P] [US2] Implement `DrivenAdapterSecrets` in `src/scaffold_ca_python/factory/driven_adapters/da_secrets.py`
79
79
  [x] T028 [P] [US2] Write failing tests for `DrivenAdapterGeneric.build()` in `tests/factory/driven_adapters/test_da_generic.py`
80
80
  [x] T029 [P] [US2] Implement `DrivenAdapterGeneric` in `src/scaffold_ca_python/factory/driven_adapters/da_generic.py`
81
- - [ ] T030 [US2] Refactor `src/scaffold_ca_python/commands/generate_driven_adapter.py` to thin + `_REGISTRY`; remove FileWriter/TemplateRenderer/pyproject_writer imports
82
- - [ ] T031 [US2] Run `uv run pytest tests/commands/ --no-cov -q` and confirm zero regressions (no test file modified)
81
+ - [x] T030 [US2] Refactor `src/scaffold_ca_python/commands/generate_driven_adapter.py` to thin + `_REGISTRY`; remove FileWriter/TemplateRenderer/pyproject_writer imports
82
+ - [x] T031 [US2] Run `uv run pytest tests/commands/ --no-cov -q` and confirm zero regressions (no test file modified)
83
83
 
84
84
  ---
85
85
 
@@ -111,20 +111,20 @@ command in scope uses only `ModuleBuilder`. After this phase, no command file im
111
111
 
112
112
  **Independent test**: `uv run pytest tests/factory/test_registry.py tests/factory/test_dry_run_parity.py --no-cov -q`
113
113
 
114
- - [ ] T042 [US4] Write `tests/factory/test_registry.py` — assert `_REGISTRY` for `gep` contains exactly {restapi, agent, mcp, generic}; assert `_REGISTRY` for `gda` contains exactly {rest-consumer, secrets, generic}; assert all 6 simple commands have `_REGISTRY` with their respective types; assert unknown type lookup produces error listing valid keys
115
- - [ ] T043 [US4] Write `tests/factory/test_dry_run_parity.py` — for each type in both commands, compare dry-run preview path set against a captured pre-refactor baseline fixture
116
- - [ ] T044 [US4] Write SC-002 extensibility proof test in `tests/factory/test_extensibility.py` — define a stub factory inline, register it under a new key in a patched `_REGISTRY`, invoke the command with the stub type, assert factory was called; zero existing command files modified
114
+ - [x] T042 [US4] Write `tests/factory/test_registry.py` — assert `_REGISTRY` for `gep` contains exactly {restapi, agent, mcp, generic}; assert `_REGISTRY` for `gda` contains exactly {rest-consumer, secrets, generic}; assert all 6 simple commands have `_REGISTRY` with their respective types; assert unknown type lookup produces error listing valid keys
115
+ - [x] T043 [US4] Write `tests/factory/test_dry_run_parity.py` — for each type in both commands, compare dry-run preview path set against a captured pre-refactor baseline fixture
116
+ - [x] T044 [US4] Write SC-002 extensibility proof test in `tests/factory/test_extensibility.py` — define a stub factory inline, register it under a new key in a patched `_REGISTRY`, invoke the command with the stub type, assert factory was called; zero existing command files modified
117
117
 
118
118
  ---
119
119
 
120
120
  ## Phase 7 — Polish & Quality Gates
121
121
 
122
- - [ ] T045 Run `uv run pytest` and confirm all tests pass with ≥ 95% coverage
123
- - [ ] T045b Assert template immutability: `git diff HEAD -- src/scaffold_ca_python/templates/` must be empty — no template file modified during implementation (FR-009)
124
- - [ ] T045c Assert model immutability: confirm no new files exist under `src/scaffold_ca_python/models/` beyond the pre-refactor baseline (FR-010)
125
- - [ ] T046 [P] Run `uv run ruff check src/ tests/` and fix any violations
126
- - [ ] T047 [P] Run `uv run ruff format src/ tests/` to normalise formatting
127
- - [ ] T048 [P] Run `uv run mypy src/` and confirm 0 new errors under strict mode
122
+ - [x] T045 Run `uv run pytest` and confirm all tests pass with ≥ 95% coverage
123
+ - [x] T045b Assert template immutability: `git diff HEAD -- src/scaffold_ca_python/templates/` must be empty — no template file modified during implementation (FR-009)
124
+ - [x] T045c Assert model immutability: confirm no new files exist under `src/scaffold_ca_python/models/` beyond the pre-refactor baseline (FR-010)
125
+ - [x] T046 [P] Run `uv run ruff check src/ tests/` and fix any violations
126
+ - [x] T047 [P] Run `uv run ruff format src/ tests/` to normalise formatting
127
+ - [x] T048 [P] Run `uv run mypy src/` and confirm 0 new errors under strict mode
128
128
 
129
129
  ---
130
130
 
@@ -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.
@@ -1,7 +1,7 @@
1
1
  # Implementation Plan: MCP Entry Point Restructure
2
2
 
3
- **Branch**: `019-mcp-entry-point-restructure` | **Date**: 2026-04-16 | **Spec**: [spec.md](../018-mcp-entry-point-restructure/spec.md)
4
- **Input**: Feature specification from `/specs/018-mcp-entry-point-restructure/spec.md`
3
+ **Branch**: `019-mcp-entry-point-restructure` | **Date**: 2026-04-16 | **Spec**: [spec.md](spec.md)
4
+ **Input**: Feature specification from `/specs/019-mcp-entry-point-restructure/spec.md`
5
5
 
6
6
  ## Summary
7
7
 
@@ -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,