From uceap
Create release notes for a UCEAP Portal release. Gathers PRs from GitHub milestone, fetches Jira ticket titles, creates a git tag, writes MkDocs documentation, creates a GitHub Release, and updates the version history index and navigation.
npx claudepluginhub uceap/claude --plugin uceapThis skill uses the workspace's default tool permissions.
When this skill is invoked with a version number (e.g., `/release-notes UP-V33.5` or `/release-notes 33.5`), create complete release documentation for that version.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
When this skill is invoked with a version number (e.g., /release-notes UP-V33.5 or /release-notes 33.5), create complete release documentation for that version.
/release-notes UP-V33.5 # Full version tag format
/release-notes 33.5 # Short format (UP-V prefix added automatically)
Parse Arguments:
UP-V33.5 or 33.5 format33.5 for internal use and UP-V33.5 for displayup-v33-5.md (NOT dots)Validate Environment:
JIRA_EMAIL - User's Jira email for authenticationJIRA_API_TOKEN - API token for Jira authenticationJIRA_BASE_URL - Base URL of the Jira instancegh auth statusFind the GitHub Milestone:
UP-V{version}:
gh api "/repos/UCEAP/myeap2/milestones?state=all&per_page=100" --jq '.[] | select(.title == "UP-V{version}")'
gh api "/repos/UCEAP/myeap2/issues?milestone={milestone_number}&state=closed&per_page=100" --jq '.[] | select(.pull_request != null) | {number, title}'
Find the Jira Release:
curl -s -X GET \
-H "Accept: application/json" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
"${JIRA_BASE_URL}/rest/api/3/project/UP/versions"
UP-V{version} and extract its idhttps://uceapit.atlassian.net/projects/UP/versions/{id}/tab/release-report-all-issuesFind the Deployment Ticket:
curl -s -X GET \
-H "Accept: application/json" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
"${JIRA_BASE_URL}/rest/api/3/search?jql=project%20%3D%20UP%20AND%20summary%20~%20%22PRODUCTION%20DEPLOYMENT%20V{version}%22&fields=summary"
PRODUCTION DEPLOYMENT V{version} {title}V{version} PRODUCTION DEPLOYMENT {title}PRODUCTION DEPLOYMENT V{version}: {title}Fetch Jira Ticket Titles:
UP-XXXX), extract the ticket IDcurl -s -X GET \
-H "Accept: application/json" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
"${JIRA_BASE_URL}/rest/api/3/issue/UP-{number}?fields=summary"
Categorize PRs:
Excluded (do not include in release notes):
Bump version toUP-V{version} exactly, or UP-V{version} part followed by a numberFeatures & Fixes (PRs with Jira ticket references):
UP-XXXX[UP-XXXX](https://uceapit.atlassian.net/browse/UP-XXXX) Jira summary ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))Infrastructure & Maintenance (everything else):
Use the PR title as the description
Link format: PR title ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))
If the milestone has very few non-excluded PRs (e.g., only meta PRs), inform the user and ask whether to examine the git diff between the previous tag and the new tag commit to find additional changes
Cross-Reference Jira Release and GitHub Milestone:
curl -s -X GET \
-H "Accept: application/json" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
"${JIRA_BASE_URL}/rest/api/3/search?jql=project%20%3D%20UP%20AND%20fixVersion%20%3D%20%22UP-V{version}%22&fields=key,summary&maxResults=100"
UP-XXXX ticket IDs extracted from PR titles in the GitHub milestone (from step 3)qa branch, before merge)Create MkDocs Page:
docs/reference/version-history/up-v{version-with-dashes}.md33.5 becomes 33-5, so filename is up-v33-5.md)# UP-V{version}: {title}
**Milestone:** [UP-V{version}](https://github.com/UCEAP/myeap2/milestone/{number}?closed=1)
| **Jira Release:** [UP-V{version}](https://uceapit.atlassian.net/projects/UP/versions/{jira_version_id}/tab/release-report-all-issues)
## Features & Fixes
- [UP-XXXX](https://uceapit.atlassian.net/browse/UP-XXXX) Jira ticket summary ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))
- ...
## Infrastructure & Maintenance
- PR title ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))
- ...
| separator)Update Index and Navigation:
Index file (docs/reference/version-history/index.md):
| [UP-V{version}](up-v{dashed}.md) | [{title}](up-v{dashed}.md) | [{Month Year}](up-v{dashed}.md) |mkdocs.yml:
- Overview: line under Version History - UP-V{version}: reference/version-history/up-v{dashed}.mdBuild Docs:
composer compile-docs
Commit Release Notes to qa:
qa branchgit add docs/reference/version-history/up-v{dashed}.md docs/reference/version-history/index.md mkdocs.yml
git commit -m "UP-V{version} release notes"
git push origin qa
Create Release PR:
qa into master:
gh pr create --base master --head qa \
--title "UP-V{version}" \
--body "Release UP-V{version}: {title}"
master)Identify the Tag Commit:
git tag -l "UP-V{version}"
git fetch origin master
git log origin/master --merges --first-parent --format="%H %s" | head -5
Merge pull request #XXXX from UCEAP/qaCreate Annotated Git Tag:
git tag -a UP-V{version} {sha} -m "Release UP-V{version}"
git push origin UP-V{version}
Create GitHub Release:
gh release view UP-V{version} 2>/dev/null
gh release create UP-V{version} \
--title "UP-V{version}: {title}" \
--latest \
--notes "$(cat <<'EOF'
## Features & Fixes
- [UP-XXXX](https://uceapit.atlassian.net/browse/UP-XXXX) Jira ticket summary ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))
## Infrastructure & Maintenance
- PR title ([#YYYY](https://github.com/UCEAP/myeap2/pull/YYYY))
EOF
)"
## and ###, while MkDocs pages use # and ##Report:
UP-V{version} at {sha}docs/reference/version-history/up-v{dashed}.mddocs/reference/version-history/index.mdmkdocs.ymlgh auth status fails, inform the user to authenticate with gh auth logincomposer compile-docs fails, show the error output and ask the user how to proceed/rest/api/3/up-v33-5.md (never up-v33.5.md)## headings; MkDocs pages use # headings — do not mix these up