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
Build the separate CLI client package/bin (@rushstack/rush-cli-client on @rushstack/rush-client-core) and its command surface — fallback/opt-in routing, rush daemon subcommands, the rush.json daemon config block + env overrides, an experimental rush daemon graph reference client, and a standalone rushx-equivalent bin — all opt-in until cutover.
rush-client-core + rush-cli-client bin. Connect/forward/pump, the request envelope (argv, cwd, env, columns, colorLevel), stream pumping, exit-code relay, and cancel-on-signal — with noSIGWINCH forwarding (the client owns width/resize).
Fallback/opt-in routing. Decide daemon vs in-process per invocation from RUSH_DAEMON, --no-daemon, rush.json config, CI detection, and the never-daemonize list (routing to today's in-process path otherwise).
rush.json daemon config. A validated daemon block (enabled, idleTimeoutSeconds, autoStart, watch, queueTimeoutSeconds, plus the WS3 warm-set knobs) with RUSH_DAEMON* env overrides.
rush daemon subcommands.start|stop|restart|status|logs (themselves never-daemonized); status surfaces warm-set + lifecycle info (uptime, PID, reload tier, warm projects, memory) and logs streams the daemon log.
Experimental rush daemon graph. Behind RUSH_DAEMON_EXPERIMENTAL=1, show/status/scope-in/scope-out/invalidate/watch/pause/resume over the warm graph, serving as a reference "third client" that consumes only structured events.
Standalone rushx-equivalent. Run the cwd project's package script with the same auto-start/forward behavior; it becomes rushx at cutover (WS5).
Acceptance criteria
The client connects, sends the request envelope, pumps stdout/stderr/stdin, and relays the daemon's exit code; Ctrl+C cancels the request; SIGWINCH is handled client-side and not forwarded; a sample rush build via the client is behaviorally equivalent to in-process (full matrix in WS5).
Each routing input (RUSH_DAEMON, --no-daemon, config, CI, never-daemonize) selects the correct path with a documented precedence order; CI defaults to in-process (no auto-start) unless explicitly opted in.
The rush.jsondaemon schema is published and validates the block (rejecting unknown/invalid values) with precedence env > config > default.
Each rush daemon subcommand acts against a running (or absent) daemon with correct exit codes; status reports warm-set + lifecycle info and logs streams the daemon log (see WS5).
The experimental rush daemon graph verbs operate over the warm graph via the protocol only (no rush-lib-internal calls), consume only the presentation-free event contract, and stay gated off unless RUSH_DAEMON_EXPERIMENTAL=1.
The standalone rushx-equivalent resolves the project by cwd, forwards with auto-start, and matches today's rushx output/exit code for a sample script.
rush-client-core has no rush-lib dependency and commits its API Extractor report; everything ships opt-in until cutover; tests green in CI.
Build the separate CLI client package/bin (
@rushstack/rush-cli-clienton@rushstack/rush-client-core) and its command surface — fallback/opt-in routing,rush daemonsubcommands, therush.jsondaemon config block + env overrides, an experimentalrush daemon graphreference client, and a standalonerushx-equivalent bin — all opt-in until cutover.Depends on: #5896; #5897; #5898
Scope
rush-client-core+rush-cli-clientbin. Connect/forward/pump, the request envelope (argv,cwd,env,columns,colorLevel), stream pumping, exit-code relay, and cancel-on-signal — with noSIGWINCHforwarding (the client owns width/resize).RUSH_DAEMON,--no-daemon,rush.jsonconfig, CI detection, and the never-daemonize list (routing to today's in-process path otherwise).rush.jsondaemon config. A validateddaemonblock (enabled,idleTimeoutSeconds,autoStart,watch,queueTimeoutSeconds, plus the WS3 warm-set knobs) withRUSH_DAEMON*env overrides.rush daemonsubcommands.start|stop|restart|status|logs(themselves never-daemonized);statussurfaces warm-set + lifecycle info (uptime, PID, reload tier, warm projects, memory) andlogsstreams the daemon log.rush daemon graph. BehindRUSH_DAEMON_EXPERIMENTAL=1,show/status/scope-in/scope-out/invalidate/watch/pause/resumeover the warm graph, serving as a reference "third client" that consumes only structured events.rushx-equivalent. Run the cwd project's package script with the same auto-start/forward behavior; it becomesrushxat cutover (WS5).Acceptance criteria
SIGWINCHis handled client-side and not forwarded; a samplerush buildvia the client is behaviorally equivalent to in-process (full matrix in WS5).RUSH_DAEMON,--no-daemon, config, CI, never-daemonize) selects the correct path with a documented precedence order; CI defaults to in-process (no auto-start) unless explicitly opted in.rush.jsondaemonschema is published and validates the block (rejecting unknown/invalid values) with precedence env > config > default.rush daemonsubcommand acts against a running (or absent) daemon with correct exit codes;statusreports warm-set + lifecycle info andlogsstreams the daemon log (see WS5).rush daemon graphverbs operate over the warm graph via the protocol only (no rush-lib-internal calls), consume only the presentation-free event contract, and stay gated off unlessRUSH_DAEMON_EXPERIMENTAL=1.rushx-equivalent resolves the project by cwd, forwards with auto-start, and matches today'srushxoutput/exit code for a sample script.rush-client-corehas norush-libdependency and commits its API Extractor report; everything ships opt-in until cutover; tests green in CI.Part of #5894.