From c46d3c343e937044b98443311aea5cf06762dc10 Mon Sep 17 00:00:00 2001 From: Arya Pratap Singh Date: Sat, 11 Oct 2025 03:40:09 +0530 Subject: [PATCH 1/3] feat: add Daily Standup Report Generator recipe (#5123) Signed-off-by: Arya Pratap Singh --- .../daily-standup-report-generator.yaml | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml diff --git a/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml new file mode 100644 index 000000000000..43b72f49752a --- /dev/null +++ b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml @@ -0,0 +1,200 @@ +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 - generates formatted reports for team communication +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 + - Track progress over time using memory + +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 + - Remember previous standups 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 (no local git commands) + - Works for any GitHub repository you have access to + - Requires GITHUB_PERSONAL_ACCESS_TOKEN environment variable + - Filters all data by the authenticated GitHub user + - Always create a report file at the end + +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 file to disk + + - type: stdio + name: github + cmd: npx + args: ["-y", "@modelcontextprotocol/server-github"] + env: + GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}" + display_name: GitHub + timeout: 300 + bundled: false + description: For fetching PRs, issues, reviews, commits, and GitHub repository data + + - type: builtin + name: memory + display_name: Memory + timeout: 300 + bundled: true + description: For storing previous standups and tracking progress over time + +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-report-{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 + + 1. **Retrieve previous standup context from memory** (category: standup-reports) + + ## Phase 2: Fetch PRs from GitHub + + {% if include_prs == "true" %} + 2. **Fetch PRs from GitHub:** + - Use GitHub extension `list_pull_requests` with: + * owner: {{ github_owner }} + * repo: {{ github_repo }} + * state: all + * per_page: 30 + {% if time_period == "24h" %} + - Filter PRs updated in last 24 hours + {% elif time_period == "48h" %} + - Filter PRs updated in last 48 hours + {% elif time_period == "week" %} + - Filter PRs updated in last week + {% endif %} + - Look for PRs where YOU are the author/creator + - Categorize by status: + * ✅ Merged (shows completed work) + * ✅ Ready to merge (approved + checks passing) + * 👀 Awaiting review (no reviews yet) + * 🔄 In review (has reviews, needs changes) + * 🚧 Blocked (conflicts or failing checks) + - Extract commit messages from merged PRs to show what was accomplished + {% endif %} + + ## Phase 3: Fetch Issues from GitHub + + {% if include_issues == "true" %} + 3. **Fetch issues from GitHub:** + - Use GitHub extension `list_issues` with: + * owner: {{ github_owner }} + * repo: {{ github_repo }} + * state: all + * per_page: 30 + - Look for issues where YOU are assigned or the creator + - Filter by activity in {{ time_period }} + - Categorize: + * ✅ Closed (shows completed work) + * 🔄 In progress (open + recently updated) + * 🆕 Created (new issues you opened) + {% endif %} + + ## Phase 4: Identify Blockers + + 4. **Identify blockers:** + - Check open PRs for: merge conflicts, failing CI, "changes requested" reviews + - Check open issues for: "blocked" label, blocking keywords in comments + - Summarize each blocker briefly + + ## Phase 5: Generate Report + + 5. **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 %} + + 6. **Save the file:** + - **MUST DO**: Use developer extension to write report to `./standup-report-{date}.{{ output_format }}` + - Store summary in memory (category: standup-reports) + - Display: "✅ Report saved: standup-report-{date}.{{ output_format }}" From 4a0e2790ad6886469d8bc861410899483b013b49 Mon Sep 17 00:00:00 2001 From: Arya Pratap Singh Date: Sat, 11 Oct 2025 04:54:01 +0530 Subject: [PATCH 2/3] fixtures Signed-off-by: Arya Pratap Singh --- .../daily-standup-report-generator.yaml | 82 +++++++++++-------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml index 43b72f49752a..6893dee1647f 100644 --- a/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml +++ b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml @@ -116,63 +116,79 @@ prompt: | Execute this standup report generation workflow (fetch everything from GitHub): - ## Phase 1: Context Gathering + ## Phase 1: Context Gathering & User Identification 1. **Retrieve previous standup context from memory** (category: standup-reports) + 2. **Identify the authenticated GitHub user:** + - The GitHub MCP server authenticates using GITHUB_PERSONAL_ACCESS_TOKEN + - 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" %} - 2. **Fetch PRs from GitHub:** - - Use GitHub extension `list_pull_requests` with: + 3. **Fetch PRs from GitHub:** + - Use GitHub extension tool `list_pull_requests` with these parameters: * owner: {{ github_owner }} * repo: {{ github_repo }} - * state: all - * per_page: 30 + * state: all (to get both open and closed PRs) + * per_page: 100 (maximum allowed) + * page: 1 {% if time_period == "24h" %} - - Filter PRs updated in last 24 hours + - After fetching, filter PRs updated in last 24 hours by checking the `updated_at` timestamp {% elif time_period == "48h" %} - - Filter PRs updated in last 48 hours + - After fetching, filter PRs updated in last 48 hours by checking the `updated_at` timestamp {% elif time_period == "week" %} - - Filter PRs updated in last week + - After fetching, filter PRs updated in last week by checking the `updated_at` timestamp {% endif %} - - Look for PRs where YOU are the author/creator + - **IMPORTANT**: Filter to show only PRs where the authenticated user is the author (check PR.user field) - Categorize by status: - * ✅ Merged (shows completed work) - * ✅ Ready to merge (approved + checks passing) - * 👀 Awaiting review (no reviews yet) - * 🔄 In review (has reviews, needs changes) - * 🚧 Blocked (conflicts or failing checks) - - Extract commit messages from merged PRs to show what was accomplished + * ✅ 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" %} - 3. **Fetch issues from GitHub:** - - Use GitHub extension `list_issues` with: + 4. **Fetch issues from GitHub:** + - Use GitHub extension tool `list_issues` with these parameters: * owner: {{ github_owner }} * repo: {{ github_repo }} - * state: all - * per_page: 30 - - Look for issues where YOU are assigned or the creator - - Filter by activity in {{ time_period }} + * 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 (shows completed work) - * 🔄 In progress (open + recently updated) - * 🆕 Created (new issues you opened) + * ✅ 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 - 4. **Identify blockers:** - - Check open PRs for: merge conflicts, failing CI, "changes requested" reviews - - Check open issues for: "blocked" label, blocking keywords in comments - - Summarize each blocker briefly + 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 - 5. **Create the standup report:** + 6. **Create the standup report:** {% if output_format == "markdown" %} Write a Markdown report with: @@ -195,6 +211,8 @@ prompt: | {% endif %} 6. **Save the file:** - - **MUST DO**: Use developer extension to write report to `./standup-report-{date}.{{ output_format }}` - - Store summary in memory (category: standup-reports) - - Display: "✅ Report saved: standup-report-{date}.{{ output_format }}" + - **MUST DO**: Use the developer extension's file writing capability to create the file `./standup-report-{date}.{{ output_format }}` + - The file must contain the complete standup report generated above + - Store a summary in memory using the memory extension (category: standup-reports) for future context + - Display confirmation message: "✅ Report saved: standup-report-{date}.{{ output_format }}" + - Include file location in the confirmation From 45cfe679299e009fa81a057ad4979c05ae9062ed Mon Sep 17 00:00:00 2001 From: Arya Pratap Singh Date: Tue, 14 Oct 2025 21:22:33 +0530 Subject: [PATCH 3/3] fixtures Signed-off-by: Arya Pratap Singh --- .../daily-standup-report-generator.yaml | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml index 6893dee1647f..a4409935f307 100644 --- a/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml +++ b/documentation/src/pages/recipes/data/recipes/daily-standup-report-generator.yaml @@ -1,6 +1,6 @@ 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 - generates formatted reports for team communication +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 @@ -10,7 +10,8 @@ activities: - Analyze merged PRs and commits from specified time period - Identify blockers from PR reviews and issue comments - Generate formatted standup report with accomplishments - - Track progress over time using memory + - 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. @@ -21,16 +22,18 @@ instructions: | - Fetch issues and their current state from GitHub - Extract commits from merged PRs - Identify blockers from PR reviews and failing checks - - Remember previous standups to show progress continuity + - 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 (no local git commands) + - All data is fetched from GitHub API via OAuth authentication - Works for any GitHub repository you have access to - - Requires GITHUB_PERSONAL_ACCESS_TOKEN environment variable + - Uses official github-mcp-server with OAuth flow for secure authentication - Filters all data by the authenticated GitHub user - - Always create a report file at the end + - 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 @@ -81,25 +84,16 @@ extensions: display_name: Developer timeout: 300 bundled: true - description: For writing the standup report file to disk + description: For writing the standup report files to disk and reading previous reports - type: stdio name: github - cmd: npx - args: ["-y", "@modelcontextprotocol/server-github"] - env: - GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}" + cmd: uvx + args: ["github-mcp-server"] display_name: GitHub timeout: 300 bundled: false - description: For fetching PRs, issues, reviews, commits, and GitHub repository data - - - type: builtin - name: memory - display_name: Memory - timeout: 300 - bundled: true - description: For storing previous standups and tracking progress over time + description: For fetching PRs, issues, reviews, commits, and GitHub repository data via OAuth authentication prompt: | Generate a daily standup report with the following configuration: @@ -112,15 +106,23 @@ prompt: | - Team Channel: {{ team_channel }} {% endif %} - **CRITICAL REQUIREMENT**: You MUST create a file named `./standup-report-{date}.{{ output_format }}` containing the complete standup report. This is the PRIMARY GOAL of this recipe. + **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. **Retrieve previous standup context from memory** (category: standup-reports) + 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 GITHUB_PERSONAL_ACCESS_TOKEN + - 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 @@ -210,9 +212,12 @@ prompt: | Write plain text with clear sections {% endif %} + ## Phase 6: Save Report + 6. **Save the file:** - - **MUST DO**: Use the developer extension's file writing capability to create the file `./standup-report-{date}.{{ output_format }}` + - 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 - - Store a summary in memory using the memory extension (category: standup-reports) for future context - - Display confirmation message: "✅ Report saved: standup-report-{date}.{{ output_format }}" + - 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