template-press
Press a new identity onto an existing repository. template-press is a standalone command-line utility: you point it at a target repo, it discovers and validates that repo's current identity, rewrites every occurrence to a new identity, and — only after verifying that none of the old identity survives — writes a receipt. A wrong or partial run fails loudly instead of silently corrupting the target.
It is not a project template you fork; it is a tool you run against other repos, one at a time. The rebrand engine is pure standard library, so the installed package has zero runtime dependencies.
Install
uvx --from template-press press --help # run without installing
# or
pip install template-press
Usage
# preview the plan (writes nothing)
press rebrand --target ../my-repo --config press-answers.toml --dry-run
# apply, verify, and write a receipt
press rebrand --target ../my-repo --config press-answers.toml
press-answers.toml describes the destination identity:
[answers]
package_name = "new_pkg"
repo_name = "new-repo"
app_name = "newcli"
author = "Jane Dev"
email = "jane@example.com"
owner = "janedev"
Keep your filled-in press-answers.toml out of the target (it is transient
operator input, not committed state). A repo may commit a
press/press-answers.example.toml placeholder to advertise the field
shape — copy it, fill it, and pass it via --config. It has the same
[answers] fields shown above.
The target's current identity is read from a committed
<target>/press/press-source.toml. On a first run, --dry-run prints a proposed
source-config from discovery; review it and re-run with --accept-discovery
to write and use it.
How it stays safe
- Config-first identity, discovery as a guard. The committed source-config is authoritative; discovery cross-checks it against the target and refuses to run on a mismatch, so the press never rewrites the wrong repo.
- Verify-then-mark. After rewriting, a no-leak scan confirms no source identity remains. Any leftover ⇒ exit 1 and no receipt — a partial rebrand is a loud failure, not a false success.
- Boundary-safe replacement. Short tokens (
press, an owner likego) match only at word boundaries, so ordinary prose (compress,ongoing) is never touched.
Exit codes
The exit code is the contract:
| Code | Meaning |
|---|---|
0 |
Verified — rebrand complete, no source identity remains, receipt written. |
1 |
Leaks found after applying. No receipt; restore with git -C <target> checkout . && git clean -fd. |
2 |
Precondition/config error (missing target, dirty tree, identity mismatch, existing receipt without --force, or unavailable atomic rename without --force). Nothing written. |
--dry-run exits 0 after printing the plan without touching the target (no receipt). It warns on a statically unsupported host; target-filesystem capability is probed only during real apply. Forced apply uses a guarded non-atomic fallback and warns about its destination-overwrite race.
Documentation
- Full docs: https://template-press.readthedocs.io/
- Design contract:
docs/design/0006-external-target-model.md - Agent runbooks:
press-target(drive a press) andrebrand-matrix(the R1/R2/R3 acceptance matrix)
Contributing
See AGENTS.md for the canonical toolchain and verification flow
(just setup → just check → commit) and
.github/CONTRIBUTING.md for the human contributor
guide.
License
MIT — see LICENSE.
Metadata
Release files for template_press 4.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| template_press-4.1.0.tar.gz | 192.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| template_press-4.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 402.0 kB
Release files / template_press-4.1.0.tar.gz
| Download URL | template_press-4.1.0.tar.gz |
|---|---|
| Size | 192.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eb46e4115c369048e9afb68f107f5a4851c3822b578d3e78003261aba5ef0e84
|
|
BLAKE2b-256 checksum How to use checksums |
f9530f63e3eee06f09616192c49117cc901ab73b4398fb958f7bb5502f2e22ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / template_press-4.1.0-py3-none-any.whl
| Download URL | template_press-4.1.0-py3-none-any.whl |
|---|---|
| Size | 209.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cff924822d685811937708ca58a77b0301263b5f6d6aed6873445827b8221c62
|
|
BLAKE2b-256 checksum How to use checksums |
58de225b53ed543eaf0f17a9571232e5f233b058026e640ce8c9ad081610a792
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|