diff --git a/apps/node/internal/adapters/openai_compat/openai_compat.go b/apps/node/internal/adapters/openai_compat/openai_compat.go
index 6972476..2470a14 100644
--- a/apps/node/internal/adapters/openai_compat/openai_compat.go
+++ b/apps/node/internal/adapters/openai_compat/openai_compat.go
@@ -528,6 +528,7 @@ func textToolFallbackInstruction(tools any) (string, bool) {
}
return "Tool calls must be emitted as plain text because this backend does not support native OpenAI tool calling. When a tool is needed, respond with exactly one tool call and no markdown:\n" +
"\n\nJSON_VALUE\n\n\n" +
+ "run_commands executes from the client workspace root. Do not prepend cd to an absolute workspace path unless the user explicitly asks to operate in a different directory; prefer current-workspace commands such as git status.\n" +
"Use valid JSON for each parameter value and follow the supplied parameter schema. Available tools JSON: " + string(encoded), true
}
diff --git a/apps/node/internal/adapters/openai_compat/openai_compat_test.go b/apps/node/internal/adapters/openai_compat/openai_compat_test.go
index 9c0948a..46a2301 100644
--- a/apps/node/internal/adapters/openai_compat/openai_compat_test.go
+++ b/apps/node/internal/adapters/openai_compat/openai_compat_test.go
@@ -434,6 +434,9 @@ func TestOpenAICompatExecuteFallsBackToTextToolsWhenNativeToolsUnsupported(t *te
if first["role"] != "system" || !strings.Contains(first["content"].(string), "") || !strings.Contains(first["content"].(string), "run_commands") {
t.Fatalf("fallback system instruction missing tool format/name: %+v", first)
}
+ if !strings.Contains(first["content"].(string), "client workspace root") || !strings.Contains(first["content"].(string), "Do not prepend cd") {
+ t.Fatalf("fallback system instruction missing workspace-root guidance: %+v", first)
+ }
if !strings.Contains(first["content"].(string), "Existing Cline system prompt.") {
t.Fatalf("fallback system instruction did not preserve existing system content: %+v", first)
}
diff --git a/apps/node/internal/adapters/vllm/vllm.go b/apps/node/internal/adapters/vllm/vllm.go
index 8a15b25..bf8d2e9 100644
--- a/apps/node/internal/adapters/vllm/vllm.go
+++ b/apps/node/internal/adapters/vllm/vllm.go
@@ -463,6 +463,7 @@ func textToolFallbackInstruction(tools any) (string, bool) {
}
return "Tool calls must be emitted as plain text because this backend does not support native OpenAI tool calling. When a tool is needed, respond with exactly one tool call and no markdown:\n" +
"\n\nJSON_VALUE\n\n\n" +
+ "run_commands executes from the client workspace root. Do not prepend cd to an absolute workspace path unless the user explicitly asks to operate in a different directory; prefer current-workspace commands such as git status.\n" +
"Use valid JSON for each parameter value and follow the supplied parameter schema. Available tools JSON: " + string(encoded), true
}
diff --git a/apps/node/internal/adapters/vllm/vllm_test.go b/apps/node/internal/adapters/vllm/vllm_test.go
index 26d266c..5fa549e 100644
--- a/apps/node/internal/adapters/vllm/vllm_test.go
+++ b/apps/node/internal/adapters/vllm/vllm_test.go
@@ -306,6 +306,9 @@ func TestVllmExecuteFallsBackToTextToolsWhenNativeToolsUnsupported(t *testing.T)
if first["role"] != "system" || !strings.Contains(first["content"].(string), "") || !strings.Contains(first["content"].(string), "run_commands") {
t.Fatalf("fallback system instruction missing tool format/name: %+v", first)
}
+ if !strings.Contains(first["content"].(string), "client workspace root") || !strings.Contains(first["content"].(string), "Do not prepend cd") {
+ t.Fatalf("fallback system instruction missing workspace-root guidance: %+v", first)
+ }
if !strings.Contains(first["content"].(string), "Existing Cline system prompt.") {
t.Fatalf("fallback system instruction did not preserve existing system content: %+v", first)
}