drawio
npx skills add https://github.com/markdown-viewer/skills --skill drawio
Agent 安装分布
Skill 文档
drawio Diagram Generator
Quick Start: Create <mxfile> with <diagram> â Define <mxGraphModel> with grid settings â Add <root> with cells â Use <mxCell> for shapes and edges â Set geometry with <mxGeometry> â Wrap in ```drawio fence.
Critical Rules
Structure Rules
- S1: Check Stencil Names ð¨ NEVER guess stencil names. Check stencils/README.md for EXACT names. Wrong:
mxgraph.cisco.routerâ Correct:mxgraph.cisco.routers.router - S2: Stencils Require fillColor Many stencils have no default color. Always add
fillColor/strokeColor. Exception: edge/link stencils are connectors, not devices. - S3: Root Cells Required Must include
<mxCell id="0"/>and<mxCell id="1" parent="0"/>or diagram won’t render. - S4: Labels Below Stencils Use
verticalLabelPosition=bottom;verticalAlign=top;labelPosition=center;align=center;for device labels. - S5: mxCell Must Be Siblings ALL mxCell elements must be siblings under
<root>â NEVER nest mxCell inside another mxCell. - S6: Container Transparency For container shapes, use
fillColor=none;to make background transparent and prevent covering child elements.
Preset Color Palette: Blue(#dae8fc,#6c8ebf) Green(#d5e8d4,#82b366) Orange(#ffe6cc,#d79b00) Red(#f8cecc,#b85450) Purple(#e1d5e7,#9673a6) Yellow(#fff2cc,#d6b656) Gray(#f5f5f5,#666666)
Layout Rules
- L1: Starting Margin Begin positioning from x=40, y=40.
- L2: Element Spacing Keep 40-60px gaps between connected shapes; 150-200px for routing channels.
- L3: Compact Layouts Use vertical stacking or grid layouts. Avoid spreading elements too far apart.
Edge Routing Rules â CRITICAL for Clean Diagrams
- E1: No Shared Paths Multiple edges between same nodes must use DIFFERENT exit/entry positions (
exitY=0.3andexitY=0.7, NOT both 0.5). - E2: Bidirectional Use Opposite Sides AâB:
exitX=1,entryX=0. BâA:exitX=0,entryX=1. - E3: Explicit Exit/Entry Points Every edge should specify:
exitX,exitY,entryX,entryYin style. - E4: Route Around Obstacles If any shape is between source and target, use waypoints. Add 20-30px clearance. NEVER let edges cross over shapes.
- E5: Plan Layout First Organize shapes into columns/rows. Trace each edge mentally: “What shapes are between source and target?”
- E6: Multiple Waypoints Use 2-3 waypoints for L-shaped or U-shaped paths. Each direction change needs a waypoint.
- E7: Natural Connection Points NEVER use corners (
entryX=1,entryY=1). Top-to-bottom:exitY=1,entryY=0. Left-to-right:exitX=1,entryX=0. - E8: Diagonal Routing Principle When connecting distant nodes diagonally, route along the PERIMETER (outside edge) of the diagram, NOT through the middle where other shapes exist.
Pre-Generation Checklist
- Do any edges cross over non-source/target shapes? â Add waypoints
- Do any two edges share the same path? â Adjust exit/entry points
- Are any connections at corners? â Use edge centers instead
- Could rearranging shapes reduce crossings? â Revise layout
Multi-Phase Generation Workflow
Complex diagrams should be generated in ordered phases. Output each phase as a separate chunk to keep XML manageable and reduce errors.
- P1: Plan Identify diagram type: topology (has edges) or spatial (layout-only, e.g. floor plans). Choose canvas size, select stencil library from stencils/README.md. Plan element positions first, then derive zone boundaries from the element layout â you can’t size a zone without knowing what’s inside it.
- P2: Zones (XML output order) Although zones are planned after elements (P1), they must be written first in XML â drawio renders by document order, so earlier cells sit behind later ones. Solid fill:
rounded=1;fillColor=#BAC8D3;strokeColor=none;opacity=60. Dashed border:rounded=1;dashed=1;dashPattern=8 8;fillColor=none;strokeColor=#0BA5C4. Use separatetextcells for zone labels. Bus bars (if needed):shape=line;strokeColor=#23445D. - P3: Elements Position shapes on grid (multiples of 10/20). Keep 40-60px spacing within groups, 150-200px routing channels between groups. Consistent device style per stencil family (e.g. Cisco:
fillColor=#036897;strokeColor=#ffffff;strokeWidth=2). - P4: Connections Skip for spatial diagrams (floor plans, wireframes) â they use proximity, not edges. For topology diagrams, add edges last. Network links:
endArrow=none;endFill=0. Data flow:endArrow=classic. Dashed for logical/VPN:dashed=1. Trace each edge mentally to avoid crossing shapes. - P5: Labels Add floating text, legends, dimension lines. For spatial diagrams labels carry more semantic weight. Verify every element has a
valueor adjacent label cell. - P6: Chunking When a diagram exceeds ~30 elements, split XML output: Chunk 1 = header + zones + first element group, Chunk 2 = remaining elements, Chunk 3 = all edges + closing tags.
Common Shapes
Basic Shapes
<mxfile><diagram name="Basic Shapes" id="basic-shapes"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="rect" value="Box" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="20" y="20" width="100" height="50" as="geometry"/></mxCell>
<mxCell id="rounded" value="Rounded" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="140" y="20" width="100" height="50" as="geometry"/></mxCell>
<mxCell id="circle" value="Circle" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="260" y="10" width="70" height="70" as="geometry"/></mxCell>
<mxCell id="diamond" value="Decision" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="350" y="10" width="70" height="70" as="geometry"/></mxCell>
<mxCell id="db" value="Database" style="shape=cylinder;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="440" y="5" width="60" height="80" as="geometry"/></mxCell>
<mxCell id="cloud" value="Cloud" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="520" y="10" width="100" height="70" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
Container/Swimlane
<mxfile><diagram name="Container Example" id="container-ex"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="container" value="Container" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="40" y="40" width="200" height="150" as="geometry"/>
</mxCell>
<mxCell id="zone" value="Zone Name" style="whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;verticalAlign=top;fontSize=14;" vertex="1" parent="1"><mxGeometry x="280" y="40" width="200" height="150" as="geometry"/>
</mxCell>
</root></mxGraphModel></diagram></mxfile>
Swimlane with Child Elements (Relative Positioning)
<mxfile><diagram name="Swimlane" id="swimlane-ex"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="lane1" value="Frontend" style="swimlane;" vertex="1" parent="1"><mxGeometry x="40" y="40" width="200" height="200" as="geometry"/></mxCell>
<mxCell id="step1" value="Step 1" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="lane1"><mxGeometry x="20" y="60" width="160" height="40" as="geometry"/></mxCell>
<mxCell id="lane2" value="Backend" style="swimlane;" vertex="1" parent="1"><mxGeometry x="280" y="40" width="200" height="200" as="geometry"/></mxCell>
<mxCell id="step2" value="Step 2" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="lane2"><mxGeometry x="20" y="60" width="160" height="40" as="geometry"/></mxCell>
<mxCell id="edge1" style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;html=1;" edge="1" parent="1" source="step1" target="step2"><mxGeometry relative="1" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
Note: Child elements (step1, step2) use parent="lane1" / parent="lane2" with coordinates RELATIVE to the swimlane. Edges always use parent="1" (main canvas).
Stencil Libraries
drawio provides 8900+ pre-built stencils across 48 categories for professional diagrams. Full stencil reference: See stencils/README.md.
| Category | Examples | Use Case |
|---|---|---|
| Cloud | aws4, azure, gcp2, alibaba_cloud, ibm_cloud |
Cloud architecture diagrams |
| Network | cisco, cisco19, cisco_safe, networks, networks2 |
Network topology |
| Virtualization | citrix, citrix2, veeam, vvd, kubernetes |
Infrastructure diagrams |
| Software | bpmn, flowchart, sitemap, mockup |
Process & UI design |
| Hardware | rack, cabinets, electrical |
Data center & electrical |
| Office | office, atlassian, salesforce |
Business diagrams |
<mxfile><diagram name="Stencil Example" id="stencil-ex"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="router" value="" style="shape=mxgraph.cisco.routers.router;html=1;fillColor=#036897;strokeColor=#ffffff;strokeWidth=2;" vertex="1" parent="1"><mxGeometry x="100" y="100" width="78" height="53" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
Common Style Reference
- Arrow Types: Inheritance(
endArrow=block;endFill=0) Implementation(endArrow=block;endFill=0;dashed=1) Association(endArrow=open;endFill=1) Dependency(endArrow=open;dashed=1) Aggregation(startArrow=diamondThin;startFill=0) Composition(startArrow=diamondThin;startFill=1) - Visibility Symbols:
+(public)#(protected)-(private)~(package)/(derived) - State Colors: Pending(
#dae8fc,#6c8ebf) Success(#d5e8d4,#82b366) Error(#f8cecc,#b85450) Warning(#fff2cc,#d6b656) Complete(#e1d5e7,#9673a6) - Shape Styles:
rounded(0,1)fillColor(hex)strokeColor(hex)strokeWidth(num)dashed(0,1)opacity(0-100)fontColor(hex)fontSize(num)fontStyle(0=normal,1=bold,2=italic,3=both)align(left,center,right)verticalAlign(top,middle,bottom) - Edge Styles:
edgeStyle(orthogonalEdgeStyle,entityRelationEdgeStyle,elbowEdgeStyle)curved(0,1)endArrow/startArrow(classic,block,open,oval,diamond,none)endFill/startFill(0=hollow,1=filled)
Edge Examples
Basic Edge
<mxfile><diagram name="Edge Examples" id="edge-examples"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="a1" value="A" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="20" y="20" width="60" height="30" as="geometry"/></mxCell>
<mxCell id="b1" value="B" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="140" y="20" width="60" height="30" as="geometry"/></mxCell>
<mxCell style="endArrow=classic;html=1;" edge="1" parent="1" source="a1" target="b1"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="a2" value="C" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="20" y="80" width="60" height="30" as="geometry"/></mxCell>
<mxCell id="b2" value="D" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="140" y="80" width="60" height="30" as="geometry"/></mxCell>
<mxCell style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;dashed=1;html=1;" edge="1" parent="1" source="a2" target="b2"><mxGeometry relative="1" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
Two Edges Between Same Nodes (No Overlap)
<mxfile><diagram name="Bidirectional" id="bidir"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="nodeA" value="A" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="40" y="60" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="nodeB" value="B" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="200" y="60" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="e1" value="Request" style="edgeStyle=orthogonalEdgeStyle;exitX=1;exitY=0.3;entryX=0;entryY=0.3;endArrow=classic;html=1;" edge="1" parent="1" source="nodeA" target="nodeB"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell id="e2" value="Response" style="edgeStyle=orthogonalEdgeStyle;exitX=0;exitY=0.7;entryX=1;entryY=0.7;endArrow=classic;html=1;" edge="1" parent="1" source="nodeB" target="nodeA"><mxGeometry relative="1" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
Edge with Waypoints (Routing Around Obstacle)
<mxfile><diagram name="Waypoints" id="waypoints"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="src" value="Source" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="40" y="40" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="obstacle" value="Obstacle" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;" vertex="1" parent="1"><mxGeometry x="160" y="100" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="tgt" value="Target" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="280" y="160" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="edge1" style="edgeStyle=orthogonalEdgeStyle;exitX=1;exitY=0.5;entryX=0.5;entryY=0;endArrow=classic;html=1;" edge="1" parent="1" source="src" target="tgt">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="320" y="60"/>
</Array>
</mxGeometry>
</mxCell>
</root></mxGraphModel></diagram></mxfile>
Diagonal Routing (Perimeter Pattern)
When connecting distant nodes diagonally with obstacles in between, route along the OUTSIDE perimeter:
<mxfile><diagram name="Perimeter" id="perimeter"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="main" value="Main" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="200" y="40" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="develop" value="Develop" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="200" y="120" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="hotfix" value="Hotfix" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="350" y="200" width="80" height="40" as="geometry"/></mxCell>
<mxCell id="hotfix_to_main" style="edgeStyle=orthogonalEdgeStyle;exitX=0.5;exitY=0;entryX=1;entryY=0.5;endArrow=classic;html=1;" edge="1" parent="1" source="hotfix" target="main">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="390" y="60"/>
</Array>
</mxGeometry>
</mxCell>
</root></mxGraphModel></diagram></mxfile>
Key: Route goes RIGHT (x=390) then UP, avoiding the Develop node in the middle.
Complete Example: Simple Architecture
<mxfile><diagram name="Architecture" id="arch-1"><mxGraphModel dx="800" dy="600" grid="1" gridSize="10"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="client" value="Client" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"><mxGeometry x="40" y="100" width="100" height="50" as="geometry"/></mxCell>
<mxCell id="server" value="Server" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"><mxGeometry x="240" y="100" width="100" height="50" as="geometry"/></mxCell>
<mxCell id="db" value="Database" style="shape=cylinder;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1"><mxGeometry x="440" y="85" width="80" height="80" as="geometry"/></mxCell>
<mxCell style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=classic;" edge="1" parent="1" source="client" target="server"><mxGeometry relative="1" as="geometry"/></mxCell>
<mxCell style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=classic;" edge="1" parent="1" source="server" target="db"><mxGeometry relative="1" as="geometry"/></mxCell>
</root></mxGraphModel></diagram</mxfile>
Common Pitfalls
| Issue | Solution |
|---|---|
| Shape not visible | Verify vertex="1" and parent="1" attributes |
| Edge not connecting | Ensure source and target match cell IDs |
| Styles not applying | Check semicolon separators in style string |
| Text not showing | Add html=1;whiteSpace=wrap; to style |
| Edges crossing shapes | Use waypoints to route around obstacles |
| Multiple edges overlapping | Use different exitY/entryY values (0.3 and 0.7) |
| Corner connections look ugly | Use edge centers instead (exitX=1,exitY=0.5) |
| Diagram too spread out | Keep within x: 0-800, y: 0-600 viewport |
| XML comments break editing | NEVER include <!-- ... --> in generated XML |
Tips for AI Generation
- Plan layout first: Sketch positions mentally before writing XML â identify potential edge crossings
- Use grid alignment: Position shapes at multiples of 10 or 20
- Unique IDs: Use descriptive IDs like
client,server,dbinstead of random strings - Consistent spacing: Keep 40-60px gaps between connected shapes; 150-200px for routing channels
- Layer backgrounds first: Define zone/container cells before shapes inside them
- Color zones: Use light background colors with
strokeColor=nonefor region highlighting - Verify edges mentally: Before generating, trace each edge and ask “Does this cross any shape?”
- Escape special characters: Use
<for <,>for >,&for &,"for “