From 5feaa7a101c935f59b2bc1711f246ed71110e523 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 4 May 2026 10:51:49 +0700 Subject: [PATCH] Type CLI command host/json options at the source The CommandOptions interface in packages/cli/src/output/with-output.ts had an open `[key: string]: unknown` indexer, so every consumer of the global --host and --json options had to cast `options.host as string | undefined` at the call site. Add `host?: string` and `json?: boolean` to the interface and remove 29 redundant casts across 12 command files. --- packages/cli/src/commands/agent/delete.ts | 4 ++-- packages/cli/src/commands/agent/logs.ts | 4 ++-- packages/cli/src/commands/agent/ls.ts | 4 ++-- packages/cli/src/commands/agent/mode.ts | 4 ++-- packages/cli/src/commands/agent/run.ts | 4 ++-- packages/cli/src/commands/agent/send.ts | 4 ++-- packages/cli/src/commands/agent/stop.ts | 4 ++-- packages/cli/src/commands/loop/inspect.ts | 4 ++-- packages/cli/src/commands/loop/logs.ts | 4 ++-- packages/cli/src/commands/loop/ls.ts | 4 ++-- packages/cli/src/commands/loop/run.ts | 4 ++-- packages/cli/src/commands/loop/stop.ts | 4 ++-- packages/cli/src/output/with-output.ts | 4 ++++ 13 files changed, 28 insertions(+), 24 deletions(-) diff --git a/packages/cli/src/commands/agent/delete.ts b/packages/cli/src/commands/agent/delete.ts index 91c78f25d..14ae82fc2 100644 --- a/packages/cli/src/commands/agent/delete.ts +++ b/packages/cli/src/commands/agent/delete.ts @@ -39,7 +39,7 @@ export async function runDeleteCommand( options: AgentDeleteOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); if (!id && !options.all && !options.cwd) { const error: CommandError = { @@ -52,7 +52,7 @@ export async function runDeleteCommand( let client: DaemonClient; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); } catch (err) { const message = err instanceof Error ? err.message : String(err); const error: CommandError = { diff --git a/packages/cli/src/commands/agent/logs.ts b/packages/cli/src/commands/agent/logs.ts index d2b8ab676..f5e2da743 100644 --- a/packages/cli/src/commands/agent/logs.ts +++ b/packages/cli/src/commands/agent/logs.ts @@ -86,7 +86,7 @@ export async function runLogsCommand( options: AgentLogsOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); if (!id) { console.error("Error: Agent ID required"); @@ -96,7 +96,7 @@ export async function runLogsCommand( let client: DaemonClient; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); } catch (err) { const message = err instanceof Error ? err.message : String(err); console.error(`Error: Cannot connect to daemon at ${host}: ${message}`); diff --git a/packages/cli/src/commands/agent/ls.ts b/packages/cli/src/commands/agent/ls.ts index 629c96842..fa7308220 100644 --- a/packages/cli/src/commands/agent/ls.ts +++ b/packages/cli/src/commands/agent/ls.ts @@ -168,11 +168,11 @@ export async function runLsCommand( options: AgentLsOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); let client; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); } catch (err) { const message = err instanceof Error ? err.message : String(err); const error: CommandError = { diff --git a/packages/cli/src/commands/agent/mode.ts b/packages/cli/src/commands/agent/mode.ts index a7f959430..ee1a08599 100644 --- a/packages/cli/src/commands/agent/mode.ts +++ b/packages/cli/src/commands/agent/mode.ts @@ -55,7 +55,7 @@ export async function runModeCommand( _command: Command, ): Promise { const normalizedMode = mode?.trim(); - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); // Validate arguments if (!options.list && !normalizedMode) { @@ -64,7 +64,7 @@ export async function runModeCommand( let client: Awaited> | undefined; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); const fetchResult = await client.fetchAgent(id); if (!fetchResult) { const error: CommandError = { diff --git a/packages/cli/src/commands/agent/run.ts b/packages/cli/src/commands/agent/run.ts index 46ee973a7..782eb516f 100644 --- a/packages/cli/src/commands/agent/run.ts +++ b/packages/cli/src/commands/agent/run.ts @@ -358,7 +358,7 @@ export async function runRunCommand( options: AgentRunOptions, _command: Command, ): Promise> { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); const outputSchema = options.outputSchema ? loadOutputSchema(options.outputSchema) : undefined; validateRunOptions(prompt, options, outputSchema); @@ -367,7 +367,7 @@ export async function runRunCommand( const resolvedProviderModel = resolveProviderAndModel(options); const resolvedTitle = options.title ?? options.name; - const client = await connectToDaemonOrThrow(options.host as string | undefined, host); + const client = await connectToDaemonOrThrow(options.host, host); try { // Resolve working directory diff --git a/packages/cli/src/commands/agent/send.ts b/packages/cli/src/commands/agent/send.ts index 04d82eefd..06249289b 100644 --- a/packages/cli/src/commands/agent/send.ts +++ b/packages/cli/src/commands/agent/send.ts @@ -166,7 +166,7 @@ export async function runSendCommand( options: AgentSendOptions, _command: Command, ): Promise> { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); // Validate arguments if (!agentIdArg || agentIdArg.trim().length === 0) { @@ -186,7 +186,7 @@ export async function runSendCommand( let client; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); } catch (err) { const message = err instanceof Error ? err.message : String(err); const error: CommandError = { diff --git a/packages/cli/src/commands/agent/stop.ts b/packages/cli/src/commands/agent/stop.ts index 769017c1f..ef4ebefaa 100644 --- a/packages/cli/src/commands/agent/stop.ts +++ b/packages/cli/src/commands/agent/stop.ts @@ -42,7 +42,7 @@ export async function runStopCommand( options: AgentStopOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); // Validate arguments - need either an id, --all, or --cwd if (!id && !options.all && !options.cwd) { @@ -56,7 +56,7 @@ export async function runStopCommand( let client: DaemonClient; try { - client = await connectToDaemon({ host: options.host as string | undefined }); + client = await connectToDaemon({ host: options.host }); } catch (err) { const message = err instanceof Error ? err.message : String(err); const error: CommandError = { diff --git a/packages/cli/src/commands/loop/inspect.ts b/packages/cli/src/commands/loop/inspect.ts index a2b9812be..4f4cece48 100644 --- a/packages/cli/src/commands/loop/inspect.ts +++ b/packages/cli/src/commands/loop/inspect.ts @@ -83,11 +83,11 @@ export async function runLoopInspectCommand( options: LoopInspectOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); let client; try { client = (await connectToDaemon({ - host: options.host as string | undefined, + host: options.host, })) as unknown as LoopDaemonClient; } catch (error) { const message = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/commands/loop/logs.ts b/packages/cli/src/commands/loop/logs.ts index 150257e27..76a7726b7 100644 --- a/packages/cli/src/commands/loop/logs.ts +++ b/packages/cli/src/commands/loop/logs.ts @@ -42,12 +42,12 @@ export async function runLoopLogsCommand( options: LoopLogsOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); const pollInterval = parsePollInterval(options.pollInterval ?? "1000"); let client: LoopDaemonClient; try { client = (await connectToDaemon({ - host: options.host as string | undefined, + host: options.host, })) as unknown as LoopDaemonClient; } catch (error) { const message = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/commands/loop/ls.ts b/packages/cli/src/commands/loop/ls.ts index 95d068586..514fcdfdc 100644 --- a/packages/cli/src/commands/loop/ls.ts +++ b/packages/cli/src/commands/loop/ls.ts @@ -47,11 +47,11 @@ export async function runLoopLsCommand( options: LoopLsOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); let client; try { client = (await connectToDaemon({ - host: options.host as string | undefined, + host: options.host, })) as unknown as LoopDaemonClient; } catch (error) { const message = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/commands/loop/run.ts b/packages/cli/src/commands/loop/run.ts index 4db86852d..38461fb0c 100644 --- a/packages/cli/src/commands/loop/run.ts +++ b/packages/cli/src/commands/loop/run.ts @@ -153,12 +153,12 @@ export async function runLoopRunCommand( options: LoopRunOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); const input = buildLoopRunInput(prompt, options); let client; try { client = (await connectToDaemon({ - host: options.host as string | undefined, + host: options.host, })) as unknown as LoopDaemonClient; } catch (error) { const message = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/commands/loop/stop.ts b/packages/cli/src/commands/loop/stop.ts index cabe94a9f..1207559ce 100644 --- a/packages/cli/src/commands/loop/stop.ts +++ b/packages/cli/src/commands/loop/stop.ts @@ -44,11 +44,11 @@ export async function runLoopStopCommand( options: LoopStopOptions, _command: Command, ): Promise { - const host = getDaemonHost({ host: options.host as string | undefined }); + const host = getDaemonHost({ host: options.host }); let client; try { client = (await connectToDaemon({ - host: options.host as string | undefined, + host: options.host, })) as unknown as LoopDaemonClient; } catch (error) { const message = error instanceof Error ? error.message : String(error); diff --git a/packages/cli/src/output/with-output.ts b/packages/cli/src/output/with-output.ts index ada456dfd..8a0d37315 100644 --- a/packages/cli/src/output/with-output.ts +++ b/packages/cli/src/output/with-output.ts @@ -10,6 +10,10 @@ import { render, renderError, toCommandError, defaultOutputOptions } from "./ren /** Options that include output settings from global options */ export interface CommandOptions extends Partial { + /** Daemon host target from --host option */ + host?: string; + /** JSON output flag from --json option */ + json?: boolean; [key: string]: unknown; }