.claude/skills/clawdapus-release/SKILL.md
Automates cutting a Clawdapus release: runs pre-release checks, coordinates with cllama submodule releases if needed, determines the next semver version, backfills any missing changelog entries, sweeps docs (CLI reference, README, manifesto) for updates tied to the release, writes the new version entry in the site changelog, updates the nav dropdown and Latest badge, pushes the release-prep commit to master, prepublishes the pinned infra image refs the release workflow verifies, then tags and pushes the release. Use this skill whenever the user says "release", "cut a release", "new version", "update the changelog and tag", "prepare a release", or anything about shipping a new version of the claw CLI.
npx skillsauth add mostlydev/clawdapus clawdapus-releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill automates the full release pipeline for Clawdapus. The release
workflow is tag-driven: pushing a semver tag on master triggers
.github/workflows/release.yml (goreleaser builds binaries and creates the
GitHub release) and .github/workflows/deploy-site.yml deploys the updated
site to clawdapus.dev.
cllama and the infra Docker images (cllama, clawdash, claw-wall,
claw-api, hermes-base) are on separate release cycles with manual steps —
this skill covers both sides.
Your job is to prepare everything locally, push the release-prep commit to
master, prepublish whatever pinned images the release verifier needs, then
push the release tag.
Before touching anything, verify the working tree, auth, and local build:
# Clean working tree check
git status
# Make sure local tags match GitHub — local tag list can lag badly
git fetch --tags
# Auth sanity — releases usually need both gh and docker/ghcr
gh auth status -t
# Build sanity — goreleaser runs vet + unit tests before publishing
go vet ./...
go test ./...
If the working tree is dirty, decide with the user whether those changes are part of this release or should be stashed/committed separately. Don't mix unrelated changes into the release commit.
If go vet or go test fails, stop and fix it — goreleaser will fail too.
If the release touched runtime docs or image lifecycle behavior, consider running the heavier repo checks as well:
go test -tags integration ./...
go test -tags spike -run TestQuickstartDocsRunInFreshDockerContainer ./cmd/claw/...
The cllama/ submodule has its own tags, GitHub releases, and Docker image
(ghcr.io/mostlydev/cllama:latest). If a clawdapus release depends on cllama
changes, release cllama FIRST so the submodule pointer references a tagged,
released commit.
Check whether cllama moved since its last release:
# Current submodule pointer
git -C cllama rev-parse HEAD
# Latest cllama GitHub release
gh -R mostlydev/cllama release list --limit 3
# Latest cllama tag (local + remote)
git -C cllama tag --sort=-v:refname | head -3
# Commits since last cllama release on the submodule pointer
git -C cllama log <last-cllama-tag>..HEAD --oneline
Decision tree:
git -C cllama tag v0.X.Y
git -C cllama push origin v0.X.Y
gh -R mostlydev/cllama release create v0.X.Y \
--title "v0.X.Y — <short headline>" \
--notes "$(cat <<'EOF'
## Highlights
- **Feature** — user-facing description.
## Fixes
- Fix: brief description.
EOF
)"
docker pull ghcr.io/mostlydev/cllama:latest) picks up the new image.git add cllama && git commit.# Latest tag
git tag --sort=-v:refname | head -1
# Latest GitHub release
gh release list --limit 1
# Commits since last tag
git log <latest-tag>..HEAD --oneline
Analyze the commits and propose a version bump:
Present the proposed version to the user and wait for confirmation. If the user already specified a version (e.g. "cut v0.5.0"), use that.
The site changelog (site/changelog.md) may be behind GitHub releases. Check:
# Extract version headers already in the changelog
grep '^## v' site/changelog.md
# Compare against actual GitHub releases
gh release list --limit 20
For each release that exists on GitHub but not in the changelog, fetch its notes and the underlying PRs/issues so you can write user-facing prose:
gh release view <tag> --json tagName,body,publishedAt
git log <prev-tag>..<tag> --oneline
Insert synthesized entries in descending order between "Unreleased" and the most recent existing entry. Use the same style as existing entries:
## v0.X.Y {#v0-X-Y}
*YYYY-MM-DD*
- **Feature name** — concise description of what changed and why it matters.
- Fix: brief description of bug fix.
Don't just dump commit hashes — synthesize user-facing prose grouped by theme.
Pull context from referenced PRs/issues (gh pr view N, gh issue view N)
when the commit message alone doesn't explain the "why".
Convert the ## Unreleased section (if present) into the new version heading.
If there's no Unreleased section, write one from the commits since the last
tag and from the PRs/issues they reference.
The new version gets the <Badge> and anchor:
## v0.X.Y <Badge type="tip" text="Latest" /> {#v0-X-Y}
*YYYY-MM-DD*
- **Feature** — description.
Remove the <Badge type="tip" text="Latest" /> from whichever older version
currently has it. Only one version should have the Latest badge.
Add a fresh empty ## Unreleased section at the top (above the new version)
so there's always a place for future notes:
## Unreleased
<!-- Nothing yet -->
Release changes often ripple into non-changelog docs. Sweep each of these:
site/guide/cli.mdIf the release added, removed, or modified anything observable via the CLI, update the reference. Check every change category:
claw audit, claw inspect, claw ps,
claw health, claw doctor — document themGrep for anything that looks stale:
# Find doc references to CLI flags/subcommands affected by the release
grep -n '<flag-or-command>' site/guide/cli.md
README.mdPatch releases rarely need README changes. Minor/major releases often do. Check:
site/manifesto.md and root MANIFESTO.mdUpdate only when a release changes the project's scope, vision, or core mechanics (compiled tools, memory plane, fleet governance, etc.). Most patch releases leave this untouched.
site/guide/*.mdNew features often need a new guide page or updates to an existing one:
claw-pod-yml.md or similardocs/decisions/ → link from the relevant guide page if the ADR
changes user-visible behavior# Find version references that might need bumping
grep -rn "v0\.X\.Y" site/ README.md examples/ --include='*.md' --include='*.mts'
(Package-lock files, go.sum, and generated artifacts are noise — filter them out.)
In site/.vitepress/config.mts, find the version string in the nav array:
{
text: 'v0.X.Y', // ← update this
items: [
Replace it with the new version.
Stage the changed files explicitly — don't use git add -A:
git add site/changelog.md site/.vitepress/config.mts
# Add any docs sweep changes
git add site/guide/cli.md README.md # only if modified
# Add submodule pointer if cllama moved
git add cllama # only if modified
Commit:
git commit -m "site: release v0.X.Y
Backfill v0.A.B–v0.C.D changelog entries. Add v0.X.Y with [brief summary].
Update nav dropdown and CLI reference."
Push master before creating the release tag. The tag workflow's release job
verifies pinned infra refs immediately, so you need the release-prep commit on
the remote default branch before you start tagging.
git push origin master
If local SSH auth is flaky, switch git to GitHub credential helper and push via HTTPS instead:
gh auth setup-git
git push https://github.com/mostlydev/clawdapus.git master:master
After the push, wait for the master workflows you just touched to settle:
gh run list --branch master --limit 5
If the push is rejected because the remote is ahead, pull with rebase and push
master again before doing any tag work:
git pull --rebase origin master
git push origin master
Clawdapus release binaries now hard-fail on missing pinned infra tags. Before you push the release tag, make sure every required image ref exists in ghcr.io. The release workflow checks these refs before goreleaser runs:
ghcr.io/mostlydev/claw-api:v0.X.Yghcr.io/mostlydev/clawdash:v0.X.Yghcr.io/mostlydev/claw-wall:v0.X.Yinternal/infraimages/release_manifest.go (today: cllama and
hermes-base)The tag-triggered image workflows for claw-api, clawdash, and claw-wall
run too late to satisfy that verifier. If the versioned refs do not already
exist, publish them manually before creating the release tag.
Prerequisite: docker buildx create --name multiarch-builder --use (one-time
setup). Authenticate to ghcr.io: gh auth token | docker login ghcr.io -u <user> --password-stdin.
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/mostlydev/cllama:latest \
-t ghcr.io/mostlydev/cllama:v0.X.Y \
--push cllama/
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/mostlydev/clawdash:latest \
-t ghcr.io/mostlydev/clawdash:v0.X.Y \
--push \
-f dockerfiles/clawdash/Dockerfile .
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/mostlydev/claw-wall:latest \
-t ghcr.io/mostlydev/claw-wall:v0.X.Y \
--push \
-f dockerfiles/claw-wall/Dockerfile .
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/mostlydev/claw-api:latest \
-t ghcr.io/mostlydev/claw-api:v0.X.Y \
--push \
-f dockerfiles/claw-api/Dockerfile .
Tagged per upstream Hermes version, not per clawdapus release:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/mostlydev/hermes-base:v<upstream-tag> \
--push dockerfiles/hermes-base/
Run the release manifest verifier locally before git tag:
go run ./scripts/check-release-infra-tags --release-tag v0.X.Y
Do not stop at the local verifier. If your local Docker client is authenticated to ghcr.io, private packages can still appear healthy locally while the public release workflow or end users fail.
Check package visibility explicitly for anything newly pushed:
gh api /users/mostlydev/packages/container/claw-api
gh api /users/mostlydev/packages/container/clawdash
gh api /users/mostlydev/packages/container/claw-wall
gh api /users/mostlydev/packages/container/hermes-base
For a public package, the JSON should show "visibility":"public".
For the package most likely to have just been created, also verify anonymous pull token issuance:
curl -fsS 'https://ghcr.io/token?service=ghcr.io&scope=repository:mostlydev/hermes-base:pull'
If GitHub created a new package as private, flip it to public in the GitHub UI before shipping the release.
Only after master is pushed and the pinned refs are public and verifiably
present should you create the release tag:
git tag -a v0.X.Y -m "v0.X.Y"
git push origin refs/tags/v0.X.Y
If local SSH auth is broken, use the same HTTPS fallback:
gh auth setup-git
git push https://github.com/mostlydev/clawdapus.git refs/tags/v0.X.Y
After pushing the clawdapus tag, confirm the workflows started:
gh run list --limit 5
Watch the Release workflow through completion:
gh run watch <release-run-id> --exit-status
Then check the GitHub release object and assets:
gh release view v0.X.Y
Also make sure the tag-triggered claw-api Image, clawdash Image, and
claw-wall Image workflows finished green. They are confirmation that the CI
publishing path still works, but they are not the thing the release job
depended on.
Report the status to the user with links:
https://github.com/mostlydev/clawdapus/releases/tag/v0.X.Yhttps://clawdapus.dev/changelog#v0-X-Ygit log and PR context.docker buildx create --name multiarch-builder --use before push.docker manifest inspect can succeed when
your machine is logged in, while the public release workflow or end users
still fail.claw-api, clawdash, and claw-wall refs first.git push origin master fails on SSH auth: run gh auth setup-git and
push via https://github.com/mostlydev/clawdapus.git.gh release delete v0.X.Y --yes
git push origin :refs/tags/v0.X.Y
git push origin v0.X.Y
claw up against the published
clawdapus binary consume a released cllama image.tools
Automates cutting a Clawdapus release: runs pre-release checks, coordinates with cllama submodule releases if needed, determines the next semver version, backfills any missing changelog entries, sweeps docs (CLI reference, README, manifesto) for updates tied to the release, writes the new version entry in the site changelog, updates the nav dropdown and Latest badge, pushes the release-prep commit to master, prepublishes the pinned infra image refs the release workflow verifies, then tags and pushes the release. Use this skill whenever the user says "release", "cut a release", "new version", "update the changelog and tag", "prepare a release", or anything about shipping a new version of the claw CLI.
tools
Use when working with the claw CLI, Clawfiles, claw-pod.yml, cllama proxy, or deploying AI agent containers with Clawdapus. Use when you see CLAW_TYPE, AGENT, MODEL, CLLAMA, CONFIGURE, INVOKE, SURFACE, HANDLE, TRACK, SKILL, or PRIVILEGE directives. Use when diagnosing agent startup failures, credential starvation, config injection, governance proxy issues, managed tool mediation, or memory plane problems.
tools
Use when working with the claw CLI, Clawfiles, claw-pod.yml, cllama proxy, or deploying AI agent containers with Clawdapus. Use when you see CLAW_TYPE, AGENT, MODEL, CLLAMA, CONFIGURE, INVOKE, SURFACE, HANDLE, TRACK, SKILL, or PRIVILEGE directives. Use when diagnosing agent startup failures, credential starvation, config injection, governance proxy issues, managed tool mediation, or memory plane problems.
tools
Use when working with the claw CLI, Clawfiles, claw-pod.yml, cllama proxy, or deploying AI agent containers with Clawdapus. Use when you see CLAW_TYPE, AGENT, MODEL, CLLAMA, CONFIGURE, INVOKE, SURFACE, HANDLE, TRACK, SKILL, or PRIVILEGE directives. Use when diagnosing agent startup failures, credential starvation, config injection, governance proxy issues, managed tool mediation, or memory plane problems.