feat(oscompat): improve PowerShell script for Claude CLI compatibility on Windows
- Added UTF-8 encoding settings for input and output streams to prevent JSON corruption on CJK Windows. - Implemented a search for common installation paths of claude.exe across user profiles to ensure accessibility when running as a different user. - Updated logging in the Stream function to include the working directory for better context during execution.
This commit is contained in:
parent
b037475c14
commit
0e64d05dbf
2 changed files with 18 additions and 1 deletions
|
|
@ -146,6 +146,23 @@ func (e *osEnv) buildPowerShellScript(args []string, systemPrompt, inputJSONL, w
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
noBOM := "(New-Object System.Text.UTF8Encoding $false)"
|
noBOM := "(New-Object System.Text.UTF8Encoding $false)"
|
||||||
|
|
||||||
|
// Force UTF-8 for both input and output streams.
|
||||||
|
// On CJK Windows the default codepage is often GBK/GB2312 (936)
|
||||||
|
// which corrupts Claude CLI's UTF-8 JSON output.
|
||||||
|
b.WriteString("[Console]::InputEncoding = [System.Text.Encoding]::UTF8\n")
|
||||||
|
b.WriteString("[Console]::OutputEncoding = [System.Text.Encoding]::UTF8\n")
|
||||||
|
b.WriteString("$OutputEncoding = [System.Text.Encoding]::UTF8\n")
|
||||||
|
|
||||||
|
// Ensure claude.exe can be found even when Tai runs as a different user.
|
||||||
|
// Claude CLI is typically installed per-user (e.g. C:\Users\X\.local\bin)
|
||||||
|
// which isn't in the PATH when Tai runs as a service or another account.
|
||||||
|
// Scan all user profiles for common install locations.
|
||||||
|
b.WriteString("foreach ($d in (Get-ChildItem 'C:\\Users' -Directory -ErrorAction SilentlyContinue)) {\n")
|
||||||
|
b.WriteString(" $p = Join-Path $d.FullName '.local\\bin'\n")
|
||||||
|
b.WriteString(" if (Test-Path (Join-Path $p 'claude.exe')) { $env:PATH = \"$p;$env:PATH\"; break }\n")
|
||||||
|
b.WriteString("}\n")
|
||||||
|
b.WriteString("if ($env:APPDATA) { $env:PATH = \"$env:APPDATA\\npm;$env:PATH\" }\n")
|
||||||
|
|
||||||
yaoDir := e.pathJoin(workDir, ".yao")
|
yaoDir := e.pathJoin(workDir, ".yao")
|
||||||
b.WriteString(fmt.Sprintf("if (!(Test-Path '%s')) { New-Item -ItemType Directory -Path '%s' -Force | Out-Null }\n", yaoDir, yaoDir))
|
b.WriteString(fmt.Sprintf("if (!(Test-Path '%s')) { New-Item -ItemType Directory -Path '%s' -Force | Out-Null }\n", yaoDir, yaoDir))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ func (r *ClaudeRunner) Stream(ctx context.Context, req *types.StreamRequest, han
|
||||||
streamOpts = append(streamOpts, infra.WithStdin(stdin))
|
streamOpts = append(streamOpts, infra.WithStdin(stdin))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "[claude] Stream cmd=%v hasMCP=%v isContinuation=%v stdinLen=%d\n", cmd, r.hasMCP, isContinuation, len(stdin))
|
fmt.Fprintf(os.Stderr, "[claude] Stream cmd=%v hasMCP=%v isContinuation=%v stdinLen=%d workDir=%q\n", cmd, r.hasMCP, isContinuation, len(stdin), oe.WorkDir)
|
||||||
|
|
||||||
execStream, err := computer.Stream(ctx, cmd, streamOpts...)
|
execStream, err := computer.Stream(ctx, cmd, streamOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue