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.
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/copilot-instructions.md +7 -5
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.pre-commit-config.yaml +5 -0
- scaffold_ca_python-0.1.4/.release-please-manifest.json +3 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/memory/constitution.md +1 -1
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/CHANGELOG.md +14 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/PKG-INFO +18 -18
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/README.md +15 -15
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/pyproject.toml +8 -8
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/tasks.md +11 -11
- scaffold_ca_python-0.1.4/specs/017-pep8-naming-validation/contracts/name-validation.md +103 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/plan.md +2 -2
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md +4 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md +1 -1
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/delete_module.py +6 -21
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_driven_adapter.py +11 -6
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_entry_point.py +7 -5
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_helper.py +4 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_model.py +4 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_project.py +1 -1
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_use_case.py +6 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/module_builder.py +36 -3
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/name_utils.py +14 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/pyproject_writer.py +84 -1
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_secrets.py +2 -2
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_agent.py +2 -2
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_mcp.py +7 -7
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_restapi.py +8 -8
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/pyproject_toml.jinja2 +15 -8
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_delete_module.py +10 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_dry_run_checksum.py +2 -2
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_driven_adapter.py +29 -8
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_helper.py +21 -15
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_model.py +9 -3
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_use_case.py +17 -11
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_workflow.py +3 -3
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_name_utils.py +29 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_pyproject_writer.py +118 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_rest_consumer.py +30 -5
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_secrets.py +1 -1
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_agent.py +1 -1
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_mcp.py +5 -5
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_restapi.py +4 -4
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/fixtures/dry_run_baseline.json +9 -2
- scaffold_ca_python-0.1.4/tests/factory/test_dry_run_parity.py +96 -0
- scaffold_ca_python-0.1.4/tests/factory/test_extensibility.py +46 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/test_module_builder.py +101 -0
- scaffold_ca_python-0.1.4/tests/factory/test_registry.py +54 -0
- scaffold_ca_python-0.1.4/tests/templates/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_project_templates.py +19 -0
- scaffold_ca_python-0.1.4/uv.lock +789 -0
- scaffold_ca_python-0.1.2/.release-please-manifest.json +0 -3
- scaffold_ca_python-0.1.2/specs/010-fix-restapi-cleanup/checklists/requirements.md +0 -34
- scaffold_ca_python-0.1.2/specs/010-fix-restapi-cleanup/spec.md +0 -76
- scaffold_ca_python-0.1.2/specs/013-tests-in-src/spec.md +0 -128
- scaffold_ca_python-0.1.2/specs/017-pep8-naming-validation/contracts/name-validation.md +0 -65
- scaffold_ca_python-0.1.2/specs/018-mcp-entry-point-restructure/checklists/requirements.md +0 -37
- scaffold_ca_python-0.1.2/specs/019-mcp-entry-point-restructure/spec.md +0 -128
- scaffold_ca_python-0.1.2/src/scaffold_ca_python/__init__.py +0 -1
- scaffold_ca_python-0.1.2/uv.lock +0 -666
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.analyze.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.checklist.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.clarify.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.constitution.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.implement.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.plan.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.specify.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.tasks.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/speckit.taskstoissues.agent.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/issue_template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.analyze.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.checklist.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.clarify.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.constitution.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.implement.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.plan.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.specify.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.tasks.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/pull_request_template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/build.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/dependency-review.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/publish.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/release-please.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/scorecards-analysis.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/workflows/secret-scanner.yml +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.gitignore +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.python-version +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/init-options.json +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/common.sh +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/setup-plan.sh +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/agent-file-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/checklist-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/constitution-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/plan-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/spec-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.specify/templates/tasks-template.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/LICENSE +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/SECURITY.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/release-please-config.json +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/ca.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/dm.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gda.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gh.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gm.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gpipe.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/guc.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/up.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/vs.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/clean-architecture.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gda.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gpipe.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/contracts/gep-restapi.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/spec.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/contracts/gep-mcp.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/data-model.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/research.md +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/tasks.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/contracts/readme-outline.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/plan.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/quickstart.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/research.md +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/spec.md +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/cli.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_pipeline.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/update_project.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/validate_structure.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/file_writer.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/project_detector.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/structure_validator.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/template_renderer.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/__init__.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_generic.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_generic.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/delete_module_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/helper_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/model_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/use_case_factory.py +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/context.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/file_operation.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/layer.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/violation.py +0 -0
- {scaffold_ca_python-0.1.2/tests → scaffold_ca_python-0.1.4/src/scaffold_ca_python/templates}/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/helper.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/test_helper.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/model.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/test_model.py.jinja2 +0 -0
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/README.jinja2 +0 -0
- {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
- {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
- {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
- {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
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerfile.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerignore.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/gitignore.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/layer_init.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/main.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/mypy_ini.jinja2 +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/python_version.jinja2 +0 -0
- {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
- {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
- {scaffold_ca_python-0.1.2/tests/commands → scaffold_ca_python-0.1.4/tests}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2/tests/core → scaffold_ca_python-0.1.4/tests/commands}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_cli.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_entry_point.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_pipeline.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_project.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_performance.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_update_project.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/commands/test_validate_structure.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/conftest.py +0 -0
- {scaffold_ca_python-0.1.2/tests/factory → scaffold_ca_python-0.1.4/tests/core}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_file_writer.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_project_detector.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_structure_validator.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/core/test_template_renderer.py +0 -0
- {scaffold_ca_python-0.1.2/tests/factory/driven_adapters → scaffold_ca_python-0.1.4/tests/factory}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2/tests/factory/entry_points → scaffold_ca_python-0.1.4/tests/factory/driven_adapters}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_generic.py +0 -0
- {scaffold_ca_python-0.1.2/tests/factory/simple → scaffold_ca_python-0.1.4/tests/factory/entry_points}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_generic.py +0 -0
- {scaffold_ca_python-0.1.2/tests/models → scaffold_ca_python-0.1.4/tests/factory/simple}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_delete_module_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_helper_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_model_factory.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_use_case_factory.py +0 -0
- {scaffold_ca_python-0.1.2/tests/templates → scaffold_ca_python-0.1.4/tests/models}/__init__.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_context.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_file_operation.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_layer.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/models/test_violation.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_di_config_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_docker_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_driven_adapter_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_entry_point_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_entrypoint_main_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_helper_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_model_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_pipeline_templates.py +0 -0
- {scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/tests/templates/test_use_case_templates.py +0 -0
{scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/.github/agents/copilot-instructions.md
RENAMED
|
@@ -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 +
|
|
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+ +
|
|
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+ +
|
|
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
|
-
|
|
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+ +
|
|
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
|
|
@@ -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**:
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
111
|
+
scaffold gm --name order
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
|
-
scaffold gm --name
|
|
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
|
|
123
|
+
scaffold guc --name create_order
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
|
-
scaffold guc --name
|
|
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
|
|
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
|
|
159
|
+
scaffold gh --name json_parser
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
|
-
scaffold gh --name
|
|
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
|
|
195
|
+
scaffold dm --name order
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
|
-
scaffold dm --name
|
|
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.
|
|
221
|
-
| Rich | >=
|
|
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/
|
|
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-
|
|
256
|
-
cd scaffold-
|
|
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
|
|
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
|
|
80
|
+
scaffold gm --name order
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
scaffold gm --name
|
|
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
|
|
92
|
+
scaffold guc --name create_order
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
```bash
|
|
96
|
-
scaffold guc --name
|
|
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
|
|
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
|
|
128
|
+
scaffold gh --name json_parser
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
scaffold gh --name
|
|
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
|
|
164
|
+
scaffold dm --name order
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
```bash
|
|
168
|
-
scaffold dm --name
|
|
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.
|
|
190
|
-
| Rich | >=
|
|
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/
|
|
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-
|
|
225
|
-
cd scaffold-
|
|
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.
|
|
27
|
+
"pydantic~=2.13.5",
|
|
28
28
|
"pyyaml~=6.0.3",
|
|
29
29
|
"tomli-w~=1.2.0",
|
|
30
|
-
"typer~=0.
|
|
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
|
|
38
|
-
"types-pyyaml>=6.0.12.
|
|
37
|
+
"prek>=0.5.3",
|
|
38
|
+
"types-pyyaml>=6.0.12.20260906",
|
|
39
39
|
]
|
|
40
40
|
|
|
41
41
|
tests = [
|
|
42
|
-
"ruff>=0.
|
|
43
|
-
"mypy>=
|
|
44
|
-
"pytest>=9.
|
|
45
|
-
"pytest-benchmark>=5.
|
|
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
|
|
{scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/tasks.md
RENAMED
|
@@ -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
|
-
- [
|
|
82
|
-
- [
|
|
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
|
-
- [
|
|
115
|
-
- [
|
|
116
|
-
- [
|
|
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
|
-
- [
|
|
123
|
-
- [
|
|
124
|
-
- [
|
|
125
|
-
- [
|
|
126
|
-
- [
|
|
127
|
-
- [
|
|
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.
|
{scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/plan.md
RENAMED
|
@@ -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](
|
|
4
|
-
**Input**: Feature specification from `/specs/
|
|
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
|
|
{scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md
RENAMED
|
@@ -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
|
|
111
|
-
| `generate-use-case` | `guc` | `scaffold guc --name
|
|
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
|
|
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
|
|
117
|
+
| `delete-module` | `dm` | `scaffold dm --name order` |
|
|
118
118
|
| `update-project` | `up` | `scaffold up` |
|
|
119
119
|
|
|
120
120
|
### Technologies table schema
|
{scaffold_ca_python-0.1.2 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md
RENAMED
|
@@ -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
|
|
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,
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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,
|