Plan-driven development for Claude Code: guarded branches, immutable plan records, and conventional-commit releases, shipped as a plugin. plankit is the plugin; pk is the command it installs.
The skills are the documentation. The same pages load as /plankit:
shortcuts in Claude Code and render in a terminal as pk help. The pk
binary holds every decision: the hooks that guard branches and
preserve plans, and the changelog and release machinery. Uninstall the
plugin and pk still does everything from a terminal.
Install
/plugin marketplace add https://plankit.com/marketplace.json
/plugin install plankit
The same marketplace file is attached to every GitHub release, so
https://github.com/markwharton/plankit/releases/latest/download/marketplace.json
works as the source too.
Then, in a repository you want plankit to manage:
pk init
A configured repository carries .pk.json, the committed policy.
docs/plans/ appears when the first plan is preserved. No .pk.json
means off: every hook exits immediately.
What it looks like
Generated when this page was built, by running pk in a scratch repository.
$ pk init
plankit configured in /private~/acme-app (created: .pk.json, tag v0.0.0)
Note: commit convention: Conventional Commits with types feat, fix, deprecate, revert, security, refactor, perf, docs, chore, test, build, ci, style (from .pk.json changelog.types)
Note: breaking markers (! or BREAKING CHANGE) are the developer's call: guard asks before one is committed
Note: every Claude Code session in this repository is briefed on this policy at start (pk brief shows the text)
Hint: commit .pk.json; run pk status to review the policy$ pk status
plankit status
project: /private~/acme-app
branch: develop (clean)
preserve: manual
guard: block (push: block, breaking: ask) on main
protect: docs/plans/ immutable
release: main
plans: 0 preserved
tag: v0.0.0$ pk brief
plankit is configured in this repository.
Commits follow Conventional Commits, type(scope): subject. Types: feat, fix, deprecate, revert, security, refactor, perf, docs, chore, test, build, ci, style (from .pk.json changelog.types).
Never add a breaking marker (! or BREAKING CHANGE) on your own judgment; only on explicit user direction. guard asks before one is committed.
main is protected: commits and pushes there are blocked. Pushing is the developer's action; do not push. Work on the development branch; releases merge into main with pk ship.
docs/plans/ is immutable. Approved plans are preserved there; preserve mode is manual, so run /plankit:preserve to commit a pending plan.
pk help lists every command.$ pk changelog --dry-run
Found 4 conventional commit(s)
Generating v0.1.0
## [v0.1.0] - 2026-09-06
### Added
- add passkey sign-in (5a4b073)
### Fixed
- expire entries on clock skew (f394005)
### Documentation
- describe the passkey flow (26c8145)
### Maintenance
- adopt plankit (a23e09f)$ Claude Code runs: git commit -m "feat!: drop the legacy session cookie"
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "ask",
"permissionDecisionReason": "pk guard: the commit message marks a breaking change (! or BREAKING CHANGE). That marker drives the next major version, and it is the developer's claim to make, not the agent's. Confirm the change is breaking, or reword the message without the marker."
}
}Commands
One page per command, the same page in the terminal as pk help <name>.
pk briefWhat each session is told about this repository's plankit policy at start, generated from .pk.jsonpk changelogGenerate CHANGELOG.md from conventional commits and stage a release with the Release-Tag trailerpk guardHow pk guard decides what an agent may do to git, and how to tune itpk helpShow documentation for pk and its commandspk initConfigure a repository for plankit - write .pk.json and baseline a tagpk pinUpdate a version pin in a file, for release hookspk preserveKeep each approved plan as a record in docs/plans, on approval or on requestpk protectWhy docs/plans is immutable and how pk protect enforces itpk releaseTag the pending release from the Release-Tag trailer and push it, with pre-flight checks and rollbackpk shipCut the pending work as one release - changelog then release in a single commandpk statusReport plankit configuration and repository statepk versionPrint the pk build versionLatest release: v0.30.0 · six platforms · marketplace.json