Error handling convention for ALL bash commands in this skill:
- IF command exits non-zero → capture stderr, print diagnostic, then fallback:
✗ {command} failed: {stderr summary} → Try: {suggested fix} → Fallback: {what the skill does instead} - IF command returns empty stdout when a result is expected → treat as ⚠ warn, note it, proceed
- Never stop the entire skill for a single command failure — degrade gracefully and skip the affected section
0. Validate Environment
Check Linear CLI:
- Run
linear auth whoami 2>&1 - IF command not found → set LINEAR_AVAILABLE=false, warn:
✗ linear CLI not found → Try: Install from https://github.com/schpet/linear-cli → Fallback: Running git-only standup (Linear sections will be skipped) - ELIF output contains auth error or exit code non-zero → set LINEAR_AVAILABLE=false, warn: `
✗ linear CLI not authenticated → Try: Runlinear authto log in → Fallback: Running git-only standup` - ELSE → LINEAR_AVAILABLE=true
- Check if inside a git repo:
git rev-parse --is-inside-work-tree 2>&1(still useful without one, just skip git sections)
Read project scope:
- IF
.linear-projectexists:
- Read and trim: PROJECT=$(cat.linear-project | tr -d '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - IF empty after trim → continue unscoped - ELSE → note: "Scoped to Linear project: {name}"
- IF missing → continue unscoped (no warning — standup should be frictionless)
- Store
PROJECT_FLAGas${PROJECT:+--project "$PROJECT"}for use in alllinearcalls
1. Gather Data
From Linear (skip entirely if LINEAR_AVAILABLE=false):
linear issue list -s completed --limit 10 $PROJECT_FLAG 2>&1— recently completed
- IF fails → warn and set COMPLETED_ISSUES=empty
linear issue list -s started --limit 10 $PROJECT_FLAG 2>&1— in-progress
- IF fails → warn and set STARTED_ISSUES=empty
linear issue list -s unstarted --limit 10 $PROJECT_FLAG 2>&1— backlog
- IF fails → warn and set BACKLOG_ISSUES=empty
From Git (if in a repo):
git log --oneline --since="24 hours ago"— yesterday's commitsgit log --oneline --since="48 hours ago"— extended window for stale detectiongit branch --list— active branches- Current branch
From GSD (if.planning/ exists):
- Read STATE.md for phase context
- Check for incomplete phases
2. Build Standup Report
Print a formatted report:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRODUCT ► DAILY STANDUP [{project-name or "All Projects"}]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Done (last 24h):
✓ ENG-123 — Added auth flow (3 commits)
✓ ENG-124 — Fixed mobile nav regression
In Progress:
→ ENG-125 — Payment integration (branch: eng-125-payments, 2 commits)
⚠ ENG-126 — Dashboard redesign (no commits in 3 days)
Up Next:
○ ENG-127 — Urgent — API rate limiting
○ ENG-128 — High — Email notifications
Blockers:
❌ ENG-126 — Stale: in-progress since Mon, no commits since then
❌ ENG-129 — Blocked by ENG-125 (payment integration)3. Detect Issues
Automatically flag problems:
Stale issues:
- Any issue In Progress with no matching commits in 48h+
- For each: note how long it's been stale
Orphan work:
- Commits in the last 24h that don't reference any Linear issue
- IF scoped: "Found 3 commits not tied to any issue in {project-name}. Track them?"
- IF unscoped: "Found 3 commits not tied to any Linear issue. Track them?"
Overloaded WIP:
- If more than 3 issues are In Progress simultaneously
- "You have N issues in progress. Consider finishing some before starting new ones."
Due date warnings:
- Any issue due today or overdue
- "ENG-130 is due today and still In Progress"
GSD misalignment (if.planning/ exists):
- Active GSD phase that doesn't match any In Progress Linear issue
- Linear issue In Progress with no corresponding GSD phase
4. Focus Plan
Based on the data, propose a focus plan for today:
Suggested focus for today:
──────────────────────────
1. [Priority] ENG-126 — Unblock: dashboard redesign has been stalled 3 days
2. [Continue] ENG-125 — Payment integration (in progress, momentum)
3. [Start] ENG-127 — API rate limiting (urgent, unstarted)Explain the reasoning briefly:
- Why this order (urgency, staleness, momentum, dependencies)
- What to skip or defer if time is short
5. Confirm or Adjust
Ask: "Does this plan work for today, or do you want to adjust priorities?"
- Looks good → "Alright. Run
/product:start-taskwhen you're ready to pick up the first item." - Adjust → gather changes, update the plan
- IF a stale issue was flagged: Ask: "What's the status on ENG-126? Should I update Linear?"
- Still working → keep as-is - Blocked → add blocker comment - Deprioritized → move back to backlog - Done → move to Done
<success_criteria>
- Complete picture of yesterday's work, current state, and upcoming work
- Every stale or blocked issue surfaced with explicit user resolution
- Concrete focus plan for today presented
- User confirmed or adjusted the plan
- Any Linear status corrections applied </success_criteria>