mcpField
A
agile-sprint-planning

agile-sprint-planning

github.com/nicepkg開発28847 回インストール40 週間前に更新
リポジトリ

agile-sprint-planning について

Agile Sprint Planningは、チームの作業を期間限定のスプリントに整理するスキルです。バックログの準備、見積もり、目標設定、デイリースタンドアップを扱い、チームのベロシティやフィードバックに基づく計画調整も支援します。

主な機能

  1. 01プロダクトバックログの準備と整理
  2. 02Planning 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)
      }));
  }
}

ベストプラクティス

✅ DO
  • 過去のスプリントにおける実際のチームベロシティを基にキャパシティを設定する
  • 割り込みやサポート作業に備えて予備時間を確保する
  • スプリントの目標は技術的なタスクではなく、ビジネス価値を重視する
  • 計画ミーティングの時間を制限する(2週間のスプリントなら最大2時間)
  • 計画の話し合いにはチーム全員が参加する
  • 大きなストーリーを、管理しやすい小さな単位に分割する
  • ベロシティの傾向を把握するためにストーリーポイントを追跡する
  • 実際の完了状況に基づいて見積もりを見直し、調整する
  • スプリントの期間を一定に保つ
  • レトロスペクティブでの改善点を計画に反映する
❌ DON'T
  • キャパシティを100%使用する計画を立てない
  • 計画ミーティングの前にストーリーの整理を省略しない
  • スプリント開始後にストーリーを追加しない(緊急時を除く)
  • 1人だけでチーム全体の見積もりを行わない
  • ストーリーポイントを従業員のパフォーマンス指標として使わない
  • チームのベロシティの傾向を無視しない
  • 明確なスプリント目標なしで計画しない
  • キャパシティの数値に合わせるためにストーリーをスプリントに押し込まない
  • 時間を節約するためにスプリント計画を省略しない
  • 話し合いをせずにプランニングポーカーの結果を最終見積もりとして使わない

スプリント計画のヒント

  • ストーリーは5~13ポイントに収める(大きなストーリーは分割する)
  • キャパシティの85~90%を使用する(割り込みに備えて余裕を残す)
  • スプリント目標を目につく場所に記録する(物理的なボードまたはJira)
  • 傾向を把握するために、5~10スプリントにわたってベロシティを追跡する
  • より適切な見積もりのために過去のデータを活用する
  • レビューでスプリントの成功を称える
  • 見積もりの偏りを特定し、対処する
  • レトロスペクティブでのフィードバックに基づいてプロセスを調整する

コメント