feat: add Daily Standup Report Generator recipe (#5123) (#5131)

Signed-off-by: Arya Pratap Singh <notaryasingh@gmail.com>
This commit is contained in:
Arya Pratap Singh
2025-10-15 22:32:45 +05:30
committed by GitHub
parent 5581078935
commit e96885974e
@@ -0,0 +1,223 @@
version: 1.0.0
title: Daily Standup Report Generator
description: Automates daily standup report creation by fetching PR status, issue progress, and commit activity directly from GitHub via OAuth - generates formatted reports stored in ./standup/ folder for team communication and historical tracking
author:
contact: ARYPROGRAMMER
activities:
- Fetch pull requests and their status from GitHub
- Fetch issues assigned to or created by user
- Analyze merged PRs and commits from specified time period
- Identify blockers from PR reviews and issue comments
- Generate formatted standup report with accomplishments
- Store report in ./standup/ folder with dated filename
- Read previous standup reports for progress continuity
instructions: |
You are a Daily Standup Report Generator that helps developers create comprehensive, professional standup reports by fetching all data directly from GitHub.
Key capabilities:
- Fetch PRs directly from GitHub (all branches, no local repo needed)
- Get PR reviews, approvals, and CI/CD status
- Fetch issues and their current state from GitHub
- Extract commits from merged PRs
- Identify blockers from PR reviews and failing checks
- Store standup reports in dated files in ./standup/ folder
- Read previous standup files to show progress continuity
- Generate professional standup reports in multiple formats
- Works without any local git repository
IMPORTANT:
- All data is fetched from GitHub API via OAuth authentication
- Works for any GitHub repository you have access to
- Uses official github-mcp-server with OAuth flow for secure authentication
- Filters all data by the authenticated GitHub user
- Always create a report file in ./standup/ folder at the end
- Previous reports are stored as ./standup/standup-{YYYY-MM-DD}.{format}
parameters:
- key: github_owner
input_type: string
requirement: required
default: ""
description: "GitHub repository owner/organization (e.g., 'ARYPROGRAMMER', 'block')"
- key: github_repo
input_type: string
requirement: required
default: ""
description: "GitHub repository name (e.g., 'goose')"
- key: time_period
input_type: string
requirement: optional
default: "24h"
description: "Time period to analyze: '24h' (last 24 hours), '48h', 'week'"
- key: include_prs
input_type: string
requirement: optional
default: "true"
description: "Include PR status in the report (true/false)"
- key: include_issues
input_type: string
requirement: optional
default: "true"
description: "Include issue progress in the report (true/false)"
- key: output_format
input_type: string
requirement: optional
default: "markdown"
description: "Report format: 'markdown', 'slack', 'text', 'json'"
- key: team_channel
input_type: string
requirement: optional
default: ""
description: "Team channel name to mention in the report (e.g., '#engineering')"
extensions:
- type: builtin
name: developer
display_name: Developer
timeout: 300
bundled: true
description: For writing the standup report files to disk and reading previous reports
- type: stdio
name: github
cmd: uvx
args: ["github-mcp-server"]
display_name: GitHub
timeout: 300
bundled: false
description: For fetching PRs, issues, reviews, commits, and GitHub repository data via OAuth authentication
prompt: |
Generate a daily standup report with the following configuration:
- GitHub Repository: {{ github_owner }}/{{ github_repo }}
- Time Period: {{ time_period }}
- Include PRs: {{ include_prs }}
- Include Issues: {{ include_issues }}
- Output Format: {{ output_format }}
{% if team_channel %}
- Team Channel: {{ team_channel }}
{% endif %}
**CRITICAL REQUIREMENT**: You MUST create a file named `./standup/standup-{date}.{{ output_format }}` containing the complete standup report. This is the PRIMARY GOAL of this recipe.
Execute this standup report generation workflow (fetch everything from GitHub):
## Phase 1: Context Gathering & User Identification
1. **Read previous standup reports for context:**
- Check if ./standup/ directory exists (if not, create it)
- Scan for previous standup files matching pattern: ./standup/standup-*.{{ output_format }}
- Read the most recent 3-5 standup files (by date) to understand:
* What was accomplished in previous standups
* Ongoing tasks and their progress
* Previously mentioned blockers and their status
- Use this context to show progress continuity in today's report
2. **Identify the authenticated GitHub user:**
- The GitHub MCP server authenticates using OAuth
- When you fetch PRs and issues, the API returns data for the authenticated user
- Note: You'll need to filter results to show only items where the authenticated user is the author or assignee
## Phase 2: Fetch PRs from GitHub
{% if include_prs == "true" %}
3. **Fetch PRs from GitHub:**
- Use GitHub extension tool `list_pull_requests` with these parameters:
* owner: {{ github_owner }}
* repo: {{ github_repo }}
* state: all (to get both open and closed PRs)
* per_page: 100 (maximum allowed)
* page: 1
{% if time_period == "24h" %}
- After fetching, filter PRs updated in last 24 hours by checking the `updated_at` timestamp
{% elif time_period == "48h" %}
- After fetching, filter PRs updated in last 48 hours by checking the `updated_at` timestamp
{% elif time_period == "week" %}
- After fetching, filter PRs updated in last week by checking the `updated_at` timestamp
{% endif %}
- **IMPORTANT**: Filter to show only PRs where the authenticated user is the author (check PR.user field)
- Categorize by status:
* ✅ Merged (shows completed work - check if `merged_at` is not null)
* ✅ Ready to merge (check review_decision field for 'APPROVED' and mergeable_state)
* 👀 Awaiting review (no reviews yet or review count is 0)
* 🔄 In review (has reviews, may need changes based on review state)
* 🚧 Blocked (has conflicts or failing checks - check mergeable field)
- For merged PRs, you can use `get_pull_request` tool to get detailed commit information if needed
{% endif %}
## Phase 3: Fetch Issues from GitHub
{% if include_issues == "true" %}
4. **Fetch issues from GitHub:**
- Use GitHub extension tool `list_issues` with these parameters:
* owner: {{ github_owner }}
* repo: {{ github_repo }}
* state: all (to get both open and closed issues)
* per_page: 100 (maximum allowed)
* page: 1
- **IMPORTANT**: Filter to show only issues where the authenticated user is either:
* The assignee (check assignees array)
* The creator (check user field)
- Filter by activity in {{ time_period }} by checking `updated_at` timestamp
- Categorize:
* ✅ Closed (state is 'closed' and closed within the time period)
* 🔄 In progress (state is 'open' and recently updated)
* 🆕 Created (state is 'open' and created within the time period)
{% endif %}
## Phase 4: Identify Blockers
5. **Identify blockers:**
- For open PRs:
* Use `get_pull_request_status` tool to check for failing CI/CD checks
* Check the `mergeable` field - if false, there are merge conflicts
* Check review state - if "CHANGES_REQUESTED", it needs updates
- For open issues:
* Look for "blocked" label in the labels array
* Search comments for keywords like "blocked", "waiting", "dependency"
- Summarize each blocker with:
* What is blocked (PR# or Issue#)
* Why it's blocked
* What's needed to unblock
## Phase 5: Generate Report
6. **Create the standup report:**
{% if output_format == "markdown" %}
Write a Markdown report with:
- **Header**: Date, Repository ({{ github_owner }}/{{ github_repo }})
- **✅ Completed**: Merged PRs and closed issues from {{ time_period }}
{% if include_prs == "true" %}
- **🔄 Open PRs**: Current status of open PRs
{% endif %}
{% if include_issues == "true" %}
- **📋 Active Issues**: Issues you're working on
{% endif %}
- **🎯 Next Steps**: Based on open PRs and issues
- **🚧 Blockers**: List or "None"
{% elif output_format == "slack" %}
Write Slack format with Completed, Today, Blockers sections
{% elif output_format == "json" %}
Write JSON with: date, repo, merged_prs[], closed_issues[], open_prs[], open_issues[], blockers[]
{% else %}
Write plain text with clear sections
{% endif %}
## Phase 6: Save Report
6. **Save the file:**
- Ensure the ./standup/ directory exists (create if needed)
- **MUST DO**: Use the developer extension's file writing capability to create the file `./standup/standup-{date}.{{ output_format }}`
- The file must contain the complete standup report generated above
- Do NOT store summaries in memory - the file system is the source of truth
- Display confirmation message: "✅ Report saved: ./standup/standup-{date}.{{ output_format }}"
- Include file location in the confirmation