From nanopm
Generates daily standup briefings from GitHub, Linear, Google Calendar, and Granola. Surfaces meetings, cross-repo commits, and priorities. Works outside codebases.
How this skill is triggered — by the user, by Claude, or both
Slash command
/nanopm:pm-standupThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!-- portability-v2 -->
Multi-host portability rules. When invoking
AskUserQuestion:
- The
headerfield MUST be a short noun phrase (≤ 12 characters). Mistral Vibe rejects longer headers withstring_too_long. Pick from:Start,Target,Scope,Audience,Methodology,Feature,Question.- The
optionslist MUST have at least 2 items. Vibe rejects empty/single-option calls. For free-text input, always provide ≥ 2 framing options (e.g.Yes, here's the input/Skip) — never callask_user_questionwithoptions: [].
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || \
source .nanopm/lib/nanopm.sh 2>/dev/null || \
{ echo "ERROR: nanopm not installed. Run: curl -fsSL https://raw.githubusercontent.com/nmrtn/nanopm/main/setup | bash"; exit 1; }
nanopm_preamble
_STANDUP_FILE=".nanopm/STANDUP.md"
Run /pm-standup at the start of your workday to:
This skill never asks questions. It reads context, generates the briefing, done.
GitHub — multi-repo commits (last 24h):
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
_TIER_GITHUB=$(nanopm_has_connector github)
echo "GITHUB_TIER: $_TIER_GITHUB"
If GITHUB tier is MCP or API:
GET /search/commits?q=author:{username}+committer-date:>{yesterday_iso}&sort=committer-date[repo-name] commit messageIf GITHUB not available: fall back to local git:
git log --since="24 hours ago" --oneline --no-merges 2>/dev/null | head -10 || echo "NO_GIT"
Note in output: "(local repo only — connect GitHub for multi-repo view)"
First-run repo list: On first run, store the list of active repos found via GitHub API:
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
nanopm_config_get "github_active_repos"
If empty: fetch repos with pushes in the last 30 days, store as comma-separated list:
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
nanopm_config_set "github_active_repos" "{repo1},{repo2},..."
This speeds up subsequent runs — only query known active repos instead of all repos.
Linear (if available):
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
_TIER_LINEAR=$(nanopm_has_connector linear)
echo "LINEAR_TIER: $_TIER_LINEAR"
If LINEAR tier is MCP or API:
If LINEAR not available: read .nanopm/ROADMAP.md and check for any manually updated status.
Roadmap drift check:
[ -f ".nanopm/ROADMAP.md" ] && echo "ROADMAP_EXISTS" || echo "ROADMAP_MISSING"
_CHALLENGES=".nanopm/CHALLENGES.md"; [ -f "$_CHALLENGES" ] || _CHALLENGES=".nanopm/AUDIT.md" # legacy pre-rename name
[ -f "$_CHALLENGES" ] && echo "CHALLENGES_EXISTS" || echo "CHALLENGES_MISSING"
If ROADMAP_EXISTS: scan for items marked as "this week" or current sprint. Cross-reference with GitHub commits — flag items with no recent commits across any repo.
Granola — recent meetings (last 48h):
Try mcp__claude_ai_Granola__list_meetings with limit: 5.
If available: extract meetings from the last 48h. For each:
If Granola not available: skip silently.
Try mcp__claude_ai_Google_Calendar__gcal_list_events with:
If available, for each event extract:
Prep flag logic: If an event title contains a feature name or product area AND there are no git commits touching that area in the last 48h → flag as "⚠ no recent progress on this topic"
If Google Calendar not available: skip the MEETINGS section silently.
Output the standup briefing — concise, scannable, no fluff:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STANDUP — {Day, Date} · {project slug}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
YESTERDAY
✓ [{repo}] {commit message}
✓ [{repo}] {commit message}
✓ {if nothing shipped: "No commits in the last 24h"}
{if Granola had a user meeting: "📋 User call with {name} — run /pm-interview to extract signal"}
TODAY'S MEETINGS
{HH:MM} → {event title} ({duration}) {⚠ no recent commits on this topic — if flagged}
{if no calendar connected: omit this section entirely}
PRIORITIES
→ {priority 1 — inferred from roadmap + in-progress items}
→ {priority 2}
→ {priority 3 if relevant}
BLOCKERS
⚠ {any blocked Linear issues, or "None"}
DRIFT
{if something was planned this week but has no commits: flag it here}
{if nothing drifted: "On track"}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rules for PRIORITIES:
Rules for DRIFT:
Rules for TODAY'S MEETINGS:
Write the briefing to .nanopm/STANDUP.md (overwrite — always the latest).
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
nanopm_context_append "{\"skill\":\"pm-standup\",\"outputs\":{\"date\":\"$(date +%Y-%m-%d)\",\"drift\":\"$(grep -c 'DRIFT' .nanopm/STANDUP.md 2>/dev/null || echo 0)\"}}"
Do NOT ask the user anything. Do NOT wait for input. Generate and display the briefing immediately.
STATUS: DONE
npx claudepluginhub nmrtn/nanopm --plugin nanopmGenerates daily standup reports aggregating 24h GitHub activity (PRs, commits, reviews) and Linear issues by status (In Progress, Todo, blockers). Ideal for morning prep or activity summaries.
Generates standup updates summarizing recent commits, PRs, ticket changes, and activity into yesterday/today/blockers format. Works with connected source control/project tools or standalone notes.
Generates daily standup notes from Git commit history, Jira tickets, Obsidian vaults, and calendars for async-first remote teams.