Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when bumping the AionUi version: query AionCore release, verify artifacts, update package.json, generate CHANGELOG, branch, commit, push, create PR, auto-merge, tag release.
.claude/skills/iofficeai-bump-version/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 132% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 27% | 0% |
Automate the AionUi release preparation: query AionCore release → verify artifacts → update versions → generate CHANGELOG → branch → PR → tag.
Usage: /bump-version [version] [flags]
/bump-version — auto patch + latest AionCore/bump-version 2.2.0 — explicit AionUi version + latest AionCore/bump-version 2.2.0 --core v0.1.12 — explicit both versions/bump-version --skip-core — pure frontend release (don't touch aioncoreVersion)bashgit branch --show-current git status --short
main → Stop: "Please switch to main before running bump-version."bashgit pull --rebase origin main
Fails → Stop: "Failed to pull latest code. Please resolve conflicts or network issues first."
Read package.json → extract version field.
major.minor.patch, increment patch by 1Display: "Bumping AionUi: {current} → {target}"
Skip entirely if --skip-core is set.
bashgh release view --repo iOfficeAI/AionCore --json tagName,body
--core <version> provided → use that tag instead of latestaioncoreVersion from package.json — if it already matches the queried version, warn the user and ask whether to proceed or use --skip-coreSkip if --skip-core.
bashgh release view <tag> --repo iOfficeAI/AionCore --json assets --jq '.assets[].name'
Verify all 7 expected assets exist:
aioncore-<tag>-x86_64-unknown-linux-gnu.tar.gzaioncore-<tag>-aarch64-unknown-linux-gnu.tar.gzaioncore-<tag>-x86_64-apple-darwin.tar.gzaioncore-<tag>-aarch64-apple-darwin.tar.gzaioncore-<tag>-x86_64-pc-windows-msvc.zipaioncore-<tag>-aarch64-pc-windows-msvc.zipaioncore-checksums.txtMissing → Stop: "AionCore {tag} is missing artifacts: {list}. Wait for CI to complete or check for build failures."
Use Edit tool to replace:
"version": "{current}" → "version": "{target}""aioncoreVersion": "{old}" → "aioncoreVersion": "{new core tag}" (skip if --skip-core)bashgit describe --tags --abbrev=0
This gives the most recent tag (e.g. v2.1.2).
bashgit log v{previous}..HEAD --oneline --no-merges --format="%s"
feat, fix, refactor, perf, stylechore: bump version- **scope:** description (#PR)From step 4's release body (already in conventional-changelog format from release-please). Parse into same grouped format.
Skip if --skip-core.
If CHANGELOG.md exists at repo root → read its current content. If not → start with empty string.
Prepend the new entry in this format:
markdown# Changelog ## [{target}](https://github.com/iOfficeAI/AionUi/compare/v{previous}...v{target}) ({date YYYY-MM-DD}) ### Desktop #### Bug Fixes - **upload:** abort in-flight uploads when switching conversations (#3019) #### Features - **thinking:** add streaming indicator (#3015) ### Core ([{core tag}](https://github.com/iOfficeAI/AionCore/releases/tag/{core tag})) #### Bug Fixes - **acp:** load user MCP servers and emit empty-finish diagnostic (#327) ---
Rules:
--skip-core: omit the entire "### Core" section_No frontend changes in this release._ under "### Desktop"YYYY-MM-DD# Changelog header exactly oncebashbun run lint bun run format bunx tsc --noEmit
bashbunx vitest run
Fails → Stop: "Tests failed. Please fix before bumping."
bashgit checkout -b chore/bump-version-{target} git add package.json CHANGELOG.md git commit -m "chore: bump version to {target} and aioncore to {core tag}" just push -u origin chore/bump-version-{target}
If --skip-core:
bashgit commit -m "chore: bump version to {target}"
bashgh pr create --base main \ --title "chore: bump version to {target}" \ --body "<the CHANGELOG entry generated in Step 7>"
Capture the PR number from the output. Then enable auto-merge (squash):
bashgh pr merge {PR_NUMBER} --auto --squash
Display: "PR created: {URL}. Auto-merge enabled — will merge automatically once CI passes."
Check PR merge status every 5 minutes:
bashgh pr view {PR_NUMBER} --json state,mergedAt,mergeStateStatus
Decision logic:
| state | Action | | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | MERGED | Proceed to Step 13 | | CLOSED (not merged) | Stop: "PR was closed without merging. Please check and confirm how to proceed." | | OPEN with mergeStateStatus: BLOCKED or CI failure persisting > 3 checks | Stop: "PR merge is blocked (CI failure or review required). Please investigate: {URL}" | | OPEN otherwise | Wait 5 minutes, check again |
Maximum wait: 30 minutes (6 checks). If not merged after 30 minutes:
> "PR has not merged after 30 minutes. Please check status: {URL}. Reply 'continue' when merged, or 'abort' to stop."
Wait for user confirmation only in this timeout case.
After merge is confirmed (either via polling or user confirmation):
bashgit checkout main git pull --rebase origin main git branch -d chore/bump-version-{target}
Check if remote branch still exists:
bashgit ls-remote --heads origin chore/bump-version-{target}
git push origin --delete chore/bump-version-{target}Create and push tag:
bashgit tag v{target} git push origin v{target}
Wait a few seconds for GitHub to pick up the tag push, then fetch the triggered workflow run:
bashgh run list --workflow=release.yml --branch v{target} --limit 1 --json databaseId,url
Display: "Tag v{target} created and pushed. Release build triggered! Action: {run URL}"
1. Must be on clean main
2. git pull --rebase
3. Determine AionUi target version (patch+1 or explicit)
4. Query AionCore latest release (or --core / --skip-core)
5. Verify AionCore artifacts (7 files)
6. Edit package.json (version + aioncoreVersion)
7. Generate CHANGELOG entry (frontend commits + AionCore release body)
8. lint + format + tsc
9. vitest run
10. branch → commit → push
11. gh pr create → enable auto-merge (squash)
12. poll merge status (every 5min, max 30min) → stop on failure
13. cleanup → git tag → git push tag| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 9,570 | 4,322 | -55% | 1 | 1 | 0% | 1,782 | 2,657 | +49% | 0 | 0 | — |
case-02 | fail→fail | 9,535 | 3,913 | -59% | 1 | 1 | 0% | 2,030 | 2,486 | +22% | 0 | 0 | — |
case-03 | fail→fail | 7,159 | 4,179 | -42% | 1 | 1 | 0% | 1,424 | 2,467 | +73% | 0 | 0 | — |
case-04 | fail→pass | 11,659 | 2,755 | -76% | 1 | 1 | 0% | 2,179 | 2,738 | +26% | 0 | 0 | — |
case-05 | fail→pass | 10,395 | 2,051 | -80% | 1 | 1 | 0% | 1,788 | 2,613 | +46% | 0 | 0 | — |
case-06 | pass→pass | 7,818 | 1,418 | -82% | 1 | 1 | 0% | 1,373 | 2,446 | +78% | 0 | 0 | — |
case-07 | fail→pass | 6,271 | 2,442 | -61% | 1 | 1 | 0% | 1,196 | 2,770 | +132% | 0 | 0 | — |
case-08 | fail→fail | 8,985 | 1,735 | -81% | 1 | 1 | 0% | 1,643 | 2,544 | +55% | 0 | 0 | — |
case-09 | fail→pass | 10,354 | 3,033 | -71% | 1 | 1 | 0% | 1,941 | 2,748 | +42% | 0 | 0 | — |
case-10 | fail→pass | 10,273 | 1,105 | -89% | 1 | 1 | 0% | 1,895 | 2,413 | +27% | 0 | 0 | — |
case-11 | pass→pass | 6,316 | 1,382 | -78% | 1 | 1 | 0% | 1,264 | 2,442 | +93% | 0 | 0 | — |
case-12 | fail→pass | 10,940 | 1,628 | -85% | 1 | 1 | 0% | 1,862 | 2,501 | +34% | 0 | 0 | — |
case-13 | pass→pass | 8,425 | 3,212 | -62% | 1 | 1 | 0% | 1,353 | 2,737 | +102% | 0 | 0 | — |
case-14 | pass→pass | 11,204 | 2,455 | -78% | 1 | 1 | 0% | 2,042 | 2,679 | +31% | 0 | 0 | — |
case-15 | fail→pass | 4,427 | 2,997 | -32% | 1 | 1 | 0% | 825 | 2,788 | +238% | 0 | 0 | — |
case-16 | pass→pass | 6,742 | 1,755 | -74% | 1 | 1 | 0% | 1,326 | 2,487 | +88% | 0 | 0 | — |
case-17 | pass→pass | 8,386 | 1,840 | -78% | 1 | 1 | 0% | 1,540 | 2,575 | +67% | 0 | 0 | — |
case-18 | fail→pass | 10,344 | 1,970 | -81% | 1 | 1 | 0% | 1,753 | 2,579 | +47% | 0 | 0 | — |
case-19 | fail→pass | 8,088 | 1,617 | -80% | 1 | 1 | 0% | 1,317 | 2,473 | +88% | 0 | 0 | — |
case-20 | pass→fail | 9,317 | 4,423 | -53% | 1 | 1 | 0% | 1,901 | 2,457 | +29% | 0 | 0 | — |
case-21 | pass→pass | 8,205 | 6,255 | -24% | 1 | 1 | 0% | 1,503 | 3,508 | +133% | 0 | 0 | — |
case-22 | pass→pass | 13,039 | 9,253 | -29% | 1 | 1 | 0% | 2,733 | 4,153 | +52% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.