mcpField
A
agile-sprint-planning

agile-sprint-planning

github.com/nicepkg开发28847 次安装40 周前更新
代码仓库

关于 agile-sprint-planning

Agile Sprint Planning 是用于将团队工作组织为限时迭代的技能,涵盖待办事项准备、估算、目标设定和每日站会,并依据团队速度与反馈调整计划。

主要功能

  1. 01准备并梳理产品待办事项
  2. 02使用 Planning Poker 估算用户故事
  3. 03制定迭代目标
  4. 04组织并跟踪每日站会
  5. 05参考团队速度和回顾反馈

适用场景

  1. 01在迭代开始时规划工作
  2. 02排列并估算待办事项优先级
  3. 03根据迭代进展调整范围
  4. 04准备迭代评审和回顾

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nicepkg/ai-workflow --skill agile-sprint-planning

安装后在 Claude Code 中输入/agile-sprint-planning确认已加载。

详细介绍

敏捷冲刺规划

概述

敏捷冲刺规划提供了一种结构化方法,可将工作组织成有时间限制的迭代,让团队在保持灵活性并响应变化的同时,逐步交付价值。

适用场景

  • 开始新的冲刺周期
  • 制定冲刺目标和目的
  • 估算用户故事和任务
  • 管理冲刺待办事项的优先级
  • 处理冲刺中期的变更或范围调整
  • 准备冲刺评审和回顾
  • 培训团队成员掌握敏捷实践

说明

1. 冲刺前规划
# Sprint Planning Checklist

## 1-2 Days Before Planning Meeting
- [ ] Groom product backlog (ensure top items are detailed)
- [ ] Update user story acceptance criteria
- [ ] Identify dependencies and blockers
- [ ] Prepare estimates from previous sprints
- [ ] Review team velocity (average story points per sprint)
- [ ] Identify team availability/absences
- [ ] Prepare sprint goals draft

## Information to Gather
- Product Owner priorities
- Team capacity (working hours available)
- Previous sprint metrics
- Upcoming holidays or interruptions
- Technical debt items to address
2. 冲刺规划会议结构
// Example sprint planning agenda and execution

class SprintPlanner {
  constructor(team, sprintLength = 2) {
    this.team = team;
    this.sprintLength = sprintLength; // weeks
    this.userStories = [];
    this.sprintGoal = '';
    this.capacity = 0;
  }

  calculateTeamCapacity() {
    // Capacity = available hours - meetings - buffer
    const workHours = 40; // per person per week
    const meetingHours = 5; // estimated standups, retros, etc.
    const bufferPercent = 0.2; // 20% buffer for interruptions

    const capacityPerPerson = (workHours - meetingHours) * (1 - bufferPercent);
    this.capacity = capacityPerPerson * this.team.length * this.sprintLength;

    return this.capacity;
  }

  conductPlanningMeeting() {
    return {
      part1: {
        duration: '15 minutes',
        activity: 'Product Owner presents sprint goal',
        deliverable: 'Team understands business objective'
      },
      part2: {
        duration: '45-60 minutes',
        activity: 'Team discusses and estimates user stories',
        deliverable: 'Prioritized sprint backlog with story points'
      },
      part3: {
        duration: '15 minutes',
        activity: 'Team commits to sprint goal',
        deliverable: 'Formal sprint backlog committed'
      }
    };
  }

  createSprintBacklog(stories, capacity) {
    let currentCapacity = capacity;
    const sprintBacklog = [];

    for (let story of stories) {
      if (currentCapacity >= story.points) {
        sprintBacklog.push({
          ...story,
          status: 'planned',
          sprint: this.currentSprint
        });
        currentCapacity -= story.points;
      }
    }

    return {
      goal: this.sprintGoal,
      backlog: sprintBacklog,
      remainingCapacity: currentCapacity,
      utilization: ((capacity - currentCapacity) / capacity * 100).toFixed(1) + '%'
    };
  }
}
3. 故事点估算
# Story point estimation using Planning Poker approach

class StoryEstimation:
    # Fibonacci sequence for estimation
    ESTIMATE_OPTIONS = [1, 2, 3, 5, 8, 13, 21, 34]

    @staticmethod
    def calculate_story_points(complexity, effort, risk):
        """
        Estimate story points based on multiple factors
        Factors should be rated 1-5
        """
        base_points = (complexity * effort) / 5
        risk_multiplier = 1 + (risk * 0.1)
        estimated_points = base_points * risk_multiplier

        # Round to nearest Fibonacci number
        for estimate in StoryEstimation.ESTIMATE_OPTIONS:
            if estimated_points <= estimate:
                return estimate

        return StoryEstimation.ESTIMATE_OPTIONS[-1]

    @staticmethod
    def conduct_planning_poker(team_estimates):
        """
        Handle Planning Poker consensus process
        """
        estimates = sorted(team_estimates)
        median = estimates[len(estimates) // 2]

        # If significant disagreement, discuss and re-estimate
        if estimates[-1] - estimates[0] > 5:
            return {
                'consensus': False,
                'median': median,
                'low': estimates[0],
                'high': estimates[-1],
                'action': 'Discuss and re-estimate'
            }

        return {'consensus': True, 'estimate': median}

# Example usage
print(StoryEstimation.calculate_story_points(
    complexity=3,  # Medium complexity
    effort=2,      # Low effort
    risk=1         # Low risk
))  # Output: 3 points
4. 定义冲刺目标
Sprint Goal Template:

Sprint: Sprint 23 (Nov 7 - Nov 20)

Goal Statement: |
  Enable users to manage multiple payment methods with a secure,
  intuitive interface that reduces checkout time by 40%

Success Criteria:
  - Payment method management UI implemented
  - 95% test coverage on payment logic
  - Performance: <200ms payment processing
  - Zero critical security issues
  - Feature released to 20% of users for A/B testing

Team Commitment: 89 story points
Expected Velocity: 85-95 points

Key Risks:
  - Payment gateway API changes
  - Security compliance requirements
  - Integration complexity

Acceptance:
  - All criteria met
  - Feature deployed to staging
  - Security review approved
  - Team and PO sign-off
5. 每日站会管理
// Daily standup structure and tracking

class DailyStandup {
  constructor(team) {
    this.team = team;
    this.standups = [];
  }

  conductStandup(date) {
    const standup = {
      date,
      startTime: new Date(),
      participants: [],
      timeboxed: true,
      durationMinutes: 15
    };

    for (let member of this.team) {
      standup.participants.push({
        name: member.name,
        yesterday: member.getYesterdayWork(),
        today: member.getPlanForToday(),
        blockers: member.getBlockers(),
        helpNeeded: member.getHelpNeeded()
      });
    }

    return {
      standup,
      followUpActions: this.identifyFollowUps(standup),
      blockerResolutionOwners: this.assignBlockerOwners(standup)
    };
  }

  identifyFollowUps(standup) {
    return standup.participants
      .filter(p => p.blockers.length > 0)
      .map(p => ({
        owner: p.name,
        blockers: p.blockers,
        deadline: new Date(Date.now() + 24 * 60 * 60 * 1000)
      }));
  }
}

最佳实践

✅ 应做
  • 根据团队以往冲刺的实际速度确定产能
  • 为突发情况和支持工作预留缓冲时间
  • 将冲刺目标聚焦于业务价值,而非技术任务
  • 为规划会议设定时间限制(为期 2 周的冲刺最多 2 小时)
  • 让整个团队参与规划讨论
  • 将大型故事拆分成更小、更易管理的部分
  • 跟踪故事点以观察速度趋势
  • 根据实际完成情况审查并调整估算
  • 保持冲刺时长一致
  • 将回顾中提出的改进纳入规划
❌ 不应做
  • 按 100% 的产能利用率进行规划
  • 跳过规划会议前的故事梳理
  • 在冲刺开始后添加故事(紧急情况除外)
  • 让一个人为整个团队进行估算
  • 将故事点用作员工绩效指标
  • 忽略团队速度趋势
  • 在没有明确冲刺目标的情况下进行规划
  • 为了匹配产能数字而强行将故事塞进冲刺
  • 为节省时间而跳过冲刺规划
  • 不经讨论就将规划扑克结果作为最终估算

冲刺规划技巧

  • 将故事控制在 5–13 点(拆分更大的故事)
  • 保持 85–90% 的产能利用率(为突发情况留出缓冲)
  • 将冲刺目标清晰地记录并展示出来(实体看板或 Jira)
  • 跟踪 5–10 个冲刺的速度,以识别趋势
  • 使用历史数据来改进估算
  • 在评审中庆祝冲刺成果
  • 识别并解决估算偏差
  • 根据回顾反馈调整流程

评论

支持 Markdown