Skip to content

ForgeBox wheels-base-template ships unsubstituted |placeholders| — box server start fails out of the box #3173

Description

@bpamiri

Journey

Fresh CommandBox user follows the package's own README: empty dir → box install wheels-base-templatebox server start.

Repro

mkdir myapp && cd myapp
box install wheels-base-template   # installs 4.0.3 + wheels-core 4.0.3 into vendor/wheels (good)
box server start

Expected

Server starts on a default engine; app boots to the welcome page.

Actual

Contacting ForgeBox to determine the latest & greatest version of [|cfmlEngine| stable]...
ERROR: Invalid slug detected. Slugs can only contain letters, numbers, underscores, and hyphens.

The shipped files contain literal legacy-CLI placeholders that nothing on this install path substitutes:

  • server.json: "name":"|appName|", "cfengine":"|cfmlEngine|"
  • config/settings.cfm: set(dataSourceName="|datasourceName|"), set(coreTestDataSourceName="|datasourceName|"), set(reloadPassword="|reloadPassword|")
  • config/app.cfm: this.name = "|appName|"

The package README documents box install wheels-base-template in an empty directory as the canonical install and never mentions editing these. After hand-replacing all 5 placeholders (cfengine=lucee) the app boots fine on Lucee 7.0.4.34 and renders the 4.0 welcome page.

Root cause

tools/build/scripts/prepare-base.sh copies tools/build/base/{server.json,box.json,config/app.cfm,config/settings.cfm} verbatim into the package. The |x| tokens were only ever substituted by the retired CommandBox cfwheels-cli (wheels create app) flow; the direct-install path the README sells is left with raw tokens.

Suggested fix

Ship working defaults instead of placeholders: cfengine pinned to the supported default (e.g. lucee@7), app/datasource name defaulting to the folder-name convention the settings comment already describes (just leave those set() lines commented out), and reloadPassword from env like the LuCLI template (set(reloadPassword=env("WHEELS_RELOAD_PASSWORD",""))). Alternatively a postInstall script could prompt/substitute, but inert defaults are simpler and match wheels new behavior.

Ancillary: the box.json postInstall script references env.example, which is not in the package (.env ships pre-made instead) — dead reference worth cleaning while in here.

Evidence from audit journey j1-template-install (CommandBox 6.3.3 docker, wheels-base-template 4.0.3, 2026-06-12).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions