From tech-graph
Use when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG. Trigger on: "画图" "帮我画" "生成图" "做个图" "架构图" "流程图" "可视化一下" "出图" "generate diagram" "draw diagram" "visualize" or any system/flow description the user wants illustrated.
npx claudepluginhub baoduy/agents-and-skills --plugin tech-graphThis skill uses the workspace's default tool permissions.
Generate production-quality SVG technical diagrams exported as PNG via `cairosvg` (recommended), `rsvg-convert`, or `puppeteer`.
LICENSEREADME.mdREADME.zh.mdagentloop-core.svgagents/openai.yamlassets/samples/sample-style1-flat.pngassets/samples/sample-style2-dark.pngassets/samples/sample-style3-blueprint.pngassets/samples/sample-style4-notion.pngassets/samples/sample-style5-glass.pngassets/samples/sample-style6-claude.pngassets/samples/sample-style7-openai.pngfixtures/agent-memory-types-style4.jsonfixtures/api-flow-style7.jsonfixtures/mem0-style1.jsonfixtures/microservices-style3.jsonfixtures/multi-agent-style5.jsonfixtures/system-architecture-style6.jsonfixtures/tool-call-style2.jsonpackage.jsonGuides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Processes PDFs: extracts text/tables/images, merges/splits/rotates pages, adds watermarks, creates/fills forms, encrypts/decrypts, OCRs scans. Activates on PDF mentions or output requests.
Share bugs, ideas, or general feedback.
Generate production-quality SVG technical diagrams exported as PNG via cairosvg (recommended), rsvg-convert, or puppeteer.
Install this skill from GitHub:
npx skills add yizhiyanhua-ai/fireworks-tech-graph
Public package page:
https://www.npmjs.com/package/@yizhiyanhua-ai/fireworks-tech-graph
Do not pass @yizhiyanhua-ai/fireworks-tech-graph directly to skills add, because the CLI expects a GitHub or local repository source.
Update command:
npx skills add yizhiyanhua-ai/fireworks-tech-graph --force -g -y
Four helper scripts in scripts/ directory provide stable SVG generation and validation:
generate-diagram.sh - Validate SVG + export PNG./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svg
./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svggenerate-from-template.py - Create starter SVG from templatepython3 ./scripts/generate-from-template.py architecture ./output/arch.svg '{"title":"My Diagram","nodes":[],"arrows":[]}'
validate-svg.sh - Validate SVG syntax./scripts/validate-svg.sh <svg-file>
test-all-styles.sh - Batch test all styles./scripts/test-all-styles.sh
When to use scripts:
When to generate SVG directly:
references/style-1-flat-icon.md unless user specifies another; load the matching references/style-N.md for exact color tokens and SVG patternsreferences/icons.md for known productspython3 -c "import xml.etree.ElementTree as ET; ET.parse('file.svg')" to check XML syntaxcairosvg (recommended). See SVG → PNG Conversion section below for full method comparisonNodes = services/components. Group into horizontal layers (top→bottom or left→right).
<rect> dashed containers to group related services in the same layer0 0 960 600 standard, 0 0 960 800 for tall stacksEmphasizes what data moves where. Focus on data transformation.
stroke-width: 2.5) for primary data pathsSequential decision/process steps.
Shows how an AI agent reasons, uses tools, and manages memory. Key conceptual layers to always consider:
Specialized agent diagram focused on memory operations.
store(), retrieve(), forget(), consolidate()Time-ordered message exchanges between participants.
<rect> loop/alt frames with label in top-left cornerSide-by-side comparison of approaches, systems, or components.
#dcfce7) + ✓ checkmark; unsupported: #f9fafb fill#f9fafb / #ffffff) for readabilityHorizontal time axis showing durations, phases, and milestones.
0 0 960 400 typical; wider for many time periods: 0 0 1200 400Radial layout from central concept.
cx=480, cy=280<path> with cubic bezier for branches, not straight linesStatic structure showing classes, attributes, methods, and relationships.
+ public, - private, # protected)<<interface>> stereotype above name, or circle/lollipop notation<<enumeration>> stereotype, values in bottom0 0 960 600 standard; 0 0 960 800 for deep hierarchiesSystem functionality from user perspective.
<<include>> from base to included use case<<extend>> from extension to base use case0 0 960 600 standardLifecycle states and transitions of an entity.
entry/ action, exit/ action, do/ activity[condition]event [guard] / action
/0 0 960 600 standardDatabase schema and data relationships.
1, N, 0..1, 0..*, 1..*0 0 960 600 standard; wider 0 0 1200 600 for many entitiesPhysical or logical network infrastructure.
0 0 960 600 standardFull mapping of UML 14 diagram types to supported diagram types:
| UML Diagram | Supported As | Notes |
|---|---|---|
| Class | Class Diagram | Full UML notation |
| Component | Architecture Diagram | Use colored fills per component type |
| Deployment | Architecture Diagram | Add node/instance labels |
| Package | Architecture Diagram | Use dashed grouping containers |
| Composite Structure | Architecture Diagram | Nested rects within components |
| Object | Class Diagram | Instance boxes with underlined name |
| Use Case | Use Case Diagram | Full actor/ellipse/relationship |
| Activity | Flowchart / Process Flow | Add fork/join bars |
| State Machine | State Machine Diagram | Full UML notation |
| Sequence | Sequence Diagram | Add alt/opt/loop frames |
| Communication | — | Approximate with Sequence (swap axes) |
| Timing | Timeline | Adapt time axis |
| Interaction Overview | Flowchart | Combine activity + sequence fragments |
| ER Diagram | ER Diagram | Chen/Crow's foot notation |
Map semantic concepts to consistent shapes across all diagram types:
| Concept | Shape | Notes |
|---|---|---|
| User / Human | Circle + body path | Stick figure or avatar |
| LLM / Model | Rounded rect with brain/spark icon or gradient fill | Use accent color |
| Agent / Orchestrator | Hexagon or rounded rect with double border | Signals "active controller" |
| Memory (short-term) | Rounded rect, dashed border | Ephemeral = dashed |
| Memory (long-term) | Cylinder (database shape) | Persistent = solid cylinder |
| Vector Store | Cylinder with grid lines inside | Add 3 horizontal lines |
| Graph DB | Circle cluster (3 overlapping circles) | |
| Tool / Function | Gear-like rect or rect with wrench icon | |
| API / Gateway | Hexagon (single border) | |
| Queue / Stream | Horizontal tube (pipe shape) | |
| File / Document | Folded-corner rect | |
| Browser / UI | Rect with 3-dot titlebar | |
| Decision | Diamond | Flowcharts only |
| Process / Step | Rounded rect | Standard box |
| External Service | Rect with cloud icon or dashed border | |
| Data / Artifact | Parallelogram | I/O in flowcharts |
Always assign arrow meaning, not just color:
| Flow Type | Color | Stroke | Dash | Meaning |
|---|---|---|---|---|
| Primary data flow | blue #2563eb | 2px solid | none | Main request/response path |
| Control / trigger | orange #ea580c | 1.5px solid | none | One system triggering another |
| Memory read | green #059669 | 1.5px solid | none | Retrieval from store |
| Memory write | green #059669 | 1.5px | 5,3 | Write/store operation |
| Async / event | gray #6b7280 | 1.5px | 4,2 | Non-blocking, event-driven |
| Embedding / transform | purple #7c3aed | 1px solid | none | Data transformation |
| Feedback / loop | purple #7c3aed | 1.5px curved | none | Iterative reasoning loop |
Always include a legend when 2+ arrow types are used.
Spacing:
Arrow Labels (CRITICAL):
<rect fill="canvas_bg" opacity="0.95"/> with 4px horizontal, 2px vertical paddingArrow Routing:
Line Overlap Prevention (CRITICAL - most common bug on Codex): When two arrows must cross each other, ALWAYS use jump-over arcs to prevent visual overlap:
Validation Checklist (run before finalizing):
text.length × 7px ≤ shape_width - 16px)0 0 960 600 default; 0 0 960 800 tall; 0 0 1200 600 wide<style>font-family: ...</style> — no external @import (cairosvg / rsvg-convert cannot fetch external URLs)<defs>: arrow markers, gradients, filters, clip paths<marker> with markerEnd, sized markerWidth="10" markerHeight="7"<feDropShadow> in <filter>, apply sparingly (key nodes only)M x1,y1 C cx1,cy1 cx2,cy2 x2,y2 cubic bezier for loops/feedback arrows<clipPath> if text might overflow a node boxMANDATORY: Python List Method (ALWAYS use this):
python3 << 'EOF'
lines = []
lines.append('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 700">')
lines.append(' <defs>')
# ... each line separately
lines.append('</svg>')
with open('/path/to/output.svg', 'w') as f:
f.write('\n'.join(lines))
print("SVG generated successfully")
EOF
Why mandatory: Prevents character truncation, typos, and syntax errors. Each line is independent and easy to verify.
Pre-Tool-Call Checklist (CRITICAL - use EVERY time):
If ANY answer is NO: STOP. Do NOT call the tool. Prepare the content first.
Error Recovery Protocol:
Validation (run after generation):
python3 -c "import xml.etree.ElementTree as ET; ET.parse('file.svg')" && echo "✓ Valid XML"
# Or use cairosvg as a render-time check:
python3 -c "import cairosvg; cairosvg.svg2png(url='file.svg', write_to='/tmp/test.png')" && echo "✓ Renders" && rm /tmp/test.png
If using generate-from-template.py:
source / target node ids in arrow JSON so the generator can snap to node edgesx1,y1,x2,y2 as hints or fallback coordinates, not the main routing primitiveCommon Syntax Errors to Avoid:
yt-anchor → ✅ y="60" text-anchor="middle"x="390 (missing y) → ✅ x="390" y="250"fill=#fff → ✅ fill="#ffffff"marker-end= → ✅ marker-end="url(#arrow)"L 29450 → ✅ L 290,220</svg> at end./[derived-name].svg and ./[derived-name].png in current directory--output /path/ or 输出到 /path/| Tool | Install | Render Quality | Notes |
|---|---|---|---|
rsvg-convert | System (often preinstalled) | ⚠️ Fair | Drops some CSS styles and <foreignObject> elements — missing borders/text on complex SVGs |
cairosvg (recommended) | pip install cairosvg | ✅ Good | Solid CSS support; clearly better than rsvg-convert |
puppeteer (headless Chrome) | npm install puppeteer | ✅✅ Best | Real browser engine; 100% fidelity but heavy (Node + Chromium) |
# Single file (2x resolution for retina/docs)
python3 -c "import cairosvg; cairosvg.svg2png(url='input.svg', write_to='output.png', scale=2)"
# Batch convert all SVGs in a directory
python3 -c "
import cairosvg, os, glob
d = 'docs/00-core'
for svg in sorted(glob.glob(os.path.join(d, '*.svg'))):
png = svg.replace('.svg', '.png')
cairosvg.svg2png(url=svg, write_to=png, scale=2)
print(f'Done: {os.path.basename(svg)} -> {os.path.basename(png)}')
"
scale=2produces 2x resolution PNG, ideal for high-DPI screens and embedded docs.
# Single file
rsvg-convert -w 1920 file.svg -o file.png
# Batch (not recommended — complex SVGs may lose elements)
for f in docs/00-core/*.svg; do rsvg-convert -o "${f%.svg}.png" "$f"; done
# 2x resolution
for f in docs/00-core/*.svg; do rsvg-convert -z 2 -o "${f%.svg}.png" "$f"; done
npm install puppeteer # auto-downloads Chromium
node svg2png.js [directory]
const puppeteer = require('puppeteer');
const fs = require('fs');
const path = require('path');
(async () => {
const dir = process.argv[2] || '.';
const svgFiles = fs.readdirSync(dir).filter(f => f.endsWith('.svg'));
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
for (const file of svgFiles) {
const svgPath = path.resolve(dir, file);
const pngPath = svgPath.replace(/\.svg$/, '.png');
const svgContent = fs.readFileSync(svgPath, 'utf-8');
const wMatch = svgContent.match(/width="(\d+)/);
const hMatch = svgContent.match(/height="(\d+)/);
const vbMatch = svgContent.match(/viewBox="[^"]*\s(\d+)\s(\d+)"/);
let width = wMatch ? parseInt(wMatch[1]) : (vbMatch ? parseInt(vbMatch[1]) : 1200);
let height = hMatch ? parseInt(hMatch[1]) : (vbMatch ? parseInt(vbMatch[2]) : 800);
const scale = 2;
const page = await browser.newPage();
await page.setViewport({ width, height, deviceScaleFactor: scale });
const html = `<!DOCTYPE html>
<html><head><style>
body { margin: 0; padding: 0; background: transparent; }
img { display: block; }
</style></head>
<body>
<img src="data:image/svg+xml;base64,${Buffer.from(svgContent).toString('base64')}" width="${width}" height="${height}" />
</body></html>`;
await page.setContent(html, { waitUntil: 'networkidle0' });
await page.screenshot({ path: pngPath, type: 'png', omitBackground: true });
await page.close();
console.log(`Done: ${file} -> ${path.basename(pngPath)} (${width}x${height} @${scale}x)`);
}
await browser.close();
})();
rsvg-convert renders SVGs containing <foreignObject>, CSS filter, or complex <style> blocks incompletely — missing borders / missing text are the typical symptomscairosvg (built on Cairo) has much better CSS support than rsvg and is sufficient for most casescairosvg (pip install once, one-line conversion, good fidelity)rsvg-convert (acceptable for simple flat-color diagrams)puppeteer| # | Name | Background | Best For |
|---|---|---|---|
| 1 | Flat Icon (default) | White | Blogs, docs, presentations |
| 2 | Dark Terminal | #0f0f1a | GitHub, dev articles |
| 3 | Blueprint | #0a1628 | Architecture docs |
| 4 | Notion Clean | White, minimal | Notionnce |
| 5 | Glassmorphism | Dark gradient | Product sites, keynotes |
| 6 | Claude Official | Warm cream #f8f6f3 | Anthropic-style diagrams |
| 7 | OpenAI Official | Pure white #ffffff | OpenAI-style diagrams |
Load references/style-N.md for exact color tokens and SVG patterns.
Default: Style 1 (Flat Icon) for most diagrams. Load references/style-diagram-matrix.md for detailed style-to-diagram-type recommendations.
These patterns appear frequently — internalize them:
RAG Pipeline: Query → Embed → VectorSearch → Retrieve → Augment → LLM → Response Agentic RAG: adds Agent loop with Tool use between Query and LLM Agentic Search: Query → Planner → [Search Tool / Calculator / Code] → Synthesizer → Response Mem0 / Memory Layer: Input → Memory Manager → [Write: VectorDB + GraphDB] / [Read: Retrieve+Rank] → Context Agent Memory Types: Sensory (raw input) → Working (context window) → Episodic (past interactions) → Semantic (facts) → Procedural (skills) Multi-Agent: Orchestrator → [SubAgent A / SubAgent B / SubAgent C] → Aggregator → Output Tool Call Flow: LLM → Tool Selector → Tool Execution → Result Parser → LLM (loop)