| name | prd-to-beads |
| description | Convert PRDs to Beads tasks for Reeds autonomous execution. Creates an epic with child beads for each user story. |
| version | 0.1.0 |
| allowed-tools | Read,Bash(bd:*) |
PRD to Beads
Converts PRDs to Beads (epic + child tasks) for Reeds autonomous execution.
Adapted from ralph-tui (MIT License).
The Job
Take a PRD (markdown file or text) and create beads in .beads/beads.jsonl:
- Extract Quality Gates from the PRD's "Quality Gates" section
- Create an epic bead for the feature
- Create child beads for each user story (with quality gates appended)
- Set up dependencies between beads (schema → backend → UI)
- Output ready for
/reeds:reeds-start
Step 1: Extract Quality Gates
Look for the "Quality Gates" section in the PRD:
## Quality Gates
These commands must pass for every user story:
- `make test` - Run tests
- `make lint` - Linting
For UI stories, also include:
- Manual browser verification
Extract:
- Universal gates: Commands that apply to ALL stories (e.g.,
make test)
- UI gates: Commands that apply only to UI stories (e.g., browser verification)
If no Quality Gates section exists: Ask the user what commands should pass, or use a sensible default like go test ./....
Output Format
Beads use bd create command with HEREDOC syntax to safely handle special characters:
bd create --type=epic \
--title="[Feature Name]" \
--description="$(cat <<'EOF'
[Feature description from PRD]
EOF
)" \
--external-ref="prd:./path/to/prd.md"
bd create \
--parent=EPIC_ID \
--title="[Story Title]" \
--description="$(cat <<'EOF'
[Story description with acceptance criteria INCLUDING quality gates]
EOF
)" \
--priority=[1-4]
CRITICAL: Always use <<'EOF' (single-quoted) for the HEREDOC delimiter. This prevents shell interpretation of backticks, $variables, and () in descriptions.
Story Size: The #1 Rule
Each story must be completable in ONE Reeds iteration (~one agent context window).
Reeds spawns a fresh agent instance per iteration with no memory of previous work. If a story is too big, the agent runs out of context before finishing.
Right-sized stories
- Add a database column + migration
- Add a UI component to an existing page
- Update a server action with new logic
- Add a filter dropdown to a list
Too big (split these)
- "Build the entire dashboard" → Split into: schema, queries, UI components, filters
- "Add authentication" → Split into: schema, middleware, login UI, session handling
- "Refactor the API" → Split into one story per endpoint or pattern
Rule of thumb: If you can't describe the change in 2-3 sentences, it's too big.
Story Ordering: Dependencies First
Stories execute in dependency order. Earlier stories must not depend on later ones.
Correct order:
- Schema/database changes (migrations)
- Server actions / backend logic
- UI components that use the backend
- Dashboard/summary views that aggregate data
Wrong order:
- UI component (depends on schema that doesn't exist yet)
- Schema change
Dependencies with bd dep add
Use the bd dep add command to specify which beads must complete first:
bd create --parent=epic-123 --title="US-001: Add schema" ...
bd create --parent=epic-123 --title="US-002: Create API" ...
bd create --parent=epic-123 --title="US-003: Build UI" ...
bd dep add reeds-002 reeds-001
bd dep add reeds-003 reeds-002
Syntax: bd dep add <issue> <depends-on> — the issue depends on (is blocked by) depends-on.
Reeds will:
- Show blocked beads as "blocked" until dependencies complete
- Never select a bead for execution while its dependencies are open
- Include dependency context in the prompt when working on a bead
Correct dependency order:
- Schema/database changes (no dependencies)
- Backend logic (depends on schema)
- UI components (depends on backend)
- Integration/polish (depends on UI)
Acceptance Criteria: Quality Gates + Story-Specific
Each bead's description should include acceptance criteria with:
- Story-specific criteria from the PRD (what this story accomplishes)
- Quality gates from the PRD's Quality Gates section (appended at the end)
Good criteria (verifiable)
- "Add
status column to orders table with default 'pending'"
- "Filter dropdown has options: All, Pending, Complete"
- "Clicking toggle shows confirmation dialog"
Bad criteria (vague)
- "Works correctly"
- "User can do X easily"
- "Good UX"
- "Handles edge cases"
Conversion Rules
- Extract Quality Gates from PRD first
- Each user story → one bead
- First story: No dependencies (creates foundation)
- Subsequent stories: Depend on their predecessors (UI depends on backend, etc.)
- Priority: Based on dependency order, then document order (1=critical, 2=high, 3=medium, 4=low)
- All stories:
status: "open"
- Acceptance criteria: Story criteria + quality gates appended
- UI stories: Also append UI-specific gates (browser verification)
Splitting Large PRDs
If a PRD has big features, split them:
Original:
"Add order tracking with status updates"
Split into:
- US-001: Add status field to orders table
- US-002: Add status enum type and migration
- US-003: Create status update endpoint
- US-004: Add status badge to order list UI
- US-005: Add status filter dropdown
- US-006: Update order detail page with status
- US-007: Add status change history
Each is one focused change that can be completed and verified independently.
Example
Input PRD:
# PRD: Order Status Tracking
Add ability to track order status through lifecycle.
## Quality Gates
These commands must pass for every user story:
- `make test` - Run tests
- `make lint` - Linting
For UI stories, also include:
- Manual browser verification
## User Stories
### US-001: Add status field to orders table
**Description:** As a developer, I need to track order status.
**Acceptance Criteria:**
- [ ] Add status column: 'pending' | 'processing' | 'complete' (default 'pending')
- [ ] Generate and run migration successfully
### US-002: Add status badge to order list
**Description:** As a user, I want to see order status in the list.
**Acceptance Criteria:**
- [ ] Each row shows status badge with color
- [ ] Badge colors: pending=yellow, processing=blue, complete=green
### US-003: Filter orders by status
**Description:** As a user, I want to filter orders by status.
**Acceptance Criteria:**
- [ ] Filter dropdown: All | Pending | Processing | Complete
- [ ] Filter persists in URL params
Output beads:
bd create --type=epic \
--title="Order Status Tracking" \
--description="$(cat <<'EOF'
Track order status through lifecycle
EOF
)" \
--external-ref="prd:./docs/order-status-prd.md"
bd create --parent=reeds-abc \
--title="US-001: Add status field to orders table" \
--description="$(cat <<'EOF'
As a developer, I need to track order status.
## Acceptance Criteria
- [ ] Add status column: 'pending' | 'processing' | 'complete' (default 'pending')
- [ ] Generate and run migration successfully
- [ ] make test passes
- [ ] make lint passes
EOF
)" \
--priority=1
bd create --parent=reeds-abc \
--title="US-002: Add status badge to order list" \
--description="$(cat <<'EOF'
As a user, I want to see order status in the list.
## Acceptance Criteria
- [ ] Each row shows status badge with color
- [ ] Badge colors: pending=yellow, processing=blue, complete=green
- [ ] make test passes
- [ ] make lint passes
- [ ] Manual browser verification
EOF
)" \
--priority=2
bd dep add reeds-002 reeds-001
bd create --parent=reeds-abc \
--title="US-003: Filter orders by status" \
--description="$(cat <<'EOF'
As a user, I want to filter orders by status.
## Acceptance Criteria
- [ ] Filter dropdown: All | Pending | Processing | Complete
- [ ] Filter persists in URL params
- [ ] make test passes
- [ ] make lint passes
- [ ] Manual browser verification
EOF
)" \
--priority=3
bd dep add reeds-003 reeds-002
Output Location
Beads are written to: .beads/beads.jsonl
After creation, start Reeds:
/reeds:reeds-start
Reeds will:
- Query
bd ready --limit 1 for the next task
- Close each bead when complete
- Output
REEDS COMPLETE when all tasks are done
Checklist Before Creating Beads