A local-first, per-repo ticket board and git/PR pipeline, packaged so any repo
can adopt it by adding a dependency plus a little config — with no coupling to
any other repo. Each consuming repo owns its own tickets/ and events/.
It ships three pieces:
- MCP server (
ticket-workflow-mcp) —list_tickets,get_ticket,start_ticket,create_ticket,update_ticket,record_review,delete_ticket. Tickets are markdown files (frontmatter + body); the board is the filesystem, no database. - Bash hooks (
hooks/) — aPreToolUseguard (guard-bash.mjs) that blocks whole-tree staging and commits/pushes tomain, and aPostToolUsetracker (track-steps.mjs) that records pipeline milestones (branch, typecheck, lint, test, commit, PR) by watching the commands you run. - CLI viewer (
ticket-workflow) —listandshow <id>, rendering a ticket's pipeline from the same reducer the web board uses.
The pipeline a ticket flows through: Started · Branch · Typecheck · Lint · Tests · Review · Commit · PR · QA · Done.
The board root is resolved at runtime as
BOARD_DIR_OVERRIDE ?? CLAUDE_PROJECT_DIR ?? process.cwd(), then tickets/ and
events/ under it. Claude Code sets CLAUDE_PROJECT_DIR for both the MCP server
and the hooks, so both write to the same per-repo board. TICKETS_DIR_OVERRIDE
and EVENTS_DIR_OVERRIDE take precedence (used by tests).
Add the dependency (public, pinned by tag):
Wire the MCP server (.mcp.json) and the hooks + allowlist (.claude/settings.json);
see a consuming repo's config for the exact shape. Run npx ticket-workflow show <id>
to view a ticket's pipeline.
npm install # runs the prepare build
npm run typecheck
npm test
npm run build # emit dist/