Implements the execa Agent Note's four sub-changes:
- execa (root devDep + loader-smoke dep) replaces the hand-rolled
spawn-collect-timeout choreography in loader-smoke, apps/cli and
cli-demo/acp-demo built-bin e2e, lsp-local and code-runtime-worker
built-lib e2e, the tui pty-harness outer collector, the jsonrpc
keyless smoke, and crash-recovery's child spawn. Genuinely custom
parts stay custom: cli-demo's interrupt-on-marker, jsonrpc's
line-predicate protocol driving, crash-recovery's SIGKILL-at-failpoint.
The two loader-smoke /* v8 ignore */ OS-error branches are gone.
- llm-mock-server CLI tokenizes via node:util parseArgs; numeric
coercion/bounds/cross-option constraints stay manual; pinned
error-message tests updated to the parseArgs texts.
- both loadRootEnv copies in apps/web/tests are deleted: the owning
vitest configs (web unconditionally, snapshot in record mode)
already load the repo-root .env before these files run.
- the four poll loops (acp-snapshot harness waits + crash-recovery
waitForFile) ride vi.waitFor with explicit {interval, timeout}.
@deepseek-ai/dsh-loader-smoke
English | 中文
Shared subprocess harness for tests that boot an app and cordis.yml through the Cordis Loader. resolveExampleLaunch selects local src mode (tsx and root tsconfig paths) or CI lib mode (plain Node and package exports) from an explicit mode or DSH_EXAMPLE_MODE.
runLoaderSmoke accepts bin and config paths, optional complete bin arguments, environment overrides, stdin, pre-run setup, and pre-cleanup inspection. It owns the isolated cwd, DSH homes, diagnostics, deadline, termination, EOF, and cleanup; it returns both streams after a zero exit and rejects with both streams on failure.
This is support-tier test infrastructure, not product API.
Model Experience
None, as this test-only harness boots example processes and inspects their streams without changing an assembled model request.
KV Cache effect
None; this package neither assembles nor sends a provider request.
Known Limitations and Deferred Work
- Built mode requires a prior build — the config must also resolve every named package upward through
examples/node_modules. - Captured stdout and stderr are unbounded — a runaway child can consume memory until the deadline kills it.
- Timeout kills only the direct child — a process tree spawned by a faulty fixture can outlive the smoke and needs external cleanup.