cx-summary
npx skills add https://github.com/m19803261706/cx-workflow --skill cx-summary
Agent 安装分布
Skill 文档
cx-summary: æ±æ»åå¸ä¸éç¯
æå¨æèªå¨è§¦åçæå䏿¥ï¼çææ±æ»ææ¡£ï¼åæ¥ GitHubï¼æ´æ° CLAUDE.mdï¼åé宿éç¥ã
ä½¿ç¨æ¹æ³
/cx-summary # èªå¨æ±æ»å½ååè½
/cx-summary {åè½å} # æå®åè½æ±æ»
æ ¸å¿æ¥éª¤
Step 0: åå§åæ¬å°ç¯å¢
PROJECT_ROOT=$(git rev-parse --show-toplevel)
DEVELOPER_ID=$(jq -r '.developer_id' "$PROJECT_ROOT/.claude/cx/config.json" 2>/dev/null || echo "cx")
CONFIG="$PROJECT_ROOT/.claude/cx/config.json"
FEATURE_DIR="$PROJECT_ROOT/.claude/cx/features/${DEVELOPER_ID}-{feature_slug}"
Step 1: 代ç 审æ¥ï¼å¯éï¼
妿 config.code_review = trueï¼å¯å¨ä»£ç å®¡æ¥æµç¨ï¼
{
"questions": [
{
"question": "ææä»»å¡å·²å®æãæ¯å¦å¨æ±æ»åè¿è¡ä»£ç 审æ¥ï¼",
"header": "代ç 审æ¥",
"multiSelect": false,
"options": [
{"label": "å
¨é¢å®¡æ¥ (æ¨è)", "description": "é»è¾+å®å
¨+è´¨é+æ¸
ç"},
{"label": "å¿«éæ£æ¥", "description": "ä»
é»è¾åå®å
¨é®é¢"},
{"label": "è·³è¿", "description": "ç´æ¥è¿å
¥æ±æ»"}
]
}
]
}
å ¨é¢å®¡æ¥ï¼
- å¯å¨ code-reviewer å代çå®¡æ¥ git diffï¼å¯¹ç § design.md å¥çº¦ï¼
- åç° critical é®é¢ â è¯¢é®æ¯å¦ä¿®å¤ â ä¿®å¤å鿰审æ¥
- åç° warning/info â è¯¢é®æ¯å¦ä¼å â å¯å¨ code-cleanup å代ç
- 宿åèªå¨ commitï¼message: “refactor: code cleanup post-review”ï¼
å¿«éæ£æ¥ï¼
- å¯å¨ code-reviewer å代çï¼ç²¾ç®æ¨¡å¼ï¼ä» æ£æ¥é»è¾ bug + å®å ¨é®é¢ï¼
- æé®é¢å±ç¤ºï¼æ é®é¢ç»§ç»
Step 2: çææ±æ»ææ¡£
çæ summary.mdï¼å å«ï¼
# åè½å®ææ±æ»: {åè½å}
## 宿æ¦è§
| 项 | å
容 |
|---|---|
| åè½ | {feature_name} |
| è§æ¨¡ | S/M/L |
| 宿æ¶é´ | {date} |
| æ»ä»»å¡æ° | {N} |
| æäº¤æ° | {M} |
## ç¸å
³ææ¡£
- PRD: {link_or_local_path}
- Design Doc: {link_or_local_path}
- ADR: {link_or_local_path}
## åè½æè¿°
{ä» prd.md æåçåè½æ¦è¿°}
## å®ç°æ¸
å
### Phase 1: {phase_name}
- [x] Task 1: {title}
- æäº¤: {hash}
- åæ´æä»¶: {count} 个
- [x] Task 2: {title}
- æäº¤: {hash}
- åæ´æä»¶: {count} 个
### Phase 2: {phase_name}
...
## å
³é®è®¾è®¡å³ç
{ä» design.md å adr.md æåçæ ¸å¿å³ç}
## API æ¥å£æ¸
å
| æ¥å£ | æ¹æ³ | è·¯å¾ | ç¶æ |
|------|------|------|------|
| {name} | POST | /api/v1/xxx | â
|
| {name} | GET | /api/v1/xxx | â
|
## åæ´ç»è®¡
- æ°å¢æä»¶: {count}
- ä¿®æ¹æä»¶: {count}
- å 餿件: {count}
- æ°å¢ä»£ç è¡: {count}
- ä¿®æ¹ä»£ç è¡: {count}
## æµè¯è¦ç
- åå
æµè¯: {count} 个ï¼éè¿ç {%}
- éææµè¯: {count} 个ï¼éè¿ç {%}
- 代ç 审æ¥: â
éè¿
## å·²ç¥é®é¢ä¸åç»æ¹è¿
{妿 warning/info 级å«çé®é¢æå»ºè®®çæ¹è¿}
## é¨ç½²å»ºè®®
{if L è§æ¨¡: å
å«é¨ç½²æ¥éª¤ãæ°æ®è¿ç§»ãå
¼å®¹æ§è¯´æ}
---
> CX 工使µå®æ | {date}
ä¿åå° .claude/cx/features/{dev_id}-{feature}/summary.mdã
Step 3: GitHub 忥ï¼åºäºæ¨¡å¼ï¼
æ ¹æ® config.github_syncï¼
offï¼
- ä» ä¿åæ¬å° summary.mdï¼ä¸åå»ºä»»ä½ GitHub Issue
- æ¬å°éç¯å®æ
localï¼
- åå»ºæ±æ» Issueï¼æ ç¾
doc:summaryï¼ - Issue body å å« summary.md å 容
- ä¸å建 PR
collabï¼
- åå»ºæ±æ» Issueï¼æ ç¾
doc:summaryï¼ - 妿æä»£ç 审æ¥ï¼å建 PRï¼æ ç¾
type:refactorï¼ - PRD å Design Doc Issue ä¿ææå¼
fullï¼
- åå»ºæ±æ» Issueï¼æ ç¾
doc:summaryï¼ - å建代ç å®¡æ¥ PRï¼æ ç¾
type:refactorï¼ - å ³éææç¸å ³ Issueï¼PRDãDesign DocãADRãEpicãææåä»»å¡
- æ æ³¨ Scope Issue 该模åç¶æä¸ºå·²å®æ
Step 4: æºè½ CLAUDE.md æ´æ°
æ£æµæ¯å¦ææ°ç项ç®è§èï¼å¦æ° API è·¯å¾æ¨¡å¼ãæ°å½å约å®ãæ°æµè¯å½ä»¤çï¼ã
Step 4a: èªå¨æ«æï¼æ é询é®ï¼
# æ£æ¥æ¯å¦ææ°è§è
IS_NEW_CONVENTION=false
# æ«æ Design Docï¼æ° API è·¯å¾æ¨¡å¼ï¼
grep -E '/api/v[0-9]+/' design.md | sort -u > /tmp/design_paths.txt
if [ -f "$CLAUDE_MD" ]; then
grep -E '/api/v[0-9]+/' "$CLAUDE_MD" | sort -u > /tmp/claude_paths.txt
if ! diff -q /tmp/design_paths.txt /tmp/claude_paths.txt > /dev/null 2>&1; then
IS_NEW_CONVENTION=true
fi
fi
# æ«æ ADRï¼æ°æ¶æå³çï¼
if [ -f "adr.md" ] && grep -q "Accepted" adr.md; then
if ! grep -q "$(head -1 adr.md | sed 's/# ADR: //')" "$CLAUDE_MD" 2>/dev/null; then
IS_NEW_CONVENTION=true
fi
fi
# æ«æ git diffï¼æ°æµè¯å½ä»¤ãæ°ä¾èµï¼
git log --oneline -p | grep -E '^\+\+\+.*test|^\+.*npm|^\+.*pytest' > /tmp/new_patterns.txt
if [ -s /tmp/new_patterns.txt ]; then
IS_NEW_CONVENTION=true
fi
Step 4b: ç¨æ·ç¡®è®¤å³çï¼å¦ææ°è§èï¼
{
"questions": [
{
"question": "è¿æ¬¡å¼å产çäºä»¥ä¸æ°ç项ç®è§èãè¦æ´æ°å° CLAUDE.md åï¼",
"header": "è§èæ´æ°",
"multiSelect": false,
"options": [
{"label": "æ¥çå¹¶æ´æ°", "description": "å±ç¤ºåæ´å·®å¼ï¼ç¨æ·ç¡®è®¤åæ´æ°"},
{"label": "ä¸éè¦", "description": "è·³è¿æ´æ°"},
{"label": "æèªå·±æ¹", "description": "æå¨ç¼è¾ CLAUDE.md"}
]
}
]
}
妿鿩”æ¥çå¹¶æ´æ°”ï¼
æ°è§èåæ´å·®å¼:
ãAPI è·¯å¾è§èã
æ§: /api/v1/{resource}
æ°: /api/v2/{resource} (æ¯æ v1 å v2)
ãæ°æ®åºå½åã
æ§: æªå®ä¹
æ°: snake_caseï¼å« created_at/updated_at æ¶é´æ³
ãå端常éã
æ°å¢: ç¶ææä¸¾ (PENDING, PROCESSING, COMPLETED, FAILED)
ãæµè¯å½ä»¤ã
æ°å¢: npm run test:e2e
è¿äºæ´æ°ä¼æ¿æ¢ CLAUDE.md ä¸ã项ç®è§èãæ®µè½ã
æ»è¡æ°åå: 28 â 35 è¡ï¼CX 段è½ï¼
æ¯å¦ç¡®è®¤æ´æ°ï¼
Step 4c: æ§è¡æ´æ°ï¼ç¨æ·ç¡®è®¤åï¼
# 读å CLAUDE.md
CLAUDE_MD="$PROJECT_ROOT/CLAUDE.md"
# å¦ææ²¡æ CLAUDE.mdï¼åå»ºæ°æä»¶
if [ ! -f "$CLAUDE_MD" ]; then
cat > "$CLAUDE_MD" << 'EOF'
# Project Guidelines
<!-- CX-WORKFLOW-START -->
## CX 工使µ (v2.0)
### å½ä»¤
/cx-prd | /cx-exec | /cx-summary
### æ´»è·åè½
(æ )
### 项ç®è§è
(å¾
å®ä¹)
<!-- CX-WORKFLOW-END -->
## å
¶ä»é¡¹ç®ä¿¡æ¯
...
EOF
fi
# å¦ææ²¡æ CX 段è½ï¼è¿½å å°æ«å°¾
if ! grep -q "CX-WORKFLOW-START" "$CLAUDE_MD"; then
cat >> "$CLAUDE_MD" << 'EOF'
<!-- CX-WORKFLOW-START -->
## CX 工使µ (v2.0)
### å½ä»¤
/cx-prd | /cx-exec | /cx-summary
### æ´»è·åè½
(æ )
### 项ç®è§è
(å¾
å®ä¹)
<!-- CX-WORKFLOW-END -->
EOF
fi
# æ¿æ¢æ è®°ä¹é´çå
容
# ï¼èæ¬ç¨ sed æ awk æ¿æ¢ CX-WORKFLOW-START å° CX-WORKFLOW-END ä¹é´çå
容ï¼
# æ£æ¥æ´æ°åç CX 段è½è¡æ°
NEW_LINES=$(grep -c "." <<< "$(sed -n '/CX-WORKFLOW-START/,/CX-WORKFLOW-END/p' "$CLAUDE_MD")")
if [ "$NEW_LINES" -gt 30 ]; then
echo "â ï¸ CX 段è½å·²è¾¾ $NEW_LINES è¡ï¼å»ºè®®ç²¾ç®ãCLAUDE.md æ¯è¡é½ä¼æ¶è tokenã"
# ä¸å¼ºå¶é»æ¢ï¼ç»ç¨æ·è¦å
fi
Step 4d: æ´»è·åè½æ´æ°
æ 论æ¯å¦ææ°è§èï¼é½è¦æ´æ°”æ´»è·åè½”è¡ï¼
### æ´»è·åè½
- {feature_name}: 已宿 â
(妿å
¶ä»æ´»è·åè½åååºï¼å·²å®æçåè½ç§»å°ä¸æ¹"已宿åè½"ï¼
Step 5: æ¬å°æ¸ ç
# 彿¡£å½ååè½çç®å½ï¼å¯éï¼
# ç§»å¨å° .claude/cx/completed/{dev_id}-{feature}/
# æå¨ .claude/cx/features/{dev_id}-{feature}/ ä¸å建 COMPLETED æ è®°æä»¶
# æ¸
空å½åå·¥ä½ä¸ä¸æ
jq '.current_feature = null' "$CONFIG" > "$CONFIG.tmp"
mv "$CONFIG.tmp" "$CONFIG"
Step 6: åé宿éç¥
æ ¹æ® config.hooks.notificationï¼é»è®¤ trueï¼ï¼ä½¿ç¨ Notification hookï¼
# æ¡é¢éç¥
NOTIFICATION_MSG="â
CX 工使µå®æ
åè½: {feature_name}
ä»»å¡: {N} 个
æ¶é´: {duration}
æ±æ»: .claude/cx/features/{dev_id}-{feature}/summary.md"
Step 7: è¾åºç»æ
æ±æ»åå¸å®æ
åè½: {feature_name}
è§æ¨¡: S/M/L
宿任å¡: {N}
æäº¤: {M}
æ¬å°æ±æ»: .claude/cx/features/{dev_id}-{feature}/summary.md
GitHub åæ¥æ¨¡å¼: {mode}
ââ (off: æ¬å°ä»
local: å建 Issue collab: Issue+PR full: å
³é Issue)
CLAUDE.md æ´æ°: {æ¯/å¦}
ââ æ°è§èæ£æµ: {æ/æ }
ââ æ´»è·åè½æ´æ°: â
æ¡é¢éç¥: â
å·²åé
ä¸ä¸æ¥å»ºè®®:
è¿è¡ /cx-prd {ä¸ä¸ä¸ªåè½å} å¼å§ä¸ä¸ä¸ªåè½
æè¿è¡ /cx-scope æ¥ç项ç®èå¾
æ¬å°æä»¶ç»æ
.claude/cx/features/{dev_id}-{feature}/
âââ summary.md â æ±æ»ææ¡£
âââ summary.json â Issue ç¼å·ï¼å¯éï¼
âââ status.json â æç»ä»»å¡ç¶æï¼å·²å®æï¼
âââ prd.md
âââ design.md
âââ adr.md
âââ tasks/
âââ task-1.md ... task-N.md
è§èæ´æ°è§å
CX 段è½å¿ é¡» ⤠30 è¡ã妿´æ°å¯¼è´è¶ åºï¼æç¤ºç¨æ·ï¼
- ç²¾ç®åä½å 容
- å°è¯¦ç»è§èç§»è³é¡¹ç®ææ¡£ï¼å¦ docs/ ç®å½ï¼
- å¨ CLAUDE.md ä¸ä» ä¿çç²¾ç®çåå ³é®é¾æ¥
Epic å Scope éç¯
- å¦æå¨ collab/full 模å¼ï¼å ³éææç¸å ³ GitHub Issueï¼PRDãDesignãEpicãåä»»å¡ï¼
- æ´æ° Scope Issue ä¸å¯¹åºæ¨¡åçç¶æä¸º â 已宿
- æ£æ¥ Scope 䏿¯å¦æææ¨¡åé½å®æï¼è¥æ¯åå ³é Scope Issue
å¤åè½åºæ¯
妿ä¸ä¸ªé¡¹ç®æå¤ä¸ªåè½ï¼e.g., cx-payment, cx-refundï¼ï¼
- æ¯ä¸ªåè½æç¬ç«ç .claude/cx/features/{dev_id}-{feature}/ ç®å½
- CLAUDE.md ä¸ååºæææ´»è·åè½å已宿åè½
- Scope Issue 追踪æ´ä¸ªé¡¹ç®ç模åå®æåº¦
ä¸ cx-exec çè¡æ¥
- å½ cx-exec æ£æµå°ææä»»å¡ completed æ¶ï¼èªå¨è§¦å cx-summary
- 妿 config.code_review = trueï¼å å¯å¨ä»£ç 审æ¥ï¼åè¿å ¥æ±æ»
- cx-summary 读å宿´ç status.json å git log çææ±æ»