Marketplace ralph-tui-create-json
Convert PRDs to prd.json format for ralph-tui execution. Creates JSON task files with user stories, acceptance criteria, and dependencies. Triggers on: create prd.json, convert to json, ralph json, create json tasks.
git clone https://github.com/aiskillstore/marketplace
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/subsy/ralph-tui-create-json" ~/.claude/skills/aiskillstore-marketplace-ralph-tui-create-json && rm -rf "$T"
skills/subsy/ralph-tui-create-json/SKILL.mdRalph TUI - Create JSON Tasks
Converts PRDs to prd.json format for ralph-tui autonomous execution.
Note: This skill is bundled with ralph-tui's JSON tracker plugin. Future tracker plugins (Linear, GitHub Issues, etc.) will bundle their own task creation skills.
⚠️ CRITICAL: The output MUST be a FLAT JSON object with "name" and "userStories" at the ROOT level. DO NOT wrap content in a "prd" object or use "tasks" array. See "Schema Anti-Patterns" section below.
The Job
Take a PRD (markdown file or text) and create a prd.json file:
- Extract Quality Gates from the PRD's "Quality Gates" section
- Parse user stories from the PRD
- Append quality gates to each story's acceptance criteria
- Set up dependencies between stories
- Output ready for
ralph-tui run --prd <path>
Step 1: Extract Quality Gates
Look 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:
- Universal gates: Commands that apply to ALL stories (e.g.,
)pnpm typecheck - 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
npm run typecheck.
Output Format
The JSON file MUST be a FLAT object at the root level:
{ "name": "[Project name from PRD or directory]", "branchName": "ralph/[feature-name-kebab-case]", "description": "[Feature description from PRD]", "userStories": [ { "id": "US-001", "title": "[Story title]", "description": "As a [user], I want [feature] so that [benefit]", "acceptanceCriteria": [ "Criterion 1 from PRD", "Criterion 2 from PRD", "pnpm typecheck passes", "pnpm lint passes" ], "priority": 1, "passes": false, "notes": "", "dependsOn": [] }, { "id": "US-002", "title": "[UI Story that depends on US-001]", "description": "...", "acceptanceCriteria": [ "...", "pnpm typecheck passes", "pnpm lint passes", "Verify in browser using dev-browser skill" ], "priority": 2, "passes": false, "notes": "", "dependsOn": ["US-001"] } ] }
CRITICAL: Schema Anti-Patterns (DO NOT USE)
The following patterns are INVALID and will cause validation errors:
❌ WRONG: Wrapper object
{ "prd": { "name": "...", "userStories": [...] } }
This wraps everything in a "prd" object. DO NOT DO THIS. The "name" and "userStories" fields must be at the ROOT level.
❌ WRONG: Using "tasks" instead of "userStories"
{ "name": "...", "tasks": [...] }
The array is called "userStories", not "tasks".
❌ WRONG: Complex nested structures
{ "metadata": {...}, "overview": {...}, "migration_strategy": { "phases": [...] } }
Even if the PRD describes phases/milestones/sprints, you MUST flatten these into a single "userStories" array.
❌ WRONG: Using "status" instead of "passes"
{ "userStories": [{ "id": "US-001", "status": "open" // WRONG! }] }
Use
"passes": false for incomplete stories, "passes": true for completed.
✅ CORRECT: Flat structure at root
{ "name": "Android Kotlin Migration", "branchName": "ralph/kotlin-migration", "userStories": [ {"id": "US-001", "title": "Create Scraper interface", "passes": false, "dependsOn": []}, {"id": "US-002", "title": "Implement WeebCentralScraper", "passes": false, "dependsOn": ["US-001"]} ] }
Story Size: The #1 Rule
Each 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.
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.
Dependencies with dependsOn
dependsOnUse the
dependsOn array to specify which stories must complete first:
{ "id": "US-002", "title": "Create API endpoints", "dependsOn": ["US-001"], // Won't be selected until US-001 passes ... }
Ralph-tui will:
- Show US-002 as "blocked" until US-001 completes
- Never select US-002 for execution while US-001 is open
- Include "Prerequisites: US-001" in the prompt when working on US-002
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 story's acceptance criteria should include:
- 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
column to tasks table with default 'open'"status - "Filter dropdown has options: All, Open, Closed"
- "Clicking delete 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 JSON entry
- IDs: Sequential (US-001, US-002, etc.)
- Priority: Based on dependency order (1 = highest)
- dependsOn: Array of story IDs this story requires
- All stories:
and emptypasses: falsenotes - branchName: Derive from feature name, kebab-case, prefixed with
ralph/ - Acceptance criteria: Story criteria + quality gates appended
- UI stories: Also append UI-specific gates (browser verification)
Output Location
Default:
./tasks/prd.json (alongside the PRD markdown files)
This keeps all PRD-related files together in the
tasks/ directory.
Or specify a different path - ralph-tui will use it with:
ralph-tui run --prd ./path/to/prd.json
Example
Input PRD:
# PRD: Task Priority System Add priority levels to tasks. ## 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 priority field to database **Description:** As a developer, I need to store task priority. **Acceptance Criteria:** - [ ] Add priority column: 1-4 (default 2) - [ ] Migration runs successfully ### US-002: Display priority badge on task cards **Description:** As a user, I want to see task priority at a glance. **Acceptance Criteria:** - [ ] Badge shows P1/P2/P3/P4 with colors - [ ] Badge visible without hovering ### US-003: Add priority filter dropdown **Description:** As a user, I want to filter tasks by priority. **Acceptance Criteria:** - [ ] Filter dropdown: All, P1, P2, P3, P4 - [ ] Filter persists in URL
Output prd.json:
{ "project": "my-app", "branchName": "ralph/task-priority", "description": "Add priority levels to tasks", "userStories": [ { "id": "US-001", "title": "Add priority field to database", "description": "As a developer, I need to store task priority.", "acceptanceCriteria": [ "Add priority column: 1-4 (default 2)", "Migration runs successfully", "pnpm typecheck passes", "pnpm lint passes" ], "priority": 1, "passes": false, "notes": "", "dependsOn": [] }, { "id": "US-002", "title": "Display priority badge on task cards", "description": "As a user, I want to see task priority at a glance.", "acceptanceCriteria": [ "Badge shows P1/P2/P3/P4 with colors", "Badge visible without hovering", "pnpm typecheck passes", "pnpm lint passes", "Verify in browser using dev-browser skill" ], "priority": 2, "passes": false, "notes": "", "dependsOn": ["US-001"] }, { "id": "US-003", "title": "Add priority filter dropdown", "description": "As a user, I want to filter tasks by priority.", "acceptanceCriteria": [ "Filter dropdown: All, P1, P2, P3, P4", "Filter persists in URL", "pnpm typecheck passes", "pnpm lint passes", "Verify in browser using dev-browser skill" ], "priority": 3, "passes": false, "notes": "", "dependsOn": ["US-002"] } ] }
Running with ralph-tui
After creating prd.json:
ralph-tui run --prd ./tasks/prd.json
Ralph-tui will:
- Load stories from prd.json
- Select the highest-priority story with
and no blocking dependenciespasses: false - Generate a prompt with story details + acceptance criteria
- Run the agent to implement the story
- Mark
on completionpasses: true - Repeat until all stories pass
Checklist Before Saving
- Extracted Quality Gates from PRD (or asked user if missing)
- Each story completable in one iteration
- Stories ordered by dependency (schema → backend → UI)
-
correctly set for each storydependsOn - Quality gates appended to every story's acceptance criteria
- UI stories have browser verification (if specified in Quality Gates)
- Acceptance criteria are verifiable (not vague)
- No circular dependencies