Introduction
Architecture
How the data branch, JSONL log, worktrees, and projections fit together.
High-level flow
initcreates or adopts an orphan branch (no parent commit) that holds hyper-pm data, and writes.hyper-pm/config.jsonin your working tree.- Most mutating commands run against a temporary Git worktree checked out at the data branch, append one or more lines to the event log, commit, and optionally push — your primary branch is untouched.
- Reads replay the log (with schema versioning) into an in-memory projection of epics, stories, tickets, and sync cursors.
Repository layout (conceptual)
events.jsonl (append-only)
… other durable files as the tool evolves
main application tree (unchanged by PM data writes)
Exact filenames on the data branch are owned by the CLI implementation; treat them as opaque except through supported commands.
Event sourcing mindset
Think of the JSONL file as an append-only journal:
- Each line is a typed event (for example
TicketCreated,GithubInboundUpdate). - Deleting entities is modeled as soft deletes via events, not
rmon rows. doctorvalidates that the log can be read and replayed; use it in CI or before releases if you rely on automation.
Sync as a side channel
GitHub is a projection target, not the source of truth for hyper-pm’s core model. Outbound sync updates issues; inbound sync (full mode) translates issue changes back into events when they differ from what hyper-pm last wrote.
Wrappers share one binary
hyper-pm-web and hyper-pm-mcp spawn the same bundled CLI (dist/main.cjs) that you would run in a shell. That keeps UI, agents, and scripts aligned — there is no second implementation of business rules in the web layer.