在一台全新的 Apple Silicon Mac 上,把整套开发环境一键复刻出来——同一套标准,同一份配置。
jianshuo.dev/setup/machine-setup.tar.gz 自举安装所需文件到 ~/code/machine-setup,再继续跑全套。该地址是 Cloudflare 边缘实时反代 GitHub main 分支,git push 即生效。所以在访问不了 GitHub 的网络里也照常能用。
能访问 GitHub 的话,传统方式照常可用:
# 克隆后逐步确认 git clone https://github.com/jianshuo/machine-setup.git ~/code/machine-setup cd ~/code/machine-setup bash setup.sh # 逐步确认 bash setup.sh --yes # 全自动
每一步都是幂等的,可以单独重跑:
bash setup.sh ssh # 从 iCloud 加密备份恢复 ~/.ssh + ~/code/.env bash setup.sh brew # Homebrew + Brewfile 全部包 bash setup.sh runtimes # nvm / node / uv bash setup.sh npm # 全局 npm 包 bash setup.sh dotfiles # .zshrc / .zprofile / git / secrets bash setup.sh claude # Claude Code CLI + marketplaces + plugins bash setup.sh repos # clone 全部 GitHub 仓库到 ~/code/ bash setup.sh extras # xurl / ccline 提示
| 类别 | 内容 |
|---|---|
| 包管理 | Homebrew + Brewfile(formulae / casks / uv / npm / VSCode 扩展全清单) |
| 运行时 | nvm → node v22、pnpm、bun、uv(kimi-cli)、ruby |
| 全局 npm | codex、wx-cli、pi-coding-agent、ccglass、corepack |
| dotfiles | .zshrc、.zprofile、git 身份 |
| Claude Code | CLI + 2 个 marketplace + 7 个用户级 plugin |
| 代码仓库 | 全部 GitHub repo 自动 clone,扁平落到 ~/code/<name> |
| 独立二进制 | xurl(X CLI)、ccline(需手动拷) |
真实密钥不进 git。全部收在一个本地文件 ~/code/.env 里,shellrc 自动 source 它。安装脚本从 env.example 拷一份占位符版过去,由你填真实值。
env.example 里列全了所有 key 名(占位符 CHANGE_ME)——20+ 个 API key(OpenAI / Claude / 火山 / 微信 / ASC / Cloudflare / Tailscale…),外加 VOLC_APPID、MODEL_SPEECH_API_KEY、X_ACCESS_TOKEN。照着把旧机器的真实值填进去即可,不会漏。
非密钥的个人配置(git 身份、Tailscale 内网 SSH 别名、工作区路径)直接写在 shellrc 里进 git——内网 IP 不可公网路由,公开无妨。
step_ssh 是脚本第一步,会从 iCloud 的 重要文档/ssh-backup-*.zip 解密恢复整个 ~/.ssh/ 和 ~/code/.env(提示输密码,自动 chmod 600)。.env 抢在 dotfiles 的占位符 seed 之前就位,所以恢复的是真实值。若 iCloud 还没同步下来,这步会跳过——同步好后单独重跑 bash setup.sh ssh 即可。
~/code/.env(模板 env.example),若已随 SSH 备份恢复成真实值则跳过。source ~/.zshrc。127.0.0.1:1087)后重开终端即可——.zshrc 检测到端口在监听才启用代理,没装也不影响直连。claude /login(或用 cc-switch 切号)、gh auth login。~/.claude/skills/ 整个目录、以及 ~/.claude/settings.json(hooks / statusLine / permissions)拷过来。xurl、ccline 不是 brew 包,按 extras 步骤的提示手动放二进制。环境变了之后,在旧机器上更新 Brewfile,再 git push 即对新机器生效:
brew bundle dump --file=~/code/machine-setup/Brewfile --force --describe git -C ~/code/machine-setup commit -am "update snapshot" && git push
jianshuo.dev/setup/setup.sh 和 …/machine-setup.tar.gz 不是镜像副本,而是 Cloudflare Pages Function 在请求时实时反代 GitHub main 分支(边缘缓存 5 分钟)。发布流程就是 git push——没有同步脚本、没有 hook、没有白名单。