Describe the bug
The v4.0.0 rpm distribution diverges from the brew/Scoop distributions in two ways that block production deployment of wheels start on Rocky Linux. Surfaced during the titan production cutover on 2026-05-13 (see paiindustries/titan cutover run log).
1. Wrong module ships in /opt/wheels/modules/
The rpm installs the legacy CommandBox-style wheels-cli module (~558 KB, expects box install-shaped contents) instead of the new lucli-native wheels-module (~24 MB, with Module.cfc at top). This makes wheels start fail with Unknown command: 'start'. The brew formula ships the correct wheels-module.
2. Missing /opt/wheels/.version and /opt/wheels/.channel
The wrapper script reads these files to report version info. Without them, wheels --version returns unknown (stable). The brew formula writes both files during install.
3. Wrapper does not prepend module name when invoking lucli
The rpm's /usr/bin/wheels wrapper passes args directly to lucli without prepending the module name, so wheels start becomes lucli start (Unknown command). The brew wrapper renames the binary to wheels and routes via argv[0]. The rpm wrapper needs equivalent routing — either an argv[0] rename or an explicit lucli modules run wheels <args> invocation.
To Reproduce
On a fresh Rocky Linux 10 minimal cloud image:
dnf install tar # rpm omits this dep — see note below
dnf install wheels-4.0.0-1.el10.x86_64.rpm
wheels --version # → "unknown (stable)"
wheels start # → "Unknown command: 'start'"
ls /opt/wheels/modules/ # → wheels-cli/ (legacy), not wheels-module/
Expected behavior
wheels --version returns the installed version + channel.
wheels start launches the Lucee server.
/opt/wheels/modules/ contains wheels-module (lucli-native), not wheels-cli (CommandBox-legacy).
Workaround currently in production (paiindustries/titan)
The titan Ansible wheels-cli role overlays the correct module after rpm install, writes .version + .channel, and uses wheels modules run wheels start in the systemd unit. See ansible/roles/wheels-cli/ and commits 867d1f906 + 9dc45da6b + 3a3c1dbe5.
This workaround should not be necessary — every titan VM has to apply it independently.
Additional notes
- The rpm should explicitly declare
tar as a dependency. Rocky Linux 10 minimal cloud images do not ship tar, and the rpm's post-install (or any role unpacking the module) fails silently without it.
- The rpm wrapper's invocation strategy could mirror the brew approach (argv[0] rename) or use explicit module-routed lucli calls. Either is fine — they just need to match each other across distributions.
Desktop:
- OS: Rocky Linux 10 (minimal cloud image, Proxmox)
- Wheels: 4.0.0 (rpm)
- Java: OpenJDK 21
Describe the bug
The v4.0.0 rpm distribution diverges from the brew/Scoop distributions in two ways that block production deployment of
wheels starton Rocky Linux. Surfaced during the titan production cutover on 2026-05-13 (seepaiindustries/titancutover run log).1. Wrong module ships in
/opt/wheels/modules/The rpm installs the legacy CommandBox-style
wheels-climodule (~558 KB, expectsbox install-shaped contents) instead of the new lucli-nativewheels-module(~24 MB, withModule.cfcat top). This makeswheels startfail withUnknown command: 'start'. The brew formula ships the correctwheels-module.2. Missing
/opt/wheels/.versionand/opt/wheels/.channelThe wrapper script reads these files to report version info. Without them,
wheels --versionreturnsunknown (stable). The brew formula writes both files during install.3. Wrapper does not prepend module name when invoking lucli
The rpm's
/usr/bin/wheelswrapper passes args directly to lucli without prepending the module name, sowheels startbecomeslucli start(Unknown command). The brew wrapper renames the binary towheelsand routes via argv[0]. The rpm wrapper needs equivalent routing — either an argv[0] rename or an explicitlucli modules run wheels <args>invocation.To Reproduce
On a fresh Rocky Linux 10 minimal cloud image:
Expected behavior
wheels --versionreturns the installed version + channel.wheels startlaunches the Lucee server./opt/wheels/modules/containswheels-module(lucli-native), notwheels-cli(CommandBox-legacy).Workaround currently in production (paiindustries/titan)
The titan Ansible
wheels-clirole overlays the correct module after rpm install, writes.version+.channel, and useswheels modules run wheels startin the systemd unit. Seeansible/roles/wheels-cli/and commits 867d1f906 + 9dc45da6b + 3a3c1dbe5.This workaround should not be necessary — every titan VM has to apply it independently.
Additional notes
taras a dependency. Rocky Linux 10 minimal cloud images do not shiptar, and the rpm's post-install (or any role unpacking the module) fails silently without it.Desktop: