Update in Three Steps
The examples below pin a specific release tag. Replace it with the tag you are moving to, from the releases page.
1
Preview the Update
Download the newer installer and pass the same new tag as the payload.On an existing installation this runs in dry-run mode. It does not intentionally change your repository, though it can create temporary files, and it does execute the script you downloaded. Read that file before you run it.
2
Apply It
3
Review Before Committing
.github/ that you accept, and any file ending in .prflow-new. The next section explains those.Resolve Preserved Files
The installer records a digest for each file it manages, in.prflow/install-manifest.json. On an update it decides file by file:
Whenever it preserves your version, it writes the proposed replacement beside it as
<path>.prflow-new.
1
Compare Each Sidecar
2
Merge What You Need by Hand
Copy the changes you want into the file you maintain.
3
Delete the Sidecar
Remove each
.prflow-new file once you have merged it. Sidecars are ignored by Git, so a broad git add -A will not commit them by accident.4
Re-run the Installer in Apply Mode
Merging or adopting a sidecar changes the file’s bytes, so the digest the installer recorded is now stale. When the preserved file is one the cloud implement gate depends on —
.github/workflows/devflow-implement.yml, the setup-project-env action, or .prflow/lint-manifest.json — re-run the installer in apply mode (--apply, or DEVFLOW_APPLY=1 for a curl | bash invocation) afterwards. Only that re-apply rebinds the .prflow/install-state.json marker to your merged bytes; skip it and the implement run refuses to start on every run. The apply that preserved the file warned you and named each affected sidecar.Keep the Workflow and the Version Pin Together
The current workflow templates use the movinganthropics/claude-code-action@v1 tag. The action can update independently of prflow_version, including between reruns of the same commit. Apply the refreshed workflows through the update steps above to replace an older action pin in your repository.
The bundled Claude Code version and the model IDs behind sonnet and haiku can change with those releases. Cloud runs through a gateway (base_url) can fail if it does not serve the new IDs. Map those aliases to models your gateway serves with ANTHROPIC_DEFAULT_SONNET_MODEL and ANTHROPIC_DEFAULT_HAIKU_MODEL in the selected provider’s env map.
In a thin install, prflow_version in .prflow/config.json decides which plugin the installed workflows fetch at run time. The installer re-stamps an empty or SHA-shaped value, or the pin it recorded in .prflow/install-manifest.json, to the version it installed (never an older one, below), and preserves any other value you set by hand, such as a tag or a branch name. One exception: if your manifest predates this record, a release tag older than the one it last noted is advanced once. It never moves its own vX.Y.Z pin to an older vX.Y.Z release.
A current example makes the risk concrete. The skills that read .prflow/skill-extensions/ ship inside the plugin, while the permission entries their delivery needs ship in the workflow files. Raising only prflow_version leaves that delivery unpermitted, and a refused delivery is not reported as a failure. The run looks normal and quietly applies less of your configuration.
In a vendored install,
prflow_version is ignored — the committed .prflow/vendor/prflow/ tree supplies the runtime, so update that tree instead. To keep the ignored pin from drifting silently, each cloud run now compares the committed copy’s version against prflow_version and annotates the drift: a ::warning:: when prflow_version is an exact three-part semver tag (v<x.y.z>) that does not match the committed version, and a ::notice:: for any other prflow_version — a branch, a SHA, a partial or non-standard semver ref (v1.2, v2.45.0-rc1), or empty (or the committed plugin.json is unreadable). The check is advisory only — it never changes which copy runs. An apply run that finds a git-tracked .prflow/vendor/prflow/ treats the repository as vendor mode automatically: it replaces the committed tree with the fetched release’s plugin files, keeps /vendor/ out of .prflow/.gitignore, and logs how to switch to a thin install — so CI stops running the old plugin after an upgrade.After the Update
Run/prflow:init locally in the repository. It backfills newly added settings into .prflow/config.json without replacing the values you set, and refreshes prompt-extension .md.example files whose content is out of date (never creating one beside a live <skill>.md). Then try one low-stakes command, such as /prflow:review on a throwaway pull request, before you rely on the automation again.
If something stops working after an update, see Cloud-Run Problems and Cloud Recovery.