diff --git a/auto-setup.ps1 b/auto-setup.ps1 index 7a702a9..7fdf48f 100644 --- a/auto-setup.ps1 +++ b/auto-setup.ps1 @@ -20,7 +20,7 @@ param( $ErrorActionPreference = "Stop" # ─── 版本号 (每次更新递增, build.ps1 自动读取) ────── -$BWVersion = "3.0.5" # feat: winget 三层 fallback + 截图粘贴助手 + 启动器自检 + 僵尸快捷方式清理 +$BWVersion = "3.0.6" # fix: 启动器 bat 修复 wt ';' 切 tab + -d 转义引号 + PATH 重载 + claude 诊断 + 阈值调整 # DryRun 模式日志标记 if ($DryRun) { $global:BWDryRun = $DryRun } else { $global:BWDryRun = $null } diff --git a/install.ps1 b/install.ps1 index f67850c..f3aa71e 100644 --- a/install.ps1 +++ b/install.ps1 @@ -50,8 +50,8 @@ if (-not $opensslCmd) { function Write-Banner { Write-Host "" Write-Host " +------------------------------------------+" -ForegroundColor Cyan - Write-Host " | Bookworm Portable Installer v1.5 |" -ForegroundColor Cyan - Write-Host " | 92 Skills / 18 Agents / 34 Hooks |" -ForegroundColor Cyan + Write-Host " | Bookworm Portable Installer v1.6 |" -ForegroundColor Cyan + Write-Host " | Claude Code 国内一键就绪 |" -ForegroundColor Cyan Write-Host " +------------------------------------------+" -ForegroundColor Cyan Write-Host "" } @@ -680,19 +680,20 @@ if (Test-Path $claudeMd) { $bwChecks += @{ Name = "CLAUDE.md (文件不存在!)"; OK = $false } } -# 检查 Skills +# v3.0.5: 阈值按脱敏分发版 (bookworm-portable-config.git) 实际内容定 +# 管理员自用的完整版 (bookworm-config.git) 含 90+ skills, 分发版精简到核心 14+ $skillCount = 0 if (Test-Path $skillsDir) { $skillCount = (Get-ChildItem $skillsDir -Directory -ErrorAction SilentlyContinue).Count } -$bwChecks += @{ Name = "Skills ($skillCount 个)"; OK = ($skillCount -gt 50) } +$bwChecks += @{ Name = "Skills ($skillCount 个)"; OK = ($skillCount -ge 10) } # 检查 Hooks $hookCount = 0 if (Test-Path $hooksDir) { $hookCount = (Get-ChildItem $hooksDir -Filter "*.js" -File -ErrorAction SilentlyContinue).Count } -$bwChecks += @{ Name = "Hooks ($hookCount 个)"; OK = ($hookCount -gt 10) } +$bwChecks += @{ Name = "Hooks ($hookCount 个)"; OK = ($hookCount -ge 3) } # 检查 settings.json hooks 配置 $hasHooks = $false @@ -714,12 +715,12 @@ foreach ($c in $bwChecks) { if (-not $allOK) { Write-Host "" Write-Host " ╔══════════════════════════════════════════════════════╗" -ForegroundColor Yellow - Write-Host " ║ [!] 警告: Bookworm 系统不完整 ║" -ForegroundColor Yellow + Write-Host " ║ [!] 警告: Bookworm 系统核心资产不足 ║" -ForegroundColor Yellow Write-Host " ║ Claude Code 将以原生模式启动 (无 Skills/Hooks) ║" -ForegroundColor Yellow - Write-Host " ║ 建议: 不加 -StartOnly 重新运行 install.ps1 同步 ║" -ForegroundColor Yellow + Write-Host " ║ 建议: 检查网络后不加 -StartOnly 重新运行同步 ║" -ForegroundColor Yellow Write-Host " ╚══════════════════════════════════════════════════════╝" -ForegroundColor Yellow } else { - Write-Host " [OK] Bookworm 系统完整 ($skillCount Skills / $hookCount Hooks)" -ForegroundColor Green + Write-Host " [OK] Bookworm 分发版就绪 ($skillCount Skills / $hookCount Hooks / Settings)" -ForegroundColor Green } # --- MCP 依赖检查 (中文提醒) --- diff --git a/tools/gen-launcher-bats.ps1 b/tools/gen-launcher-bats.ps1 new file mode 100644 index 0000000..1797e53 --- /dev/null +++ b/tools/gen-launcher-bats.ps1 @@ -0,0 +1,160 @@ +# Bookworm Portable 启动器 bat 生成工具 (v3.0.6) +# 用途: 从单一明文 PowerShell 脚本生成两个 bat, 避免手工同步 Base64 字符串不一致 +# 用法: pwsh -NoProfile -File tools/gen-launcher-bats.ps1 +# 输出: 启动Bookworm.bat + 更新并启动Bookworm.bat (覆盖写入) + +$ErrorActionPreference = "Stop" +$repoRoot = Split-Path -Parent $PSScriptRoot +$launchBat = Join-Path $repoRoot "启动Bookworm.bat" +$updateBat = Join-Path $repoRoot "更新并启动Bookworm.bat" + +# ─── 明文: DPAPI 加载 + PATH 重载 + claude 诊断 + 启动 ───────── +$plainScript = @' +Add-Type -AssemblyName System.Security +$env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [Environment]::GetEnvironmentVariable('Path','User') +$r = 'HKCU:\Software\Bookworm\CachedEnv' +try { + (Get-ItemProperty $r -EA Stop).PSObject.Properties | Where-Object { $_.Name -match '^[A-Z_]+$' } | ForEach-Object { + $v = $_.Value + try { + $b = [Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($v), $null, [Security.Cryptography.DataProtectionScope]::CurrentUser) + $v = [Text.Encoding]::UTF8.GetString($b) + } catch {} + [Environment]::SetEnvironmentVariable($_.Name, $v, 'Process') + } +} catch {} +if (-not (Get-Command claude -ErrorAction SilentlyContinue)) { + Write-Host '' + Write-Host ' [!] claude 命令未找到' -ForegroundColor Red + Write-Host '' + Write-Host ' 可能原因:' -ForegroundColor Yellow + Write-Host ' 1. Claude Code 未安装 - 跑: npm i -g @anthropic-ai/claude-code' -ForegroundColor Gray + Write-Host ' 2. npm 全局路径不在 PATH - 重跑 Bookworm-Setup.exe 修复' -ForegroundColor Gray + Write-Host '' + Write-Host ' 当前 PATH 片段 (诊断用):' -ForegroundColor Gray + ($env:Path -split ';') | Where-Object { $_ -match 'npm|nodejs|pwsh|Git' } | ForEach-Object { Write-Host " $_" -ForegroundColor DarkGray } + Write-Host '' + return +} +& claude --dangerously-skip-permissions +'@ + +# ─── Base64-UTF-16LE 编码 ───────────────────────────────── +$bytes = [System.Text.Encoding]::Unicode.GetBytes($plainScript) +$enc = [Convert]::ToBase64String($bytes) + +# 健康检查 +if ($enc.Length -gt 7500) { throw "Base64 长度 $($enc.Length) 超 bat 变量安全上限 7500" } +$bad = $enc -replace '[A-Za-z0-9+/=]', '' +if ($bad) { throw "Base64 含非法字符: [$bad]" } + +Write-Host "[gen-launcher-bats] Base64 长度: $($enc.Length), 纯字符集检查 OK" -ForegroundColor Green + +# ─── bat 1: 启动Bookworm.bat ────────────────────────────── +$launch = @" +@echo off +chcp 65001 > nul +cd /d "%~dp0" + +:: 中转站在国内,不走代理 +set NO_PROXY=bww.letcareme.com,code.letcareme.com,letcareme.com,localhost,127.0.0.1 +set no_proxy=%NO_PROXY% + +:: 静默自动更新 (bookworm-boot + .claude 配置, 失败不阻断启动) +echo [..] 检查更新... +git pull --rebase >nul 2>nul +git -C "%USERPROFILE%\.claude" pull --rebase >nul 2>nul + +set USE_WT=0 +where wt >nul 2>nul && set USE_WT=1 + +set USE_PWSH7=0 +where pwsh >nul 2>nul && set USE_PWSH7=1 + +:: v3.0.6: Base64-UTF-16LE (PATH 重载 + DPAPI 凭证加载 + claude 诊断 + 启动) +:: 纯 A-Za-z0-9+/= 字符集, 避免 wt.exe 的 ';' 切 tab 误切 (修复 64856bc 症状一) +:: -d "%CD%" 无尾反斜杠, 避免 -d "%~dp0" 的转义引号 (修复 0c33109 症状二) +:: 重新生成: pwsh -NoProfile -File tools/gen-launcher-bats.ps1 +set ENC=$enc + +:: 优先路径: wt + pwsh7 +if %USE_WT% equ 1 if %USE_PWSH7% equ 1 ( + start "" wt new-tab --title "Bookworm Smart Assistant" -d "%CD%" -- pwsh -NoLogo -NoExit -EncodedCommand %ENC% + exit +) + +:: 路径 2: wt + powershell 5.1 +if %USE_WT% equ 1 if %USE_PWSH7% equ 0 ( + start "" wt new-tab --title "Bookworm Smart Assistant" -d "%CD%" -- powershell -NoLogo -ExecutionPolicy Bypass -NoExit -EncodedCommand %ENC% + exit +) + +:: 路径 3: conhost + pwsh7 (无 wt 就不会有 ; 切 tab 问题, 但仍用 Base64 统一) +if %USE_PWSH7% equ 1 ( + start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -EncodedCommand %ENC% + exit +) + +:: 路径 4: 回退 PowerShell 5.1 (最低保障, 交给 install.ps1 -StartOnly 处理) +title Bookworm Portable +echo. +echo [!] PowerShell 7 未安装, 使用 PowerShell 5.1 +echo. +powershell -ExecutionPolicy Bypass -File install.ps1 -StartOnly -AutoAccept +if %errorlevel% neq 0 ( + echo. + echo 启动失败,按任意键退出... + pause > nul +) +"@ + +# ─── bat 2: 更新并启动Bookworm.bat ─────────────────────── +$update = @" +@echo off +chcp 65001 > nul +cd /d "%~dp0" + +:: 中转站在国内,不走代理 +set NO_PROXY=bww.letcareme.com,code.letcareme.com,letcareme.com,localhost,127.0.0.1 +set no_proxy=%NO_PROXY% + +:: 静默自动更新 (bookworm-boot + .claude 配置) +echo [..] 同步更新... +git pull --rebase >nul 2>nul +git -C "%USERPROFILE%\.claude" pull --rebase >nul 2>nul + +:: v3.0.6: 同启动Bookworm.bat 的 Base64 (DPAPI + PATH 重载 + claude 启动) +set ENC=$enc + +:: 检测 pwsh7 可用性 +where pwsh >nul 2>nul +if %errorlevel% equ 0 ( + :: pwsh7: 先同步配置 (SkipLaunch 不启动 claude), 再用 -EncodedCommand 在新窗口启动 + pwsh -NoLogo -ExecutionPolicy Bypass -File "%~dp0install.ps1" -AutoAccept -SkipLaunch + start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -EncodedCommand %ENC% + exit +) + +:: 回退 PowerShell 5.1: 一次调用完成更新+加载凭证+启动 (消除双次调用) +title Bookworm Portable +powershell -ExecutionPolicy Bypass -File "%~dp0install.ps1" -AutoAccept +if %errorlevel% neq 0 ( + echo. + echo 启动失败,按任意键退出... + pause > nul +) +"@ + +# ─── 写入 ───────────────────────────────────────────────── +# bat 文件默认期望 GBK/ANSI, 但脚本顶部 chcp 65001 已切换到 UTF-8, 用无 BOM UTF-8 写入 +[System.IO.File]::WriteAllText($launchBat, $launch, [System.Text.UTF8Encoding]::new($false)) +[System.IO.File]::WriteAllText($updateBat, $update, [System.Text.UTF8Encoding]::new($false)) +Write-Host "[gen-launcher-bats] ✓ 启动Bookworm.bat ($((Get-Item $launchBat).Length) bytes)" -ForegroundColor Green +Write-Host "[gen-launcher-bats] ✓ 更新并启动Bookworm.bat ($((Get-Item $updateBat).Length) bytes)" -ForegroundColor Green + +# ─── Round-trip 验证 ───────────────────────────────────── +$decoded = [System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($enc)) +$err = $null +[void][System.Management.Automation.Language.Parser]::ParseInput($decoded, [ref]$null, [ref]$err) +if ($err) { throw "解码后脚本 PARSE ERR: $($err[0])" } +Write-Host "[gen-launcher-bats] ✓ Round-trip PARSE OK ($($decoded.Length) chars)" -ForegroundColor Green diff --git a/启动Bookworm.bat b/启动Bookworm.bat index 420abdb..a6f943e 100644 --- a/启动Bookworm.bat +++ b/启动Bookworm.bat @@ -2,9 +2,6 @@ chcp 65001 > nul cd /d "%~dp0" -:: 默认模型 (中转站兼容白名单, Claude Code 2.0.x 默认 4-5 会 503) -if not defined ANTHROPIC_MODEL set ANTHROPIC_MODEL=claude-opus-4-7 - :: 中转站在国内,不走代理 set NO_PROXY=bww.letcareme.com,code.letcareme.com,letcareme.com,localhost,127.0.0.1 set no_proxy=%NO_PROXY% @@ -14,38 +11,37 @@ echo [..] 检查更新... git pull --rebase >nul 2>nul git -C "%USERPROFILE%\.claude" pull --rebase >nul 2>nul -:: === 终端选择: Windows Terminal > conhost === -:: wt.exe 支持完整 Unicode 渲染 + 自由缩放不闪退 set USE_WT=0 where wt >nul 2>nul && set USE_WT=1 -:: === Shell 选择: pwsh7 > powershell 5.1 === -:: pwsh7 启动更快, 支持更多语法, Claude Code TUI 渲染更好 set USE_PWSH7=0 where pwsh >nul 2>nul && set USE_PWSH7=1 -:: 构建凭证加载命令 (DPAPI 解密) -set CRED_CMD=Add-Type -AssemblyName System.Security;$r='HKCU:\Software\Bookworm\CachedEnv';try{(Get-ItemProperty $r -EA Stop).PSObject.Properties^|Where-Object{$_.Name-match'^[A-Z_]+$'}^|ForEach-Object{$v=$_.Value;try{$b=[Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($v),$null,[Security.Cryptography.DataProtectionScope]::CurrentUser);$v=[Text.Encoding]::UTF8.GetString($b)}catch{};[Environment]::SetEnvironmentVariable($_.Name,$v,'Process')}}catch{}; +:: v3.0.6: Base64-UTF-16LE (PATH 重载 + DPAPI 凭证加载 + claude 诊断 + 启动) +:: 纯 A-Za-z0-9+/= 字符集, 避免 wt.exe 的 ';' 切 tab 误切 (修复 64856bc 症状一) +:: -d "%CD%" 无尾反斜杠, 避免 -d "%~dp0" 的转义引号 (修复 0c33109 症状二) +:: 重新生成: pwsh -NoProfile -File tools/gen-launcher-bats.ps1 +set ENC=QQBkAGQALQBUAHkAcABlACAALQBBAHMAcwBlAG0AYgBsAHkATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AAoAJABlAG4AdgA6AFAAYQB0AGgAIAA9ACAAWwBFAG4AdgBpAHIAbwBuAG0AZQBuAHQAXQA6ADoARwBlAHQARQBuAHYAaQByAG8AbgBtAGUAbgB0AFYAYQByAGkAYQBiAGwAZQAoACcAUABhAHQAaAAnACwAJwBNAGEAYwBoAGkAbgBlACcAKQAgACsAIAAnADsAJwAgACsAIABbAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBHAGUAdABFAG4AdgBpAHIAbwBuAG0AZQBuAHQAVgBhAHIAaQBhAGIAbABlACgAJwBQAGEAdABoACcALAAnAFUAcwBlAHIAJwApAAoAJAByACAAPQAgACcASABLAEMAVQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwAQgBvAG8AawB3AG8AcgBtAFwAQwBhAGMAaABlAGQARQBuAHYAJwAKAHQAcgB5ACAAewAKACAAIAAoAEcAZQB0AC0ASQB0AGUAbQBQAHIAbwBwAGUAcgB0AHkAIAAkAHIAIAAtAEUAQQAgAFMAdABvAHAAKQAuAFAAUwBPAGIAagBlAGMAdAAuAFAAcgBvAHAAZQByAHQAaQBlAHMAIAB8ACAAVwBoAGUAcgBlAC0ATwBiAGoAZQBjAHQAIAB7ACAAJABfAC4ATgBhAG0AZQAgAC0AbQBhAHQAYwBoACAAJwBeAFsAQQAtAFoAXwBdACsAJAAnACAAfQAgAHwAIABGAG8AcgBFAGEAYwBoAC0ATwBiAGoAZQBjAHQAIAB7AAoAIAAgACAAIAAkAHYAIAA9ACAAJABfAC4AVgBhAGwAdQBlAAoAIAAgACAAIAB0AHIAeQAgAHsACgAgACAAIAAgACAAIAAkAGIAIAA9ACAAWwBTAGUAYwB1AHIAaQB0AHkALgBDAHIAeQBwAHQAbwBnAHIAYQBwAGgAeQAuAFAAcgBvAHQAZQBjAHQAZQBkAEQAYQB0AGEAXQA6ADoAVQBuAHAAcgBvAHQAZQBjAHQAKABbAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACQAdgApACwAIAAkAG4AdQBsAGwALAAgAFsAUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBEAGEAdABhAFAAcgBvAHQAZQBjAHQAaQBvAG4AUwBjAG8AcABlAF0AOgA6AEMAdQByAHIAZQBuAHQAVQBzAGUAcgApAAoAIAAgACAAIAAgACAAJAB2ACAAPQAgAFsAVABlAHgAdAAuAEUAbgBjAG8AZABpAG4AZwBdADoAOgBVAFQARgA4AC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAKQAKACAAIAAgACAAfQAgAGMAYQB0AGMAaAAgAHsAfQAKACAAIAAgACAAWwBFAG4AdgBpAHIAbwBuAG0AZQBuAHQAXQA6ADoAUwBlAHQARQBuAHYAaQByAG8AbgBtAGUAbgB0AFYAYQByAGkAYQBiAGwAZQAoACQAXwAuAE4AYQBtAGUALAAgACQAdgAsACAAJwBQAHIAbwBjAGUAcwBzACcAKQAKACAAIAB9AAoAfQAgAGMAYQB0AGMAaAAgAHsAfQAKAGkAZgAgACgALQBuAG8AdAAgACgARwBlAHQALQBDAG8AbQBtAGEAbgBkACAAYwBsAGEAdQBkAGUAIAAtAEUAcgByAG8AcgBBAGMAdABpAG8AbgAgAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAKQApACAAewAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAnACAAIABbACEAXQAgAGMAbABhAHUAZABlACAAfVTkTipnfmIwUicAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAAUgBlAGQACgAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACcAJwAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAgACAA71P9gJ9T4FY6ACcAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAAWQBlAGwAbABvAHcACgAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACcAIAAgACAAIAAxAC4AIABDAGwAYQB1AGQAZQAgAEMAbwBkAGUAIAAqZ4lbxYggAC0AIADRjToAIABuAHAAbQAgAGkAIAAtAGcAIABAAGEAbgB0AGgAcgBvAHAAaQBjAC0AYQBpAC8AYwBsAGEAdQBkAGUALQBjAG8AZABlACcAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARwByAGEAeQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAgACAAIAAgADIALgAgAG4AcABtACAAaFFAXO+NhF8NTihXIABQAEEAVABIACAALQAgAM2R0Y0gAEIAbwBvAGsAdwBvAHIAbQAtAFMAZQB0AHUAcAAuAGUAeABlACAA7k8NWScAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARwByAGEAeQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAnACAAIABTX01SIABQAEEAVABIACAAR3K1ayAAKADKi61lKHUpADoAJwAgAC0ARgBvAHIAZQBnAHIAbwB1AG4AZABDAG8AbABvAHIAIABHAHIAYQB5AAoAIAAgACgAJABlAG4AdgA6AFAAYQB0AGgAIAAtAHMAcABsAGkAdAAgACcAOwAnACkAIAB8ACAAVwBoAGUAcgBlAC0ATwBiAGoAZQBjAHQAIAB7ACAAJABfACAALQBtAGEAdABjAGgAIAAnAG4AcABtAHwAbgBvAGQAZQBqAHMAfABwAHcAcwBoAHwARwBpAHQAJwAgAH0AIAB8ACAARgBvAHIARQBhAGMAaAAtAE8AYgBqAGUAYwB0ACAAewAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiACAAIAAgACAAJABfACIAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARABhAHIAawBHAHIAYQB5ACAAfQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAHIAZQB0AHUAcgBuAAoAfQAKACYAIABjAGwAYQB1AGQAZQAgAC0ALQBkAGEAbgBnAGUAcgBvAHUAcwBsAHkALQBzAGsAaQBwAC0AcABlAHIAbQBpAHMAcwBpAG8AbgBzAA== :: 优先路径: wt + pwsh7 if %USE_WT% equ 1 if %USE_PWSH7% equ 1 ( - start "" wt new-tab --title "Bookworm Smart Assistant" -d "%~dp0" -- pwsh -NoLogo -NoExit -Command "%CRED_CMD% claude --dangerously-skip-permissions" + start "" wt new-tab --title "Bookworm Smart Assistant" -d "%CD%" -- pwsh -NoLogo -NoExit -EncodedCommand %ENC% exit ) :: 路径 2: wt + powershell 5.1 if %USE_WT% equ 1 if %USE_PWSH7% equ 0 ( - start "" wt new-tab --title "Bookworm Smart Assistant" -d "%~dp0" -- powershell -NoLogo -ExecutionPolicy Bypass -NoExit -Command "%CRED_CMD% claude --dangerously-skip-permissions" + start "" wt new-tab --title "Bookworm Smart Assistant" -d "%CD%" -- powershell -NoLogo -ExecutionPolicy Bypass -NoExit -EncodedCommand %ENC% exit ) -:: 路径 3: conhost + pwsh7 +:: 路径 3: conhost + pwsh7 (无 wt 就不会有 ; 切 tab 问题, 但仍用 Base64 统一) if %USE_PWSH7% equ 1 ( - start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -Command "%CRED_CMD% claude --dangerously-skip-permissions" + start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -EncodedCommand %ENC% exit ) -:: 路径 4: 回退 PowerShell 5.1 (最低保障) +:: 路径 4: 回退 PowerShell 5.1 (最低保障, 交给 install.ps1 -StartOnly 处理) title Bookworm Portable echo. echo [!] PowerShell 7 未安装, 使用 PowerShell 5.1 @@ -55,4 +51,4 @@ if %errorlevel% neq 0 ( echo. echo 启动失败,按任意键退出... pause > nul -) +) \ No newline at end of file diff --git a/更新并启动Bookworm.bat b/更新并启动Bookworm.bat index 0157332..e79ae2c 100644 --- a/更新并启动Bookworm.bat +++ b/更新并启动Bookworm.bat @@ -11,12 +11,15 @@ echo [..] 同步更新... git pull --rebase >nul 2>nul git -C "%USERPROFILE%\.claude" pull --rebase >nul 2>nul +:: v3.0.6: 同启动Bookworm.bat 的 Base64 (DPAPI + PATH 重载 + claude 启动) +set ENC=QQBkAGQALQBUAHkAcABlACAALQBBAHMAcwBlAG0AYgBsAHkATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AAoAJABlAG4AdgA6AFAAYQB0AGgAIAA9ACAAWwBFAG4AdgBpAHIAbwBuAG0AZQBuAHQAXQA6ADoARwBlAHQARQBuAHYAaQByAG8AbgBtAGUAbgB0AFYAYQByAGkAYQBiAGwAZQAoACcAUABhAHQAaAAnACwAJwBNAGEAYwBoAGkAbgBlACcAKQAgACsAIAAnADsAJwAgACsAIABbAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBHAGUAdABFAG4AdgBpAHIAbwBuAG0AZQBuAHQAVgBhAHIAaQBhAGIAbABlACgAJwBQAGEAdABoACcALAAnAFUAcwBlAHIAJwApAAoAJAByACAAPQAgACcASABLAEMAVQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwAQgBvAG8AawB3AG8AcgBtAFwAQwBhAGMAaABlAGQARQBuAHYAJwAKAHQAcgB5ACAAewAKACAAIAAoAEcAZQB0AC0ASQB0AGUAbQBQAHIAbwBwAGUAcgB0AHkAIAAkAHIAIAAtAEUAQQAgAFMAdABvAHAAKQAuAFAAUwBPAGIAagBlAGMAdAAuAFAAcgBvAHAAZQByAHQAaQBlAHMAIAB8ACAAVwBoAGUAcgBlAC0ATwBiAGoAZQBjAHQAIAB7ACAAJABfAC4ATgBhAG0AZQAgAC0AbQBhAHQAYwBoACAAJwBeAFsAQQAtAFoAXwBdACsAJAAnACAAfQAgAHwAIABGAG8AcgBFAGEAYwBoAC0ATwBiAGoAZQBjAHQAIAB7AAoAIAAgACAAIAAkAHYAIAA9ACAAJABfAC4AVgBhAGwAdQBlAAoAIAAgACAAIAB0AHIAeQAgAHsACgAgACAAIAAgACAAIAAkAGIAIAA9ACAAWwBTAGUAYwB1AHIAaQB0AHkALgBDAHIAeQBwAHQAbwBnAHIAYQBwAGgAeQAuAFAAcgBvAHQAZQBjAHQAZQBkAEQAYQB0AGEAXQA6ADoAVQBuAHAAcgBvAHQAZQBjAHQAKABbAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACQAdgApACwAIAAkAG4AdQBsAGwALAAgAFsAUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBEAGEAdABhAFAAcgBvAHQAZQBjAHQAaQBvAG4AUwBjAG8AcABlAF0AOgA6AEMAdQByAHIAZQBuAHQAVQBzAGUAcgApAAoAIAAgACAAIAAgACAAJAB2ACAAPQAgAFsAVABlAHgAdAAuAEUAbgBjAG8AZABpAG4AZwBdADoAOgBVAFQARgA4AC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAKQAKACAAIAAgACAAfQAgAGMAYQB0AGMAaAAgAHsAfQAKACAAIAAgACAAWwBFAG4AdgBpAHIAbwBuAG0AZQBuAHQAXQA6ADoAUwBlAHQARQBuAHYAaQByAG8AbgBtAGUAbgB0AFYAYQByAGkAYQBiAGwAZQAoACQAXwAuAE4AYQBtAGUALAAgACQAdgAsACAAJwBQAHIAbwBjAGUAcwBzACcAKQAKACAAIAB9AAoAfQAgAGMAYQB0AGMAaAAgAHsAfQAKAGkAZgAgACgALQBuAG8AdAAgACgARwBlAHQALQBDAG8AbQBtAGEAbgBkACAAYwBsAGEAdQBkAGUAIAAtAEUAcgByAG8AcgBBAGMAdABpAG8AbgAgAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAKQApACAAewAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAnACAAIABbACEAXQAgAGMAbABhAHUAZABlACAAfVTkTipnfmIwUicAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAAUgBlAGQACgAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACcAJwAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAgACAA71P9gJ9T4FY6ACcAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAAWQBlAGwAbABvAHcACgAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACcAIAAgACAAIAAxAC4AIABDAGwAYQB1AGQAZQAgAEMAbwBkAGUAIAAqZ4lbxYggAC0AIADRjToAIABuAHAAbQAgAGkAIAAtAGcAIABAAGEAbgB0AGgAcgBvAHAAaQBjAC0AYQBpAC8AYwBsAGEAdQBkAGUALQBjAG8AZABlACcAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARwByAGEAeQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAgACAAIAAgADIALgAgAG4AcABtACAAaFFAXO+NhF8NTihXIABQAEEAVABIACAALQAgAM2R0Y0gAEIAbwBvAGsAdwBvAHIAbQAtAFMAZQB0AHUAcAAuAGUAeABlACAA7k8NWScAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARwByAGEAeQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAnACAAIABTX01SIABQAEEAVABIACAAR3K1ayAAKADKi61lKHUpADoAJwAgAC0ARgBvAHIAZQBnAHIAbwB1AG4AZABDAG8AbABvAHIAIABHAHIAYQB5AAoAIAAgACgAJABlAG4AdgA6AFAAYQB0AGgAIAAtAHMAcABsAGkAdAAgACcAOwAnACkAIAB8ACAAVwBoAGUAcgBlAC0ATwBiAGoAZQBjAHQAIAB7ACAAJABfACAALQBtAGEAdABjAGgAIAAnAG4AcABtAHwAbgBvAGQAZQBqAHMAfABwAHcAcwBoAHwARwBpAHQAJwAgAH0AIAB8ACAARgBvAHIARQBhAGMAaAAtAE8AYgBqAGUAYwB0ACAAewAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAiACAAIAAgACAAJABfACIAIAAtAEYAbwByAGUAZwByAG8AdQBuAGQAQwBvAGwAbwByACAARABhAHIAawBHAHIAYQB5ACAAfQAKACAAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwAnAAoAIAAgAHIAZQB0AHUAcgBuAAoAfQAKACYAIABjAGwAYQB1AGQAZQAgAC0ALQBkAGEAbgBnAGUAcgBvAHUAcwBsAHkALQBzAGsAaQBwAC0AcABlAHIAbQBpAHMAcwBpAG8AbgBzAA== + :: 检测 pwsh7 可用性 where pwsh >nul 2>nul if %errorlevel% equ 0 ( - :: pwsh7: 先同步配置, 再在新窗口启动 claude (从注册表缓存加载 DPAPI 凭证) + :: pwsh7: 先同步配置 (SkipLaunch 不启动 claude), 再用 -EncodedCommand 在新窗口启动 pwsh -NoLogo -ExecutionPolicy Bypass -File "%~dp0install.ps1" -AutoAccept -SkipLaunch - start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -Command "Add-Type -AssemblyName System.Security;$r='HKCU:\Software\Bookworm\CachedEnv';try{(Get-ItemProperty $r -EA Stop).PSObject.Properties|Where-Object{$_.Name-match'^[A-Z_]+$'}|ForEach-Object{$v=$_.Value;try{$b=[Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($v),$null,[Security.Cryptography.DataProtectionScope]::CurrentUser);$v=[Text.Encoding]::UTF8.GetString($b)}catch{};[Environment]::SetEnvironmentVariable($_.Name,$v,'Process')}}catch{};& claude --dangerously-skip-permissions" + start "Bookworm Smart Assistant" pwsh -NoLogo -NoExit -EncodedCommand %ENC% exit ) @@ -27,4 +30,4 @@ if %errorlevel% neq 0 ( echo. echo 启动失败,按任意键退出... pause > nul -) +) \ No newline at end of file