Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user wants to release a new desktop app version (发版 / release / 发布新版本) — bumps apps/desktop version, writes user-facing release notes into CHANGELOG.md, and opens the release PR that drives the automated tag → build → publish pipeline
.claude/skills/kansoku-trade-release/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-20 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 1% | 0% |
Opens a version-bump PR for the Kansoku desktop app. Everything after the PR merge is automated:
this skill → release PR (ci.yml gates it) → merge to main
→ desktop-tag.yml creates desktop-vX.Y.Z + dispatches desktop-release.yml
→ build, sign, appcast, publish GitHub Release (notes from CHANGELOG.md)
→ users receive the Sparkle updateOptional argument: patch | minor | major — skips the bump suggestion step.
bashgit status --porcelain # must be empty git branch --show-current # must be main git fetch origin main && git rev-list --count main..origin/main # must be 0
bashLAST_TAG=$(git describe --tags --match 'desktop-v*' --abbrev=0) git log "$LAST_TAG"..HEAD --oneline -- apps/ packages/ patches/ scripts/
If git describe finds no tag, this is the first release — use the full history of those paths. If there are no commits touching apps/, packages/, patches/, or scripts/ since the last tag, stop: nothing to release.
Read the actual diffs of significant commits when the one-line messages aren't enough to describe user-visible changes.
Current version: node -p "require('./apps/desktop/package.json').version".
If the user passed patch/minor/major, apply it directly. Otherwise suggest one — any feat → minor, only fixes/refactors/chores → patch, breaking changes to user data or workflows → major — and ask the user to confirm the version number before continuing.
Prepend a section to apps/desktop/CHANGELOG.md (below the file header, above the previous version's section):
markdown## X.Y.Z — YYYY-MM-DD - 更新点……
Rules for the notes (they become the GitHub Release body verbatim, and users read them):
Update version in apps/desktop/package.json to the confirmed X.Y.Z.
bashgit checkout -b release/desktop-vX.Y.Z git add apps/desktop/package.json apps/desktop/CHANGELOG.md git commit -m "release(desktop): vX.Y.Z" git push -u origin release/desktop-vX.Y.Z gh pr create --title "release(desktop): vX.Y.Z" --body "<release notes section>"
PR body = the new CHANGELOG section, plus one line noting that merging will auto-tag and publish the release.
Show the PR link and remind: merge = release. After merge, desktop-tag.yml tags and dispatches desktop-release.yml; the release publishes automatically and the Sparkle feed goes live immediately.
Then switch back to main: git checkout main.
## X.Y.Z section is missing.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | fail→pass | 8,702 | 2,377 | -73% | 1 | 1 | 0% | 1,501 | 1,315 | -12% | 0 | 0 | — |
case-01 | fail→fail | 2,540 | 7,256 | +186% | 1 | 1 | 0% | 340 | 1,110 | +226% | 0 | 0 | — |
case-02 | fail→fail | 8,203 | 4,358 | -47% | 1 | 1 | 0% | 1,375 | 1,121 | -18% | 0 | 0 | — |
case-03 | fail→fail | 8,356 | 4,183 | -50% | 1 | 1 | 0% | 1,330 | 1,126 | -15% | 0 | 0 | — |
case-04 | fail→pass | 5,155 | 4,217 | -18% | 1 | 1 | 0% | 838 | 1,576 | +88% | 0 | 0 | — |
case-05 | fail→pass | 15,109 | 9,578 | -37% | 1 | 1 | 0% | 2,634 | 1,939 | -26% | 0 | 0 | — |
case-06 | fail→fail | 5,307 | 5,749 | +8% | 1 | 1 | 0% | 816 | 1,222 | +50% | 0 | 0 | — |
case-07 | fail→fail | 7,933 | 6,180 | -22% | 1 | 1 | 0% | 1,424 | 1,265 | -11% | 0 | 0 | — |
case-08 | fail→fail | 8,273 | 2,748 | -67% | 1 | 1 | 0% | 1,401 | 1,362 | -3% | 0 | 0 | — |
case-09 | fail→pass | 8,383 | 3,674 | -56% | 1 | 1 | 0% | 1,270 | 1,505 | +19% | 0 | 0 | — |
case-21 | fail→pass | 9,643 | 3,858 | -60% | 1 | 1 | 0% | 1,541 | 1,554 | +1% | 0 | 0 | — |
case-10 | fail→pass | 10,258 | 3,810 | -63% | 1 | 1 | 0% | 1,659 | 1,556 | -6% | 0 | 0 | — |
case-11 | pass→pass | 5,328 | 7,235 | +36% | 1 | 1 | 0% | 838 | 1,515 | +81% | 0 | 0 | — |
case-12 | fail→fail | 2,753 | 2,363 | -14% | 1 | 1 | 0% | 486 | 1,347 | +177% | 0 | 0 | — |
case-13 | pass→pass | 7,175 | 2,725 | -62% | 1 | 1 | 0% | 1,127 | 1,395 | +24% | 0 | 0 | — |
case-14 | pass→fail | 6,364 | 4,177 | -34% | 1 | 1 | 0% | 981 | 1,088 | +11% | 0 | 0 | — |
case-15 | fail→pass | 4,714 | 2,020 | -57% | 1 | 1 | 0% | 860 | 1,243 | +45% | 0 | 0 | — |
case-16 | fail→pass | 9,720 | 5,224 | -46% | 1 | 1 | 0% | 1,559 | 1,768 | +13% | 0 | 0 | — |
case-17 | pass→pass | 9,607 | 2,455 | -74% | 1 | 1 | 0% | 1,635 | 1,259 | -23% | 0 | 0 | — |
case-18 | pass→pass | 10,193 | 3,793 | -63% | 1 | 1 | 0% | 1,789 | 1,587 | -11% | 0 | 0 | — |
case-19 | fail→pass | 5,415 | 1,631 | -70% | 1 | 1 | 0% | 935 | 1,195 | +28% | 0 | 0 | — |
case-22 | pass→pass | 5,212 | 1,911 | -63% | 1 | 1 | 0% | 840 | 1,241 | +48% | 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 17 counted toward the lift figure. The other 5 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 17 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.