Applies findings from the third simplify pass:
1. \`cliArgv\` is a module-level const, not a function — prebuiltCli is
read once at module init and never mutated, so the per-spawn function
allocation was pure overhead.
2. Help-snapshot failures surface via \`Effect.fail\` instead of \`throw\`,
symmetric with the \`Effect.fail\` already inside the partition above.
Keeps the failure typed in the Effect channel rather than as a defect.
3. \`prebuild-test-cli.ts\` skips the build when the binary is already
newer than every file in src/ — saves the 2.8s rebuild cost on every
subsequent invocation. Pass --force to bypass.
4. \`prebuild-test-cli.ts\` verifies the built binary is executable before
symlinking — catches a silently-failed build leaving stale output
instead of letting tests fail with confusing exec errors later.
Verified: 331/331 CLI tests pass; typecheck clean; skip-if-fresh + --force
behave as documented.
\`bun run --conditions=browser src/index.ts\` pays ~15s of JIT + plugin
init + DB migration per subprocess spawn in isolation mode. A pre-built
binary cuts that to ~5s — most of which is now the SQLite \`:memory:\`
migration that runs regardless of execution mode.
Adds \`script/prebuild-test-cli.ts\` which wraps the existing build.ts
with \`--single --skip-embed-web-ui --skip-install\`, then symlinks the
platform-specific output to \`dist/test-cli/bin/opencode\` so the
harness has a stable path.
The harness (test/lib/cli-process.ts) reads OPENCODE_TEST_CLI_PATH and
spawns the binary directly when set; falls back to dev mode otherwise.
Strictly opt-in — default behavior, CI, and local iteration are
unchanged. Anyone who wants the speedup runs:
bun script/prebuild-test-cli.ts
export OPENCODE_TEST_CLI_PATH="\$PWD/dist/test-cli/bin/opencode"
bun test test/cli/
Measured locally:
Dev mode (default): 29.9s (331 tests)
Binary mode: 22.1s (-26%, after one-time 2.8s build)
The win compounds as more subprocess tests are added — every new test
that hits DB migration saves ~10s vs dev mode.
Reduce avoidable setup costs in slow opencode tests while preserving reviewed coverage and recording the benchmark evidence for follow-up test-suite work.
Users installing with pnpm or --ignore-scripts now see a clear explanation
of why the native binary is missing and exact steps to fix it. The shell
script wrapper provides more actionable guidance than the previous Node.js
fallback that only suggested running the postinstall script without context
about why it wasn't run automatically.
Fixes an issue where GitHub artifact downloads could strip executable bits
from binaries, causing Docker builds to fail when using unpacked dist files
directly rather than published tarballs. The chmod now runs before the
publish check to guarantee binaries are executable.