What happens
On Linux, running the CLI produces no output at all and the process stays alive indefinitely. rpx --help never prints its help and has to be killed. On macOS the same command works normally.
Reproduced on both GitHub runners in CI, ubuntu-latest (x64) and a linux/arm64 container, at 45 second timeouts.
Evidence
A test that spawns the CLI and waits for output fails with:
rpx --help produced nothing (still running after 45s)The process is confirmed alive, not crashed: no error event from the spawn, and no exit event. Its stdout and stderr are both empty.
startGateway logs its route count and listening port unconditionally as its first action. That line appears in CI from the in-process tests and never from a spawned child, so the child is not reaching its command at all. The failure is in the entry point, before dispatch.
What is not affected
The gateway itself is fine on Linux. The in-process tests covering fragment merging, Host-header routing, HTTP-only serving and the 404 for an unknown host all pass on x64 and arm64.
Deployments are also unaffected: ts-cloud provisions the gateway as a compiled binary built from a launcher that imports startGateway directly, so it does not go through bin/cli.ts or the CLI framework.
Where to look
Nothing in the import graph does obvious blocking work at module scope, so the likely candidates are a side effect during module initialisation or the argument parser itself. Two module-scope constructions worth checking first are in packages/rpx/src/start.ts:
new ProcessManager()new DefaultPortManager('0.0.0.0')
Also worth checking is the process.chdir at the top of packages/rpx/bin/cli.ts. It is written above the imports but, because ES module imports are hoisted, it actually runs after the whole graph has been evaluated, which is not what its comment describes.
Coverage
packages/rpx/test/gateway.test.ts has a case named "starts and prints its help" that reproduces this directly. It and the end-to-end gateway case are currently skipped on Linux so the rest of CI stays meaningful; both should be re-enabled with this fix.