capture and return claude print output instead of writing directly to stdout

This commit is contained in:
Chris Wanstrath 2026-02-19 11:15:15 -08:00
parent d4a3053bd7
commit 4399fdef03
3 changed files with 27 additions and 7 deletions

View File

@ -132,9 +132,13 @@ program
if (opts.print) { if (opts.print) {
spin.text = "Running prompt…" spin.text = "Running prompt…"
await vm.claude(worktreeAbs, { prompt, print: opts.print }) const output = await vm.claude(worktreeAbs, { prompt, print: opts.print })
process.stdout.write("\n") if (output) {
spin.succeed("Prompt complete") spin.stop()
process.stdout.write(output + "\n")
} else {
spin.succeed("Done")
}
} else { } else {
await vm.claude(worktreeAbs, { prompt, print: opts.print }) await vm.claude(worktreeAbs, { prompt, print: opts.print })
} }
@ -192,9 +196,13 @@ program
if (opts.print) { if (opts.print) {
spin.text = "Running prompt…" spin.text = "Running prompt…"
await vm.claude(session.worktree, { prompt, print: opts.print }) const output = await vm.claude(session.worktree, { prompt, print: opts.print })
process.stdout.write("\n") if (output) {
spin.succeed("Prompt complete") spin.stop()
process.stdout.write(output + "\n")
} else {
spin.succeed("Done")
}
} else { } else {
spin.succeed("Session ready") spin.succeed("Session ready")
await vm.claude(session.worktree, { prompt, print: opts.print }) await vm.claude(session.worktree, { prompt, print: opts.print })

View File

@ -18,5 +18,9 @@ export function spinner(text: string) {
clearInterval(id) clearInterval(id)
process.stderr.write(`\r\x1b[2K✖ ${msg}\n`) process.stderr.write(`\r\x1b[2K✖ ${msg}\n`)
}, },
stop() {
clearInterval(id)
process.stderr.write(`\r\x1b[2K`)
},
} }
} }

View File

@ -107,7 +107,7 @@ export async function status(): Promise<"running" | "stopped" | "missing"> {
} }
/** Launch claude in the container at the given workdir. */ /** Launch claude in the container at the given workdir. */
export async function claude(workdir: string, opts?: { prompt?: string; print?: string }): Promise<void> { export async function claude(workdir: string, opts?: { prompt?: string; print?: string }): Promise<string | void> {
const cwd = containerPath(workdir) const cwd = containerPath(workdir)
const systemPrompt = [ const systemPrompt = [
"You are running inside a sandlot container (Apple Container, ubuntu:24.04).", "You are running inside a sandlot container (Apple Container, ubuntu:24.04).",
@ -119,6 +119,14 @@ export async function claude(workdir: string, opts?: { prompt?: string; print?:
const args = ["container", "exec", "-it", "--user", USER, "--workdir", cwd, CONTAINER_NAME, CLAUDE_BIN, "--dangerously-skip-permissions", "--model", "claude-opus-4-6", "--append-system-prompt", systemPrompt] const args = ["container", "exec", "-it", "--user", USER, "--workdir", cwd, CONTAINER_NAME, CLAUDE_BIN, "--dangerously-skip-permissions", "--model", "claude-opus-4-6", "--append-system-prompt", systemPrompt]
if (opts?.print) args.push("-p", opts.print) if (opts?.print) args.push("-p", opts.print)
else if (opts?.prompt) args.push(opts.prompt) else if (opts?.prompt) args.push(opts.prompt)
if (opts?.print) {
const proc = Bun.spawn(args, { stdin: "inherit", stdout: "pipe", stderr: "inherit" })
const output = await new Response(proc.stdout).text()
await proc.exited
return output
}
const proc = Bun.spawn(args, { stdin: "inherit", stdout: "inherit", stderr: "inherit" }) const proc = Bun.spawn(args, { stdin: "inherit", stdout: "inherit", stderr: "inherit" })
await proc.exited await proc.exited
} }