Migrating from create-forge 0.3.x¶
This page covers moving from the 0.3.x line — direct Copier generation by
default, with an opt-in --engine-preview — to create-forge 0.4.0 and
later, where the forge-template engine is the default new path and
copier is the optional legacy extra.
What changed¶
0.3.x |
0.4.0 and later |
|---|---|
new defaults to Copier |
new defaults to the engine |
Engine reachable via hidden --engine-preview |
--engine-preview removed; engine is the default |
copier a required dependency |
copier moved to the optional legacy extra |
Copier route: new, update, --template/--template-url/--ref |
Unchanged, now under --legacy |
Engine-preview projects: no update support |
Engine-generated projects: full update support (.forge/generation.json) |
Upgrading your installed CLI does not change files in projects you have
already generated. See installation for the four
supported install modes, including create-forge[legacy].
Upgrade your installed CLI¶
uv tool upgrade create-forge
# or, for a pinned install:
uv tool install "create-forge>=0.4,<0.5"
If you use any --template, --template-url, --ref, or a recorded
.copier-answers.yml project, add the legacy extra:
uv tool install "create-forge[legacy]"
create-forge new and create-forge update without --legacy and without
the extra installed both still work — they use the engine, not Copier.
Existing 0.3.x Copier projects¶
A project generated by any 0.3.x release (or by create-forge new
--legacy today) keeps working exactly as documented in
updates. Its recorded
.copier-answers.yml is unaffected by the cutover — the direct-Copier route
is not deprecated and carries no removal date.
uvx create-forge update --dry-run
uvx create-forge update
create-forge reads the project's own files to route the update
automatically: a .copier-answers.yml-only project always uses the
Copier route, with
or without --legacy.
Existing 0.3.x engine-preview projects¶
A project generated with the hidden, now-removed --engine-preview flag
recorded neither .forge/generation.json nor .copier-answers.yml — it
never supported create-forge update, on 0.3.x or since. Running update
against one is rejected outright, with nothing written:
$ create-forge update path/to/preview-project
Neither .forge/generation.json nor .copier-answers.yml was found in
path/to/preview-project. create-forge update needs one of them --
.forge/generation.json selects the engine-native route, .copier-answers.yml
the --legacy Copier route. This project was not created by create-forge, its
provenance file was deleted, or it was created by the removed
development-only --engine-preview flag, which wrote neither file and never
supported updates. Generate a fresh project with `create-forge new` and port
your changes across -- create-forge will not invent answers for an existing
tree.
There is no automated migration path — create-forge cannot tell a
preview-era project apart from any directory it never touched, so it will
never fabricate a provenance record for one. To move a preview project
forward:
- Generate a fresh project with
create-forge new, choosing the same archetype and capabilities. - Port your own code, tests, and configuration across by hand.
- The new project has
.forge/generation.jsonand supportscreate-forge updatefrom then on.
If 0.4.0 doesn't work for you¶
create-forge 0.3.x stays installable and supported for at least 90 days
and at least one further tagged create-forge release past the 0.4.0
cutover. Pin back while you wait for a fix:
uv tool install "create-forge==0.3.2"
create-forge 0.3.2 resolves forge-template>=0.4.1,<0.5 and keeps
generating exactly as it did before the cutover.
Recovering from a bad update¶
Both update routes require a clean, committed working tree before writing anything, and a failed or interrupted engine-native update never leaves half-applied changes staged. If an update leaves your tree in a state you want to discard entirely:
git restore . && git clean -fd
This restores every tracked file to its last commit and removes any new
untracked files the update added — the same recovery create-forge itself
prints if an engine-native update is interrupted (for example with
Ctrl-C). Run it from the project root before retrying.
Missing an example or found an unclear step? Send documentation feedback.