关于 ralph-tui-create-json
将 PRD 转换为供 ralph-tui JSON tracker 使用的扁平 prd.json 的 Agent 技能,并指导拆分故事、设置质量门槛和依赖关系。
主要功能
- 01将 PRD 转为 JSON
- 02提取并附加质量门槛
- 03拆分为单次迭代故事
- 04定义故事依赖关系
- 05检查扁平 JSON 结构
适用场景
- 01准备供 ralph-tui 执行的功能 PRD
- 02将大型需求拆成小故事
- 03确保故事包含可验证标准
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ subsy/ ralph-tui --skill ralph-tui-create-json安装后在 Claude Code 中输入/ralph-tui-create-json确认已加载。
详细介绍
Ralph TUI - 创建 JSON 任务
将 PRD 转换为 prd.json 格式,供 ralph-tui 自主执行。
注意: 此技能随 ralph-tui 的 JSON 跟踪器插件打包。未来的跟踪器插件(Linear、GitHub Issues 等)将打包各自的任务创建技能。
⚠️ 重要: 输出必须是一个扁平 JSON 对象,且
"name"和"userStories"位于根级别。不要将内容包装在"prd"对象中,也不要使用"tasks"数组。请参阅下方的“Schema 反模式”部分。
任务
获取一份 PRD(Markdown 文件或文本),并创建一个 prd.json 文件:
- 提取质量门禁:从 PRD 的“Quality Gates”部分提取
- 从 PRD 中解析用户故事
- 将质量门禁追加到每个故事的验收标准中
- 设置故事之间的依赖关系
- 输出可直接用于
ralph-tui run --prd <path>的文件
第 1 步:提取质量门禁
在 PRD 中查找“Quality Gates”部分:
## 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
提取:
- 通用门禁: 适用于所有故事的命令(例如,
pnpm typecheck) - UI 门禁: 仅适用于 UI 故事的命令(例如,浏览器验证)
如果不存在 Quality Gates 部分: 询问用户应通过哪些命令,或采用合理的默认命令,例如 npm run typecheck。
输出格式
JSON 文件必须是位于根级别的扁平对象:
{
"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"]
}
]
}
重要:Schema 反模式(不要使用)
以下模式无效,会导致验证错误:
❌ 错误:包装对象
{
"prd": {
"name": "...",
"userStories": [...]
}
}
这会将所有内容包装在 "prd" 对象中。不要这样做。 "name" 和 "userStories" 字段必须位于根级别。
❌ 错误:使用 "tasks" 而非 "userStories"
{
"name": "...",
"tasks": [...]
}
数组名称是 "userStories",而不是 "tasks"。
❌ 错误:复杂的嵌套结构
{
"metadata": {...},
"overview": {...},
"migration_strategy": {
"phases": [...]
}
}
即使 PRD 描述了阶段/里程碑/冲刺,也必须将其展平为单个 "userStories" 数组。
❌ 错误:使用 "status" 而非 "passes"
{
"userStories": [{
"id": "US-001",
"status": "open" // WRONG!
}]
}
未完成的故事使用 "passes": false,已完成的故事使用 "passes": true。
✅ 正确:根级别的扁平结构
{
"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"]}
]
}
故事规模:首要规则
每个故事都必须能在一次 ralph-tui 迭代中完成(约等于一个 Agent 上下文窗口)。
Ralph-tui 每次迭代都会启动一个全新的 Agent 实例,且不会保留之前工作的记忆。如果故事太大,Agent 会在完成前耗尽上下文。
合适规模的故事:
- 添加一个数据库列和迁移
- 为现有页面添加一个 UI 组件
- 使用新逻辑更新一个服务端操作
- 为列表添加一个筛选下拉菜单
规模过大的故事(请拆分):
- “构建整个仪表板” → 拆分为:架构、查询、UI 组件、筛选器
- “添加身份验证” → 拆分为:架构、中间件、登录 UI、会话处理
- “重构 API” → 按端点或模式拆分,每个故事负责一个
经验法则: 如果你无法用 2-3 句话描述变更,说明故事太大。
使用 dependsOn 设置依赖关系
使用 dependsOn 数组指定必须先完成哪些故事:
{
"id": "US-002",
"title": "Create API endpoints",
"dependsOn": ["US-001"], // Won't be selected until US-001 passes
...
}
Ralph-tui 将:
- 在 US-001 完成前,将 US-002 显示为“受阻”
- 在 US-001 仍未完成时,绝不会选择 US-002 执行
- 处理 US-002 时,在提示词中加入“Prerequisites: US-001”
正确的依赖顺序:
- 架构/数据库变更(无依赖)
- 后端逻辑(依赖架构)
- UI 组件(依赖后端)
- 集成/完善(依赖 UI)
验收标准:质量门禁 + 故事专属标准
每个故事的验收标准应包括:
- 故事专属标准: 来自 PRD(说明此故事要完成什么)
- 质量门禁: 来自 PRD 的 Quality Gates 部分(追加在末尾)
优秀的标准(可验证):
- “在 tasks 表中添加
status列,默认值为 'open'” - “筛选下拉菜单包含以下选项:All、Open、Closed”
- “点击删除后显示确认对话框”
不佳的标准(含糊不清):
- ❌ “运行正常”
- ❌ “用户可以轻松完成 X”
- ❌ “用户体验良好”
- ❌ “能够处理边缘情况”
转换规则
- 先从 PRD 中提取质量门槛
- 每个用户故事对应一个 JSON 条目
- ID:按顺序编号(US-001、US-002 等)
- 优先级:根据依赖顺序确定(1 = 最高)
- dependsOn:此故事所依赖的故事 ID 数组
- 所有故事:
passes: false,且notes为空 - branchName:根据功能名称生成,采用 kebab-case,并以
ralph/为前缀 - 验收标准:故事标准 + 附加的质量门槛
- UI 故事:还要附加 UI 专属门槛(浏览器验证)
输出位置
默认位置:./tasks/prd.json(与 PRD Markdown 文件放在同一目录)
这样所有与 PRD 相关的文件都会集中放在 tasks/ 目录中。
也可以指定其他路径,ralph-tui 将使用以下路径:
ralph-tui run --prd ./path/to/prd.json
示例
输入 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
输出 prd.json:
{
"name": "Task Priority System",
"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"]
}
]
}
使用 ralph-tui 运行
创建 prd.json 后:
ralph-tui run --prd ./tasks/prd.json
Ralph-tui 将会:
- 从 prd.json 加载故事
- 选择优先级最高、
passes: false且没有阻塞依赖的故事 - 根据故事详情和验收标准生成提示词
- 运行 Agent 来实现故事
- 完成后将
passes标记为true - 重复此过程,直到所有故事都通过
保存前检查清单
- 已从 PRD 中提取质量门槛(如缺失,则已询问用户)
- 每个故事都能在一次迭代中完成
- 故事已按依赖顺序排列(schema → 后端 → UI)
- 已为每个故事正确设置
dependsOn - 已将质量门槛附加到每个故事的验收标准中
- UI 故事已包含浏览器验证(如果质量门槛中有此要求)
- 验收标准可验证(不含模糊表述)
- 不存在循环依赖