ワンクリックで
ship-feature
// Ship a feature end-to-end — update tests, docs, docs-site, then release to PyPI. Use when user says "ship", "ship feature", "release", or asks to publish a new version.
// Ship a feature end-to-end — update tests, docs, docs-site, then release to PyPI. Use when user says "ship", "ship feature", "release", or asks to publish a new version.
Ship a feature end-to-end — update tests, docs, docs-site, then release to PyPI. Use when user says "ship", "ship feature", "release", or asks to publish a new version.
Create git commits with good messages. Use when user says "commit", "create commit", or asks to commit changes.
Review GitHub pull requests. Use when user says "review PR", "review pull request", or "/review-pr".
| name | ship-feature |
| description | Ship a feature end-to-end — update tests, docs, docs-site, then release to PyPI. Use when user says "ship", "ship feature", "release", or asks to publish a new version. |
| tools | ["read_file","glob","write_file","edit_file","Bash(git *)","Bash(python *)","Bash(pytest *)","Bash(pip *)","Bash(twine *)","Bash(npm *)","Bash(cat *)","Bash(grep *)"] |
Ship a feature completely: tests → docs → docs-site → release.
Read the user's message to identify which feature/module was changed.
Run in parallel:
git diff --stat — what files changedgit diff — full diff of changesgit log --oneline -5 — recent commit contextFind the relevant test file:
glob("tests/**/*.py") — find all test filessrc/agent.py → tests/unit/test_agent.py)Update the test file:
python -m pytest tests/unit/test_<module>.py -vThis step is required. Do not skip.
Find ALL docs that need updating:
glob("docs/**/*.md")
For each changed area:
docs/cli/README.md, docs/useful_tools/README.md) — update the table of contents if you added something newCommit docs/ changes as part of the release commit (not separately).
This step is required. Do not skip even if docs-site/ is not present locally.
docs-site is a separate Next.js git repo. Check if it's cloned:
ls docs-site/
If docs-site/ exists:
glob("docs-site/app/**/*.{tsx,mdx}")docs/CommandBlock, CodeBlock, etc.)cd docs-site && git add . && git commit -m "Update docs for <feature>" && git push && cd ..
If docs-site/ does NOT exist locally:
co copy ship-feature --force to re-run"Find and read the current version — check these locations in order:
grep -r "__version__" --include="*.py" -l # find which file has version
cat pyproject.toml | grep "^version" # or pyproject.toml
cat setup.py | grep "version=" # or setup.py
Apply versioning rules (read VERSIONING.md if it exists, otherwise use semver):
Search for every file containing the current version string and update each one:
grep -r "X.Y.Z" --include="*.py" --include="*.toml" --include="*.cfg" -l
Common locations: __init__.py, pyproject.toml, setup.py, setup.cfg
Stage only what changed — do NOT blindly stage all files:
git add -p # or stage specific files that were actually modified
git status # confirm what's staged before committing
git commit -m "Release vX.Y.Z: <feature description>"
git tag vX.Y.Z
git push
git push origin vX.Y.Z
python -m build
twine upload dist/*X.Y.Z*
Confirm upload succeeded by checking the output for "View at: https://pypi.org/project//X.Y.Z/"
docs/ updateddocs-site/ updated and pushed__init__.py and setup.py