gh-daily · diff

v1.0.0 to v1.1.0

79 added, 188 removed. Audit A to A.

---
name: gh-daily
- description: Generate standup reports from GitHub Issues activity and git history.
+ description: Generate a GitHub-based standup report from assigned issues, open/merged PRs, review requests, and git commit history. Use when the user asks for a standup, daily update, or status report and works with GitHub Issues/PRs. Trigger phrases include "standup report", "daily update", "what did I do yesterday", "GitHub status report". Not for Jira-based standups (use jira-daily) — gh-daily is GitHub-only and never queries Jira.
metadata:
author: mgiovani
- version: 1.0.0
- source: https://github.com/mgiovani/skills
+ version: 1.1.0
disable-model-invocation: true
---
- # Gh Daily
-
- > **Cross-Platform AI Agent Skill**
- > This skill works with any AI agent platform that supports the skills.sh standard.
-
# GitHub Daily - Standup Meeting Preparation
- Smart standup report generator that analyzes GitHub Issues activity, pull requests, notifications, and git history to provide structured updates for daily meetings.
+ Generates a standup report from GitHub Issues, PRs, notifications, and git history.
## Anti-Hallucination Guidelines
- **CRITICAL**: Standup reports must reflect ACTUAL work done:
- 1. **Only list real issues** - Every issue/PR must come from `gh` CLI output
- 2. **Verify completion** - Only mark as "Completed" if state is `closed` or PR is `merged`
- 3. **Real commit counts** - Use actual `git log` output, never estimate
- 4. **Actual blockers** - Only mention blockers explicitly labeled or commented in GitHub
- 5. **True metrics** - All numbers from actual GitHub and git data
-
- ## Context Detection
+ Standup reports must reflect actual work done, not guesses:
+ 1. Only list issues/PRs that came back from `gh` CLI output.
+ 2. Only mark "Completed" if state is `closed` or PR is `merged`.
+ 3. Use real `git log` counts, never estimate.
+ 4. Only mention blockers that are explicitly labeled or commented in GitHub.
+ 5. Only include a report section if Phase 3 actually gathered data for it. Never fill a section with placeholder text like "[List any risks]" — omit the section entirely instead.
- ### Phase 1: Determine Repository and User
+ ## Phase 1: Determine Repository and User
- Detect the working context in order of priority:
- 1. **Command argument**: `--repo owner/repo` or `-r owner/repo`
- 2. **Current git remote**: Parse from `git remote get-url origin`
- 3. **gh CLI default**: Use `gh repo view --json nameWithOwner -q .nameWithOwner`
+ Detect context in order of priority: `--repo owner/repo` argument, current git remote, then `gh` CLI default.
```bash
- # Detect current repo from git remote
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null)
if [ -z "$REPO" ]; then
- echo "ERROR: Not in a GitHub repository. Use --repo owner/repo to specify."
+ echo "ERROR: Not in a GitHub repository. Use --repo owner/repo to specify."
fi
echo "Detected repo: $REPO"
- # Detect authenticated user
GH_USER=$(gh api user -q .login 2>/dev/null)
echo "Authenticated as: $GH_USER"
+ ```
+
If no repo is detected and none provided, ask the user to specify with `--repo owner/repo`.
- If the user works across multiple repos, offer to scan all repos where they have recent activity:
+ If `--all-repos` is passed, skip the single-repo detection above and instead collect the repo list to scan:
+
```bash
- # Find repos with recent activity (issues assigned to user)
- gh search issues --assignee @me --state open --limit 20 --json repository --jq '[.[].repository.nameWithOwner] | unique | .[]'
- ## Workflow
+ REPOS=$(gh search issues --assignee @me --state open --limit 20 --json repository --jq '[.[].repository.nameWithOwner] | unique | .[]')
+ ```
- ### Phase 2: Calculate Date Range
+ Run Phase 3 once per repo in `$REPOS`, passing each as `--repo` in turn, and concatenate the results before Phase 4. Without `--all-repos`, `$REPO` is a single value and every Phase 3 command below must pass `--repo "$REPO"`.
+ ## Phase 2: Calculate Date Range
+
```bash
- # Calculate since date (yesterday, or Friday if today is Monday)
+ # Report from Friday if today is Monday, otherwise from yesterday
if [[ $(date +%u) == 1 ]]; then
- # Monday - report from Friday
- SINCE_DATE=$(date -v-3d +%Y-%m-%d 2>/dev/null || date -d "3 days ago" +%Y-%m-%d)
+ SINCE_DATE=$(date -v-3d +%Y-%m-%d 2>/dev/null || date -d "3 days ago" +%Y-%m-%d)
else
- # Other days - report from yesterday
- SINCE_DATE=$(date -v-1d +%Y-%m-%d 2>/dev/null || date -d "yesterday" +%Y-%m-%d)
+ SINCE_DATE=$(date -v-1d +%Y-%m-%d 2>/dev/null || date -d "yesterday" +%Y-%m-%d)
fi
echo "Reporting since: $SINCE_DATE"
- ### Phase 3: Gather Activity Data
+ ```
- ```bash
- # Get issues assigned to me (open)
- gh issue list --assignee @me --state open --json number,title,state,labels,milestone,updatedAt,createdAt --limit 50
+ `--since <date>` overrides `$SINCE_DATE` directly.
- # Get issues closed recently (by me)
- gh issue list --assignee @me --state closed --json number,title,state,labels,closedAt,milestone --limit 20 | jq --arg since "$SINCE_DATE" '[.[] | select(.closedAt >= $since)]'
+ ## Phase 3: Gather Activity Data
- # Get PRs authored by me (open)
- gh pr list --author @me --state open --json number,title,state,reviewDecision,isDraft,labels,updatedAt --limit 30
+ Every `gh issue`/`gh pr` command below takes `--repo "$REPO"` (or the current repo in the `--all-repos` loop) — omitting it lets `gh` fall back to whatever repo the CLI feels like, silently pulling data for the wrong project.
- # Get PRs merged recently
- gh pr list --author @me --state merged --json number,title,mergedAt,labels --limit 20 | jq --arg since "$SINCE_DATE" '[.[] | select(.mergedAt >= $since)]'
+ ```bash
+ # Issues assigned to me (open)
+ gh issue list --repo "$REPO" --assignee @me --state open --json number,title,state,labels,milestone,updatedAt,createdAt --limit 50
- # Get PRs where my review is requested
- gh pr list --search "review-requested:@me" --state open --json number,title,author,updatedAt,labels --limit 20
+ # Issues closed recently (by me)
+ gh issue list --repo "$REPO" --assignee @me --state closed --json number,title,state,labels,closedAt,milestone --limit 20 | jq --arg since "$SINCE_DATE" '[.[] | select(.closedAt >= $since)]'
- # Get notifications (mentions, review requests, assignments)
- gh api notifications --jq '.[] | select(.unread == true) | {reason: .reason, title: .subject.title, type: .subject.type, url: .subject.url}'
+ # PRs authored by me (open)
+ gh pr list --repo "$REPO" --author @me --state open --json number,title,state,reviewDecision,isDraft,labels,updatedAt --limit 30
- # Get git activity
- git log --author="$(git config user.email)" --since="$SINCE_DATE" --oneline --all --no-merges
+ # PRs merged recently
+ gh pr list --repo "$REPO" --author @me --state merged --json number,title,mergedAt,labels --limit 20 | jq --arg since "$SINCE_DATE" '[.[] | select(.mergedAt >= $since)]'
- # Count commits and files changed
+ # Git activity
+ git log --author="$(git config user.email)" --since="$SINCE_DATE" --oneline --all --no-merges
git rev-list --count --since="$SINCE_DATE" --author="$(git config user.email)" --all 2>/dev/null || echo "0"
- git diff --stat $(git log --since="$SINCE_DATE" --author="$(git config user.email)" --format=%H --all | tail -1)..HEAD --shortstat 2>/dev/null
- ### Phase 4: Analyze with SubAgents (For Comprehensive Reports)
+ ```
- For detailed format, use parallel analysis:
+ Run these two only when reviews are in scope — always for `--format detailed` (the default), and for any other format when `--include-reviews` is passed. Skip them otherwise; don't spend the extra API calls on a report that won't use the data.
+ ```bash
+ # PRs where my review is requested
+ gh pr list --repo "$REPO" --search "review-requested:@me" --state open --json number,title,author,updatedAt,labels --limit 20
+
+ # Unread notifications (mentions, review requests, assignments)
+ gh api notifications --jq '.[] | select(.unread == true) | {reason: .reason, title: .subject.title, type: .subject.type, url: .subject.url}'
```
- Agent 1 - Work Classification:
- - prompt: "Classify these GitHub issues and PRs into: Completed (closed/merged since date), In Progress (open, recently updated), Blocked (has 'blocked' label or mentioned in comments), Review Needed (PRs awaiting review). Base ONLY on actual state/label fields. Return categorized list."
- - agent-type: "general-purpose"
- Agent 2 - Impact Analysis:
- - prompt: "For completed issues and merged PRs, summarize the business/technical impact based on title, labels, and milestone context. Keep it factual."
- - agent-type: "general-purpose"
+ ## Phase 4: Classify and Score
- Agent 3 - Git Correlation:
- - prompt: "Match git commits to GitHub issues/PRs by issue number in commit messages (e.g., #123, fixes #456). Report which issues have code changes and quantify work per issue."
- - agent-type: "Explore"
- ### Phase 5: Generate Report
+ Classify each issue/PR from the JSON already gathered above — no subagents needed, this is a direct pass over data you already have:
+ - **Completed**: state is `closed` (issues) or `merged` (PRs) since `$SINCE_DATE`.
+ - **In Progress**: open, `updatedAt` within the window.
+ - **Blocked**: has a `blocked`/`blocking` label or a comment mentioning a blocker.
+ - **Review Needed**: open PRs from the review-requested query (only present when reviews were gathered in Phase 3).
- Track sections completed with TodoWrite.
+ Match git commits to issues/PRs by number references in commit messages (`#123`, `fixes #456`) to show which issues have code changes.
- ## Priority Scoring
+ Optionally prioritize within each category using label/milestone signals: `priority: critical`/`P0` and `blocked` labels surface first, then items closest to a milestone due date, then stale items (>7 days no update).
- When analyzing issues, score them using these factors:
+ ## Phase 5: Generate Report
- - **Label Priority**: `priority: critical` or `P0` = x10, `priority: high` or `P1` = x7, `priority: medium` or `P2` = x4
- - **Milestone Proximity**: Days until milestone due date (lower = higher score)
- - **Issue Age**: Stale issues (>7 days no update) get flagged
- - **Blocking Status**: Has `blocked` or `blocking` label = +5 points
- - **Review Requested**: PRs where your review is pending = +3 points
- - **Bug vs Feature**: Issues labeled `bug` with high priority = +4 points
- - **Mentions/Comments**: Recent @mentions or comments = +2 points
+ Track sections completed with TodoWrite, then render using one of the formats below. Every section in the template is conditional on having matching data from Phase 3/4 — a report with nothing blocked has no Blockers section, a report with no milestone data has no Milestone section. Never invent numbers or fill a heading with placeholder brackets to keep a section "complete."
## Output Formats
- For detailed output format templates (default, brief, slack), see [references/output-formats.md](references/output-formats.md).
+ For the default, brief, and slack templates, see [references/output-formats.md](references/output-formats.md) (load when rendering the final report).
- **Available formats:**
- - **Default (Detailed)**: Full report with completed work, in-progress items, PRs, blockers, metrics, and schedule
- - **Brief** (`--format brief`): Concise one-line-per-section format for quick standups
- - **Slack** (`--format slack`): Formatted for Slack/Teams posting with markdown
+ - **Default (detailed)**: full report with completed work, in-progress items, PRs, blockers, reviews requested.
+ - **Brief** (`--format brief`): one line per section, for quick standups.
+ - **Slack** (`--format slack`): markdown formatted for posting in Slack/Teams.
## Command Options
- ### `--repo <owner/repo>` or `-r <owner/repo>`
- Specify the GitHub repository explicitly.
- ```bash
- gh-daily --repo myorg/myapp
- ### `--since <date>`
- Override the automatic date calculation.
- ```bash
- gh-daily --since 2025-01-20
- ### `--format <format>`
- Choose output format for different audiences.
- ```bash
- gh-daily --format brief # Concise version for quick standups
- gh-daily --format detailed # Full version with technical details (default)
- gh-daily --format slack # Formatted for Slack/Teams posting
- ### `--all-repos`
- Scan all repos where you have recent assigned issues, not just the current repo.
- ```bash
- gh-daily --all-repos
- ### `--include-reviews`
- Include PRs where your review was requested (shown separately by default only in detailed format).
- ```bash
- gh-daily --format brief --include-reviews
- ## Smart Features
-
- ### Context Awareness
- - Detect Monday condition and report from last Friday
- - Identify milestone boundaries and adjust progress tracking
- - Recognize critical/blocking issues via labels and highlight urgency
- - Correlate git commits with GitHub issue references (`#123`, `fixes #456`)
- - Detect cross-repo activity when using `--all-repos`
-
- ### Progress Intelligence
- - Calculate milestone completion percentage
- - Compare current throughput to recent averages
- - Identify patterns in blocking issues
- - Track code review participation and response times
-
- ### Goal Alignment
- - Map completed work to milestone objectives
- - Highlight work that unblocks teammates
- - Identify contributions to team goals
- - Suggest proactive communications
-
- ## Integration Points
-
- ### With gh-todo Skill
- - Reference yesterday's planned work vs. actual completion
- - Update priority recommendations based on standup outcomes
-
- ### With git-commit / git-create-pr Skills
- - Parse commit messages for automatic work categorization
- - Link git branches to issues for complete picture
- - Integrate with PR status for review workflow visibility
-
- ### With Development Tools
- - Check current git branch for active issue context
- - Correlate file changes with issue scope
- - Identify stale branches needing cleanup
+ - `--repo <owner/repo>` / `-r <owner/repo>` — specify the repository explicitly.
+ - `--since <date>` — override the automatic date calculation, e.g. `--since 2025-01-20`.
+ - `--format <brief|detailed|slack>` — choose output format (default: detailed).
+ - `--all-repos` — scan all repos where you have recent assigned issues (see Phase 1); runs Phase 3 once per repo.
+ - `--include-reviews` — include PRs where your review was requested. Detailed format gathers this by default; brief and slack need the flag to include it.
## Usage Examples
```bash
- # Basic usage (auto-detects repo, yesterday's activity)
- gh-daily
-
- # Specify repo explicitly
- gh-daily --repo myorg/backend
-
- # Quick standup format
- gh-daily --format brief
-
- # For Slack posting
- gh-daily --format slack
-
- # Custom date range
- gh-daily --since 2025-01-15
-
- # All repos you contribute to
- gh-daily --all-repos
-
- # Weekly summary
- gh-daily --since $(date -v-7d +%Y-%m-%d 2>/dev/null || date -d "7 days ago" +%Y-%m-%d)
- ## Daily Routine Integration
-
- ### Morning Preparation (5 minutes)
- ```bash
- gh-daily --format brief
- # Review and adjust for accuracy
- # Copy to standup notes
- ### Standup Meeting (2 minutes per person)
- - Read directly from generated report
- - Add context or clarifications as needed
- - Note any team dependencies or offers to help
-
- ### Weekly Summary
- ```bash
- gh-daily --since $(date -v-7d +%Y-%m-%d 2>/dev/null || date -d "7 days ago" +%Y-%m-%d) --format detailed
- ## Quality Checklist
-
- The report ensures the standup covers:
- - [ ] Concrete accomplishments with business impact
- - [ ] Clear current work with scope context
- - [ ] Specific blockers with escalation plans
- - [ ] PR review status and pending reviews
- - [ ] Milestone/goal alignment and risk identification
- - [ ] Proactive communication about dependencies
+ gh-daily # auto-detect repo, yesterday's activity
+ gh-daily --repo myorg/backend # specify repo
+ gh-daily --format brief # quick standup
+ gh-daily --format slack # for Slack posting
+ gh-daily --since 2025-01-15 # custom date range
+ gh-daily --all-repos # all repos you contribute to
+ gh-daily --since $(date -v-7d +%Y-%m-%d 2>/dev/null || date -d "7 days ago" +%Y-%m-%d) --format detailed # weekly summary
+ ```
## Important Notes
- - **Requires gh CLI**: Install from https://cli.github.com/ and authenticate with `gh auth login`
- - **Authentication**: Must be logged in (`gh auth status` to verify)
- - **Repository context**: Auto-detected from git remote or specify with `--repo`
- - **Git integration**: Uses local git repository for commit analysis
- - **Real data only**: All metrics based on actual GitHub and git data
- - **Rate limits**: GitHub API has rate limits; `gh` CLI handles pagination automatically
+ - Requires `gh` CLI installed and authenticated (`gh auth login`, verify with `gh auth status`).
+ - Repository context is auto-detected from git remote or set with `--repo`.
+ - Git commit analysis uses the local git repository.
+ - All metrics come from actual GitHub and git data — never estimated.
+ - Not for Jira: this skill only talks to `gh`/`git`. Use `jira-daily` for a Jira-ticket-based standup, including in mixed environments where both trackers are in play.