本文件用于约束 Codex 在本仓库中的 Git 操作、提交日志生成、版本发布流程。
本项目是一个在 GitHub 上维护的开源项目,日常开发场景主要包括:
- 优化已有功能
- 修复 bug
- 新增功能
- 更新文档
- 发布新版本
Codex 在执行 Git 相关操作时,必须严格遵守本文件中的规范。
如果希望 Codex 自动读取项目规则,文件名应使用:
AGENTS.md
不要将本文件改名为:
GIT.md
SKILL.md
AGENT.md
agents.md
如果项目中已经存在 AGENTS.md,不要新建第二个同名文件,也不要直接覆盖原文件。应该把本文件中的 Git 规范、提交流程、发布流程合并到已有 AGENTS.md 中。
如果仓库里已经有其他 AGENTS.md,优先按以下方式处理:
- 根目录已有
AGENTS.md:把本文件内容合并进去,建议放在Git 工作流规范章节。 - 子目录已有
AGENTS.md:子目录规则只用于该子目录相关任务,根目录仍应保留全局 Git 规范。 - 如果已有
AGENTS.md中的规则和本文件冲突,以更具体的规则为准;如果都是全局规则,以用户最新明确要求为准。 - 不要因为新增 Git 规范而删除已有项目规则、构建规则、测试规则或代码风格规则。
推荐在根目录 AGENTS.md 中使用以下结构:
# AGENTS.md
## 项目说明
## 开发规范
## 测试规范
## Git 工作流规范
## 发布流程规范
本文件主要提供:
Git 工作流规范
发布流程规范
以下内容必须先展示给用户,并等待用户明确确认后才能继续执行:
- commit 提交日志
git addgit commitgit push- release 分支创建或切换
- tag 创建
- GitHub Release 标题
- GitHub Release 内容
- GitHub Release 创建
- 合并 release 分支到 main
用户没有明确确认之前,不允许直接执行提交、推送、打 tag、创建 GitHub Release。
除非用户明确要求,否则禁止执行以下命令:
git reset --hard
git push --force
git clean -fd
git branch -D
git push origin --delete尤其注意:发布完成后不要删除 release 分支。
分支名称统一使用:
类型-简短描述
类型和描述之间使用 - 分隔,不使用 /。
feature-xxx 新功能开发
fix-xxx 普通问题修复
hotfix-xxx 紧急问题修复
release-x.x.x 版本发布分支
docs-xxx 文档修改
refactor-xxx 代码重构
chore-xxx 构建、配置、依赖等调整
perf-xxx 性能优化
推荐:
feature-ui-query
feature-screenshot-api
fix-click-position
fix-rootless-install
hotfix-launch-crash
release-1.1.0
docs-update-readme
refactor-element-parser
chore-update-makefile
perf-optimize-screenshot
不推荐:
feature/ui-query
release/v1.1.0
release-v1.1.0
fix_click_position
Feature-Login
我的分支
update
main 分支代表当前最新稳定版本。
发布完成后,release 分支必须合并回 main,保证 main 始终对应最新正式发布版本。
提交日志统一使用:
类型: 提交说明
提交说明使用中文,要求简洁、明确。
feat 新功能
fix 修复问题
docs 文档修改
refactor 代码重构
style 代码格式调整,不影响逻辑
test 测试相关
chore 构建、配置、依赖、脚本等杂项
perf 性能优化
revert 回退提交
release 版本发布
feat: 添加 UI 元素查询接口
feat: 添加截图接口
fix: 修复点击坐标偏移问题
fix: 修复 rootless 环境安装失败问题
docs: 更新 README 安装说明
refactor: 重构 AXRuntime 元素解析逻辑
chore: 调整 Makefile 打包配置
perf: 优化截图响应速度
release: 发布 v1.1.0
update
fix bug
提交代码
修改了一些东西
优化
修复
当用户输入以下任意内容时,进入“提交代码到仓库”流程:
提交代码
提交代码到仓库
提交并推送
git 提交代码到仓库
生成提交日志
必须先执行:
git status
git diff --stat
git diff如果有未跟踪文件,也需要在总结中说明。
根据当前未提交代码,总结本次改动。
输出格式:
本次改动摘要:
1. xxx
2. xxx
3. xxx
根据代码改动自动生成一条符合规范的提交日志。
例如:
fix: 修复点击坐标偏移问题
如果本次改动包含多个方向,优先判断主要目的。
判断规则:
新增功能 -> feat
修复 bug -> fix
文档修改 -> docs
代码重构 -> refactor
构建配置调整 -> chore
性能优化 -> perf
版本发布 -> release
在执行任何提交命令之前,必须展示以下内容:
本次改动摘要:
1. xxx
2. xxx
3. xxx
建议提交日志:
fix: 修复点击坐标偏移问题
准备执行:
git add .
git commit -m "fix: 修复点击坐标偏移问题"
git push
是否确认提交并推送?
只有用户明确回复确认后,才能继续执行。
用户确认后执行:
git add .
git commit -m "用户确认后的提交日志"
git push如果当前分支没有关联远程分支,则执行:
git push -u origin 当前分支名当用户输入以下内容时,进入“版本发布”流程:
发布 1.1.0
发布 v1.1.0
发布版本 1.1.0
release 1.1.0
创建 release 1.1.0
如果用户输入:
发布 1.1.0
则识别为:
版本号:1.1.0
release 分支:release-1.1.0
tag:v1.1.0
GitHub Release 标题:项目名 v1.1.0
如果项目名称可以从仓库名或 README 中明确识别,则使用项目名生成 Release 标题。
例如:
iOS MCP v1.1.0
如果项目名称不明确,则在创建 Release 前让用户确认标题。
release 分支统一使用:
release-版本号
示例:
release-1.0.0
release-1.0.1
release-1.1.0
不要使用:
release/v1.1.0
release-v1.1.0
release_1.1.0
tag 统一使用:
v版本号
示例:
v1.0.0
v1.0.1
v1.1.0
GitHub Release 标题使用:
项目名 v版本号
例如:
iOS MCP v1.1.0
发布前必须执行:
git status
git branch --show-current
git fetch --all --tags如果存在未提交代码,必须停止发布流程,并提示用户先提交或处理当前改动。
如果 git fetch --all --tags 因网络、DNS、GitHub 连接、认证或沙箱权限失败,必须按以下规则处理:
- 可以重试一次相同命令。
- 如果是沙箱网络或
.git写入权限导致失败,可以用提权方式重试。 - 如果重试后仍失败,必须停止发布流程。
- 停止时要明确说明当前本地状态、失败命令、失败原因,以及恢复发布时应继续执行的下一条命令。
- 远端同步没有成功前,不允许继续创建 tag、推送 tag、创建 GitHub Release。
根据用户输入生成版本信息,并展示给用户:
准备发布版本:1.1.0
release 分支:
release-1.1.0
tag:
v1.1.0
GitHub Release 标题:
iOS MCP v1.1.0
执行:
git tag --list "v1.1.0"如果 tag 已存在,必须停止发布流程,并提示用户该版本已经存在,不能重复发布。
先切换到 main 并拉取最新代码:
git switch main
git pull检查 release 分支是否存在:
git branch --list "release-1.1.0"
git branch -r | grep "origin/release-1.1.0"如果本地和远程都不存在,则从 main 创建 release 分支:
git switch -c release-1.1.0如果远程已经存在,则切换到已有 release 分支:
git switch release-1.1.0
git pull根据项目实际情况,检查可能包含版本号的文件,例如:
README.md
control
package.json
Info.plist
Makefile
其他项目配置文件
如果发现需要更新版本号,必须先展示修改计划,等待用户确认后再修改。
如果没有需要修改的版本号文件,则不要强行修改。
创建 GitHub Release 前必须构建并检查三种正式包:
printf "1\n1\n" | ./build.sh
printf "2\n1\n" | ./build.sh
printf "3\n1\n" | ./build.sh构建完成后必须检查以下文件存在:
rootful:packages/com.witchan.ios-mcp_版本号_iphoneos-arm.deb
rootless:packages/com.witchan.ios-mcp_版本号_iphoneos-arm64.deb
roothide:packages/com.witchan.ios-mcp_版本号_iphoneos-arm64e.deb
如果任一文件不存在,必须停止发布流程,提示用户先构建正式包。不要上传旧版本包、debug 包、带错误版本号的包,或只上传部分 assets。
Release assets 内容必须按以下格式写入 GitHub Release:
## Release assets
rootful: com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
rootless: com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
roothide: com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb根据上一个 tag 到当前版本之间的提交记录生成版本说明。
先查找最近 tag:
git tag --sort=-v:refname查看提交记录:
git log 上一个tag..HEAD --oneline生成 Release 内容时,必须默认使用中英文双语格式:
## 更新内容 / What's New
### 中文
- xxx
- xxx
### English
- xxx
- xxx
## 修复问题 / Fixes
### 中文
- xxx
- xxx
### English
- xxx
- xxx
## Release assets
rootful: com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
rootless: com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
roothide: com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb默认不要添加 说明 / Notes 部分。只有用户明确要求时,才可以增加说明部分。
如果本次版本主要是 bug 修复,内容仍然使用中英文双语格式,但重点放在:
## 修复问题 / Fixes如果本次版本主要是功能优化,内容仍然使用中英文双语格式,但重点放在:
## 更新内容 / What's NewRelease 内容不得只写中文,也不得只写英文。
创建 GitHub Release 之前,必须展示完整 Release 内容。
输出格式:
准备发布版本:1.1.0
release 分支:
release-1.1.0
tag:
v1.1.0
GitHub Release 标题:
iOS MCP v1.1.0
Release 内容:
## 更新内容 / What's New
### 中文
- xxx
- xxx
### English
- xxx
- xxx
## 修复问题 / Fixes
### 中文
- xxx
### English
- xxx
## Release assets
rootful: com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
rootless: com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
roothide: com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb
Release assets:
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb
准备执行的操作:
1. 创建或切换 release-1.1.0 分支
2. 检查并更新版本号
3. 提交 release 改动
4. 推送 release 分支
5. 合并 release-1.1.0 到 main
6. 在 main 上创建 tag v1.1.0
7. 推送 main
8. 推送 tag
9. 构建并检查三种正式包
10. 通过 GitHub REST API 创建/更新 GitHub Release
11. 上传三个 Release assets
是否确认发布?
只有用户明确确认后,才能继续执行。
如果有版本号文件或发布相关文件被修改,执行:
git add .
git commit -m "release: 发布 v1.1.0"如果没有文件修改,则不要强行创建 commit。
git push -u origin release-1.1.0如果推送失败,必须按以下规则处理:
- 可以重试一次相同命令。
- 如果是网络或沙箱问题,可以用提权方式重试。
- 如果仍然失败,必须停止后续流程,不允许继续合并 main、创建 tag 或创建 GitHub Release。
- 停止时要说明当前分支、当前提交、是否已本地提交、远端是否已更新,以及恢复时应该执行的下一条命令。
发布版本时,release 分支确认完成后,必须合并回 main。
执行前再次展示:
准备将 release-1.1.0 合并到 main:
git switch main
git pull
git merge --no-ff release-1.1.0 -m "release: 合并 v1.1.0 到 main"
git push origin main
是否确认合并到 main?
用户确认后执行:
git switch main
git pull
git merge --no-ff release-1.1.0 -m "release: 合并 v1.1.0 到 main"
git push origin main如果 git push origin main 失败,必须停止后续 tag 和 GitHub Release 流程。只有 main 成功推送到远端后,才能继续创建 tag。
合并到 main 后,在 main 分支上创建 tag:
git tag -a v1.1.0 -m "release: 发布 v1.1.0"推送 tag:
git push origin v1.1.0如果 tag 推送失败,必须停止 GitHub Release 创建流程。只有 tag 成功推送到远端后,才能创建 GitHub Release。
printf "1\n1\n" | ./build.sh
printf "2\n1\n" | ./build.sh
printf "3\n1\n" | ./build.sh
ls -l packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
ls -l packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
ls -l packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb本项目创建 GitHub Release 时,优先使用 GitHub REST API,不默认依赖 gh 命令。
GitHub REST API 规则:
- 使用
git credential fill从本地 Git 凭据中读取 GitHub token。 - 不允许在日志、终端输出或最终回复中打印 token。
- 如果无法读取 GitHub token,必须停止并提示用户配置 GitHub 凭据。
- 先通过
GET /repos/witchan/ios-mcp/releases/tags/v1.1.0检查 Release 是否存在。 - 如果 Release 不存在,使用
POST /repos/witchan/ios-mcp/releases创建。 - 如果 Release 已存在,使用
PATCH /repos/witchan/ios-mcp/releases/{release_id}更新标题和内容。 - 上传 assets 前检查同名 asset 是否存在。
- 如果同名 asset 已存在,必须在用户确认过“覆盖/更新 assets”的前提下,先删除旧 asset,再上传新 asset。
- 上传以下三个 assets:
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb
创建/更新完成后,必须输出 GitHub Release URL 和三个 assets 的下载链接。
不要在没有用户确认 Release 内容的情况下创建 GitHub Release。
发布完成后,必须保留 release 分支。
例如发布 1.1.0 后,需要保留:
release-1.1.0
v1.1.0
GitHub Release:iOS MCP v1.1.0
禁止自动执行:
git branch -d release-1.1.0
git branch -D release-1.1.0
git push origin --delete release-1.1.0除非用户明确说“删除 release 分支”,否则不能删除任何 release 分支。
发布完成后,输出:
发布完成:
版本:1.1.0
release 分支:release-1.1.0
tag:v1.1.0
GitHub Release:iOS MCP v1.1.0
main 分支:已同步到 v1.1.0
release 分支:已保留
Release assets:
rootful:com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
rootless:com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
roothide:com.witchan.ios-mcp_1.1.0_iphoneos-arm64e.deb
本章节用于判断提交日志类型和 Release 内容归类。正式 GitHub Release 仍必须遵守第七步的中英文双语格式,并包含 Release assets。
如果用户说:
优化截图功能,发布 1.1.0
提交日志优先使用:
perf: 优化截图功能
如果只是体验优化,不涉及性能,也可以使用:
feat: 优化截图功能
Release 内容优先放到:
## 优化内容
- 优化截图功能如果用户说:
修复点击坐标偏移问题,发布 1.1.1
提交日志优先使用:
fix: 修复点击坐标偏移问题
Release 内容优先放到:
## 修复问题
- 修复点击坐标偏移问题如果用户说:
添加截图接口,发布 1.2.0
提交日志优先使用:
feat: 添加截图接口
Release 内容优先放到:
## 更新内容
- 添加截图接口如果只是更新 README、安装说明、使用说明,提交日志使用:
docs: 更新 README 使用说明
当用户输入以下任意内容时,进入“BigBoss 上架 / 更新”流程:
发布到bigboss
发布到 BigBoss
上架到bigboss
上架到 BigBoss
提交到bigboss
提交到 BigBoss
更新bigboss
更新 BigBoss
BigBoss 是第三方仓库,提交后会进入 BigBoss 审核流程。该操作属于对外可见提交,必须先让用户确认。
本项目 BigBoss 更新表单脚本固定使用:
脚本:scripts/submit_bigboss_update.py
默认 Package Name:iOS MCP
Your Name:witchan
Email:witchan028@126.com
脚本运行时只传入:
版本号
Changes Made(必须中英文双语)
deb 路径
rootful 和 rootless 提交到 BigBoss 时,BigBoss 表单 Package Name 使用默认值:
iOS MCP
BigBoss 更新流程只提交 rootful 和 rootless 包,不提交 roothide 包,也不为 BigBoss 临时生成 com.witchan.ios-mcp-roothide 包。
BigBoss 的 Changes Made 默认必须使用简短中英文双语,不要写成长篇 Release notes。必须先中文、再英文。推荐格式:
中文:xxx。
EN: xxx.
如果用户只提供中文或英文,必须先补齐另一种语言,并在提交前展示给用户确认。
触发 BigBoss 流程后,必须先让用户确认以下内容:
准备提交到 BigBoss:
版本号: 1.1.0
Changes Made: 中文:xxx。 EN: xxx.
rootful deb: packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb
rootless deb: packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb
准备执行:
提交 BigBoss 表单:
python3 scripts/submit_bigboss_update.py \
--version 1.1.0 \
--changes "中文:xxx。
EN: xxx." \
--response-out .codex-session-data/bigboss_update_1.1.0_rootful_response.html \
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm.deb \
--submit
python3 scripts/submit_bigboss_update.py \
--version 1.1.0 \
--changes "中文:xxx。
EN: xxx." \
--response-out .codex-session-data/bigboss_update_1.1.0_rootless_response.html \
packages/com.witchan.ios-mcp_1.1.0_iphoneos-arm64.deb \
--submit是否确认提交到 BigBoss 审核?
只有用户明确确认后,才能执行提交。
默认提交 BigBoss 支持的两个包:
rootful:packages/com.witchan.ios-mcp_版本号_iphoneos-arm.deb
rootless:packages/com.witchan.ios-mcp_版本号_iphoneos-arm64.deb
BigBoss 流程不提交普通 roothide Release 包:
packages/com.witchan.ios-mcp_版本号_iphoneos-arm64e.deb
BigBoss 流程也不提交或生成 roothide 专用包:
packages/com.witchan.ios-mcp-roothide_版本号_iphoneos-arm64e.deb
用户确认后,执行前必须检查:
git status --short --branch
ls -l packages/com.witchan.ios-mcp_版本号_iphoneos-arm.deb
ls -l packages/com.witchan.ios-mcp_版本号_iphoneos-arm64.deb
git diff -- control
python3 scripts/submit_bigboss_update.py --help如果 rootful 或 rootless deb 不存在,必须停止并提示用户先构建正式包。
不允许提交旧版本或错误路径的包。
如果 git diff -- control 显示有未确认的包名或版本改动,必须先让用户确认如何处理后再提交 BigBoss。
确认无误后,依次提交:
python3 scripts/submit_bigboss_update.py \
--version 版本号 \
--changes "用户确认后的中英文双语 Changes Made" \
--response-out .codex-session-data/bigboss_update_版本号_rootful_response.html \
packages/com.witchan.ios-mcp_版本号_iphoneos-arm.deb \
--submit
python3 scripts/submit_bigboss_update.py \
--version 版本号 \
--changes "用户确认后的中英文双语 Changes Made" \
--response-out .codex-session-data/bigboss_update_版本号_rootless_response.html \
packages/com.witchan.ios-mcp_版本号_iphoneos-arm64.deb \
--submit如果前面的提交已成功、后面的提交失败,必须明确告诉用户 BigBoss 可能已经收到哪些包,当前处于部分提交状态。不要自动重复提交成功的包,除非用户明确确认重试。
提交完成后输出:
BigBoss 提交完成:
版本:1.1.0
rootful:已提交
rootless:已提交
审核状态:等待 BigBoss 审核
响应记录:
.codex-session-data/bigboss_update_1.1.0_rootful_response.html
.codex-session-data/bigboss_update_1.1.0_rootless_response.html
Codex 必须始终遵守以下要求:
- 如果希望 Codex 自动读取规则,文件名使用
AGENTS.md。 - 如果项目已有
AGENTS.md,把本文件内容合并进去,不要覆盖已有规则。 - 分支名使用
-分隔,不使用/。 - release 分支使用
release-版本号。 - tag 使用
v版本号。 - commit 日志必须先让用户确认。
- Release 内容必须先让用户确认。
- 发布完成后必须合并 release 分支到 main。
- 发布完成后必须保留 release 分支。
- 未经用户确认,不允许提交、推送、打 tag、创建 GitHub Release。
- 未经用户确认,不允许提交 BigBoss 更新表单。
- GitHub Release 默认使用 GitHub REST API 创建/更新,并上传 rootful、rootless、roothide 三个正式包。
- GitHub Release 内容默认使用中英文双语格式,并包含 Release assets;默认不添加说明部分。
- GitHub 网络或沙箱失败时必须停止危险后续步骤,明确说明本地状态和恢复命令。
- BigBoss 默认只提交 rootful、rootless 两个包;不提交 roothide 包,也不为 BigBoss 生成 roothide 专用包。