You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,6 +38,7 @@ All historical references to "CFWheels" in this changelog have been preserved fo
38
38
39
39
- The `console` and `test` CLI subcommands now consume LuCLI's structured `argCollection` directly via `cli.lucli.services.ArgSpec` (`parseConsoleArgs` / `parseTestArgs` calling `.parse(structuredArgs(arguments))`), continuing the #2861 migration (whose `ArgSpec` foundation shipped in #2862) past the eight leaf commands. `console` reads `--password=<value>`; `test` reads `--filter` (and its documented `--directory` alias), `--reporter`, `--db` (tracked as explicit so the runner distinguishes an implicit default from a chosen one), the `--verbose` / `--ci` / `--core` flags, `--no-test-db` (test-db=false), a bare positional filter, and the `-v` shorthand (which LuCLI delivers as a positional). Both also fix the latent `arg1`-gate the round trip masked: named-only invocations like `wheels console --password=x` and `wheels test --core` (no positional) now take effect instead of silently running with defaults. **One deliberate behavioral delta per command:** the space-separated option forms (`wheels console --password secret`, `wheels test --filter models`) are dropped for the `--key=value` forms — LuCLI delivers a space-separated value as a bare flag plus a separate positional, never a named value. Everything else is preserved: `test`'s APP-vs-`--core` mode default, `$normalizeTestFilter` short-name normalization, and the full `runTests(...)` argument set; `console`'s reload-password auto-detection when none is supplied. Covered by 13 new server-free specs in `cli/lucli/tests/specs/commands/CommandArgParsingSpec.cfc` (via `ModuleArgvProbe`). This leaves the dispatchers (`generate`, `create`, `db`, `browser`), the parser-delegating `deploy` / `packages` / `migrate`, and the LuCLI-passthrough `start` on the `getArgs()` shim, which is removed once those are converted (#2861)
40
40
- Eight leaf CLI subcommands — `new`, `seed`, `notes`, `analyze`, `doctor`, `stats`, `upgrade`, and `destroy` — now consume LuCLI's structured `argCollection` directly via `cli.lucli.services.ArgSpec` (`.parse(structuredArgs(arguments))`) instead of flattening it back to argv and re-parsing with a hand-rolled token loop (the round trip tracked in #2861, whose `ArgSpec` foundation shipped in #2862). Beyond removing the per-command parsing duplication, this fixes a latent bug the round trip masked: the legacy `getArgs()` only rebuilt argv when a positional `arg1` was present, so **named-only** invocations were silently dropped one layer in — `wheels seed --environment=production`, `wheels doctor --verbose`, `wheels stats --verbose`, and `wheels notes --annotations=...` all ran with defaults regardless of what the user passed. Consuming the structured map directly means the named keys (and `--no-X` negations) survive. **One deliberate behavioral delta:** `wheels new` with options but no app name (e.g. `wheels new --no-sqlite`) now errors with the #2214 `Wheels.InvalidArguments` "app name required" exception instead of falling through to the usage guide — previously the `arg1`-gate dropped the named-only args, leaving an empty arg list that took the usage branch. Everything else is preserved: each command keeps its usage branches and the #2214 throw, `destroy`'s `<type> <name>` / `<name> <type>` smart reorder (now gap-tolerant, so `--force` may appear before or after the positionals), `upgrade`'s `check`-gate and `--dry-run` / `--to` "did you mean" nudge, and `doctor` / `stats`'s `-v` shorthand (which LuCLI delivers as a positional, not a flag). A new private `structuredArgs()` / `argvToCollection()` helper pair sources the collection — preferring LuCLI's live handoff and reconstructing it from the instance-level `__arguments` fallback for internal delegation (e.g. `create` → `new`) and unit tests. The migrated parse logic is covered by server-free specs in `cli/lucli/tests/specs/commands/CommandArgParsingSpec.cfc` (via `ModuleArgvProbe`). `getArgs()` / `argsFromCollection()` remain as the deprecated shim for the not-yet-migrated commands — the dispatchers (`generate`, `create`, `db`, `browser`), the parser-delegating `deploy` / `packages`, `migrate`, and the space-separated-flag `test` / `console` — and the shim is removed once those are converted (#2861)
41
+
- The final eight CLI subcommands — the dispatchers `generate`, `create`, `db`, `browser`; the parser-delegating `deploy`, `packages`, `migrate`; and the LuCLI-passthrough `start` — now source LuCLI's structured `argCollection` through `structuredArgs(arguments)` and reconstruct argv once via the new `cli.lucli.services.ArgSpec.toArgv()` passthrough, instead of the per-command `getArgs()` / `argsFromCollection()` round trip. With every call site converted, the `getArgs()` / `argsFromCollection()` shim is **removed** from `Module.cfc`, completing the #2861 migration (whose `ArgSpec` foundation shipped in #2862 and whose leaf/`console`/`test` batches landed in #2872 and #2874). These commands forward to downstream consumers that take a flat argv array (the deep `generate` sub-handlers, the unit-tested `DeployArgsParser` and packages parsers, `runForgetOrPretend`, and LuCLI's own `server start`), so the maintainer-chosen passthrough keeps those parsers — and their dedicated test suites — unchanged rather than rewriting them. `toArgv()` is non-lossy: it re-emits `--no-X` for `key=false` (the #2856 fix, now centralized in one tested place) so negations like `--no-routes` / `--no-migration` survive. The migration is behavior-preserving — `structuredArgs()` and the deleted `getArgs()` read the `__arguments` fallback identically, and `toArgv()` copies `argsFromCollection()`'s emit logic exactly — and incidentally retires the same `arg1`-gate latent bug the leaf-command migration did: `wheels start --force` with no positional previously fell through to an empty arg list. The #2855 `--no-sqlite` negation is now pinned end-to-end by a new assertion in `tools/test-onboarding.sh` (real CLI → LuCLI → ArgSpec → scaffolder: no `db/*.sqlite` files, `lucee.json` `configuration.datasources == {}`), closing the test-robustness gap the #2856 unit test left open. `argsFromCollection`'s unit coverage moved to `ArgSpec.toArgv` specs; the `getArgs` arg1-gate regression spec was retired with the function. Closes #2861
41
42
- Reconcile bot pipeline unblock plan doc with shipped implementation: mark checkboxes as historically complete and align the allowlist note with the final `classify-conflicts.sh`
42
43
- Version switcher now labels the 4.0 stable docs "v4.0 (current)" (was "v4.0.0"); the vestigial pre-GA `v4-0-1-snapshot` guides tree is removed and its one unique page, "Reading the Changelog", is salvaged into `v4-0-0/upgrading/`. Both sites deploy from `develop`, so in-progress patch docs already live in the `v4-0-0` tree; a separate `*-snapshot` tree is only warranted when a different minor/major (e.g. `v4-1-snapshot`) is under development. Courtesy redirects cover the high-traffic `/v4-0-1-snapshot/*` paths (#2827)
43
44
- CLI path normalisation now lives in a single, unit-tested `Helpers.normalizePath()`; `Module.$normalizePath()` (added in #2835 to fix the Windows `Resource provider [c]` crash) delegates to it instead of carrying a private copy, so the regression coverage exercises the real bootstrap path rather than a decoy. The CLI installation guide also gains a Windows troubleshooting entry for the original `there is no Resource provider available with the name [c]` error (#2841)
0 commit comments