fix: drop unpublished wheels-authenticateThis ForgeBox dependency from starter app - #3193
Conversation
…m starter app
examples/starter-app/box.json declared `wheels-authenticateThis` ("^1") as a
ForgeBox dependency, but that slug was never published. `box install
wheels-starter-app` fetched wheels-core, then aborted on the missing slug,
leaving the install broken.
The authenticateThis plugin already ships bundled under
examples/starter-app/plugins/authenticateThis/ and flashMessages() lives in
core, so no plugin needs to be fetched from ForgeBox. Drop the broken
dependency and its stale installPaths entry so wheels-core is the only
fetched dependency and the bundled plugin is used instead.
A structural spec (vendor/wheels/tests/specs/cli/StarterAppBoxJsonSpec.cfc)
pins the manifest contract so an unpublished bundled-plugin slug can't be
reintroduced as a ForgeBox dependency.
Fixes #3181
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Wheels Bot — No doc updatesReviewed this PR's diff and found no docs that need updating (the fix removes an unpublished ForgeBox dependency from |
There was a problem hiding this comment.
Wheels Bot — Reviewer
TL;DR: This PR fixes the broken box install wheels-starter-app flow by dropping the unpublished wheels-authenticateThis ForgeBox dependency (and its stale installPaths entry) from examples/starter-app/box.json, and pins the manifest contract with a structural regression spec. I verified every claim in the PR body against the repo and found no blocking issues. Verdict: comment (clean first pass; an approve would be rejected as a self-review since the PR author is wheels-bot).
Verification performed (no findings)
Correctness
- The resulting
examples/starter-app/box.jsonis valid JSON;wheels-coreis now the soledependencies/installPathsentry (lines 30–35), with no dangling comma or orphanedinstallPathskey. - The plugin genuinely ships bundled:
examples/starter-app/plugins/authenticateThis/authenticateThis.cfcexists in-tree, andtools/build/scripts/prepare-starterApp.shcopiesexamples/starter-app/*wholesale into the publish artifact (cp -r examples/starter-app/* "${BUILD_DIR}/"with an emptyignorelist in the manifest), so the dropped ForgeBox fetch is fully covered by the bundle. examples/starter-app/app/models/User.cfc:34callsauthenticateThis(), so the bundled-plugin assertion in the spec guards a real runtime dependency.- Remaining
wheels-authenticateThisreferences in the repo are the plugin's own manifest slug (examples/starter-app/plugins/authenticateThis/box.json— its identity, not a fetch declaration) and a historical v3 docs page. Neither needs changing.
Tests
vendor/wheels/tests/specs/cli/StarterAppBoxJsonSpec.cfcextendswheels.WheelsTest(BDD, not legacy RocketUnit), uses the samevar repoRoot = expandPath("/wheels/../..")repo-root resolution as the cited prior art (ApplicationCfcInjectorAssignmentSpec.cfc:23), and correctly escapes#as##inside string literals — the classic suite-wide compile hazard is avoided.- All four assertions are evidence-backed: absent dependency, sole-dependency count, absent stale
installPaths, and bundled plugin file presence. ThestructCount(deps) == 1pin is intentionally strict per the spec's own comments — a future legitimate dependency will force a conscious update, which is the point of a contract spec. - Only cross-engine-safe BIFs are used (
deserializeJSON,fileRead,structKeyExists,structCount); no closures-as-constructor-args, no reserved-scope parameter names, no bracket-notation calls.
Commits
fix: drop unpublished wheels-authenticateThis ForgeBox dependency from starter app— valid commitlint type, 84-char header, body explains the why, DCOSigned-off-bymatches the committing identity.
Docs
- Changelog fragment
changelog.d/3181-starter-app-forgebox-dependency.fixed.mduses the fragment system correctly (validfixedtype, complete bullet line, no directCHANGELOG.mdedit). - The PR body honestly scopes out issue #3181's two broader threads (MySQL-only boot, ForgeBox-starter retirement) as follow-ups — appropriate for the titled break.
One non-blocking observation: the second and third it() blocks call fileRead(boxJsonPath) without re-asserting fileExists(), so a missing manifest would surface as a thrown error rather than a clean expectation failure in those blocks. The first block does assert existence, and spec blocks run in order, so this is cosmetic — no change requested.
|
Superseded by #3199 (merged): a propose-fix draft that raced the ForgeBox path-repair campaign for the same issue; the campaign PR landed first and closed the underlying issue. Closing the duplicate. |
Summary
box install wheels-starter-appaborted withError getting ForgeBox entry [wheels-authenticateThis] — The entry slug sent is invalid or does not exist. The starter app'sbox.jsondeclaredwheels-authenticateThis("^1") as a ForgeBox dependency, but that slug was never published — so CommandBox fetchedwheels-core, then aborted on the missing slug, leaving a broken install.The
authenticateThisplugin already ships bundled underexamples/starter-app/plugins/authenticateThis/(git-tracked, copied into the published artifact byprepare-starterApp.sh), andflashMessages()lives in core (vendor/wheels/view/miscellaneous.cfc). So nothing actually needs to be fetched from ForgeBox beyondwheels-core. This PR drops the unpublished dependency (and its now-staleinstallPathsentry) so the install completes and the bundled plugin is used instead — matching the research's option (b): "drop the ForgeBox-dependency form and ship the bundled plugin inside the artifact."A structural spec (
StarterAppBoxJsonSpec.cfc) pins the manifest contract — mirroring thebuildArtifactLicenseSpec.cfc/ApplicationCfcInjectorAssignmentSpec.cfcregression-guard pattern — so a bundled-plugin slug can't be reintroduced as a ForgeBox dependency.Related Issue
Refs #3181
This PR resolves the titled install-break (the unpublished declared dependency). It intentionally does not address the issue's two broader threads, which are deferred to follow-ups / a maintainer call:
config/app.cfmwith no SQLite/H2 fast path. Out of scope here.wheels newand retiring the ForgeBox starter-app entirely — a product/distribution decision (the ForgeBox listing has 51 installs) that is not the bot's to make.Recommended path from research: #3181 (comment)
Type of Change
Feature Completeness Checklist
Signed-off-by:(git commit -s)vendor/wheels/tests/specs/cli/StarterAppBoxJsonSpec.cfc, failing → passingbot-update-docs.ymlbot-update-docs.ymlbot-update-docs.ymlchangelog.d/3181-starter-app-forgebox-dependency.fixed.mdbash tools/test-local.sh wheels.tests.specs.cli→✓ 123 passed(was120 passed, 3 failedbefore the fix)Test Plan
bash tools/test-local.sh wheels.tests.specs.cli— the newStarterAppBoxJsonSpecassertsbox.jsondeclares onlywheels-core, carries nowheels-authenticateThisdependency orinstallPathsentry, and that theauthenticateThisplugin still ships bundled.installPaths). After the fix: all green.box install wheels-starter-appnow fetches onlywheels-coreand completes instead of aborting on the missing slug.