git-review
npx skills add https://github.com/jssfy/k-skills --skill git-review
Agent 安装分布
Skill 文档
Git Review â å·¥ä½å¤çå·¥å ·
åæå½å git ä»åºæå®æ¶é´èå´å çææ commitsï¼çæç»æåçå·¥ä½å¤çæ¥åãéç¨äºä»£ç ãææ¡£ã设计ãè°ç çä»»ä½ git 管ççå 容ã
When to Use
å½ç¨æ·è¯·æ±ä»¥ä¸æä½æ¶è§¦åï¼
- “å¤çä¸ä¸” / “ä»å¤©åäºä»ä¹” / “工使»ç»”
- “review commits” / “git å顾” / “daily review”
- “è¿å¨å¹²äºä»ä¹” / “æè¿3天ç工佔 / “retrospective”
- 任使¶åå顾 git æäº¤åå²å¹¶è¿è¡åæç请æ±
Phase 0: è§£æè¾å ¥ â ç¡®å®æ¶é´èå´
æ ¹æ®ç¨æ·è¾å ¥ç¡®å®åæçæ¶é´èå´ï¼
é»è®¤å¼ï¼æ¨å¤© 22:00 å°å½åæ¶é´ï¼è¦çè·¨åå¤ç工使®µï¼
èªç¶è¯è¨æ å°ï¼
| ç¨æ·è¾å ¥ | –after | –before |
|---|---|---|
| ä»å¤© / today | ä»å¤© 00:00 | now |
| æ¨å¤© / yesterday | æ¨å¤© 00:00 | æ¨å¤© 23:59 |
| è¿å¨ / this week | æ¬å¨ä¸ 00:00 | now |
| æè¿N天 / last N days | N天å 00:00 | now |
| å ·ä½æ¥æ (å¦ 2æ20æ¥) | è¯¥æ¥ 00:00 | è¯¥æ¥ 23:59 |
| æ¥æèå´ (å¦ 2/20-2/23) | èµ·å§æ¥ 00:00 | ç»ææ¥ 23:59 |
| é»è®¤ï¼æ æå®ï¼ | æ¨å¤© 22:00 | now |
ä½¿ç¨ date å½ä»¤è®¡ç®å
·ä½æ¶é´æ³ï¼è½¬æ¢ä¸º git log å¯ç¨çæ ¼å¼ï¼å¦ 2026-02-22T22:00:00ï¼ã
Phase 1: æ°æ®éé
åç½®æ£æ¥ï¼å
è¿è¡ git rev-parse --is-inside-work-tree 确认å½åç®å½æ¯ git ä»åºã妿䏿¯ï¼åç¥ç¨æ·å¹¶åæ¢ã
æåææ°ä»£ç ï¼è¿è¡ git pull ç¡®ä¿åæåºäºææ°çæäº¤åå²ã妿æå失败ï¼ç½ç»é®é¢ãå²çªçï¼ï¼å¿½ç¥é误继ç»åç»æ¥éª¤ï¼ä¸è¦éè¯ã
é¡ºåºæ§è¡ä»¥ä¸ 5 æ¡å½ä»¤ï¼æ¬å°æä½ï¼æ éå¹¶è¡ï¼ï¼
1. 宿´æäº¤è®°å½
git log --after="{after}" --before="{before}" --format="%H|%an|%ai|%s|%b|||" --name-status
å¦æç»æä¸ºç©ºï¼å¿ é¡»ç«å³åæ¢ææåç»æ¥éª¤ãä¸è¦å°è¯æ©å¤§æ¶é´èå´ãä¸è¦æ¥æ¾æè¿çæäº¤ãä¸è¦èªè¡è°æ´åæ°ç»§ç»åæãåªéï¼
- åç¥ç¨æ·è¯¥æ¶é´èå´å æ æäº¤
- å±ç¤ºæè¿ 5 æ¡æäº¤çæ¶é´ï¼å¸®å©ç¨æ·éæ©åéçèå´
- å»ºè®®ç¨æ·æå®æ¶é´èå´ï¼å¦”å¤çæ¨å¤©”ã”å¤ç 2/22″ã”æè¿3天”ï¼
- çå¾ ç¨æ·ä¸ä¸æ¥æç¤º
2. æäº¤ç»è®¡
git log --after="{after}" --before="{before}" --stat --format="%H %s"
3. æ¶é´æ®µæ´ä½åæ´ç»è®¡
git diff --stat $(git log --after="{after}" --before="{before}" --format="%H" | tail -1)^..$(git log --after="{after}" --before="{before}" --format="%H" | head -1)
å¦æåªæä¸æ¡æäº¤ï¼ä½¿ç¨ git show --stat {hash} æ¿ä»£ã
4. åæ¯ä¿¡æ¯
git branch -a --sort=-committerdate | head -20
5. å½åæªå®æå·¥ä½
git status --short && echo "---STASH---" && git stash list
Phase 2: ä¸ç»´åº¦åæ
åºäºééå°çæ°æ®ï¼éä¸å®æä»¥ä¸åæã
维度 1: 工使»ç»
- å° commits æé»è¾ä¸»é¢åç»ï¼èéç®åææ¶é´æåï¼
- ç¨åè¿°å¼è¯è¨æ»ç»æ¯ç»å·¥ä½å 容ï¼è¯´æåäºä»ä¹ã为ä»ä¹å
- éä¸æäº¤æ¶é´çº¿è¡¨æ ¼ï¼
| æ¶é´ | Hash (ç) | æäº¤ä¿¡æ¯ |
维度 2: åæ´ç±»ååå¸
ææä»¶åç¼åè·¯å¾å°åæ´å为以ä¸ç±»åï¼ç»è®¡åç±»æä»¶æ°åè¡æ°åæ´ï¼
| ç±»å | å¹é è§å |
|---|---|
| 代ç | .go, .py, .js, .ts, .java, .rs, .c, .cpp, .swift, .kt ç |
| æµè¯ | è·¯å¾å« test/spec/_testï¼ææä»¶åå« test/spec |
| ææ¡£ | .md, .txt, .rst, .adoc, .doc |
| é ç½® | .yaml, .yml, .json, .toml, .ini, .env, Dockerfile, Makefile |
| 设计/è°ç | è·¯å¾å« design/research/rfc/proposal/audit/review |
| ä¾èµ | go.mod, go.sum, package.json, package-lock.json, requirements.txt, Cargo.toml, Gemfile |
| å ¶ä» | 以ä¸é½ä¸å¹é çæä»¶ |
è¾åºåç±»è¡¨æ ¼å饼å¾å¼å æ¯ã
维度 3: å·¥ä½èå¥
- ç»å¶æäº¤æ¶é´çº¿ï¼ç¨ææ¬è¡¨ç¤ºï¼å¦æ¯å°æ¶ä¸æ ¼ï¼
- è¯å« Flow Sessionï¼è¿ç»æäº¤é´é < 30 åéè§ä¸ºåä¸ session
- ç»è®¡ï¼é¦æ¬¡æäº¤æ¶é´ãæ«æ¬¡æäº¤æ¶é´ãæ»è·¨åº¦ãsession æ°ãæé¿ sessionãæé¿é´é
- å¦æåªæ 1 æ¡æäº¤ï¼è·³è¿èå¥åæï¼ä» è®°å½æäº¤æ¶é´
维度 4: æäº¤å®è·µè¯ä¼°
对æäº¤ä¹ æ¯è¿è¡ 1-5 åè¯åï¼
| è¯ä¼°é¡¹ | 5åæ å | 1åæ å |
|---|---|---|
| Message è´¨é | æ¸ æ°æè¿° what + why | æ¨¡ç³ææ æä¹ (å¦ “update”, “fix”) |
| ç²åº¦ (Granularity) | æ¯æ¬¡æäº¤æ¯ç¬ç«çé»è¾åå | å·¨åæäº¤æ··åå¤ä¸ªä¸ç¸å ³æ¹å¨ |
| Conventional Commits | éµå¾ª type(scope): description |
æ ä»»ä½è§è |
ç»åºæ¯é¡¹çè¯åã好ç示ä¾ï¼æ¥èªå®é æäº¤ï¼å坿¹è¿ç示ä¾ã
维度 5: ææ¯å³çè¯å«
æ«æåæ´å 容ï¼è¯å«ä»¥ä¸ç±»åçææ¯å³çï¼
- æ°ä¾èµå¼å ¥ï¼ä¾èµæä»¶çæ°å¢é¡¹
- æ¶æåæ´ï¼æ°ç®å½ç»æãæ°æ¨¡åãæ¥å£åæ´
- éæï¼å¤§éæä»¶éå½å/ç§»å¨ã彿°ç¾ååæ´
- å®å ¨ç¸å ³ï¼æ¶å authãtokenãsecretãpermission çæ¹å¨
- API åæ´ï¼è·¯ç±ã端ç¹ãschema çä¿®æ¹
æ¯é¡¹ååºå ·ä½ commit åå½±åè¯ä¼°ãå¦ææ²¡æè¯å«å°ææ¯å³çï¼ç®è¦è¯´æã
维度 6: å®æåº¦æ£æ¥
以 checklist æ ¼å¼æ£æ¥ï¼
- æ¯å¦ææªæäº¤çæ¹å¨ï¼
git statusï¼ - æ¯å¦æ stash ä¸çæåå·¥ä½
- æ°å¢ä»£ç 䏿¯å¦å
å«
TODO/FIXME/HACK/XXX注é - æ°å¢ä»£ç æä»¶æ¯å¦æé
奿µè¯æä»¶ï¼æ£æ¥åå
_testæä»¶æ¯å¦åå¨ï¼
对æ¯é¡¹ç»åº Pass/Warning/Info æ è®°åå ·ä½å 容ã
维度 7: æ¹è¿å»ºè®®
åºäºä»¥ä¸ 6 个维度çåæç»æï¼ç»åº 3-5 æ¡å¯æä½çæ¹è¿å»ºè®®ãæ¯æ¡å»ºè®®éè¦ï¼
- å¼ç¨å ·ä½çåææ°æ®ä½ä¸ºè¯æ®
- æåºæç¡®çè¡å¨é¡¹
- 说æé¢æææ
Phase 3: è¾åºæ¥å
æä»¥ä¸ HTML æ ¼å¼è¾åºæç»æ¥åã使ç¨å è CSS ç¡®ä¿å¨æµè§å¨åé£ä¹¦ä¸åå¯è¯å¥½æ¾ç¤ºï¼
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Git å·¥ä½å¤ç â {repo} {date}</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; max-width: 860px; margin: 0 auto; padding: 20px; color: #1a1a1a; background: #f8f9fa; }
.report { background: #fff; border-radius: 12px; padding: 32px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); }
h1 { font-size: 24px; border-bottom: 3px solid #0d7377; padding-bottom: 12px; margin-bottom: 4px; }
h2 { font-size: 17px; color: #0d7377; margin-top: 28px; border-left: 4px solid #0d7377; padding-left: 10px; }
h3 { font-size: 14px; color: #444; margin-top: 14px; }
.meta { color: #666; font-size: 13px; margin-bottom: 16px; }
.summary { background: #e0f7f7; border-radius: 8px; padding: 16px; font-size: 15px; margin: 16px 0; }
.summary ol { margin: 8px 0 0 0; padding-left: 20px; }
.summary li { margin: 4px 0; }
table { width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 14px; }
th { background: #f1f3f4; text-align: left; padding: 10px 12px; font-weight: 600; border-bottom: 2px solid #ddd; }
td { padding: 8px 12px; border-bottom: 1px solid #eee; vertical-align: top; }
tr:hover td { background: #f8f9fa; }
.mono { font-family: "SFMono-Regular", Consolas, monospace; font-size: 12px; color: #555; }
.tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; font-weight: 500; }
.tag-pass { background: #e8f5e9; color: #2e7d32; }
.tag-warn { background: #fff3e0; color: #e65100; }
.tag-info { background: #f5f5f5; color: #616161; }
.timeline { font-family: "SFMono-Regular", Consolas, monospace; font-size: 13px; background: #f8f9fa; padding: 12px 16px; border-radius: 6px; overflow-x: auto; white-space: pre; }
.stars { color: #f5a623; letter-spacing: 2px; }
.suggestion { background: #f3f8ff; border-left: 3px solid #0d7377; padding: 10px 14px; margin: 8px 0; border-radius: 0 6px 6px 0; }
.suggestion strong { display: block; margin-bottom: 4px; }
.checklist { list-style: none; padding: 0; }
.checklist li { padding: 6px 0; border-bottom: 1px solid #f0f0f0; font-size: 14px; }
ul, ol { padding-left: 20px; }
li { margin: 5px 0; line-height: 1.6; }
code { background: #f1f3f4; padding: 1px 5px; border-radius: 3px; font-size: 12px; font-family: "SFMono-Regular", Consolas, monospace; }
</style>
</head>
<body>
<div class="report">
<h1>Git å·¥ä½å¤ç</h1>
<div class="meta">{æ¶é´èå´} | ä»åº: <strong>{repo}</strong> | {æäº¤æ°} commits | {æä»¶åæ´æ°} files changed | <span style="color:#2e7d32">+{æ°å¢è¡}</span> <span style="color:#c62828">-{å é¤è¡}</span></div>
<div class="summary">
<strong>æ ¸å¿åç°</strong>
<ol>
<li>...</li>
<li>...</li>
<li>...</li>
</ol>
</div>
<h2>1. 工使»ç»</h2>
<p>{åè¿°å¼æ»ç»ï¼æé»è¾ä¸»é¢åç»è¯´æåäºä»ä¹ã为ä»ä¹å}</p>
<h3>æäº¤æ¶é´çº¿</h3>
<table>
<tr><th>æ¶é´</th><th>Hash</th><th>æäº¤ä¿¡æ¯</th></tr>
<tr><td>HH:MM</td><td class="mono">abc1234</td><td>...</td></tr>
</table>
<h2>2. åæ´ç±»ååå¸</h2>
<table>
<tr><th>ç±»å</th><th>æä»¶æ°</th><th>å æ¯</th><th>å¢å è¡æ°</th></tr>
<tr><td>代ç </td><td>...</td><td>...%</td><td>+... -...</td></tr>
<tr><td>æµè¯</td><td>...</td><td>...%</td><td>+... -...</td></tr>
<tr><td>ææ¡£</td><td>...</td><td>...%</td><td>+... -...</td></tr>
<tr><td>é
ç½®</td><td>...</td><td>...%</td><td>+... -...</td></tr>
<tr><td>å
¶ä»</td><td>...</td><td>...%</td><td>+... -...</td></tr>
</table>
<p>{åæè¯´æ}</p>
<h2>3. å·¥ä½èå¥</h2>
<table>
<tr><th>ææ </th><th>æ°å¼</th></tr>
<tr><td>馿¬¡æäº¤</td><td>...</td></tr>
<tr><td>æ«æ¬¡æäº¤</td><td>...</td></tr>
<tr><td>æ»è·¨åº¦</td><td>...</td></tr>
<tr><td>Flow Sessions</td><td>... 个</td></tr>
<tr><td>æé¿ Session</td><td>...</td></tr>
<tr><td>æé¿é´é</td><td>...</td></tr>
</table>
<div class="timeline">{æ¶é´çº¿å¯è§åï¼ç¨ ASCII å符表示ï¼å¦æ¯æ ¼ä»£è¡¨ä¸å°æ¶}</div>
<h2>4. æäº¤å®è·µè¯ä¼°</h2>
<table>
<tr><th>è¯ä¼°é¡¹</th><th>è¯å</th><th>说æ</th></tr>
<tr><td>Message è´¨é</td><td><span class="stars">â
â
â
â
â</span></td><td>...</td></tr>
<tr><td>æäº¤ç²åº¦</td><td><span class="stars">â
â
â
ââ</span></td><td>...</td></tr>
<tr><td>Conventional Commits</td><td><span class="stars">â
â
â
â
â
</span></td><td>...</td></tr>
</table>
<p><strong>好ç示ä¾:</strong> <code>feat(auth): add JWT refresh token rotation</code></p>
<p><strong>坿¹è¿:</strong> <code>fix</code> â æ¹ä¸º <code>fix(module): describe what was fixed</code></p>
<h2>5. ææ¯å³ç</h2>
<ul>
<li><strong>æ°ä¾èµå¼å
¥</strong>: ... (<code>abc1234</code>)</li>
<li><strong>æ¶æåæ´</strong>: ... (<code>def5678</code>)</li>
</ul>
<h2>6. å®æåº¦æ£æ¥</h2>
<ul class="checklist">
<li><span class="tag tag-pass">Pass</span> æªæäº¤æ¹å¨: å·¥ä½åºå¹²å</li>
<li><span class="tag tag-warn">Warning</span> Stash æå: ...</li>
<li><span class="tag tag-info">Info</span> TODO/FIXME: ...</li>
<li><span class="tag tag-pass">Pass</span> æµè¯é
å¥: ...</li>
</ul>
<h2>7. æ¹è¿å»ºè®®</h2>
<div class="suggestion"><strong>1. {建议æ é¢}</strong>{å
·ä½å
容}ï¼è¯æ®ï¼{å¼ç¨åææ°æ®}ï¼</div>
<div class="suggestion"><strong>2. {建议æ é¢}</strong>...</div>
<div class="suggestion"><strong>3. {建议æ é¢}</strong>...</div>
</div>
</body>
</html>
HTML å¡«åè§åï¼
- å°æ¨¡æ¿ä¸çå ä½ç¬¦æ¿æ¢ä¸ºå®é æ°æ®ï¼å 餿³¨é
- æçº§è¯åç¨
â(å®å¿) åâ(空å¿) 表示ï¼5å=â â â â â - å®æåº¦æ ç¾ï¼Pass=
tag-passï¼ç»¿ï¼ï¼Warning=tag-warnï¼æ©ï¼ï¼Info=tag-infoï¼ç°ï¼ - æ¶é´çº¿å¯è§åç¨ç宽å符ç»å¶ï¼æ¯æ ¼ä»£è¡¨ä¸å°æ¶ï¼ææäº¤çæ ¼ç¨
âï¼æ æäº¤ç¨Â· - ç¡®ä¿ HTML 宿´ï¼å¯ç´æ¥å¨æµè§å¨ä¸æå¼
å°æ¥åä¿å为 git-review-{date}.html å°å½åå·¥ä½ç®å½ï¼å
¶ä¸ {date} 为å½å¤©æ¥æï¼å¦ 2026-02-23ï¼ã
Edge Cases
- æ æäº¤ï¼Phase 1 第 1 æ¥æ£æµå°ç©ºç»æåï¼ç«å³ç»æ¢æµç¨ââå±ç¤ºæè¿ 5 æ¡æäº¤æ¶é´ä¾åèï¼æç¤ºç¨æ·éæ°æå®èå´ãç¦æ¢èªè¡æ©å¤§æ¶é´èå´æç»§ç»åç» Phase
- åæ¡æäº¤ï¼æ£å¸¸çææ¥åï¼ä½è·³è¿ç»´åº¦ 3ï¼å·¥ä½èå¥ï¼ç session åæï¼ç®åä¸ºä» è®°å½æäº¤æ¶é´
- é git ä»åºï¼Phase 1 åç½®æ£æ¥å¤±è´¥ï¼æç¤ºç¨æ·å½åç®å½ä¸æ¯ git ä»åº
- äºè¿å¶æä»¶ï¼ä» 卿件åè¡¨ä¸æ 注为äºè¿å¶ï¼è·³è¿è¡æ°ç»è®¡ï¼ä¸å°è¯ diff åæ
- è¶ å¤§æ¶é´èå´ï¼>100 commitsï¼ï¼æ£å¸¸åæï¼ä½å¨ç»´åº¦ 1 䏿䏻é¢åç»æ¶åæ´é«å±æ¬¡çå½çº³ï¼é¿å æ¥åè¿é¿