mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 03:35:09 +02:00
feat: team-aware /retro v2.0 — per-person praise and growth opportunities
- Identify current user via git config, orient narrative as "you" vs teammates - Add per-author metrics: commits, LOC, focus areas, commit type mix, sessions - New "Your Week" section with personal deep-dive for whoever runs the command - New "Team Breakdown" with per-person praise and growth opportunities - Track AI-assisted commits via Co-Authored-By trailers - Personal + team shipping streaks - Tone: praise like a 1:1, growth like investment advice, never compare negatively Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+121
-32
@@ -1,9 +1,10 @@
|
||||
---
|
||||
name: retro
|
||||
version: 1.0.0
|
||||
version: 2.0.0
|
||||
description: |
|
||||
Weekly engineering retrospective. Analyzes commit history, work patterns,
|
||||
and code quality metrics with persistent history and trend tracking.
|
||||
Team-aware: breaks down per-person contributions with praise and growth areas.
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
@@ -13,7 +14,7 @@ allowed-tools:
|
||||
|
||||
# /retro — Weekly Engineering Retrospective
|
||||
|
||||
Generates a comprehensive engineering retrospective analyzing commit history, work patterns, and code quality metrics. Designed for a senior IC/CTO-level builder using Claude Code as a force multiplier.
|
||||
Generates a comprehensive engineering retrospective analyzing commit history, work patterns, and code quality metrics. Team-aware: identifies the user running the command, then analyzes every contributor with per-person praise and growth opportunities. Designed for a senior IC/CTO-level builder using Claude Code as a force multiplier.
|
||||
|
||||
## User-invocable
|
||||
When the user types `/retro`, run this skill.
|
||||
@@ -43,31 +44,42 @@ Usage: /retro [window]
|
||||
|
||||
### Step 1: Gather Raw Data
|
||||
|
||||
First, fetch origin to ensure we have the latest:
|
||||
First, fetch origin and identify the current user:
|
||||
```bash
|
||||
git fetch origin main --quiet
|
||||
# Identify who is running the retro
|
||||
git config user.name
|
||||
git config user.email
|
||||
```
|
||||
|
||||
The name returned by `git config user.name` is **"you"** — the person reading this retro. All other authors are teammates. Use this to orient the narrative: "your" commits vs teammate contributions.
|
||||
|
||||
Run ALL of these git commands in parallel (they are independent):
|
||||
|
||||
```bash
|
||||
# 1. All commits in window with timestamps, subject, hash, files changed, insertions, deletions
|
||||
git log origin/main --since="<window>" --format="%H|%ai|%s" --shortstat
|
||||
# 1. All commits in window with timestamps, subject, hash, AUTHOR, files changed, insertions, deletions
|
||||
git log origin/main --since="<window>" --format="%H|%aN|%ae|%ai|%s" --shortstat
|
||||
|
||||
# 2. Per-commit test vs total LOC breakdown (single command, parse output)
|
||||
# Each commit block starts with COMMIT:<hash>, followed by numstat lines.
|
||||
# 2. Per-commit test vs total LOC breakdown with author
|
||||
# Each commit block starts with COMMIT:<hash>|<author>, followed by numstat lines.
|
||||
# Separate test files (matching test/|spec/|__tests__/) from production files.
|
||||
git log origin/main --since="<window>" --format="COMMIT:%H" --numstat
|
||||
git log origin/main --since="<window>" --format="COMMIT:%H|%aN" --numstat
|
||||
|
||||
# 3. Commit timestamps for session detection and hourly distribution
|
||||
# 3. Commit timestamps for session detection and hourly distribution (with author)
|
||||
# Use TZ=America/Los_Angeles for Pacific time conversion
|
||||
TZ=America/Los_Angeles git log origin/main --since="<window>" --format="%at|%ai|%s" | sort -n
|
||||
TZ=America/Los_Angeles git log origin/main --since="<window>" --format="%at|%aN|%ai|%s" | sort -n
|
||||
|
||||
# 4. Files most frequently changed (hotspot analysis)
|
||||
git log origin/main --since="<window>" --format="" --name-only | grep -v '^$' | sort | uniq -c | sort -rn
|
||||
|
||||
# 5. PR numbers from commit messages (extract #NNN patterns)
|
||||
git log origin/main --since="<window>" --format="%s" | grep -oE '#[0-9]+' | sed 's/^#//' | sort -n | uniq | sed 's/^/#/'
|
||||
|
||||
# 6. Per-author file hotspots (who touches what)
|
||||
git log origin/main --since="<window>" --format="AUTHOR:%aN" --name-only
|
||||
|
||||
# 7. Per-author commit counts (quick summary)
|
||||
git shortlog origin/main --since="<window>" -sn --no-merges
|
||||
```
|
||||
|
||||
### Step 2: Compute Metrics
|
||||
@@ -77,6 +89,7 @@ Calculate and present these metrics in a summary table:
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Commits to main | N |
|
||||
| Contributors | N |
|
||||
| PRs merged | N |
|
||||
| Total insertions | N |
|
||||
| Total deletions | N |
|
||||
@@ -88,6 +101,17 @@ Calculate and present these metrics in a summary table:
|
||||
| Detected sessions | N |
|
||||
| Avg LOC/session-hour | N |
|
||||
|
||||
Then show a **per-author leaderboard** immediately below:
|
||||
|
||||
```
|
||||
Contributor Commits +/- Top area
|
||||
You (garry) 32 +2400/-300 browse/
|
||||
alice 12 +800/-150 app/services/
|
||||
bob 3 +120/-40 tests/
|
||||
```
|
||||
|
||||
Sort by commits descending. The current user (from `git config user.name`) always appears first, labeled "You (name)".
|
||||
|
||||
### Step 3: Commit Time Distribution
|
||||
|
||||
Show hourly histogram in Pacific time using bar chart:
|
||||
@@ -158,27 +182,54 @@ From commit diffs, estimate PR sizes and bucket them:
|
||||
- LOC changed
|
||||
- Why it matters (infer from commit messages and files touched)
|
||||
|
||||
### Step 9: Week-over-Week Trends (if window >= 14d)
|
||||
### Step 9: Team Member Analysis
|
||||
|
||||
For each contributor (including the current user), compute:
|
||||
|
||||
1. **Commits and LOC** — total commits, insertions, deletions, net LOC
|
||||
2. **Areas of focus** — which directories/files they touched most (top 3)
|
||||
3. **Commit type mix** — their personal feat/fix/refactor/test breakdown
|
||||
4. **Session patterns** — when they code (their peak hours), session count
|
||||
5. **Test discipline** — their personal test LOC ratio
|
||||
6. **Biggest ship** — their single highest-impact commit or PR in the window
|
||||
|
||||
**For the current user ("You"):** This section gets the deepest treatment. Include all the detail from the solo retro — session analysis, time patterns, focus score. Frame it in first person: "Your peak hours...", "Your biggest ship..."
|
||||
|
||||
**For each teammate:** Write 2-3 sentences covering what they worked on and their pattern. Then:
|
||||
|
||||
- **Praise** (1-2 specific things): Anchor in actual commits. Not "great work" — say exactly what was good. Examples: "Shipped the entire auth middleware rewrite in 3 focused sessions with 45% test coverage", "Every PR under 200 LOC — disciplined decomposition."
|
||||
- **Opportunity for growth** (1 specific thing): Frame as a leveling-up suggestion, not criticism. Anchor in actual data. Examples: "Test ratio was 12% this week — adding test coverage to the payment module before it gets more complex would pay off", "5 fix commits on the same file suggest the original PR could have used a review pass."
|
||||
|
||||
**If only one contributor (solo repo):** Skip the team breakdown and proceed as before — the retro is personal.
|
||||
|
||||
**If there are Co-Authored-By trailers:** Parse `Co-Authored-By:` lines in commit messages. Credit those authors for the commit alongside the primary author. Note AI co-authors (e.g., `noreply@anthropic.com`) but do not include them as team members — instead, track "AI-assisted commits" as a separate metric.
|
||||
|
||||
### Step 10: Week-over-Week Trends (if window >= 14d)
|
||||
|
||||
If the time window is 14 days or more, split into weekly buckets and show trends:
|
||||
- Commits per week
|
||||
- Commits per week (total and per-author)
|
||||
- LOC per week
|
||||
- Test ratio per week
|
||||
- Fix ratio per week
|
||||
- Session count per week
|
||||
|
||||
### Step 10: Streak Tracking
|
||||
### Step 11: Streak Tracking
|
||||
|
||||
Count consecutive days with at least 1 commit to origin/main, going back from today:
|
||||
Count consecutive days with at least 1 commit to origin/main, going back from today. Track both team streak and personal streak:
|
||||
|
||||
```bash
|
||||
# Get all unique commit dates (Pacific time) — no hard cutoff
|
||||
# Team streak: all unique commit dates (Pacific time) — no hard cutoff
|
||||
TZ=America/Los_Angeles git log origin/main --format="%ad" --date=format:"%Y-%m-%d" | sort -u
|
||||
|
||||
# Personal streak: only the current user's commits
|
||||
TZ=America/Los_Angeles git log origin/main --author="<user_name>" --format="%ad" --date=format:"%Y-%m-%d" | sort -u
|
||||
```
|
||||
|
||||
Count backward from today — how many consecutive days have at least one commit? This queries the full history so streaks of any length are reported accurately. Display: "Shipping streak: 47 consecutive days"
|
||||
Count backward from today — how many consecutive days have at least one commit? This queries the full history so streaks of any length are reported accurately. Display both:
|
||||
- "Team shipping streak: 47 consecutive days"
|
||||
- "Your shipping streak: 32 consecutive days"
|
||||
|
||||
### Step 11: Load History & Compare
|
||||
### Step 12: Load History & Compare
|
||||
|
||||
Before saving the new snapshot, check for prior retro history:
|
||||
|
||||
@@ -199,7 +250,7 @@ Deep sessions: 3 → 5 ↑2
|
||||
|
||||
**If no prior retros exist:** Skip the comparison section and append: "First retro recorded — run again next week to see trends."
|
||||
|
||||
### Step 12: Save Retro History
|
||||
### Step 13: Save Retro History
|
||||
|
||||
After computing all metrics (including streak) and loading any prior history for comparison, save a JSON snapshot:
|
||||
|
||||
@@ -223,6 +274,7 @@ Use the Write tool to save the JSON file with this schema:
|
||||
"window": "7d",
|
||||
"metrics": {
|
||||
"commits": 47,
|
||||
"contributors": 3,
|
||||
"prs_merged": 12,
|
||||
"insertions": 3200,
|
||||
"deletions": 800,
|
||||
@@ -236,15 +288,20 @@ Use the Write tool to save the JSON file with this schema:
|
||||
"loc_per_session_hour": 350,
|
||||
"feat_pct": 0.40,
|
||||
"fix_pct": 0.30,
|
||||
"peak_hour": 22
|
||||
"peak_hour": 22,
|
||||
"ai_assisted_commits": 32
|
||||
},
|
||||
"authors": {
|
||||
"Garry Tan": { "commits": 32, "insertions": 2400, "deletions": 300, "test_ratio": 0.41, "top_area": "browse/" },
|
||||
"Alice": { "commits": 12, "insertions": 800, "deletions": 150, "test_ratio": 0.35, "top_area": "app/services/" }
|
||||
},
|
||||
"version_range": ["1.16.0.0", "1.16.1.0"],
|
||||
"streak_days": 47,
|
||||
"tweetable": "Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm"
|
||||
"tweetable": "Week of Mar 1: 47 commits (3 contributors), 3.2k LOC, 38% tests, 12 PRs, peak: 10pm"
|
||||
}
|
||||
```
|
||||
|
||||
### Step 13: Write the Narrative
|
||||
### Step 14: Write the Narrative
|
||||
|
||||
Structure the output as:
|
||||
|
||||
@@ -252,7 +309,7 @@ Structure the output as:
|
||||
|
||||
**Tweetable summary** (first line, before everything else):
|
||||
```
|
||||
Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d
|
||||
Week of Mar 1: 47 commits (3 contributors), 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d
|
||||
```
|
||||
|
||||
## Engineering Retro: [date range]
|
||||
@@ -266,11 +323,11 @@ Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d
|
||||
### Time & Session Patterns
|
||||
(from Steps 3-4)
|
||||
|
||||
Narrative interpreting what the patterns mean:
|
||||
Narrative interpreting what the team-wide patterns mean:
|
||||
- When the most productive hours are and what drives them
|
||||
- Whether sessions are getting longer or shorter over time
|
||||
- Estimated hours per day of active coding
|
||||
- How this maps to "CEO who also codes" lifestyle
|
||||
- Estimated hours per day of active coding (team aggregate)
|
||||
- Notable patterns: do team members code at the same time or in shifts?
|
||||
|
||||
### Shipping Velocity
|
||||
(from Steps 5-7)
|
||||
@@ -291,20 +348,49 @@ Narrative covering:
|
||||
- Focus score with interpretation
|
||||
- Ship of the week callout
|
||||
|
||||
### Top 3 Wins
|
||||
Identify the 3 highest-impact things shipped in the window. For each:
|
||||
### Your Week (personal deep-dive)
|
||||
(from Step 9, for the current user only)
|
||||
|
||||
This is the section the user cares most about. Include:
|
||||
- Their personal commit count, LOC, test ratio
|
||||
- Their session patterns and peak hours
|
||||
- Their focus areas
|
||||
- Their biggest ship
|
||||
- **What you did well** (2-3 specific things anchored in commits)
|
||||
- **Where to level up** (1-2 specific, actionable suggestions)
|
||||
|
||||
### Team Breakdown
|
||||
(from Step 9, for each teammate — skip if solo repo)
|
||||
|
||||
For each teammate (sorted by commits descending), write a section:
|
||||
|
||||
#### [Name]
|
||||
- **What they shipped**: 2-3 sentences on their contributions, areas of focus, and commit patterns
|
||||
- **Praise**: 1-2 specific things they did well, anchored in actual commits. Be genuine — what would you actually say in a 1:1? Examples:
|
||||
- "Cleaned up the entire auth module in 3 small, reviewable PRs — textbook decomposition"
|
||||
- "Added integration tests for every new endpoint, not just happy paths"
|
||||
- "Fixed the N+1 query that was causing 2s load times on the dashboard"
|
||||
- **Opportunity for growth**: 1 specific, constructive suggestion. Frame as investment, not criticism. Examples:
|
||||
- "Test coverage on the payment module is at 8% — worth investing in before the next feature lands on top of it"
|
||||
- "3 of the 5 PRs were 800+ LOC — breaking these up would catch issues earlier and make review easier"
|
||||
- "All commits land between 1-4am — sustainable pace matters for code quality long-term"
|
||||
|
||||
**AI collaboration note:** If many commits have `Co-Authored-By` AI trailers (e.g., Claude, Copilot), note the AI-assisted commit percentage as a team metric. Frame it neutrally — "N% of commits were AI-assisted" — without judgment.
|
||||
|
||||
### Top 3 Team Wins
|
||||
Identify the 3 highest-impact things shipped in the window across the whole team. For each:
|
||||
- What it was
|
||||
- Who shipped it
|
||||
- Why it matters (product/architecture impact)
|
||||
- What's impressive about the execution
|
||||
|
||||
### 3 Things to Improve
|
||||
Specific, actionable, anchored in actual commits. Phrase as "to get even better, you could..."
|
||||
Specific, actionable, anchored in actual commits. Mix personal and team-level suggestions. Phrase as "to get even better, the team could..."
|
||||
|
||||
### 3 Habits for Next Week
|
||||
Small, practical, realistic for a very busy person. Each must be something that takes <5 minutes to adopt.
|
||||
Small, practical, realistic. Each must be something that takes <5 minutes to adopt. At least one should be team-oriented (e.g., "review each other's PRs same-day").
|
||||
|
||||
### Week-over-Week Trends
|
||||
(if applicable, from Step 9)
|
||||
(if applicable, from Step 10)
|
||||
|
||||
---
|
||||
|
||||
@@ -324,7 +410,10 @@ When the user runs `/retro compare` (or `/retro compare 14d`):
|
||||
- Specific and concrete — always anchor in actual commits/code
|
||||
- Skip generic praise ("great job!") — say exactly what was good and why
|
||||
- Frame improvements as leveling up, not criticism
|
||||
- Keep total output around 2500-3500 words
|
||||
- **Praise should feel like something you'd actually say in a 1:1** — specific, earned, genuine
|
||||
- **Growth suggestions should feel like investment advice** — "this is worth your time because..." not "you failed at..."
|
||||
- Never compare teammates against each other negatively. Each person's section stands on its own.
|
||||
- Keep total output around 3000-4500 words (slightly longer to accommodate team sections)
|
||||
- Use markdown tables and code blocks for data, prose for narrative
|
||||
- Output directly to the conversation — do NOT write to filesystem (except the `.context/retros/` JSON snapshot)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user