Skip to content

specode/dotfiles

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dotfiles

简洁、偏现代 CLI 工作流的个人开发环境配置,按三个阶段组织:base(基础依赖)→ terminal(终端工具)→ ai(AI 服务)

用法模型

方向 命令 作用
仓库 → 本机 ./install.sh [phase] 按阶段把仓库里的托管配置复制到本机;装完后本机文件与仓库解耦
本机 → 仓库 ./sync-from-local.sh 在确认后,把本机托管配置写回仓库;不自动 git add / commit / push

要点:

  • 使用真实文件副本,不依赖长期软链。日常改本机配置不会改动仓库。
  • 两个脚本都按程序整组决策:一组内全部保留或全部替换,避免半套新旧配置混用。
  • 默认答案是 N(不覆盖)。

三个安装阶段

阶段 内容 依赖
base Homebrew(官方安装脚本)+ Ghostty(brew install --cask ghostty)+ ghostty 配置 无;阻塞后续阶段
terminal terminal/Brewfile(starship、antidote、eza、bat、zoxide、fd、ripgrep、neovim、字体)+ zsh/starship 配置 base
ai CLIProxyAPI(brew install cliproxyapi + 配置模板渲染 + brew services 常驻)+ Agent 全局规则(四个本机路径)+ npx skillsai/skills.txt 清单安装 skills base;skills 需要本机已有 Node/npx
./install.sh            # 等价 ./install.sh all:base -> terminal -> ai
./install.sh base       # 只装基础依赖
./install.sh terminal   # 只装终端工具(会先检测 base 是否就绪)
./install.sh ai         # 只装 AI 服务(会先检测 base 是否就绪)

阶段完成情况记录在 ~/.local/state/dotfiles/phases/(每阶段一个时间戳文件)。门禁以真实检测为准:单独运行 terminal / ai 时会先确认 brew 与 Ghostty 存在,缺失则中止并提示先运行 ./install.sh base;检测通过但标记缺失时会自动补写标记。

Managed configuration

阶段 程序 仓库路径 本机路径
base Ghostty base/ghostty/config ~/.config/ghostty/config
terminal Starship terminal/starship/starship.toml ~/.config/starship.toml
terminal Zsh terminal/zsh/.zshrcterminal/zsh/.zsh_plugins.txt ~/.zshrc~/.zsh_plugins.txt
ai Agent rules ai/agent-rules/AGENTS.global.md(单文件) ~/.agents/AGENTS.md~/.claude/CLAUDE.md~/.codex/AGENTS.md~/.grok/AGENTS.md

Agent rules 是独立配置组

  • 安装:四个本机路径与仓库比较;任一路径缺失、内容不同、软链冲突或类型不匹配 → 整组需一次确认;选 y 则四个路径全部写成仓库副本。
  • 回写:先要求四个本机规则内容一致且可信;一致后与仓库比较,最多询问并写入一次。
  • ~/.agents/AGENTS.md 是跨 agent 的通用位置;~/.codex~/.grok 副本在对应 CLI 支持直接读取 ~/.agents 前保留。

Agent 规则只保存跨项目个人习惯,不包含具体仓库结构。

terminal/zsh/.zsh_plugins.zshantidote 生成的插件加载文件,不会安装或反向同步。

密钥与配置模板

CLIProxyAPI 配置不在仓库里保存任何密钥,仓库模板用 {{VAR}} 占位:

  • 真实值只存放在本机私有文件 ~/.config/cliproxyapi/credentials.env(权限强制为 600,KEY='value' 格式),当前包含 CLIPROXY_API_KEYCLIPROXY_MANAGEMENT_PASSWORDOPENCODE_GO_API_KEY。该路径必须是普通文件,不能是软链;文件中缺失/为空的值回退读取终端里同名环境变量。
  • 安装:先用 credentials.env 渲染模板,再与本机文件比较/复制;任一所需值缺失时安装失败且不会写阶段完成标记,也不会写出半渲染的配置。credentials.env 不存在时自动生成(本地 key 随机生成,OPENCODE_GO_API_KEY 留空,可手工补填或依赖环境变量)。
  • 管理密码部署成功后只在 ~/.local/state/dotfiles/cliproxyapi/management-password.sha256 保存权限为 600 的 SHA-256 指纹;后续指纹变化会自动重新部署配置并重启服务,状态文件不保存明文密码。

CLIProxyAPI

ai 阶段负责 CLIProxyAPI 的完整生命周期:

  • brew install cliproxyapi(homebrew-core formula),以 brew services 常驻(~/Library/LaunchAgents/homebrew.mxcl.cliproxyapi.plist)。
  • 配置模板 ai/cliproxyapi/cliproxyapi.conf.template 渲染后部署到 $(brew --prefix)/etc/cliproxyapi.conf(权限 600)。该路径不在 $HOME 下,也需要服务重启配合,所以不走通用托管清单,由安装脚本单独处理:缺失时直接安装;有差异时展示已脱敏的 diff 并确认(先备份到 ~/.dotfiles-backups/);部署后 brew services restart
  • 比较时忽略 secret-key 行:服务启动时会把明文管理密码就地哈希,该行永远无法逐字节一致。
  • 认证凭据目录 ~/.cli-proxy-api/(OAuth token 等)纳入仓库管理。
  • cliproxyapi.conf 不参与 sync-from-local.sh 回写;本机改动要进仓库时,手工把改动(密钥替换回 {{VAR}})写入模板。

Skills(ai/skills.txt

skills 用 vercel-labs/skillsnpx skills)统一管理。ai/skills.txt 每个非注释行会执行一次:

npx skills add <该行内容>

例如 vercel-labs/agent-skills --skill frontend-design -a claude-code -a codex。清单为空时跳过。skills 只从仓库单向安装到本机,不参与 sync-from-local.sh 回写。

Neovim

terminal/Brewfile 负责安装 Neovim;配置继续由独立的 specode/nvim-config 仓库管理。本仓库不会复制、同步或改动 ~/.config/nvim

Requirements

  • macOS
  • rsync(macOS 自带,用于精确复制目录)
  • Homebrew 不需要预装:base 阶段会用官方脚本安装
  • ai 阶段安装 skills 需要 Node(npx),可 brew install node

Installation(首次安装)

git clone git@github.com:specode/dotfiles.git ~/Code/dotfiles
cd ~/Code/dotfiles
./install.sh

每个阶段内,配置部署先只读比较全部托管路径,并按程序展示结果。决策单位始终是整个程序(该程序下全部托管路径一起保留或一起替换):

  • 可自动安装:该程序本机没有冲突(路径缺失,或仅有旧版指向本仓库的正确软链)时,整组直接复制,无需确认。
  • 需确认覆盖:该程序任一托管路径内容不同、软链冲突或类型不匹配时,对该程序询问一次。
    • y:先把该程序已有托管路径移到 ~/.dotfiles-backups/<时间>/<程序>/,再整组写入仓库副本。
    • N整组全部不动——已有文件保持原样,同组里仍缺失的路径也不会单独补装。
  • 标准输入无法提供选择时,会在修改文件前安全退出。

装完后本机配置与仓库文件无关:编辑 ~/.zshrc 等不会改动 git 工作区。

Update from repository(从仓库更新本机)

仓库有更新时,用同一条安装命令把变更部署到本机(不是 sync-from-local.sh),可以只跑受影响的阶段:

cd ~/Code/dotfiles
git pull
./install.sh terminal   # 或 base / ai / all
  • 与仓库已一致的程序:跳过。
  • 本机有差异的程序:按组询问是否用仓库覆盖(同样先备份)。
  • sync-from-local.sh 不会把远程更新拉到本机;它只负责本机 → 仓库。

Sync from local(本机优化写回仓库)

仅在你想把本机上的配置改动晋升进仓库时运行:

cd ~/Code/dotfiles
./sync-from-local.sh
  • 先检查差异,再按程序确认;默认 N
  • 不会自动 git add、提交或推送。写回后请自行检查再提交:
git status
git diff
# 确认后再 add / commit / push

Agent rules:四个本机副本必须内容一致且可信,才会与仓库比较并最多写入一次;任一缺失、类型异常、不可信软链或内容互不一致,则整组阻止写回。

其它会阻止对应配置组写回的情况:

  • 必需的本机路径缺失、类型错误,或是未指向本仓库源路径的软链。
  • 对应仓库路径已经有暂存、未暂存或未跟踪改动。
  • 本机配置中发现常见私钥、Token、API Key 或密码特征。

目录同步会精确镜像新增、修改和删除,同时忽略 .git/node_modules/.DS_Store、日志和常见编辑器临时文件。

Structure

.
├── install.sh
├── sync-from-local.sh
├── lib/
│   └── managed-configs.sh
├── base/
│   └── ghostty/
│       └── config
├── terminal/
│   ├── Brewfile
│   ├── starship/
│   │   └── starship.toml
│   └── zsh/
│       ├── .zsh_plugins.txt
│       ├── .zsh_plugins.zsh
│       └── .zshrc
└── ai/
    ├── agent-rules/
    │   └── AGENTS.global.md
    ├── cliproxyapi/
    │   └── cliproxyapi.conf.template
    └── skills.txt

About

My Mac DotFiles

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors