@haposoft/cafekit 0.7.22 → 0.7.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +81 -862
  2. package/bin/install.js +4 -3
  3. package/package.json +2 -3
  4. package/src/claude/agents/code-auditor.md +25 -1
  5. package/src/claude/agents/spec-maker.md +17 -2
  6. package/src/claude/agents/test-runner.md +22 -3
  7. package/src/claude/hooks/spec-state.cjs +4 -4
  8. package/src/claude/migration-manifest.json +1 -1
  9. package/src/claude/rules/state-sync.md +7 -5
  10. package/src/claude/skills/code-review/references/spec-compliance-review.md +8 -1
  11. package/src/claude/skills/develop/SKILL.md +26 -4
  12. package/src/claude/skills/develop/references/quality-gate.md +23 -13
  13. package/src/claude/skills/generate-graph/LICENSE +21 -0
  14. package/src/claude/skills/generate-graph/README.md +523 -0
  15. package/src/claude/skills/generate-graph/SKILL.md +427 -0
  16. package/src/claude/skills/generate-graph/agentloop-core.svg +101 -0
  17. package/src/claude/skills/generate-graph/agents/openai.yaml +4 -0
  18. package/src/claude/skills/generate-graph/assets/samples/sample-style1-flat.png +0 -0
  19. package/src/claude/skills/generate-graph/assets/samples/sample-style2-dark.png +0 -0
  20. package/src/claude/skills/generate-graph/assets/samples/sample-style3-blueprint.png +0 -0
  21. package/src/claude/skills/generate-graph/assets/samples/sample-style4-notion.png +0 -0
  22. package/src/claude/skills/generate-graph/assets/samples/sample-style5-glass.png +0 -0
  23. package/src/claude/skills/generate-graph/assets/samples/sample-style6-claude.png +0 -0
  24. package/src/claude/skills/generate-graph/assets/samples/sample-style7-openai.png +0 -0
  25. package/src/claude/skills/generate-graph/fixtures/agent-memory-types-style4.json +181 -0
  26. package/src/claude/skills/generate-graph/fixtures/api-flow-style7.json +40 -0
  27. package/src/claude/skills/generate-graph/fixtures/mem0-style1.json +297 -0
  28. package/src/claude/skills/generate-graph/fixtures/microservices-style3.json +64 -0
  29. package/src/claude/skills/generate-graph/fixtures/multi-agent-style5.json +45 -0
  30. package/src/claude/skills/generate-graph/fixtures/system-architecture-style6.json +48 -0
  31. package/src/claude/skills/generate-graph/fixtures/tool-call-style2.json +182 -0
  32. package/src/claude/skills/generate-graph/package.json +42 -0
  33. package/src/claude/skills/generate-graph/references/icons.md +281 -0
  34. package/src/claude/skills/generate-graph/references/style-1-flat-icon.md +108 -0
  35. package/src/claude/skills/generate-graph/references/style-2-dark-terminal.md +107 -0
  36. package/src/claude/skills/generate-graph/references/style-3-blueprint.md +113 -0
  37. package/src/claude/skills/generate-graph/references/style-4-notion-clean.md +94 -0
  38. package/src/claude/skills/generate-graph/references/style-5-glassmorphism.md +125 -0
  39. package/src/claude/skills/generate-graph/references/style-6-claude-official.md +209 -0
  40. package/src/claude/skills/generate-graph/references/style-7-openai.md +215 -0
  41. package/src/claude/skills/generate-graph/references/style-diagram-matrix.md +135 -0
  42. package/src/claude/skills/generate-graph/references/svg-layout-best-practices.md +100 -0
  43. package/src/claude/skills/generate-graph/scripts/generate-diagram.sh +157 -0
  44. package/src/claude/skills/generate-graph/scripts/generate-from-template.py +1556 -0
  45. package/src/claude/skills/generate-graph/scripts/test-all-styles.sh +135 -0
  46. package/src/claude/skills/generate-graph/scripts/validate-svg.sh +292 -0
  47. package/src/claude/skills/generate-graph/templates/agent-architecture.svg +28 -0
  48. package/src/claude/skills/generate-graph/templates/architecture.svg +23 -0
  49. package/src/claude/skills/generate-graph/templates/comparison-matrix.svg +14 -0
  50. package/src/claude/skills/generate-graph/templates/data-flow.svg +28 -0
  51. package/src/claude/skills/generate-graph/templates/er-diagram.svg +21 -0
  52. package/src/claude/skills/generate-graph/templates/flowchart.svg +21 -0
  53. package/src/claude/skills/generate-graph/templates/sequence.svg +20 -0
  54. package/src/claude/skills/generate-graph/templates/state-machine.svg +20 -0
  55. package/src/claude/skills/generate-graph/templates/timeline.svg +19 -0
  56. package/src/claude/skills/generate-graph/templates/use-case.svg +21 -0
  57. package/src/claude/skills/specs/SKILL.md +38 -7
  58. package/src/claude/skills/specs/references/codebase-analysis.md +26 -9
  59. package/src/claude/skills/specs/references/research-strategy.md +3 -3
  60. package/src/claude/skills/specs/references/review.md +1 -1
  61. package/src/claude/skills/specs/rules/tasks-generation.md +17 -0
  62. package/src/claude/skills/specs/templates/design.md +13 -0
  63. package/src/claude/skills/specs/templates/init.json +4 -1
  64. package/src/claude/skills/specs/templates/requirements.md +21 -8
  65. package/src/claude/skills/specs/templates/task.md +16 -3
@@ -0,0 +1,48 @@
1
+ {
2
+ "template_type": "architecture",
3
+ "style": 6,
4
+ "width": 1120,
5
+ "height": 700,
6
+ "style_overrides": {
7
+ "title_align": "center"
8
+ },
9
+ "title": "System Architecture",
10
+ "subtitle": "Claude official style with warm structure, restrained hierarchy, and deployment clarity",
11
+ "containers": [
12
+ { "x": 44, "y": 118, "width": 1032, "height": 110, "label": "", "side_label": "Interface Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" },
13
+ { "x": 44, "y": 262, "width": 1032, "height": 154, "label": "", "side_label": "Core Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" },
14
+ { "x": 44, "y": 450, "width": 1032, "height": 178, "label": "", "side_label": "Foundation Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" }
15
+ ],
16
+ "nodes": [
17
+ { "id": "entry", "kind": "rect", "x": 82, "y": 146, "width": 170, "height": 54, "label": "Client Surface", "type_label": "ENTRY", "fill": "#e9f1fb", "stroke": "#8c6f5a", "flat": true },
18
+ { "id": "gateway", "kind": "double_rect", "x": 340, "y": 142, "width": 196, "height": 62, "label": "Gateway", "type_label": "ROUTER", "fill": "#f7ecda", "stroke": "#d97757" },
19
+ { "id": "planner", "kind": "rect", "x": 144, "y": 306, "width": 188, "height": 60, "label": "Task Planner", "type_label": "ORCHESTRATION", "fill": "#f7ecda", "stroke": "#d0b893", "flat": true },
20
+ { "id": "runtime", "kind": "double_rect", "x": 430, "y": 298, "width": 244, "height": 76, "label": "Model Runtime", "type_label": "INFERENCE", "fill": "#c8e4db", "stroke": "#8c6f5a" },
21
+ { "id": "guard", "kind": "rect", "x": 782, "y": 306, "width": 200, "height": 60, "label": "Policy Guardrails", "type_label": "SAFETY", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true },
22
+ { "id": "memory", "kind": "cylinder", "x": 96, "y": 494, "width": 154, "height": 92, "label": "Memory Store", "sublabel": "context + recall", "fill": "#e5e8df", "stroke": "#7b8b5c" },
23
+ { "id": "tools", "kind": "rect", "x": 382, "y": 510, "width": 184, "height": 60, "label": "Tool Runtime", "type_label": "ACTION", "fill": "#f7ecda", "stroke": "#d0b893", "flat": true },
24
+ { "id": "obs", "kind": "rect", "x": 688, "y": 510, "width": 184, "height": 60, "label": "Observability", "type_label": "OPS", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true },
25
+ { "id": "registry", "kind": "rect", "x": 906, "y": 510, "width": 138, "height": 60, "label": "Registry", "type_label": "ROLL OUT", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true }
26
+ ],
27
+ "arrows": [
28
+ { "source": "entry", "target": "gateway", "source_port": "right", "target_port": "left", "flow": "read" },
29
+ { "source": "gateway", "target": "planner", "source_port": "bottom", "target_port": "top", "flow": "control", "label": "decompose", "route_points": [[370,224], [370,336], [332,336]] },
30
+ { "source": "gateway", "target": "runtime", "source_port": "bottom", "target_port": "top", "flow": "read", "route_points": [[438,224], [552,224], [552,298]] },
31
+ { "source": "runtime", "target": "guard", "source_port": "right", "target_port": "left", "flow": "data" },
32
+ { "source": "runtime", "target": "memory", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "route_points": [[606,432], [218,432], [218,494]] },
33
+ { "source": "runtime", "target": "tools", "source_port": "bottom", "target_port": "top", "flow": "read" },
34
+ { "source": "runtime", "target": "obs", "source_port": "bottom", "target_port": "top", "flow": "feedback", "dashed": true, "route_points": [[730,432], [780,432], [780,510]] },
35
+ { "source": "obs", "target": "registry", "source_port": "right", "target_port": "left", "flow": "control" }
36
+ ],
37
+ "legend": [
38
+ { "flow": "read", "label": "Primary request path" },
39
+ { "flow": "control", "label": "Planning / rollout control" },
40
+ { "flow": "write", "label": "Memory writeback" },
41
+ { "flow": "feedback", "label": "Operational telemetry" }
42
+ ],
43
+ "legend_position": "bottom-right",
44
+ "legend_box": true,
45
+ "legend_box_fill": "#fffaf3",
46
+ "legend_y": 596,
47
+ "footer": ""
48
+ }
@@ -0,0 +1,182 @@
1
+ {
2
+ "template_type": "agent",
3
+ "style": 2,
4
+ "width": 1200,
5
+ "height": 700,
6
+ "window_controls": true,
7
+ "meta_center": "AGENT TOOL CALL EXECUTION FLOW · v1.0",
8
+ "meta_right": "style-2-dark-terminal",
9
+ "meta_fill": "#64748b",
10
+ "title": "Tool Call Flow",
11
+ "subtitle": "Dark terminal style with semantic action, retrieval, and execution paths",
12
+ "containers": [
13
+ {
14
+ "x": 36,
15
+ "y": 96,
16
+ "width": 1128,
17
+ "height": 142,
18
+ "label": "REQUEST PATH",
19
+ "subtitle": "",
20
+ "stroke": "#334155",
21
+ "fill": "rgba(15,23,42,0.18)"
22
+ },
23
+ {
24
+ "x": 36,
25
+ "y": 280,
26
+ "width": 1128,
27
+ "height": 202,
28
+ "label": "TOOLING FABRIC",
29
+ "subtitle": "",
30
+ "stroke": "#334155",
31
+ "fill": "rgba(15,23,42,0.18)"
32
+ },
33
+ {
34
+ "x": 36,
35
+ "y": 522,
36
+ "width": 1128,
37
+ "height": 126,
38
+ "label": "KNOWLEDGE + RESPONSE",
39
+ "subtitle": "",
40
+ "stroke": "#334155",
41
+ "fill": "rgba(15,23,42,0.18)"
42
+ }
43
+ ],
44
+ "nodes": [
45
+ {
46
+ "id": "query",
47
+ "kind": "speech",
48
+ "x": 64,
49
+ "y": 126,
50
+ "width": 132,
51
+ "height": 62,
52
+ "label": "User query",
53
+ "fill": "#0f172a",
54
+ "stroke": "#38bdf8",
55
+ "flat": true
56
+ },
57
+ {
58
+ "id": "planner",
59
+ "kind": "double_rect",
60
+ "x": 292,
61
+ "y": 122,
62
+ "width": 188,
63
+ "height": 66,
64
+ "label": "Retrieve chunks",
65
+ "fill": "#111827",
66
+ "stroke": "#a855f7",
67
+ "glow": "purple"
68
+ },
69
+ {
70
+ "id": "answer",
71
+ "kind": "rect",
72
+ "x": 570,
73
+ "y": 122,
74
+ "width": 208,
75
+ "height": 66,
76
+ "label": "Generate answer",
77
+ "fill": "#111827",
78
+ "stroke": "#f97316"
79
+ },
80
+ {
81
+ "id": "kb",
82
+ "kind": "cylinder",
83
+ "x": 948,
84
+ "y": 104,
85
+ "width": 158,
86
+ "height": 122,
87
+ "label": "Knowledge base",
88
+ "sublabel": "embeddings",
89
+ "fill": "#0f172a",
90
+ "stroke": "#38bdf8",
91
+ "glow": "blue"
92
+ },
93
+ {
94
+ "id": "agent",
95
+ "kind": "bot",
96
+ "x": 380,
97
+ "y": 316,
98
+ "width": 138,
99
+ "height": 118,
100
+ "label": "Agent",
101
+ "sublabel": "planner + tool policy",
102
+ "accent_fill": "#34d399"
103
+ },
104
+ {
105
+ "id": "terminal",
106
+ "kind": "terminal",
107
+ "x": 676,
108
+ "y": 334,
109
+ "width": 178,
110
+ "height": 108,
111
+ "label": "Terminal",
112
+ "fill": "#111111",
113
+ "stroke": "#475569",
114
+ "header_fill": "#222222"
115
+ },
116
+ {
117
+ "id": "docs",
118
+ "kind": "folder",
119
+ "x": 962,
120
+ "y": 350,
121
+ "width": 168,
122
+ "height": 96,
123
+ "label": "Source documents",
124
+ "fill": "#3f2a00",
125
+ "stroke": "#f59e0b",
126
+ "line_stroke": "#fcd34d"
127
+ },
128
+ {
129
+ "id": "reply",
130
+ "kind": "speech",
131
+ "x": 250,
132
+ "y": 560,
133
+ "width": 172,
134
+ "height": 64,
135
+ "label": "Grounded answer",
136
+ "fill": "#0f172a",
137
+ "stroke": "#34d399",
138
+ "flat": true,
139
+ "glow": "green"
140
+ }
141
+ ],
142
+ "arrows": [
143
+ { "source": "query", "target": "planner", "source_port": "right", "target_port": "left", "flow": "read" },
144
+ { "source": "planner", "target": "answer", "source_port": "right", "target_port": "left", "flow": "data" },
145
+ { "source": "planner", "target": "kb", "source_port": "right", "target_port": "left", "flow": "control", "route_points": [[520, 96], [918, 96], [918, 165]] },
146
+ { "source": "kb", "target": "answer", "source_port": "left", "target_port": "right", "flow": "control" },
147
+ { "source": "query", "target": "agent", "source_port": "bottom", "target_port": "top", "flow": "read" },
148
+ { "source": "agent", "target": "terminal", "source_port": "right", "target_port": "left", "flow": "read" },
149
+ { "source": "terminal", "target": "docs", "source_port": "right", "target_port": "left", "flow": "read", "label": "pdfgrep / rga", "label_dx": -8 },
150
+ {
151
+ "source": "docs",
152
+ "target": "kb",
153
+ "source_port": "top",
154
+ "target_port": "bottom",
155
+ "flow": "feedback",
156
+ "label": "embed",
157
+ "corridor_x": [1090],
158
+ "label_dx": 18,
159
+ "label_dy": -12
160
+ },
161
+ { "source": "agent", "target": "reply", "source_port": "bottom", "target_port": "top", "flow": "read", "route_points": [[320, 544], [320, 560]] },
162
+ {
163
+ "source": "terminal",
164
+ "target": "agent",
165
+ "source_port": "bottom",
166
+ "target_port": "bottom",
167
+ "flow": "control",
168
+ "route_points": [[760, 464], [760, 488], [456, 488], [456, 434]]
169
+ }
170
+ ],
171
+ "legend": [
172
+ { "flow": "read", "label": "Agent / tool path" },
173
+ { "flow": "control", "label": "Planner / retrieval path" },
174
+ { "flow": "data", "label": "Answer synthesis" },
175
+ { "flow": "feedback", "label": "Embedding update" }
176
+ ],
177
+ "legend_position": "bottom-right",
178
+ "legend_box": true,
179
+ "legend_box_fill": "rgba(15,23,42,0.72)",
180
+ "legend_y": 604,
181
+ "footer": "Agent loop iterates until grounded context is ready"
182
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@haposoft/generate-graph",
3
+ "version": "1.0.4",
4
+ "description": "CafeKit bundled Claude Code skill for generating production-quality SVG technical diagrams with optional PNG export via rsvg-convert.",
5
+ "main": "SKILL.md",
6
+ "keywords": [
7
+ "claude-code",
8
+ "skill",
9
+ "diagram",
10
+ "svg",
11
+ "architecture",
12
+ "flowchart",
13
+ "uml",
14
+ "sequence-diagram",
15
+ "er-diagram",
16
+ "visualization"
17
+ ],
18
+ "author": "Haposoft",
19
+ "license": "MIT",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/haposoft/cafekit.git",
23
+ "directory": "packages/spec/src/claude/skills/generate-graph"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/haposoft/cafekit/issues"
27
+ },
28
+ "homepage": "https://github.com/haposoft/cafekit/tree/main/packages/spec/src/claude/skills/generate-graph",
29
+ "files": [
30
+ "SKILL.md",
31
+ "README.md",
32
+ "LICENSE",
33
+ "references/",
34
+ "scripts/",
35
+ "fixtures/",
36
+ "templates/",
37
+ "assets/"
38
+ ],
39
+ "engines": {
40
+ "node": ">=14.0.0"
41
+ }
42
+ }
@@ -0,0 +1,281 @@
1
+ # Icon Reference
2
+
3
+ ## Rules for rsvg-convert Compatibility
4
+
5
+ **Never use** `@import url()` for icon fonts — rsvg-convert does not fetch external resources.
6
+ **Always use** inline SVG `<path>`, `<circle>`, `<rect>`, `<text>` combinations.
7
+ **Font fallback**: embed font-family in `<style>` using system fonts only.
8
+
9
+ ---
10
+
11
+ ## Generic Semantic Shapes (No product — use these first)
12
+
13
+ ### Database / Vector Store (cylinder)
14
+ ```xml
15
+ <!-- cx=center-x, top=top-y, w=width, h=height -->
16
+ <!-- Typical: w=80, h=70 -->
17
+ <ellipse cx="cx" cy="top" rx="w/2" ry="w/6" fill="fill" stroke="stroke" stroke-width="1.5"/>
18
+ <rect x="cx-w/2" y="top" width="w" height="h" fill="fill" stroke="none"/>
19
+ <line x1="cx-w/2" y1="top" x2="cx-w/2" y2="top+h" stroke="stroke" stroke-width="1.5"/>
20
+ <line x1="cx+w/2" y1="top" x2="cx+w/2" y2="top+h" stroke="stroke" stroke-width="1.5"/>
21
+ <!-- Optional inner rings for Vector Store -->
22
+ <ellipse cx="cx" cy="top+h*0.33" rx="w/2" ry="w/6" fill="none" stroke="stroke" stroke-width="0.7" opacity="0.5"/>
23
+ <ellipse cx="cx" cy="top+h*0.66" rx="w/2" ry="w/6" fill="none" stroke="stroke" stroke-width="0.7" opacity="0.5"/>
24
+ <ellipse cx="cx" cy="top+h" rx="w/2" ry="w/6" fill="fill-dark" stroke="stroke" stroke-width="1.5"/>
25
+ ```
26
+
27
+ ### LLM / Model Node (rounded rect with spark)
28
+ ```xml
29
+ <!-- Rounded rect with double border = "intelligent" signal -->
30
+ <rect x="x" y="y" width="w" height="h" rx="10" fill="fill" stroke="stroke-outer" stroke-width="2.5"/>
31
+ <rect x="x+3" y="y+3" width="w-6" height="h-6" rx="8" fill="none" stroke="stroke-inner" stroke-width="0.8" opacity="0.5"/>
32
+ <!-- Spark icon (⚡) as text or small lightning path -->
33
+ <text x="cx" y="cy-6" text-anchor="middle" font-size="14">⚡</text>
34
+ <text x="cx" y="cy+10" text-anchor="middle" fill="text-color" font-size="13" font-weight="600">GPT-4o</text>
35
+ ```
36
+
37
+ ### Agent / Orchestrator (hexagon)
38
+ ```xml
39
+ <!-- r = circumradius, cx/cy = center -->
40
+ <!-- For r=36: points at 36,0 18,31.2 -18,31.2 -36,0 -18,-31.2 18,-31.2 -->
41
+ <polygon points="cx,cy-r cx+r*0.866,cy-r*0.5 cx+r*0.866,cy+r*0.5 cx,cy+r cx-r*0.866,cy+r*0.5 cx-r*0.866,cy-r*0.5"
42
+ fill="fill" stroke="stroke" stroke-width="1.5"/>
43
+ <text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="12" font-weight="600">Agent</text>
44
+ ```
45
+
46
+ ### Memory Node (short-term, dashed border)
47
+ ```xml
48
+ <rect x="x" y="y" width="w" height="h" rx="8"
49
+ fill="fill" stroke="stroke" stroke-width="1.5" stroke-dasharray="6,3"/>
50
+ <text x="cx" y="cy-6" text-anchor="middle" fill="text" font-size="10" opacity="0.7">MEMORY</text>
51
+ <text x="cx" y="cy+8" text-anchor="middle" fill="text" font-size="13">Short-term</text>
52
+ ```
53
+
54
+ ### Tool / Function Call (rect with gear symbol)
55
+ ```xml
56
+ <rect x="x" y="y" width="w" height="h" rx="6" fill="fill" stroke="stroke" stroke-width="1.5"/>
57
+ <!-- Gear: simplified as ⚙ unicode or small circle with lines -->
58
+ <text x="cx" y="cy-4" text-anchor="middle" font-size="16">⚙</text>
59
+ <text x="cx" y="cy+12" text-anchor="middle" fill="text" font-size="12">Tool Name</text>
60
+ ```
61
+
62
+ ### Queue / Stream (horizontal pipe)
63
+ ```xml
64
+ <!-- Pipe tube: left cap ellipse + body + right cap ellipse -->
65
+ <ellipse cx="x1" cy="cy" rx="ry*0.6" ry="ry" fill="fill-dark" stroke="stroke" stroke-width="1.5"/>
66
+ <rect x="x1" y="cy-ry" width="x2-x1" height="ry*2" fill="fill" stroke="none"/>
67
+ <line x1="x1" y1="cy-ry" x2="x2" y2="cy-ry" stroke="stroke" stroke-width="1.5"/>
68
+ <line x1="x1" y1="cy+ry" x2="x2" y2="cy+ry" stroke="stroke" stroke-width="1.5"/>
69
+ <ellipse cx="x2" cy="cy" rx="ry*0.6" ry="ry" fill="fill-light" stroke="stroke" stroke-width="1.5"/>
70
+ ```
71
+
72
+ ### User / Human Actor
73
+ ```xml
74
+ <!-- Head -->
75
+ <circle cx="cx" cy="cy-18" r="10" fill="fill" stroke="stroke" stroke-width="1.2"/>
76
+ <!-- Body / shoulders -->
77
+ <path d="M cx-14,cy+16 Q cx-14,cy-4 cx,cy-4 Q cx+14,cy-4 cx+14,cy+16"
78
+ fill="fill" stroke="stroke" stroke-width="1.2"/>
79
+ <text x="cx" y="cy+30" text-anchor="middle" fill="text" font-size="12">User</text>
80
+ ```
81
+
82
+ ### API Gateway (hexagon, single border, smaller)
83
+ ```xml
84
+ <polygon points="cx,cy-28 cx+24,cy-14 cx+24,cy+14 cx,cy+28 cx-24,cy+14 cx-24,cy-14"
85
+ fill="fill" stroke="stroke" stroke-width="1.5"/>
86
+ <text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="11">API</text>
87
+ ```
88
+
89
+ ### Browser / Web Client
90
+ ```xml
91
+ <rect x="x" y="y" width="w" height="h" rx="6" fill="fill" stroke="stroke" stroke-width="1.5"/>
92
+ <!-- Title bar -->
93
+ <rect x="x" y="y" width="w" height="20" rx="6" fill="fill-dark" stroke="none"/>
94
+ <rect x="x" y="y+14" width="w" height="6" fill="fill-dark"/>
95
+ <!-- Traffic light dots -->
96
+ <circle cx="x+12" cy="y+10" r="4" fill="#ef4444" opacity="0.8"/>
97
+ <circle cx="x+24" cy="y+10" r="4" fill="#f59e0b" opacity="0.8"/>
98
+ <circle cx="x+36" cy="y+10" r="4" fill="#10b981" opacity="0.8"/>
99
+ ```
100
+
101
+ ### Document / File
102
+ ```xml
103
+ <!-- Folded corner rectangle -->
104
+ <path d="M x,y L x+w-12,y L x+w,y+12 L x+w,y+h L x,y+h Z"
105
+ fill="fill" stroke="stroke" stroke-width="1.5"/>
106
+ <!-- Fold -->
107
+ <path d="M x+w-12,y L x+w-12,y+12 L x+w,y+12" fill="fill-dark" stroke="stroke" stroke-width="1"/>
108
+ <!-- Lines inside -->
109
+ <line x1="x+8" y1="y+h*0.45" x2="x+w-8" y2="y+h*0.45" stroke="stroke" stroke-width="1" opacity="0.5"/>
110
+ <line x1="x+8" y1="y+h*0.6" x2="x+w-8" y2="y+h*0.6" stroke="stroke" stroke-width="1" opacity="0.5"/>
111
+ <line x1="x+8" y1="y+h*0.75" x2="x+w-16" y2="y+h*0.75" stroke="stroke" stroke-width="1" opacity="0.5"/>
112
+ ```
113
+
114
+ ### Decision Diamond (flowcharts)
115
+ ```xml
116
+ <!-- cx/cy = center, hw = half-width, hh = half-height -->
117
+ <polygon points="cx,cy-hh cx+hw,cy cx,cy+hh cx-hw,cy"
118
+ fill="fill" stroke="stroke" stroke-width="1.5"/>
119
+ <text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="12">Condition?</text>
120
+ ```
121
+
122
+ ### Swim Lane Container
123
+ ```xml
124
+ <!-- Background band for a layer/group -->
125
+ <rect x="x" y="y" width="w" height="h" rx="6"
126
+ fill="fill" fill-opacity="0.04" stroke="stroke" stroke-width="1" stroke-dasharray="6,4"/>
127
+ <!-- Layer label top-left -->
128
+ <text x="x+12" y="y+16" fill="label-color" font-size="10" font-weight="600" letter-spacing="0.06em">LAYER NAME</text>
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Product Icons (Brand Colors + Inline SVG)
134
+
135
+ All use circle badge + text abbreviation pattern. Replace `cx`, `cy` with actual coordinates.
136
+
137
+ ### AI / ML Products
138
+
139
+ | Product | Color | Badge Text |
140
+ |---------|-------|-----------|
141
+ | OpenAI / ChatGPT | `#10A37F` | `OAI` |
142
+ | Anthropic / Claude | `#D97757` | `Claude` |
143
+ | Google Gemini | `#4285F4` | `Gemini` |
144
+ | Meta LLaMA | `#0467DF` | `LLaMA` |
145
+ | Mistral | `#FF7000` | `Mistral` |
146
+ | Cohere | `#39594D` | `Cohere` |
147
+ | Groq | `#F55036` | `Groq` |
148
+ | Together AI | `#6366F1` | `Together` |
149
+ | Replicate | `#191919` | `Rep` |
150
+ | Hugging Face | `#FFD21E` (text dark) | `HF` |
151
+
152
+ **Template:**
153
+ ```xml
154
+ <circle cx="cx" cy="cy" r="22" fill="BRAND_COLOR"/>
155
+ <text x="cx" y="cy+5" text-anchor="middle" fill="white"
156
+ font-size="10" font-weight="700" font-family="Helvetica">BADGE_TEXT</text>
157
+ <!-- Optional: outer ring for "AI" products -->
158
+ <circle cx="cx" cy="cy" r="24" fill="none" stroke="BRAND_COLOR" stroke-width="1" opacity="0.4"/>
159
+ ```
160
+
161
+ ### AI Memory & RAG Products
162
+
163
+ | Product | Color | Badge |
164
+ |---------|-------|-------|
165
+ | Mem0 | `#6366F1` | `mem0` |
166
+ | LangChain | `#1C3C3C` | `🦜` or `LC` |
167
+ | LlamaIndex | `#8B5CF6` | `LI` |
168
+ | LangGraph | `#1C3C3C` | `LG` |
169
+ | CrewAI | `#EF4444` | `Crew` |
170
+ | AutoGen | `#0078D4` | `AG` |
171
+ | Haystack | `#FF6D00` | `🌾` or `HS` |
172
+ | DSPy | `#7C3AED` | `DSPy` |
173
+
174
+ ### Vector Databases
175
+
176
+ | Product | Color | Badge |
177
+ |---------|-------|-------|
178
+ | Pinecone | `#1C1C2E` + green | `Pine` |
179
+ | Weaviate | `#FA0050` | `Wea` |
180
+ | Qdrant | `#DC244C` | `Qdrant` |
181
+ | Chroma | `#FF6B35` | `Chr` |
182
+ | Milvus | `#00A1EA` | `Milvus` |
183
+ | pgvector | `#336791` | `pgv` |
184
+ | Faiss | `#0467DF` | `FAISS` |
185
+
186
+ **Vector DB template (cylinder + badge):**
187
+ ```xml
188
+ <!-- Cylinder shape -->
189
+ <ellipse cx="cx" cy="top" rx="40" ry="12" fill="FILL" stroke="STROKE" stroke-width="1.5"/>
190
+ <rect x="cx-40" y="top" width="80" height="50" fill="FILL" stroke="none"/>
191
+ <line x1="cx-40" y1="top" x2="cx-40" y2="top+50" stroke="STROKE" stroke-width="1.5"/>
192
+ <line x1="cx+40" y1="top" x2="cx+40" y2="top+50" stroke="STROKE" stroke-width="1.5"/>
193
+ <ellipse cx="cx" cy="top+50" rx="40" ry="12" fill="FILL_DARK" stroke="STROKE" stroke-width="1.5"/>
194
+ <!-- Product name -->
195
+ <text x="cx" y="top+30" text-anchor="middle" fill="white"
196
+ font-size="11" font-weight="700">Pinecone</text>
197
+ ```
198
+
199
+ ### Classic Databases & Storage
200
+
201
+ | Product | Color |
202
+ |---------|-------|
203
+ | PostgreSQL | `#336791` |
204
+ | MySQL | `#4479A1` |
205
+ | MongoDB | `#47A248` |
206
+ | Redis | `#DC382D` |
207
+ | Elasticsearch | `#005571` |
208
+ | Cassandra | `#1287B1` |
209
+ | Neo4j | `#008CC1` |
210
+ | SQLite | `#003B57` |
211
+
212
+ ### Message Queues & Streaming
213
+
214
+ | Product | Color |
215
+ |---------|-------|
216
+ | Apache Kafka | `#231F20` |
217
+ | RabbitMQ | `#FF6600` |
218
+ | AWS SQS | `#FF9900` |
219
+ | NATS | `#27AAE1` |
220
+ | Pulsar | `#188FFF` |
221
+
222
+ ### Cloud & Infra
223
+
224
+ | Product | Color |
225
+ |---------|-------|
226
+ | AWS | `#FF9900` |
227
+ | GCP | `#4285F4` |
228
+ | Azure | `#0089D6` |
229
+ | Cloudflare | `#F48120` |
230
+ | Vercel | `#000000` |
231
+ | Docker | `#2496ED` |
232
+ | Kubernetes | `#326CE5` |
233
+ | Terraform | `#7B42BC` |
234
+ | Nginx | `#009639` |
235
+ | FastAPI | `#009688` |
236
+
237
+ ### Observability
238
+
239
+ | Product | Color |
240
+ |---------|-------|
241
+ | Grafana | `#F46800` |
242
+ | Prometheus | `#E6522C` |
243
+ | Datadog | `#632CA6` |
244
+ | LangSmith | `#1C3C3C` |
245
+ | Langfuse | `#6366F1` |
246
+ | Arize | `#6B48FF` |
247
+
248
+ ---
249
+
250
+ ## Icon Sizing Guide
251
+
252
+ | Context | Recommended Size | Padding |
253
+ |---------|-----------------|---------|
254
+ | Node badge (inside box) | 28×28px circle | 10px |
255
+ | Standalone icon node | 40×40px | 16px |
256
+ | Hero / central node | 56×56px | 20px |
257
+ | Small inline indicator | 16×16px | 6px |
258
+
259
+ ## Arrow Marker Templates
260
+
261
+ ```xml
262
+ <defs>
263
+ <!-- Standard filled arrow -->
264
+ <marker id="arrow-COLORNAME" markerWidth="10" markerHeight="7"
265
+ refX="9" refY="3.5" orient="auto">
266
+ <polygon points="0 0, 10 3.5, 0 7" fill="COLOR"/>
267
+ </marker>
268
+
269
+ <!-- Open arrow (outline only) -->
270
+ <marker id="arrow-open" markerWidth="10" markerHeight="8"
271
+ refX="9" refY="4" orient="auto">
272
+ <path d="M 0 0 L 10 4 L 0 8" fill="none" stroke="COLOR" stroke-width="1.5"/>
273
+ </marker>
274
+
275
+ <!-- Circle dot (for association lines) -->
276
+ <marker id="dot" markerWidth="8" markerHeight="8"
277
+ refX="4" refY="4" orient="auto">
278
+ <circle cx="4" cy="4" r="3" fill="COLOR"/>
279
+ </marker>
280
+ </defs>
281
+ ```
@@ -0,0 +1,108 @@
1
+ # Style 1: Flat Icon (Default)
2
+
3
+ Inspired by draw.io defaults and Apple documentation style.
4
+
5
+ ## Colors
6
+
7
+ ```
8
+ Background: #ffffff
9
+ Box fill: #ffffff
10
+ Box stroke: #d1d5db (gray-300)
11
+ Box radius: 8px
12
+ Text primary: #111827 (gray-900)
13
+ Text secondary: #6b7280 (gray-500)
14
+
15
+ Semantic arrow colors (pick by flow type):
16
+ Flow A (main): #2563eb (blue-600)
17
+ Flow B (alt): #dc2626 (red-600)
18
+ Flow C (data): #16a34a (green-600)
19
+ Flow D (async): #9333ea (purple-600)
20
+
21
+ Icon accent backgrounds:
22
+ Blue tint: #eff6ff / #dbeafe
23
+ Red tint: #fef2f2 / #fee2e2
24
+ Green tint: #f0fdf4 / #dcfce7
25
+ Purple tint: #faf5ff / #ede9fe
26
+ Orange tint: #fff7ed / #fed7aa
27
+ Teal tint: #f0fdfa / #ccfbf1
28
+ ```
29
+
30
+ ## Typography
31
+
32
+ ```
33
+ font-family: 'Helvetica Neue', Helvetica, Arial, 'PingFang SC',
34
+ 'Microsoft YaHei', sans-serif
35
+ font-size: 14px labels, 12px sub-labels, 16px titles
36
+ font-weight: 400 normal, 600 semi-bold for titles
37
+ ```
38
+
39
+ ## Box Shapes
40
+
41
+ ```xml
42
+ <!-- Standard node box -->
43
+ <rect rx="8" ry="8" fill="#ffffff" stroke="#d1d5db" stroke-width="1.5"/>
44
+
45
+ <!-- Icon accent box (colored background) -->
46
+ <rect rx="8" ry="8" fill="#eff6ff" stroke="#bfdbfe" stroke-width="1.5"/>
47
+
48
+ <!-- Database cylinder (use SVG path) -->
49
+ <!-- Terminal box: rx=4, fill=#111827, stroke=#374151 -->
50
+ <!-- User/actor: circle or rounded rect with icon -->
51
+ ```
52
+
53
+ ## Arrows
54
+
55
+ ```xml
56
+ <defs>
57
+ <marker id="arrow-blue" markerWidth="10" markerHeight="7"
58
+ refX="9" refY="3.5" orient="auto">
59
+ <polygon points="0 0, 10 3.5, 0 7" fill="#2563eb"/>
60
+ </marker>
61
+ <marker id="arrow-red" markerWidth="10" markerHeight="7"
62
+ refX="9" refY="3.5" orient="auto">
63
+ <polygon points="0 0, 10 3.5, 0 7" fill="#dc2626"/>
64
+ </marker>
65
+ </defs>
66
+
67
+ <!-- Line -->
68
+ <line stroke="#2563eb" stroke-width="1.5" marker-end="url(#arrow-blue)"/>
69
+ <!-- Or path for curved/orthogonal routing -->
70
+ <path stroke="#2563eb" stroke-width="1.5" fill="none" marker-end="url(#arrow-blue)"/>
71
+ ```
72
+
73
+ ## Legend
74
+
75
+ Always include a legend in the bottom-left if multiple arrow colors are used:
76
+
77
+ ```xml
78
+ <g transform="translate(20, 560)">
79
+ <line x1="0" y1="8" x2="30" y2="8" stroke="#2563eb" stroke-width="1.5"
80
+ marker-end="url(#arrow-blue)"/>
81
+ <text x="36" y="12" fill="#6b7280" font-size="12">Agent flow</text>
82
+ <line x1="0" y1="24" x2="30" y2="24" stroke="#dc2626" stroke-width="1.5"
83
+ marker-end="url(#arrow-red)"/>
84
+ <text x="36" y="28" fill="#6b7280" font-size="12">RAG flow</text>
85
+ </g>
86
+ ```
87
+
88
+ ## SVG Template
89
+
90
+ ```xml
91
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600"
92
+ width="960" height="600">
93
+ <style>
94
+ /* NO @import — rsvg-convert cannot fetch external URLs */
95
+ text { font-family: 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif; }
96
+ </style>
97
+ <defs>
98
+ <!-- arrow markers here -->
99
+ <!-- gradients/filters if needed -->
100
+ </defs>
101
+ <!-- white background -->
102
+ <rect width="960" height="600" fill="#ffffff"/>
103
+ <!-- diagram title (optional) -->
104
+ <!-- nodes -->
105
+ <!-- edges -->
106
+ <!-- legend -->
107
+ </svg>
108
+ ```