fix(worker): escape newline/tab in CLI args

This commit is contained in:
mika kuns
2026-04-17 14:25:15 +02:00
parent 11a4376da5
commit ad7c9facaf
2 changed files with 32 additions and 2 deletions

View File

@@ -55,9 +55,15 @@ public sealed class ClaudeArgsBuilder
private static string Escape(string value) private static string Escape(string value)
{ {
if (value.Contains(' ') || value.Contains('"') || value.Contains('\'')) if (value.Contains(' ') || value.Contains('"') || value.Contains('\'')
|| value.Contains('\t') || value.Contains('\n') || value.Contains('\r'))
{ {
var escaped = value.Replace("\\", "\\\\").Replace("\"", "\\\""); var escaped = value
.Replace("\\", "\\\\")
.Replace("\"", "\\\"")
.Replace("\n", "\\n")
.Replace("\r", "\\r")
.Replace("\t", "\\t");
return $"\"{escaped}\""; return $"\"{escaped}\"";
} }
return value; return value;

View File

@@ -68,4 +68,28 @@ public sealed class ClaudeArgsBuilderTests
var args = _builder.Build(new ClaudeRunConfig(null, """Don't say "hello".""", null, null)); var args = _builder.Build(new ClaudeRunConfig(null, """Don't say "hello".""", null, null));
Assert.Contains("--append-system-prompt", args); Assert.Contains("--append-system-prompt", args);
} }
[Fact]
public void Build_quotes_system_prompt_with_newline()
{
var args = _builder.Build(new ClaudeRunConfig(
Model: null,
SystemPrompt: "line1\nline2",
AgentPath: null,
ResumeSessionId: null));
Assert.Contains("--append-system-prompt \"line1\\nline2\"", args);
}
[Fact]
public void Build_quotes_system_prompt_with_tab()
{
var args = _builder.Build(new ClaudeRunConfig(
Model: null,
SystemPrompt: "col1\tcol2",
AgentPath: null,
ResumeSessionId: null));
Assert.Contains("\"col1", args);
}
} }