From beads-planner
Decomposes GitHub issues into structured Beads epics, tasks, and sub-tasks with objectively verifiable acceptance criteria and dependencies. Useful for planning actionable work in Beads projects.
npx claudepluginhub jbdamask/john-claude-skills --plugin beads-plannerThis skill uses the workspace's default tool permissions.
Converts a GitHub issue into a structured Beads work breakdown with epics, tasks, and sub-tasks - each with 3-5 objectively verifiable acceptance criteria. All beads must have relationships and dependencies mapped out.
Provides Beads (bd CLI) reference for issue types, statuses, priorities, dependencies, hierarchies, and commands. Use when creating, editing, or managing git-backed beads issues via bd.
Tracks tasks and issues via git-backed bd CLI. Create, list, update with dependencies, sync to git, and run hygiene commands for sprint planning and project organization.
Share bugs, ideas, or general feedback.
Converts a GitHub issue into a structured Beads work breakdown with epics, tasks, and sub-tasks - each with 3-5 objectively verifiable acceptance criteria. All beads must have relationships and dependencies mapped out.
bd init already run)bd CLI must be available on PATHgh CLI must be authenticated for the target GitHub repo.beads/AGENTS.md file — read it first, as its acceptance criteria conventions and landing-the-plane workflow take precedence over this skill's defaultsGitHub Issue → Fetch → Branch & Worktree → Plan-Only → Work Breakdown → File Beads → Review & Refine (up to 5x) → Handoff
The skill operates in seven phases:
Accept any of these input formats:
#42 or 42https://github.com/owner/repo/issues/42myorg/myrepo#42Fetch the issue using gh:
gh issue view <number> --json title,body,labels,assignees,milestone,comments --repo <owner/repo>
If --repo is not specified, gh will use the current directory's git remote. If the fetch fails, ask the user for the correct repo.
Also fetch any linked issues or referenced PRs mentioned in the body to build context.
After fetching, present a brief summary to the user covering: the issue's goal, key requirements, constraints, and any open questions or ambiguities you noticed. This sets the stage for planning.
After fetching the issue, create a dedicated branch and worktree so all Beads work happens in isolation from the main branch.
Derive the branch name from the issue number and title:
<issue-number>-<slugified-title>
For example, issue #42 titled "Add user authentication" becomes 42-add-user-authentication. Keep the slug short — truncate to ~50 characters if needed.
# Create the branch from the current HEAD
git branch <branch-name>
# Check out a worktree for the branch
git worktree add ../<branch-name> <branch-name>
The worktree is created as a sibling directory to the current repo. After creating it, all subsequent work (planning, filing beads, syncing) must happen inside the worktree directory.
If a branch or worktree with that name already exists, ask the user whether to reuse it or pick a different name.
IMPORTANT: Do NOT use EnterPlanMode or built-in plan mode. Built-in plan mode auto-executes after approval, which is not what we want here.
Load the plan-only skill using the Skill tool:
Skill: beads-planner:plan-only
The plan-only skill will:
.claude/plans/<slug>.mdOnce the plan-only skill completes and the user has approved the plan, copy the plan file into the project's .plan directory so it persists as a project artifact:
mkdir -p .plan
# Find the plan file that plan-only just wrote (most recent file in .claude/plans/)
ls -t .claude/plans/*.md | head -1
# Copy it with the issue-derived name
cp <plan-file> .plan/<issue-number>-<slug>.md
Use the issue number and slug from Phase 2 for the destination filename (e.g., .plan/42-add-user-authentication.md). The source file is whatever plan-only actually wrote — do not assume its slug matches the branch slug. Find the most recently created .md file in .claude/plans/ and use that.
Then proceed to Phase 4. The plan file serves as a reference for the work breakdown — it is not a trigger for implementation.
If the user rejects the plan, stop the entire workflow.
Using the approved plan as a foundation, propose the Beads work breakdown. This is where the plan gets translated into concrete, trackable work items.
Present a draft work breakdown structured as:
Epic: [Title derived from issue]
├── Task 1: [Title]
│ ├── Acceptance Criteria: [verifiable criteria]
│ └── Blocked by: —
├── Task 2: [Title]
│ ├── Acceptance Criteria: [verifiable criteria]
│ └── Blocked by: Task 1
└── Task 3: [Title]
├── Acceptance Criteria: [verifiable criteria]
└── Blocked by: — (can parallelize with Task 1)
Pay careful attention to:
bd ready.Solicit feedback on the breakdown:
Every task must have acceptance criteria that are objectively verifiable — meaning a different person (or an AI agent) could determine pass/fail without subjective judgment.
Follow the conventions from the project's AGENTS.md:
Always include as the final criterion:
For tasks with testable logic, also include:
For tasks that change UI, also include:
Good acceptance criteria examples:
npm test produces 0 failures"GET /api/users returns HTTP 200 with a JSON array"src/auth/jwt.ts exists and exports a verifyToken function"Bad acceptance criteria (too vague — never use these):
If something is inherently subjective (like design quality), decompose it into measurable proxies:
Present the acceptance criteria to the user for approval.
Show the complete plan one more time with all tasks, dependencies, priorities, and acceptance criteria. Ask the user to confirm before proceeding to filing.
Now grind through creating every issue in Beads. This is the execution-heavy phase — be thorough and methodical.
Beads uses hierarchical IDs rooted on an epic:
bd-a3f8 Epic
bd-a3f8.1 Task (child of epic)
bd-a3f8.2 Task (child of epic)
bd-a3f8.2.1 Sub-task (child of task)
Use --parent <id> when creating to place items in the hierarchy. Beads auto-assigns the dotted ID.
| Plan Element | Beads Type | bd Flag |
|---|---|---|
| Top-level work item | epic | -t epic |
| Individual work unit (>2 min) | task | -t task --parent <epic-id> |
| Smaller piece within a task | task (sub-task) | -t task --parent <task-id> |
| Bug found during analysis | bug | -t bug |
The following table is provided for completeness, only. All tasks created for GitHub issues are considered essential and, therefore, should be one of P0, P1, P2, P3. Do not use P4 as that priority level suggests the task is unnecessary.
| Priority | When to use |
|---|---|
| P0 | Blocking other teams or production |
| P1 | Core path — must be done for the issue to be considered complete |
| P2 | Important but not on the critical path |
| P3 | Nice-to-have, polish, optimization |
| P4 | Backlog / future consideration |
blocks dependencies between tasksrelated or discovered-from links# 1. Create epic (returns an ID like bd-a3f8)
bd create "Epic Title" -t epic -p 1 \
-d "Description including GitHub issue reference.
Acceptance Criteria:
- [Objective criterion 1]
- [Objective criterion 2]
- Typecheck passes" \
--json
# 2. Create tasks under epic (auto-assigns bd-a3f8.1, bd-a3f8.2, etc.)
bd create "Task Title" -t task -p 1 \
--parent <epic-id> \
-d "Detailed description of what to implement and how.
Acceptance Criteria:
- [Objective criterion 1]
- [Objective criterion 2]
- Typecheck passes" \
--json
# 3. Create sub-tasks under a task if needed (auto-assigns bd-a3f8.1.1, etc.)
bd create "Sub-task Title" -t task -p 1 \
--parent <task-id> \
-d "Focused piece of work within the parent task.
Acceptance Criteria:
- [Objective criterion 1]
- Typecheck passes" \
--json
# 4. Add blocking dependencies
bd dep add <blocked-task-id> <blocker-task-id> --type blocks
# 5. Add discovered-from links (if applicable)
bd dep add <new-issue-id> <source-issue-id> --type discovered-from
Every Beads issue description must follow this structure:
[Detailed functional description of what needs to be done.
Include enough context that a worker agent can start implementing
without re-reading the full GitHub issue. Mention specific files,
functions, APIs, or patterns to use where relevant.]
Source: GitHub Issue <owner>/<repo>#<number>
Acceptance Criteria:
- [Objective criterion 1]
- [Objective criterion 2]
- Typecheck passes
blocks dependenciesparent-child links to their epic automatically via --parentdiscovered-from for bugs or follow-up work found during analysisThis phase is critical for quality. After filing all the beads, step back and do a thorough review. The goal is to ensure that worker agents will have as smooth a time as possible when they pick up these tasks.
For each bead, check:
bd ready output?After each review pass, make updates using bd update:
# Fix a description or acceptance criteria
bd update <id> -d "Improved description..." --json
# Fix priority
bd update <id> -p <new-priority> --json
# Add a missing dependency
bd dep add <blocked-id> <blocker-id> --type blocks
# Add a missing task discovered during review
bd create "Newly discovered task" -t task --parent <epic-id> -p 2 \
-d "Description...
Acceptance Criteria:
- [criteria]
- Typecheck passes" --json
Repeat this review-and-refine cycle up to 5 times. Each pass should focus on progressively finer details:
After each pass, briefly note what was changed. Stop early if a pass produces no meaningful improvements — say "I don't think we can do much better than this" and move on to handoff.
Once refinement is complete:
bd sync to ensure the JSONL index reflects all Phase 6 changesbd dep tree <epic-id> to show the user the full hierarchybd ready --json to show what's immediately actionableSkill: beads-planner:git-push-and-tag
Work is NOT complete until the skill finishes successfully. Never stop before pushing — that leaves work stranded locally.
docs/decisions/001-auth-approach.md with Status, Context, Decision, and Consequences sections."bd list --json to check for duplicates before creating. Alert the user if overlap is found.For detailed Beads CLI syntax and advanced patterns, read references/beads-cli-reference.md.