005 / 024 · 开发 · v0.17.1 · MIT
sync
sync 只做一件事:把本地和远端的差异摊开给你看,并且只执行其中绝对安全的那部分。它 fetch 并 prune 掉远端已删除的引用,把基线分支快进到最新,然后把每一个需要你做决定的分支列出来。
- 参数
都是可选的。
[--base=<branch>][--all]
- 什么时候触发
这些是 CI 用来评测这个技能的 prompt,每次发布都会跑。
会触发
- Pull the latest changes.
- 更新一下代码,跟 main 对齐
- Get me up to date with the remote.
不触发
- Ship this branch.
- Delete the branches that already merged.
- 把这些改动提上去合了
它只做快进
基线分支只有在能快进的时候才动。不能快进,说明本地那条分支上有远端没有的提交,它就如实报告分叉状态然后停下。
理由是接下来的三个选择——rebase、merge、reset——都可能丢掉工作,而判断该不该丢是人的决定,不是同步工具的。所以它连一个「自动 rebase」的开关都没有:一次没被要求就执行的 rebase,和丢失工作在结果上无法区分。
同一条规则还带来两个更小的拒绝。标签只 fetch、从不 prune,因为 --prune-tags 会删掉所有远端没有的本地标签,包括你五分钟前手工打的那个,而一个标签有时是某个提交唯一的可达路径。工作树脏导致快进被拒时,它报告是哪些文件挡住的,而不是替你 stash。
先报告,再写入
开头那份报告的每一行都来自一条不写任何东西的命令:工作树状态、当前分支相对上游领先或落后多少、基线落后多少、prune 之后哪些分支失去了上游、有哪些 worktree。
Sync <repo> → <base>
working tree clean
current branch feat/x ahead 2, behind 0
base main behind 7
gone upstream none
worktrees 3没有任何命令能填的字段会报为 unknown。不估算,也不悄悄省略。
你的分支处在什么状态
基线分支会被快进。当前的功能分支不动,只拿到一句状态说明:
| 状态 | 报告 |
|---|---|
| 没有上游 | 用 -u 推一次来建立上游 |
| 只领先 | 有未推送的工作 |
| 只落后 | 准备好了就 rebase 到基线上 |
| 已分叉 | 领先 N、落后 M,rebase 还是 merge 由你决定 |
| 上游消失 | PR 多半已合并、分支被删;/dev:cleanup 负责清掉它 |
加 --all 时每个本地分支都按同样的方式分类,严格落后的那些会在不 checkout 的情况下被快进。被别的 worktree 占用的分支会跳过并说明原因——那条引用被一棵工作树钉住了,命令本来就会被拒绝。
它不做的事
它不发布改动、不删分支、不解决合并冲突。不 rebase、不 reset、不丢弃任何一个本地提交。所有它拒绝替你决定的事都收在报告最后的 attention 里,把选项列出来,一个都不替你选。
开发 里的其它技能
还有 6 个 · 一次安装ship
/dev:shipship 把一次改动从工作区送到一个已合并的 PR:开分支、跑项目自己的测试、提交、开 PR、等 CI、合并,最后清理 worktree。
cleanup
/dev:cleanup一次改动发布之后,残留会留下来:本地分支、它在远端的副本、当时用的 worktree,有时还有一个只装着被忽略文件的目录。
retitle
/dev:retitle对话列表乱,不是因为名字不好听,是因为名字里没有可排序的信息。
steward
/dev:stewardsync、ship、cleanup 都只管你当下所在的那一个仓库。
reunite
/dev:reunitesessions 解决的是这一幕:你用另一个账号登录,侧边栏突然只剩下寥寥几条。
handoff
/dev:handoffhandoff 让同一台电脑上的 Claude Code 和 Codex 互相看到可读的会话历史。