From c56b1bc6b5a4cbaac6b17f94ef1641e7b3952123 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Thu, 13 Mar 2025 18:53:02 -0700 Subject: [PATCH 1/7] fix: clarify PowerShell command completion workaround The command completion detection approach in PowerShell requires an output string to allow duplicate commands to execute in some versions of code. Update the string to explicitly indicate it is a Roo PowerShell workaround, making it clear in terminal output that this is intentional behavior rather than a side effect. Signed-off-by: Eric Wheeler --- src/integrations/terminal/TerminalProcess.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integrations/terminal/TerminalProcess.ts b/src/integrations/terminal/TerminalProcess.ts index 468bfebabb6..6b562a08cf1 100644 --- a/src/integrations/terminal/TerminalProcess.ts +++ b/src/integrations/terminal/TerminalProcess.ts @@ -285,7 +285,7 @@ export class TerminalProcess extends EventEmitter { (defaultWindowsShellProfile as string)?.toLowerCase().includes("powershell")) if (isPowerShell) { terminal.shellIntegration.executeCommand( - `${command} ; ${this.terminalInfo.cmdCounter++} > $null; start-sleep -milliseconds 150`, + `${command} ; "(Roo/PS Workaround: ${this.terminalInfo.cmdCounter++})" > $null; start-sleep -milliseconds 150`, ) } else { terminal.shellIntegration.executeCommand(command) From d1acfc2e41530c9451a956acbbd9861a95ce019b Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Fri, 14 Mar 2025 19:21:26 -0700 Subject: [PATCH 2/7] cleanup: improve terminal logging and error handling No functional changes - purely improves error handling and logging clarity. Terminal.ts: - Handle undefined process state in setActiveStream without throwing - Add terminal IDs to all log messages for better traceability - Improve error message clarity in shell integration timeout TerminalRegistry.ts: - Reorganize shell execution event handlers for better flow - Log shell execution events before processing for reliable debugging - Add detailed context to terminal not found scenarios - Include command and execution state in error messages Signed-off-by: Eric Wheeler --- src/integrations/terminal/Terminal.ts | 10 +++-- src/integrations/terminal/TerminalRegistry.ts | 37 +++++++++++-------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/integrations/terminal/Terminal.ts b/src/integrations/terminal/Terminal.ts index 531300aab9b..fb31e9ac121 100644 --- a/src/integrations/terminal/Terminal.ts +++ b/src/integrations/terminal/Terminal.ts @@ -57,7 +57,11 @@ export class Terminal { if (stream) { // New stream is available if (!this.process) { - throw new Error(`Cannot set active stream on terminal ${this.id} because process is undefined`) + this.running = false + console.warn( + `[Terminal ${this.id}] process is undefined, so cannot set terminal stream (probably user-initiated non-Roo command)`, + ) + return } this.streamClosed = false @@ -165,7 +169,7 @@ export class Terminal { // Set up event handlers process.once("continue", () => resolve()) process.once("error", (error) => { - console.error(`Error in terminal ${this.id}:`, error) + console.error(`[Terminal ${this.id}] error:`, error) reject(error) }) @@ -175,7 +179,7 @@ export class Terminal { process.run(command) }) .catch(() => { - console.log("[Terminal] Shell integration not available. Command execution aborted.") + console.log(`[Terminal ${this.id}] Shell integration not available. Command execution aborted.`) process.emit( "no_shell_integration", "Shell integration initialization sequence '\\x1b]633;A' was not received within 4 seconds. Shell integration has been disabled for this terminal instance.", diff --git a/src/integrations/terminal/TerminalRegistry.ts b/src/integrations/terminal/TerminalRegistry.ts index 13c11cc9e13..aacb3260d03 100644 --- a/src/integrations/terminal/TerminalRegistry.ts +++ b/src/integrations/terminal/TerminalRegistry.ts @@ -24,17 +24,21 @@ export class TerminalRegistry { // Get a handle to the stream as early as possible: const stream = e?.execution.read() const terminalInfo = this.getTerminalByVSCETerminal(e.terminal) - if (terminalInfo) { - terminalInfo.setActiveStream(stream) - } else { - console.error("[TerminalRegistry] Stream failed, not registered for terminal") - } console.info("[TerminalRegistry] Shell execution started:", { hasExecution: !!e?.execution, command: e?.execution?.commandLine?.value, terminalId: terminalInfo?.id, }) + + if (terminalInfo) { + terminalInfo.setActiveStream(stream) + } else { + console.error( + "[TerminalRegistry] Shell execution started, but not from a Roo-registered terminal:", + e, + ) + } }, ) @@ -44,10 +48,20 @@ export class TerminalRegistry { const terminalInfo = this.getTerminalByVSCETerminal(e.terminal) const process = terminalInfo?.process + const exitDetails = TerminalProcess.interpretExitCode(e?.exitCode) + + console.info("[TerminalRegistry] Shell execution ended:", { + hasExecution: !!e?.execution, + command: e?.execution?.commandLine?.value, + terminalId: terminalInfo?.id, + ...exitDetails, + }) + if (!terminalInfo) { - console.error("[TerminalRegistry] Shell execution ended but terminal not found:", { - exitCode: e?.exitCode, - }) + console.error( + "[TerminalRegistry] Shell execution ended, but not from a Roo-registered terminal:", + e, + ) return } @@ -74,13 +88,6 @@ export class TerminalRegistry { return } - const exitDetails = TerminalProcess.interpretExitCode(e?.exitCode) - console.info("[TerminalRegistry] Shell execution ended:", { - ...exitDetails, - terminalId: terminalInfo.id, - command: process?.command ?? "", - }) - // Signal completion to any waiting processes if (terminalInfo) { terminalInfo.shellExecutionComplete(exitDetails) From 147c3bcc30ab05c78822a0784602de9669736b8e Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Fri, 14 Mar 2025 18:11:45 -0700 Subject: [PATCH 3/7] feat: make terminal shell integration timeout configurable Users with long shell startup times were encountering "Shell Integration Unavailable" errors due to the hard-coded 4s timeout. The timeout is now configurable through Advanced Settings (1-60s). Thanks @filthy for troubleshooting and @kiwina for suggesting making the timeout configurable. Fixes #1654 Signed-off-by: Eric Wheeler --- src/core/webview/ClineProvider.ts | 16 +++++++-- src/exports/roo-code.d.ts | 1 + src/integrations/terminal/Terminal.ts | 10 ++++-- src/shared/ExtensionMessage.ts | 1 + src/shared/WebviewMessage.ts | 1 + src/shared/globalState.ts | 1 + .../components/settings/AdvancedSettings.tsx | 36 ++++++++++++++++++- .../src/components/settings/SettingsView.tsx | 3 ++ .../src/context/ExtensionStateContext.tsx | 5 +++ 9 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 40b747f0ed2..9cd0a51198e 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -5,6 +5,7 @@ import fs from "fs/promises" import os from "os" import pWaitFor from "p-wait-for" import * as path from "path" +import { Terminal } from "../../integrations/terminal/Terminal" import * as vscode from "vscode" import { setPanel } from "../../activate/registerCommands" @@ -338,9 +339,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { setPanel(webviewView, "sidebar") } - // Initialize sound enabled state - this.getState().then(({ soundEnabled }) => { + // Initialize out-of-scope variables that need to recieve persistent global state values + this.getState().then(({ soundEnabled, terminalShellIntegrationTimeout }) => { setSoundEnabled(soundEnabled ?? false) + Terminal.setShellIntegrationTimeout(terminalShellIntegrationTimeout ?? 4000) }) webviewView.webview.options = { @@ -1342,6 +1344,13 @@ export class ClineProvider implements vscode.WebviewViewProvider { await this.updateGlobalState("terminalOutputLineLimit", message.value) await this.postStateToWebview() break + case "terminalShellIntegrationTimeout": + await this.updateGlobalState("terminalShellIntegrationTimeout", message.value) + await this.postStateToWebview() + if (message.value !== undefined) { + Terminal.setShellIntegrationTimeout(message.value) + } + break case "mode": await this.handleModeSwitch(message.text as Mode) break @@ -2291,6 +2300,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { remoteBrowserEnabled, writeDelayMs, terminalOutputLineLimit, + terminalShellIntegrationTimeout, fuzzyMatchThreshold, mcpEnabled, enableMcpServerCreation, @@ -2352,6 +2362,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { remoteBrowserEnabled: remoteBrowserEnabled ?? false, writeDelayMs: writeDelayMs ?? 1000, terminalOutputLineLimit: terminalOutputLineLimit ?? 500, + terminalShellIntegrationTimeout: terminalShellIntegrationTimeout ?? 4000, fuzzyMatchThreshold: fuzzyMatchThreshold ?? 1.0, mcpEnabled: mcpEnabled ?? true, enableMcpServerCreation: enableMcpServerCreation ?? true, @@ -2509,6 +2520,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { fuzzyMatchThreshold: stateValues.fuzzyMatchThreshold ?? 1.0, writeDelayMs: stateValues.writeDelayMs ?? 1000, terminalOutputLineLimit: stateValues.terminalOutputLineLimit ?? 500, + terminalShellIntegrationTimeout: stateValues.terminalShellIntegrationTimeout ?? 4000, mode: stateValues.mode ?? defaultModeSlug, language: stateValues.language || formatLanguage(vscode.env.language), mcpEnabled: stateValues.mcpEnabled ?? true, diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index f9764b91a5d..68000f4e1ef 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -186,6 +186,7 @@ export type GlobalStateKey = | "fuzzyMatchThreshold" | "writeDelayMs" | "terminalOutputLineLimit" + | "terminalShellIntegrationTimeout" | "mcpEnabled" | "enableMcpServerCreation" | "alwaysApproveResubmit" diff --git a/src/integrations/terminal/Terminal.ts b/src/integrations/terminal/Terminal.ts index fb31e9ac121..553eda5b123 100644 --- a/src/integrations/terminal/Terminal.ts +++ b/src/integrations/terminal/Terminal.ts @@ -4,6 +4,8 @@ import { ExitCodeDetails, mergePromise, TerminalProcess, TerminalProcessResultPr import { truncateOutput, applyRunLengthEncoding } from "../misc/extract-text" export class Terminal { + private static shellIntegrationTimeout: number = 4000 + public terminal: vscode.Terminal public busy: boolean public id: number @@ -174,7 +176,7 @@ export class Terminal { }) // Wait for shell integration before executing the command - pWaitFor(() => this.terminal.shellIntegration !== undefined, { timeout: 4000 }) + pWaitFor(() => this.terminal.shellIntegration !== undefined, { timeout: Terminal.shellIntegrationTimeout }) .then(() => { process.run(command) }) @@ -182,7 +184,7 @@ export class Terminal { console.log(`[Terminal ${this.id}] Shell integration not available. Command execution aborted.`) process.emit( "no_shell_integration", - "Shell integration initialization sequence '\\x1b]633;A' was not received within 4 seconds. Shell integration has been disabled for this terminal instance.", + "Shell integration initialization sequence '\\x1b]633;A' was not received within 4 seconds. Shell integration has been disabled for this terminal instance. Increase the timeout in the settings if necessary.", ) }) }) @@ -248,6 +250,10 @@ export class Terminal { * @param input The terminal output to compress * @returns The compressed terminal output */ + public static setShellIntegrationTimeout(timeoutMs: number): void { + Terminal.shellIntegrationTimeout = timeoutMs + } + public static compressTerminalOutput(input: string, lineLimit: number): string { return truncateOutput(applyRunLengthEncoding(input), lineLimit) } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 5b018ec22ee..05872a76ff3 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -136,6 +136,7 @@ export interface ExtensionState { language?: string writeDelayMs: number terminalOutputLineLimit?: number + terminalShellIntegrationTimeout?: number mcpEnabled: boolean enableMcpServerCreation: boolean enableCustomModeCreation?: boolean diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index e802b8d8af7..f3ae90206c6 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -70,6 +70,7 @@ export interface WebviewMessage { | "draggedImages" | "deleteMessage" | "terminalOutputLineLimit" + | "terminalShellIntegrationTimeout" | "mcpEnabled" | "enableMcpServerCreation" | "enableCustomModeCreation" diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index c2b78f1ef79..5a2d4bb94db 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -85,6 +85,7 @@ export const GLOBAL_STATE_KEYS = [ "fuzzyMatchThreshold", "writeDelayMs", "terminalOutputLineLimit", + "terminalShellIntegrationTimeout", "mcpEnabled", "enableMcpServerCreation", "alwaysApproveResubmit", diff --git a/webview-ui/src/components/settings/AdvancedSettings.tsx b/webview-ui/src/components/settings/AdvancedSettings.tsx index e217537ab63..a03676ad9f3 100644 --- a/webview-ui/src/components/settings/AdvancedSettings.tsx +++ b/webview-ui/src/components/settings/AdvancedSettings.tsx @@ -14,14 +14,18 @@ import { Section } from "./Section" type AdvancedSettingsProps = HTMLAttributes & { rateLimitSeconds: number + terminalShellIntegrationTimeout: number | undefined diffEnabled?: boolean fuzzyMatchThreshold?: number - setCachedStateField: SetCachedStateField<"rateLimitSeconds" | "diffEnabled" | "fuzzyMatchThreshold"> + setCachedStateField: SetCachedStateField< + "rateLimitSeconds" | "diffEnabled" | "fuzzyMatchThreshold" | "terminalShellIntegrationTimeout" + > experiments: Record setExperimentEnabled: SetExperimentEnabled } export const AdvancedSettings = ({ rateLimitSeconds, + terminalShellIntegrationTimeout, diffEnabled, fuzzyMatchThreshold, setCachedStateField, @@ -62,6 +66,36 @@ export const AdvancedSettings = ({

+
+
+ Terminal shell integration timeout +
+ + setCachedStateField( + "terminalShellIntegrationTimeout", + Math.min(60000, Math.max(1000, parseInt(e.target.value))), + ) + } + className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background" + /> + + {(terminalShellIntegrationTimeout ?? 4000) / 1000}s + +
+

+ Maximum time to wait for shell integration to initialize before executing commands. For + users with long shell startup times, this value may need to be increased if you see "Shell + Integration Unavailable" errors in the terminal. +

+
+
+
(({ onDone }, soundVolume, telemetrySetting, terminalOutputLineLimit, + terminalShellIntegrationTimeout, writeDelayMs, showRooIgnoredFiles, remoteBrowserEnabled, @@ -196,6 +197,7 @@ const SettingsView = forwardRef(({ onDone }, vscode.postMessage({ type: "writeDelayMs", value: writeDelayMs }) vscode.postMessage({ type: "screenshotQuality", value: screenshotQuality ?? 75 }) vscode.postMessage({ type: "terminalOutputLineLimit", value: terminalOutputLineLimit ?? 500 }) + vscode.postMessage({ type: "terminalShellIntegrationTimeout", value: terminalShellIntegrationTimeout }) vscode.postMessage({ type: "mcpEnabled", bool: mcpEnabled }) vscode.postMessage({ type: "alwaysApproveResubmit", bool: alwaysApproveResubmit }) vscode.postMessage({ type: "requestDelaySeconds", value: requestDelaySeconds }) @@ -441,6 +443,7 @@ const SettingsView = forwardRef(({ onDone },
void setSoundEnabled: (value: boolean) => void setSoundVolume: (value: number) => void + terminalShellIntegrationTimeout?: number + setTerminalShellIntegrationTimeout: (value: number) => void setDiffEnabled: (value: boolean) => void setEnableCheckpoints: (value: boolean) => void setBrowserViewportSize: (value: string) => void @@ -124,6 +126,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode browserViewportSize: "900x600", screenshotQuality: 75, terminalOutputLineLimit: 500, + terminalShellIntegrationTimeout: 4000, mcpEnabled: true, enableMcpServerCreation: true, alwaysApproveResubmit: false, @@ -265,6 +268,8 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode setScreenshotQuality: (value) => setState((prevState) => ({ ...prevState, screenshotQuality: value })), setTerminalOutputLineLimit: (value) => setState((prevState) => ({ ...prevState, terminalOutputLineLimit: value })), + setTerminalShellIntegrationTimeout: (value) => + setState((prevState) => ({ ...prevState, terminalShellIntegrationTimeout: value })), setMcpEnabled: (value) => setState((prevState) => ({ ...prevState, mcpEnabled: value })), setEnableMcpServerCreation: (value) => setState((prevState) => ({ ...prevState, enableMcpServerCreation: value })), From e403771c4e955c7324ef37b01697862bfc11cdb5 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Sun, 16 Mar 2025 14:53:36 -0700 Subject: [PATCH 4/7] critical fix: race condition that prevents command completion Terminal running state is now managed in TerminalRegistry instead of Terminal to prevent race between stream close and shell completion. While this race may not trigger on current VSCode versions, newer releases with additional terminal fixes may expose the issue. This proactively prevents "Shell execution end event received, but process is not running" errors. Signed-off-by: Eric Wheeler --- src/integrations/terminal/Terminal.ts | 6 +++--- src/integrations/terminal/TerminalProcess.ts | 5 +---- src/integrations/terminal/TerminalRegistry.ts | 2 ++ 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/integrations/terminal/Terminal.ts b/src/integrations/terminal/Terminal.ts index 553eda5b123..d0cc660a6ad 100644 --- a/src/integrations/terminal/Terminal.ts +++ b/src/integrations/terminal/Terminal.ts @@ -67,12 +67,10 @@ export class Terminal { } this.streamClosed = false - this.running = true this.process.emit("stream_available", stream) } else { // Stream is being closed this.streamClosed = true - this.running = false } } @@ -81,7 +79,6 @@ export class Terminal { * @param exitDetails The exit details of the shell execution */ public shellExecutionComplete(exitDetails: ExitCodeDetails): void { - this.running = false this.busy = false if (this.process) { @@ -155,6 +152,9 @@ export class Terminal { } public runCommand(command: string): TerminalProcessResultPromise { + // We set busy before the command is running because the terminal may be waiting + // on terminal integration, and we must prevent another instance from selecting + // the terminal for use during that time. this.busy = true // Create process immediately diff --git a/src/integrations/terminal/TerminalProcess.ts b/src/integrations/terminal/TerminalProcess.ts index 6b562a08cf1..21d65577151 100644 --- a/src/integrations/terminal/TerminalProcess.ts +++ b/src/integrations/terminal/TerminalProcess.ts @@ -306,10 +306,7 @@ export class TerminalProcess extends EventEmitter { "", ) - // Ensure terminal is marked as not busy - if (this.terminalInfo) { - this.terminalInfo.busy = false - } + this.terminalInfo.busy = false // Emit continue event to allow execution to proceed this.emit("continue") diff --git a/src/integrations/terminal/TerminalRegistry.ts b/src/integrations/terminal/TerminalRegistry.ts index aacb3260d03..dcf1af76d4d 100644 --- a/src/integrations/terminal/TerminalRegistry.ts +++ b/src/integrations/terminal/TerminalRegistry.ts @@ -32,6 +32,7 @@ export class TerminalRegistry { }) if (terminalInfo) { + terminalInfo.running = true terminalInfo.setActiveStream(stream) } else { console.error( @@ -90,6 +91,7 @@ export class TerminalRegistry { // Signal completion to any waiting processes if (terminalInfo) { + terminalInfo.running = false terminalInfo.shellExecutionComplete(exitDetails) } }, From 2c2eec924b2d614d2568ec5c2582a4eea11847e6 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Sun, 16 Mar 2025 16:45:00 -0700 Subject: [PATCH 5/7] fix: improve command execution path reporting Enhance clarity of command execution context and error reporting: - Check to see if the directory changed because of the command - Clarify execution path message - Add explicit message when command exits with non-zero code Signed-off-by: Eric Wheeler --- src/core/Cline.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 8b5afe98063..cbe796f7856 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1022,7 +1022,7 @@ export class Cline extends EventEmitter { ), ] } else if (completed) { - let exitStatus: string + let exitStatus: string = "" if (exitDetails !== undefined) { if (exitDetails.signal) { exitStatus = `Process terminated by signal ${exitDetails.signal} (${exitDetails.signalName})` @@ -1033,13 +1033,22 @@ export class Cline extends EventEmitter { result += "" exitStatus = `Exit code: ` } else { - exitStatus = `Exit code: ${exitDetails.exitCode}` + if (exitDetails.exitCode !== 0) { + exitStatus += "Command execution was not successful, inspect the cause and adjust as needed.\n" + } + exitStatus += `Exit code: ${exitDetails.exitCode}` } } else { result += "" exitStatus = `Exit code: ` } - const workingDirInfo = workingDir ? ` from '${workingDir.toPosix()}'` : "" + + let workingDirInfo: string = workingDir ? ` within working directory '${workingDir.toPosix()}'` : "" + const newWorkingDir = terminalInfo.getCurrentWorkingDirectory() + + if (newWorkingDir !== workingDir) { + workingDirInfo += `; command changed working directory for this terminal to '${newWorkingDir.toPosix()} so be aware that future commands will be executed from this directory` + } const outputInfo = `\nOutput:\n${result}` return [ From de5157afefade563ea8c408d704ddacacf76e583 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Sun, 16 Mar 2025 17:13:23 -0700 Subject: [PATCH 6/7] system instructions: clarify terminal directory operations Clear guidance for the AI system on: - Working directory constraints - Path handling requirements - Tool vs terminal directory behavior Signed-off-by: Eric Wheeler --- src/core/prompts/sections/rules.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index 86e554a157e..a68017970ca 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -64,7 +64,8 @@ export function getRulesSection( RULES -- Your current working directory is: ${cwd.toPosix()} +- The project base directory is: ${cwd.toPosix()} +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '${cwd.toPosix()}', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. From 7ff67c7205e14ae45940fcb94729845dda899299 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Sun, 16 Mar 2025 17:44:04 -0700 Subject: [PATCH 7/7] test: update snapshots for system prompt working directory instructions Signed-off-by: Eric Wheeler --- .../__snapshots__/system.test.ts.snap | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 0202ebcef7d..8ca2780b6c5 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -270,7 +270,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -689,7 +690,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -1077,7 +1079,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -1414,7 +1417,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -1748,7 +1752,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -2082,7 +2087,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -2464,7 +2470,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -3212,7 +3219,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -3594,7 +3602,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -3989,7 +3998,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -4325,7 +4335,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -4845,7 +4856,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -5257,7 +5269,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -5545,7 +5558,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. @@ -6410,7 +6424,8 @@ MODES RULES -- Your current working directory is: /test/path +- The project base directory is: /test/path +- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. - Do not use the ~ character or $HOME to refer to the home directory. - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.