jianshuo.dev
🖥️ machine-setup

一台新 Mac 的开机仪式

在一台全新的 Apple Silicon Mac 上,把整套开发环境一键复刻出来——同一套标准,同一份配置。

快照来源:macOS 26.4 · arm64 · zsh · Homebrew 5.1

$ curl -fsSL https://jianshuo.dev/setup/setup.sh | bash -s -- --yes
不依赖 github.com。 这条命令只需要能连上 jianshuo.dev——它会先从 jianshuo.dev/setup/machine-setup.tar.gz 自举安装所需文件到 ~/code/machine-setup,再继续跑全套。该地址是 Cloudflare 边缘实时反代 GitHub main 分支,git push 即生效。所以在访问不了 GitHub 的网络里也照常能用。

1装起来

能访问 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 提示

2装了什么

类别内容
包管理Homebrew + Brewfile(formulae / casks / uv / npm / VSCode 扩展全清单)
运行时nvm → node v22、pnpm、bun、uv(kimi-cli)、ruby
全局 npmcodex、wx-cli、pi-coding-agent、ccglass、corepack
dotfiles.zshrc.zprofile、git 身份
Claude CodeCLI + 2 个 marketplace + 7 个用户级 plugin
代码仓库全部 GitHub repo 自动 clone,扁平落到 ~/code/<name>
独立二进制xurl(X CLI)、ccline(需手动拷)

3密钥怎么处理

真实密钥不进 git。全部收在一个本地文件 ~/code/.env 里,shellrc 自动 source 它。安装脚本从 env.example 拷一份占位符版过去,由你填真实值。

env.example列全了所有 key 名(占位符 CHANGE_ME)——20+ 个 API key(OpenAI / Claude / 火山 / 微信 / ASC / Cloudflare / Tailscale…),外加 VOLC_APPIDMODEL_SPEECH_API_KEYX_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 即可。

4跑完之后手动几步

  1. 填一个本地文件:~/code/.env(模板 env.example),若已随 SSH 备份恢复成真实值则跳过。
  2. 新开终端,或 source ~/.zshrc
  3. 代理:装好本地代理 app(监听 127.0.0.1:1087)后重开终端即可——.zshrc 检测到端口在监听才启用代理,没装也不影响直连。
  4. 登录:claude /login(或用 cc-switch 切号)、gh auth login
  5. 自写 skill 不会自动来:把旧机器 ~/.claude/skills/ 整个目录、以及 ~/.claude/settings.json(hooks / statusLine / permissions)拷过来。
  6. xurlccline 不是 brew 包,按 extras 步骤的提示手动放二进制。

5重新生成快照

环境变了之后,在旧机器上更新 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、没有白名单。