diff --git a/src/cli/commands/dev/browser-mode.ts b/src/cli/commands/dev/browser-mode.ts index 77342e7f1..3489e0cc0 100644 --- a/src/cli/commands/dev/browser-mode.ts +++ b/src/cli/commands/dev/browser-mode.ts @@ -129,7 +129,9 @@ export async function launchBrowserDev(): Promise { process.exit(1); } - await runCliDeploy(); + if (hasHarnesses) { + await runCliDeploy(); + } const configRoot = findConfigRoot(workingDir); const persistTracesDir = path.join(configRoot ?? workingDir, '.cli', 'traces'); diff --git a/src/cli/commands/dev/command.tsx b/src/cli/commands/dev/command.tsx index d34dfa3e2..f588f3996 100644 --- a/src/cli/commands/dev/command.tsx +++ b/src/cli/commands/dev/command.tsx @@ -389,8 +389,8 @@ export const registerDev = (program: Command) => { // Get provider info from agent config const providerInfo = '(see agent code)'; - // Deploy resources before starting dev server - if (!opts.skipDeploy) { + // Deploy resources before starting dev server (only when harnesses need it) + if (!opts.skipDeploy && hasHarnesses) { await runCliDeploy(); } diff --git a/src/cli/tui/hooks/useDevDeploy.ts b/src/cli/tui/hooks/useDevDeploy.ts index e081a4eec..f815e8dbc 100644 --- a/src/cli/tui/hooks/useDevDeploy.ts +++ b/src/cli/tui/hooks/useDevDeploy.ts @@ -49,6 +49,19 @@ export function useDevDeploy({ skip, ready = true }: UseDevDeployOptions = {}): try { const configIO = new ConfigIO(); + // Only deploy if the project has harnesses (cloud-dependent resources). + // Plain agents (Strands, LangGraph, etc.) run locally and don't need deployment. + try { + const projectSpec = await configIO.readProjectSpec(); + const hasHarnesses = (projectSpec.harnesses ?? []).length > 0; + if (!hasHarnesses) { + onProgress('Local agent — no deploy needed', 'success'); + return; + } + } catch { + // If we can't read project spec, proceed with deploy as a safe default + } + // Auto-populate aws-targets.json if empty try { const targets = await configIO.readAWSDeploymentTargets();