plugin · v0.4.0
■ pmkit
Project management for development agents: issues, sprints and epics in one command set across trackers, starting with a local tracker kept in the repository.
Install
Add the marketplace and install pmkit with the Claude Code CLI.
/pmkit:setup
Set up pmkit in the project, or bring a setup in line with the installed version
/pmkit:upgrade
Update the installed pmkit plugin and move .issues/ to the current tracker format
/pmkit:help
See what pmkit can do here, explain a capability, or find the command for a task
/pmkit:backlog:groom
Find what is wrong with the backlog and fix what the user accepts
/pmkit:backlog:triage
Triage the issues nobody has looked at and apply the decisions the user accepts
/pmkit:cycle:plan
Plan the next sprint from velocity, capacity and the prioritized backlog
/pmkit:cycle:close
Close the active sprint, report planned against delivered, and move the unfinished issues
/pmkit:issues:create
Create an issue from an idea, refined into context, scope, tasks and acceptance criteria, with the fields checked against the project config
/pmkit:issues:capture
Open an issue from what the session found (an error, a failing test, a TODO), after a duplicate check
/pmkit:issues:update
Change the title, priority, estimate, labels or acceptance criteria of an issue
/pmkit:issues:breakdown
Break an issue into sub-issues with estimates, order and blockers
/pmkit:issues:link
Link two issues (blocks, related, duplicate), remove a link, or set a parent
/pmkit:issues:dependencies
Show what blocks an issue or an epic, with the blocker chain, the hierarchy and the critical path
/pmkit:issues:assign
Assign an issue to a member, to the user or to nobody
/pmkit:issues:find
Find issues with a plain-language question, such as "high-priority bugs in the current sprint"
/pmkit:issues:mine
List the issues assigned to the user, with the state of their pull requests and the next one to pick up
/pmkit:issues:work
Pick up an issue: claim it, branch, plan, implement, open the PR and move it to review
/pmkit:issues:progress
Post what was done on an issue as a comment, tick acceptance criteria and log the time spent
/pmkit:issues:comment
Add a comment to an issue
/pmkit:issues:pause
Pause work on an issue, leave a handoff note and push a draft PR when there is code
/pmkit:issues:move
Move an issue to a status category: in progress, in review, done
/pmkit:issues:summary
Summarize an issue or an epic from its record, comments and history
/pmkit:linear:customers
List and edit Linear customers (tier, revenue, size, status) and link customer requests to issues and projects
/pmkit:linear:triage-rotation
See who is on triage duty in Linear, change the rotation, and read Linear's Triage Intelligence suggestions
/pmkit:local:doctor
Check the tracker files, fix what can be fixed and resolve git conflict markers
/pmkit:local:render
Render a board, roadmap or sprint view of the tracker as Markdown or HTML for people outside the agent
/pmkit:local:migrate
Move the Local tracker to a Linear team, import a Linear team into .issues/, undo an export, or switch pmkit to the new tracker
/pmkit:report:release-notes
Write release notes for a release, a sprint or a period, and save them after you confirm
/pmkit:report:status
Draft a status update for an epic and publish it after approval
/pmkit:spec:import
Turn a spec or PRD into an epic with milestones, issues, sub-issues, estimates and blockers
/pmkit:team:flow-metrics
Show cycle time, lead time, throughput, aging and bug rate for a period, with the trend against the previous period
/pmkit:team:risk-radar
Blockers, stalled issues and PRs, late epics, epics without a recent status update and broken CI, in one read-only report
/pmkit:team:standup
Digest of what changed since the last business day, per person, with what needs attention
Project management for development agents: issues, sprints and epics in one command set across trackers. The agent calls one CLI, and an adapter translates to the team's tracker. The first tracker is the Local tracker, which keeps issues as files under .issues/ in the repository, with no account and no network.
CLI
Run node scripts/pmkit.mjs <command>. Every command takes --json and --root <dir>. Every write also takes --dry-run and --as <member>.
With auto_commit: true in .issues/config.yaml, each write commits the files it changed as pmkit: <command> <id>. With auto_commit: false, the default, no command commits. --dry-run, init, pr open and pr ready never commit.
| Command | Does |
|---|---|
init |
writes .pmkit/config.yaml and scaffolds .issues/; refuses to overwrite. Flags: --tracker local|linear, --git-host github|none, --workspace, --team, --status key=name, --field key=value, --type-label type=label, --prefix, --id-style random|numbered, --estimate-unit points|hours|sizes, --label name, --member id --name n --email e, --members-file f|- |
init --tracker linear |
reads the Linear workspace with the key in LINEAR_API_KEY, applies what it can infer, lists what it must ask and writes only .pmkit/config.yaml. --dry-run returns applied, questions and broken; the answers go back as --team, --status, --field and --type-label |
init --update |
edits only the lines its flags name and adds or updates the schema line in the config files; --replace <path> overwrites a template file that differs |
capabilities |
prints the capability manifest |
discover |
prints statuses with categories, types, priorities, labels, members and the estimate scale |
whoami |
prints the resolved actor |
issues list |
searches issues by text, category, type, assignee, label, sprint, parent, blocked state or date, oldest created first unless --sort says otherwise |
issues get <id> |
shows one issue, with --comments and --history |
issues dependencies <id> |
shows the blocker chain, the hierarchy and the critical path of an issue or an epic; only reads |
issues create |
creates an issue; takes --milestone and --release |
issues update <id> |
edits fields and acceptance criteria; --milestone, --release and --branch take none to clear |
issues move <id> <category> |
changes status by category |
issues assign <id> <member|me|none> |
assigns an issue; me is the actor |
issues link <from> <to> --kind blocks|related|duplicate |
links or unlinks (--remove) two issues |
issues parent <id> <parent|none> |
sets the parent |
issues comment <id> --body-file f |
adds a comment |
issues log-time <id> <minutes> |
logs time |
issues archive <id> |
archives an issue |
cycle list |
lists sprints |
cycle current |
prints the active sprint |
cycle issues <id> |
lists the issues of a sprint |
cycle open --start d |
opens a sprint; the end defaults from sprint_length_days |
cycle close <id> |
closes a sprint and prints the unfinished issues, with a warning for each issue file it could not read |
cycle add <id...> --to <sprint|current|none> |
moves issues into or out of a sprint; current is the active sprint |
cycle capacity <id> |
reads or sets capacity and days off (--set member=n,.., --days-off member=date+date,..) |
epic list |
lists epics |
epic get <id> |
shows one epic |
epic progress <id> |
counts the issues under an epic |
epic create --title t |
creates an epic |
epic update-status <id> --health h --body-file f |
publishes a status update |
epic updates <id> |
lists the status updates of an epic, newest first |
milestone list |
lists milestones, by due date |
milestone get <id> |
shows one milestone |
milestone create <id> |
creates a milestone; takes --name and --due |
release list |
lists releases, oldest version first; --state planned|released |
release get <id> |
shows one release |
release issues <id> [--archived] |
lists the issues of a release; --archived keeps the archived ones |
release create <id> |
creates a release; takes --name, --tag and --target |
release mark-released <id> |
marks a release released, lists its unfinished issues and warns when its tag is not in the repository; takes --tag |
release-notes [--release id | --sprint id|current | --since d [--until d]] |
the done issues of a release, a sprint or a period, grouped by type, with the basis it used; only reads |
docs read <path> |
prints a document under the docs folder |
docs create <path> --body-file f |
creates a document under the docs folder |
metrics velocity |
points or counts done per closed sprint, and the average |
metrics cycle-time |
median and p85 days from first in_progress to done |
metrics lead-time |
median and p85 days from creation to done |
metrics throughput |
issues done in a range, with a count per type |
metrics aging |
days since work started for each issue in in_progress or in_review at --until (default now), oldest first |
events |
prints all events in a range, for digests |
risks |
blockers, stalled issues and PRs, late epics, epics without a recent status update and broken CI; reads only. With git_host.system: none, or when gh is missing or logged out, it lists issues stalled by tracker activity and marks pull requests and CI as not checked |
issues branch <id> [--from branch] |
creates the issue branch from --from (default: git_host.default_branch) and records it on the issue |
pr open --issue <id> [--draft] [--body-file f] |
pushes the issue branch and opens a pull request; when the branch already has an open one, pushes and returns it with existing: true |
pr ready --issue <id> |
marks the open draft pull request of an issue ready for review |
pr status [--branch b] |
the pull request, checks and reviews of a branch (default: the current branch) |
pr sync |
moves in_review issues to done when their pull request is merged |
changelog --file f --since v |
prints the CHANGELOG.md sections newer than a version, oldest first; needs no config |
migrate |
moves the tracker files to the format this pmkit writes; --dry-run lists every file it would touch |
reindex |
rebuilds the query index in .issues/.cache/ from the issue files; changes only files git ignores |
render <board|roadmap|sprint> |
renders a view as Markdown or HTML to stdout, to --out f, or with --save to .issues/.cache/render/, which git ignores; never replaces a file it did not render |
validate |
checks every file and reference; problems are output, not errors |
The issues branch and pr commands need git_host.system: github in .pmkit/config.yaml and a logged-in gh. With git_host.system: none they fail with NOT_SUPPORTED, and without gh or its login they fail with NOT_CONFIGURED or AUTH. A missing or invalid git_host makes .pmkit/config.yaml invalid. Then issues branch, pr open, pr ready and pr sync refuse with INVALID_INPUT, as every write does, and pr status prints a warning and fails with NOT_SUPPORTED. Run node scripts/pmkit.mjs --help for every flag. A failing command exits with code 2 and, with --json, prints one JSON error with a next step. An exception that is not a PmkitError, which means a bug in pmkit, has the code UNEXPECTED and no next step.
Comments and time logs append an event to the issue's events.jsonl but leave issue.md alone, so they do not change the issue's updated timestamp.
Editors can check the config files against JSON Schemas. The schemas live in schemas/ (pmkit.config.schema.json for .pmkit/config.yaml and issues.config.schema.json for .issues/config.yaml). /pmkit:setup and init write a # yaml-language-server: $schema= line as the first line of each config file. The line points at the schemas on main on GitHub. The Red Hat YAML extension in VS Code and JetBrains IDEs read it, and the CLI ignores it.