Convert PRDs to Linear issues for ralph-tui execution. Creates a master issue (epic) with sub-issues for each user story...
Converts PRDs to Linear issues (epic + child issues) for ralph-tui autonomous execution using the built-in Linear tracker.
Note: This skill uses ralph-tui's built-in
convertcommand. No external plugins required.
Take a PRD (markdown file or text) and create Linear issues:
ralph-tui run --tracker linear --epic TEAM-123Look for the "Quality Gates" section in the PRD:
## Quality Gates
These commands must pass for every user story:
- `pnpm typecheck` - Type checking
- `pnpm lint` - Linting
For UI stories, also include:
- Verify in browser using dev-browser skill
Extract:
pnpm typecheck)If no Quality Gates section exists: Ask the user what commands should pass, or use a sensible default like npm run typecheck.
Use ralph-tui's built-in convert command:
# Convert PRD to Linear issues (prompts for team ID if not provided)
ralph-tui convert --to linear ./tasks/prd-feature.md
# Specify team ID directly
ralph-tui convert --to linear ./tasks/prd-feature.md --team-id "<team-uuid>"
# Verbose output to see issue details
ralph-tui convert --to linear ./tasks/prd-feature.md --team-id "<team-uuid>" --verbose
The convert command will:
dependsOn in the PRDEach story must be completable in ONE ralph-tui iteration (~one agent context window).
ralph-tui 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.
Rule of thumb: If you can't describe the change in 2-3 sentences, it's too big.
Stories execute in dependency order. Earlier stories must not depend on later ones.
Correct order:
Wrong order:
Dependencies are handled automatically by the convert command:
dependsOn array in your PRD creates "blocks" relations in LinearExample PRD with dependencies:
### US-001: Add schema
**Depends on:** (none)
### US-002: Create API
**Depends on:** US-001
### US-003: Build UI
**Depends on:** US-002
This creates:
US-001 has no blockersUS-002 is blocked by US-001US-003 is blocked by US-002ralph-tui will:
ralph-tui maps PRD priorities to Linear's priority scale:
| PRD Priority | TaskPriority | Linear Priority | Linear Display |
|---|---|---|---|
| P0 | 0 (critical) | 1 | Urgent |
| P1 | 1 (high) | 2 | High |
| P2 | 2 (medium) | 3 | Normal |
| P3 | 3 (low) | 4 | Low |
| P4 | 4 (backlog) | 0 | No Priority |
Note: Linear's priority 0 means "no priority set" (backlog), while 1 is the highest (urgent).
To set priority in your PRD:
### US-001: Critical security fix
**Priority:** P0
### US-002: Regular feature
**Priority:** P2
Each issue's description should include acceptance criteria with:
investorType column to investor table with default 'cold'"--team-id# BAD: Will prompt interactively (blocks automation)
ralph-tui convert --to linear ./prd.md
# GOOD: Specify team ID
ralph-tui convert --to linear ./prd.md --team-id "<team-uuid>"
Don't create issues manually in Linear's UI - use ralph-tui convert to ensure:
ralph-tui uses Linear's parent-child relationships for epicβstory hierarchy. Don't:
If you need to restructure:
ralph-tui convert --to linearEach story ID must be unique within the PRD:
### US-001: First story β
### US-002: Second story β
### US-001: Third story β Duplicate!
Input PRD (./tasks/friends-outreach-prd.md):
# PRD: Friends Outreach
Add ability to mark investors as "friends" for warm outreach.
## Quality Gates
These commands must pass for every user story:
- `pnpm typecheck` - Type checking
- `pnpm lint` - Linting
For UI stories, also include:
- Verify in browser using dev-browser skill
## User Stories
### US-001: Add investorType field to investor table
**Priority:** P1
**Description:** As a developer, I need to categorize investors as 'cold' or 'friend'.
**Acceptance Criteria:**
- [ ] Add investorType column: 'cold' | 'friend' (default 'cold')
- [ ] Generate and run migration successfully
### US-002: Add type toggle to investor list rows
**Priority:** P2
**Depends on:** US-001
**Description:** As Ryan, I want to toggle investor type directly from the list.
**Acceptance Criteria:**
- [ ] Each row has Cold | Friend toggle
- [ ] Switching shows confirmation dialog
- [ ] On confirm: updates type in database
### US-003: Filter investors by type
**Priority:** P3
**Depends on:** US-002
**Description:** As Ryan, I want to filter the list to see just friends or cold.
**Acceptance Criteria:**
- [ ] Filter dropdown: All | Cold | Friend
- [ ] Filter persists in URL params
Command:
ralph-tui convert --to linear ./tasks/friends-outreach-prd.md --team-id "<team-uuid>" --verbose
Output:
Parsing PRD: ./tasks/friends-outreach-prd.md
Creating epic: Friends Outreach
Created: TEAM-456
Creating user stories:
US-001: Add investorType field to investor table
Created: TEAM-457 (priority: High)
US-002: Add type toggle to investor list rows
Created: TEAM-458 (priority: Normal)
Added blocking relation: blocked by TEAM-457
US-003: Filter investors by type
Created: TEAM-459 (priority: Low)
Added blocking relation: blocked by TEAM-458
Epic ID: TEAM-456
Run with: ralph-tui run --tracker linear --epic TEAM-456
After creating issues, run ralph-tui with the Linear tracker:
# Option 1: Specify epic directly
ralph-tui run --tracker linear --epic TEAM-456
# Option 2: Initialize first, then run
ralph-tui init --tracker linear --epicId TEAM-456
ralph-tui run
# Option 3: Use project ID instead of epic
ralph-tui init --tracker linear --projectId "project-uuid"
ralph-tui run
ralph-tui will:
<promise>COMPLETE</promise> when the epic is finishedNote: ralph-tui automatically updates Linear issue status. No manual status changes or workflow skills needed.
--team-id ready for the convert command