cx-exec
npx skills add https://github.com/m19803261706/cx-workflow --skill cx-exec
Agent 安装分布
Skill 文档
cx-exec: 任塿§è¡ä¸å¥çº¦æ ¡éª
5 æ¥ç²¾ç®æµç¨å®ç°åè½ä»£ç ï¼èªå¨æ ¡éªä¸ API å¥çº¦ä¸è´ï¼å ¨é¨å®æåå¯å¨æ±æ»ã
ä½¿ç¨æ¹æ³
/cx-exec # æ§è¡ä¸ä¸ä¸ªå¾
æ§è¡ä»»å¡
/cx-exec #1 # æ§è¡æå®ä»»å¡ç¼å·
/cx-exec 1-5 # æ¹éæ§è¡ä»»å¡ 1 å° 5
/cx-exec --phase 1 # æ§è¡ Phase 1 çææä»»å¡
/cx-exec --all # æ§è¡ææå¾
æ§è¡ä»»å¡ï¼å¹¶è¡ï¼
æ ¸å¿æ¥éª¤
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: 读åä»»å¡
# è¯»åæ¬å°ç¶æ
STATUS_FILE="$FEATURE_DIR/status.json"
TASK_NUMBER=$(jq -r '.tasks[] | select(.status == "pending") | .number' "$STATUS_FILE" | head -1)
# 读åä»»å¡è¯¦æ
TASK_FILE="$FEATURE_DIR/tasks/task-${TASK_NUMBER}.md"
ä¾èµæ£æ¥ï¼
- 妿任塿
depends_onï¼æ£æ¥ä¾èµä»»å¡æ¯å¦å·²å®æ - è¥æªå®æï¼æç¤ºç¨æ·å æ§è¡ä¾èµä»»å¡ï¼ä¸å¼ºå¶æ§è¡
æ´æ°ä»»å¡ç¶æï¼æ 记为 in_progressã
Step 2: å®ç°ä»£ç
æ ¹æ® Task æä»¶ä¸çä»»å¡æè¿°å API å¥çº¦ç段 è¿è¡å®ç°ã
å ³é®ååï¼
- é¦å é 读 Task æä»¶ä¸çãð API å¥çº¦ç段ã
- å端ï¼Controller è·¯å¾ãDTO åæ®µåãæä¸¾å¼å¿ é¡»ä¸å¥çº¦ä¸è´
- å端ï¼API è·¯å¾ãinterface åæ®µåãæä¸¾å¸¸éå¿ é¡»ä¸å¥çº¦ä¸è´
- 妿éå°é»å¡ï¼ç¼ºå°ä¾èµã鿱䏿¸ ï¼ï¼å䏿¥åç¥ç¨æ·
ææ¯æ èªéåºï¼æ ¹æ®é¡¹ç®ç±»åè¿è¡å¯¹åºçæµè¯åæ£æ¥
[ -f pyproject.toml ] && uv run pytest
[ -f package.json ] && npm test
[ -f pom.xml ] && mvn test
Step 3: å¥çº¦æ ¡éªï¼æ ¸å¿æ°å¢ï¼
å®ç°å®æåï¼èªå¨æ ¡éªä»£ç æ¯å¦ä¸ Task æä»¶ä¸ç API å¥çº¦ä¸è´ã
æ ¡éªå 容ï¼
1. æ¥å£è·¯å¾ä¸è´æ§
æ¯å¯¹ï¼Controller @RequestMapping vs Task ä¸çå¥çº¦è·¯å¾
ä¸ä¸è´ â èªå¨ä¿®æ£
2. DTO/VO åæ®µä¸è´æ§
æ¯å¯¹ï¼DTO ç±»åæ®µ vs Task ä¸çåæ®µæ å°è¡¨
ä¸ä¸è´ â èªå¨ä¿®æ£
3. ç¶ææä¸¾ä¸è´æ§
æ¯å¯¹ï¼æä¸¾ç±»/常é vs Task ä¸çç¶ææä¸¾å¯¹ç
§è¡¨
ä¸ä¸è´ â èªå¨ä¿®æ£
4. 请æ±/ååºç»æä¸è´æ§
æ¯å¯¹ï¼Controller æ¹æ³ç¾å vs Task ä¸ç Request/Response JSON
ä¸ä¸è´ â èªå¨ä¿®æ£
æ ¡éªç»æå¤çï¼
â å ¨é¨éè¿ï¼
å¥çº¦æ ¡éªéè¿
æ¥å£è·¯å¾: 3/3 ä¸è´
åæ®µæ å°: 12/12 ä¸è´
ç¶ææä¸¾: 4/4 ä¸è´
â ç»§ç»æäº¤
â ï¸ åç°ä¸ä¸è´ï¼èªå¨ä¿®æ£ï¼ï¼
å¥çº¦æ ¡éªåç°ä¸ä¸è´ï¼èªå¨ä¿®æ£ä¸...
â æ¥å£è·¯å¾: POST /api/v1/certifications â å®é
为 /certification
â å·²ä¿®æ£ @PostMapping è·¯å¾
â åæ®µå: rejectReason â å®é
为 rejectMsg
â å·²ä¿®æ£ DTO åæ®µååå端 interface
â ç¶ææä¸¾: REJECTED â å®é
为 REJECT
â 已修æ£å端æä¸¾å¸¸é
ä¿®æ£å®æï¼éæ°è¿è¡æµè¯...
â ä¿®æ£å仿é®é¢ï¼åæ¢æäº¤ï¼ï¼
å¥çº¦æ ¡éªå¤±è´¥ï¼æ æ³èªå¨ä¿®æ£
é®é¢: {å
·ä½é®é¢}
建议: {ä¿®å¤å»ºè®®}
éè¦äººå·¥ä»å
¥
Step 4: æäº¤ä»£ç
git add {ç¸å
³æä»¶}
git commit -m "{type}({scope}): {description} (task #{task_number})"
commit message éµå¾ªé¡¹ç®å·²æé£æ ¼ï¼æ conventional commitsï¼ã
Step 5: æ´æ°è¿åº¦ & è§£éä¾èµä»»å¡
# æ´æ°ä»»å¡ç¶æä¸º completed
jq ".tasks[] |= if .number == $TASK_NUMBER then .status = \"completed\" else . end" "$STATUS_FILE" > "$STATUS_FILE.tmp"
mv "$STATUS_FILE.tmp" "$STATUS_FILE"
# è§£éä¾èµè¯¥ä»»å¡ç pending ä»»å¡
for dependent in $(jq -r ".tasks[] | select(.depends_on[]? == $TASK_NUMBER) | .number" "$STATUS_FILE"); do
jq ".tasks[] |= if .number == $dependent then .status = \"pending\" else . end" "$STATUS_FILE" > "$STATUS_FILE.tmp"
mv "$STATUS_FILE.tmp" "$STATUS_FILE"
done
Step 6: Epic éç¯æ£æµ
æ£æ¥ææä»»å¡æ¯å¦å®æï¼
TOTAL=$(jq '.tasks | length' "$STATUS_FILE")
COMPLETED=$(jq '[.tasks[] | select(.status == "completed")] | length' "$STATUS_FILE")
if [ "$COMPLETED" -eq "$TOTAL" ]; then
# === ææä»»å¡å®æï¼è§¦åéç¯ ===
echo "ææä»»å¡å·²å®æï¼å¯å¨æ±æ»..."
# èªå¨è§¦å cx-summary
# 妿 config.code_review = trueï¼å
å¯å¨ä»£ç å®¡æ¥æµç¨
fi
æ¹éæ§è¡æ¨¡å¼
åæ°è§£æ
case "$ARGUMENTS" in
*-*)
# èå´: 1-5
RANGE=$(echo "$ARGUMENTS" | tr '-' ' ')
TARGETS=$(jq -r ".execution_order[] | select(. >= $START and . <= $END)" "$STATUS_FILE")
;;
--phase*)
# Phase: --phase 1
PHASE=$(echo "$ARGUMENTS" | grep -oE '[0-9]+')
TARGETS=$(jq -r ".phases[] | select(.number == $PHASE) | .tasks[]" "$STATUS_FILE")
;;
--all)
# ææ pending ä»»å¡
TARGETS=$(jq -r '.tasks[] | select(.status == "pending") | .number' "$STATUS_FILE")
;;
esac
å¹¶è¡æ§è¡
æ ¹æ® parallel_group åæ®µå¤æå¹¶è¡æ§ï¼
åä¸ parallel_group çä»»å¡å¯å¹¶è¡ï¼ä¸å group 串è¡ã
# å¹¶è¡ç» p1-a (task 1, 2 å¯å¹¶è¡)
Task agent: task-1.md â Step 1-5
Task agent: task-2.md â Step 1-5
â å
¨é¨å®æå
# å¹¶è¡ç» p2-a (task 3, 4 å¯å¹¶è¡)
Task agent: task-3.md â Step 1-5
Task agent: task-4.md â Step 1-5
â å
¨é¨å®æå
# å¹¶è¡ç» p3-a (task 5 串è¡)
Task agent: task-5.md â Step 1-5
å代çè°ç¨
æ¯ä¸ªä»»å¡éè¿ Task tool å¯å¨ç¬ç«å代çï¼
Task tool åæ°:
subagent_type: "task-executor"
prompt: |
é¡¹ç®æ ¹ç®å½: $PROJECT_ROOT
ä»»å¡: $FEATURE_DIR/tasks/task-{n}.md
请æ 5 æ¥æµç¨å®æ:
1. 读å task-{n}.md ä¸çä»»å¡æè¿°å API å¥çº¦ç段
2. æå¥çº¦å®ç°ä»£ç ï¼è·¯å¾ãåæ®µãæä¸¾ä¸è´ï¼
3. è¿è¡é¡¹ç®æµè¯åæ£æ¥
4. æ§è¡å¥çº¦æ ¡éªï¼å¯¹æ¯å®ç° vs task-{n}.md ä¸çå¥çº¦ï¼
5. æ ¡éªéè¿å git add + commit
commit message æ ¼å¼: {type}({scope}): {desc} (task #{n})
å¹¶è¡ï¼ä¸æ¡æ¶æ¯ä¸åèµ·å¤ä¸ª Task tool è°ç¨ 串è¡ï¼çåä¸ä¸ªå®æååå¯å¨ä¸ä¸ä¸ª
é误å¤ç
å®ç°å¤±è´¥
任塿§è¡éå°é®é¢
é误: {å
·ä½é误}
已宿: {é¨åè¿åº¦}
å·²æ¢å¤ä»»å¡ä¸º pending ç¶æï¼éè¦äººå·¥ä»å
¥
ä»»å¡ç¶æé置为 pendingï¼ä¾åç»éè¯ã
å¥çº¦æ ¡éªå¤±è´¥ï¼æ æ³èªå¨ä¿®æ£ï¼
å¥çº¦æ ¡éªå¤±è´¥
ä¸ä¸è´é¡¹:
{å
·ä½é®é¢}
建议: æ£æ¥ Task ä¸çå¥çº¦å®ä¹æ¯å¦éè¦è°æ´
ææ£æ¥ Design Doc ä¸çç¸åºç« è
ä¾èµæªæ»¡è¶³
ä»»å¡ #103 ä¾èµæªæ»¡è¶³
ä¾èµ: #101 (ç¶æ: pending)
建议: å
æ§è¡ /cx-exec #101
è¿åº¦è¿½è¸ª
status.json å¨ Step 5 宿¶æ´æ°ï¼è®°å½ï¼
- æ¯ä¸ªä»»å¡çç¶æï¼pending / in_progress / completedï¼
- Phase çæ´ä½è¿åº¦
- ä¸ä¸ä¸ªå¯æ§è¡ä»»å¡
ä¸ cx-plan çè¡æ¥
- è¾å ¥ï¼status.jsonï¼ä»»å¡å表ï¼+ task-{n}.mdï¼ä»»å¡è¯¦æ ï¼
- è¾åºï¼æ´æ°ç status.json + git commits
- cx-exec 读å status.json ä¸ç
execution_orderç¡®å®æ§è¡é¡ºåº
ä¸ cx-summary çè¡æ¥
- 彿æä»»å¡ completed æ¶ï¼èªå¨è§¦å cx-summary
- cx-summary 读å宿´ç status.json å git logï¼çææ±æ»ææ¡£
- å¯éå¯å¨ä»£ç 审æ¥ï¼å¦ config.code_review = trueï¼
SubagentStop Hook
æ¹éæ§è¡æ¶ï¼æ¯ä¸ªå代ç宿å触å SubagentStop hook æ ¡éªï¼
- ä»£ç æ¯å¦ç¬¦åå¥çº¦ï¼
- æµè¯æ¯å¦éè¿ï¼
- è¥æé®é¢ï¼æ è®°ä»»å¡ä¸º failedï¼ä¸èªå¨éè¯
ä¸ä¸ææä¹ å
SessionStart hook èªå¨å è½½å½å feature ç status.jsonï¼è¾åºï¼
å½åè¿åº¦:
åè½: cx-payment
Phase 1: 2/2 completed
Phase 2: 1/3 in_progress (Task #103)
ä¸ä¸ä¸ª: Task #104
ä½¿ç¨æ·å¿«éæ¢å¤ä¸æçå·¥ä½ã