workflow-logging
2
总安装量
2
周安装量
#63212
全站排名
安装命令
npx skills add https://github.com/penkzhou/swiss-army-knife-plugin --skill workflow-logging
Agent 安装分布
mcpjam
2
neovate
2
antigravity
2
qwen-code
2
windsurf
2
zencoder
2
Skill 文档
工使µè¿ç¨æ¥å¿è§è
æ¬è§èå®ä¹äº Swiss Army Knife æä»¶ææå·¥ä½æµçæ¥å¿æ ¼å¼ååå ¥æ¨¡å¼ã
æ¥å¿çº§å«
| çº§å« | 代ç | ç¨é |
|---|---|---|
| INFO | I |
æ£å¸¸æµç¨äºä»¶ï¼Phase/Agent å¼å§ç»æï¼ |
| DEBUG | D |
详ç»è°è¯ä¿¡æ¯ï¼å®æ´ agent I/Oï¼ä» –verboseï¼ |
| WARN | W |
坿¢å¤çè¦åï¼å¦ Git ä¸å¯ç¨ï¼ |
| ERROR | E |
é误å失败 |
| DECISION | X |
å³çç¹ï¼ç½®ä¿¡åº¦å³çãç¨æ·äº¤äºï¼ |
æ¥å¿äºä»¶ç±»å
ä¼è¯äºä»¶
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| SESSION_START | ä¼è¯å¼å§ | 工使µåå§åå |
| SESSION_END | ä¼è¯ç»æ | 工使µå®ææå¤±è´¥å |
Phase äºä»¶
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| PHASE_START | Phase å¼å§ | æ¯ä¸ª Phase æ§è¡å |
| PHASE_END | Phase ç»æ | æ¯ä¸ª Phase 宿å |
Agent äºä»¶ï¼Coordinator 级ï¼
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| AGENT_CALL | Agent è°ç¨ | Task å·¥å ·è°ç¨å |
| AGENT_RESULT | Agent è¿å | Task å·¥å ·è¿åå |
Agent å é¨äºä»¶ï¼Phase Agent 级ï¼
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| STEP_START | æ¥éª¤å¼å§ | Agent å 鍿¯ä¸ªä¸»è¦æ¥éª¤å¼å§ |
| STEP_END | æ¥éª¤ç»æ | Agent å 鍿¯ä¸ªä¸»è¦æ¥éª¤ç»æ |
| TOOL_USE | å·¥å ·è°ç¨ | Agent ä½¿ç¨ Read/Bash/Glob çå·¥å · |
| DATA_COLLECTED | æ°æ®æ¶é | å ³é®æ°æ®æ¶é宿ï¼é ç½®ãæµè¯è¾åºçï¼ |
| ANALYSIS_RESULT | åæç»æ | é误åç±»ãæ ¹å åæçç»æ |
å³çäºä»¶
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| CONFIDENCE_DECISION | 置信度å³ç | æ ¹å åæçç½®ä¿¡åº¦æ£æ¥ç¹ |
| USER_INTERACTION | ç¨æ·äº¤äº | AskUserQuestion è°ç¨ |
Review äºä»¶
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| REVIEW_PARALLEL_START | å¹¶è¡å®¡æ¥å¼å§ | 6 个 review agents å¯å¨ |
| REVIEW_PARALLEL_END | å¹¶è¡å®¡æ¥ç»æ | 6 个 agents å ¨é¨è¿å |
| REVIEW_FIX_ITERATION | Fix 循ç¯è¿ä»£ | æ¯æ¬¡ review-fix å¾ªç¯ |
è¦ååé误
| ç±»å | 说æ | æ¶æº |
|---|---|---|
| WARNING | è¦åä¿¡æ¯ | 坿¢å¤çé®é¢ |
| ERROR | éè¯¯ä¿¡æ¯ | 失败åå¼å¸¸ |
JSONL æ ¼å¼è§è
æ¯è¡ä¸æ¡å®æ´ç JSON è®°å½ï¼å段å®ä¹ï¼
éç¨å段
{
"ts": "YYYY-MM-DDTHH:MM:SS.000Z", // ISO 8601 æ¶é´æ³ï¼å¿
å¡«ï¼
"level": "I", // æ¥å¿çº§å«ï¼å¿
å¡«ï¼
"type": "PHASE_START", // äºä»¶ç±»åï¼å¿
å¡«ï¼
"session_id": "a1b2c3d4" // ä¼è¯ IDï¼å¿
å¡«ï¼
}
注æï¼ä»¥ä¸ç¤ºä¾ä¸çæ¶é´æ³ä» 为æ¼ç¤ºï¼å®é ä½¿ç¨æ¶åºæ¿æ¢ä¸ºå½åæ¶é´ã
SESSION_START
{
"ts": "2024-12-06T14:30:52.123Z",
"level": "I",
"type": "SESSION_START",
"session_id": "a1b2c3d4",
"workflow": "bugfix",
"stack": "frontend",
"command": "/swiss-army-knife:fix-frontend --log",
"args": {
"phase": "all",
"dry_run": false,
"log": true,
"verbose": false
},
"env": {
"project_root": "/path/to/project",
"plugin_version": "1.0.0",
"git_branch": "feature/login"
}
}
SESSION_END
{
"ts": "2024-12-06T14:40:00.000Z",
"level": "I",
"type": "SESSION_END",
"session_id": "a1b2c3d4",
"status": "success",
"total_duration_ms": 548000,
"phases_completed": ["phase_0", "phase_1", "phase_2", "phase_3", "phase_4", "phase_5"],
"summary": {
"errors_fixed": 3,
"files_changed": 2,
"review_issues_fixed": 4,
"user_interactions": 2
}
}
PHASE_START / PHASE_END
{
"ts": "2024-12-06T14:30:53.456Z",
"level": "I",
"type": "PHASE_START",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"phase_name": "é®é¢æ¶éä¸åç±»",
"agents": ["frontend-init-collector", "frontend-error-analyzer"]
}
{
"ts": "2024-12-06T14:31:05.789Z",
"level": "I",
"type": "PHASE_END",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"status": "success",
"duration_ms": 12333,
"summary": {
"errors_found": 3,
"test_status": "test_failed"
}
}
AGENT_CALL / AGENT_RESULT
{
"ts": "2024-12-06T14:30:53.500Z",
"level": "I",
"type": "AGENT_CALL",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"model": "sonnet",
"input_summary": "å è½½é
ç½®åæ¶éæµè¯è¾åº"
}
{
"ts": "2024-12-06T14:30:58.200Z",
"level": "I",
"type": "AGENT_RESULT",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"status": "success",
"duration_ms": 4700,
"output_summary": {
"config_loaded": true,
"test_output_lines": 150,
"warnings_count": 1
}
}
STEP_START / STEP_ENDï¼Agent å é¨ï¼
{
"ts": "2024-12-06T14:30:54.000Z",
"level": "I",
"type": "STEP_START",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"step": "config_loading",
"step_name": "å è½½é
ç½®",
"step_index": 1,
"total_steps": 3
}
{
"ts": "2024-12-06T14:30:55.500Z",
"level": "I",
"type": "STEP_END",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"step": "config_loading",
"status": "success",
"duration_ms": 1500,
"result_summary": {
"default_config": true,
"project_config": true,
"merged": true
}
}
TOOL_USEï¼Agent å é¨ï¼
{
"ts": "2024-12-06T14:30:54.200Z",
"level": "D",
"type": "TOOL_USE",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"step": "config_loading",
"tool": "Read",
"target": "config/defaults.yaml",
"status": "success"
}
DATA_COLLECTEDï¼Agent å é¨ï¼
{
"ts": "2024-12-06T14:30:56.000Z",
"level": "I",
"type": "DATA_COLLECTED",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"data_type": "test_output",
"summary": {
"lines": 150,
"exit_code": 1,
"status": "test_failed",
"source": "auto_run"
}
}
ANALYSIS_RESULTï¼Agent å é¨ï¼
{
"ts": "2024-12-06T14:31:02.000Z",
"level": "I",
"type": "ANALYSIS_RESULT",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-error-analyzer",
"analysis_type": "error_classification",
"result": {
"errors_found": 3,
"categories": {
"mock_conflict": 2,
"async_timing": 1
},
"files_affected": ["Button.test.tsx", "Form.test.tsx"]
}
}
CONFIDENCE_DECISION
{
"ts": "2024-12-06T14:31:15.100Z",
"level": "X",
"type": "CONFIDENCE_DECISION",
"session_id": "a1b2c3d4",
"phase": "phase_1",
"confidence_score": 65,
"threshold": {
"auto_continue": 60,
"ask_user": 40,
"stop": 0
},
"decision": "auto_continue",
"factors": {
"clarity": 70,
"specificity": 60,
"context": 65,
"reproducibility": 55
}
}
USER_INTERACTION
{
"ts": "2024-12-06T14:32:00.000Z",
"level": "X",
"type": "USER_INTERACTION",
"session_id": "a1b2c3d4",
"phase": "phase_3",
"interaction_type": "AskUserQuestion",
"question": "Bugfix æ¹æ¡å·²çæï¼è¯·æ¥ç docs/bugfix/xxx.mdã确认åå¼å§å®æ½ã",
"options": ["确认æ§è¡", "è°æ´æ¹æ¡", "åæ¶"],
"user_response": "确认æ§è¡",
"wait_duration_ms": 15000
}
REVIEW_PARALLEL_START / REVIEW_PARALLEL_END
{
"ts": "2024-12-06T14:35:00.000Z",
"level": "I",
"type": "REVIEW_PARALLEL_START",
"session_id": "a1b2c3d4",
"phase": "phase_5",
"agents": [
"review-code-reviewer",
"review-silent-failure-hunter",
"review-code-simplifier",
"review-test-analyzer",
"review-comment-analyzer",
"review-type-design-analyzer"
]
}
{
"ts": "2024-12-06T14:35:30.000Z",
"level": "I",
"type": "REVIEW_PARALLEL_END",
"session_id": "a1b2c3d4",
"phase": "phase_5",
"duration_ms": 30000,
"results": [
{"agent": "review-code-reviewer", "status": "success", "issues": 2},
{"agent": "review-silent-failure-hunter", "status": "success", "issues": 1},
{"agent": "review-code-simplifier", "status": "success", "issues": 0},
{"agent": "review-test-analyzer", "status": "success", "issues": 1},
{"agent": "review-comment-analyzer", "status": "failed", "error": "timeout"},
{"agent": "review-type-design-analyzer", "status": "success", "issues": 0}
],
"total_issues": 4,
"fixable_issues": 3
}
REVIEW_FIX_ITERATION
{
"ts": "2024-12-06T14:36:00.000Z",
"level": "I",
"type": "REVIEW_FIX_ITERATION",
"session_id": "a1b2c3d4",
"phase": "phase_5",
"iteration": 1,
"issues_before": 4,
"issues_after": 1,
"fixed_count": 3,
"termination_reason": null
}
WARNING / ERROR
{
"ts": "2024-12-06T14:31:10.500Z",
"level": "W",
"type": "WARNING",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"code": "GIT_UNAVAILABLE",
"message": "Git ä¿¡æ¯æ¶é失败ï¼not a git repository",
"impact": "æ ¹å åæå°ç¼ºå°çæ¬æ§å¶ä¸ä¸æ"
}
{
"ts": "2024-12-06T14:33:00.000Z",
"level": "E",
"type": "ERROR",
"session_id": "a1b2c3d4",
"phase": "phase_1",
"code": "CONFIDENCE_TOO_LOW",
"message": "æ ¹å åæç½®ä¿¡åº¦ 35% ä½äºéå¼ 40%",
"agent": "frontend-root-cause",
"recoverable": false
}
DEBUG: AGENT_IOï¼ä» –verboseï¼
{
"ts": "2024-12-06T14:30:53.500Z",
"level": "D",
"type": "AGENT_IO",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"agent": "frontend-init-collector",
"direction": "input",
"content": "... 宿´ç agent è¾å
¥ ..."
}
ææ¬æ ¼å¼è§è
人类å¯è¯»çæ¶é´çº¿æ ¼å¼ï¼æ¯è¡ä¸æ¡è®°å½ï¼
[{timestamp}] {LEVEL} | {TYPE} | {message}
æ ¼å¼ç¤ºä¾
[2024-12-06 14:30:52.123] INFO | SESSION_START | Bugfix Frontend (a1b2c3d4)
[2024-12-06 14:30:52.123] INFO | ENV | project=/path/to/project branch=feature/login
[2024-12-06 14:30:53.456] INFO | PHASE_START | Phase 0: é®é¢æ¶éä¸åç±»
[2024-12-06 14:30:53.500] INFO | AGENT_CALL | frontend-init-collector (sonnet)
[2024-12-06 14:30:58.200] INFO | AGENT_RESULT | frontend-init-collector | success | 4700ms
[2024-12-06 14:31:05.789] INFO | PHASE_END | Phase 0 | success | 12333ms | errors_found=3
[2024-12-06 14:31:06.000] INFO | PHASE_START | Phase 1: è¯æåæ
[2024-12-06 14:31:15.100] DECN | CONFIDENCE | score=65 | decision=auto_continue | threshold=60
[2024-12-06 14:31:20.000] INFO | PHASE_END | Phase 1 | success | 14000ms
[2024-12-06 14:32:00.000] DECN | USER_ASK | "确认åå¼å§å®æ½" | options=[确认æ§è¡,è°æ´æ¹æ¡,åæ¶]
[2024-12-06 14:32:15.000] DECN | USER_ANSWER | "确认æ§è¡" | wait=15000ms
[2024-12-06 14:35:00.000] INFO | REVIEW_START | 6 agents: code-reviewer,silent-failure-hunter,...
[2024-12-06 14:35:30.000] INFO | REVIEW_END | 30000ms | issues=4 | fixable=3
[2024-12-06 14:36:00.000] INFO | REVIEW_FIX | iteration=1 | before=4 | after=1 | fixed=3
[2024-12-06 14:40:00.000] INFO | SESSION_END | success | 548000ms | files=2 | issues_fixed=4
级å«å¯¹é½
INFO - æ£å¸¸ä¿¡æ¯ï¼4 å符 + ç©ºæ ¼ï¼
DEBUG - è°è¯ä¿¡æ¯ï¼5 å符ï¼
WARN - è¦åï¼4 å符 + ç©ºæ ¼ï¼
ERROR - é误ï¼5 å符ï¼
DECN - å³çï¼4 å符 + ç©ºæ ¼ï¼
æ¥å¿åå ¥æ¹æ³
ä½¿ç¨ Bash 追å åå ¥
ç±äº Write å·¥å ·ä¼è¦çæä»¶ï¼å¿ é¡»ä½¿ç¨ Bash 追å ï¼
# JSONL æ ¼å¼
echo '{"ts":"2024-12-06T14:30:52.123Z","level":"I","type":"PHASE_START",...}' >> "${jsonl_file}"
# ææ¬æ ¼å¼
echo '[2024-12-06 14:30:52.123] INFO | PHASE_START | Phase 0: é®é¢æ¶éä¸åç±»' >> "${log_file}"
JSON è½¬ä¹æ³¨æäºé¡¹
JSON å符串ä¸çç¹æ®å符éè¦æ£ç¡®è½¬ä¹ï¼
- åå¼å·
"â\" - åææ
\â\\ - æ¢è¡ç¬¦ â
\n
æ¶é´æ³æ ¼å¼
- JSONL: ISO 8601 æ ¼å¼
2024-12-06T14:30:52.123Z - ææ¬: 人类å¯è¯»
[2024-12-06 14:30:52.123]
è·åå½åæ¶é´æ³ï¼
# ISO 8601 æ ¼å¼ï¼ç¨äº JSONLï¼
date -u +"%Y-%m-%dT%H:%M:%S.000Z"
# 人类å¯è¯»æ ¼å¼ï¼ç¨äºææ¬ï¼
date +"%Y-%m-%d %H:%M:%S.000"
æ¥å¿ä¸ä¸æä¼ é
å±çº§ 1: å½ä»¤å± â Master Coordinator
å½ä»¤å±ä¼ éç» coordinator ç logging ä¸ä¸æï¼
{
"logging": {
"enabled": true,
"level": "info",
"session_id": "a1b2c3d4"
}
}
å±çº§ 2: Master Coordinator â Phase Agent
Master Coordinator åå§åæ¥å¿æä»¶åï¼ä¼ éç»æ¯ä¸ª Phase Agentï¼
{
"logging": {
"enabled": true,
"level": "info",
"session_id": "a1b2c3d4",
"phase": "phase_0",
"log_files": {
"jsonl": ".claude/logs/swiss-army-knife/bugfix/2024-12-06_143052_frontend_a1b2c3d4.jsonl",
"text": ".claude/logs/swiss-army-knife/bugfix/2024-12-06_143052_frontend_a1b2c3d4.log"
}
}
}
Phase Agent æ¥å¿è®°å½æ¨¡å¼
Phase Agent æ¶å° logging ä¸ä¸æåï¼å¨æ¯ä¸ªä¸»è¦æ¥éª¤è®°å½æ¥å¿ï¼
## æ¥å¿è®°å½
妿 `logging.enabled` 为 `true`ï¼å¨æ¯ä¸ªæ¥éª¤è®°å½æ¥å¿ï¼
### æ¥éª¤å¼å§
\`\`\`bash
# JSONL
echo '{"ts":"'$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")'","level":"I","type":"STEP_START","session_id":"${session_id}","phase":"${phase}","agent":"${agent_name}","step":"config_loading","step_name":"å è½½é
ç½®","step_index":1,"total_steps":3}' >> "${jsonl_file}"
# ææ¬
echo "[$(date +"%Y-%m-%d %H:%M:%S.000")] INFO | STEP_START | ${agent_name} | æ¥éª¤ 1/3: å è½½é
ç½®" >> "${log_file}"
\`\`\`
### æ¥éª¤ç»æ
\`\`\`bash
# JSONL
echo '{"ts":"'$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")'","level":"I","type":"STEP_END","session_id":"${session_id}","phase":"${phase}","agent":"${agent_name}","step":"config_loading","status":"success","duration_ms":1500}' >> "${jsonl_file}"
# ææ¬
echo "[$(date +"%Y-%m-%d %H:%M:%S.000")] INFO | STEP_END | ${agent_name} | æ¥éª¤ 1/3 宿 | 1500ms" >> "${log_file}"
\`\`\`
Coordinator å é¨ç»´æ¤
Coordinator åå§ååè®¡ç®æ¥å¿æä»¶è·¯å¾ï¼
log_dir = ".claude/logs/swiss-army-knife/{workflow}"
timestamp = "2024-12-06_143052"
session_id = input.logging.session_id
jsonl_file = f"{log_dir}/{timestamp}_{identifier}_{session_id}.jsonl"
log_file = f"{log_dir}/{timestamp}_{identifier}_{session_id}.log"
ä¼ éç»å Coordinatorï¼å¦ review-coordinatorï¼
{
"logging": {
"enabled": true,
"level": "info",
"session_id": "a1b2c3d4",
"log_files": {
"jsonl": ".claude/logs/swiss-army-knife/bugfix/xxx.jsonl",
"text": ".claude/logs/swiss-army-knife/bugfix/xxx.log"
}
}
}
æ¥å¿æ¥è¯¢ç¤ºä¾
ä½¿ç¨ jq æ¥è¯¢ JSONL
# æ¥çä¼è¯æè¦
jq 'select(.type == "SESSION_START" or .type == "SESSION_END")' xxx.jsonl
# æ¥çææé误
jq 'select(.level == "E")' xxx.jsonl
# æ¥ç Phase èæ¶
jq 'select(.type == "PHASE_END") | {phase, duration_ms, status}' xxx.jsonl
# æ¥ç置信度å³ç
jq 'select(.type == "CONFIDENCE_DECISION")' xxx.jsonl
# æ¥çç¨æ·äº¤äº
jq 'select(.type == "USER_INTERACTION")' xxx.jsonl
# ææ¶é´æåº
jq -s 'sort_by(.ts)' xxx.jsonl
# è®¡ç®æ»èæ¶
jq 'select(.type == "SESSION_END") | .total_duration_ms / 1000 | "\(.) ç§"' xxx.jsonl
ä½¿ç¨ grep æ¥è¯¢ææ¬æ¥å¿
# æ¥çææé误
grep "ERROR" xxx.log
# æ¥ç Phase èæ¶
grep "PHASE_END" xxx.log
# æ¥çå³çç¹
grep "DECN" xxx.log
# æ¥çç¹å® agent
grep "frontend-root-cause" xxx.log