docs(web/guides): add What's New in 4.0 and URL Rewriting, fix vm-deployment recipe (restructure phase 5)#3279
Conversation
…loyment recipe (restructure phase 5) Phase 5 of the guides restructure driven by discussion #1838: upgrade & orientation completion. New pages: - upgrading/whats-new-in-4 — the 'why upgrade' feature tour welcome.mdx promised the 3.x-veteran camp but never served: headline features with links, the CommandBox/no-tooling coexistence story in three sentences, breaking changes in one breath, pointers into 3x-to-4x and manual-upgrades. Sidebar slot 1 of Upgrading & Releases; welcome.mdx's camp-3 bullet now links it. - deployment/url-rewriting — the one canonical pretty-URLs page (previously undocumented anywhere in v4 while every deployment depends on it): the On/Partial/Off modes, the rule in words, and the concrete shape for Tuckey (shipped urlrewrite.xml), nginx, Apache mod_rewrite, and IIS (cross-linked), plus a verification checklist. vm-deployment repairs (all audit-flagged): - The nginx config never rewrote to /index.cfm — the page's own production checklist called that broken ('every link breaks'). Worse, try_files served .cfm source as static content for direct file hits. Replaced with try_files -> @rewrite -> CFML-proxy location shape and linked the new URL Rewriting page. - Deploy step 4 ran 'wheels migrate latest' over SSH on a server where the CLI was never installed (and the staged release has no running app for the CLI to bind to). Rewritten around the in-framework paths: autoMigrateDatabase=true at boot, or programmatic migrator.migrateToLatest() post-flip, with the backward-compatible- migrations guidance both imply. Rollback paragraph aligned. - 'Zero-downtime' headline softened to match what the recipe delivers (atomic swap, one-to-two-second Lucee restart, two-instance variant noted for true zero). Also: - digging-deeper/packages: removed the false claim that the debug bar shows a live 'Available from registry' table (it doesn't — verified against debug-panel.mdx and the code); added the ForgeBox-vs- wheels-packages-registry disambiguation aside including the CommandBox-only install path (extract into vendor/, reload). - glossary: corrected the three drifted entries — Environment (set in config/environment.cfm; WHEELS_ENV alone does not change it), package.json (requires/replaces/suggests, not legacy dependencies), Priority queue (cross-queue order is priority DESC runAt ASC, not --queue list position). Verified: astro build passes (443 pages); 0 orphans / 0 dangling / 0 broken internal links; both new pages render; the vm-deployment anchor referenced by url-rewriting confirmed in built HTML. Signed-off-by: Peter Amiri <petera@pai.com>
There was a problem hiding this comment.
Wheels Bot — Reviewer
TL;DR — Phase 5 of the guides restructure: two new pages (What's New in 4.0, URL Rewriting), a repaired nginx/migration recipe in vm-deployment, a packages-registry disambiguation, and three glossary corrections. The documentation content is excellent and, on verification, factually accurate against the framework — every API name, setting, ordering rule, and internal link I checked resolves. The only issue is a commitlint header-length violation that will fail CI on squash-merge. Verdict: request changes (single, mechanical fix — shorten the title).
Commits
-
Header exceeds the 100-char
commitlintlimit. The PR title / commit subject is 105 characters:docs(web/guides): add What's New in 4.0 and URL Rewriting, fix vm-deployment recipe (restructure phase 5)commitlint.config.js:27sets'header-max-length': [2, 'always', 100]— severity2(error), so this fails. Because the repo squash-merges, the PR title becomes the landing commit subject and is the linted gate, so this blocks the merge as written. Trim ~6 chars, e.g.:docs(web/guides): add What's New in 4.0 + URL Rewriting, fix vm-deployment recipe (phase 5)(91 chars)
What I verified (all correct — no action needed)
Because this PR makes many concrete framework claims, I checked the load-bearing ones against the code rather than trusting the prose:
URLRewritingmodes"On"/"Partial"/"Off"— all three exist (vendor/wheels/events/onapplicationstart.cfc:261-265).set(autoMigrateDatabase=true)at boot — real setting, consumed atonapplicationstart.cfc:482.application.wheels.migrator.migrateToLatest()andmigrateTo(version)— both public methods (vendor/wheels/Migrator.cfc:209and:27); the object is wired atonapplicationstart.cfc:465.- Priority-queue ordering
priority DESC, runAt ASC— exact match atvendor/wheels/Job.cfc:243. - Auth classes
wheels.auth.SessionStrategy/TokenStrategy/JwtService— all present undervendor/wheels/auth/. application.wirebox→application.wheelsdi— the DI container self-registers atapplication.wheelsdi(vendor/wheels/Bindings.cfc:53,Global.cfc:1053).- Glossary "Environment" reversal — accurate: stock
config/environment.cfmcallsset(environment="development")and never readsWHEELS_ENV, so the "WHEELS_ENValone doesn't change it" caveat is correct. - packages.mdx correction — matches
debug-panel.mdx:128,140: installed packages show in the Environment panel; registry browsing is the/wheels/packagestool page / CLI, not a live "Available from registry" table in the bar. - Every internal link target page exists (middleware-pipeline, dependency-injection, authentication-patterns, route-model-binding, working-without-the-cli, choosing-your-tooling, manual-installation, etc.), and both cross-page anchors resolve:
basics/migrations.mdx:50(#running-migrations-without-the-wheels-cli) andvm-deployment.mdx:168(#nginx-reverse-proxy).
Conventions
- No findings. Sidebar JSON adds the two entries in valid positions (URL Rewriting under the deployment group, What's New first in Upgrading & Releases). No changelog fragment is needed — this is a guides-site docs change, not a framework
feat/fix.
Fix the header and this is a clean merge.
Summary
Phase 5 of the guides restructure driven by discussion #1838 (follows #3275–#3278): upgrade & orientation completion. Two new pages, a repaired VM deploy recipe, the ForgeBox disambiguation, and three Glossary corrections. The Upgrading & Releases group promoted in Phase 1 is now fully populated.
New pages
upgrading/whats-new-in-4) — the fast-track feature tourwelcome.mdxpromised the 3.x-veteran camp but never served: middleware, built-in DI (the WireBox-removal story), query builder/scopes/enums, jobs, packages, auth strategies, SSE/channels, route model binding, WheelsTest,wheels deploy— each with its guide link. Includes the "tooling story, honestly" section (CommandBox keeps working / no tooling required at all / the CLI is an accelerator) for the mikegrogan segment, and breaking changes in one breath.welcome.mdxnow links it.deployment/url-rewriting) — pretty URLs were undocumented anywhere in v4 while every deployment depends on them (blastiko's ask in How to get started with Wheels 3.0 without 'modern tooling' #1838). One page: theOn/Partial/Offmodes, the rule in words, the concrete rule for Tuckey (shippedurlrewrite.xml), nginx, Apache mod_rewrite, and IIS (cross-linked), plus a 4-step verification checklist.vm-deployment repairs (all audit-flagged)
/index.cfm— the page's own production checklist said that means "every link breaks." It also hadtry_files $uriserving.cfmsource as static content on direct hits. Replaced with thetry_files → @rewrite → CFML-proxyshape, linked to the new URL Rewriting page.wheels migrate latestover SSH on a server where the CLI was never installed — and the staged release has no running app for the CLI to bind to anyway. Rewritten around the in-framework paths:autoMigrateDatabase=trueat boot (failure = flip back and restart), or programmaticmigrator.migrateToLatest()post-flip, with the backward-compatible-migrations guidance both approaches imply.Other
vendor/, reload).config/environment.cfm;WHEELS_ENValone doesn't change it — the entry previously planted exactly the misconception the Environments page exists to correct), package.json (requires/replaces/suggests, not the ignored legacydependencies), Priority queue (cross-queue order ispriority DESC, runAt ASC, not--queuelist position).Verification
astro buildpasses: 443 pages; 0 sidebar orphans, 0 dangling links, 0 broken internal links.#nginx-reverse-proxyanchor url-rewriting references confirmed in built HTML.environments-and-configuration.mdx:70,background-jobs.mdx:101, and the packages manifest documentation.What remains
🤖 Generated with Claude Code