Update the Local Plugin
1
Refresh the Marketplace
2
Update the Plugin
/plugin manager offers the same actions in a menu.3
Start a New Session
Start a new Claude Code session if the updated skills do not appear.
4
Re-Run Initialization
In each repository, enter:This backfills configuration keys the new release added, refreshes
.prflow/config.schema.json, and adds any newly shipped prompt-extension .md.example files — refreshing an existing example whose content is out of date, while never creating one beside a live <skill>.md. Your existing values and arrays are kept. Review the diff before you commit it.Update the Cloud Files
A default cloud installation has two parts that update independently:- The workflows and composite actions committed in your repository.
- The plugin content fetched at the
prflow_versionref recorded in.prflow/config.json.
Preview, Then Apply
Download the installer again at the ref you are moving to — do not re-run an installer you saved from an earlier release. Each release ships its owninstall.sh logic, so a saved copy applies an older release’s install steps to the newer files. Fetch it at the release tag, read it, then run the copy you read:
An upgrade is a dry run by default. The first command writes nothing to your repository. It prints the full plan and a unified diff of the bytes the upgrade would change, working against a sandbox copy. The diff leaves out the ephemeral
tmp/ scratch folder and the vendored plugin tree under each state directory (.prflow/ and the older .devflow/), and if it meets a file it cannot open — a dangling symlink or a path the platform cannot read — it lists that file as an UNREADABLE row and adds a line counting how many could not be compared, instead of stopping. Nothing reaches the repository until you re-run with --apply.A first-time install is different. With no PRFlow files present, the installer applies immediately. Pass --dry-run to force a preview there too.install.sh, devflow-install.sh, or prflow-install.sh) sits committed at your repository root, /prflow:init and the installer’s scaffolding step also warn about it and print the download command for the current release.
Your Edits Are Never Overwritten
The installer records the exact bytes it wrote for each file it owns. On the next run it compares:- Unchanged since the installer wrote it. The file is updated in place.
- You edited it. The file is preserved exactly as you left it, and the new version is written beside it as
<path>.prflow-newfor you to merge by hand. The installer reports each file it preserved. - The installer cannot tell. A file with no recorded fingerprint, or one it could not read, is preserved the same way and reported with the reason.
- You deleted it. The file is recreated.
.prflow/config.json is never rewritten by this mechanism at all. Only newly added keys are backfilled into it.
The Version Pin
The installer re-stampsprflow_version when the existing value is empty, looks like a commit SHA, or matches the pin a previous install or /prflow:init recorded in .prflow/install-manifest.json (commit that file). Any other tag or branch name you set is preserved, so move that value yourself when you want a newer one. One exception: if your manifest predates that record, a release tag older than the one it last noted is advanced once. The installer never moves its own vX.Y.Z pin to an older vX.Y.Z release: if it reports that it is not downgrading, restart Claude Code so the updated plugin loads, then run /prflow:init again.
A committed-vendor installation, created with DEVFLOW_VENDOR=1, stores the plugin tree in the repository and ignores prflow_version. So the ignored pin does not drift unnoticed, each cloud run compares the committed copy’s version against prflow_version and annotates any 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 and never changes which copy runs. Re-run the installer to refresh that tree: an apply run that finds a git-tracked .prflow/vendor/prflow/ treats the repository as vendor mode, 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.
Locally, a vendored tree supplies the helper scripts your loaded plugin’s skills call. So when a .prflow/vendor/prflow/ tree, committed or left over untracked, carries a different version from the plugin your session loaded, a local /prflow:implement or /prflow:review-and-fix run prints one warning naming both versions and both plugin.json paths and continues; /prflow:implement also records a note reflection naming both versions on its issue workpad. The check never stops a run. To clear the warning, update your checkout to the latest default branch, re-run the installer at the loaded release and merge the refreshed committed tree, or delete an untracked leftover .prflow/vendor/prflow/. If a vendored tree is present but either version cannot be read, the run prints one warning naming the cause and continues.
After the Upgrade
Review and commit the resulting diff. A fresh cloud installation maintainsdevflow.yml and devflow-implement.yml. An older repository can still hold a workflow the installer no longer ships. The installer reports such a file by name and never removes it without explicit direction, because no future installer run can refresh it either.
See Cloud Runs for the complete cloud update path.