Diagrams Default Active v1.1.0
SVG 다이어그램, Mermaid 차트, 인터랙티브 시각화 — 채팅 UI에 인라인으로 렌더링됩니다. 아키텍처 개요부터 인터랙티브 데이터 대시보드까지, 이 스킬은 모든 시각적 요청을 대화 내에서 직접 렌더링된 결과물로 변환합니다.
| 스킬 이름 | diagram |
| 버전 | 1.1.0 |
| 기본 활성화 | 예 — 항상 주입되므로 /skill load가 필요 없습니다 |
| 출력 형식 | 인라인 SVG, Mermaid 코드 블록, diagram-html 위젯 |
| 트리거 | 시각적 설명이 필요한 모든 요청: 순서도, 비교, 타임라인, 차트, 지도, 시뮬레이션, 목업 |
| 참조 모듈 | svg-components, color-palette, module-chart, module-widget, module-interactive, module-map, module-mockup, module-art |
디자인 원칙
이 스킬이 생성하는 모든 다이어그램은 네 가지 핵심 원칙을 따릅니다:
- 플랫 — 그라데이션, 그림자, 블러, 글로우 또는 장식 효과 없음. 깔끔한 플랫 표면만 사용합니다.
- 컴팩트 — 핵심만 인라인으로 표시합니다. 나머지는 응답 텍스트로 설명합니다.
- 테마 인식 — 모든 색상이 라이트/다크 모드 모두에서 작동합니다. SVG에는 CSS 클래스, canvas/JS에는
window.__jawTokens를 사용합니다. - 텍스트는 응답에, 비주얼은 도구에 — 모든 설명 텍스트는 다이어그램 외부에 배치합니다. SVG나 위젯 HTML 내부에 설명 문단을 넣지 마세요.
복잡도 제한
시각적 노이즈를 방지하기 위해 모든 다이어그램에 적용되는 엄격한 제한:
| 제약 조건 | 제한값 | 초과 시 전략 |
|---|---|---|
| 박스 부제목 | 최대 5단어 | 세부 내용은 sendPrompt() 또는 텍스트로 이동 |
| 다이어그램당 색상 램프 | 최대 2개 | 카테고리 통합 |
| 가로 행 (680px) | 최대 4개 박스 | 축소하거나 2행으로 줄바꿈 |
| 다이어그램당 노드 | 최대 6개 | 개요 + 상세 다이어그램으로 분할 |
| 연속 비주얼 블록 | 불가 | SVG/위젯 블록 사이에 항상 텍스트 추가 |
다이어그램 유형 선택
이 스킬은 명사가 아닌 동사에 따라 분기합니다. 같은 주제라도 사용자의 요청에 따라 다른 다이어그램 유형이 생성될 수 있습니다. Mermaid 네이티브 구문으로 깔끔하게 표현 가능한 유형은 직접 작성한 SVG보다 Mermaid가 우선됩니다.
SVG 유형
| 사용자 의도 | 유형 | 출력 |
|---|---|---|
| "X가 어떻게 작동하나요" | 설명적 SVG | 공간적 비유, 단면도, 물리적 레이아웃 |
| "X의 아키텍처" (시스템 컨텍스트) | 구조적 SVG | 컨테이너, 영역, 중첩 |
| "X의 단계" (일반 프로세스) | 순서도 SVG 또는 Mermaid flowchart | 위에서 아래로 박스 + 화살표 |
| "A vs B 비교" | 비교 SVG | 나란히 배치된 열 |
Mermaid 유형
| 사용자 의도 | Mermaid 구문 | 상태 |
|---|---|---|
| DB 스키마 / 엔티티 관계 | erDiagram | 안정 |
| 클래스 다이어그램 / OOP 구조 | classDiagram | 안정 |
| 상태 머신 / 생명주기 | stateDiagram-v2 | 안정 |
| 시퀀스 / 호출 순서 / API 흐름 | sequenceDiagram | 안정 |
| 타임라인 / 로드맵 / 히스토리 | timeline | 안정 |
| 마인드맵 / 브레인스토밍 | mindmap | 안정 |
| Git 브랜칭 / 릴리스 히스토리 | gitGraph | 안정 |
| 우선순위 사분면 / 2x2 매트릭스 | quadrantChart | 안정 |
| 간트 / 프로젝트 일정 | gantt | 안정 |
| 사용자 여정 맵 | journey | 안정 |
| 파이 차트 분석 | pie | 안정 |
| 레이더 / 스파이더 / 스킬 프로필 | radar-beta | 베타 (v11.6+) |
| 칸반 보드 | kanban | 베타 (v11.12+) |
| 클라우드 / 인프라 아키텍처 | architecture-beta | 베타 |
| 계층 구조 / 비례 크기 | treemap-beta | 베타 |
| 자유 형식 블록 레이아웃 | block-beta | 베타 |
인터랙티브 HTML 위젯 유형
| 사용자 의도 | 출력 | 라이브러리 |
|---|---|---|
| "데이터 / 차트 보여줘" | diagram-html 위젯 | Chart.js, D3, ECharts |
| "시뮬레이션 / 인터랙티브" | diagram-html 위젯 | Matter.js, Canvas, 슬라이더 |
| "인터랙티브 지도" | diagram-html 위젯 | Leaflet + OpenStreetMap |
| "정적 단계구분도" | diagram-html 위젯 | D3 + TopoJSON |
classDiagram/sequenceDiagram/stateDiagram이 이미 존재하는 경우 SVG를 직접 작성하지 않습니다.Mermaid 주의사항
Mermaid 다이어그램 유형 작업 시 중요한 주의사항:
C4Context, C4Container 등) — 다크 모드에서 테마 토큰이 적용되지 않아 텍스트를 읽을 수 없게 됩니다. 아래 대체 표를 사용하세요.| C4 유형 | 대체 |
|---|---|
| C4 System Context | 구조적 SVG (커스텀) 또는 subgraph가 있는 Mermaid flowchart |
| C4 Container | Mermaid architecture-beta |
| C4 Component | subgraph 그룹화가 있는 Mermaid flowchart |
| C4 Dynamic | Mermaid sequenceDiagram |
| C4 Deployment | Mermaid architecture-beta |
추가 참고사항:
sankey-beta/xychart-beta는 좁은 채팅 너비에서 깨집니다. Sankey 차트는diagram-html+ ECharts를, XY 차트는 Chart.js를 권장합니다.radar-beta는-beta접미사가 필요합니다 (Mermaid v11.6+). 기타 베타 유형:treemap-beta,block-beta,architecture-beta,packet-beta,kanban.- 모든 안정 Mermaid 유형은 호스트의 다크/라이트 테마를 자동으로 상속합니다. 의미적 이유로 재정의하는 경우가 아니라면
%%{init: ...}%%에서 명시적 색상을 설정하지 마세요.
출력 형식
1. 인라인 SVG (정적 다이어그램)
응답에 직접 출력되는 원시 <svg> 마크업입니다. 채팅 UI가 인라인으로 렌더링합니다.
<svg viewBox="0 0 680 {height}" xmlns="http://www.w3.org/2000/svg"
role="img" aria-labelledby="title-id desc-id">
<title id="title-id">Diagram Title</title>
<desc id="desc-id">Brief description for screen readers</desc>
<!-- shapes, text, paths -->
</svg>
인라인 SVG 규칙
- viewBox 너비는 반드시 680이어야 합니다 (컨테이너 너비와 일치 — 절대 변경하지 마세요)
- 높이는 콘텐츠에 따라 달라짐: 마지막 요소 하단 + 40px 패딩
- 모든 SVG에
role="img"+<title>+<desc>가 반드시 있어야 합니다 - 디자인 시스템의 CSS 클래스 사용 (
.node,.connector,.label,.label-start) .label은text-anchor: middle을 강제합니다 (중앙 정렬만 가능); 왼쪽 정렬 텍스트에는.label-start사용- 색상: 인라인
fill/stroke가 아닌 CSS 클래스 사용 - 폰트 패밀리는 호스트에서 상속 — 명시적 폰트를 설정하지 마세요
2. Mermaid (구조화된 다이어그램)
표준 ```mermaid 코드 블록입니다. 기존 렌더러가 자동으로 처리합니다.
```mermaid
sequenceDiagram
participant A as Client
participant B as Server
A->>B: GET /api/data
B-->>A: 200 OK (JSON)
```
3. 인터랙티브 HTML 위젯 (차트, 컨트롤, 시뮬레이션)
```diagram-html 코드 블록으로 래핑됩니다. 호스트가 생성하는 샌드박스 iframe 내부에서 렌더링됩니다.
```diagram-html
<div id="chart-wrapper" style="position: relative; width: 100%; height: 300px;">
<canvas id="myChart" role="img" aria-label="Chart description">
Fallback text
</canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"
onerror="document.body.innerHTML='<p>Chart library failed to load.</p>'">
</script>
<script>
const isDark = window.__jawTheme?.isDark ?? true;
// ... Chart.js code
</script>
```
diagram-html 위젯의 경우 항상 <style>과 <link> 태그를 먼저 배치하고, 그 다음 HTML 구조, 마지막으로 <script> 태그를 배치하세요. 이렇게 하면 스트리밍 중 스크립트가 실행되기 전에 시각적 콘텐츠가 먼저 표시됩니다.전달 메커니즘
세 가지 형식 모두 — 인라인 SVG, ```mermaid, ```diagram-html — 채팅 응답에 인라인으로 렌더링됩니다. jaw 프론트엔드가 응답 텍스트를 파싱하여 자동으로 마운트합니다. diagram-html은 호스트가 생성하는 샌드박스 <iframe>에 들어갑니다; 스킬이 iframe을 직접 생성하지 않습니다.
.svg / .html / .png 파일로 저장 (Write 도구, cat >, fs.writeFile)
원시 블록을 응답 텍스트에 직접 붙여넣기
diagram-html을 <iframe> / <html> / <body> / <head>로 래핑
<div> / <canvas> / <style>로 시작 — 호스트가 셸을 주입합니다
/api/channel/send 또는 Telegram/Discord로 전송 (첨부 파일이 아닙니다)
렌더러가 처리하도록 합니다; 다이어그램은 응답 텍스트입니다
외부 이미지 URL을 참조하고 그것을 다이어그램이라고 부르기
SVG/위젯 코드 자체를 출력
SVG 디자인 시스템
디자인 금지 목록
모든 SVG 출력에 적용되는 품질 규칙 (아래 보안 제한 사항과 별도):
- 그라데이션, 드롭 섀도우, 블러, 글로우 또는 네온 효과 금지
- 이모지 금지 — CSS 도형 또는 SVG 경로 사용
- 장식적 단계 번호 또는 과도하게 큰 제목 금지
- 순서도 박스 내부에 아이콘 또는 일러스트레이션 금지 — 텍스트만 허용
- 회전된 텍스트 금지
- 외부 컨테이너에 어두운/색상 배경 금지 (투명만 허용 — 호스트가 배경을 제공)
- 선 두께: 테두리와 모서리에 0.5px (1px나 2px가 아님)
- 폰트 두께: 400 (보통)과 500 (볼드)만 허용 — 600이나 700은 절대 사용 금지
- 폰트 크기: 14px (노드 라벨)와 12px (부제목/화살표 라벨)만 허용
- 소문자 시작 항상 — Title Case나 ALL CAPS 금지
보안 제한 사항 (인라인 SVG)
다음 요소와 속성은 DOMPurify에 의해 제거됩니다. 인라인 <svg>에서 절대 사용하지 마세요:
| 금지된 요소 / 속성 | 이유 | 대안 |
|---|---|---|
<foreignObject> | SVG에 HTML 삽입 (XSS 벡터) | 네이티브 SVG 요소 사용 |
<animate>, <set>, <animateTransform>, <animateMotion> | 애니메이션 XSS 벡터 | 정적 SVG만 허용 |
중첩된 <svg> | 파싱 문제 | <g> 그룹 사용 |
xlink:href | 외부 URL 삽입 | <use>에서 href="#fragment"만 사용 |
모든 on* 이벤트 핸들러 | DOMPurify에 의해 제거됨 | 인라인 SVG에서 사용 불가 |
diagram-html 콘텐츠는 샌드박스 iframe 내부에서 실행되므로 <script>, on* 핸들러, CDN 임포트가 허용됩니다. 위 제한 사항은 메인 문서에서 렌더링되는 인라인 SVG에만 적용됩니다.색상 램프 (9가지 시맨틱 색상)
각 램프에는 3가지 쉐이드가 있습니다: fill (배경), stroke (테두리), text (라벨). 인라인 색상이 아닌 항상 CSS 클래스 이름을 사용하세요.
| 램프 | CSS 접두사 | 권장 용도 |
|---|---|---|
| Cyan | .c-cyan | 일반 카테고리 (중립 정보에 권장) |
| Pink | .c-pink | 일반 카테고리, 강조 |
| Purple | .c-purple | 일반 카테고리, 그룹화 |
| Orange | .c-orange | 일반 카테고리, 악센트 |
| Slate | .c-slate | 중립, 비활성, 구조적 (시작/종료 노드) |
| Blue | .c-blue | 정보성 (시맨틱 — "정보"에만 사용) |
| Green | .c-green | 성공, 긍정 (시맨틱) |
| Amber | .c-amber | 경고, 주의 (시맨틱) |
| Red | .c-red | 오류, 부정 (시맨틱) |
레이아웃 패턴
| 패턴 | 레이아웃 | 크기 |
|---|---|---|
| 순서도 | 위에서 아래로 | 680 x auto |
| 비교 | 나란히 배치된 열 | 680 x auto |
| 타임라인 | 수평 마커 배치 | 680 x auto |
| 조직도 | 계층적 트리 | 680 x auto |
테마 통합
CSS 변수 매핑
cli-jaw 호스트는 다이어그램 테마를 위해 다음 CSS 변수를 제공합니다:
| 변수 | 용도 |
|---|---|
--bg | 페이지 배경 |
--surface | 카드/서피스 배경 |
--text | 기본 텍스트 |
--text-dim | 흐린/보조 텍스트 |
--border | 기본 테두리 |
--accent | 악센트 색상 |
--font-ui | UI 폰트 패밀리 |
--font-mono | 코드 폰트 패밀리 |
--radius-md | 8px 테두리 반경 |
--radius-lg | 12px 테두리 반경 |
형식별 테마 감지
| 형식 | 테마 방법 |
|---|---|
| 인라인 SVG | CSS 클래스가 호스트 테마에 자동으로 적응 |
diagram-html iframe (JS) | window.__jawTheme.isDark (boolean) |
diagram-html iframe (CSS 값) | window.__jawTokens['--bg'], ['--text'] 등 |
| Mermaid | cli-jaw themeVariables를 통해 자동 적용 |
matchMedia('prefers-color-scheme')을 사용하지 마세요. 테마는 OS 설정이 아닌 호스트가 제어합니다.참조 모듈
다이어그램 스킬은 특수 다이어그램 유형을 위한 추가 참조 파일을 로드합니다. 이 파일들은 상세한 패턴, 라이브러리 통합 가이드, 템플릿을 제공합니다:
| 모듈 | 파일 | 다루는 내용 |
|---|---|---|
| SVG 컴포넌트 | reference/svg-components.md | SVG 프리미티브, viewBox 체크리스트, 레이아웃 템플릿 |
| 색상 팔레트 | reference/color-palette.md | 전체 색상 값 (라이트 + 다크), 할당 규칙 |
| 차트 | reference/module-chart.md | Chart.js + D3 + ECharts 6 — 바, 라인, 파이, 단계구분도, 히트맵, 생키, 레이더, 트리맵, 게이지, 퍼널, 캔들스틱, 코드 |
| 위젯 | reference/module-widget.md | 물리 (Matter.js), 수학 그래프 (Math.js), 3D (Three.js), 크리에이티브 코딩 (p5.js), 오디오 (Tone.js), 미니게임 |
| 인터랙티브 | reference/module-interactive.md | 슬라이더, 셀렉트, 세그먼트 버튼, 토글, 재생/일시정지/리셋, 디바운싱, sendPrompt, 키보드 접근성 |
| 지도 | reference/module-map.md | Leaflet 인터랙티브 지도 — OpenStreetMap 타일, 마커, 팝업, 다크 모드 |
| UI 목업 | reference/module-mockup.md | UI 목업 패턴 |
| 아트 | reference/module-art.md | 장식적 SVG 패턴 |
사용 예시
"마이크로서비스 아키텍처 그려줄" # 트리거: 구조적 SVG — 컨테이너, 영역, 중첩
# 스킬이 서비스 박스, 화살표, 그룹 영역이 포함된 인라인 SVG를 생성합니다.
# Mermaid C4 미사용 (다크 모드 문제) — 대신 커스텀 구조적 SVG를 사용합니다.
"이 DB 스키마 ER 다이어그램으로 보여주" # 트리거: Mermaid erDiagram
# erDiagram 구문이 포함된 ```mermaid 블록을 출력합니다.
# 테마가 자동으로 적응합니다 — 수동 색상 설정이 필요 없습니다.
"월별 매출 데이터 차트로 그려주" # 트리거: diagram-html + Chart.js
# Chart.js 바/라인 차트가 포함된 ```diagram-html 블록을 생성합니다.
# 다크 모드 색상에 window.__jawTheme.isDark를 사용합니다.
"로그인 API 흐름 시켐스 다이어그램으로 그려주" # 트리거: Mermaid sequenceDiagram
# Client → Auth Server → API → DB — 전체 요청/응답 흐름.
# sequenceDiagram이 이를 네이티브로 지원하므로 SVG 대신 Mermaid를 선택합니다.
"React vs Vue vs Svelte 비교해주" # 트리거: 비교 SVG (나란히 배치된 열)
# 3개 열, 주요 속성이 시각적으로 비교된 인라인 SVG를 생성합니다.
# 최대 2개 색상 램프 — 하나는 카테고리 헤더, 하나는 강조용.
빠른 참조
올바른 출력 형식을 선택하기 위한 의사결정 트리:
| 질문 | 답변 | 형식 |
|---|---|---|
| Mermaid에 이를 위한 네이티브 구문이 있나요? | 예 | ```mermaid 사용 |
| 정적 레이아웃/아키텍처/비교인가요? | 예 | 인라인 <svg> 사용 |
| 인터랙티브, 데이터 시각화, 또는 JS 라이브러리가 필요한가요? | 예 | ```diagram-html 사용 |
| C4 다이어그램인가요? | 예 | 위의 C4 매핑 표에 따라 대체 |
| "X가 어떻게 작동하나요" 질문인가요? | 예 | 설명적 SVG (순서도가 아님) |