This directory contains all stories from PRD.md extracted into individual JSON files for easier programmatic access.
prd-json/
├── README.md (this file)
├── EXTRACTION_SUMMARY.md (summary of extraction)
└── stories/
├── US-001.json
├── US-002.json
├── US-003.json
├── ...
└── V-AUTOPLAY.json
Each story file follows this structure:
{
"id": "US-001",
"title": "Story Title",
"description": "Full description of the story",
"acceptanceCriteria": [
{
"text": "Criterion text",
"checked": true
},
{
"text": "Another criterion",
"checked": false
}
],
"passes": true,
"blockedBy": null
}- id (string): Unique story identifier (US-XXX, V-XXX, or custom like US-TIMESTAMPS)
- title (string): Story title extracted from markdown header
- description (string): Full description text from the story
- acceptanceCriteria (array): List of acceptance criteria
- text (string): Criterion description
- checked (boolean): Whether criterion is complete (from
[x]or[ ])
- passes (boolean): True if ALL criteria are checked (
[x]), false otherwise - blockedBy (string | null): Explanation if story is blocked, null if not blocked
Total: 15 stories extracted from the specified range
- US-TIMESTAMPS
- US-SYNC-FIX
- US-TIMESTAMPS-V2
- US-029-FIX
- US-001
- US-002
- US-003
- US-004
- US-006
- US-007
- US-008
- US-009
- US-010
- US-005-FIX: Auth endpoints still return 500
- US-005: Auth API endpoints return 500 or hang indefinitely
import json
with open('stories/US-001.json') as f:
story = json.load(f)
print(f"ID: {story['id']}")
print(f"Title: {story['title']}")
print(f"Complete: {story['passes']}")
for criterion in story['acceptanceCriteria']:
status = "✓" if criterion['checked'] else "✗"
print(f" {status} {criterion['text']}")ls stories/ | sortecho "Total stories:" $(ls stories/ | wc -l)
echo "Completed:" $(grep '"passes": true' stories/*.json | wc -l)
echo "Blocked:" $(grep '"passes": false' stories/*.json | wc -l)- Stories are extracted from
/Users/etanheyman/Desktop/Gits/songscript/PRD.md - Lines 181-600 contain 15 distinct stories
- Additional stories exist in the full PRD beyond line 600
- All JSON files are valid and properly formatted
- The
passesfield is computed from acceptance criteria completion status