<# .SYNOPSIS Bookworm Portable - 仓库准备脚本 .DESCRIPTION 将当前 .claude/ 目录初始化为 Git 仓库, 排除敏感文件和大体积依赖, 推送到 Gitea. .USAGE # 首次准备 (初始化 + 推送) .\prepare-repo.ps1 -GitUrl "http://8.138.11.105:3000/bookworm/bookworm-config.git" #> param( [Parameter(Mandatory=$true)] [string]$GitUrl ) $ErrorActionPreference = "Stop" $ClaudeDir = Join-Path $env:USERPROFILE ".claude" Write-Host "" Write-Host " Bookworm Portable - 仓库准备" -ForegroundColor Cyan Write-Host " =============================" -ForegroundColor Cyan Write-Host "" if (-not (Test-Path $ClaudeDir)) { Write-Host "[ERROR] .claude 目录不存在: $ClaudeDir" -ForegroundColor Red exit 1 } # 1. 拷贝 settings.template.json $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $templateSrc = Join-Path $ScriptDir "settings.template.json" $templateDst = Join-Path $ClaudeDir "settings.template.json" if (Test-Path $templateSrc) { Copy-Item $templateSrc $templateDst -Force Write-Host "[1/6] settings.template.json 已放入 .claude/" -ForegroundColor Green } else { Write-Host "[1/6] [WARN] settings.template.json 不在脚本目录,请手动创建" -ForegroundColor Yellow } # 2. 创建 .gitignore Write-Host "[2/6] 生成 .gitignore..." -ForegroundColor White $gitignore = @" # ===== Bookworm Portable .gitignore ===== # 凭证与密钥 (绝不提交) .credentials.json .hmac-key secrets.enc *.key *.pem *.token *.secret .env .env.* # 本地运行时 (每台机器不同) settings.json settings.local.json # 大体积/不可移植目录 mcp-servers/ node_modules/ file-history/ vendor/ # 大体积 Skill (含二进制/node_modules,目标机按需安装) skills/gstack/ skills/browse/ skills/*/dist/ skills/*/.git/ skills/*/node_modules/ # 测试文件 (28MB,不需要部署) hooks/__tests__/ # 缓存与临时文件 cache/ paste-cache/ sessions/ shell-snapshots/ telemetry/ repos/ plugins/ tasks/ teams/ backups/ # 调试日志 (本地生成) debug/ # 项目级会话数据 (含用户特定路径) projects/ # 运营敏感数据 memory/ # OS 文件 Thumbs.db desktop.ini .DS_Store # 数据库和临时文件 *.sqlite *.db *.test.tmp "@ Set-Content (Join-Path $ClaudeDir ".gitignore") -Value $gitignore -Encoding UTF8 Write-Host " [OK] .gitignore 已写入" -ForegroundColor Green # 3. 初始化 Git 仓库 Write-Host "[3/6] 初始化 Git 仓库..." -ForegroundColor White Push-Location $ClaudeDir try { if (-not (Test-Path ".git")) { git init git checkout -b main Write-Host " [OK] Git 仓库已初始化" -ForegroundColor Green } else { Write-Host " [!] 已有 .git,跳过初始化" -ForegroundColor Yellow } # 4. 暂存文件 Write-Host "[4/6] 暂存文件..." -ForegroundColor White git add -A # 人工确认待提交内容 $fileList = git diff --cached --name-only $fileCount = ($fileList | Measure-Object -Line).Lines $sizeEstimate = git diff --cached --stat | Select-Object -Last 1 Write-Host " 待提交: $fileCount 个文件" -ForegroundColor Gray Write-Host " $sizeEstimate" -ForegroundColor DarkGray # 检查是否有异常大文件 $largeFiles = git diff --cached --numstat | ForEach-Object { $parts = $_ -split '\t' if ($parts[2]) { $parts[2] } } | ForEach-Object { $item = Get-Item (Join-Path $ClaudeDir $_) -ErrorAction SilentlyContinue $size = if ($item) { $item.Length } else { 0 } if ($size -and $size -gt 1MB) { [PSCustomObject]@{ File = $_; SizeMB = [math]::Round($size / 1MB, 1) } } } if ($largeFiles) { Write-Host "" Write-Host " [!] 发现大文件 (>1MB):" -ForegroundColor Yellow $largeFiles | ForEach-Object { Write-Host " $($_.SizeMB)MB $($_.File)" -ForegroundColor Yellow } Write-Host "" } $confirm = Read-Host " 确认提交以上文件? (y/n)" if ($confirm -ne 'y') { Write-Host " 已取消" -ForegroundColor Yellow exit 0 } # 5. 提交 Write-Host "[5/6] 提交..." -ForegroundColor White git commit -m "Bookworm v6.5.1 portable commit Includes: CLAUDE.md, skills (92), agents (18), hooks (29), scripts, constitution, settings.template.json Excludes: credentials, mcp-servers, node_modules, cache, sessions, debug logs, project-specific data, gstack/browse binaries" Write-Host " [OK] 提交完成" -ForegroundColor Green # 6. 推送到 Gitea Write-Host "[6/6] 推送到 Gitea..." -ForegroundColor White $remoteExists = git remote -v 2>$null | Select-String "origin" if (-not $remoteExists) { git remote add origin $GitUrl } else { git remote set-url origin $GitUrl } Write-Host " 推送到: $GitUrl" -ForegroundColor Gray git push -u origin main 2>&1 | ForEach-Object { Write-Host " $_" } } finally { Pop-Location } # 统计 $repoSize = git -C $ClaudeDir count-objects -vH 2>$null | Select-String "size-pack" Write-Host "" Write-Host " ╔══════════════════════════════════════════╗" -ForegroundColor Green Write-Host " ║ 仓库准备完成! ║" -ForegroundColor Green Write-Host " ╠══════════════════════════════════════════╣" -ForegroundColor Green Write-Host " ║ 远程: $GitUrl ║" -ForegroundColor Green Write-Host " ║ $repoSize ║" -ForegroundColor Green Write-Host " ╚══════════════════════════════════════════╝" -ForegroundColor Green Write-Host "" Write-Host " 下一步:" -ForegroundColor Yellow Write-Host " 1. 运行 .\encrypt-secrets.ps1 创建加密凭证" -ForegroundColor Yellow Write-Host " 2. 将 USB 内容复制到 U 盘:" -ForegroundColor Yellow Write-Host " install.ps1 + stop.ps1 + secrets.enc" -ForegroundColor Yellow Write-Host " 3. 在目标机运行: .\install.ps1" -ForegroundColor Yellow