summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/session/prompt.ts50
1 files changed, 38 insertions, 12 deletions
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 0ccb208c6..1caa06744 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -1290,20 +1290,46 @@ export namespace SessionPrompt {
const shell = process.env["SHELL"] ?? "bash"
const shellName = path.basename(shell)
- const scripts: Record<string, string> = {
- nu: input.command,
- fish: `eval "${input.command}"`,
+ const invocations: Record<string, { args: string[] }> = {
+ nu: {
+ args: ["-c", input.command],
+ },
+ fish: {
+ args: ["-c", input.command],
+ },
+ zsh: {
+ args: [
+ "-c",
+ "-l",
+ `
+ [[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true
+ [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true
+ ${input.command}
+ `
+ ],
+ },
+ bash: {
+ args: [
+ "-c",
+ "-l",
+ `
+ [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true
+ ${input.command}
+ `,
+ ],
+ },
+ // Fallback: any shell that doesn't match those above
+ "": {
+ args: [
+ "-c",
+ "-l",
+ `${input.command}`,
+ ],
+ },
}
- const script =
- scripts[shellName] ??
- `[[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true
- [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true
- [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true
- eval "${input.command}"`
-
- const isFishOrNu = shellName === "fish" || shellName === "nu"
- const args = isFishOrNu ? ["-c", script] : ["-c", "-l", script]
+ const matchingInvocation = invocations[shellName] ?? invocations[""];
+ const args = matchingInvocation?.args
const proc = spawn(shell, args, {
cwd: Instance.directory,