Skip to content

Commit d63e9be

Browse files
authored
docs: rename user-facing lucli references to wheels in CLAUDE.md, test-local, guides (#2544)
Wheels is built on the LuCLI runtime, but the rebranded `wheels` binary is the only thing end users install. The codebase still has historical mentions of `lucli` as the user-facing command — left over from the period when the project was migrating off CommandBox onto LuCLI. The mismatch confused at least one Claude Code session: a recent agent followed `tools/test-local.sh`'s "brew install lucli" docstring instead of using the `wheels` command that was actually on PATH, then concluded LuCLI was uninstallable and gave up running the test suite locally. Surgical scope, not a blanket find-and-replace: - CLAUDE.md gets an explicit "wheels IS the CLI" callout in the testing section so future sessions don't repeat the mistake. Updated install instructions to recommend `brew install wheels`, `wheels server run`, `~/.wheels/express`. - tools/test-local.sh switches `lucli` → `wheels` for command invocations and prerequisites; falls back to scanning both `~/.wheels/express` and `~/.lucli/express` for the JDBC lib so the script keeps working through the rename for older installs. - web/sites/guides/.../testing/browser-tests.mdx and running-tests-locally.mdx fix the user-facing "brew install lucli" and `lucli server run` directions. - CHANGELOG entry under [Unreleased] / Changed. References to LuCLI as the upstream runtime project (installation docs that explain how the rebrand works, runtime-specific env vars like `LUCLI_HOME`, dotted CFC paths like `cli.lucli.services.X`, filesystem paths under `cli/lucli/`, framework-dev tooling that genuinely tests the LuCLI module distribution flow) are intentionally retained — they are accurate context, not user instructions. Closes the loose end from PR #2543's review thread.
1 parent 49f51e1 commit d63e9be

5 files changed

Lines changed: 34 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ All historical references to "CFWheels" in this changelog have been preserved fo
108108

109109
### Changed
110110

111+
- Project-level docs and the `tools/test-local.sh` script now refer to the CLI as `wheels` rather than `lucli`. Wheels is built on the LuCLI runtime, but the rebranded `wheels` binary is the only thing end users install — `brew install wheels`, `wheels server run`, `~/.wheels/express`. CLAUDE.md adds an explicit "wheels IS the CLI" callout so future Claude sessions and new contributors don't go looking for a separate `lucli` install when `tools/test-local.sh` fails. References to LuCLI as the upstream runtime project (e.g. installation docs explaining the relationship, runtime-specific env vars like `LUCLI_HOME`) are intentionally retained.
111112
- **Breaking:** CORS middleware default changed from wildcard `*` to deny-all. Apps must explicitly configure `allowOrigins` or set an explicit wildcard. (#2039)
112113
- **Breaking:** `viteStrictManifest` defaults to `true` — a missing Vite manifest entry now throws `Wheels.ViteAssetNotFound` in production instead of silently falling back (3.x behavior). Rebuild Vite assets during the upgrade window; to retain 3.x silent behavior, `set(viteStrictManifest=false)`. (#2133)
113114
- **Breaking:** `allowEnvironmentSwitchViaUrl` defaults to `false` in production (#2076)

CLAUDE.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -510,23 +510,25 @@ component extends="wheels.WheelsTest" {
510510
- **`Left(str, 0)` crashes Lucee 7**: Use a ternary guard: `local.match.pos[1] > 1 ? Left(str, local.match.pos[1] - 1) : ""`
511511
- Run with MCP `wheels_test()` or CLI `wheels test run`
512512

513-
## Running Tests Locally (LuCLI — Recommended)
513+
## Running Tests Locally (Wheels CLI — Recommended)
514514

515515
**IMPORTANT: Always run the test suite before pushing.** Do not rely on CI alone.
516516

517+
> **`wheels` IS the CLI.** Wheels is built on the LuCLI runtime, but we ship the runtime under the `wheels` brand. End users only ever interact with the CLI as `wheels` — there is no separate `lucli` binary on a normal install. When older docs or scripts mention "install LuCLI" or invoke `lucli`, they pre-date the rebrand and are being migrated to `wheels`.
518+
517519
### Fastest method: one command
518520
```bash
519521
bash tools/test-local.sh # run all core tests
520522
bash tools/test-local.sh model # run model tests only
521523
bash tools/test-local.sh security # run security tests only
522524
```
523525

524-
The script handles everything: creates SQLite DBs, starts a LuCLI server if needed, runs tests, reports results, cleans up. No Docker required.
526+
The script handles everything: creates SQLite DBs, starts a Wheels CLI server if needed, runs tests, reports results, cleans up. No Docker required.
525527

526528
### Prerequisites (one-time setup)
527529
```bash
528-
# Install LuCLI (0.3.3+ recommended)
529-
brew install lucli # or download from GitHub releases
530+
# Install the Wheels CLI (4.0.0+ recommended)
531+
brew install wheels # or download from GitHub releases
530532
# Java 21 required
531533
brew install openjdk@21
532534
```
@@ -536,7 +538,7 @@ brew install openjdk@21
536538
cd /path/to/wheels
537539
sqlite3 wheelstestdb.db "SELECT 1;"
538540
sqlite3 wheelstestdb_tenant_b.db "SELECT 1;"
539-
lucli server run --port=8080
541+
wheels start --port=8080
540542

541543
# In another terminal:
542544
curl -s "http://localhost:8080/?reload=true&password=wheels"
@@ -670,7 +672,7 @@ journal format. Output is directly comparable to fresh-VM run reports.
670672
|---|---|---|
671673
| 1 | Setup isolated `LUCLI_HOME`, framework path, Lucee Express symlink ||
672674
| 2 | `wheels new` (no duplicate `create` lines, file tree, no `bundleName`) | F1, F3, F4 |
673-
| 3 | Server boot via `lucli server run` + sqlite-jdbc shim | (formula simulation) |
675+
| 3 | Server boot via `wheels start` + sqlite-jdbc shim | (formula simulation) |
674676
| 4 | Migration cliff — verify the actual sqlite db has tables, not just exit 0 | F2, F5 |
675677
| 5 | Seed (cfscript wrapper + `seedOnce` idempotency) | F3-orig |
676678
| 6 | CRUD walkthrough (tutorial chapters 2-3 happy path) | tutorial verification |
@@ -743,15 +745,15 @@ seedOnce(modelName="User", uniqueProperties="email", properties={
743745
});
744746
```
745747

746-
**CLI** (LuCLI canonical form; `wheels db:seed` is the legacy CommandBox alias — prefer the short form):
748+
**CLI** (canonical Wheels CLI form; `wheels db:seed` is the legacy CommandBox alias — prefer the short form):
747749
```bash
748750
wheels seed # Run convention seeds (auto-detect env)
749751
wheels seed --environment=production # Seed for specific environment
750752
wheels seed --generate # Legacy: random test data
751753
wheels generate seed # Create app/db/seeds.cfm
752754
wheels generate seed --all # Create seeds.cfm + dev/prod stubs
753755
```
754-
Note: the `--count` / `--models` / `--dataFile` flags on `--generate` only exist on the legacy CommandBox `wheels db:seed` surface; LuCLI's `wheels seed` ignores them.
756+
Note: the `--count` / `--models` / `--dataFile` flags on `--generate` only exist on the legacy CommandBox `wheels db:seed` surface; the Wheels CLI's `wheels seed` ignores them.
755757

756758
**`seedOnce()`** — idempotent: checks `uniqueProperties` via `findOne()`, creates only if not found. Re-running seeds is always safe.
757759

@@ -990,7 +992,7 @@ Deeper documentation lives in `.ai/` — Claude will search it automatically whe
990992
- `.ai/wheels/configuration/` — routing, environments, settings, DI container, multi-tenancy, security
991993
- `.ai/wheels/middleware/` — pipeline structure, rate limiting, tenant resolver
992994
- `.ai/wheels/jobs/` — background job queue, retries, priority queues
993-
- `.ai/wheels/mcp/` — AI agent integration via LuCLI stdio MCP (setup, tool reference, auto-discovery)
995+
- `.ai/wheels/mcp/` — AI agent integration via the Wheels CLI's stdio MCP (setup, tool reference, auto-discovery)
994996
- `.ai/wheels/packages/` — first-party packages (sentry, hotwire, basecoat) + activation model
995997
- `.ai/wheels/cli/` — generators (model, controller, scaffold, admin, migrations)
996998
- `.ai/wheels/testing/` — WheelsTest BDD, browser testing, browser automation patterns, **onboarding harness** (fresh-install simulation for cliff fixes)
@@ -1072,7 +1074,7 @@ The project name is **Wheels** (not "CFWheels"). The rebrand happened at v3.0. A
10721074

10731075
## MCP Server
10741076

1075-
**Canonical surface (Wheels 4.0+):** LuCLI stdio MCP at `wheels mcp wheels`. Configure your AI IDE with:
1077+
**Canonical surface (Wheels 4.0+):** the Wheels CLI's stdio MCP server at `wheels mcp wheels`. Configure your AI IDE with:
10761078

10771079
```json
10781080
{"mcpServers":{"wheels":{"command":"wheels","args":["mcp","wheels"]}}}

tools/test-local.sh

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#!/usr/bin/env bash
2-
# Run Wheels core tests locally via LuCLI + SQLite (no Docker required)
2+
# Run Wheels core tests locally via Wheels CLI + SQLite (no Docker required)
33
#
44
# Prerequisites:
5-
# - LuCLI 0.3.3+ installed (brew install lucli or download from GitHub)
5+
# - Wheels CLI installed (brew install wheels or download from GitHub releases)
6+
# Wheels is built on the LuCLI runtime; we ship the runtime under the
7+
# `wheels` brand. There is no separate `lucli` binary on a normal install.
68
# - Java 21+ installed
7-
# - SQLite JDBC driver in ~/.lucli/express/*/lib/ext/ (auto-installed by LuCLI 0.2.66+)
9+
# - SQLite JDBC driver in ~/.wheels/express/*/lib/ext/ (auto-installed by recent
10+
# Wheels CLI releases; older releases may use ~/.lucli/express/*/lib/ext/)
811
#
912
# Usage:
1013
# bash tools/test-local.sh # run all core tests
@@ -14,7 +17,7 @@
1417
#
1518
# Browser-test behavior:
1619
# Browser specs (BrowserDialog/Login/Route) run against the local
17-
# LuCLI server via Playwright. Requires Playwright JARs installed in
20+
# Wheels CLI server via Playwright. Requires Playwright JARs installed in
1821
# ~/.wheels/browser/lib/ — run `wheels browser:install` once if not.
1922
# WHEELS_BROWSER_TEST_BASE_URL is auto-set to match the local PORT so
2023
# specs hit the right server; CI sets its own override before invoking
@@ -29,7 +32,7 @@ DB="${DB:-sqlite}"
2932
PASSWORD="wheels"
3033
RESULT_FILE="/tmp/wheels-local-test-results.json"
3134

32-
# Browser specs call back into the local LuCLI server — point Playwright
35+
# Browser specs call back into the local Wheels CLI server — point Playwright
3336
# at the right port. CI sets this explicitly before invoking the script;
3437
# the ${VAR:-default} preserves the CI override.
3538
export WHEELS_BROWSER_TEST_BASE_URL="${WHEELS_BROWSER_TEST_BASE_URL:-http://localhost:${PORT}}"
@@ -40,11 +43,11 @@ cd "$PROJECT_ROOT"
4043
sqlite3 wheelstestdb.db "SELECT 1;" 2>/dev/null || true
4144
sqlite3 wheelstestdb_tenant_b.db "SELECT 1;" 2>/dev/null || true
4245

43-
# ── Resolve {project} placeholder if LuCLI doesn't support it yet ──
44-
# Check if lucee.json has {project} and LuCLI version < 0.2.66
46+
# ── Resolve {project} placeholder if the Wheels CLI doesn't support it yet ──
47+
# Check if lucee.json has {project} and the runtime version is too old to
48+
# resolve the placeholder.
4549
if grep -q '{project}' lucee.json 2>/dev/null; then
46-
LUCLI_VER=$(lucli --version 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "0.0.0")
47-
# Simple version check: if version starts with 0.2. or 0.3. and < 0.2.66
50+
WHEELS_VER=$(wheels --version 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "0.0.0")
4851
# For safety, always create a resolved copy for the server
4952
cp lucee.json lucee.json.bak
5053
sed -i '' "s|{project}|${PROJECT_ROOT}|g" lucee.json
@@ -60,7 +63,7 @@ cleanup() {
6063
if [ "${STARTED_SERVER:-false}" = "true" ]; then
6164
echo "Stopping test server..."
6265
kill "$SERVER_PID" 2>/dev/null || true
63-
lucli server stop 2>/dev/null || true
66+
wheels server stop 2>/dev/null || true
6467
fi
6568
}
6669
trap cleanup EXIT
@@ -70,17 +73,19 @@ STARTED_SERVER=false
7073
if curl -s -o /dev/null --connect-timeout 2 --max-time 3 "http://localhost:${PORT}/" 2>/dev/null; then
7174
echo "Using existing server on port ${PORT}"
7275
else
73-
echo "Starting LuCLI server on port ${PORT}..."
76+
echo "Starting Wheels CLI server on port ${PORT}..."
7477

75-
# Ensure SQLite JDBC is installed
76-
LUCEE_LIB=$(find ~/.lucli/express -path "*/lib/ext" -type d 2>/dev/null | head -1)
78+
# Ensure SQLite JDBC is installed. Recent Wheels CLI releases extract
79+
# Lucee Express to ~/.wheels/express/; older releases used ~/.lucli/express/.
80+
# Search both so this script keeps working through the rename.
81+
LUCEE_LIB=$(find ~/.wheels/express ~/.lucli/express -path "*/lib/ext" -type d 2>/dev/null | head -1)
7782
if [ -n "$LUCEE_LIB" ] && ! ls "$LUCEE_LIB"/sqlite-jdbc*.jar 1>/dev/null 2>&1; then
7883
echo "Downloading SQLite JDBC driver..."
7984
curl -sL "https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.49.1.0/sqlite-jdbc-3.49.1.0.jar" \
8085
-o "$LUCEE_LIB/sqlite-jdbc-3.49.1.0.jar"
8186
fi
8287

83-
nohup lucli server run --port="$PORT" --force > /tmp/wheels-test-server.log 2>&1 &
88+
nohup wheels server run --port="$PORT" --force > /tmp/wheels-test-server.log 2>&1 &
8489
SERVER_PID=$!
8590
STARTED_SERVER=true
8691

web/sites/guides/src/content/docs/v4-0-0-snapshot/testing/browser-tests.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ When a spec fails, the `aroundEach` hook captures a screenshot and HTML dump to
316316

317317
The CI workflow sets `WHEELS_CI=true`, which `BrowserTest.beforeAll` interprets as an opt-out from running browser specs (they're skipped via `this.browserTestSkipped = true`). To run browser specs in CI, also set `WHEELS_BROWSER_CI_ENABLE=true` and ensure Playwright is installed on the runner. CI caches the Playwright JARs and Chromium via the `browser-manifest.json` hash; first runs pay the download cost once.
318318

319-
Set `WHEELS_BROWSER_TEST_BASE_URL` so `visit("/path")` resolves to the right origin on the CI runner. For local work, the default `http://localhost:8080` matches `lucli server run --port=8080`. See [CI Integration](/v4-0-0-snapshot/testing/ci-integration/) for the full workflow.
319+
Set `WHEELS_BROWSER_TEST_BASE_URL` so `visit("/path")` resolves to the right origin on the CI runner. For local work, the default `http://localhost:8080` matches `wheels server run --port=8080`. See [CI Integration](/v4-0-0-snapshot/testing/ci-integration/) for the full workflow.
320320

321321
## When to skip browser tests
322322

web/sites/guides/src/content/docs/v4-0-0-snapshot/testing/running-tests-locally.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Before either path works, you need a handful of tools on `PATH`:
2929

3030
- **Java 21+**`brew install openjdk@21` on macOS, your distro's OpenJDK package on Linux, Adoptium on Windows.
3131
- **`JAVA_HOME` set** — LuCLI's preflight refuses to start if this is unset and points you at Adoptium. Set it in your shell profile (`export JAVA_HOME=$(/usr/libexec/java_home -v 21)` on macOS).
32-
- **The `wheels` CLI**`brew install lucli`, `choco install lucli`, or the install script on Linux. This gives you the `wheels` command that wraps the LuCLI runtime.
32+
- **The `wheels` CLI**`brew install wheels`, `choco install wheels`, or the install script on Linux. The Wheels CLI is built on the LuCLI runtime; we ship the runtime under the `wheels` brand so you only ever invoke it as `wheels`.
3333
- **SQLite** — usually pre-installed; `brew install sqlite` if not. Needed for the default test database.
3434
- **Docker Desktop or Docker Engine** — only if you're running the cross-engine matrix.
3535

0 commit comments

Comments
 (0)