Hyper PM
CLI reference

Tickets

ticket create, read, update, delete, work, comment, import-github — full CLI reference.

ticket create

FlagRequiredDescription
--title <t>yesTicket title
--story <id>noAttach to story; omit for an unlinked ticket (story must exist)
--body <b>noDescription (default empty string)
--id <id>noExplicit id (otherwise generated)
--status <s>nobacklog · todo · in_progress · done · cancelled (default todo)
--assignee <login>noGitHub login (normalized); one assignee per ticket
--branch <name>noLink a git branch; repeatable
--label <name>noPlanning label; repeatable
--depends-on <id>noPrerequisite ticket id (dependsOn); repeatable — validated (exists, not self, acyclic)
--priority <p>nolow · medium · high · urgent
--size <s>noxs · s · m · l · xl
--estimate <n>noNon-negative number (e.g. story points)
--start-at <iso>noPlanned start (startWorkAt), ISO-8601 instant
--target-finish-at <iso>noPlanned finish (targetFinishAt), ISO-8601 instant
--ai-draftnoDraft --body via AI; requires HYPER_PM_AI_API_KEY

ticket read

One ticket

Pass --id. JSON includes storyId (or null), assignee, linkedBranches, comments, prActivityRecent when present, and planning fields (labels, dependsOn, priority, size, estimate, startWorkAt, targetFinishAt) when set. If a prerequisite ticket is later deleted, dependsOn may still list its id until you edit dependencies.

List JSON rows include dependsOn when non-empty (same as labels / linkedBranches).

List tickets (omit --id)

Scope (mutually exclusive):

FlagMeaning
--story <id>Only tickets under this story
--epic <id>Only tickets whose story belongs to this epic
--without-storyOnly tickets without a story

Filters

FlagMeaning
--status <s>Repeatable — ticket matches if status is any listed value (backlog, todo, in_progress, done, cancelled)
--priority <p>Repeatable — OR match on priority
--size <s>Repeatable — OR match on size
--label <name>Repeatable — ticket must have every listed label
--estimate-min <n> / --estimate-max <n>Inclusive bounds on estimate
--start-after / --start-beforeISO-8601 inclusive bounds on startWorkAt
--target-finish-after / --target-finish-beforeISO-8601 inclusive bounds on targetFinishAt
--created-after / --created-beforeInclusive bounds on createdAt
--updated-after / --updated-beforeInclusive bounds on updatedAt
--status-changed-after / --status-changed-beforeInclusive bounds on statusChangedAt
--created-by / --updated-by / --status-changed-bySubstring match (case-sensitive) on actor fields
--title-contains <text>Case-insensitive substring on title
--github-linkedOnly tickets with a linked GitHub issue number
--branch <name>Normalized exact match on a linked branch
--depends-on <id>Only tickets whose dependsOn includes this ticket id (exact match after trim)

Sort (list mode only)

FlagMeaning
--sort-by <field>One of: id, title, status, storyId, createdAt, updatedAt, statusChangedAt, assignee, githubIssueNumber, lastPrActivityAt, priority, size, estimate, startWorkAt, targetFinishAt (default id)
--sort-dir <d>asc or desc (default asc; ties break on id ascending)

ticket update

FlagNotes
--id <id>Required
--title, --body, --statusStandard patches
--story <id>Attach to story (mutually exclusive with --unlink-story)
--unlink-storyClear story link
--assignee <login>Set assignee (mutually exclusive with --unassign)
--unassignClear assignee
--add-branch / --remove-branchRepeatable; mutually exclusive with --clear-branches
--clear-branchesRemove all linked branches
--add-label / --remove-labelRepeatable; mutually exclusive with --clear-labels
--clear-labelsRemove all labels
--add-depends-on / --remove-depends-onRepeatable; mutually exclusive with --clear-depends-on
--clear-depends-onRemove all dependsOn prerequisites
--priority, --size, --estimateSet planning fields; each has a matching --clear-*
--start-at / --clear-start-at, --target-finish-at / --clear-target-finish-atPlanned dates
--ai-improveRewrite --body with AI — requires --body and HYPER_PM_AI_API_KEY

ticket work

Runs in the primary clone (not the data worktree).

FlagRequiredDescription
--id <id>yesTicket to start
--branch <name>noPreferred local branch (default hyper-pm/<id>). If taken, suffixes -2, -3, … on the whole preferred name
--from <ref>noFork point; default: remote HEAD when present, else main, master, or HEAD

Creates and checks out the branch, sets ticket to in_progress, appends branch to linked branches. Rejects tickets already done or cancelled. Success JSON includes branch and, when suffixed, branchPreferred.

ticket comment

FlagRequired
--id <id>yes
--body <text>yes — non-empty after trim

ticket delete

FlagRequired
--id <id>yes

Soft-delete.

ticket import-github

Creates local tickets for GitHub issues not yet represented in hyper-pm.

FlagDescription
--dry-runList candidates and skips; no JSONL writes
--story <id>Attach every imported ticket to this story (must exist)
--state <s>open · closed · all (default all) — passed to GitHub’s issue list
--issue <n>Repeatable or comma-separated — only those issue numbers

Requires issueMapping: "ticket" in config. Skips pull requests, issues already linked to a ticket, and issues whose body contains a non-empty hyper_pm_id in the JSON fence. After a real import, run sync once so outbound sync can refresh GitHub bodies.

GitHub sync rules (assignees, when issues are created vs updated) are summarized on GitHub sync.