/pm — Project management across the portfolio skill
When you want to manage projects across your businesses using a kanban + Eisenhower methodology.
by coreyhaines31·MIT license·★ 855 Stars on the repo·GitHub ↗
npx degit coreyhaines31/makerskills/skills/pm#main ~/.claude/skills/pmChecked ·commit main
Inside this skill
SKILL.md · the author's own words# /pm — Project management across the portfolio Methodology-first project management. Kanban + Eisenhower + async. One board per business. Tool-agnostic via adapters. ## Mental model Each business gets its own kanban with 5 columns: ``` Backlog → Ready → In Progress → Review/Blocked → Done/Archived ``` - **Backlog**: everything that *might* matter — not yet committed - **Ready**: triaged, well-defined, can be picked up - **In Progress**: actively being worked - **Review/Blocked**: waiting on someone else, review, or external dependency
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of /pm — Project management across the portfolio
Show the full text180 lines
/pm — Project management across the portfolio
Methodology-first project management. Kanban + Eisenhower + async. One board per business. Tool-agnostic via adapters.
Mental model
Each business gets its own kanban with 5 columns:
Backlog → Ready → In Progress → Review/Blocked → Done/Archived
- Backlog: everything that might matter — not yet committed
- Ready: triaged, well-defined, can be picked up
- In Progress: actively being worked
- Review/Blocked: waiting on someone else, review, or external dependency
- Done/Archived: shipped or killed
Eisenhower sits on top of the board — used to triage Backlog → Ready (which items make the cut) and to pick next from Ready (which Ready item to pull).
Urgent Not Urgent
Important Q1: Do Q2: Schedule ← Q2 is the high-leverage zone
Not Important Q3: Delegate Q4: Delete
Async-first: every status snapshot should read like a Loom you didn't have to record. Make work visible without requiring a meeting.
Step 1 — Detect mode and target
Parse the invocation:
| Invocation | Mode | Target |
|---|---|---|
/pm setup [business] |
setup | the named business |
/pm triage [business] |
triage | the named business (or ask) |
/pm next [business] |
next | the named business |
/pm next |
next | across all boards (cross-portfolio) |
/pm status [business] |
status | the named business (or ask) |
/pm unblock [business] |
unblock | the named business (or ask) |
/pm weekly |
weekly | all boards (Friday pulse) |
/pm weekly [business] |
weekly | the named business |
Step 2 — Load board config + personal overlay
Read ${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/boards.md (personal — real business list + tool mapping per business). Falls back to references/boards.md in the repo if the local file doesn't exist yet — that's a template.
Also try to load ${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/team.local.md if present — this is where the user lists partners, active clients, and typical blocker phrasings. Use it to make status output specific ("Waiting on <partner>'s review") instead of generic.
| Field | Example |
|---|---|
| business | <slug> |
| tool | notion / github / plane / linear / obsidian / manual |
| board_id or URL | tool-specific |
| column overrides | only if this board doesn't use the default 5 columns |
If the business has no mapping yet, jump to setup automatically — ask which tool, save the mapping, return to the requested mode.
Step 3 — Load the adapter
Read the relevant section of references/adapters.md for the tool. Each adapter section explains how to:
- List cards / issues / pages by column
- Read a single card's full content
- Create a card
- Move a card between columns
- Add a comment / note
Adapters use:
- Notion →
$NOTION_API_KEY(already in zshenv). Database withStatusselect property. - GitHub Projects →
ghCLI (already authed).gh project item-list,gh project item-edit. - Plane → Plane API (needs
$PLANE_API_KEYand workspace slug). - Linear → Linear MCP or API key.
- Obsidian → local kanban markdown files in the vault. Read/write directly.
- Manual → ask the user to paste the current board state; offer to write back to a local markdown file.
Step 4 — Run the mode
setup
- Ask which tool the business uses
- Walk through column setup (default 5 columns; offer custom)
- Save mapping to
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/boards.md(NOT toreferences/boards.mdin the repo — that's a template only). Create the parent directory if it doesn't exist yet. - Optionally seed the board with starter cards from a conversation about what's on the user's mind for that business
triage
- Pull the Backlog column
- Apply Eisenhower (Q1/Q2/Q3/Q4) — show the user the matrix view
- Recommend moves:
- Q1 (urgent + important) → move to Ready or In Progress now
- Q2 (important, not urgent) → move to Ready, schedule when
- Q3 (urgent, not important) → delegate (to whom?) or move to Ready if no one
- Q4 (neither) → archive
- Apply moves via the adapter (or output text the user applies manually)
next
- Single board: pull Ready, then In Progress. If WIP exceeded, surface what to finish first. If WIP available, recommend top Ready item by Eisenhower priority.
- Cross-portfolio (
/pm nextwith no business): pull Ready from every board, Eisenhower-rank, recommend top 1–3 across all businesses. Bias toward Q1 then Q2.
status
Generate an async-shareable snapshot:
# [Business] — Status as of YYYY-MM-DD
**Shipped this week:** N cards
- <card title>
- <card title>
**In progress:** N cards
- <card title> — <who/what>
**Review/Blocked:** N cards
- <card title> — blocked on <reason>
**Up next:** top 2–3 from Ready
- <card title>
- <card title>
**Open question:** <one thing that would unblock progress if answered>
Output is paste-ready for Slack, Notion, email, partner DM.
unblock
- Read everything in Review/Blocked
- For each card: surface the blocker, suggest an action (nudge X, escalate to Y, descope, kill, move back to In Progress if blocker is gone)
- Output a short list of moves
weekly
Friday pulse + planning:
- For each board: shipped this week, in progress, blocked
- Cross-portfolio: where's momentum? where's drift?
- Plan next week: 3–5 Q2 items to pull from Ready into In Progress on Monday
- Output the combined snapshot — pasteable into Notion weekly log, partner update, or personal journal
WIP limits
Default WIP per column (override in your local boards.md per business):
| Column | Default WIP |
|---|---|
| In Progress | 3 |
| Review/Blocked | (no limit — but flag if >5) |
If WIP exceeded in next mode, don't pull more — recommend finishing or moving something to Review/Blocked first.
Async-first writing rules
When generating status / weekly outputs:
- Lead with the headline — what shipped this week, or what's at risk
- Be specific — "shipped X" not "made progress on Y"
- No verbs without subjects — write so the reader can pick up cold
- Blockers name the blocker — "waiting on designer's review" not "blocked"
- Open questions are explicit — one bolded line per status that asks for what would unblock momentum
Composes with
decide— when a project hits a real decision, route to/decidedeep-research— when a card needs research before it's actionablebusiness-brainstorm— when an idea on the Backlog deserves pressure-testing before triagejab-hook— when status / shipped items become BIP-post material- Memory (
project_*.md) — for portfolio context per business
Notes on quality
- Limit WIP. Multitasking is the most reliable way to ship nothing. Cap In Progress at 3 (override in your local
boards.mdper business if truly needed). If the cap is hit, don't pull more — recommend finishing or moving something to Review/Blocked. - Lead with the headline in every status output — what shipped this week, or what's at risk. Not "made progress on X" — that's noise.
- Be specific. "Shipped the primary logo variant" beats "made progress on branding." Specificity signals real motion; vagueness signals none.
- No verbs without subjects. Write status so the reader can pick up cold — 3 weeks later or forwarded to a partner who missed the last update.
- Blockers name the blocker. "Waiting on designer's review of the homepage draft" — not "blocked." Blockers without names create no urgency.
- Open questions are explicit — one bolded line per status that asks for what would unblock momentum. Async momentum lives or dies on how well open questions are surfaced.
- Tool-agnostic by design. pm speaks Kanban + Eisenhower; the adapters (Notion / GitHub / Plane / Linear / Obsidian / manual) translate. Adding a new tool = one adapter file, not a rewrite.
| 1 | |
| 2 | name pm |
| 3 | description When you want to manage projects across your businesses using a kanban + Eisenhower methodology. One kanban per business (whatever portfolio of businesses, projects, or initiatives you run). Tool-agnostic — connects via API/MCP to whatever PM tool each business uses (Notion, GitHub Projects, Plane, Linear, Obsidian file-based, or manual mode). Async-first output. Six modes — setup (scaffold a new board for a business), triage (Eisenhower-sort the backlog), next (pick the next thing to work on, single board or across all), status (paste-ready async snapshot), unblock (diagnose Review/Blocked column), weekly (Friday pulse + week planning). Triggers on "/pm," "/pm setup," "/pm triage," "/pm next," "/pm status," "/pm unblock," "/pm weekly," "what should I work on next," "kanban status," "Eisenhower this," "triage my backlog," "what's blocked." |
| 4 | metadata |
| 5 | version 0.1.1 |
| 6 | |
| 7 | |
| 8 | # /pm — Project management across the portfolio |
| 9 | |
| 10 | Methodology-first project management. Kanban + Eisenhower + async. One board per business. Tool-agnostic via adapters. |
| 11 | |
| 12 | ## Mental model |
| 13 | |
| 14 | Each business gets its own kanban with 5 columns: |
| 15 | |
| 16 | |
| 17 | Backlog → Ready → In Progress → Review/Blocked → Done/Archived |
| 18 | |
| 19 | |
| 20 | **Backlog**: everything that *might* matter — not yet committed |
| 21 | **Ready**: triaged, well-defined, can be picked up |
| 22 | **In Progress**: actively being worked |
| 23 | **Review/Blocked**: waiting on someone else, review, or external dependency |
| 24 | **Done/Archived**: shipped or killed |
| 25 | |
| 26 | **Eisenhower** sits on top of the board — used to triage Backlog → Ready (which items make the cut) and to pick next from Ready (which Ready item to pull). |
| 27 | |
| 28 | |
| 29 | Urgent Not Urgent |
| 30 | Important Q1: Do Q2: Schedule ← Q2 is the high-leverage zone |
| 31 | Not Important Q3: Delegate Q4: Delete |
| 32 | |
| 33 | |
| 34 | **Async-first**: every status snapshot should read like a Loom you didn't have to record. Make work visible without requiring a meeting. |
| 35 | |
| 36 | ## Step 1 — Detect mode and target |
| 37 | |
| 38 | Parse the invocation: |
| 39 | |
| 40 | | Invocation | Mode | Target | |
| 41 | |---|---|---| |
| 42 | | `/pm setup [business]` | setup | the named business | |
| 43 | | `/pm triage [business]` | triage | the named business (or ask) | |
| 44 | | `/pm next [business]` | next | the named business | |
| 45 | | `/pm next` | next | **across all boards** (cross-portfolio) | |
| 46 | | `/pm status [business]` | status | the named business (or ask) | |
| 47 | | `/pm unblock [business]` | unblock | the named business (or ask) | |
| 48 | | `/pm weekly` | weekly | all boards (Friday pulse) | |
| 49 | | `/pm weekly [business]` | weekly | the named business | |
| 50 | |
| 51 | ## Step 2 — Load board config + personal overlay |
| 52 | |
| 53 | Read `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/boards.md` (personal — real business list + tool mapping per business). Falls back to `references/boards.md` in the repo if the local file doesn't exist yet — that's a template. |
| 54 | |
| 55 | Also try to load `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/team.local.md` if present — this is where the user lists partners, active clients, and typical blocker phrasings. Use it to make status output specific ("Waiting on <partner>'s review") instead of generic. |
| 56 | |
| 57 | | Field | Example | |
| 58 | |---|---| |
| 59 | | business | `<slug>` | |
| 60 | | tool | `notion` / `github` / `plane` / `linear` / `obsidian` / `manual` | |
| 61 | | board_id or URL | tool-specific | |
| 62 | | column overrides | only if this board doesn't use the default 5 columns | |
| 63 | |
| 64 | If the business has no mapping yet, jump to **setup** automatically — ask which tool, save the mapping, return to the requested mode. |
| 65 | |
| 66 | ## Step 3 — Load the adapter |
| 67 | |
| 68 | Read the relevant section of `references/adapters.md` for the tool. Each adapter section explains how to: |
| 69 | List cards / issues / pages by column |
| 70 | Read a single card's full content |
| 71 | Create a card |
| 72 | Move a card between columns |
| 73 | Add a comment / note |
| 74 | |
| 75 | Adapters use: |
| 76 | **Notion** → `$NOTION_API_KEY` (already in zshenv). Database with `Status` select property. |
| 77 | **GitHub Projects** → `gh` CLI (already authed). `gh project item-list`, `gh project item-edit`. |
| 78 | **Plane** → Plane API (needs `$PLANE_API_KEY` and workspace slug). |
| 79 | **Linear** → Linear MCP or API key. |
| 80 | **Obsidian** → local kanban markdown files in the vault. Read/write directly. |
| 81 | **Manual** → ask the user to paste the current board state; offer to write back to a local markdown file. |
| 82 | |
| 83 | ## Step 4 — Run the mode |
| 84 | |
| 85 | ### setup |
| 86 | Ask which tool the business uses |
| 87 | Walk through column setup (default 5 columns; offer custom) |
| 88 | Save mapping to `${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/pm/boards.md` (NOT to `references/boards.md` in the repo — that's a template only). Create the parent directory if it doesn't exist yet. |
| 89 | Optionally seed the board with starter cards from a conversation about what's on the user's mind for that business |
| 90 | |
| 91 | ### triage |
| 92 | Pull the Backlog column |
| 93 | Apply Eisenhower (Q1/Q2/Q3/Q4) — show the user the matrix view |
| 94 | Recommend moves: |
| 95 | Q1 (urgent + important) → move to Ready or In Progress now |
| 96 | Q2 (important, not urgent) → move to Ready, schedule when |
| 97 | Q3 (urgent, not important) → delegate (to whom?) or move to Ready if no one |
| 98 | Q4 (neither) → archive |
| 99 | Apply moves via the adapter (or output text the user applies manually) |
| 100 | |
| 101 | ### next |
| 102 | **Single board**: pull Ready, then In Progress. If WIP exceeded, surface what to finish first. If WIP available, recommend top Ready item by Eisenhower priority. |
| 103 | **Cross-portfolio** (`/pm next` with no business): pull Ready from every board, Eisenhower-rank, recommend top 1–3 across all businesses. Bias toward Q1 then Q2. |
| 104 | |
| 105 | ### status |
| 106 | Generate an async-shareable snapshot: |
| 107 | |
| 108 | |
| 109 | # [Business] — Status as of YYYY-MM-DD |
| 110 | |
| 111 | **Shipped this week:** N cards |
| 112 | - <card title> |
| 113 | - <card title> |
| 114 | |
| 115 | **In progress:** N cards |
| 116 | - <card title> — <who/what> |
| 117 | |
| 118 | **Review/Blocked:** N cards |
| 119 | - <card title> — blocked on <reason> |
| 120 | |
| 121 | **Up next:** top 2–3 from Ready |
| 122 | - <card title> |
| 123 | - <card title> |
| 124 | |
| 125 | **Open question:** <one thing that would unblock progress if answered> |
| 126 | |
| 127 | |
| 128 | Output is paste-ready for Slack, Notion, email, partner DM. |
| 129 | |
| 130 | ### unblock |
| 131 | Read everything in Review/Blocked |
| 132 | For each card: surface the blocker, suggest an action (nudge X, escalate to Y, descope, kill, move back to In Progress if blocker is gone) |
| 133 | Output a short list of moves |
| 134 | |
| 135 | ### weekly |
| 136 | **Friday pulse + planning**: |
| 137 | For each board: shipped this week, in progress, blocked |
| 138 | Cross-portfolio: where's momentum? where's drift? |
| 139 | Plan next week: 3–5 Q2 items to pull from Ready into In Progress on Monday |
| 140 | Output the combined snapshot — pasteable into Notion weekly log, partner update, or personal journal |
| 141 | |
| 142 | ## WIP limits |
| 143 | |
| 144 | Default WIP per column (override in your local `boards.md` per business): |
| 145 | |
| 146 | | Column | Default WIP | |
| 147 | |---|---| |
| 148 | | In Progress | 3 | |
| 149 | | Review/Blocked | (no limit — but flag if >5) | |
| 150 | |
| 151 | If WIP exceeded in `next` mode, **don't pull more** — recommend finishing or moving something to Review/Blocked first. |
| 152 | |
| 153 | ## Async-first writing rules |
| 154 | |
| 155 | When generating status / weekly outputs: |
| 156 | |
| 157 | **Lead with the headline** — what shipped this week, or what's at risk |
| 158 | **Be specific** — "shipped X" not "made progress on Y" |
| 159 | **No verbs without subjects** — write so the reader can pick up cold |
| 160 | **Blockers name the blocker** — "waiting on designer's review" not "blocked" |
| 161 | **Open questions are explicit** — one bolded line per status that asks for what would unblock momentum |
| 162 | |
| 163 | ## Composes with |
| 164 | |
| 165 | `decide` — when a project hits a real decision, route to `/decide` |
| 166 | `deep-research` — when a card needs research before it's actionable |
| 167 | `business-brainstorm` — when an idea on the Backlog deserves pressure-testing before triage |
| 168 | `jab-hook` — when status / shipped items become BIP-post material |
| 169 | Memory (`project_*.md`) — for portfolio context per business |
| 170 | |
| 171 | ## Notes on quality |
| 172 | |
| 173 | **Limit WIP.** Multitasking is the most reliable way to ship nothing. Cap In Progress at 3 (override in your local `boards.md` per business if truly needed). If the cap is hit, don't pull more — recommend finishing or moving something to Review/Blocked. |
| 174 | **Lead with the headline** in every status output — what shipped this week, or what's at risk. Not "made progress on X" — that's noise. |
| 175 | **Be specific.** "Shipped the primary logo variant" beats "made progress on branding." Specificity signals real motion; vagueness signals none. |
| 176 | **No verbs without subjects.** Write status so the reader can pick up cold — 3 weeks later or forwarded to a partner who missed the last update. |
| 177 | **Blockers name the blocker.** "Waiting on designer's review of the homepage draft" — not "blocked." Blockers without names create no urgency. |
| 178 | **Open questions are explicit** — one bolded line per status that asks for what would unblock momentum. Async momentum lives or dies on how well open questions are surfaced. |
| 179 | **Tool-agnostic by design.** pm speaks Kanban + Eisenhower; the adapters (Notion / GitHub / Plane / Linear / Obsidian / manual) translate. Adding a new tool = one adapter file, not a rewrite. |
| 180 |
Discussion
Alternatives
Browse more free Claude skills or everything in Product.