| name | release |
| description | Run the full ralphify release process — analyze changes, update docs, bump version, commit, push, create GitHub release, verify CI, and generate social content. Use when cutting a new release. Optional arg "patch", "minor", or "major" to skip the version bump prompt. |
Ralphify Release Skill
You are running the ralphify release process. Follow each phase in order. Stop and ask the user if anything is unclear or if a decision is needed.
Phase 1: Pre-flight checks
- Clean working tree — run
git status. If there are uncommitted changes, stop and ask the user whether to stash, commit, or abort.
- On main branch — confirm we're on
main. If not, ask the user.
- Up to date with remote — run
git fetch origin main && git log HEAD..origin/main --oneline. If behind, warn the user.
Phase 2: Analyze changes since last release
- Find the latest version tag:
git tag --sort=-v:refname | head -5 (tags are vX.Y.Z).
- Read the current version from
pyproject.toml (line 3, version = "X.Y.Z").
- Get the full diff and commit log since that tag:
git log <tag>..HEAD --oneline
git diff <tag>..HEAD --stat
- Read changed files as needed to understand the substance of each change.
- Categorize changes into: Added, Fixed, Changed, Improved, Breaking changes. Only include categories that have entries.
- Present a summary to the user: what changed, and your proposed version bump (patch/minor/major) with reasoning.
Phase 3: Version bump
- If the user passed "patch", "minor", or "major" as an argument to this skill, use that.
- Otherwise, propose a bump level based on the changes and ask the user to confirm before proceeding.
- Bump the version in
pyproject.toml (the single source of truth — importlib.metadata picks it up at runtime).
Phase 4: Update docs (selectively)
Not every release needs doc updates everywhere. Use judgment:
Changelog (CHANGELOG.md)
README.md
- Only update if the release changes the quickstart, install instructions, core concepts, or the high-level pitch. Most patch releases won't touch this.
MkDocs docs (docs/)
- Only update if a user-facing feature was added or changed (new CLI flags, new frontmatter fields, changed behavior).
- Check:
docs/quick-reference.md, docs/cli.md, docs/how-it-works.md, and docs/cookbook.md for relevance.
New-ralph skill (src/ralphify/skills/new-ralph/SKILL.md)
- Only update if new frontmatter fields or ralph structure changes were introduced.
Codebase map (docs/contributing/codebase-map.md)
- Only update if new modules were added or module responsibilities changed.
For each doc surface, state whether you're updating it and why (or why not). Don't make changes just to make changes.
Phase 5: Build verification
Run locally before pushing:
uv run ruff check .
uv run ruff format --check .
uv run ty check
uv run pytest
uv run mkdocs build --strict
If either fails, fix the issue before continuing.
Phase 6: Commit, tag, and push
- Stage all changes:
git add -A (but check git diff --cached to make sure nothing unexpected is staged).
- Commit with message:
release: vX.Y.Z followed by a blank line and a concise summary of the release.
- Create an annotated tag:
git tag -a vX.Y.Z -m "vX.Y.Z".
- Push with tags:
git push origin main --follow-tags.
Phase 7: Verify CI pipeline
- Watch the publish workflow:
gh run list --workflow=publish.yml --limit=3.
- If a run is in progress, check its status:
gh run watch <run-id>.
- If the run fails, investigate and report to the user. Do not retry automatically.
Phase 8: Social content
Generate two pieces of social content for the user to review and post:
Tweet (< 280 chars)
- Lead with the most impactful change, not "we released vX.Y.Z"
- Include the PyPI link:
pypi.org/project/ralphify/
- Keep it punchy — one key thing, not a feature list
- No emojis unless the user requests them
ray.so snippet
- Generate a short code/terminal snippet (3-8 lines) that showcases the most important change
- Provide the raw text the user can paste into ray.so
- Suggest settings: theme "candy", language "shell", padding 32, dark mode
Present both to the user for review. These are suggestions — the user decides whether and what to post.
Important notes
- The publish workflow (
publish.yml) triggers on tag push (v*) and verifies the git tag matches pyproject.toml version. CI automatically creates the GitHub Release from CHANGELOG.md. The tag format is vX.Y.Z.
- Never force-push or rewrite history on main.
- If anything goes wrong mid-release, stop and discuss with the user rather than trying to recover automatically.