009 / 025 · Dev · v0.22.0 · MIT
steward
sync, ship and cleanup each work in the repository you are standing in. steward is the one that runs that loop across every repository you have actually been working in — it finds them, sweeps them, and hands back a single report of what is waiting on you: which branches are ready to merge, which pull requests are blocked and on what, which branches were written and never opened, and which worktrees a live session is still sitting in.
- Arguments
Each optional.
[--roots=<dir,…>][--since=<days>][--occupied-hours=<hours>][--stale=<days>][--only=<sync|cleanup|retitle|report>][--dry-run][--unattended]
- When it fires
The prompts CI scores this skill against, on every release.
Fires on
- 大内总管,把所有项目巡一遍,看看哪些分支该合并了
- Sweep all my repos: sync them, clean up what merged, and tell me what's waiting on me.
- 定时清理本地环境,每天早上跑一遍,提醒我哪些需要 merge
- 扫一下所有 worktree 和 session,把没用的收拾掉
Stays out of
- 清理一下仓库,清掉合并过的分支
- 同步一下,拉一下最新的
- 会话名太乱了,帮我规范对话名称
- Ship this branch and merge it.
- 把这个 PR 合了
It finds the repositories from your sessions, not from your disk
Which repositories are active is not a question git can answer. A repository is active because a session was open in it, so the list comes from where sessions leave traces: Claude Code's transcripts and the sessions running right now, Codex's thread catalogue, and any directories you name with --roots. Each trace resolves to the worktree it sits in, and each worktree to the primary checkout it belongs to, so a repository with a dozen worktrees is swept once rather than a dozen times.
Traces that lead nowhere are counted, not raised: a working directory that no longer exists, a scratch checkout under the system temp directory, a session that ran somewhere that is not a repository. On one machine a fourteen-day window found 15 repositories and 121 worktrees, and set aside 132 vanished directories and 29 sandboxes without stopping.
An occupied worktree is never touched
This is the thing the delegated skills cannot see. A worktree is occupied when a session has a process attached to it right now, or when any session wrote to it within the last day. An occupied worktree is never removed and its branch is never deleted — merged, clean, and unoccupied are three separate conditions, and only all three together make a worktree removable.
The reason is that a session resumed into a directory that has been deleted breaks every command that follows, and git has no idea the session exists. The sweep passes that list to cleanup as keeps, and every one of them appears in the report with the session that holds it.
It reports what is ready to merge, and merges nothing
Every open pull request is classified: ready, blocked by a failing check, conflicting with the base, waiting on review, or draft. A ready one is reported with the command that would land it.
It is not run. Whether a green pull request should land today is a decision the sweep cannot see — a review you were waiting for, a deploy window, a change you meant to fold in first — and a sweep that merged on green would be taking it for you.
It runs unattended, so it asks nothing
Scheduled, nobody is at the keyboard, so no pass is allowed to block on a question. Every question a sub-skill would have stopped to ask is written into a Needs you section instead: a base branch that could not be fast-forwarded, a branch with commits and no pull request, a merged branch checked out in the primary, a worktree living outside its repository's own directory. retitle proposes its renames and writes none, because a scheduler is not a confirmation.
The run is forked: its intermediate output stays inside the fork, and the report is what comes back. It is also written to ~/.local/state/steward/last-sweep.md, so it survives a missed notification and tells the next sweep when the last one ran.
What it does not do
It does not merge, rebase, resolve a conflict, or discard a commit. It does not delete anything cleanup would have kept, and it schedules itself only when you ask it to. Syncing or cleaning the single repository you are standing in belongs to sync and cleanup; landing a branch belongs to ship.
Also in Dev
5 more skills · one installsync
/dev:syncsync does one thing: it lays out the difference between your local repository and its remote, and performs only the part of that which is unambiguously safe.
ship
/dev:shipship takes a change from your working tree to a merged pull request: branch off, run the project's own tests, commit, open the pull request, wait for CI, merge, then clean up the worktree.
cleanup
/dev:cleanupAfter a change ships, the leftovers stay: the local branch, its copy on the remote, the worktree it was built in, and sometimes a directory holding nothing but ignored files. cleanup removes those, and keeps and reports anything whose history it cannot account for.
retitle
/dev:retitleA conversation list gets hard to use not because the names are ugly but because they carry nothing you can sort on.
reunite
/dev:reunitereunite answers the moment you sign in with your other account and the sidebar is suddenly almost empty — or the moment you archive or delete a conversation under one account and it is still sitting in the other one's sidebar.