From aa7e360898a98e8299be58faec73abe79773f6e9 Mon Sep 17 00:00:00 2001 From: suraj-markup Date: Thu, 26 Mar 2026 15:48:22 +0530 Subject: [PATCH] refactor(cli): centralize agent runtime selection logic --- packages/cli/src/commands/start.ts | 37 ++-------------------------- packages/cli/src/lib/detect-agent.ts | 4 +-- 2 files changed, 4 insertions(+), 37 deletions(-) diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index 7eefd0e5b..1be3c5857 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -50,7 +50,7 @@ import { preflight } from "../lib/preflight.js"; import { register, unregister, isAlreadyRunning, getRunning, waitForExit } from "../lib/running-state.js"; import { isHumanCaller } from "../lib/caller-context.js"; import { detectEnvironment } from "../lib/detect-env.js"; -import { detectAvailableAgents, type DetectedAgent } from "../lib/detect-agent.js"; +import { detectAgentRuntime, detectAvailableAgents, type DetectedAgent } from "../lib/detect-agent.js"; import { detectDefaultBranch } from "../lib/git-utils.js"; import { detectProjectType, @@ -353,39 +353,6 @@ async function promptInstallAgentRuntime(available: DetectedAgent[]): Promise { - if (available.length === 0) { - return "claude-code"; - } - - if (available.length === 1) { - return available[0].name; - } - - if (!isHumanCaller()) { - return available.find((a) => a.name === "claude-code")?.name ?? available[0].name; - } - - const { createInterface } = await import("node:readline/promises"); - const rl = createInterface({ input: process.stdin, output: process.stdout }); - try { - console.log("\n Multiple agent runtimes detected:\n"); - available.forEach((a, i) => { - console.log(` ${i + 1}. ${a.displayName} (${a.name})`); - }); - console.log(); - - const answer = await rl.question(` Choose default agent [1-${available.length}]: `); - const idx = Number.parseInt(answer.trim(), 10) - 1; - if (idx >= 0 && idx < available.length) { - return available[idx].name; - } - return available[0].name; - } finally { - rl.close(); - } -} - /** * Clone a repo with authentication support. * @@ -539,7 +506,7 @@ async function autoCreateConfig(workingDir: string): Promise // Detect available agent runtimes via plugin registry let detectedAgents = await detectAvailableAgents(); detectedAgents = await promptInstallAgentRuntime(detectedAgents); - const agent = await selectAgentRuntimeFromDetected(detectedAgents); + const agent = await detectAgentRuntime(detectedAgents); console.log(chalk.green(` ✓ Agent runtime: ${agent}`)); const port = await findFreePort(DEFAULT_PORT); diff --git a/packages/cli/src/lib/detect-agent.ts b/packages/cli/src/lib/detect-agent.ts index 3195826b1..a3bf2141e 100644 --- a/packages/cli/src/lib/detect-agent.ts +++ b/packages/cli/src/lib/detect-agent.ts @@ -54,8 +54,8 @@ export async function detectAvailableAgents(): Promise { * - Multiple agents available + human caller → prompt to pick * - Multiple agents available + non-human → pick first (claude-code if available) */ -export async function detectAgentRuntime(): Promise { - const available = await detectAvailableAgents(); +export async function detectAgentRuntime(preDetected?: DetectedAgent[]): Promise { + const available = preDetected ?? await detectAvailableAgents(); if (available.length === 0) { return "claude-code";