cleanup-builds
CommandReclaim disk taken by tagged dev artifacts from `./scripts/reload.sh --tag <tag>`. Each tagged build is multi-GB of DerivedData…
Ship a stable cmux release built by CI: bump version, update changelog, open a PR, merge, tag, then GitHub Actions builds, signs, and publishes.
$ npx -y skills add manaflow-ai/cmux --agent claude-code
Ship a stable cmux release built by CI: bump version, update changelog, open a PR, merge, tag, then GitHub Actions builds, signs, and publishes.
`skills/cmux-release/SKILL.md` owns the version-bump, pretag-guard, and tag mechanics plus the Apple signing secrets. This file owns the shared changelog and contributor procedure that `/release-nightly` and `/release-local` also use, and the PR-and-CI build path.
1. **Pick the version.** Read `MARKETING_VERSION` from `cmux.xcodeproj/project.pbxproj`. Bump minor unless the user says otherwise (0.12.0 to 0.13.0).
2. **Gather the changelog lines since the last stable tag.** Every PR carries its release-note line in the `## Changelog` section of its description (one `Added`/`Changed`/`Fixed`/`Removed` line, or `none`). Take the PR numbers from main's first-parent history, then fetch every PR in one GraphQL query:
# A shallow clone stops history early and silently drops PRs from the range.
if [ "$(git rev-parse --is-shallow-repository)" = true ]; then git fetch --unshallow --tags origin; fi
TAG=$(git describe --tags --abbrev=0 --match 'v[0-9]*') # plain describe finds `nightly`
git log --first-parent --format=%s "$TAG"..HEAD \
| sed -nE 's/^Merge pull request #([0-9]+) .*/\1/p; s/.*\(#([0-9]+)\)$/\1/p' | sort -un > /tmp/release-prs.txt
{
echo 'query { repository(owner: "manaflow-ai", name: "cmux") {'
sed 's/.*/ n&: issueOrPullRequest(number: &) { ... on PullRequest { ...P } }/' /tmp/release-prs.txt
echo '} } fragment P on PullRequest { number title body url author { __typename login }
mergeCommit { oid } closingIssuesReferences(first: 10) { nodes { author { __typename login } } } }'
} > /tmp/release-query.graphql
gh api graphql -F query=@/tmp/release-query.graphql > /tmp/release-raw.json \
|| echo "GraphQL query failed; read /tmp/release-raw.json before going on"
jq -c '.data.repository[] | select(.number != null)' /tmp/release-raw.json > /tmp/release-prs.jsonl
git log --first-parent --format='%H%n%B%n@@end@@' "$TAG"..HEAD > /tmp/release-log.txt
jq -r -s --rawfile log /tmp/release-log.txt \
-f skills/cmux-release/references/changelog-lines.jq /tmp/release-prs.jsonl > /tmp/release-lines.tsvCheck that `/tmp/release-prs.jsonl` has about as many lines as `/tmp/release-prs.txt`; the gap is numbers in commit titles that are issues, not PRs. The query is one request (1,257 PRs took 8 seconds) and reads from a file, so its size isn't limited by the shell's argument list. If it times out, run it on each half of `/tmp/release-prs.txt` and concatenate the output; don't fall back to one `gh` call per PR. The search API is not a substitute: it stops at 1,000 results, which ten days of merges exceed.
Each row of `/tmp/release-lines.tsv` is `status`, `#number`, `url`, `author`, `credit`, `line`:
Also list for the human any first-parent commit without a PR number (`git log --first-parent --format='%h %s' "$TAG"..HEAD | grep -vE '\(#[0-9]+\)$| Merge pull request #'`); the query can't see them. Credit follows [Contributor credits](#contributor-credits): the `credit` column already thanks the PR author and the reporters of the issues the PR closes, leaving out the core team, bots and the PR's own author as reporter. If nothing is user-facing, ask the user whether to release anyway.
3. **Update `CHANGELOG.md`.** Add a section at the top with the new version and today's date, built from step 2, with inline contributor credit and the contributor summary (the `author` of every PR that got a line, plus each credited reporter, leaving out bot accounts such as `[bot]` logins and `chatmux-connections`). Then fold any entries under `## Unreleased` into that section (they predate the Changelog section in PR descriptions): move each into its category, drop any that duplicate a step 2 line for the same PR, and remove the emptied `## Unreleased` heading. The docs changelog page renders from `CHANGELOG.md`. Its headline cards live in `web/app/[locale]/(landing)/docs/changelog/changelog-media.ts`: rename the `Unreleased` key there to the new version, or add an entry if there is none.
4. **Bump the ve
Open source Ghostty-based macOS terminal with vertical tabs and notifications for AI coding agents. Built for multitasking, organization, and programmability.
Reclaim disk taken by tagged dev artifacts from `./scripts/reload.sh --tag <tag>`. Each tagged build is multi-GB of DerivedData…
Pull latest main and update all submodules to their latest remote main. No commits, no pushes.
Release straight from `main` with no PR, built and published locally.
Release through the PR flow, then build and publish locally instead of waiting on the CI release workflow.
Run an adversarial review of the current change using the repository's cmux review skill.
Get the current branch ready: update all submodules to their latest remote main, merge from main, and rebase.
Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.