Project manager for GitHub issues: create structured issues optimized for LLM agent teams, triage and recommend what to work on next, audit and clean up stale issues, or deep-validate a single issue against the codebase. Triggers: create issue, plan work, new task, project manager, write ticket, draft issue, plan feature, plan project, start project, create ticket, review issue, pm.
From project-managernpx claudepluginhub rube-de/cc-skills --plugin project-managerThis skill is limited to using the following tools:
references/TEMPLATES.mdreferences/WORKFLOWS.mdGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
GitHub issue lifecycle: create, triage, audit, and review.
| Skill | Command | Description |
|---|---|---|
| Create | /pm or /pm -quick <desc> | Create structured issues optimized for agent execution |
| Next | /pm:next | Triage open issues — recommend what to work on next |
| Update | /pm:update | Audit open issues — find stale, orphaned, and drift |
| Review | /pm:review ISSUE_NUMBER | Deep-validate a single issue against the codebase |
/pm → Create a new issue (interactive flow)
/pm -quick fix the login → Create issue with smart defaults
/pm next → Triage: recommend next issue to work on
/pm:next → Same (alternate syntax)
/pm update → Audit: find stale/orphaned issues
/pm:update → Same (alternate syntax)
/pm review 42 → Review: validate issue #42 against codebase
/pm:review 42 → Same (alternate syntax)
Parse the first argument:
| Argument | Route to |
|---|---|
next | /pm:next sub-skill |
update | /pm:update sub-skill |
review | /pm:review sub-skill |
-quick [desc] | Create Issue Workflow (quick mode) below |
| anything else / empty | Create Issue Workflow below |
If routed to a sub-skill, invoke it with Skill and pass remaining arguments. Otherwise, continue with the Create Issue Workflow below.
Create structured GitHub issues optimized for LLM agent execution first, human readability second.
Every issue produced by this skill follows the Agent-Optimized Issue Format — structured sections with consistent headers, machine-parseable acceptance criteria, explicit file paths, verification methods, and clear scope boundaries.
This skill activates when users want to create work items for an agent team. Recognize these signals:
| Signal | Examples |
|---|---|
| Direct | "create an issue", "write a ticket", "plan this work" |
| Implicit | "we need to fix...", "let's add...", "can we refactor..." |
| Shorthand | "/pm", "project manager", "create task" |
| Flag | Description |
|---|---|
-quick | Quick mode — propose smart defaults instead of blocking on ambiguity |
Usage: /pm -quick add a delete button to user profiles
Parse the first argument for -quick. If present, activate quick mode. Everything after the flag is the task description.
1. Classify → 2. Discover → 3. Challenge → 4. Explore Codebase → 5. Draft → 6. Review → 7. Create
Use AskUserQuestion to determine the issue type:
Question: "What type of work is this?"
Options:
- Bug: Something is broken or behaving incorrectly
- Feature: New functionality or enhancement to existing behavior
- Epic: Large initiative requiring 3+ coordinated tasks
- Refactor: Improve code structure without changing behavior
- New Project: Build something from scratch (includes tech stack decisions)
- Chore/Research: Maintenance, dependency updates, spikes, investigations
If the user's initial message already makes the type obvious (e.g., "there's a crash when..."), skip this step and classify automatically. State your classification and proceed.
Run the question flow for the classified type. See references/WORKFLOWS.md.
Key principles:
AskUserQuestion for structured choices (max 4 questions per call, 2-4 options each)[AGENT-DECIDED: rationale][NEEDS CLARIFICATION: question] — don't guess on ambiguous requirementsAfter discovery, systematically check for underspecified requirements. See the Requirements Challenge Checklist in references/WORKFLOWS.md for the full dimension list.
Default mode (critical):
AskUserQuestion to probe each gap (batch related questions, max 4 per call)Quick mode (-quick):
[AGENT-DECIDED: rationale]Example — "add a delete button to user profiles":
Critical mode:
I need to clarify several details before drafting:
- Where on the profile page should the button go? (header actions, settings section, footer)
- Who can see it? (all users, admins only, own profile only)
- What happens on click? (immediate delete, confirmation dialog, soft delete)
- What are the visual states? (default, hover, disabled, loading)
- What about error handling? (network failure, permission denied)
Quick mode (-quick):
Here's what I'll assume — confirm or correct:
- Placement: profile header action bar, right-aligned
- Visibility: own profile only, admins on any profile
- On click: confirmation dialog → soft delete → redirect to home
- States: default (red outline), hover (red fill), loading (spinner), disabled (greyed, no permission)
- Errors: toast notification with retry option
Before drafting, explore the codebase to enrich the issue with concrete details:
Glob, Grep, and Read to drill into specific files identified during discovery — find files that need modification, understand current patterns, check for related work (TODOs, existing tests, related components), and verify that proposed changes don't conflict with existing code.This step is critical — agents executing the issue will perform better with accurate file paths and pattern-aware implementation hints.
Use the appropriate template from references/TEMPLATES.md.
Agent-first formatting rules:
VERIFY: [condition]src/auth/login.ts, not "the login file"Blocked by: #N and Blocks: #NWrite the draft to a temp file: /tmp/issue-body.md
Present the draft to the user with a summary:
Ask: "Ready to create this issue, or want to adjust anything?"
For epics: also present the sub-issue breakdown before creating.
Size label selection (before creating the issue):
Applies to: Feature, Epic sub-issue, New Project sub-issue, Refactor. Skips: Epic parent, New Project, Bug, Chore, Research.
Determine the size label deterministically from analysis already gathered in earlier steps.
Features — derive from Step 2 breadth signals and Step 3 structural change detection:
| Analysis result | Size label |
|---|---|
| 0 breadth signals, no structural changes | size/S |
| 1 breadth signal, no structural dependency retained | size/M |
| Structural dependency retained in single issue (user declined split) | size/L |
| Multi-story routed to Epic | No size label on parent; each sub-issue labeled independently |
Refactors — use target area from Refactor Flow Round 1, Question 2:
| Target area | Size label |
|---|---|
| Single file/function | size/S |
| Single module/component | size/M |
| Cross-module or architecture-level | size/L |
Epic sub-issues — derive from the decomposition table columns (Subsystems and Structural Changes recorded during Round 2 decomposition):
| Subsystems | Structural Changes | Size Label |
|---|---|---|
| Single | No | size/S |
| Single | Yes | size/M |
| Multiple | No | size/M |
| Multiple | Yes | size/L |
New Project sub-issues — use the same decomposition-based sizing as Epic sub-issues.
size/XLis intentionally excluded — work at that scale is always decomposed into an Epic with independently sized sub-issues.
# With size label (Feature, Epic sub-issue, New Project sub-issue, Refactor):
gh issue create --repo OWNER/REPO \
--title "<type-prefix>: <description>" \
--body-file /tmp/issue-body.md \
--label "<type-label>,<size-label>"
# Without size label (Bug, Epic parent, New Project parent, Chore, Research):
gh issue create --repo OWNER/REPO \
--title "<type-prefix>: <description>" \
--body-file /tmp/issue-body.md \
--label "<type-label>"
Title prefixes by type:
| Type | Prefix | Label | Size? |
|---|---|---|---|
| Bug | fix: | bug | No |
| Feature | feat: | enhancement | Yes |
| Epic | epic: | epic | No (sub-issues: Yes) |
| Refactor | refactor: | refactor | Yes |
| New Project | project: | project | No (sub-issues: Yes) |
| Chore | chore: | chore | No |
| Research | spike: | research | No |
On failure: Save draft to /tmp/issue-draft-{timestamp}.md, report error.
On success: Remove the temp file: rm -f /tmp/issue-body.md
For epics and new projects with sub-issues: create the parent issue first, then each sub-issue with Part of #PARENT_NUMBER in its body. After creating each sub-issue, formally link it to the parent via GitHub's Sub-Issues API so the parent's sidebar tracks completion progress:
# Get the sub-issue's REST ID (integer) and link it to the parent
sub_issue_id=$(gh api "repos/OWNER/REPO/issues/SUB_NUMBER" --jq .id)
gh api "repos/OWNER/REPO/issues/PARENT_NUMBER/sub_issues" \
--method POST -F "sub_issue_id=$sub_issue_id"
Use -F (capital F) for sub_issue_id — the API requires an integer, and -F sends it as a number while lowercase -f would send a string, causing a type error.
If either the sub_issue_id lookup or the POST to /sub_issues fails for a sub-issue (rate limit, plan doesn't support sub-issues, permissions), log the error and continue to the next sub-issue — don't abort the loop. Skip the POST if the ID lookup failed. The Part of #N markdown reference still provides a human-readable cross-reference even if the API link fails.
Clean up /tmp/issue-body.md only after all sub-issue creation and linking attempts have completed, even if some links failed.
Report all created issue URLs to the user.
Before creating any issue, verify:
[NEEDS CLARIFICATION: ...][AGENT-DECIDED: rationale]Before creating, always search for existing issues:
gh issue list --search "keywords" --state all --limit 10
If similar issue exists → inform user, suggest linking instead of duplicating.
Detect the current repo automatically:
gh repo view --json nameWithOwner -q .nameWithOwner
If not in a git repo or no remote → ask user for the target repo.