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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions