oma-dotfile是自己用来同步各种coding agent配置的dotfile仓库,只需要一行命令,就可以把同一套规则、模型、skill和通知插件装到OpenCode,oh-my-pi,Codex和Claude Code等agent里。代码发布在GitHub上,项目地址。
背景
为了让agent用起来更适合自己,肯定会对agent的各种东西做一些自定义的改造。比如说,想用自己选的模型,而且有一个自己部署的Gotify[6]通知服务器,希望agent每次执行完之后都可以发一条通知到手机上。
有了这些自定义的东西之后,再加上自己是在多台机器上同时使用agent的,就会发现要把各种agent的配置文件从一台机器抄到另外一台机器,其实非常麻烦。所以就做了这样一个dotfile的工具,可以在新的机器上快速地拉取相关的配置。这样的话,一台机器上有什么更新,其他机器上直接拉一下就可以用了。
一开始只有OpenCode[1]加上oh-my-opencode[2],所以名字叫omo-dotfile。后来又陆续加上了oh-my-pi[3],Codex[4]和Claude Code[5],就改名成了oma-dotfile。
功能

Fig. 1. 安装脚本启动时的banner
目前主要有以下功能:
- 一行命令安装: 在Linux,macOS和Windows上都可以用,只需要Python 3.10以上和Git,不需要安装任何第三方的Python包。
- 多个agent: 支持OpenCode + oh-my-openagent(原oh-my-opencode),OMO Native(oh-my-openagent独立的命令行版本),oh-my-pi(OMP),Codex和Claude Code。默认只给本机上安装了的agent装配置。
- 全局规则: 同一份规则文件
_AGENTS.md会装到每个agent里。OpenCode,Codex,OMP和OMO Native装成各自的AGENTS.md,Claude Code则装成~/.claude/rules/oma-dotfile.md。 - 模型: 默认通过一个OpenAI兼容的第三方网关调用模型,加上
--oauth参数之后,可以换成ChatGPT的官方登录。 - Skills: 9个共用的skill,比如
github-cli,secret-guard,skill-creator等。 - 通知: 每个agent都有一个Gotify的通知插件,标题是
<Agent> :: <项目>@<主机名>,这样一眼就能看出是哪台机器上的哪个项目完成了。也可以配置一个大模型,把这一轮的回复总结成一句话再发出来。 - 统计: 配置WakaTime[7]的插件统计写代码的时间,以及Tokscale[8]的模型别名,统计各个模型的token用量。
使用方法
在Linux或者macOS上:
1 | curl -fsSL https://raw.githubusercontent.com/ControlNet/oma-dotfile/master/pull.py | python3 |
在Windows的PowerShell里:
1 | (Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/ControlNet/oma-dotfile/master/pull.py' -UseBasicParsing).Content | python |
如果要给所有支持的agent都装上配置,可以加上--all参数。被修改的配置文件会先备份成*.bak-<时间>,不需要备份的话可以设置NO_BACKUP=1。
如果想用ChatGPT的官方登录,而不是第三方网关,可以加上--oauth:
1 | curl -fsSL https://raw.githubusercontent.com/ControlNet/oma-dotfile/master/pull.py | python3 - --oauth |
然后在各个agent里分别登录,比如codex login,或者在OMP里用/login openai-codex。之后不加--oauth再运行一次,就会切换回网关。
所有的密钥都是通过环境变量读取的,主要有以下几个:
CODEX_BASE_URL,CODEX_API_TOKEN: 网关的地址和tokenGOTIFY_URL,GOTIFY_TOKEN_FOR_OPENCODE: Gotify的地址和token,其他agent可以用GOTIFY_TOKEN_FOR_CODEX等单独设置GOTIFY_NOTIFY_SUMMARIZER_MODEL,GOTIFY_NOTIFY_SUMMARIZER_ENDPOINT,GOTIFY_NOTIFY_SUMMARIZER_API_KEY: 用来总结通知的模型WAKATIME_API_KEY,WAKATIME_API_URL: WakaTime的key和地址,会写到~/.wakatime.cfg里
这个仓库是自己的配置,规则和模型都是按照自己的习惯来的。如果要用的话,建议先fork一份,改成自己的配置之后再用。
实现
整体架构
Fig. 2. oma-dotfile的整体架构
如上图所示,仓库里放的是所有agent的配置,pull.py运行的时候,先把整个仓库浅克隆到一个临时目录,然后检测本机装了哪些agent,再把对应的配置分别写到各个agent的目录里。规则和skill是所有agent共用的,模型配置和通知插件则是每个agent各有一份,因为每个agent的配置格式和插件的API都不一样。密钥不会写进仓库,只在安装的时候从环境变量里读取,或者让agent自己在运行时读取环境变量。自己的这些密钥是用Infisical[10]统一管理的,再同步到每台机器的环境变量里。
安装脚本
最开始的安装脚本是pull.sh和pull.ps1,里面把要下载的文件一个一个写死了。后来加了插件和skill的文件夹之后,每加一个文件都要改两个脚本,所以就换成了一个只用Python标准库的pull.py,直接git clone --depth 1整个仓库,然后再复制过去。
只用标准库这一点后来也遇到了问题。Codex的配置是TOML,读TOML用的tomllib要Python 3.11才有,而Ubuntu 22.04自带的是Python 3.10,在那些机器上一运行就报错了。因为安装脚本是直接curl下来用系统的Python运行的,没法先装tomli,最后只能写了一个简单的TOML解析作为后备。
另外有两个地方一开始也没有考虑清楚:
- 检测agent: 一开始是看配置目录是否存在,但是只要在这台机器上运行过一次安装脚本,这些目录就都被创建出来了,所以没法用来判断。后来改成了检查可执行文件,包括
~/.bun/bin,~/.local/bin和nvm这些不一定在PATH里的位置。 - 哪些文件归安装脚本管: 比如OpenCode的插件和skill文件夹里,除了这个仓库装的,也可能有自己另外装的。所以只替换这个仓库管理的那几项,其他的保持不变。像OMO Native的
settings.json这种运行时会被修改的文件,则是合并而不是覆盖。
规则
_AGENTS.md里放的是自己对agent的一些要求,比如:
- 不允许在代码、日志和文档里写入任何密钥
- 不允许使用
git clean - 删除、覆盖、迁移和force push之前要先提醒
- Python项目要用pixi或者conda管理环境,不能装到系统的Python里
- 不允许用任何dummy的占位符来代替真实的实现
- 有价值的知识要保存到
.omo/knowledges/*.md里
同一份规则要给5个agent用,规则里就只能写所有agent都能理解的东西。之前有两条规则是按oh-my-opencode的写法写的,比如用load_skills=["skill-name"]去委派任务,这是oh-my-opencode特有的写法,在别的agent里是没有意义的,后来就删掉了。
还有一个问题是,不少agent默认会去读其他agent的配置。比如OMO Native默认会读取~/.claude/rules,OpenCode也会兼容Claude Code的配置,这样同一份规则可能会被注入好几次。所以安装脚本会把OMO里这些兼容的功能关掉,OpenCode也建议设置OPENCODE_DISABLE_CLAUDE_CODE=1,让每个agent只读自己目录里的那一份。装到Claude Code的时候,也是放到rules/里,不去覆盖CLAUDE.md,这样不会影响自己原有的设置。
模型的高低搭配
用哪个模型和当时的性价比、订阅都有关系,一直在变。比如2月份的时候GPT的性价比更高,而且有Codex的订阅,后来从GPT-5.x一直换到GPT-6.1,现在也会用Opus 5.5。
这里说一下不同agent之间的高低搭配。以oh-my-openagent为例,现在的配置是这样的:
| agent | 作用 | 模型 | 推理强度 |
|---|---|---|---|
| Sisyphus / Hephaestus | 主agent,负责规划和实现 | GPT-6.1 Sol | high |
| Oracle | 咨询和审查 | GPT-6.1 Sol | xhigh |
| Momus | 审查计划 | GPT-6.1 Sol | max |
| Explore | 搜索代码库 | GPT-6 Luna | xhigh |
| Librarian | 查文档和资料 | GPT-6 Luna | xhigh |
搜索代码和查文档这种量大但是不太难的工作,交给便宜的小模型,主agent用主力的模型,而负责审查和最后把关的agent则用最强的模型和最高的推理强度。如果全部都用最强的模型,价格就太高了。关于各家agent和模型怎么选,之前在一次分享里也讲过,slides放在这里。
通知
通知插件是按照各个agent自己的语言来写的,OpenCode和OMP是JavaScript,Codex和Claude Code是Python。
通知这部分是维护得最多的地方,在全部206个commit里面,大约有四分之一都和通知有关。问题出在agent发出的完成事件并不等于任务做完了。每个agent都会在一些自己看不到的地方触发完成的事件,比如:
- Codex在后台自动生成会话标题和对话回顾
- Codex自动审批的那一轮
/goal模式下自动继续的中间轮次- 子agent的结束
- Claude Code的
Stop事件
这些都会发出一条通知,结果手机上一下子收到好几条没有意义的消息。所以只能一个一个地找出来,然后过滤掉。
项目记忆
中间还试过Beads[9],想用一个项目级的数据库来管理项目的issue和记忆,加进来又删掉,前后折腾了两次。后来发现没有必要,如果是私人项目,issue完全可以直接用GitHub Issues来管理,而文档和知识的积累,直接放在项目的.omo/knowledges文件夹里,写成Markdown文件就可以了。这个仓库也是这样,agent在里面积累了几十篇笔记,记录了每次调查的结论,后面再改同一个地方的时候就不用重新调查一遍。
AI开发
和MC Matrix Bridge一样,这个项目的代码基本上也是agent写的。这个仓库本身就是agent的配置,所以开发它的agent,用的也是这个仓库装上去的规则、skill和通知。
有的规则是agent出了问题之后才加上的。比如2月的时候,在另一个项目里,一个子agent为了把工作区恢复到干净的状态,直接运行了git clean -fdx,把所有没有被git追踪的文件都删掉了。发现之后,马上就在_AGENTS.md里加上了不允许使用git clean这一条。
10月的时候,还试了一下让一个agent去检查另一个agent写的代码。Claude Code会调用Codex,用GPT-6 Astra以只读的方式检查整个项目。找出来的问题由Claude Code对照代码确认之后,先写测试再修复,一个问题一个commit。这样找到了几个bug,比如Windows的路径写进TOML的时候没有转义,导致Codex的配置文件坏掉,还有按照修改时间清理备份,可能会把刚刚做好的备份删掉。
自己在这里面负责的是决定要做什么,然后在agent做多了或者做错了的时候把它拉回来。比如--oauth具体要怎么切换、切回网关的时候要不要自动恢复,都是自己定下来的。改README的时候,agent经常会加上很多不必要的说明,让它精简之后又删得太多了,最后是让它参考这个仓库早期README的样子来写的。
现在的问题
目前还有两个问题,可以作为后续改进的方向。
- 依赖GitHub Raw: 现在安装脚本是从
raw.githubusercontent.com下载的,配置也是直接从GitHub克隆的,并没有用自己的域名。以后可以换成自己的域名。 - 依赖Python: 现在运行还需要机器上有Python。后续可以考虑换成Rust之类的系统编程语言,编译成一个二进制文件,下载下来就可以直接运行。
总结
本文介绍了oma-dotfile,一个在多台机器上同步各种coding agent配置的dotfile工具。它用一个只依赖Python标准库的脚本,把同一套规则、skill和通知插件装到5个不同的agent里。现在日常的主力是Claude Code,所以最近也把Claude Code的插件和规则的安装加了进来。
参考文献
- [1] "anomalyco/opencode", GitHub, 2026. https://github.com/anomalyco/opencode
- [2] "code-yeongyu/oh-my-openagent (原oh-my-opencode)", GitHub, 2026. https://github.com/code-yeongyu/oh-my-openagent
- [3] "can1357/oh-my-pi", GitHub, 2026. https://github.com/can1357/oh-my-pi
- [4] "openai/codex", GitHub, 2026. https://github.com/openai/codex
- [5] "anthropics/claude-code", GitHub, 2026. https://github.com/anthropics/claude-code
- [6] "gotify/server", GitHub, 2026. https://github.com/gotify/server
- [7] "WakaTime", WakaTime, 2026. https://wakatime.com/
- [8] "junhoyeo/tokscale", GitHub, 2026. https://github.com/junhoyeo/tokscale
- [9] "gastownhall/beads", GitHub, 2026. https://github.com/gastownhall/beads
- [10] "Infisical/infisical", GitHub, 2026. https://github.com/Infisical/infisical