Release notes
What's new in pk, and how to use it.
v0.19.0 — 2026-05-07 — Private repos and init polish
/new-plankit-project now supports private repos. Pass private <org> to create a private repo under a GitHub org. The emitted script handles the differences: no license file, --private flag, empty anchor commit, and org-scoped paths.
/init’s question format was also simplified, restoring one-at-a-time presentation.
v0.18.0 — 2026-05-06 — /ship auto
Type /ship auto and the release workflow runs end-to-end without pausing. Same dry-run safety checks at each step — if either preview hits an error, it stops and asks. Otherwise: changelog, tag, merge, push, done.
Also new: a versioning guide covering how to flow tag-derived versions into project files — versionFiles for JSON, pk pin --name for source constants, ldflags for build-time injection, and hook scripts for frameworks with no built-in version sync.
v0.17.0 — 2026-05-05 — flexible version pinning
pk pin --name pins versions in any file with an identifier assignment, not just shell variables. A Go project with const version = "0.1.0" in main.go can now use:
"preCommit": "pk pin --file cmd/myapp/main.go --name version $VERSION"
Works with Go constants, Python __version__, TOML version fields, and anything else that assigns a quoted string. The v-prefix is inferred from the existing value — bare stays bare, prefixed stays prefixed. The legacy shell-variable pattern (PK_VERSION="v...") still works without --name, unchanged.
v0.16.0 — 2026-05-02 — setup that remembers
pk setup now preserves your mode configuration. Previously, re-running pk setup after upgrading would silently reset --guard and --preserve to their defaults. Now it infers the current modes from your existing settings.json. Pass --guard or --preserve explicitly only when you want to change them.
/init works without pk setup. If CLAUDE.md doesn't exist when you run /init, it creates the Critical Rules header for you and continues. No more chicken-and-egg between setup and init.
$VERSION in .pk.json lifecycle hooks now works on Windows, macOS, and Linux. pk pre-expands variables before passing the command to the shell, so hook authors write $VERSION once and it works everywhere.
v0.15.1 — 2026-04-30 — fewer skills, same workflow
pk setup now installs three skills instead of five — /init, /preserve, and /ship. The standalone /changelog and /release skills are gone, since /ship already chained both with preview+confirm at each step. If you were using /changelog followed by /release, switch to /ship. The underlying pk changelog and pk release CLI commands are unchanged — power users who type them directly won't notice a difference.
The methodology has been restructured into 14 scannable sections — same content, less essay. Silent semantic narrowing — Claude's habit of adding defensive bounds that quietly drop data — is now documented as an anti-pattern.
v0.15.0 — 2026-04-28 — self-cleaning setup, trunk releases, methodology refresh
Run pk setup after upgrading and it now removes managed files that newer pk versions have deprecated — but only if you haven't touched them. The pk_sha256 hash gates the removal: customized files are preserved with a warning, and files you authored yourself are left alone.
Trunk-based projects are now first-class in /ship. If your repo commits directly to a single branch with no develop→main split, omit release.branch from .pk.json and pk release tags HEAD, pushes the branch and tag, no merge step. The docs and the /ship skill text now cover both the trunk flow and the merge flow side by side, without presuming one.
The methodology picks up two pieces. A new section, “Discipline as the multiplier,” frames plankit's pieces — plan, rules, review, tests, model execution — as one system: the result of plan-driven AI work belongs to the system, not to the model alone. “Reviewing the plan” now covers what's actually in a plan — approach, scope, code excerpts, verification — and names the most common AI-introduced bug to scan for at the code layer: silent semantic narrowing. Defensive LIMIT N, --max-count=N, head -n N, filters that drop legitimate values, loops that break on first match.
v0.14.1 — 2026-04-24 — sandbox tag fetch, /ship undo note
Claude Code on the web now sees your version tags. The SessionStart bootstrap runs a best-effort git fetch --tags right after installing pk, so pk changelog and pk release have the history they need. The sandbox used to clone only the working branch, so pk changelog failed with “no version tags found” and pointed you at creating a baseline — wrong advice when tags already existed on origin. That error now tells you to run git fetch --tags instead; baseline advice still appears when origin is actually bare.
v0.14.2 and v0.14.3 smoothed two more sandbox bootstrap rough edges that only surfaced once we could test in the cloud.
If you change your mind after pk changelog but before pk release, /ship now reaches for pk changelog --undo to unwind cleanly — no more improvising with git reset.
v0.14.0 — 2026-04-23 — tamper-checked binaries, tidier upgrades
install-pk.sh now fetches checksums.txt alongside the binary and verifies the SHA256 before installing — no more wondering whether a network hop tampered with the download, and if sha256sum is missing, install fails loudly rather than silently installing an unverified binary. And when pk setup actually updates a managed file, it now suggests committing those changes on their own: chore(pk): update managed files for v<VERSION>, so pk-upgrade churn stays distinguishable from feature work in your history.
pk teardown used to silently skip plankit hook removal if it couldn’t parse a settings file; now it logs the path and category before continuing, so you can see what it can’t clean up. There’s also a new methodology section, when the model shifts, on working with plankit across Claude model changes.
v0.13.1 — 2026-04-22 — /preserve polish + settings.json safety
Typing /preserve right after approving a plan now saves it immediately — no dry-run preview, no extra confirmation. The plan was already approved; preserving it is just bookkeeping. A new .git/pk-pending-plan pointer also makes /preserve pick the correct plan when two Claude sessions have plans open in parallel; before, it sometimes grabbed whichever file in the shared ~/.claude/plans/ had the freshest mtime.
pk setup now keeps its hands off .claude/settings.json. It no longer rewrites the file with alphabetical key order, and it no longer silently drops hook-object fields it didn’t recognize — whether those come from another tool or a future Claude Code release. Key order is your choice; unknown fields survive.
v0.13.0 — 2026-04-21 — /ship skill
Cutting a release is now one command. Run /ship in Claude Code and it chains /changelog → /release, keeping the preview-and-confirm gate on each step so nothing lands unreviewed. If the release half fails, rerun /ship — it reads the Release-Tag trailer on HEAD and resumes from the release step. pk setup installs it alongside the other managed skills.
v0.12.0 — 2026-04-19 — clearer errors and better nudges
Run pk setup in a repo without a version tag and it now nudges you toward pk setup --baseline — the one-step way to anchor pk changelog. When pk version notices an update after a go install bump, it suggests re-running pk setup so your project's pinned install-pk.sh stays in sync. Error messages got friendlier across the board: pk changelog outside a git repo, pk release with an unpushed source branch, and pk version's semver output. Paired guidance for server-side enforcement lives in the new branch protection guide.
v0.11.1 — 2026-04-19 — polish and a repo split
The pk setup tip that appears when no version tags exist is now conditional — trunk-based projects don't get pushed toward --baseline. The pk changelog error for missing tags mentions --at <ref> inline, so late adopters discover the flag at the moment they need it. The plankit site now lives at github.com/markwharton/plankit.com, separate from the CLI repo.
v0.11.0 — 2026-04-18 — pk setup --baseline
Anchoring pk changelog is now one command. If your project uses versioned releases, run pk setup --baseline --push — it tags v0.0.0 on HEAD and publishes the tag. Works on new repos and existing ones; pass --at <ref> to fold prior commits into the first changelog entry. Trunk-based projects can skip it. Bonus: /preserve now continues with implementation after saving a plan.
Full history in the CHANGELOG on GitHub.