diff --git a/.claude/commands/publish-version.md b/.claude/commands/publish-version.md
new file mode 100644
index 000000000..41bb85fc1
--- /dev/null
+++ b/.claude/commands/publish-version.md
@@ -0,0 +1,223 @@
+---
+description: Publish GSD updates to npm and GitHub
+---
+
+Publish GSD updates with automatic changelog generation.
+
+
+
+
+## 1. Check for Uncommitted Changes
+
+```bash
+git status --short
+```
+
+If uncommitted changes exist:
+- Ask: "Uncommitted changes detected. What commit message should I use?"
+- Commit with provided message
+- Continue to next step
+
+
+
+## 2. Get Commits Since Last Version
+
+```bash
+LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
+if [ -n "$LAST_TAG" ]; then
+ git log ${LAST_TAG}..HEAD --oneline --no-merges
+else
+ echo "No previous tags found"
+fi
+```
+
+Capture the commit list for changelog generation.
+
+
+
+## 3. Check Documentation Currency
+
+Review the commits captured above and check if README.md needs updates.
+
+**Check for commits that require README updates:**
+- New commands or features
+- Changed command behavior or flags
+- New configuration options
+- New workflows or processes
+- Deprecations or removals
+
+**Review README.md against commits:**
+1. Read README.md
+2. For each significant commit, verify the feature/change is documented
+3. Check command tables match actual commands
+4. Check configuration tables match actual options
+
+**If updates needed:**
+1. Draft specific README changes
+2. Present changes for approval
+3. Apply approved changes
+4. Commit: `git add README.md && git commit -m "docs: update README for vX.Y.Z"`
+
+**If no updates needed:**
+- State: "README is current with all changes"
+- Continue to next step
+
+
+
+## 4. Generate Changelog Entry Draft
+
+Analyze the commits and draft a curated changelog entry.
+
+**Grouping rules:**
+- **Added** — New features, commands, capabilities
+- **Changed** — Modifications to existing behavior
+- **Fixed** — Bug fixes
+- **Removed** — Deprecated/removed features
+- **BREAKING:** prefix for breaking changes
+
+**Writing rules:**
+- Write human-readable descriptions, not raw commit messages
+- Focus on user impact, not implementation details
+- Group related commits into single entries
+- Flag breaking changes prominently with **BREAKING:** prefix
+
+**Example draft:**
+```markdown
+## [X.Y.Z] - YYYY-MM-DD
+
+### Added
+- New `/gsd:whats-new` command for version awareness
+
+### Changed
+- Improved parallel execution performance
+
+### Fixed
+- STATE.md progress bar calculation
+
+### Removed
+- **BREAKING:** Removed deprecated ISSUES.md system
+```
+
+Present the draft for review.
+
+
+
+## 5. Review Changelog Draft
+
+**Drafted changelog entry:**
+[Show the generated draft]
+
+**Verify:**
+1. Categories are correct (Added/Changed/Fixed/Removed)
+2. Descriptions are clear and user-focused
+3. Breaking changes are marked with **BREAKING:** prefix
+4. Nothing important is missing from commits
+
+**Resume signal:** Type "approved" or provide edits
+
+
+
+## 6. Update CHANGELOG.md
+
+After approval:
+
+1. **Read current CHANGELOG.md**
+2. **Insert new version section** after [Unreleased] header
+3. **Update version links** at bottom:
+ - Add new version link: `[X.Y.Z]: https://github.com/gsd-build/gsd-2/releases/tag/vX.Y.Z`
+ - Update [Unreleased] comparison: `[Unreleased]: https://github.com/gsd-build/gsd-2/compare/vX.Y.Z...HEAD`
+
+```bash
+# Stage changelog
+git add CHANGELOG.md
+git commit -m "docs: update changelog for vX.Y.Z"
+```
+
+
+
+## 7. Bump Version
+
+Ask which version bump type:
+- `npm version patch` — Bug fixes (default)
+- `npm version minor` — New features
+- `npm version major` — Breaking changes
+- `npm version prerelease --preid=alpha` — Experimental features
+
+```bash
+npm version patch # or minor/major/prerelease
+```
+
+This creates a version commit and tag.
+
+
+
+## 8. Push and Publish
+
+```bash
+git push && git push --tags
+```
+
+Then publish to npm:
+
+```bash
+npm publish --access public
+```
+
+Verify the publish succeeded by checking the output for the package URL.
+
+
+
+## 9. Create GitHub Release
+
+Create a GitHub Release from the tag.
+
+```bash
+gh release create vX.Y.Z --title "vX.Y.Z" --notes "[changelog content]" --latest
+```
+
+Use the approved changelog content as the release notes.
+
+
+
+## 10. Post to Discord Changelog
+
+Post the changelog entry to the GSD Discord community.
+
+Use the Discord MCP server:
+```
+discord_execute("messages.send", {
+ "channel_id": "1464128246290579469",
+ "content": "**vX.Y.Z Released** \n\n[changelog content here]\n\nInstall/upgrade: `npx gsd-pi@latest`"
+})
+```
+
+Format the message with:
+- Version number as header
+- The approved changelog content (Added/Changed/Fixed/Removed sections)
+- Install command at the bottom
+
+
+
+## 11. Report Success
+
+```
+Published vX.Y.Z
+
+- npm: https://www.npmjs.com/package/gsd-pi
+- GitHub: https://github.com/gsd-build/gsd-2/releases/tag/vX.Y.Z
+```
+
+
+
+
+
+- README.md checked against commits and updated if needed
+- Changelog entry drafted from commits
+- User reviewed and approved entry
+- CHANGELOG.md updated and committed
+- Version bumped via npm version
+- Pushed to GitHub with tags
+- Published to npm via `npm publish`
+- GitHub Release created with `gh release create`
+- Changelog posted to Discord #changelog channel
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..5c1ce215a
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,119 @@
+# Changelog
+
+All notable changes to GSD are documented in this file.
+
+Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
+
+## [Unreleased]
+
+## [0.3.3] - 2026-03-11
+
+### Added
+- `/gsd next` step mode — walk through units one at a time with a wizard between each
+- `/gsd` bare command defaults to step mode
+- `/exit` command to kill the GSD process immediately
+- `/clear` as alias for `/new` (new session)
+- MCPorter extension for lazy on-demand MCP server integration
+- `/voice` extension for real-time speech-to-text
+- Pi global install scripts
+- Post-hook bookkeeping: auto-run doctor + rebuild STATE.md after each unit
+
+### Changed
+- Improved worktree merge, create, remove, and reload resilience
+- Discuss prompt rewritten with reflection step and depth enforcement
+
+### Fixed
+- Idle watchdog false-firing on active agents — tasks >10min no longer get incorrectly skipped (#52)
+- Browser screenshots constrained to 1568px max dimension (#56)
+- Pi extensions loaded from `~/.pi/agent/extensions/` (#51)
+
+### Removed
+- `/gsd-run` command (replaced by `/gsd` and `/gsd next`)
+
+## [0.3.1] - 2026-03-11
+
+### Fixed
+- Windows VT input restored after child processes exit (#41)
+- Print/JSON mode in cli.js so subagents don't hang
+- Discuss prompt loop prevention
+- Managed tools bootstrap and gh auth
+- Session list scoped to current working directory
+- Bash/bg_shell hang and kill issues on Windows (#40)
+- `/gsd-run` hardcoded `~/.pi/` path (#38)
+- Windows backspace in masked input + custom browser path support (#36, #34)
+
+### Changed
+- Renamed "Get Stuff Done" to "Get Shit Done"
+
+## [0.3.0] - 2026-03-11
+
+### Added
+- `/worktree` (`/wt`) — git worktree lifecycle management (#31)
+- `/gsd migrate` — `.planning` to `.gsd` migration tool (#28)
+
+### Fixed
+- Skipped API keys now persist so wizard doesn't repeat on every launch (#27)
+- Scoped models restored from settings on new session startup (#22)
+- Startup fallback no longer overwrites user's default model with Sonnet (#29)
+
+## [0.2.9] - 2026-03-11
+
+### Fixed
+- Idle recovery skips stuck units instead of silently stalling (#19)
+- `pkg/package.json` version synced with pi-coding-agent to prevent false update banner
+- Milestones with summary but no roadmap treated as complete (#13)
+
+## [0.2.8] - 2026-03-11
+
+### Added
+- Mac-tools extension (macOS native automation)
+
+## [0.2.6] - 2026-03-11
+
+### Fixed
+- Default model validated against full registry on every startup
+
+## [0.2.5] - 2026-03-11
+
+### Fixed
+- Circular self-dependency removed, default model set to anthropic/claude-sonnet-4-6 with thinking off
+
+## [0.2.4] - 2026-03-11
+
+### Added
+- Branded setup wizard UI with visual hierarchy, descriptions, and status feedback
+- Branded banner on first launch
+- Postinstall banner with version and next-step hint
+
+### Fixed
+- All `.pi/` paths updated to `.gsd/`
+- Default model matching by `id.includes('sonnet')` for dated API IDs
+- Circular gsd-pi self-dependency removed
+- Pi SDK version check suppressed
+- Selected options stay lit when notes field is focused
+
+## [0.1.6] - 2026-03-11
+
+### Added
+- GitHub extension tool suite with confirmation gate
+- Bundled skills: frontend-design, swiftui, debug-like-expert
+- Skills trigger table in system prompt
+- Resource loader syncs bundled skills to `~/.gsd/agent/skills/`
+
+### Fixed
+- `~/.gsd/agent/` paths in prompt templates instead of `~/.pi/agent/` (#10)
+- Guard against re-injecting discuss prompt when session already in flight
+
+### Changed
+- License updated to MIT
+
+[Unreleased]: https://github.com/gsd-build/gsd-2/compare/v0.3.3...HEAD
+[0.3.3]: https://github.com/gsd-build/gsd-2/compare/v0.3.1...v0.3.3
+[0.3.1]: https://github.com/gsd-build/gsd-2/compare/v0.3.0...v0.3.1
+[0.3.0]: https://github.com/gsd-build/gsd-2/compare/v0.2.9...v0.3.0
+[0.2.9]: https://github.com/gsd-build/gsd-2/compare/v0.2.8...v0.2.9
+[0.2.8]: https://github.com/gsd-build/gsd-2/compare/v0.2.6...v0.2.8
+[0.2.6]: https://github.com/gsd-build/gsd-2/compare/v0.2.5...v0.2.6
+[0.2.5]: https://github.com/gsd-build/gsd-2/compare/v0.2.4...v0.2.5
+[0.2.4]: https://github.com/gsd-build/gsd-2/compare/v0.1.6...v0.2.4
+[0.1.6]: https://github.com/gsd-build/gsd-2/releases/tag/v0.1.6