You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: web/sites/guides/src/content/docs/v4-0-0/command-line-tools/wheels-commands/upgrade.mdx
+67-16Lines changed: 67 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,28 +1,30 @@
1
1
---
2
2
title: "Upgrade"
3
-
description: wheels upgrade check — scan an existing project for known breaking changes against the current release (or a pinned target), without touching any files.
3
+
description: wheels upgrade — check for breaking changes before upgrading (check), or swap vendor/wheels/ from the CLI bundle (apply).
`wheels upgrade` is a **read-only scanner**. It compares the framework version installed in `vendor/wheels/` against a target release, then greps the project for patterns that are known to break between major versions. It does **not**swap out`vendor/wheels/`, edit `box.json`, rewrite your code, or install anything. That part of the upgrade happens through your package manager — the CLI just tells you what will be waiting for you on the other side.
11
+
`wheels upgrade`has two verbs. `wheels upgrade check`is a **read-only scanner** — it compares the framework version installed in `vendor/wheels/` against a target release, then greps the project for patterns that are known to break between major versions. `wheels upgrade apply` performs the actual framework swap, replacing`vendor/wheels/` with the copy bundled inside the installed CLI. Neither verb edits `box.json`, rewrites your code, or installs packages.
12
12
13
13
**You'll use this for:**
14
14
15
-
- Previewing a major-version bump (2 → 3, 3 → 4) before you pull the trigger.
16
-
- Confirming an upgrade is "clean" — same major version, no code changes expected.
17
-
- Pinning the scan to a specific target with `--to=<version>` when you're not chasing the latest release.
15
+
- Previewing a major-version bump (2 → 3, 3 → 4) before you pull the trigger — `check`.
16
+
- Confirming an upgrade is "clean" — same major version, no code changes expected — `check`.
17
+
- Pinning the scan to a specific target with `--to=<version>` when you're not chasing the latest release — `check`.
18
+
- Swapping `vendor/wheels/` from the CLI bundle without a manual zip dance — `apply`.
Calling `wheels upgrade` with no subcommand (or any subcommand other than `check`) prints usage and exits. The only verb the command currently understands is `check`.
27
+
Calling `wheels upgrade` with no subcommand prints concise usage listing both verbs and exits 0.
26
28
27
29
### What it does
28
30
@@ -45,16 +47,14 @@ None that the command enforces — but in practice:
45
47
-**Run your tests.** Rerun the test suite after the framework swap, not after this command — `wheels upgrade check` does not exercise anything, it only greps.
46
48
-**Internet access** is required when you don't pass `--to=`. The command fetches the latest release tag from GitHub.
47
49
48
-
### Flags
50
+
### Flags — `check`
49
51
50
52
| Flag | Description |
51
53
|---|---|
52
54
|`--to=<version>`| Target version to scan against (e.g. `--to=4.0.0`). When omitted, the command queries GitHub for the latest release tag. If the GitHub call fails and no `--to=` is given, the command aborts. |
53
55
|`--format=json`| Emit a single machine-readable JSON report instead of the human output — for CI pipelines. Breaking findings (and advisory findings when `--strict` is set) still exit non-zero. |
54
56
|`--strict`| Escalate advisory findings (the "Recommended Improvements" section) to the same hard-fail path as breaking findings. The command throws `Wheels.UpgradeCheckFailed` and exits non-zero so CI can gate on opt-in convention changes. Without this flag, advisories are reported but never fail the check. Mirrors Django's `--fail-level WARNING` / Mix's `--warnings-as-errors`. |
55
57
56
-
That is the complete flag surface. The command does not accept `--force`, `--dry-run`, `--check`, `--backup`, or any apply-style switch — there is nothing to apply.
57
-
58
58
### Example
59
59
60
60
```bash title="illustrative"
@@ -124,25 +124,76 @@ Each grep scan covers the file types relevant to that check (`.cfc` and `.cfm` f
124
124
The scanner catches the patterns that are most commonly missed during a major upgrade — it is not a full migration checklist. Read the release notes for the target version alongside the scan output.
125
125
</Aside>
126
126
127
+
### `wheels upgrade apply`
128
+
129
+
`wheels upgrade apply` replaces the app's `vendor/wheels/` with the copy of the framework bundled inside the installed CLI binary. Before any file is touched, the command announces the plan — printing the reserved backup path and the exact one-liner to recover if the swap is interrupted:
After the swap, it reports the version transition and backup location:
138
+
139
+
```text title="illustrative — swap summary"
140
+
3.5.1 -> 4.0.2
141
+
Backed up to: vendor/wheels.bak-20260611-141502
142
+
```
143
+
144
+
Safety checks run before any mutation:
145
+
- Source (CLI-bundled) and target (`vendor/wheels/`) must each sniff as a valid Wheels framework directory — a generic `box.json` is not sufficient.
146
+
- The command refuses to run inside the Wheels repo checkout itself (source = target).
147
+
- The command refuses outside a Wheels app (no `vendor/wheels/`).
148
+
149
+
#### Flags — `apply`
150
+
151
+
| Flag | Description |
152
+
|---|---|
153
+
|`--to=<version>`| Assert that the CLI's bundled framework is exactly this version. Errors if the bundled version does not match — `--to` on `apply` is a safety assertion, not a download trigger. Use `wheels upgrade check --to=<version>` to scan before applying. |
154
+
|`--nobackup`| Skip the backup. The old `vendor/wheels/` is deleted before the new copy is placed. Useful when disk space is a concern or you have your own rollback strategy (git). |
155
+
156
+
#### Example
157
+
158
+
```bash title="typical upgrade sequence"
159
+
wheels upgrade check # scan for breaking changes first
160
+
wheels upgrade apply # swap vendor/wheels/ with automatic backup
161
+
```
162
+
163
+
```bash title="no-backup apply"
164
+
wheels upgrade apply --nobackup
165
+
```
166
+
127
167
### What gets updated
128
168
129
-
Nothing. The scanner is read-only. To actually move to a new release:
169
+
**`check` verb:**Nothing — the scanner is read-only.
130
170
131
-
-**Homebrew:**`brew upgrade wheels` — replaces the `wheels` CLI binary.
132
-
-**Project `vendor/wheels/`:** swap the directory manually, or regenerate the app skeleton against the new release and port your `app/` into it.
171
+
**`apply` verb:**`vendor/wheels/` is replaced with the framework bundled in the installed CLI. By default, the old copy is moved to a timestamped `vendor/wheels.bak-*` directory before the swap, so recovery is a single `mv`.
133
172
134
-
Framework upgrades live outside the CLI by design. `wheels upgrade check` is the safety net you run before and after.
173
+
To also update the CLI binary itself:
174
+
-**Homebrew:**`brew upgrade wheels`
175
+
-**Scoop:**`scoop update wheels`
176
+
177
+
After each CLI upgrade, run `wheels upgrade apply` to update your app's vendored framework copy.
135
178
136
179
### Rollback
137
180
138
-
Because the command writes no files, there is nothing to roll back. If you proceed with the actual upgrade and it goes sideways, the standard git recovery applies to your project:
181
+
**`check` verb:**Because the command writes no files, there is nothing to roll back.
139
182
140
-
```bash title="illustrative"
183
+
**`apply` verb:** The old `vendor/wheels/` is moved to a timestamped backup before the swap. The pre-swap announcement prints the exact recovery command — copy it before the swap completes if you want it on hand:
184
+
185
+
```bash title="recovery — from pre-swap announcement"
If you passed `--nobackup`, recover from git instead:
190
+
191
+
```bash title="git restore"
141
192
git restore vendor/wheels/
142
193
git clean -fd vendor/wheels/
143
194
```
144
195
145
-
Or revert the commit that introduced the new `vendor/wheels/` tree. The CLI binary itself is managed by your package manager — `brew` keeps the previous cellar around for `brew switch`-style rollback.
196
+
Or revert the commit that recorded the new `vendor/wheels/` tree. The CLI binary itself is managed by your package manager — `brew` keeps the previous cellar around for `brew switch`-style rollback.
0 commit comments