name: dyad:pr-push description: 提交任何未提交的更改,运行lint检查,修复任何问题,并推送当前分支。
PR 推送
提交任何未提交的更改,运行lint检查,修复任何问题,并推送当前分支。
重要: 此技能必须自主完成所有步骤。在任何步骤都不要询问用户确认。不要中途停止。在技能结束时,你必须推送到GitHub。
任务跟踪
你必须使用TaskCreate和TaskUpdate工具来跟踪进度。 开始时,为以下每个步骤创建任务。当你开始一个步骤时,将其标记为in_progress,完成时标记为completed。这确保你完成所有步骤。
指令
-
确保你不在主分支上:
运行
git branch --show-current来检查当前分支。关键: 你绝不能直接推送到主分支。如果你在
main或master上:- 基于未提交的更改生成一个描述性分支名称(例如,
fix-login-validation、add-user-settings-page) - 创建并切换到新分支:
git checkout -b <branch-name> - 报告你创建了一个新分支
如果你已经在一个功能分支上,继续下一步。
- 基于未提交的更改生成一个描述性分支名称(例如,
-
检查未提交的更改:
运行
git status来检查任何未提交的更改(已暂存、未暂存或未跟踪的文件)。如果有未提交的更改:
- 如有疑问,使用
git add添加文件。 假设更改/未跟踪的文件与当前工作相关,除非它们明显无关(例如,与当前更改无连接的完全不同功能区域)。 - 仅排除明显是秘密或不应提交的工件文件(例如,
.env、.env.*、credentials.*、*.secret、*.key、*.pem、.DS_Store、node_modules/、*.log)。 - 不要暂存
package-lock.json除非package.json也已修改。 如果没有对应的package.json更改,package-lock.json的更改是虚假差异(例如,从本地运行npm install产生),应该被排除。如果package-lock.json脏但package.json干净,运行git checkout -- package-lock.json来丢弃更改。 - 用描述性提交消息总结更改来暂存和提交所有相关文件。
- 跟踪你忽略的任何文件,以便在最后报告。
如果没有未提交的更改,继续下一步。
- 如有疑问,使用
-
运行lint检查:
运行这些命令以确保代码通过所有预提交检查:
npm run fmt && npm run lint:fix && npm run ts如果有无法自动修复的错误,读取受影响文件并手动修复,然后重新运行检查直到通过。
重要: 不要停止在lint通过后。你必须继续到第4步。
-
运行测试:
运行测试套件以确保没有破坏:
npm test如果有任何测试失败,修复它们再继续。不要跳过失败的测试。
重要: 不要停止在测试通过后。你必须继续到第5步。
-
如果lint做了更改,修正最后一次提交:
如果lint检查做了任何更改,暂存并将它们修正到最后一次提交中:
git add -A git commit --amend --no-edit重要: 不要停止在这里。你必须继续到第6步。
-
推送分支(必需):
你必须将分支推送到GitHub。不要跳过此步骤或询问确认。
关键: 你绝不能从分叉仓库运行
git pull --rebase(或任何git pull)。如果需要拉取/变基,只从上游仓库(dyad-sh/dyad)拉取。从分叉拉取可能会覆盖本地更改或引入分叉历史中的意外提交。首先,确定正确的远程推送:
a. 检查分支是否已经跟踪一个远程:
git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null如果成功(例如,返回
origin/my-branch或someuser/my-branch),分支已经有上游。只需推送:git push --force-with-leaseb. 如果没有上游,检查是否已存在PR并确定它是从哪个远程打开的:
首先,获取PR的头仓库为
owner/repo:gh pr view --json headRepository --jq .headRepository.nameWithOwner错误处理: 如果
gh pr view以非零状态退出,检查错误是否表示“未找到PR”(预期——继续到步骤c)或其他失败(认证、网络、模糊分支——报告错误并停止而不是静默回退)。如果PR存在,找到与那个
owner/repo对应的本地远程。列出所有远程并从每个URL中提取owner/repo部分:git remote -v对于每个远程URL,通过去除协议/主机名前缀和
.git后缀来提取owner/repo。这处理所有URL格式:- SSH:
git@github.com:owner/repo.git→owner/repo - HTTPS:
https://github.com/owner/repo.git→owner/repo - 令牌认证:
https://x-access-token:...@github.com/owner/repo.git→owner/repo
将PR的
owner/repo与每个远程提取的owner/repo匹配。如果多个远程匹配(例如,同一仓库的SSH和HTTPS URL),优先第一个匹配。如果没有远程匹配(例如,分叉未在本地配置),继续到步骤c。推送到匹配的远程:
git push --force-with-lease -u <matched-remote> HEADc. 如果不存在PR(或未找到匹配远程)且没有上游,回退到
origin。如果推送到origin因权限错误失败,尝试推送到upstream代替(根据项目在CLAUDE.md中的git工作流)。报告使用了哪个远程。git push --force-with-lease -u origin HEAD注意:使用
--force-with-lease是因为提交可能已被修正。它比--force更安全,因为如果其他人已经推送到分支,它会失败。 - SSH:
-
创建或更新PR(必需):
关键: 不要告诉用户访问URL来创建PR。你必须自动创建它。
首先,检查此分支是否已存在PR:
gh pr view --json number,url如果PR已存在,跳过PR创建(推送已经更新了它)。
如果不存在PR,使用
gh pr create创建一个:gh pr create --title "<描述性标题>" --body "$(cat <<'EOF' ## 摘要 <1-3个要点总结更改> ## 测试计划 <如何测试这些更改> 🤖 由 [Claude Code](https://claude.com/claude-code) 生成 EOF )"使用提交消息和更改的文件来写一个好的标题和摘要。
-
移除review-issue标签:
推送后,如果存在
needs-human:review-issue标签,移除它(此标签表示问题在工作开始前需要人工审查,现在已完成):gh pr edit --remove-label "needs-human:review-issue" 2>/dev/null || true -
记住学习(初始推送后):
运行
/remember-learnings技能来捕获此会话中的任何错误、障碍或见解到AGENTS.md或rules/文件中。如果任何文件被此技能修改(用
git status检查):- 暂存修改的文件:
git add AGENTS.md rules/ - 为学习创建一个新提交:
git commit -m "docs: record session learnings" - 推送学习提交:
git push
重要: 不要修正前一个提交。为学习创建一个单独的提交,以便主要工作在推送前已经完成。
- 暂存修改的文件:
-
总结结果:
- 报告是否创建了新功能分支(及其名称)
- 报告在第2步中提交的任何未提交更改
- 报告任何被忽略且未提交的文件(如果有),解释为什么它们被跳过
- 报告任何应用的lint修复
- 确认测试通过
- 确认分支已推送
- 报告添加到
AGENTS.md或rules/的任何学习(以及是否进行了后续推送) - 包括PR URL(无论是新创建还是已存在)