Set CLI child working directory to the workspace
The Claude CLI child process inherited the gott server's CWD because CreateCliStartInfo never set WorkingDirectory. On Linux systemd usually sets WorkingDirectory= to the workspace, so it worked by accident; on Windows the service starts from its install directory, so the CLI's own built-in tools resolved relative patterns (e.g. Glob "Sources/**") against the wrong directory and returned "No files found", while absolute paths still worked. --add-dir only grants access, it does not set the CWD. Thread the workspace through ChatStreamingAsync -> RunCliStreamingAsync -> CreateCliStartInfo and set psi.WorkingDirectory (guarded by Directory.Exists). GetStatusAsync stays without a CWD. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
9acf57b032
commit
fe18fc324e
1 file changed
+13
-4
@@ -56,7 +56,7 @@ public class ClaudeCliService
|
|||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProcessStartInfo CreateCliStartInfo(List<string> args, bool redirectInput = false, string effort = null)
|
private ProcessStartInfo CreateCliStartInfo(List<string> args, bool redirectInput = false, string effort = null, string workingDirectory = null)
|
||||||
{
|
{
|
||||||
var psi = new ProcessStartInfo
|
var psi = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
@@ -70,6 +70,14 @@ public class ClaudeCliService
|
|||||||
StandardErrorEncoding = Encoding.UTF8
|
StandardErrorEncoding = Encoding.UTF8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Arbeitsverzeichnis explizit auf den Workspace setzen.
|
||||||
|
// Ohne das erbt der CLI-Child das CWD des gott-Servers (unter Windows das
|
||||||
|
// Dienst-/Installationsverzeichnis), wodurch RELATIVE Tool-Pfade wie
|
||||||
|
// Glob "Sources/**" ins Leere laufen ("No files found"), während absolute
|
||||||
|
// Pfade funktionieren. --add-dir erteilt nur Zugriff, setzt aber NICHT das CWD.
|
||||||
|
if (!string.IsNullOrEmpty(workingDirectory) && Directory.Exists(workingDirectory))
|
||||||
|
psi.WorkingDirectory = workingDirectory;
|
||||||
|
|
||||||
// 1h-Prompt-Cache-TTL für Claude CLI aktivieren (seit CLI 2.1.108).
|
// 1h-Prompt-Cache-TTL für Claude CLI aktivieren (seit CLI 2.1.108).
|
||||||
// Anthropic hat Anfang März 2026 den Default von 1h auf 5min gesenkt,
|
// Anthropic hat Anfang März 2026 den Default von 1h auf 5min gesenkt,
|
||||||
// dieser Flag holt die 1h-TTL zurück (gilt für API-Key, Bedrock, Vertex, Foundry).
|
// dieser Flag holt die 1h-TTL zurück (gilt für API-Key, Bedrock, Vertex, Foundry).
|
||||||
@@ -229,7 +237,7 @@ public class ClaudeCliService
|
|||||||
args.Add(mcpConfigPath);
|
args.Add(mcpConfigPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await RunCliStreamingAsync(args, prompt, onEvent, cancellationToken, effort);
|
return await RunCliStreamingAsync(args, prompt, onEvent, cancellationToken, effort, workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<CliChatResult> RunCliStreamingAsync(
|
private async Task<CliChatResult> RunCliStreamingAsync(
|
||||||
@@ -237,7 +245,8 @@ public class ClaudeCliService
|
|||||||
string stdinPrompt,
|
string stdinPrompt,
|
||||||
Func<CliStreamEvent, Task> onEvent,
|
Func<CliStreamEvent, Task> onEvent,
|
||||||
CancellationToken cancellationToken,
|
CancellationToken cancellationToken,
|
||||||
string effort = null)
|
string effort = null,
|
||||||
|
string workspace = null)
|
||||||
{
|
{
|
||||||
var result = new CliChatResult();
|
var result = new CliChatResult();
|
||||||
var fullOutput = new StringBuilder();
|
var fullOutput = new StringBuilder();
|
||||||
@@ -257,7 +266,7 @@ public class ClaudeCliService
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var startInfo = CreateCliStartInfo(args, redirectInput: true, effort: effort);
|
var startInfo = CreateCliStartInfo(args, redirectInput: true, effort: effort, workingDirectory: workspace);
|
||||||
|
|
||||||
using var process = new Process { StartInfo = startInfo };
|
using var process = new Process { StartInfo = startInfo };
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user