本文件为 Claude Code (claude.ai/code) 在此仓库中工作时提供指导。
Forgexx 是一个纯 Zsh CLI 工具,用于通过 GitHub 在多台 macOS 设备之间同步配置。它采用模块化架构,每个功能(Homebrew、dotfiles、VSCode 等)都作为独立模块实现,用户可以启用/禁用。
核心架构基于 lib/modules/base.sh 中定义的注册式模块系统:
- 模块注册:每个模块调用
module_register(),传入名称、描述和三个函数指针(backup、restore、status) - 模块存储:函数指针存储在 Zsh 关联数组中:
FORGEXX_MODULE_BACKUP_FUNCS、FORGEXX_MODULE_RESTORE_FUNCS、FORGEXX_MODULE_STATUS_FUNCS - 执行流程:核心命令遍历已启用的模块,通过存储的函数指针调用相应功能
每个模块必须遵循以下结构:
#!/bin/zsh
# Forgexx 模块描述
# 注册模块
module_register "modulename" \
"人类可读的描述" \
"modulename_backup" \
"modulename_restore" \
"modulename_status"
# 备份函数:系统 -> 仓库
modulename_backup() {
local repo_dir=$1
# 实现代码
}
# 恢复函数:仓库 -> 系统
modulename_restore() {
local repo_dir=$1
# 实现代码
}
# 状态函数:显示当前状态
modulename_status() {
local repo_dir=$1
# 实现代码
}位于 lib/core/ 目录:
- base.sh:模块注册系统、文件操作工具函数(
backup_file、restore_file、safe_symlink)、命令检查 - config.sh:使用环境变量进行配置管理,支持
FORGEXX_CONFIG_DIR,通过FORGEXX_{MODULE}_{KEY}模式配置模块 - commands.sh:主命令处理器(init、backup、restore、status、pull、push、add、remove、modules)
- git.sh:本地仓库的 Git 操作封装
- logger.sh:彩色日志工具,包含日志级别(DEBUG=0、INFO=1、SUCCESS=2、WARNING=3、ERROR=4)
bin/forgexx 是主可执行文件:
- 加载核心库(logger 最先加载!)
- 加载 base 模块
- 加载所有功能模块
- 解析命令并分发到
commands.sh中的相应处理器
~/.forgexx/ # FORGEXX_CONFIG_DIR(可配置)
├── config # Zsh 配置文件(GITHUB_REPO、ENABLED_MODULES 等)
└── home/ # FORGEXX_REPO_DIR(本地 Git 仓库)
├── .git/
├── homebrew/ # brew bundle dump 生成的 Brewfile
├── dotfiles/ # 配置文件的直接副本
├── vscode/ # settings.json、extensions.txt、snippets/
├── npm/ # 全局 npm 包列表
├── git/ # .gitconfig、.gitignore_global
├── ssh/ # config、*.pub 公钥(不含私钥)
├── iterm2/ # com.googlecode.iterm2.plist
├── tmux/ # .tmux.conf 配置文件
├── vim/ # .vimrc 配置文件
└── zsh/ # .zshrc 配置文件
# 添加到 PATH 用于开发
export PATH="$PATH:/Users/woosleyxu/code/forgexx/bin"
# 直接运行
./bin/forgexx <command>
# 测试帮助命令
forgexx help- 创建
lib/modules/yourmodule.sh - 遵循上述模块实现模式
- 在
bin/forgexx中加载该模块(在其他模块之后) - 通过
forgexx add yourmodule即可启用
用户可以通过环境变量配置模块,遵循 FORGEXX_{MODULE}_{KEY} 模式:
# 在 ~/.forgexx/config 或环境变量中
export FORGEXX_DOTFILES=".zshrc .vimrc"
export FORGEXX_DOTDIRS=".config/nvim .config/alacritty"模块中通过 config.sh 的 module_config_get 和 module_config_set 访问。
Vim 模块提供了完整的配置和插件管理功能:
- 备份:只备份
~/.vimrc配置文件到仓库的vim/目录 - 还原:
- 自动检查并安装 Vundle (Vim plugin manager) 到
~/.vim/bundle/Vundle.vim(如果尚未安装) - 还原
.vimrc配置文件(如果存在同名文件,先备份为.vimrc.bak) - 使用 Vundle 的
PluginInstall命令自动安装配置的插件(运行vim +PluginInstall +qall)
- 自动检查并安装 Vundle (Vim plugin manager) 到
- Vundle 安装路径:
~/.vim/bundle/Vundle.vim - Vundle 仓库:
https://github.com/VundleVim/Vundle.vim.git
注意:在 dotfiles 模块的默认配置中已移除 .vimrc,以避免与 vim 模块冲突。
Tmux 模块提供了完整的配置和插件管理功能:
- 备份:只备份
~/.tmux.conf配置文件到仓库的tmux/目录 - 还原:
- 自动检查并安装 TPM (Tmux Plugin Manager) 到
~/.tmux/plugins/tpm(如果尚未安装) - 还原
.tmux.conf配置文件(如果存在同名文件,先备份为.tmux.conf.bak) - 使用 TPM 的
install_plugins脚本自动安装配置的插件
- 自动检查并安装 TPM (Tmux Plugin Manager) 到
- TPM 安装路径:
~/.tmux/plugins/tpm - TPM 仓库:
https://github.com/tmux-plugins/tpm
注意:在 dotfiles 模块的默认配置中已移除 .tmux.conf,以避免与 tmux 模块冲突。
Zsh 模块提供了完整的配置和插件管理功能:
- 备份:只备份
~/.zshrc配置文件到仓库的zsh/目录 - 还原:
- 自动检查并安装 oh-my-zsh 到
~/.oh-my-zsh(如果尚未安装) - 自动检查并安装 zplug (Zsh plugin manager) 到
~/.zplug(如果尚未安装) - 还原
.zshrc配置文件(如果存在同名文件,先备份为.zshrc.bak) - 使用 zplug 的
install命令自动安装配置的插件
- 自动检查并安装 oh-my-zsh 到
- oh-my-zsh 安装路径:
~/.oh-my-zsh - oh-my-zsh 仓库:
https://github.com/ohmyzsh/ohmyzsh.git - zplug 安装路径:
~/.zplug - zplug 仓库:
https://github.com/zplug/zplug.git
注意:在 dotfiles 模块的默认配置中已移除 .zshrc,以避免与 zsh 模块冲突。
- Dotfiles:使用
cp -RL(跟随符号链接)直接复制,不创建符号链接 - 备份:恢复前,现有文件会被备份为
$file.bak - 安全:SSH 模块只备份
*.pub公钥文件,绝不处理私钥
${0:a:h}- 获取脚本目录(绝对路径的 dirname)${(P)var}- 间接引用(获取变量名为 $var 的变量的值)${=VAR}- 按空格分割变量为数组${array[@]}- 数组展开${var^^}- 转大写(bash 风格,zsh 中也支持)
- 主脚本中使用
set -e- 任何错误时退出 - 模块成功返回 0,失败返回非零值
- 操作前使用
command_exists()检查必需工具
- 本地仓库:
~/.forgexx/home是一个 Git 仓库 - 初始化:创建仓库,从
GITHUB_REPO变量添加远程仓库 - 备份:模块写入文件到仓库,执行
git add+git commit(可自定义提交信息) - 推送/拉取:对远程仓库执行标准 git 操作
- 自动推送:如果设置
FORGEXX_AUTO_PUSH=true,备份后自动推送
目前没有正式的测试套件。测试变更的方法:
- 修改
lib/或bin/中的代码 - 直接运行命令:
forgexx <command> - 检查
~/.forgexx/home/中生成的文件 - 使用
forgexx status验证模块状态
| 变量 | 默认值 | 用途 |
|---|---|---|
FORGEXX_CONFIG_DIR |
~/.forgexx |
配置目录 |
FORGEXX_CONFIG_FILE |
$FORGEXX_CONFIG_DIR/config |
配置文件路径 |
FORGEXX_REPO_DIR |
$FORGEXX_CONFIG_DIR/home |
本地 Git 仓库 |
FORGEXX_AUTO_PUSH |
false |
备份后自动推送 |
FORGEXX_COMMIT_MSG |
默认模板 | Git 提交信息 |
FORGEXX_LOG_LEVEL |
1 (INFO) |
日志详细程度(0-5) |
lib/modules/ 中的当前模块:
- homebrew.sh:通过
brew bundle dump生成 Brewfile - dotfiles.sh:直接文件复制,可通过
FORGEXX_DOTFILES和FORGEXX_DOTDIRS自定义 - vscode.sh:从
~/Library/Application Support/Code/User/备份settings.json、extensions.txt - npm.sh:
npm list -g --depth=0的输出 - git.sh:
.gitconfig、.gitignore_global - ssh.sh:
.ssh/config和*.pub公钥(安全注意:绝不备份私钥) - iterm2.sh:
~/Library/Preferences/com.googlecode.iterm2.plist - tmux.sh:
.tmux.conf配置文件和 TPM (Tmux Plugin Manager) 插件管理 - vim.sh:
.vimrc配置文件和 Vundle 插件管理 - zsh.sh:
.zshrc配置文件和 zplug 插件管理(依赖 oh-my-zsh)