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
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 to the commit it installed, and preserves a value you set by hand, such as a tag or a branch name.
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. 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.