Goal
Turn this repo from a clone-and-rename template (package literally named template) into a proper scaffolding template.
Tooling decision: Copier (recommended over cookiecutter)
The template's value is its evolving standard (14 ADRs, AGENTS.md, coverage matrix). Copier's native copier update lets generated projects re-pull standard improvements via .copier-answers.yml; it supports Jinja in file contents and paths, conditional inclusion via _exclude, and typed/validated YAML questions — vs cookiecutter's JSON + post-gen-hook deletes and no native update story (needs cruft). This choice must be recorded as an ADR in docs/adr/ (ADR 0015) before conversion work starts.
Target layout
copier.yml + author-facing README/CONTRIBUTING + docs/adr/ at template-repo root
{{ project_slug }}/ contains the generated project (templated pyproject, src/{{ package_name }}, migrations, CI, etc.)
- Template-repo CI bakes the template across the feature matrix and runs lint+cover inside baked projects
Phases
Phase 0 — fix before templating
Phase 0.5 — quality hardening (can land in parallel)
Phase 1 — conversion
Key risks
- Optional user slice vs the 100% coverage gate — bake-and-test matrix is the guardrail
uv.lock must be regenerated post-gen, never templated
- GitHub Actions
${{ }} vs Jinja — use {% raw %}
Goal
Turn this repo from a clone-and-rename template (package literally named
template) into a proper scaffolding template.Tooling decision: Copier (recommended over cookiecutter)
The template's value is its evolving standard (14 ADRs, AGENTS.md, coverage matrix). Copier's native
copier updatelets generated projects re-pull standard improvements via.copier-answers.yml; it supports Jinja in file contents and paths, conditional inclusion via_exclude, and typed/validated YAML questions — vs cookiecutter's JSON + post-gen-hook deletes and no native update story (needs cruft). This choice must be recorded as an ADR in docs/adr/ (ADR 0015) before conversion work starts.Target layout
copier.yml+ author-facing README/CONTRIBUTING +docs/adr/at template-repo root{{ project_slug }}/contains the generated project (templated pyproject, src/{{ package_name }}, migrations, CI, etc.)Phases
Phase 0 — fix before templating
Phase 0.5 — quality hardening (can land in parallel)
Phase 1 — conversion
Key risks
uv.lockmust be regenerated post-gen, never templated${{ }}vs Jinja — use{% raw %}