Agent Skills: /sdlc-retro — 周度工程复盘

周度工程复盘。分析提交历史、工作模式和代码质量指标,支持团队感知,识别当前用户,分析每个贡献者的优点和成长空间。

UncategorizedID: xmx0632/claude-code-demo/sdlc-retro

Install this agent skill to your local

pnpm dlx add-skill https://github.com/xmx0632/claude-code-demo/tree/HEAD/.claude/skills/sdlc-retro

Skill Files

Browse the full folder contents for sdlc-retro.

Download Skill

Loading file tree…

.claude/skills/sdlc-retro/SKILL.md

Skill Metadata

Name
sdlc-retro
Description
周度工程复盘。分析提交历史、工作模式和代码质量指标,支持团队感知,识别当前用户,分析每个贡献者的优点和成长空间。

/sdlc-retro — 周度工程复盘

生成全面的工程复盘报告,分析提交历史、工作模式和代码质量指标。

参数

  • /sdlc-retro — 默认:最近7天
  • /sdlc-retro 24h — 最近24小时
  • /sdlc-retro 14d — 最近14天
  • /sdlc-retro 30d — 最近30天
  • /sdlc-retro compare — 比较当前周期与上一周期
  • /sdlc-retro compare 14d — 使用指定窗口比较

指令

解析参数确定时间窗口。默认7天。使用 --since="N days ago" 进行 git log 查询。 所有时间使用本地时区报告。

参数验证: 如果参数不匹配数字后跟 dhw,或 compare 关键词,显示用法并停止:

用法: /sdlc-retro [窗口]
  /sdlc-retro              — 最近7天(默认)
  /sdlc-retro 24h          — 最近24小时
  /sdlc-retro 14d          — 最近14天
  /sdlc-retro 30d          — 最近30天
  /sdlc-retro compare      — 比较本周期与上一周期
  /sdlc-retro compare 14d  — 使用指定窗口比较

Step 1: 收集原始数据

首先,获取 origin 并识别当前用户:

git fetch origin <default-branch> --quiet
# 识别谁在运行复盘
git config user.name
git config user.email

git config user.name 返回的名字是 "你" —— 正在阅读这个复盘的人。所有其他作者是队友。

并行运行所有这些 git 命令(它们是独立的):

# 1. 窗口内所有提交:时间戳、主题、哈希、作者、文件变更、插入、删除
git log origin/<default> --since="<window>" --format="%H|%aN|%ae|%ai|%s" --shortstat

# 2. 每个提交的测试 vs 总 LOC 分解(带作者)
git log origin/<default> --since="<window>" --format="COMMIT:%H|%aN" --numstat

# 3. 提交时间戳用于会话检测和小时分布(带作者)
git log origin/<default> --since="<window>" --format="%at|%aN|%ai|%s" | sort -n

# 4. 最频繁变更的文件(热点分析)
git log origin/<default> --since="<window>" --format="" --name-only | grep -v '^$' | sort | uniq -c | sort -rn

# 5. 从提交消息中提取 PR 编号
git log origin/<default> --since="<window>" --format="%s" | grep -oE '#[0-9]+' | sed 's/^#//' | sort -n | uniq

# 6. 每个作者的文件热点(谁触碰了什么)
git log origin/<default> --since="<window>" --format="AUTHOR:%aN" --name-only

# 7. 每个作者的提交计数(快速摘要)
git shortlog origin/<default> --since="<window>" -sn --no-merges

# 8. TODOS.md 待办(如果可用)
cat TODOS.md 2>/dev/null || true

# 9. 测试文件计数
find . -name '*.test.*' -o -name '*.spec.*' -o -name '*_test.*' -o -name '*_spec.*' 2>/dev/null | grep -v node_modules | wc -l

# 10. 窗口内的回归测试提交
git log origin/<default> --since="<window>" --oneline --grep="test:" --grep="fix:"

# 11. 窗口内变更的测试文件
git log origin/<default> --since="<window>" --format="" --name-only | grep -E '\.(test|spec)\.' | sort -u | wc -l

Step 2: 计算指标

计算并在摘要表中展示这些指标:

| 指标 | 值 | |------|-----| | 提交到主分支 | N | | 贡献者 | N | | PR 合并数 | N | | 总插入行 | N | | 总删除行 | N | | 净增 LOC | N | | 测试 LOC(插入) | N | | 测试 LOC 比例 | N% | | 活跃天数 | N | | 检测到的会话 | N | | 平均 LOC/会话小时 | N | | 测试健康度 | N 总测试 · M 本期新增 · K 回归测试 |

然后立即展示 每作者排行榜

贡献者          提交数   +/-         主要领域
你 (张三)          32   +2400/-300  browse/
李四                12   +800/-150   app/services/
王五                 3   +120/-40    tests/

按提交数降序排列。当前用户始终排在第一位,标记为"你 (名字)"。

待办健康度(如果 TODOS.md 存在): 读取 TODOS.md,计算:

  • 总开放 TODO(排除 ## Completed 部分的项目)
  • P0/P1 计数(关键/紧急项目)
  • P2 计数(重要项目)
  • 本期完成的项目
  • 本期新增的项目

Step 3: 提交时间分布

展示小时直方图:

小时  提交数  ████████████████
 00:    4      ████
 07:    5      █████
 ...

识别并指出:

  • 高峰时段
  • 空闲时段
  • 模式是否双峰(上午/晚上)或连续
  • 深夜编码集群(晚上10点后)

Step 4: 工作会话检测

使用 45分钟间隔 阈值检测连续提交之间的会话。 对每个会话报告:

  • 开始/结束时间
  • 提交数量
  • 持续时间(分钟)

分类会话:

  • 深度会话(50+ 分钟)
  • 中等会话(20-50 分钟)
  • 微型会话(<20 分钟,通常是单次提交)

计算:

  • 总活跃编码时间(会话持续时间之和)
  • 平均会话长度
  • 每小时活跃时间的 LOC

Step 5: 提交类型分解

按约定式提交前缀分类。 显示为百分比条:

feat:     20  (40%)  ████████████████████
fix:      27  (54%)  ███████████████████████████
refactor:  2  ( 4%)  ██

如果 fix 比例超过 50%,标记为"快速发布、快速修复"模式,可能表示审查缺口。

Step 6: 热点分析

展示前10个最常变更的文件。 标记:

  • 变更5次以上的文件(流失热点)
  • 热点列表中的测试文件 vs 生产文件
  • VERSION/CHANGELOG 频率(版本纪律指标)

Step 7: PR 大小分布

从提交差异估算 PR 大小并分桶:

  • (<100 LOC)
  • (100-500 LOC)
  • (500-1500 LOC)
  • 超大(1500+ LOC)—— 标记这些及其文件计数

Step 8: 专注分数 + 本周发布

专注分数: 计算触碰单个最常变更顶级目录的提交百分比。 更高分数 = 更深入的专注工作。 更低分数 = 分散的上下文切换。

本周发布: 自动识别窗口内 LOC 最高的单个 PR。 突出显示:

  • PR 编号和标题
  • LOC 变更
  • 为什么重要(从提交消息和触碰的文件推断)

Step 9: 团队成员分析

对每个贡献者(包括当前用户),计算:

  1. 提交和 LOC — 总提交、插入、删除、净 LOC
  2. 专注领域 — 他们最常触碰的目录/文件(前3)
  3. 提交类型组合 — 他们个人的 feat/fix/refactor/test 分解
  4. 会话模式 — 他们何时编码(高峰时段)、会话计数
  5. 测试纪律 — 他们个人的测试 LOC 比例
  6. 最大发布 — 他们窗口内影响最大的单个提交或 PR

对于当前用户("你"): 这部分获得最深入的处理。 包括所有个人复盘的细节——会话分析、时间模式、专注分数。 用第一人称表述:"你的高峰时段..."、"你的最大发布..."

对于每个队友: 写2-3句话涵盖他们做了什么和他们的模式。 然后:

  • 表扬(1-2个具体事项):锚定在实际提交。 不是"干得好"——确切说明哪里好。
  • 成长机会(1个具体事项):框架为升级建议,而非批评。

如果只有一个贡献者(单人仓库): 跳过团队分解,作为个人复盘处理。

Step 10: 周对周趋势(如果窗口 >= 14d)

如果时间窗口为14天或更长,拆分为周桶并展示趋势:

  • 每周提交数(总计和每作者)
  • 每��� LOC
  • 每周测试比例
  • 每周 fix 比例
  • 每周会话计数

Step 11: 连续追踪

计算从今天开始向回追溯的连续天数中至少有1次提交到 origin/<default>。 追踪团队连续和个人连续:

# 团队连续:所有唯一提交日期
git log origin/<default> --format="%ad" --date=format:"%Y-%m-%d" | sort -u

# 个人连续:仅当前用户的提交
git log origin/<default> --author="<user_name>" --format="%ad" --date=format:"%Y-%m-%d" | sort -u

从今天向后计数——有多少连续天数至少有一次提交? 显示:

  • "团队发布连续:47 天"
  • "你的发布连续:32 天"

Step 12: 加载历史并比较

在保存新快照之前,检查之前的复盘历史:

ls -t .context/retros/*.json 2>/dev/null

如果存在之前的复盘: 使用 Read 工具加载最近的一个。 计算关键指标的增量并包含 与上次复盘的趋势 部分:

                    上次        现在         增量
测试比例:         22%    →    41%         ↑19pp
会话数:           10     →    14          ↑4
LOC/小时:         200    →    350         ↑75%
Fix 比例:         54%    →    30%         ↓24pp (改善中)
提交数:           32     →    47          ↑47%
深度会话:         3      →    5           ↑2

如果不存在之前的复盘: 跳过比较部分并附加:"首次复盘记录——下周再次运行以查看趋势。"

Step 13: 保存复盘历史

计算完所有指标(包括连续)并加载任何之前的历史进行比较后,保存 JSON 快照:

mkdir -p .context/retros

确定今天的下一个序列号:

today=$(date +%Y-%m-%d)
existing=$(ls .context/retros/${today}-*.json 2>/dev/null | wc -l | tr -d ' ')
next=$((existing + 1))
# 保存为 .context/retros/${today}-${next}.json

使用 Write 工具保存 JSON 文件,使用此结构:

{
  "date": "2026-03-18",
  "window": "7d",
  "metrics": {
    "commits": 47,
    "contributors": 3,
    "prs_merged": 12,
    "insertions": 3200,
    "deletions": 800,
    "net_loc": 2400,
    "test_loc": 1300,
    "test_ratio": 0.41,
    "active_days": 6,
    "sessions": 14,
    "deep_sessions": 5,
    "avg_session_minutes": 42,
    "loc_per_session_hour": 350,
    "feat_pct": 0.40,
    "fix_pct": 0.30,
    "peak_hour": 22
  },
  "authors": {
    "张三": { "commits": 32, "insertions": 2400, "deletions": 300, "test_ratio": 0.41, "top_area": "browse/" },
    "李四": { "commits": 12, "insertions": 800, "deletions": 150, "test_ratio": 0.35, "top_area": "app/services/" }
  },
  "streak_days": 47,
  "summary": "3月第1周: 47次提交 (3人), 3.2k LOC, 38% 测试, 12 PRs, 高峰: 晚10点"
}

Step 14: 撰写叙述

将输出结构化为:


一句话摘要(第一行,在所有内容之前):

3月第1周: 47次提交 (3人), 3.2k LOC, 38% 测试, 12 PRs, 高峰: 晚10点 | 连续: 47天

工程复盘: [日期范围]

摘要表

(来自 Step 2)

与上次复盘的趋势

(来自 Step 12,保存前加载——如果是首次复盘则跳过)

时间与会话模式

(来自 Steps 3-4)

叙述解释团队范围的模式意味着什么:

  • 最有成效的时段是什么,什么驱动它们
  • 会话是否随时间变长或变短
  • 每天活跃编码的估计小时数(团队汇总)
  • 值得注意的模式:团队成员是否在同一时间编码还是轮班?

发布速度

(来自 Steps 5-7)

叙述涵盖:

  • 提交类型组合及其揭示的内容
  • PR 大小纪律(PR 是否保持小?)
  • Fix 链检测(同一子系统上的连续 fix 提交)
  • 版本号纪律

代码质量信号

  • 测试 LOC 比例趋势
  • 热点分析(相同文件是否在流失?)
  • 任何应该拆分的超大 PR

测试健康度

  • 总测试文件:N
  • 本期新增测试:M
  • 回归测试提交:列出 test:fix: 提交
  • 如果测试比例 < 20%:标记为成长领域

专注与亮点

(来自 Step 8)

  • 专注分数及解释
  • 本周发布亮点

你的一周(个人深入分析)

(来自 Step 9,仅针对当前用户)

这是用户最关心的部分。包括:

  • 他们个人的提交计数、LOC、测试比例
  • 他们的会话模式和高峰时段
  • 他们的专注领域
  • 他们最大的发布
  • 你做得好的地方(2-3个锚定在提交的具体事项)
  • 可以提升的地方(1-2个具体、可操作的建议)

团队分解

(来自 Step 9,针对每个队友——如果是单人仓库则跳过)

对每个队友(按提交数降序排列),写一个部分:

[名字]

  • 他们发布了什么: 2-3句话关于他们的贡献、专注领域和提交模式
  • 表扬: 1-2个他们做得好的具体事项,锚定在实际提交
  • 成长机会: 1个具体、建设性的建议

团队前3个胜利

识别窗口内整个团队发布的3个影响最大的事项。对每个:

  • 它是什么
  • 谁发布的
  • 为什么重要(产品/架构影响)

3个需要改进的事项

具体、可操作、锚定在实际提交。混合个人和团队级别的建议。

下周的3个习惯

小、实用、现实。每个必须是可以 <5 分钟采用的事项。

周对周趋势

(如果适用,来自 Step 10)


比较模式

当用户运行 /sdlc-retro compare(或 /sdlc-retro compare 14d)时:

  1. 使用 --since="7 days ago" 计算当前窗口的指标
  2. 使用 --since--until 计算紧邻的前一个等长窗口的指标以避免重叠
  3. 展示带有增量和箭头的并排比较表
  4. 写一个简短的叙述突出最大的改进和退步
  5. 仅将当前窗口快照保存到 .context/retros/

语气

  • 鼓励但坦诚,不溺爱
  • 具体和实在——始终锚定在实际提交/代码
  • 跳过通用表扬("干得好!")——确切说明哪里好以及为什么
  • 将改进框架为升级,而非批评
  • 表扬应该感觉像是你在 1:1 中实际会说的——具体、有根据、真诚
  • 成长建议应该感觉像是投资建议——"这值得你时间因为...",而不是"你失败了..."
  • 永远不要负面比较队友。每个人的部分独立存在。
  • 总输出约 2000-3000 字
  • 使用 markdown 表格和代码块展示数据,叙述用散文
  • 直接输出到对话——不要写入文件系统(除了 .context/retros/ JSON 快照)

重要规则

  • 所有叙述输出直接给用户在对话中。唯一写入的文件是 .context/retros/ JSON 快照。
  • 对所有 git 查询使用 origin/<default>(不是可能过时的本地 main)
  • 如果窗口有零提交,说明并建议不同的窗口
  • LOC/小时四舍五入到最近的 50
  • 将合并提交视为 PR 边界
  • 首次运行(无之前复盘)时,优雅地跳过比较部分