cx-plan
1
总安装量
1
周安装量
#51211
全站排名
安装命令
npx skills add https://github.com/m19803261706/cx-workflow --skill cx-plan
Agent 安装分布
mcpjam
1
openhands
1
junie
1
windsurf
1
zencoder
1
crush
1
Skill 文档
cx-plan: ä»»å¡è§åä¸å¥çº¦ä¸æ²
读åè®¾è®¡ææ¡£ï¼çæåé¶æ®µä»»å¡åè§£ï¼å° API å¥çº¦ä¸æ²å°ååä»»å¡ï¼ä½¿ exec é¶æ®µæ éç¿»é è®¾è®¡ææ¡£å³å¯æå¥çº¦å®ç°ã
ä½¿ç¨æ¹æ³
/cx-plan {åè½å} # æå®åè½å建任å¡è§å
/cx-plan # ä½¿ç¨æè¿ç Design Docï¼æ PRD for S è§æ¨¡ï¼
/cx-plan --skip-design {åè½} # S è§æ¨¡åè½ç´æ¥ä» PRD å建计å
æ ¸å¿æ¥éª¤
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")
FEATURE_DIR="$PROJECT_ROOT/.claude/cx/features/${DEVELOPER_ID}-{feature_slug}"
mkdir -p "$FEATURE_DIR/tasks"
Step 1: 读åè®¾è®¡ææ¡£
if [[ "$ARGUMENTS" == *"--skip-design"* ]]; then
# S è§æ¨¡ï¼ç´æ¥è¯»å PRD
DESIGN_DOC_PATH=""
PRD_PATH="$FEATURE_DIR/prd.md"
else
# æ£å¸¸ï¼è¯»å Design Doc
DESIGN_DOC_PATH="$FEATURE_DIR/design.md"
PRD_PATH="$FEATURE_DIR/prd.md"
fi
Step 2: æå API å¥çº¦ç段
ä» Design Doc 䏿åä¸å¤§å¥çº¦ä¿¡æ¯ï¼
- API å¥çº¦ â æ¥å£è·¯å¾ + 请æ±ä½ + ååºä½
- ç¶ææä¸¾å¯¹ç §è¡¨ â å端常é / API ä¼ è¾å¼ / å端常é
- VO/DTO åæ®µæ å° â DB åæ®µ â DTO â åç«¯åæ®µ
å°è¿äºå¥çº¦ææ¥å£/åè½ç¹ç¼å·ï¼ä¾¿äºä»»å¡å¼ç¨ã
Step 3: ä»»å¡ç»åä¸å¹¶è¡æ 注
åºäº Design Doc ä¸ç模åååå代ç å½±åèå´ï¼ç»åä»»å¡å表ï¼
åé¶æ®µååï¼
phases:
- phase: 1
name: "æ°æ®å±"
tasks:
- number: 1
title: "æ°æ®åºè¡¨è®¾è®¡"
description: "{description}"
labels: ["backend"]
parallel: true
depends_on: []
related_apis: [] # API å¥çº¦ç¼å·
related_enums: [] # ç¶ææä¸¾
related_fields: [1,2] # åæ®µæ å°ç¼å·
acceptance:
- "åå»ºæ°æ®åºè¡¨ï¼ç¬¦å Design Doc æ°æ®åºè®¾è®¡"
- "ç´¢å¼å约ææè®¾è®¡è¦æ±"
- phase: 2
name: "å端æå¡"
tasks:
- number: 2
title: "REST API å®ç°"
description: "{description}"
labels: ["backend"]
parallel: false
depends_on: [1]
related_apis: [1, 2, 3] # 该任å¡å®ç°ç API æ¥å£ç¼å·
related_enums: ["StatusEnum"]
related_fields: [1,2,3,4,5]
acceptance:
- "æ¥å£è·¯å¾ä¸ API å¥çº¦ä¸è´"
- "请æ±/ååºåæ®µä¸ VO/DTO æ å°è¡¨ä¸è´"
- "ç¶ææä¸¾å¼ä¸å¯¹ç
§è¡¨ä¸è´"
Step 4: å建æ¬å°ä»»å¡æä»¶
为æ¯ä¸ªä»»å¡å建 task-{n}.md æä»¶ï¼å
å«ä»»å¡æè¿°åç¸å
³å¥çº¦ç段ï¼
æä»¶æ ¼å¼ï¼
# Task {number}: {title}
## å
³è
- Part of feature: {feature_name}
- Phase: {phase}
## ä»»å¡æè¿°
{ä»»å¡æè¿°åèæ¯}
## éªæ¶æ å
- [ ] {æ å1}
- [ ] {æ å2}
- [ ] â
æ¥å£è·¯å¾ä¸ API å¥çº¦ä¸è´
- [ ] â
请æ±/ååºå段ä¸å¥çº¦ä¸è´
- [ ] â
ç¶ææä¸¾å¼ä¸å¯¹ç
§è¡¨ä¸è´
## ð API å¥çº¦çæ®µï¼æ¥èª Design Docï¼
> â ï¸ ä»¥ä¸å¥çº¦å·²å¨ Design Doc ä¸éå®ï¼å®ç°æ¶å¿
é¡»ä¸¥æ ¼éµå®ã
### å
³èæ¥å£
#### æ¥å£ 1: {æ¥å£å}
\`\`\`
{METHOD} /api/v1/{path}
Request:
{JSON 示ä¾}
Response:
{JSON 示ä¾}
\`\`\`
#### æ¥å£ 2: {æ¥å£å}
\`\`\`
...
\`\`\`
### å
³èç¶ææä¸¾
| æä¸¾å¼ | å端常é | API ä¼ è¾å¼ | å端常é | æ¾ç¤ºææ¬ |
|--------|---------|-----------|---------|---------|
| {å¼} | {CONSTANT} | "{value}" | '{value}' | "{æ¾ç¤º}" |
### å
³èåæ®µæ å°
| # | DB åæ®µ | DTO åæ®µ | API JSON | åç«¯åæ®µ | ç±»å | å¿
å¡« |
|---|---------|---------|----------|---------|------|------|
| 1 | {db} | {dto} | {api} | {ts} | {type} | â
/â |
## 代ç åè
{å¤ç¨/å²çªä¿¡æ¯ï¼å¦æ}
## ç¸å
³ææ¡£
- Design Doc: {path æ Issue ç¼å·}
- PRD: {path æ Issue ç¼å·}
ä¿åå° .claude/cx/features/{dev_id}-{feature}/tasks/task-{n}.mdã
Step 5: çæå ¨å±ä»»å¡ç¶ææä»¶
å建 status.json è®°å½ææä»»å¡çå
æ°æ®åæ§è¡é¡ºåºï¼
{
"feature": "{feature_name}",
"slug": "{feature_slug}",
"created_at": "2024-01-15T10:00:00Z",
"status": "planning",
"phases": [
{
"number": 1,
"name": "æ°æ®å±",
"parallel_group": "p1-a",
"status": "pending",
"tasks": [1, 2]
},
{
"number": 2,
"name": "å端æå¡",
"parallel_group": "p2-a",
"status": "blocked",
"tasks": [3, 4],
"depends_on": [1]
}
],
"tasks": [
{
"number": 1,
"title": "æ°æ®åºè¡¨è®¾è®¡",
"phase": 1,
"parallel": true,
"depends_on": [],
"parallel_group": "p1-a",
"related_apis": [],
"related_enums": [],
"related_fields": [1, 2],
"status": "pending"
}
],
"execution_order": [1, 2, 3, 4, 5],
"docs": {
"prd": "prd.md",
"design": "design.md",
"adr": "adr.md"
}
}
Step 6: å¹¶è¡æ§å¤å®
åºäºä»¥ä¸è§å夿任塿¯å¦å¯ä»¥å¹¶è¡ï¼
| å¯å¹¶è¡ | ä¸å¯å¹¶è¡ |
|---|---|
| ä¸åç®å½çç¬ç«æ¨¡å | ä¿®æ¹å䏿件 |
| å端 model + DB migration | åä¸ç»ä»¶çä¸åé¨å |
| ç¬ç«ç API ç«¯ç¹ | å ±äº«ç¶æ/é ç½®ä¿®æ¹ |
| ç¬ç«çåç«¯é¡µé¢ | è·¯ç±/导èªä¿®æ¹ |
| åå æµè¯æä»¶ | å ¨å±æ ·å¼/主é¢ä¿®æ¹ |
Step 7: GitHub 忥ï¼å¯éï¼
æ ¹æ® config.github_syncï¼
- off/localï¼ä» ä¿åæ¬å°ä»»å¡æä»¶å status.json
- collab/fullï¼å建 GitHub Epic Issueï¼æ ç¾
epicï¼ï¼å ³èææåä»»å¡ Issuesï¼æ ç¾task:{feature}ï¼
Step 8: è¾åºæè¦
ä»»å¡è§å宿
åè½: {feature_name}
è§æ¨¡: {S/M/L}
æ»ä»»å¡æ°: {N}
Phase 1: {phase_name}
âââ Task 1: {title} (parallel)
âââ Task 2: {title} (parallel)
Phase 2: {phase_name}
âââ Task 3: {title} (depends_on: Task 1,2)
âââ Task 4: {title} (depends_on: Task 1,2)
æ§è¡é¡ºåº: 1 â {2,3,4} â 5 â ...
ï¼æ¬å·å
çä»»å¡å¯å¹¶è¡æ§è¡ï¼
æ¬å°ä»»å¡æä»¶ä½ç½®: .claude/cx/features/{dev_id}-{feature}/tasks/
ä»»å¡ç¶æ: .claude/cx/features/{dev_id}-{feature}/status.json
ä¸ä¸æ¥: /cx-exec
Step 9: ä¸ä¸æ¥å¼å¯¼
{
"questions": [
{
"question": "æ¯å¦ç«å³æ§è¡ä»»å¡ï¼",
"header": "ä¸ä¸æ¥",
"multiSelect": false,
"options": [
{"label": "ç«å³æ§è¡", "description": "è¿è¡ /cx-exec å¼å§ç¬¬ä¸ä¸ªä»»å¡"},
{"label": "æ¹éæ§è¡", "description": "è¿è¡ /cx-exec --all å¹¶è¡æ§è¡"},
{"label": "ç¨åå¤ç", "description": "å
review status.json åå任塿件"}
]
}
]
}
æ¬å°æä»¶ç»æ
.claude/cx/features/{dev_id}-{feature}/
âââ status.json â å
¨å±ä»»å¡ç¶æåæ§è¡é¡ºåº
âââ tasks/
â âââ task-1.md â Task 1 + å¥çº¦ç段
â âââ task-2.md â Task 2 + å¥çº¦ç段
â âââ task-N.md â Task N + å¥çº¦ç段
âââ prd.md
âââ design.md
âââ adr.md
å¥çº¦ä¸æ²çä¼å¿
- cx-exec æ éç¿»é è®¾è®¡ææ¡£ï¼ææå¥çº¦ç段已åµå ¥ä»»å¡æä»¶
- å¹¶è¡ exec æ´å®å ¨ï¼åå代çæç¬ç«çå¥çº¦åèï¼é¿å çè§£åå·®
- å¥çº¦æ ¡éªæ´ç²¾ç¡®ï¼å¯¹æ¯å®ç° vs ä»»å¡ Issue ä¸çå¥çº¦ç段ï¼é误æ´å®¹æå®ä½
ä¸ cx-design çè¡æ¥
- è¾å ¥ï¼design.mdï¼å«ä¸å¤§å¥çº¦ï¼
- è¾åºï¼task-{n}.md filesï¼å¥çº¦ä¸æ²ï¼+ status.jsonï¼æ§è¡é¡ºåºï¼
- 妿 S è§æ¨¡è·³è¿ designï¼ç´æ¥ä» prd.md 读å鿱并çæç®åä»»å¡
ä¸ cx-exec çè¡æ¥
- cx-exec 读å status.json ç¡®å®æ§è¡é¡ºåº
- cx-exec æ ¹æ® parallel_group 夿åªäºä»»å¡å¯å¹¶è¡
- cx-exec 读å task-{n}.md ä½ä¸ºå®ç°åè
- cx-exec æ´æ° status.json ä¸çä»»å¡è¿åº¦