Markdown Converter
Agent skill for markdown-converter
Set up Ralph for autonomous feature development. Use when starting a new feature that Ralph will implement. Triggers on: ralph, set up ralph, start ralph, new ralph feature, ralph setup. Chats through the feature idea, creates tasks with dependencies, and sets up everything for Ralph to run.
Sign in to like and favorite skills
Interactive feature planning that creates ralph-ready tasks with dependencies.
Two modes:
dependsOndependsOnAsk the user which mode they need:
Are you: 1. Starting a new feature (I'll help you plan and create tasks) 2. Using existing tasks (I'll set up Ralph to run them)
Start by asking the user about their feature. Don't assume - ASK:
What feature are you building?
Then ask clarifying questions:
Keep asking until you have enough detail to break it into tasks.
Each task must be completable in ONE Ralph iteration (~one context window).
Ralph spawns a fresh Amp instance per iteration with no memory of previous work. If a task is too big, the LLM runs out of context before finishing.
Rule of thumb: If you can't describe the change in 2-3 sentences, it's too big.
Tasks execute based on
dependsOn. Earlier tasks must complete before dependent ones start.
Typical order:
Use
dependsOn to express this:
Task 1: Schema (no dependencies) Task 2: Server action (dependsOn: [task-1]) Task 3: UI component (dependsOn: [task-2]) Task 4: Tests (dependsOn: [task-3])
Parallel tasks that don't depend on each other can share the same dependency.
task_list create title: "[Feature Name]" description: "[One-line description of the feature]" repoURL: "https://github.com/snarktank/untangle"
Save the returned task ID - you'll need it for subtasks.
task_list create title: "[Task title - action-oriented]" description: "[Detailed description with: - What to implement - Files to create/modify - Acceptance criteria - How to verify (typecheck, tests, browser)]" parentID: "<parent-task-id>" dependsOn: ["<previous-task-id>"] // omit for first task repoURL: "https://github.com/snarktank/untangle"
Write descriptions that a future Ralph iteration can pick up without context:
Implement category name to ID mapping for expenses. **What to do:** - Create function mapExpenseCategoryNameToId(name, isChildExpense) - Query item_category table with category_type filter - Add alias mapping for common synonyms (rent → Rent or Mortgage) **Files:** - workflows/tools/upsert-expense.ts **Acceptance criteria:** - Function returns category ID for valid names - Returns null for unknown categories - npm run typecheck passes **Notes:** - Follow pattern from upsert-income.ts - EXPENSE type for family, CHILD_EXPENSE for child
After creating all tasks, run the shared setup steps from "Final Setup (Required for Both Modes)" section.
This ensures:
scripts/ralph/parent-task-id.txtShow the user what was created:
✅ Ralph is ready! **Parent task:** [title] (ID: [id]) **Subtasks:** 1. [Task 1 title] - no dependencies 2. [Task 2 title] - depends on #1 3. [Task 3 title] - depends on #2 ... **To run Ralph:** ```bash ./scripts/ralph/ralph.sh [max_iterations] # or directly: npx tsx scripts/ralph/ralph.ts [max_iterations]
To check status:
amp task list --parentID [parent-id] --limit 10
If the user already has tasks created, help them set up Ralph to run them.
Ask the user:
What's the parent task? You can give me: - The task ID directly - A search term and I'll find it - Or say "list recent" to see recent tasks
To search for tasks (always use limit to avoid context overflow):
task_list list repoURL: "https://github.com/snarktank/untangle" limit: 10
Once you have the parent ID, check for subtasks (always use limit):
task_list list parentID: "<parent-task-id>" limit: 10
If no subtasks found, the parent task might BE the work (not a container). Ask:
This task has no subtasks. Is this: 1. A parent task with subtasks I should find differently? 2. The actual work task (I should create it as a parent with this as the first subtask)?
Review the subtasks and verify:
dependsOn set correctly?If dependencies are missing, offer to fix:
These tasks don't have dependencies set. Should I: 1. Add dependencies based on their order? 2. Leave them parallel (Ralph picks any ready task)?
Run the shared setup steps from "Final Setup (Required for Both Modes)" section below.
✅ Ralph is ready to use existing tasks! **Parent task:** [title] (ID: [id]) **Status:** - ✅ Completed: 3 tasks - 🔄 Ready to work: 2 tasks - ⏳ Blocked: 5 tasks (waiting on dependencies) **Next task Ralph will pick:** [Task title] - [brief description] **To run Ralph:** ```bash ./scripts/ralph/ralph.sh [max_iterations] # or directly: npx tsx scripts/ralph/ralph.ts [max_iterations]
ALWAYS run these steps after creating tasks OR setting up existing tasks:
echo "<parent-task-id>" > scripts/ralph/parent-task-id.txt
Verify it was saved:
cat scripts/ralph/parent-task-id.txt
Read the current progress.txt:
cat scripts/ralph/progress.txt
Archive if:
Archive command:
DATE=$(date +%Y-%m-%d) FEATURE="previous-feature-name-here" mkdir -p scripts/ralph/archive/$DATE-$FEATURE cp scripts/ralph/progress.txt scripts/ralph/archive/$DATE-$FEATURE/ echo "Archived to scripts/ralph/archive/$DATE-$FEATURE/"
Preserve useful Codebase Patterns from the previous run, then reset:
cat > scripts/ralph/progress.txt << 'EOF' # Ralph Progress Log Started: [current date] ## Codebase Patterns [Copy any patterns from previous run that are still relevant] --- EOF
# Confirm parent ID is saved cat scripts/ralph/parent-task-id.txt # Confirm progress.txt is reset head -10 scripts/ralph/progress.txt # List subtasks to confirm they exist # (use task_list list with parentID)
Only after completing all 4 steps is Ralph ready to run.
Each task description MUST include verifiable acceptance criteria:
investorType column to investor table with default 'cold'"npm run typecheck passes
npm test passes
For functional testing (checking behavior, not appearance):
Use Chrome DevTools MCP with take_snapshot to read page content (NOT screenshots)
take_snapshot returns the a11y tree as text that Ralph can read and verifytake_screenshot returns images which Ralph cannot interpret for functional checksFor visual testing (checking appearance):
Use take_screenshot to capture and verify visual appearance
User: set up ralph for adding expense tracking to the legal agent
Assistant: What feature are you building?
User: I want Grace (our legal chat agent) to be able to create, update, and delete expenses when users mention them in conversation.
Assistant: Got it - an expense upsert tool for the legal agent. A few questions:
User: Follow upsert-income.ts. Yes family and child expenses (different tables). Yes list too. Mark APP_EXPENSES_ENTERED task complete.
Assistant: Perfect. Here's my proposed breakdown:
Does this look right? Any tasks to add or remove?
User: Looks good, create the tasks
Assistant: [Creates parent task, then subtasks with dependencies, saves parent-task-id.txt]
✅ Ralph is ready!
Parent task: Legal Agent Expense Upsert Tool (ID: task-abc123)
Subtasks: 14 tasks created with dependencies
To run:
./scripts/ralph/ralph.sh 20
When all subtasks are completed:
completed<promise>COMPLETE</promise>Important: Ralph uses
limit: 5 when querying tasks to avoid context overflow. If you have many subtasks, they'll be processed over multiple iterations.