From architect
Manage a Linear project board: fetch issues, assess state, plan waves by dependency, and update issue status. Use for "/pm", "/pm status", "/pm plan", "/pm wave".
How this skill is triggered — by the user, by Claude, or both
Slash command
/architect:pmThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Fetch the Linear board, assess what is done/in-progress/blocked, build a dependency
Fetch the Linear board, assess what is done/in-progress/blocked, build a dependency graph, plan parallel work waves, and update issue states.
Preferred: Use Linear MCP tools when available (mcp__plugin_linear_linear_*).
Fallback: GraphQL via curl:
LINEAR_TOKEN=$(op-connect gc364u5r25bfme5mrvd3jj5yke credential)
curl -s -X POST https://api.linear.app/graphql \
-H "Authorization: $LINEAR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "<graphql>"}'
| Invocation | Action |
|---|---|
/pm | Full board overview: fetch, assess, and summarize |
/pm plan | Dependency graph + wave plan |
/pm wave | Show the current executable wave (no blockers) |
Determine the Linear team key from context:
docs/architect/master_intent.md for the active team key (e.g. HOARD)Fetch team details:
{
team(id: "<team-key-or-id>") {
id
name
key
projects { nodes { id name } }
states { nodes { id name type position } }
}
}
Alternative: query by key filter:
{
teams(filter: { key: { eq: "HOARD" } }) {
nodes { id name key states { nodes { id name type } } }
}
}
Query all issues for the team, including their state and blocker relations:
{
issues(
filter: { team: { key: { eq: "HOARD" } } }
orderBy: priority
) {
nodes {
identifier
title
priority
state { id name type }
blockedBy { nodes { identifier title state { name type } } }
blocks { nodes { identifier title } }
assignee { name }
estimate
labels { nodes { name } }
updatedAt
}
}
}
Build a local board map keyed by identifier.
Categorize issues by state type:
| State Type | State Names | Meaning |
|---|---|---|
unstarted | Backlog, Todo | Not yet started |
started | In Progress, In Review | Active work |
completed | Done | Finished |
cancelled | Cancelled | Dropped |
For each unstarted issue, check if it is blocked:
blockedBy issue that is NOT in completed stateReport:
Board: <team> (<N> issues)
Done: X
In Progress: X
In Review: X
Todo: X (Y unblocked, Z blocked)
Backlog: X
For each unstarted issue, resolve its full blocker chain:
Output the graph as a text tree:
Wave 1 (executable now):
HOARD-20 essence schema (P1)
HOARD-22 ledger table (P2)
Wave 2 (unblocked after Wave 1):
HOARD-26 RLS policies -- blocked by HOARD-20, HOARD-22
Wave 3:
HOARD-30 bootstrap -- blocked by HOARD-26
For the current wave, identify which items can run in parallel:
Output a parallel execution plan:
Current wave (can run in parallel):
Thread A: HOARD-20 -> HOARD-22
Thread B: HOARD-21 (independent)
Start here: HOARD-20, HOARD-21 (no blockers)
To move an issue to a new state:
{
team(id: "<team-id>") {
states { nodes { id name type } }
}
}
mutation {
issueUpdate(id: "<issue-id>", input: { stateId: "<state-id>" }) {
success
issue { identifier state { name } }
}
}
Or using MCP: mcp__plugin_linear_linear_update_issue
Confirm the update succeeded before reporting to the user.
BOARD: <team-name> (<N> total)
Done: X
In Progress: X
Todo: X (Y ready)
Blocked: Z
WAVE 1 (start now):
[HOARD-XX] Title (P1)
[HOARD-YY] Title (P2)
WAVE 2 (after wave 1):
[HOARD-ZZ] Title -- blocked by HOARD-XX
npx claudepluginhub jabberlockie/the-human-stack-plugins-public --plugin architectManages Linear issues, projects, and teams using MCP tools, linear CLI, and GraphQL API. Create, update, query issues; handle labels, status, references, and backlogs.
Manages Linear.app issues via Linearis CLI with JSON output: create, read, update, search issues; list teams/projects/cycles/labels/users; add comments.
Regenerates board overview dashboard by scanning open issues, computing health metrics, and updating the meta:board-overview issue. Use for on-demand board health refresh.