diff --git a/Bookworm-Setup.sh b/Bookworm-Setup.sh index 64bec31..7fd8ea3 100644 --- a/Bookworm-Setup.sh +++ b/Bookworm-Setup.sh @@ -429,6 +429,11 @@ if [ -z "$ANTHROPIC_API_KEY" ]; then rm -f "$HOME/.zshrc.bak" "$HOME/.bashrc.bak" 2>/dev/null || true export ANTHROPIC_API_KEY="$SK_KEY" export ANTHROPIC_BASE_URL="https://bww.letcareme.com" + # v3.0.2: 预填 ~/.claude.json 跳过 Claude Code 2.0.1 登录选择页 (两选项都走 anthropic.com OAuth, 国内不通) + CLAUDE_JSON="$HOME/.claude.json" + KEY_PREFIX="${SK_KEY:0:20}" + printf '{"hasCompletedOnboarding":true,"hasSeenWelcome":true,"bypassPermissionsModeAccepted":true,"customApiKeyResponses":{"approved":["%s"],"rejected":[]},"numStartups":5,"projects":{}}' "$KEY_PREFIX" > "$CLAUDE_JSON" 2>/dev/null && ok "Claude Code onboarding 已预填" + chmod 600 "$CLAUDE_JSON" 2>/dev/null || true # 存 Keychain 本日免密 security add-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" -w "ANTHROPIC_API_KEY=$SK_KEY ANTHROPIC_BASE_URL=https://bww.letcareme.com diff --git a/auto-setup.ps1 b/auto-setup.ps1 index b0e027e..f296883 100644 --- a/auto-setup.ps1 +++ b/auto-setup.ps1 @@ -20,7 +20,7 @@ param( $ErrorActionPreference = "Stop" # ─── 版本号 (每次更新递增, build.ps1 自动读取) ────── -$BWVersion = "3.0.1" # +DryRun 支持 +Test-ApiKey Proxy=new() 直连 +UTF-8 BOM 处理 +$BWVersion = "3.0.2" # +ExecutionPolicy +WM_SETTINGCHANGE 广播 +.claude.json 预填跳过 v2.0.1 登录画面 # DryRun 模式日志标记 if ($DryRun) { $global:BWDryRun = $DryRun } else { $global:BWDryRun = $null } @@ -761,6 +761,15 @@ Log-Phase 1 "环境检测 + 依赖自动安装" # 刷新 PATH $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") +# v3.0.2 (三台机踩坑修复): 放开 PS ExecutionPolicy, 否则管理员 PS 下 claude.ps1 会被拦 +try { + $curPolicy = Get-ExecutionPolicy -Scope CurrentUser + if ($curPolicy -eq "Restricted" -or $curPolicy -eq "Undefined") { + Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force -EA Stop + Log-OK "PS ExecutionPolicy 已放开: CurrentUser = RemoteSigned" + } +} catch { Log-Warn "ExecutionPolicy 设置失败 (可能组策略锁死): $_" } + # DryRun 模式: 只做 Phase 1 检测, 不动任何东西 if (Is-DryRun "env") { Log-Info "[DryRun=env] Phase 1 只检测 PATH + 依赖可达性, 跳过后续步骤" @@ -1317,6 +1326,22 @@ if (-not $secretsDecrypted) { if ($ckOk) { $env:ANTHROPIC_API_KEY = $apiKey $env:ANTHROPIC_BASE_URL = "https://bww.letcareme.com" + # v3.0.2: 广播 WM_SETTINGCHANGE, 让 explorer.exe + 已打开窗口刷新 env + try { + $sig = '[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);' + $api = Add-Type -MemberDefinition $sig -Name Win32SendMsg -Namespace BWBroadcast -PassThru -EA Stop + $HWND_BROADCAST = [IntPtr]0xffff; $WM_SETTINGCHANGE = 0x001A; $result = [UIntPtr]::Zero + [void]$api::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref]$result) + } catch { Log-Warn "env 广播失败 (不影响功能): $_" } + # v3.0.2: 预填 .claude.json 跳过 Claude Code 2.0.1 的登录选择页 (两选项都走 anthropic.com OAuth, 国内不通) + try { + $claudeJsonPath = Join-Path $env:USERPROFILE ".claude.json" + $keyPrefix = $apiKey.Substring(0, [Math]::Min(20, $apiKey.Length)) + $bypassConfig = '{"hasCompletedOnboarding":true,"hasSeenWelcome":true,"bypassPermissionsModeAccepted":true,"customApiKeyResponses":{"approved":["' + $keyPrefix + '"],"rejected":[]},"numStartups":5,"projects":{}}' + # 无 BOM UTF-8 写入, Set-Content 会加 BOM 导致 Claude Code JSON parser 拒收 + [IO.File]::WriteAllText($claudeJsonPath, $bypassConfig, [System.Text.UTF8Encoding]::new($false)) + Log-OK "Claude Code onboarding 已预填 (跳过 v2.0.1 登录选择页)" + } catch { Log-Warn ".claude.json 预填失败 (首次启动需手工过登录画面): $_" } Log-OK "凭证已验证并持久化" $secretsDecrypted = $true Save-SecretsToCache