From d22b5fbcea40fed7150cc03050697ef2daeb1250 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Thu, 12 Mar 2026 14:20:07 -0700 Subject: [PATCH 1/2] Add default port-from value of 5400 --- CLAUDE.md | 2 +- src/cli/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 81216eb..37892fb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,7 +13,7 @@ Transcript-based shell integration test runner. Bun + TypeScript. - `--path ` — prepend to `$PATH` (repeatable) - `--timeout ` — per-command timeout (default `10s`) - `-v, --verbose` — print each command as it runs - - `--port-from ` — auto-assign `$PORT` starting from n + - `--port-from ` — auto-assign `$PORT` starting from n (default `5400`) - `--parallel` — run files in parallel ## Architecture diff --git a/src/cli/index.ts b/src/cli/index.ts index 2c3a72a..b86a083 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -79,7 +79,7 @@ program .option("--path ", "Prepend to PATH (repeatable)", (val: string, acc: string[]) => [...acc, val], []) .option("--timeout ", "Per-command timeout", "10s") .option("-v, --verbose", "Print each command as it runs") - .option("--port-from ", "Auto-assign $PORT starting from ") + .option("--port-from ", "Auto-assign $PORT starting from ", "5400") .option("--parallel", "Run files in parallel") .action(async (fileArgs: string[], opts) => { const timeoutMs = parseDuration(opts.timeout) From c71a34cc858a1df27db940d362d56427cf41721a Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Thu, 12 Mar 2026 14:22:35 -0700 Subject: [PATCH 2/2] Simplify port-from handling and typing --- src/cli/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cli/index.ts b/src/cli/index.ts index b86a083..2d770c4 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -94,14 +94,14 @@ program const start = performance.now() const results: TestResult[] = [] const cwd = process.cwd() - const portFrom = opts.portFrom ? parseInt(opts.portFrom, 10) : undefined - if (portFrom !== undefined && Number.isNaN(portFrom)) { + const portFrom = parseInt(opts.portFrom, 10) + if (Number.isNaN(portFrom)) { console.error("--port-from must be an integer") process.exit(1) } let nextPort = portFrom - const runOne = async (filePath: string, port: number | undefined) => { + const runOne = async (filePath: string, port: number) => { const content = await readFile(filePath, "utf-8") const parsed = parse(relative(cwd, filePath), content) @@ -125,7 +125,7 @@ program } } Object.assign(envVars, setupEnvVars, userEnvVars) - if (port !== undefined && !("PORT" in userEnvVars) && !("PORT" in setupEnvVars)) { + if (!("PORT" in userEnvVars) && !("PORT" in setupEnvVars)) { envVars["PORT"] = String(port) } const merged: ShoutFile = { ...parsed, commands: [...setupCommands, ...parsed.commands] } @@ -203,7 +203,7 @@ program } if (opts.parallel) { - const all = await Promise.all(files.map(f => runOne(f, nextPort !== undefined ? nextPort++ : undefined))) + const all = await Promise.all(files.map(f => runOne(f, nextPort++))) for (const r of all) { printDots(r) results.push(r) @@ -211,7 +211,7 @@ program process.stdout.write("\n") } else { for (const filePath of files) { - const r = await runOne(filePath, nextPort !== undefined ? nextPort++ : undefined) + const r = await runOne(filePath, nextPort++) printDots(r) results.push(r) }