Prepares and ships a new TablePro release — bumps version numbers in project.pbxproj, finalizes CHANGELOG.md, commits, tags, and pushes. Also handles separate plugin releases (Redis, Oracle, ClickHouse, DuckDB). Use this skill whenever the user says "release", "bump version", "ship version", "tag a release", "cut a release", or provides a version number they want to release (e.g., "/release 0.5.0", "/release plugin-oracle 1.0.0").
Automate the full release pipeline for TablePro. Supports two modes:
/release <version> — bumps versions, finalizes
changelog, commits, tags, and pushes./release plugin-<name> <version> — tags and
pushes a separate plugin bundle release./release <version> # App release (e.g., /release 0.5.0)
/release plugin-<name> <version> # Plugin release (e.g., /release plugin-oracle 1.0.0)
Before making any changes, verify ALL of the following. If any check fails, stop and tell the user what's wrong.
Version argument exists — the user must provide a semver version
(e.g., 0.5.0). If missing, ask for it.
Version is valid semver — must match X.Y.Z where X, Y, Z are
non-negative integers. Pre-release suffixes like -beta.1 or -rc.1
are allowed.
Version is newer — compare against the current MARKETING_VERSION
in project.pbxproj. The new version must be greater. Read the
current value:
Grep for "MARKETING_VERSION" in TablePro.xcodeproj/project.pbxproj
Tag doesn't exist — run git tag -l "v<version>" to confirm the
tag is available.
Working tree is clean — run git status --porcelain. If there are
uncommitted changes, warn the user and ask whether to proceed (the
release commit will include those changes).
Unreleased section has content — read CHANGELOG.md and verify
the ## [Unreleased] section has entries. If empty, warn the user
that the release will have no changelog entries.
On main branch — run git branch --show-current. Warn (but don't
block) if not on main.
SwiftLint passes — run swiftlint lint --strict. If there are
any warnings or errors, spawn a Task subagent to fix all issues
before continuing with the release. The subagent should run
swiftlint --fix first, then manually fix any remaining issues,
and verify with swiftlint lint --strict until clean.
File: TablePro.xcodeproj/project.pbxproj
Update the main app target only (Debug + Release configs = 2 lines each):
MARKETING_VERSION to the new version (e.g., 0.5.0)CURRENT_PROJECT_VERSION by 1 from its current valueDo NOT touch any other target's version lines. The pbxproj contains
many targets beyond the main app — all with MARKETING_VERSION = 1.0
and CURRENT_PROJECT_VERSION = 1:
Use replace_all: true for each edit — the main app target's version
values are always unique (e.g., MARKETING_VERSION = 0.16.1 and
CURRENT_PROJECT_VERSION = 30), distinct from the 1.0 / 1 used by
all other targets, so replace_all safely targets only the correct
occurrences.
Make these edits to CHANGELOG.md:
Convert Unreleased to versioned heading — replace:
## [Unreleased]
with:
## [Unreleased]
## [<version>] - <YYYY-MM-DD>
where <YYYY-MM-DD> is today's date.
Update footer links — at the bottom of the file:
Replace the [Unreleased] compare link:
[Unreleased]: https://github.com/TableProApp/TablePro/compare/v<old-version>...HEAD
with:
[Unreleased]: https://github.com/TableProApp/TablePro/compare/v<version>...HEAD
[<version>]: https://github.com/TableProApp/TablePro/compare/v<old-version>...v<version>
<old-version> is the previous release version (the one currently in
the [Unreleased] compare link).
Stage the changed files and commit:
git add TablePro.xcodeproj/project.pbxproj CHANGELOG.md docs/changelog.mdx docs/vi/changelog.mdx
git commit -m "$(cat <<'EOF'