feat(cli): extend run command with port, attach, session-id, on-complete, and json options
Implement all 5 CLI extension options for external orchestration: - --port <port>: Start server on port, or attach if port occupied - --attach <url>: Connect to existing opencode server - --session-id <id>: Resume existing session instead of creating new - --on-complete <command>: Execute shell command with env vars on completion - --json: Output structured RunResult JSON to stdout Refactor runner.ts into focused modules: - agent-resolver.ts: Agent resolution logic - server-connection.ts: Server connection management - session-resolver.ts: Session create/resume with retry - json-output.ts: Stdout redirect + JSON emission - on-complete-hook.ts: Shell command execution with env vars Fixes #1586
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import type { RunResult } from "./types"
|
||||
|
||||
export interface JsonOutputManager {
|
||||
redirectToStderr: () => void
|
||||
restore: () => void
|
||||
emitResult: (result: RunResult) => void
|
||||
}
|
||||
|
||||
interface JsonOutputManagerOptions {
|
||||
stdout?: NodeJS.WriteStream
|
||||
stderr?: NodeJS.WriteStream
|
||||
}
|
||||
|
||||
export function createJsonOutputManager(
|
||||
options: JsonOutputManagerOptions = {}
|
||||
): JsonOutputManager {
|
||||
const stdout = options.stdout ?? process.stdout
|
||||
const stderr = options.stderr ?? process.stderr
|
||||
|
||||
const originalWrite = stdout.write.bind(stdout)
|
||||
|
||||
function redirectToStderr(): void {
|
||||
stdout.write = function (chunk: string): boolean {
|
||||
return stderr.write(chunk)
|
||||
}
|
||||
}
|
||||
|
||||
function restore(): void {
|
||||
stdout.write = originalWrite
|
||||
}
|
||||
|
||||
function emitResult(result: RunResult): void {
|
||||
restore()
|
||||
originalWrite(JSON.stringify(result) + "\n")
|
||||
}
|
||||
|
||||
return {
|
||||
redirectToStderr,
|
||||
restore,
|
||||
emitResult,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user