ADR-010: Project configuration lives at .config/git.tpl.toml¶
Status: accepted
Context¶
The project needs a versioned file recording the template and the answers.
The obvious candidates are all at the repository root: .git-tpl.toml, tpl.toml, .copier-answers.yml.
Repository roots are crowded.
A generated project already has Cargo.toml, README.md, LICENSE, .gitignore, mise.toml,
rust-toolchain.toml, cliff.toml, prek.toml, typos.toml, zensical.toml.
Every tool that adds one more makes the project harder to read, and git-tpl's file is one a user looks at rarely.
Decision¶
.config/git.tpl.toml.
It contains only the template reference and the answers.
[template]
source = "https://github.com/noirbizarre/rust-library-template"
ref = "main"
[answers]
project_name = "example"
license = "MIT"
Local and user preferences go in Git configuration instead, under tpl.*.
Consequences¶
The repository root stays legible.
.config/ is an established convention — it is where nextest.toml lives in this very repository — and it
groups tool configuration where a reader can find it without it competing for attention with the project's own
files.
The name git.tpl.toml mirrors the command, git tpl, so the association is immediate.
The split with Git configuration follows one rule: would a new contributor cloning this repository need this to
be true?
The template source, yes — a fresh clone must be understandable from this file alone, with no pre-existing Git
configuration.
tpl.autoPush, no — that is a statement about how one person works, and committing it imposes it on everyone.
Nothing generated goes in this file.
It is input: hand-editable, reviewable, and containing exactly what a human decided.
Rendered state lives in the ref, and provenance in the commit trailers (ADR-008).
Editing an answer here and running git tpl update is the supported way to change your mind.
The cost is one extra directory level, and being unlike every other tool in the category. Both are fine.