From swift-skills
Summarize what changed between the last two version tags of an iOS project. Reads git commits and prints a categorized release summary plus a paste-ready App Store Connect 'What's New' block. Pure git-based, no API calls. Usage: /ios-release-notes
How this skill is triggered — by the user, by Claude, or both
Slash command
/swift-skills:ios-release-notesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Print a user-friendly, always-consistent summary of what changed between the last two version tags of the current iOS project. Print only. No files written. No Notion. No API.
Print a user-friendly, always-consistent summary of what changed between the last two version tags of the current iOS project. Print only. No files written. No Notion. No API.
## What's New: v{PREV} → v{CUR}
**Range:** {PREV_DATE} → {CUR_DATE} · **Commits:** {N} · **Detected via:** {DETECTION_SOURCE}
### ✨ New Features
- {item}
### ⚡ Improvements
- {item}
### 🐛 Bug Fixes
- {item}
### 🔧 Under the Hood
- {item}
---
### 📋 App Store Connect — "What's New" (paste-ready)
```
{≤4 user-facing bullets, ≤30 chars each, no emojis, no periods}
```
---
<details>
<summary>Developer view: commit map ({N} commits)</summary>
| Hash | Subject | → Section |
|------|---------|-----------|
| {sha7} | {subject} | {section} |
</details>
Layout invariants — enforce these every run:
- No changes in this category.Run in parallel:
ls *.xcodeproj *.xcworkspace Package.swift 2>/dev/nullgit rev-parse --show-toplevel 2>/dev/nullIf neither iOS project marker exists, abort: "This skill must be run from the root of an iOS project (no .xcodeproj, .xcworkspace, or Package.swift found)."
If not inside a git repo, abort: "No git repository detected. This skill requires git history to summarize."
Try sources in priority order. Stop at the first that yields two distinct versions. Set DETECTION_SOURCE accordingly.
A. Git tags (preferred):
git tag --list --sort=-v:refname | grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$' | head -5
Take the top two. DETECTION_SOURCE = "git tags".
B. Single tag → first-release fallback:
git rev-list --max-parents=0 HEAD | head -1
PREV = initial commit, CUR = the only tag. DETECTION_SOURCE = "git tag → initial commit (first release)".
C. No tags → MARKETING_VERSION history:
git log -S"MARKETING_VERSION = " --pretty=format:"%H %ad" --date=short -- '*.pbxproj' | head -5
Identify the two most recent distinct version values. DETECTION_SOURCE = "MARKETING_VERSION (no tags)".
D. Info.plist CFBundleShortVersionString: Same approach against Info.plist files. DETECTION_SOURCE = "CFBundleShortVersionString (no tags)".
Total failure: abort with "Could not detect two versions. Tag a release (e.g. git tag v1.2.0) or set MARKETING_VERSION in your Xcode project."
Resolve dates: git log -1 --format=%ad --date=short {PREV} and the same for {CUR}.
grep -hE 'MARKETING_VERSION = [0-9]+\.[0-9]+' *.xcodeproj/project.pbxproj 2>/dev/null | sort -u
If the value in the working tree is greater than CUR, prepend a single line above the header:
Note: Project
MARKETING_VERSIONis{X}but no tag exists for it yet. This summary covers committed history throughv{CUR}.
git log {PREV}..{CUR} --pretty=format:"%H%x09%s%x09%ad" --date=short --no-merges
For first-release case, use {INITIAL_COMMIT}..{CUR}.
v{PREV} and v{CUR}. Are these the same commit?"150 commits → warn ("Found {N} commits — output may be long.") and proceed.
Each commit lands in exactly one of: feature, improvement, fix, chore.
Pass 1 — Conventional Commits (deterministic):
feat: / feature: → featurefix: / bugfix: → fixperf: / refactor: → improvementchore: / docs: / style: / test: / build: / ci: → chorePass 2 — Semantic classification (for unprefixed subjects):
add / introduce / implement / support + user-visible noun → featureimprove / speed up / polish / tweak / redesign → improvementfix / resolve / correct / prevent crash → fixSquash-merged PRs (subject like Merge PR #123: Big feature or Big feature (#123)) → one item, use the PR title.
For each item:
feat(auth): → drop feat(auth):).(#123)).Map to sections:
feature → ✨ New Featuresimprovement → ⚡ Improvementsfix → 🐛 Bug Fixeschore → 🔧 Under the HoodProduce ≤4 bullets, ≤30 chars each. Source priority:
Rules:
Print the assembled output exactly per the template. Do not write a file. Do not offer to log anywhere. Do not ask follow-up questions.
End the message with one line: "Run /ios-release-notes again after your next release to regenerate."
| Case | Handling |
|---|---|
| Not in iOS project | Abort in Step 1 |
| Not in git repo | Abort in Step 1 |
| No tags at all | Fall through to pbxproj / Info.plist (Step 2 C/D) |
| Only one tag | Compare against initial commit (Step 2 B) |
| Uncommitted version bump | Prepend "Note:" line (Step 3) |
| 0 commits in range | Abort with friendly message (Step 4) |
| >150 commits | Warn, proceed (Step 4) |
| Squash-merged PR | One item, use PR title (Step 5) |
| Many small commits | Dedupe overlapping bullets (Step 6) |
| Empty section | Render - No changes in this category. |
| All chores | Honest paste-ready label (Step 7) |
Bash (read-only git commands + grep) and Read (pbxproj / Info.plist when needed). No Write, no MCP, no WebSearch, no scheduling.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub moritztucher/swift-agent-skills --plugin swift-skills