src/osprey/assist/integrations/claude_code/release-workflow/SKILL.md
Guides through the complete OSPREY release workflow. Use when the user wants to create a release, bump versions, publish to PyPI, create a tag, or needs help with pre-release testing and version consistency checks.
npx skillsauth add als-apg/osprey osprey-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.
Definitive workflow for creating releases that ensure documentation and version numbers stay in sync.
Walk the user through each step and verify completion before moving to the next.
DO NOT PROCEED until you clearly understand what this release contains!
Sanitize the CHANGELOG
When multiple PRs are merged, the CHANGELOG can develop issues. Check for and fix:
[Unreleased]## [X.Y.Z] sections should never be modified# Review the CHANGELOG structure
grep -n "^## \[" CHANGELOG.md
If any issues are found, fix them before proceeding.
Read the ## [Unreleased] section in CHANGELOG.md
Determine Release Theme and Title
Verify Completeness
Check for Breaking Changes → Migration Document
src/osprey/assist/tasks/migrate/authoring/README.mdPlan Release Notes
Confirm the release theme and title with the user before proceeding.
Always run tests before starting the release process.
Create Clean Virtual Environment (Dependency Verification)
Your development venv may have packages installed that aren't in pyproject.toml. A clean venv catches missing dependencies before users encounter them.
# Install osprey with dev dependencies from scratch in a clean state
uv sync --extra dev
Why this matters: We've had CI failures where tests passed locally but failed in CI because developers had manually installed packages (like langchain-openai, fastmcp) that weren't declared as dependencies.
Run Unit & Integration Tests
# Run all unit tests (excluding e2e tests)
# IMPORTANT: Must exclude e2e tests due to registry mocking
pytest tests/ --ignore=tests/e2e -v
Run End-to-End Tutorial Tests
# Run e2e tests separately (uses real registry, no mocks)
# IMPORTANT: Must run separately from unit tests
pytest tests/e2e/ -v
Why Separate Test Commands?
Verify All Tests Pass
Cleanup Test Environment
# No cleanup needed - uv sync manages the .venv automatically
Update all version numbers BEFORE creating the GitHub release/tag.
Update Version Numbers in these files:
| File | Location | Example |
|------|----------|---------|
| pyproject.toml | Line 7 | version = "X.Y.Z" |
| src/osprey/__init__.py | Line 15 | __version__ = "X.Y.Z" |
| src/osprey/cli/main.py | Line 20 | __version__ = "X.Y.Z" |
| RELEASE_NOTES.md | Line 1 | # Osprey Framework - Latest Release (vX.Y.Z) |
| CHANGELOG.md | New section | ## [X.Y.Z] - YYYY-MM-DD |
| README.md | Line 12 | **Latest Release: vX.Y.Z** |
Run Version Consistency Check
echo "=== VERSION CONSISTENCY CHECK ==="
echo "pyproject.toml: $(grep 'version = ' pyproject.toml)"
echo "osprey/__init__.py: $(grep '__version__ = ' src/osprey/__init__.py)"
echo "cli/main.py: $(grep '__version__ = ' src/osprey/cli/main.py)"
echo "RELEASE_NOTES.md: $(head -1 RELEASE_NOTES.md)"
echo "README.md: $(grep 'Latest Release:' README.md)"
echo "CHANGELOG.md: $(grep -m1 '## \[' CHANGELOG.md)"
Commit Version Updates
git add pyproject.toml src/osprey/__init__.py src/osprey/cli/main.py RELEASE_NOTES.md CHANGELOG.md README.md
git commit -m "release: Bump version to X.Y.Z"
git push origin main
Verify all versions match before proceeding.
GitHub Actions handles build, PyPI publishing, and release creation!
# 1. Ensure you're on main and up to date
git checkout main
git pull origin main
# 2. Create and push tag (use your version number)
git tag vX.Y.Z
git push origin vX.Y.Z
What happens automatically:
.github/workflows/release.yml)Monitor the GitHub Actions workflow:
# Option 1: Use GitHub CLI to monitor
gh run list --limit 5
# Option 2: Check GitHub web interface
# Go to: https://github.com/als-apg/osprey/actions
Verify deployment:
https://pypi.org/project/osprey-framework/X.Y.Z/https://github.com/als-apg/osprey/releases/tag/vX.Y.Zuv pip install --upgrade osprey-framework
python -c "import osprey; print(osprey.__version__)" # Should print: X.Y.Z
ONLY USE IF GITHUB ACTIONS FAILS
If the automated workflow fails, you can manually publish:
# 1. Clean previous builds
rm -rf dist/ build/ src/*.egg-info/
# 2. Build the package
uv build
# 3. Check the built package
uvx twine check dist/*
# 4. Upload to PyPI (requires PyPI credentials)
uvx twine upload dist/*
| Step | Action | Verification | |------|--------|--------------| | 0A | Review CHANGELOG | Confirm theme with user | | 0B | Pre-release testing | All tests pass | | 1 | Version updates | Consistency check passes | | 2 | Create tag | Tag pushed successfully | | 3 | Verify release | PyPI + GitHub Release exist, install works |
After each major step, confirm success before proceeding to next step. If any step fails, help troubleshoot before continuing.
data-ai
List, inspect, and switch the simulated machine scenarios that drive the mock control system and mock archiver. Use when the user asks which scenarios are available, which scenario is active, or wants to switch the simulated machine into a different state (e.g. a fault demo or back to nominal).
development
Interactive interview to create a custom OSPREY build profile for a new accelerator, detector, or beamline application. Use when someone says "interview me", "create a build profile", "set up my agent", "configure my detector", "onboard me", or needs to create an OSPREY project tailored to their specific control system. Also handles migration from existing OSPREY projects (including LangGraph-era projects) — trigger on "migrate my project", "I have an existing project", "upgrade from old OSPREY", "upgrade from langgraph", "legacy migration", "bring my project forward", "convert my project", "extract profile from existing project", "reverse-engineer build profile". Also use for /osprey-build-interview feedback to collect post-use feedback. Also trigger when onboarding a new colleague or when anyone needs help figuring out what their OSPREY agent should look like.
testing
Guides a maintainer through cutting an OSPREY release on the GitHub Flow workflow: open a version-bump PR, merge it to main, tag the merge commit, push the tag, verify the automated PyPI publish. Use when someone says "create a release", "bump the version", "cut v2026.X.Y", "publish to PyPI", "tag a release", or asks about the release process. Composes with `osprey-contribute` for the bump PR. Versions follow CalVer (vYYYY.M.P) and the source of truth is `src/osprey/__init__.py` — Hatch derives the pyproject.toml version dynamically.
development
Validates code before committing using OSPREY's three-tier check scripts. Runs linting, formatting, and tests to catch issues early. Use when ready to commit, before pushing, before opening a PR, or when the user asks to run checks, validate, or verify their changes. For the full contribution journey (branching, commits, push, PR, merge), use `osprey-contribute` instead — this skill is the focused validation step.