Skip to content

Commit 32cfb4c

Browse files
committed
fix(cli): resolve cli.lucli.* component paths via the modules.wheels mapping
Replaces every `cli.lucli.services.*` absolute dotted path in cli/lucli/ with the equivalent `modules.wheels.services.*` path. The new prefix matches the same `modules.<name>.<...>` convention LuCLI uses to load each module's own `Module.cfc`, so the paths resolve identically in every context the CLI runs in: Dev symlink (~/.lucli/modules/wheels -> <repo>/cli/lucli) modules.wheels.services.X -> <repo>/cli/lucli/services/X.cfc Brew install (~/.wheels/modules/wheels) modules.wheels.services.X -> ~/.wheels/modules/wheels/services/X.cfc Isolated harness ($LUCLI_HOME/modules/wheels) modules.wheels.services.X -> $LUCLI_HOME/modules/wheels/services/X.cfc The previous `cli.lucli.*` prefix only resolved when the module was loaded from a path with `cli/lucli/` in its filesystem ancestry — true for the user's daily dev symlink (because the symlink target lives in the repo's `cli/lucli/` directory and Lucee follows the symlink to its real path), but NOT true for any installation that copies the module's contents (Homebrew bottle, Chocolatey package, or any LUCLI_HOME-isolated test setup). User-visible effect on fresh installs: Before: $ wheels deploy version Error: could not find component or class with name [cli.lucli.services.deploy.cli.DeployMainCli] $ wheels packages list Error: could not find component or class with name [cli.lucli.services.packages.PackagesMainCli] After: $ wheels deploy version wheels-deploy mirrors kamal 2.4.0 / kamal-proxy v0.8.6 $ wheels packages list [reaches the next level — see follow-up note below] Reported as F7 in the second VM-onboarding journal. Validated locally via the onboarding harness (PR #2308): with this fix applied, the `wheels deploy` family resolves cleanly in the LUCLI_HOME-isolated test that simulates a fresh brew install. Scope: 88 files in cli/lucli/, 482 -> 486 prefix substitutions (small discrepancy because a handful of files had >1 ref per line via comments or chained calls). Includes test specs so they continue to mirror production paths. Out of scope (separate follow-up): `wheels packages list` now reaches PackagesMainCli but fails at cli/lucli/services/packages/VersionResolver.cfc:17 which does `new wheels.SemVer()` — a reference to the framework's `vendor/wheels/SemVer.cfc`. The framework isn't on the CLI's resolution path when running outside an app, so SemVer can't be found. That's a different architectural issue (CLI command depends on framework being loaded) and warrants its own PR. The harness Phase 7 will continue to surface it as a SKIP until that's fixed.
1 parent 525a30e commit 32cfb4c

89 files changed

Lines changed: 486 additions & 486 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cli/lucli/Module.cfc

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,8 +1310,8 @@ component extends="modules.BaseModule" {
13101310
var positional = $deployStripFlags(args);
13111311
var sub = arrayLen(positional) >= 1 ? positional[1] : "deploy";
13121312

1313-
var dmc = new cli.lucli.services.deploy.cli.DeployMainCli(
1314-
new cli.lucli.services.deploy.lib.SshPool()
1313+
var dmc = new modules.wheels.services.deploy.cli.DeployMainCli(
1314+
new modules.wheels.services.deploy.lib.SshPool()
13151315
);
13161316

13171317
switch (sub) {
@@ -1348,8 +1348,8 @@ component extends="modules.BaseModule" {
13481348
throw(message="wheels deploy app requires a verb");
13491349
}
13501350
var appVerb = positional[2];
1351-
var appCli = new cli.lucli.services.deploy.cli.DeployAppCli(
1352-
new cli.lucli.services.deploy.lib.SshPool()
1351+
var appCli = new modules.wheels.services.deploy.cli.DeployAppCli(
1352+
new modules.wheels.services.deploy.lib.SshPool()
13531353
);
13541354
switch (appVerb) {
13551355
case "boot":
@@ -1371,8 +1371,8 @@ component extends="modules.BaseModule" {
13711371
throw(message="wheels deploy proxy requires a verb");
13721372
}
13731373
var proxyVerb = positional[2];
1374-
var proxyCli = new cli.lucli.services.deploy.cli.DeployProxyCli(
1375-
new cli.lucli.services.deploy.lib.SshPool()
1374+
var proxyCli = new modules.wheels.services.deploy.cli.DeployProxyCli(
1375+
new modules.wheels.services.deploy.lib.SshPool()
13761376
);
13771377
switch (proxyVerb) {
13781378
case "boot":
@@ -1392,8 +1392,8 @@ component extends="modules.BaseModule" {
13921392
throw(message="wheels deploy registry requires a verb");
13931393
}
13941394
var registryVerb = positional[2];
1395-
var registryCli = new cli.lucli.services.deploy.cli.DeployRegistryCli(
1396-
new cli.lucli.services.deploy.lib.SshPool()
1395+
var registryCli = new modules.wheels.services.deploy.cli.DeployRegistryCli(
1396+
new modules.wheels.services.deploy.lib.SshPool()
13971397
);
13981398
switch (registryVerb) {
13991399
case "setup":
@@ -1409,8 +1409,8 @@ component extends="modules.BaseModule" {
14091409
throw(message="wheels deploy build requires a verb");
14101410
}
14111411
var buildVerb = positional[2];
1412-
var buildCli = new cli.lucli.services.deploy.cli.DeployBuildCli(
1413-
new cli.lucli.services.deploy.lib.SshPool()
1412+
var buildCli = new modules.wheels.services.deploy.cli.DeployBuildCli(
1413+
new modules.wheels.services.deploy.lib.SshPool()
14141414
);
14151415
switch (buildVerb) {
14161416
case "deliver":
@@ -1430,8 +1430,8 @@ component extends="modules.BaseModule" {
14301430
}
14311431
var accVerb = positional[2];
14321432
opts.name = arrayLen(positional) >= 3 ? positional[3] : "";
1433-
var accCli = new cli.lucli.services.deploy.cli.DeployAccessoryCli(
1434-
new cli.lucli.services.deploy.lib.SshPool()
1433+
var accCli = new modules.wheels.services.deploy.cli.DeployAccessoryCli(
1434+
new modules.wheels.services.deploy.lib.SshPool()
14351435
);
14361436
switch (accVerb) {
14371437
case "boot":
@@ -1454,8 +1454,8 @@ component extends="modules.BaseModule" {
14541454
if (!listFindNoCase("all,images,containers", pruneVerb)) {
14551455
throw(message="Unknown wheels deploy prune verb: " & pruneVerb);
14561456
}
1457-
var pruneCli = new cli.lucli.services.deploy.cli.DeployPruneCli(
1458-
new cli.lucli.services.deploy.lib.SshPool()
1457+
var pruneCli = new modules.wheels.services.deploy.cli.DeployPruneCli(
1458+
new modules.wheels.services.deploy.lib.SshPool()
14591459
);
14601460
return invoke(pruneCli, pruneVerb, [opts]);
14611461
case "server":
@@ -1474,8 +1474,8 @@ component extends="modules.BaseModule" {
14741474
}
14751475
opts.cmd = arrayToList(cmdParts, " ");
14761476
}
1477-
var serverCli = new cli.lucli.services.deploy.cli.DeployServerCli(
1478-
new cli.lucli.services.deploy.lib.SshPool()
1477+
var serverCli = new modules.wheels.services.deploy.cli.DeployServerCli(
1478+
new modules.wheels.services.deploy.lib.SshPool()
14791479
);
14801480
switch (serverVerb) {
14811481
case "exec":
@@ -1491,8 +1491,8 @@ component extends="modules.BaseModule" {
14911491
if (!listFindNoCase("acquire,release,status", lockVerb)) {
14921492
throw(message="Unknown wheels deploy lock verb: " & lockVerb);
14931493
}
1494-
var lockCli = new cli.lucli.services.deploy.cli.DeployLockCli(
1495-
new cli.lucli.services.deploy.lib.SshPool()
1494+
var lockCli = new modules.wheels.services.deploy.cli.DeployLockCli(
1495+
new modules.wheels.services.deploy.lib.SshPool()
14961496
);
14971497
return invoke(lockCli, lockVerb, [opts]);
14981498
case "secrets":
@@ -1510,7 +1510,7 @@ component extends="modules.BaseModule" {
15101510
if (secVerb == "extract") {
15111511
opts.key = arrayLen(positional) >= 3 ? positional[3] : "";
15121512
}
1513-
var secCli = new cli.lucli.services.deploy.cli.DeploySecretsCli();
1513+
var secCli = new modules.wheels.services.deploy.cli.DeploySecretsCli();
15141514
return invoke(secCli, secVerb, [opts]);
15151515
default:
15161516
throw(message="Unknown deploy subcommand: #sub#");
@@ -1626,39 +1626,39 @@ component extends="modules.BaseModule" {
16261626

16271627
switch (sub) {
16281628
case "list":
1629-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1629+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16301630
return mainCli.list(opts);
16311631
case "search":
16321632
if (arrayLen(positional) < 2) {
16331633
throw(message="search requires a query: wheels packages search <query>");
16341634
}
16351635
opts.query = positional[2];
1636-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1636+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16371637
return mainCli.search(opts);
16381638
case "show":
16391639
if (arrayLen(positional) < 2) {
16401640
throw(message="show requires a name: wheels packages show <name>");
16411641
}
16421642
opts.name = positional[2];
1643-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1643+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16441644
return mainCli.show(opts);
16451645
case "install":
16461646
if (arrayLen(positional) < 2) {
16471647
throw(message="install requires a name: wheels packages install <name>[@<version>]");
16481648
}
16491649
opts.target = positional[2];
1650-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1650+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16511651
return mainCli.install(opts);
16521652
case "update":
16531653
opts.target = arrayLen(positional) >= 2 ? positional[2] : "";
1654-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1654+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16551655
return mainCli.update(opts);
16561656
case "remove":
16571657
if (arrayLen(positional) < 2) {
16581658
throw(message="remove requires a name: wheels packages remove <name>");
16591659
}
16601660
opts.target = positional[2];
1661-
var mainCli = new cli.lucli.services.packages.PackagesMainCli();
1661+
var mainCli = new modules.wheels.services.packages.PackagesMainCli();
16621662
return mainCli.remove(opts);
16631663
case "registry":
16641664
if (arrayLen(positional) < 2) {
@@ -1668,7 +1668,7 @@ component extends="modules.BaseModule" {
16681668
if (!listFindNoCase("refresh,info", regVerb)) {
16691669
throw(message="Unknown wheels packages registry verb: #regVerb#");
16701670
}
1671-
var regCli = new cli.lucli.services.packages.PackagesRegistryCli();
1671+
var regCli = new modules.wheels.services.packages.PackagesRegistryCli();
16721672
return invoke(regCli, regVerb, [opts]);
16731673
default:
16741674
throw(message="Unknown packages subcommand: #sub#");

cli/lucli/services/MigrationRunner.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* in-process command execution. Falls back to HTTP when a server is running.
66
*
77
* Usage from LuceeScriptEngine:
8-
* var runner = new cli.lucli.services.MigrationRunner(projectRoot);
8+
* var runner = new modules.wheels.services.MigrationRunner(projectRoot);
99
* var result = runner.latest();
1010
*/
1111
component {

cli/lucli/services/TestRunner.cfc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
* for test execution.
77
*
88
* Usage from LuceeScriptEngine:
9-
* var runner = new cli.lucli.services.TestRunner(projectRoot);
9+
* var runner = new modules.wheels.services.TestRunner(projectRoot);
1010
* var result = runner.run(options);
1111
*
1212
* Usage from HTTP fallback (Module.cfc delegates here when server is available):
13-
* var runner = new cli.lucli.services.TestRunner(projectRoot);
13+
* var runner = new modules.wheels.services.TestRunner(projectRoot);
1414
* var result = runner.runViaHttp(serverPort, options);
1515
*/
1616
component {

cli/lucli/services/deploy/cli/DeployAccessoryCli.cfc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ component {
1616

1717
public DeployAccessoryCli function init(any sshPool = "") {
1818
variables.sshPool = arguments.sshPool;
19-
variables.loader = new cli.lucli.services.deploy.config.ConfigLoader();
19+
variables.loader = new modules.wheels.services.deploy.config.ConfigLoader();
2020
variables.dryRunBuffer = [];
2121
return this;
2222
}
@@ -53,7 +53,7 @@ component {
5353
arguments.opts.configPath,
5454
{destination: arguments.opts.destination ?: ""}
5555
);
56-
var accCmds = new cli.lucli.services.deploy.commands.AccessoryCommands(cfg);
56+
var accCmds = new modules.wheels.services.deploy.commands.AccessoryCommands(cfg);
5757
var dryRun = arguments.opts.dryRun ?: false;
5858
var targets = (arguments.opts.name == "all")
5959
? cfg.accessories()

cli/lucli/services/deploy/cli/DeployAppCli.cfc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ component {
1515

1616
public DeployAppCli function init(any sshPool = "") {
1717
variables.sshPool = arguments.sshPool;
18-
variables.loader = new cli.lucli.services.deploy.config.ConfigLoader();
18+
variables.loader = new modules.wheels.services.deploy.config.ConfigLoader();
1919
variables.dryRunBuffer = [];
2020
return this;
2121
}
@@ -112,7 +112,7 @@ component {
112112
message="This verb requires --version");
113113
}
114114
var dryRun = arguments.opts.dryRun ?: false;
115-
var appCmds = new cli.lucli.services.deploy.commands.AppCommands(cfg);
115+
var appCmds = new modules.wheels.services.deploy.commands.AppCommands(cfg);
116116
var roleFilter = arguments.opts.role ?: "";
117117
var hostCount = 0;
118118

cli/lucli/services/deploy/cli/DeployBuildCli.cfc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ component {
1414

1515
public DeployBuildCli function init(any sshPool = "") {
1616
variables.sshPool = arguments.sshPool;
17-
variables.loader = new cli.lucli.services.deploy.config.ConfigLoader();
17+
variables.loader = new modules.wheels.services.deploy.config.ConfigLoader();
1818
variables.dryRunBuffer = [];
1919
return this;
2020
}
@@ -40,7 +40,7 @@ component {
4040
var version = arguments.opts.version ?: $gitShortSha();
4141
var dryRun = arguments.opts.dryRun ?: false;
4242
if (!len(arguments.opts.preserveBuffer ?: "")) arrayClear(variables.dryRunBuffer);
43-
var builder = new cli.lucli.services.deploy.commands.BuilderCommands(cfg);
43+
var builder = new modules.wheels.services.deploy.commands.BuilderCommands(cfg);
4444
$runLocal(builder.push(version), dryRun);
4545
return $renderResult(arguments.opts, "Pushed " & cfg.image() & ":" & version);
4646
}
@@ -50,7 +50,7 @@ component {
5050
var version = arguments.opts.version ?: $gitShortSha();
5151
var dryRun = arguments.opts.dryRun ?: false;
5252
if (!len(arguments.opts.preserveBuffer ?: "")) arrayClear(variables.dryRunBuffer);
53-
var builder = new cli.lucli.services.deploy.commands.BuilderCommands(cfg);
53+
var builder = new modules.wheels.services.deploy.commands.BuilderCommands(cfg);
5454
var hosts = $allHosts(cfg);
5555
$dispatchSsh(hosts, builder.pull(version), dryRun);
5656
return $renderResult(
@@ -63,31 +63,31 @@ component {
6363
var cfg = $loadCfg(arguments.opts);
6464
var dryRun = arguments.opts.dryRun ?: false;
6565
arrayClear(variables.dryRunBuffer);
66-
$runLocal(new cli.lucli.services.deploy.commands.BuilderCommands(cfg).create(), dryRun);
66+
$runLocal(new modules.wheels.services.deploy.commands.BuilderCommands(cfg).create(), dryRun);
6767
return $renderResult(arguments.opts, "Created builder for " & cfg.image());
6868
}
6969

7070
public string function remove(required struct opts) {
7171
var cfg = $loadCfg(arguments.opts);
7272
var dryRun = arguments.opts.dryRun ?: false;
7373
arrayClear(variables.dryRunBuffer);
74-
$runLocal(new cli.lucli.services.deploy.commands.BuilderCommands(cfg).remove(), dryRun);
74+
$runLocal(new modules.wheels.services.deploy.commands.BuilderCommands(cfg).remove(), dryRun);
7575
return $renderResult(arguments.opts, "Removed builder for " & cfg.image());
7676
}
7777

7878
public string function details(required struct opts) {
7979
var cfg = $loadCfg(arguments.opts);
8080
var dryRun = arguments.opts.dryRun ?: false;
8181
arrayClear(variables.dryRunBuffer);
82-
$runLocal(new cli.lucli.services.deploy.commands.BuilderCommands(cfg).details(), dryRun);
82+
$runLocal(new modules.wheels.services.deploy.commands.BuilderCommands(cfg).details(), dryRun);
8383
return $renderResult(arguments.opts, "Collected builder details for " & cfg.image());
8484
}
8585

8686
public string function dev(required struct opts) {
8787
var cfg = $loadCfg(arguments.opts);
8888
var dryRun = arguments.opts.dryRun ?: false;
8989
arrayClear(variables.dryRunBuffer);
90-
$runLocal(new cli.lucli.services.deploy.commands.BuilderCommands(cfg).dev(), dryRun);
90+
$runLocal(new modules.wheels.services.deploy.commands.BuilderCommands(cfg).dev(), dryRun);
9191
return $renderResult(arguments.opts, "Ran dev build for " & cfg.image());
9292
}
9393

cli/lucli/services/deploy/cli/DeployLockCli.cfc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ component {
1010

1111
public DeployLockCli function init(any sshPool = "") {
1212
variables.sshPool = arguments.sshPool;
13-
variables.loader = new cli.lucli.services.deploy.config.ConfigLoader();
13+
variables.loader = new modules.wheels.services.deploy.config.ConfigLoader();
1414
variables.dryRunBuffer = [];
1515
return this;
1616
}
@@ -21,7 +21,7 @@ component {
2121
var cfg = $loadCfg(arguments.opts);
2222
var dryRun = arguments.opts.dryRun ?: false;
2323
arrayClear(variables.dryRunBuffer);
24-
var lock = new cli.lucli.services.deploy.commands.LockCommands(cfg);
24+
var lock = new modules.wheels.services.deploy.commands.LockCommands(cfg);
2525
var cmd = lock.acquire({
2626
user: $currentUser(),
2727
message: arguments.opts.message ?: "manual acquire"
@@ -34,7 +34,7 @@ component {
3434
var cfg = $loadCfg(arguments.opts);
3535
var dryRun = arguments.opts.dryRun ?: false;
3636
arrayClear(variables.dryRunBuffer);
37-
var lock = new cli.lucli.services.deploy.commands.LockCommands(cfg);
37+
var lock = new modules.wheels.services.deploy.commands.LockCommands(cfg);
3838
$dispatchAny($allHosts(cfg), lock.release(), dryRun);
3939
return $renderResult(arguments.opts, "Released deploy lock for " & cfg.service());
4040
}
@@ -43,7 +43,7 @@ component {
4343
var cfg = $loadCfg(arguments.opts);
4444
var dryRun = arguments.opts.dryRun ?: false;
4545
arrayClear(variables.dryRunBuffer);
46-
var lock = new cli.lucli.services.deploy.commands.LockCommands(cfg);
46+
var lock = new modules.wheels.services.deploy.commands.LockCommands(cfg);
4747
$dispatchAny($allHosts(cfg), lock.status(), dryRun);
4848
return $renderResult(arguments.opts, "Checked deploy lock status for " & cfg.service());
4949
}

0 commit comments

Comments
 (0)