v3.0.2: fix 3-machine login loop (ExecutionPolicy + WM_SETTINGCHANGE broadcast + .claude.json onboarding pre-fill)

3 台机实测发现 5 个串联坑, 源头修 3 处:

1. auto-setup.ps1 Phase 1: Set-ExecutionPolicy CurrentUser RemoteSigned
   修复: 管理员 PS 下 claude.ps1 因 Restricted 被拦

2. auto-setup.ps1 Phase 4: SendMessageTimeout WM_SETTINGCHANGE 广播
   修复: User scope env 不自动同步到已打开 explorer/shell

3. auto-setup.ps1 + Setup.sh Phase 4: 预填 .claude.json
   {hasCompletedOnboarding:true, customApiKeyResponses.approved:[<sk-前20字符>]}
   修复: Claude Code v2.0.1 登录选择页两个选项都走 anthropic.com OAuth,
         国内连不上. 预填标记后首次 claude 直接进对话提示符.

配套 Gitea 'bookworm-boot/启动Bookworm.bat' (a6f9cf7) 已清理 &$env:ANTHROPIC_MODEL call-operator 误解析.
This commit is contained in:
Bookworm Admin 2026-04-21 14:22:48 +08:00
parent a6f9cf7157
commit 18210ac497
2 changed files with 31 additions and 1 deletions

View File

@ -429,6 +429,11 @@ if [ -z "$ANTHROPIC_API_KEY" ]; then
rm -f "$HOME/.zshrc.bak" "$HOME/.bashrc.bak" 2>/dev/null || true rm -f "$HOME/.zshrc.bak" "$HOME/.bashrc.bak" 2>/dev/null || true
export ANTHROPIC_API_KEY="$SK_KEY" export ANTHROPIC_API_KEY="$SK_KEY"
export ANTHROPIC_BASE_URL="https://bww.letcareme.com" 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 本日免密 # 存 Keychain 本日免密
security add-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" -w "ANTHROPIC_API_KEY=$SK_KEY security add-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" -w "ANTHROPIC_API_KEY=$SK_KEY
ANTHROPIC_BASE_URL=https://bww.letcareme.com ANTHROPIC_BASE_URL=https://bww.letcareme.com

View File

@ -20,7 +20,7 @@ param(
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
# ─── 版本号 (每次更新递增, build.ps1 自动读取) ────── # ─── 版本号 (每次更新递增, 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 模式日志标记 # DryRun 模式日志标记
if ($DryRun) { $global:BWDryRun = $DryRun } else { $global:BWDryRun = $null } if ($DryRun) { $global:BWDryRun = $DryRun } else { $global:BWDryRun = $null }
@ -761,6 +761,15 @@ Log-Phase 1 "环境检测 + 依赖自动安装"
# 刷新 PATH # 刷新 PATH
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") $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 检测, 不动任何东西 # DryRun 模式: 只做 Phase 1 检测, 不动任何东西
if (Is-DryRun "env") { if (Is-DryRun "env") {
Log-Info "[DryRun=env] Phase 1 只检测 PATH + 依赖可达性, 跳过后续步骤" Log-Info "[DryRun=env] Phase 1 只检测 PATH + 依赖可达性, 跳过后续步骤"
@ -1317,6 +1326,22 @@ if (-not $secretsDecrypted) {
if ($ckOk) { if ($ckOk) {
$env:ANTHROPIC_API_KEY = $apiKey $env:ANTHROPIC_API_KEY = $apiKey
$env:ANTHROPIC_BASE_URL = "https://bww.letcareme.com" $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 "凭证已验证并持久化" Log-OK "凭证已验证并持久化"
$secretsDecrypted = $true $secretsDecrypted = $true
Save-SecretsToCache Save-SecretsToCache