plankit

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.

Configure a 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
See the state
$ 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
What every session is told at start
$ 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.
Preview the release
$ 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)
Guard asks before a breaking marker is committed
$ 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>.

Latest release: v0.30.0 · six platforms · marketplace.json