워크플로우 구조를 트리 형태로 시각화
Visualizes workflow JSON as an indented tree structure with branch and merge indicators.
/plugin marketplace add hclleee/cc-plugin/plugin install hclleee-cc-workflow-plugins-cc-workflow@hclleee/cc-plugin워크플로우 JSON을 읽어 터미널에서 보기 쉬운 트리 구조로 출력합니다.
워크플로우 파일 확인
.claude/workflows/<name>.json 로드JSON 파싱 및 구조 분석
트리 구조 생성
[LABEL]로 참조하고 하단에 정의⟲ 심볼로 표시| 타입 | 심볼 | 설명 |
|---|---|---|
| start | ○ | 시작점 |
| end | ● | 종료점 |
| prompt | ◇ | 메시지 출력 |
| subAgent | ◈ | AI 서브에이전트 |
| askUserQuestion | ◆ | 사용자 질문 |
| ifElse | ◊ | 2방향 분기 |
| switch | ❖ | 다중 분기 |
| skill | ★ | 스킬 호출 |
| mcp | ⬡ | MCP 도구 호출 |
| subAgentFlow | ◎ | 중첩 워크플로우 |
├─[1] "선택지1", ├─[2] "선택지2", ...├─✓ "조건 충족", └─✗ "조건 미충족"├─"케이스1", ├─"케이스2", └─"기타" (default)여러 경로가 같은 노드로 합류하면:
→ [LABEL]로 참조├── [LABEL] 노드내용 → 다음노드 형태로 정의이전 노드로 돌아가는 연결이 있으면:
→ ○ start ⟲ 형태로 순환 표시[workflow-test v1.0.0] 9 nodes
○ start
│
├── ◇ prompt "워크플로우 테스트를 시작합니다"
│
├── ◆ ask "테스트 유형을 선택하세요"
│ │
│ ├─[1] "AI 분석 테스트"
│ │ └── ◈ subagent "프로젝트 구조 분석" → [A]
│ │
│ ├─[2] "조건 분기 테스트"
│ │ └── ◊ ifelse "분석 성공 여부"
│ │ ├─✓ "성공한 경우" → [A]
│ │ └─✗ "실패한 경우" → [B]
│ │
│ └─[3] "다중 분기 테스트"
│ └── ❖ switch "결과 유형 판단"
│ ├─"유형 A" → [A]
│ ├─"유형 B" → [A]
│ └─"기타" (default) → [B]
│
├── [A] ◇ prompt "테스트 성공!" → ● end
└── [B] ◇ prompt "테스트 실패..." → ● end
범례: ○start ●end ◇prompt ◆ask ◈subAgent ◊ifElse ❖switch ★skill ⬡mcp ◎flow
incomingCount = {} // 각 노드로 들어오는 연결 수
for connection in connections:
incomingCount[connection.to]++
mergePoints = nodes where incomingCount > 1
labels = {}
labelIndex = 'A'
for node in mergePoints:
if node.type != 'end':
labels[node.id] = labelIndex++
else:
labels[node.id] = 'end'
visited = {}
function traverse(nodeId, indent):
if visited[nodeId]:
return "→ [" + labels[nodeId] + "] ⟲"
visited[nodeId] = true
node = getNode(nodeId)
if labels[nodeId]:
// 합류점은 참조만 출력
return "→ [" + labels[nodeId] + "]"
output = formatNode(node)
if isBranchNode(node):
for branch in getBranches(node):
output += indent + formatBranch(branch)
output += traverse(branch.target, indent + "│ ")
else:
nextNode = getNextNode(nodeId)
if nextNode:
output += traverse(nextNode, indent)
return output
for label, nodeId in labels:
node = getNode(nodeId)
output += "├── [" + label + "] " + formatNode(node) + " → " + getNextPath(nodeId)