Signed-off-by: Arya Pratap Singh <notaryasingh@gmail.com>
This commit is contained in:
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
|
||||||
Reference in New Issue
Block a user