A complete project management pipeline for Claude Code — from product idea to structured GitHub project, powered by Notion and GitHub.
Idea → PRD → TRD → Bootstrap → GitHub → Build
Everything runs through a single command: /pm. It detects your environment (Claude Code vs Claude.ai/Desktop) and routes to the right action.
-
Create a PRD (
/pm create) — A guided interview captures product requirements: what you're building, why, for whom, and how you'll measure success. The PRD is saved to your Notion PRDs database with a Project Status dashboard and Project Board. -
Create a TRD (
/pm trd) — A technical interview builds the implementation plan: architecture, tool decisions, milestones, stories, and dependencies. The TRD is saved as a child page of the PRD in Notion. -
Mark as Ready (
/pm ready) — Validates the PRD and setsGitHub Ready = truein Notion. This is the gate between planning and execution. -
Bootstrap the Project (
/pm bootstrap) — Populates the Notion Project Board, creates GitHub milestones and issues with TDD checklists, builds a dependency map, cross-links everything, and generates a CLAUDE.md file. One atomic operation. -
Build — Use
/pm nextto find what to work on,/pm bugand/pm enhancementto track issues as they arise,/pm bughuntto investigate problems, and/pm statusfor project health checks.
| Full Mode (Claude Code) | Light Mode (Claude.ai / Desktop) | |
|---|---|---|
| Available actions | All 9 actions | create, trd, ready, status, bug, enhancement |
| GitHub integration | Yes (gh CLI) |
No — Notion board only |
| File system | Yes | No |
Skills read Notion database IDs from your project's CLAUDE.md (generated by /pm bootstrap). On first run, if no CLAUDE.md exists, the skill will ask for your Notion PRD database ID. No hardcoded IDs are stored in the skills themselves.
Inside any Claude Code session:
/plugin marketplace add paulmona/claude
Then run /plugin, find pm under the paulmona-claude marketplace, and install it.
To update after new releases:
/plugin update pm
cp commands/* ~/.claude/commands/
cp -r commands/pm-actions ~/.claude/commands//pm — Show menu (filtered by environment)
/pm create — Create PRD via guided interview
/pm trd [PRD ref] — Create TRD from PRD
/pm ready [PRD ref] — Mark PRD as GitHub Ready
/pm bootstrap [PRD ref] — Populate Notion board + GitHub milestones/issues
/pm status — Project health summary
/pm next — Recommend what to work on next
/pm bug ["description"] — File a bug
/pm enhancement ["desc"]— File an enhancement
/pm bughunt [#N or desc]— Investigate and root-cause a bug
After each action, /pm suggests the logical next step in the pipeline.
Guides you through a structured interview to create a Product Requirements Document and saves it to Notion.
What it does:
- Walks through 9 interview topics one at a time: name, problem, goals, non-goals, user stories, success metrics, stakeholders, open questions, and priority
- Coaches you to keep product and technical concerns separate — technical details are redirected to the TRD
- Probes thin answers with follow-up questions to get depth
- Flags production-only metrics that will need instrumentation
- Auto-numbers the PRD by scanning existing entries in Notion
- Drafts the full PRD in Markdown for review before saving
- Creates the page in your Notion PRDs database with Status: Draft
- Creates a Project Status dashboard and inline Project Board database as child pages
Output: A Notion page titled PRD-{NNN}: {Feature Name} with dashboard and board.
Guides you through a technical interview to create a Technical Requirements Document, then saves it as a child page of the PRD in Notion.
Usage: /pm trd PRD-009 or /pm trd "Feature name"
What it does:
- Locates the PRD in Notion and pulls its content for context
- Walks through 9 technical topics: architecture, tool decisions, interface mapping, observability, milestones, stories per milestone, dependencies, risks, and open questions
- Ensures observability is a dedicated milestone, not an afterthought
- Keeps stories atomic — if a story has "and" in it, it's probably two stories
- Can auto-generate interface mappings from OpenAPI specs or API docs
- Story IDs are sequential (S1, S2, S3...) with explicit dependency declarations
- Drafts the full TRD in Markdown for review before saving
- Creates the TRD as a child page of the PRD in Notion
- Updates the dashboard Quick Links with TRD reference
Output: A Notion page titled TRD: {Feature Name} nested under the PRD.
Validates a PRD and marks it as GitHub Ready in Notion — the gate between planning and execution.
Usage: /pm ready PRD-002 or /pm ready (lists available PRDs)
What it does:
- If no argument, searches Notion for Approved PRDs not yet marked GitHub Ready and presents the list
- Confirms with the user before making any changes
- Sets
GitHub Ready = trueon the PRD page in Notion - Updates the dashboard status section
Output: The PRD's GitHub Ready property is set to true.
The core action. Reads a PRD and TRD from Notion and generates a complete GitHub project structure in one operation. Full mode only.
Usage: /pm bootstrap PRD-002 paulmona/my-repo
What it does:
-
Pre-flight — Resolves the Notion database ID (from CLAUDE.md or asks), fetches the PRD (must be Approved + GitHub Ready), fetches the TRD (warns if missing), and runs a frontend requirements interview if the project has UI.
-
Notion Board — Populates the Project Board database with story cards from the TRD, including status, milestone, phase, dependencies, and type.
-
Milestones — Creates GitHub milestones from the TRD. Ensures full-stack coverage if the project has a frontend.
-
Issues — Decomposes each milestone into discrete, testable issues (1-4 hours each). Every build issue gets a paired test issue written first (TDD). Issues include user story, acceptance criteria, Definition of Done checklist, dependencies, and file ownership boundaries. Issues are presented one milestone at a time for review before creation. Each created issue is cross-linked to its Notion board card.
-
Dashboard — Updates the milestone progress table with actual counts from GitHub.
-
Dependency Map — Creates a pinned GitHub issue showing the full dependency graph organized into parallelizable phases.
-
CLAUDE.md — Generates and commits a project-specific CLAUDE.md with build commands, architecture docs, Notion IDs, git workflow rules, file ownership rules, and the Definition of Done.
Supports resuming — State is saved to .claude/pm-state.json after each step. If interrupted, running /pm bootstrap again detects the state file and offers to resume or start fresh.
Output: A fully structured GitHub project with Notion board cross-linked to GitHub issues.
Analyzes GitHub project state and recommends the highest-priority unblocked work. Full mode only.
Usage: /pm next paulmona/my-repo
What it does:
- Fetches all open milestones, issues, labels, and the pinned dependency map
- Reads Notion board for phase information
- Identifies the active milestone (earliest incomplete)
- Classifies issues as UNBLOCKED, BLOCKED, or IN PROGRESS
- Applies priority ordering: test before build (TDD), setup before features, bugs before enhancements
- Flags issues with missing milestones, labels, or DoD checklists
Output:
## Next — repo — date
### Active Milestone: M2: Core Build (60% — 6/10 issues)
### Recommended Next (unblocked, highest priority)
#14 Write failing tests for lead scoring — test issue, TDD requires this before #15
### Also Unblocked (can run in parallel)
#16 Implement API proxy endpoint
#18 Write failing tests for report generation
### Blocked
#15 Implement lead scoring — waiting on #14
### Flags
2 issues have no type label
Generates a health summary of the entire GitHub project.
Usage: /pm status paulmona/my-repo
What it does:
- Fetches all milestones (open and recently closed), all issues, and the dependency map
- Calculates per-milestone: % complete, open issues by type, blocked count, missing labels
- Tracks velocity: issues closed in last 7 and 30 days
- Estimates milestone completion at current pace
- Full mode: syncs live data back to the Notion dashboard
- Light mode: reads last synced state from Notion dashboard
Output:
## Project Status — repo — date
### Milestones
| Milestone | Progress | Open | Bugs | Blocked | Status |
|---|---|---|---|---|---|
| M1: Scaffolding | 100% | 0 | 0 | 0 | Complete |
| M2: Core Build | 60% (6/10) | 4 | 1 | 1 | Active |
| M3: Integration | 0% | 8 | 0 | 0 | Not started |
### Open Bugs / Blocked Issues / Health Flags / Velocity
Overall: Yellow — M2 progressing but 1 critical bug blocking #22
Creates a structured bug report. In Full mode, creates both a GitHub issue and a Notion board card. In Light mode, creates a Notion board card only.
Usage: /pm bug "Lead scoring returns null when company size is missing"
What it does:
- If no description provided, asks for one
- Asks for: repo (Full mode), related milestone, severity (Critical / High / Low)
- Creates a GitHub issue with: what's happening, what should happen, steps to reproduce, environment, and a TDD-based Definition of Done checklist
- Applies labels:
bug, severity, and feature label (F1/F2/F3) - Assigns to the relevant milestone
- Cross-links to Notion board card
Output: A labeled, milestone-assigned bug issue in GitHub + Notion board card.
Creates a structured enhancement request. In Full mode, creates both a GitHub issue and a Notion board card. In Light mode, creates a Notion board card only.
Usage: /pm enhancement "Add email notification when assessment report is ready"
What it does:
- If no description provided, asks for one
- Asks for: repo (Full mode), change type (existing behaviour or net-new), related milestone, priority (High / Medium / Low)
- Flags enhancements that don't fit an existing milestone — may need a new milestone or PRD update
- Creates a GitHub issue with: current behaviour, proposed behaviour, motivation, acceptance criteria, and Definition of Done checklist
- Applies labels:
enhancement, priority, and feature label - Assigns to the relevant milestone
- Cross-links to Notion board card
Output: A labeled, milestone-assigned enhancement issue in GitHub + Notion board card.
A structured investigation workflow for troubleshooting and root-causing bugs. Full mode only.
Usage: /pm bughunt #55 or /pm bughunt "app crashes on form submit" or /pm bughunt (browse open bugs)
What it does:
-
Identify — Fetches the bug from GitHub, or browses open bugs, or takes a description. Optionally creates a GitHub issue to track the investigation.
-
Gather Evidence — Asks for error output, logs, reproduction steps, observability data, environment, and recent changes. Asks only what's relevant, not all at once.
-
Investigate — Reproduces locally, traces the code path, forms hypotheses ranked by likelihood, and tests each one. Adds comments to GitHub after each hypothesis. Offers to pause after each hypothesis test.
-
Root Cause — Presents findings with root cause, affected code, and fix approach. Options: fix it now (TDD), document it, assign to a team, or save & exit.
-
Fix (if chosen) — Creates branch, writes failing test, commits, implements fix, runs full suite. All TDD.
Supports resuming — State saved to .claude/pm-state.json with full hypothesis history. Offers save & exit at every natural breakpoint.
Output: Root cause analysis, optionally a fix via PR, GitHub issue updated with findings.
All actions that create or resolve issues embed a strict Definition of Done:
- Failing test written first and committed before any implementation (TDD Red)
- Implementation written to make test pass (Green)
- Code refactored while keeping tests green
- Full test suite passes — no regressions
- Happy path: 100% test coverage
- Non-happy path: 100% target (edge cases can be lower, document exceptions)
- Error states: 100% — every error state handled AND tested, no exceptions
- No commented-out code
- No hardcoded values — config or constants only
- Every TODO references a GitHub issue number
- Functions are single-responsibility
- No issue = no work started, no exceptions
- Merged via PR — issue closed on merge only, not before
Install from claude.ai/claude-code.
Install and authenticate the GitHub CLI:
brew install gh
gh auth loginRequired for: bootstrap, next, status, bug, enhancement, bughunt.
The /pm skill uses Notion as its planning hub. All PRDs, TRDs, dashboards, and project boards live in Notion. GitHub handles execution (milestones, issues, code); Notion handles planning and status tracking.
Step 1 — Connect Notion to Claude Code
Enable the Notion MCP integration in your Claude Code settings. This gives Claude read/write access to your Notion workspace via MCP tools (notion-search, notion-create-pages, notion-update-page, notion-fetch, notion-create-database).
Step 2 — Create a PRDs database (or let /pm create do it)
On first run, /pm create will check for a PRD Database ID in your config. If none exists, it will offer to create the database for you in your Notion workspace.
If you prefer to create it manually, make a full-page Notion database with these properties:
| Property | Type | Values |
|---|---|---|
| Name | title | PRD-NNN: Feature Name |
| Status | select | Draft, In Review, Approved, Shelved |
| Priority | select | P0 - Now, P1 - Next, P2 - Later, Shelved |
| Category | select | Internal Ops, Client Demo, GTM |
| GitHub Ready | checkbox | true / false |
| Status Dashboard | URL | (auto-populated by /pm create) |
Step 3 — Save the database ID
Add the database ID to your ~/.claude/CLAUDE.md (for global access) or your project's CLAUDE.md (for per-project access):
## Notion
- PRD Database ID: your-database-id-hereTo find the database ID: open the database in Notion as a full page, copy the URL. The ID is the 32-character hex string before the ?v= parameter:
https://www.notion.so/workspace/YOUR_DATABASE_ID?v=...
| Artifact | Where | Created by |
|---|---|---|
| PRD pages | PRDs database | /pm create |
| Project Status dashboard | Child page of PRD | /pm create |
| Project Board (stories) | Inline database in dashboard | /pm create |
| TRD pages | Child page of PRD | /pm trd |
| Story cards | Project Board database | /pm bootstrap |
GitHub issues are cross-linked to Notion board cards. /pm status syncs live GitHub data back to the Notion dashboard.