name: user-story-generator description: 从需求、研究和功能描述等多种输入生成和验证用户故事。应用INVEST标准验证,创建验收标准,拆分大型故事,并在不同故事格式之间转换。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob
用户故事生成器技能
从需求和研究输入生成格式良好的用户故事,包含INVEST验证、验收标准和故事拆分功能。
概述
本技能提供在整个产品开发生命周期中创建和管理用户故事的全面能力。它将需求、研究洞察和功能描述转化为可供开发的可执行用户故事。
能力
故事生成
- 从需求描述生成用户故事
- 将功能规格转换为用户故事
- 从研究洞察创建故事
- 在工作故事和用户故事之间相互转换
INVEST验证
- 独立性:故事自包含
- 可协商性:细节可讨论
- 有价值性:提供用户价值
- 可估算性:团队可估算工作量
- 小规模:适合一个冲刺
- 可测试性:有明确的验收标准
验收标准
- 生成Given-When-Then标准
- 创建验证清单
- 定义边界情况和错误条件
- 指定非功能性需求
故事拆分
- 将大型故事拆分为较小故事
- 每个拆分保留价值
- 保持故事关系
- 跟踪拆分谱系
故事估算
- 基于复杂性估算故事点数
- 建议T恤尺码
- 识别估算风险
- 与参考故事比较
先决条件
输入格式
支持的输入:
- 功能规格(.md、.docx)
- 需求文档
- 研究综合输出
- JTBD声明
- 用户反馈
使用模式
用户故事格式
## 标准用户故事格式
**作为** [用户类型/角色],
**我想要** [目标/需求],
**以便** [收益/价值]。
### 验收标准
- [ ] 给定 [上下文],当 [操作],那么 [结果]
- [ ] 给定 [上下文],当 [操作],那么 [结果]
### 备注
- [额外上下文]
- [技术考虑]
用户故事生成示例
## 输入:功能需求
**功能**:高级搜索筛选器
**描述**:用户需要按日期、类别和价格范围筛选搜索结果。
---
## 生成的用户故事
### 故事1:日期筛选器
**作为** 购物者,
**我想要** 按日期范围筛选搜索结果,
**以便** 我能找到最近添加的商品。
**验收标准**:
- [ ] 给定我在搜索结果页面,当我选择日期范围,那么只显示该范围内添加的商品
- [ ] 给定我已应用日期筛选器,当我清除筛选器,那么显示所有结果
- [ ] 给定我选择无效日期范围(结束早于开始),当我应用筛选,那么我看到错误信息
**故事点数**:3
**优先级**:P1
---
### 故事2:类别筛选器
**作为** 购物者,
**我想要** 按类别筛选搜索结果,
**以便** 我能缩小到相关商品范围。
**验收标准**:
- [ ] 给定我在搜索结果页面,当我选择一个或多个类别,那么只显示匹配的商品
- [ ] 给定选择了多个类别,当我查看结果,那么显示任何选定类别的商品(OR逻辑)
- [ ] 给定我在搜索结果页面,当类别加载时,那么我看到每个类别的商品数量
**故事点数**:5
**优先级**:P1
---
### 故事3:价格范围筛选器
**作为** 预算敏感的购物者,
**我想要** 按价格范围筛选搜索结果,
**以便** 我只看到我能负担的商品。
**验收标准**:
- [ ] 给定我在搜索结果页面,当我设置最小和最大价格,那么只显示该范围内的商品
- [ ] 给定我只设置最小价格,当我应用筛选器,那么显示等于或高于该价格的商品
- [ ] 给定我只设置最大价格,当我应用筛选器,那么显示等于或低于该价格的商品
- [ ] 给定我输入非数值,当我尝试应用时,那么我看到验证错误
**故事点数**:3
**优先级**:P2
INVEST验证模板
## INVEST验证清单
### 故事:[故事标题]
| 标准 | 通过 | 备注 |
|-----------|------|-------|
| **独立性** | [ ] | 无需其他故事即可交付 |
| **可协商性** | [ ] | 实现细节灵活 |
| **有价值性** | [ ] | 为用户或业务提供价值 |
| **可估算性** | [ ] | 团队可自信估算 |
| **小规模** | [ ] | 可在一个冲刺内完成 |
| **可测试性** | [ ] | 有明确的验收标准 |
### 验证结果
- **得分**:5/6
- **问题**:故事太大(不符合小规模)
- **建议**:拆分为更小的故事
故事拆分模式
## 故事拆分技术
### 1. 按工作流步骤拆分
原始:"用户可以完成结账"
拆分为:
- 用户可将商品添加到购物车
- 用户可以输入送货地址
- 用户可以输入支付信息
- 用户可以查看并确认订单
### 2. 按业务规则拆分
原始:"用户可以应用折扣码"
拆分为:
- 用户可以应用百分比折扣
- 用户可以应用固定金额折扣
- 用户可以应用免运费码
### 3. 按数据变体拆分
原始:"用户可以导出报告"
拆分为:
- 用户可以将报告导出为CSV
- 用户可以将报告导出为PDF
- 用户可以将报告导出为Excel
### 4. 按操作(CRUD)拆分
原始:"用户可以管理个人资料"
拆分为:
- 用户可以查看个人资料
- 用户可以编辑个人资料
- 用户可以上传个人资料照片
- 用户可以删除账户
### 5. 按平台拆分
原始:"用户可以查看仪表板"
拆分为:
- 用户可以在网页上查看仪表板
- 用户可以在移动应用上查看仪表板
- 用户可以在平板上查看仪表板
工作故事到用户故事转换
## 工作故事格式
当 [情境],
我想要 [动机],
以便我可以 [预期结果]。
## 转换示例
### 工作故事
当我准备每周团队会议时,
我想要快速查看项目状态更新,
以便我可以讨论障碍并庆祝胜利。
### 转换后的用户故事
**故事1**:仪表板概览
作为团队负责人,
我想要在一个页面上查看所有项目状态的摘要,
以便我可以快速准备团队会议。
**故事2**:最近活动动态
作为团队负责人,
我想要查看项目的最新更新和变更,
以便我知道自上次检查以来发生了什么。
**故事3**:障碍高亮显示
作为团队负责人,
我想要被阻塞的项目被视觉高亮显示,
以便我可以在会议中优先讨论障碍。
与Babysitter SDK集成
任务定义示例
const storyGenerationTask = defineTask({
name: 'generate-user-stories',
description: '从需求生成用户故事',
inputs: {
requirements: { type: 'string', required: true },
persona: { type: 'string', default: 'user' },
validateInvest: { type: 'boolean', default: true },
includeAcceptanceCriteria: { type: 'boolean', default: true },
estimatePoints: { type: 'boolean', default: false }
},
outputs: {
stories: { type: 'array' },
validationResults: { type: 'array' },
splitSuggestions: { type: 'array' }
},
async run(inputs, taskCtx) {
return {
kind: 'skill',
title: '从需求生成用户故事',
skill: {
name: 'user-story-generator',
context: {
operation: 'generate',
requirements: inputs.requirements,
persona: inputs.persona,
validateInvest: inputs.validateInvest,
includeAcceptanceCriteria: inputs.includeAcceptanceCriteria,
estimatePoints: inputs.estimatePoints
}
},
io: {
inputJsonPath: `tasks/${taskCtx.effectId}/input.json`,
outputJsonPath: `tasks/${taskCtx.effectId}/result.json`
}
};
}
});
输出格式
故事导出格式(JSON)
{
"stories": [
{
"id": "US-001",
"title": "搜索日期筛选器",
"persona": "购物者",
"want": "按日期范围筛选搜索结果",
"benefit": "可以找到最近添加的商品",
"acceptanceCriteria": [
{
"given": "我在搜索结果页面",
"when": "我选择日期范围",
"then": "结果只显示该范围内添加的商品"
}
],
"investValidation": {
"independent": true,
"negotiable": true,
"valuable": true,
"estimable": true,
"small": true,
"testable": true,
"score": 6
},
"estimate": {
"storyPoints": 3,
"tshirtSize": "S"
},
"priority": "P1",
"epic": "搜索改进"
}
],
"metadata": {
"generated": "2026-01-24",
"source": "feature-spec.md",
"totalStories": 3,
"totalPoints": 11
}
}
故事地图导出
# 故事地图:搜索改进
## 用户旅程:查找商品
### 发现
| 步骤 | 故事 |
|------|---------|
| 搜索 | US-001:基础搜索 |
| 筛选 | US-002:日期筛选器,US-003:类别筛选器,US-004:价格筛选器 |
| 排序 | US-005:按相关性排序,US-006:按价格排序 |
### 评估
| 步骤 | 故事 |
|------|---------|
| 查看详情 | US-007:商品详情 |
| 比较 | US-008:并排比较 |
### 发布计划
| 发布 | 故事 | 点数 |
|---------|---------|--------|
| MVP | US-001,US-002,US-007 | 11 |
| R2 | US-003,US-004,US-005 | 11 |
| R3 | US-006,US-008 | 8 |
最佳实践
- 关注价值:每个故事都应向用户提供价值
- 保持故事小规模:如果估算>8点,考虑拆分
- 编写可测试标准:每个标准都应是可验证的
- 避免技术细节:关注是什么,而不是如何做
- 包含上下文:为团队提供足够细节
- 保持可追溯性:将故事链接到需求/研究
常见陷阱
- 技术故事:“重构数据库” - 应表述为用户收益
- 太大:分解史诗级故事
- 太小:不要创建伪装成故事的任务
- 缺少验收标准:始终包含可测试标准
- 价值陈述模糊:具体说明收益