living-ai-documentation 1.0.0

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 (203) hide show
  1. package/LICENSE +661 -0
  2. package/README.fr.md +344 -0
  3. package/README.md +344 -0
  4. package/dist/bin/cli.d.ts +3 -0
  5. package/dist/bin/cli.d.ts.map +1 -0
  6. package/dist/bin/cli.js +262 -0
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/src/frontend/accuracy-gauge.js +70 -0
  9. package/dist/src/frontend/admin.html +1532 -0
  10. package/dist/src/frontend/annotations.js +585 -0
  11. package/dist/src/frontend/boot.js +101 -0
  12. package/dist/src/frontend/config.js +29 -0
  13. package/dist/src/frontend/confirm-modal.js +82 -0
  14. package/dist/src/frontend/context.html +1252 -0
  15. package/dist/src/frontend/dark-mode.js +20 -0
  16. package/dist/src/frontend/diagram/alignment.js +161 -0
  17. package/dist/src/frontend/diagram/clipboard.js +187 -0
  18. package/dist/src/frontend/diagram/constants.js +109 -0
  19. package/dist/src/frontend/diagram/custom-shapes.js +104 -0
  20. package/dist/src/frontend/diagram/debug.js +43 -0
  21. package/dist/src/frontend/diagram/drawio-export.js +649 -0
  22. package/dist/src/frontend/diagram/edge-panel.js +293 -0
  23. package/dist/src/frontend/diagram/edge-rendering.js +12 -0
  24. package/dist/src/frontend/diagram/evidence.js +146 -0
  25. package/dist/src/frontend/diagram/grid.js +78 -0
  26. package/dist/src/frontend/diagram/groups.js +102 -0
  27. package/dist/src/frontend/diagram/history.js +157 -0
  28. package/dist/src/frontend/diagram/image-name-modal.js +48 -0
  29. package/dist/src/frontend/diagram/image-upload.js +36 -0
  30. package/dist/src/frontend/diagram/label-editor.js +115 -0
  31. package/dist/src/frontend/diagram/link-panel.js +144 -0
  32. package/dist/src/frontend/diagram/main.js +364 -0
  33. package/dist/src/frontend/diagram/network.js +2214 -0
  34. package/dist/src/frontend/diagram/node-panel.js +389 -0
  35. package/dist/src/frontend/diagram/node-rendering.js +964 -0
  36. package/dist/src/frontend/diagram/persistence.js +168 -0
  37. package/dist/src/frontend/diagram/ports.js +421 -0
  38. package/dist/src/frontend/diagram/selection-overlay.js +387 -0
  39. package/dist/src/frontend/diagram/state.js +43 -0
  40. package/dist/src/frontend/diagram/t.js +3 -0
  41. package/dist/src/frontend/diagram/toast.js +21 -0
  42. package/dist/src/frontend/diagram/unlock-hold.js +206 -0
  43. package/dist/src/frontend/diagram/zoom.js +20 -0
  44. package/dist/src/frontend/diagram-link-modal.js +137 -0
  45. package/dist/src/frontend/diagram.html +1494 -0
  46. package/dist/src/frontend/documents.js +479 -0
  47. package/dist/src/frontend/export.js +338 -0
  48. package/dist/src/frontend/file-attach.js +178 -0
  49. package/dist/src/frontend/files-modal.js +243 -0
  50. package/dist/src/frontend/i18n/en.json +624 -0
  51. package/dist/src/frontend/i18n/fr.json +624 -0
  52. package/dist/src/frontend/i18n.js +32 -0
  53. package/dist/src/frontend/image-paste.js +126 -0
  54. package/dist/src/frontend/index.html +2806 -0
  55. package/dist/src/frontend/local-search.js +476 -0
  56. package/dist/src/frontend/metadata.js +318 -0
  57. package/dist/src/frontend/misc.js +92 -0
  58. package/dist/src/frontend/new-doc-modal.js +285 -0
  59. package/dist/src/frontend/new-folder-modal.js +169 -0
  60. package/dist/src/frontend/search.js +194 -0
  61. package/dist/src/frontend/shape-editor.html +685 -0
  62. package/dist/src/frontend/sidebar-helpers.js +96 -0
  63. package/dist/src/frontend/sidebar-resize.js +98 -0
  64. package/dist/src/frontend/sidebar.js +351 -0
  65. package/dist/src/frontend/snippet-detect.js +25 -0
  66. package/dist/src/frontend/snippet-table.js +85 -0
  67. package/dist/src/frontend/snippet-tree.js +94 -0
  68. package/dist/src/frontend/snippets.js +1146 -0
  69. package/dist/src/frontend/state.js +46 -0
  70. package/dist/src/frontend/utils.js +21 -0
  71. package/dist/src/frontend/validate.js +107 -0
  72. package/dist/src/frontend/vendor/wordcloud2.js +1187 -0
  73. package/dist/src/frontend/wordcloud.js +693 -0
  74. package/dist/src/lib/config.d.ts +26 -0
  75. package/dist/src/lib/config.d.ts.map +1 -0
  76. package/dist/src/lib/config.js +195 -0
  77. package/dist/src/lib/config.js.map +1 -0
  78. package/dist/src/lib/hash.d.ts +2 -0
  79. package/dist/src/lib/hash.d.ts.map +1 -0
  80. package/dist/src/lib/hash.js +18 -0
  81. package/dist/src/lib/hash.js.map +1 -0
  82. package/dist/src/lib/metadata.d.ts +31 -0
  83. package/dist/src/lib/metadata.d.ts.map +1 -0
  84. package/dist/src/lib/metadata.js +128 -0
  85. package/dist/src/lib/metadata.js.map +1 -0
  86. package/dist/src/lib/parser.d.ts +11 -0
  87. package/dist/src/lib/parser.d.ts.map +1 -0
  88. package/dist/src/lib/parser.js +111 -0
  89. package/dist/src/lib/parser.js.map +1 -0
  90. package/dist/src/lib/status.d.ts +9 -0
  91. package/dist/src/lib/status.d.ts.map +1 -0
  92. package/dist/src/lib/status.js +72 -0
  93. package/dist/src/lib/status.js.map +1 -0
  94. package/dist/src/mcp/server.d.ts +3 -0
  95. package/dist/src/mcp/server.d.ts.map +1 -0
  96. package/dist/src/mcp/server.js +2046 -0
  97. package/dist/src/mcp/server.js.map +1 -0
  98. package/dist/src/mcp/tools/diagrams.d.ts +82 -0
  99. package/dist/src/mcp/tools/diagrams.d.ts.map +1 -0
  100. package/dist/src/mcp/tools/diagrams.js +594 -0
  101. package/dist/src/mcp/tools/diagrams.js.map +1 -0
  102. package/dist/src/mcp/tools/documents.d.ts +44 -0
  103. package/dist/src/mcp/tools/documents.d.ts.map +1 -0
  104. package/dist/src/mcp/tools/documents.js +186 -0
  105. package/dist/src/mcp/tools/documents.js.map +1 -0
  106. package/dist/src/mcp/tools/git.d.ts +10 -0
  107. package/dist/src/mcp/tools/git.d.ts.map +1 -0
  108. package/dist/src/mcp/tools/git.js +217 -0
  109. package/dist/src/mcp/tools/git.js.map +1 -0
  110. package/dist/src/mcp/tools/metadata.d.ts +57 -0
  111. package/dist/src/mcp/tools/metadata.d.ts.map +1 -0
  112. package/dist/src/mcp/tools/metadata.js +222 -0
  113. package/dist/src/mcp/tools/metadata.js.map +1 -0
  114. package/dist/src/mcp/tools/source.d.ts +29 -0
  115. package/dist/src/mcp/tools/source.d.ts.map +1 -0
  116. package/dist/src/mcp/tools/source.js +196 -0
  117. package/dist/src/mcp/tools/source.js.map +1 -0
  118. package/dist/src/routes/annotations.d.ts +3 -0
  119. package/dist/src/routes/annotations.d.ts.map +1 -0
  120. package/dist/src/routes/annotations.js +83 -0
  121. package/dist/src/routes/annotations.js.map +1 -0
  122. package/dist/src/routes/browse-source.d.ts +3 -0
  123. package/dist/src/routes/browse-source.d.ts.map +1 -0
  124. package/dist/src/routes/browse-source.js +79 -0
  125. package/dist/src/routes/browse-source.js.map +1 -0
  126. package/dist/src/routes/browse.d.ts +3 -0
  127. package/dist/src/routes/browse.d.ts.map +1 -0
  128. package/dist/src/routes/browse.js +91 -0
  129. package/dist/src/routes/browse.js.map +1 -0
  130. package/dist/src/routes/config.d.ts +3 -0
  131. package/dist/src/routes/config.d.ts.map +1 -0
  132. package/dist/src/routes/config.js +145 -0
  133. package/dist/src/routes/config.js.map +1 -0
  134. package/dist/src/routes/context.d.ts +3 -0
  135. package/dist/src/routes/context.d.ts.map +1 -0
  136. package/dist/src/routes/context.js +287 -0
  137. package/dist/src/routes/context.js.map +1 -0
  138. package/dist/src/routes/diagrams.d.ts +3 -0
  139. package/dist/src/routes/diagrams.d.ts.map +1 -0
  140. package/dist/src/routes/diagrams.js +69 -0
  141. package/dist/src/routes/diagrams.js.map +1 -0
  142. package/dist/src/routes/documents.d.ts +11 -0
  143. package/dist/src/routes/documents.d.ts.map +1 -0
  144. package/dist/src/routes/documents.js +450 -0
  145. package/dist/src/routes/documents.js.map +1 -0
  146. package/dist/src/routes/export.d.ts +3 -0
  147. package/dist/src/routes/export.d.ts.map +1 -0
  148. package/dist/src/routes/export.js +280 -0
  149. package/dist/src/routes/export.js.map +1 -0
  150. package/dist/src/routes/files.d.ts +3 -0
  151. package/dist/src/routes/files.d.ts.map +1 -0
  152. package/dist/src/routes/files.js +180 -0
  153. package/dist/src/routes/files.js.map +1 -0
  154. package/dist/src/routes/images.d.ts +3 -0
  155. package/dist/src/routes/images.d.ts.map +1 -0
  156. package/dist/src/routes/images.js +49 -0
  157. package/dist/src/routes/images.js.map +1 -0
  158. package/dist/src/routes/metadata.d.ts +3 -0
  159. package/dist/src/routes/metadata.d.ts.map +1 -0
  160. package/dist/src/routes/metadata.js +131 -0
  161. package/dist/src/routes/metadata.js.map +1 -0
  162. package/dist/src/routes/shape-libraries.d.ts +3 -0
  163. package/dist/src/routes/shape-libraries.d.ts.map +1 -0
  164. package/dist/src/routes/shape-libraries.js +118 -0
  165. package/dist/src/routes/shape-libraries.js.map +1 -0
  166. package/dist/src/routes/wordcloud.d.ts +3 -0
  167. package/dist/src/routes/wordcloud.d.ts.map +1 -0
  168. package/dist/src/routes/wordcloud.js +95 -0
  169. package/dist/src/routes/wordcloud.js.map +1 -0
  170. package/dist/src/server.d.ts +7 -0
  171. package/dist/src/server.d.ts.map +1 -0
  172. package/dist/src/server.js +93 -0
  173. package/dist/src/server.js.map +1 -0
  174. package/dist/starter-doc/.living-doc.json +52 -0
  175. package/dist/starter-doc/ADRS/2026_01_01_[ADR]_example_architecture_decision.md +59 -0
  176. package/dist/starter-doc/AI/2026_01_01_how_to.md +112 -0
  177. package/dist/starter-doc/AI/PROJECT-INSTRUCTIONS.md +172 -0
  178. package/dist/starter-doc/AI/PROJECT-STACK.md +77 -0
  179. package/dist/starter-doc/AI/PROJECT-USEFUL-COMMANDS.md +80 -0
  180. package/dist/starter-doc/AI/default/AGENTS.md +31 -0
  181. package/dist/starter-doc/AI/default/CLAUDE.md +31 -0
  182. package/dist/starter-doc/AI/default/MEMORY.md +24 -0
  183. package/dist/starter-doc/AI/rules/no-magic-numbers.md +18 -0
  184. package/dist/starter-doc/AI/rules/track-current-work.md +23 -0
  185. package/dist/starter-doc/WORKLOG/current-task.md +57 -0
  186. package/dist/starter-doc-fr/.living-doc.json +52 -0
  187. package/dist/starter-doc-fr/ADRS/2026_01_01_[ADR]_example_architecture_decision.md +59 -0
  188. package/dist/starter-doc-fr/AI/2026_01_01_how_to.md +100 -0
  189. package/dist/starter-doc-fr/AI/PROJECT-INSTRUCTIONS.md +172 -0
  190. package/dist/starter-doc-fr/AI/PROJECT-STACK.md +77 -0
  191. package/dist/starter-doc-fr/AI/PROJECT-USEFUL-COMMANDS.md +80 -0
  192. package/dist/starter-doc-fr/AI/default/AGENTS.md +31 -0
  193. package/dist/starter-doc-fr/AI/default/CLAUDE.md +31 -0
  194. package/dist/starter-doc-fr/AI/default/MEMORY.md +24 -0
  195. package/dist/starter-doc-fr/AI/rules/no-magic-numbers.md +18 -0
  196. package/dist/starter-doc-fr/AI/rules/track-current-work.md +23 -0
  197. package/dist/starter-doc-fr/WORKLOG/current-task.md +57 -0
  198. package/images/living_documentation.jpg +0 -0
  199. package/images/readme-extra-files.png +0 -0
  200. package/images/readme-filename-pattern.png +0 -0
  201. package/images/readme-intelligent-search-demo.jpg +0 -0
  202. package/images/readme-sidebar.png +0 -0
  203. package/package.json +72 -0
@@ -0,0 +1,594 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.toolListDiagrams = toolListDiagrams;
7
+ exports.toolReadDiagram = toolReadDiagram;
8
+ exports.toolCreateDiagram = toolCreateDiagram;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const VALID_PORTS = new Set(['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']);
12
+ const VALID_ARROW_DIRS = new Set(['to', 'from', 'both', 'none']);
13
+ const KIND_DEFAULTS = {
14
+ person: { renderAs: 'actor', color: 'c-gray', labelType: 'Person' },
15
+ software_system: { renderAs: 'box', color: 'c-blue', labelType: 'Software System' },
16
+ external_system: { renderAs: 'box', color: 'c-slate', labelType: 'External System' },
17
+ container: { renderAs: 'box', color: 'c-sky', labelType: 'Container' },
18
+ component: { renderAs: 'box', color: 'c-indigo', labelType: 'Component' },
19
+ database: { renderAs: 'database', color: 'c-teal', labelType: 'Database' },
20
+ object_storage: { renderAs: 'database', color: 'c-teal', labelType: 'Object Storage' },
21
+ queue: { renderAs: 'ellipse', color: 'c-amber', labelType: 'Queue' },
22
+ device: { renderAs: 'box', color: 'c-sky', labelType: 'Device' },
23
+ api: { renderAs: 'box', color: 'c-cyan', labelType: 'API' },
24
+ cloud_service: { renderAs: 'box', color: 'c-slate', labelType: 'Cloud Service' },
25
+ browser_app: { renderAs: 'box', color: 'c-sky', labelType: 'Browser App' },
26
+ mobile_app: { renderAs: 'box', color: 'c-sky', labelType: 'Mobile App' },
27
+ backend_service: { renderAs: 'box', color: 'c-sky', labelType: 'Backend Service' },
28
+ job: { renderAs: 'box', color: 'c-amber', labelType: 'Job' },
29
+ unknown: { renderAs: 'box', color: 'c-gray', labelType: 'Unknown' },
30
+ };
31
+ const NODE_STYLE_KEYS = [
32
+ 'kind',
33
+ 'renderAs',
34
+ 'description',
35
+ 'evidence',
36
+ 'fontSize',
37
+ 'textAlign',
38
+ 'textValign',
39
+ 'bgOpacity',
40
+ 'rotation',
41
+ 'labelRotation',
42
+ 'imageSrc',
43
+ 'groupId',
44
+ 'nodeLink',
45
+ 'locked',
46
+ ];
47
+ const EDGE_STYLE_KEYS = [
48
+ 'arrowDir',
49
+ 'dashes',
50
+ 'fontSize',
51
+ 'labelRotation',
52
+ 'edgeLabelOffsetX',
53
+ 'edgeLabelOffsetY',
54
+ 'fromPort',
55
+ 'toPort',
56
+ 'edgeColor',
57
+ 'edgeWidth',
58
+ 'edgeLocked',
59
+ 'edgeLabelWidth',
60
+ 'evidence',
61
+ ];
62
+ // Estimates node dimensions from label content (font ~13px, lineH ~17px, pad 16px).
63
+ // Used to size MCP-created nodes so multiline labels are not clipped.
64
+ function estimateNodeSize(label, shapeType) {
65
+ const FONT_PX = 13;
66
+ const LINE_H = Math.round(FONT_PX * 1.3); // ~17
67
+ const H_PAD = 24; // top + bottom padding
68
+ const W_PAD = 24; // left + right padding
69
+ const CHAR_W = 7.5; // approximate px per character at 13px system-ui
70
+ // Actor shape has a fixed aspect ratio — never resize it.
71
+ if (shapeType === 'actor')
72
+ return { nodeWidth: 30, nodeHeight: 52 };
73
+ const lines = label.split('\n');
74
+ const lineCount = lines.length;
75
+ const maxChars = Math.max(...lines.map(l => l.length));
76
+ const rawW = Math.max(120, Math.round(maxChars * CHAR_W) + W_PAD);
77
+ const rawH = Math.max(40, lineCount * LINE_H + H_PAD);
78
+ // Round to nearest 8px for a tidier look
79
+ const nodeWidth = Math.round(rawW / 8) * 8;
80
+ // Database caps consume ≈ H×0.12 at each end (ry = max(H×0.12, 6) in node-rendering.js).
81
+ // Divide by 0.76 so the body area fits the required text height.
82
+ const rawHFinal = shapeType === 'database' ? rawH / (1 - 0.24) : rawH;
83
+ const nodeHeight = Math.round(rawHFinal / 8) * 8;
84
+ return { nodeWidth, nodeHeight };
85
+ }
86
+ function estimateEdgeLabelWidth(label) {
87
+ if (label.length <= 24)
88
+ return 80;
89
+ if (label.length <= 36)
90
+ return 95;
91
+ return 105;
92
+ }
93
+ function estimateEdgeFontSize(label) {
94
+ return label.length > 36 ? 11 : 12;
95
+ }
96
+ function normalizeArrowDir(raw) {
97
+ if (!raw)
98
+ return 'to';
99
+ const dir = raw.toLowerCase();
100
+ if (!VALID_ARROW_DIRS.has(dir)) {
101
+ throw new Error(`Invalid arrowDir "${raw}". Allowed: to, from, both, none.`);
102
+ }
103
+ return dir;
104
+ }
105
+ function normalizePort(raw, fieldName) {
106
+ if (raw === null)
107
+ return null;
108
+ if (raw === undefined)
109
+ return undefined;
110
+ const port = raw.toUpperCase();
111
+ if (!VALID_PORTS.has(port)) {
112
+ throw new Error(`Invalid ${fieldName} "${raw}". Allowed: ${Array.from(VALID_PORTS).join(', ')}.`);
113
+ }
114
+ return port;
115
+ }
116
+ function numberOrNull(value, fallback) {
117
+ return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
118
+ }
119
+ function stringOrNull(value) {
120
+ return typeof value === 'string' ? value : null;
121
+ }
122
+ function normalizeEvidence(raw) {
123
+ if (raw === undefined)
124
+ return null;
125
+ if (!Array.isArray(raw))
126
+ throw new Error('evidence must be an array when provided.');
127
+ return raw
128
+ .map((item, index) => {
129
+ if (!item || typeof item !== 'object') {
130
+ throw new Error(`evidence[${index}] must be an object.`);
131
+ }
132
+ if (typeof item.documentId !== 'string' || !item.documentId.trim()) {
133
+ throw new Error(`evidence[${index}].documentId is required and must be a non-empty string.`);
134
+ }
135
+ return {
136
+ documentId: item.documentId,
137
+ section: typeof item.section === 'string' && item.section.trim() ? item.section : null,
138
+ summary: typeof item.summary === 'string' && item.summary.trim() ? item.summary : null,
139
+ };
140
+ });
141
+ }
142
+ function hasEvidence(items) {
143
+ return items.some(item => Array.isArray(item.evidence) && item.evidence.length > 0);
144
+ }
145
+ function resolveNodeLink(n) {
146
+ if (n.linkedDiagramId)
147
+ return { type: 'diagram', value: n.linkedDiagramId };
148
+ if (n.nodeLink &&
149
+ typeof n.nodeLink.type === 'string' &&
150
+ typeof n.nodeLink.value === 'string') {
151
+ return { type: n.nodeLink.type, value: n.nodeLink.value };
152
+ }
153
+ return null;
154
+ }
155
+ function inferPorts(fromNode, toNode) {
156
+ if (!toNode)
157
+ return { fromPort: 'E', toPort: null };
158
+ const fromX = typeof fromNode.x === 'number' ? fromNode.x : undefined;
159
+ const fromY = typeof fromNode.y === 'number' ? fromNode.y : undefined;
160
+ const toX = typeof toNode.x === 'number' ? toNode.x : undefined;
161
+ const toY = typeof toNode.y === 'number' ? toNode.y : undefined;
162
+ if (fromX === undefined || fromY === undefined || toX === undefined || toY === undefined) {
163
+ return { fromPort: 'E', toPort: 'W' };
164
+ }
165
+ const dx = toX - fromX;
166
+ const dy = toY - fromY;
167
+ if (Math.abs(dx) >= Math.abs(dy) && dx !== 0) {
168
+ return dx > 0 ? { fromPort: 'E', toPort: 'W' } : { fromPort: 'W', toPort: 'E' };
169
+ }
170
+ if (dy !== 0) {
171
+ return dy > 0 ? { fromPort: 'S', toPort: 'N' } : { fromPort: 'N', toPort: 'S' };
172
+ }
173
+ return { fromPort: 'E', toPort: 'W' };
174
+ }
175
+ function normalizeAlignedExternalSystemWidths(nodes) {
176
+ const columns = new Map();
177
+ for (const node of nodes) {
178
+ const isExternalSystem = node.shapeType === 'box' && /\[External System\]/i.test(node.label);
179
+ if (!isExternalSystem || typeof node.x !== 'number')
180
+ continue;
181
+ const column = columns.get(node.x) ?? [];
182
+ column.push(node);
183
+ columns.set(node.x, column);
184
+ }
185
+ for (const column of columns.values()) {
186
+ if (column.length < 2)
187
+ continue;
188
+ const maxWidth = Math.max(...column.map(n => Number(n.nodeWidth) || 0));
189
+ for (const node of column)
190
+ node.nodeWidth = maxWidth;
191
+ }
192
+ }
193
+ function nodeKind(node) {
194
+ return typeof node.kind === 'string' ? node.kind : '';
195
+ }
196
+ function nodeLabel(node) {
197
+ return typeof node.label === 'string' ? node.label : '';
198
+ }
199
+ function isActorNode(node) {
200
+ return node.shapeType === 'actor' || nodeKind(node) === 'person';
201
+ }
202
+ function isDatabaseNode(node) {
203
+ return node.shapeType === 'database' || ['database', 'object_storage'].includes(nodeKind(node));
204
+ }
205
+ function isCentralSystemNode(node) {
206
+ const kind = nodeKind(node);
207
+ return ['software_system', 'container', 'component', 'api', 'backend_service'].includes(kind);
208
+ }
209
+ function isExternalSystemNode(node) {
210
+ const kind = nodeKind(node);
211
+ return kind === 'external_system' || /\[External System\]/i.test(nodeLabel(node));
212
+ }
213
+ function hasPosition(node) {
214
+ return typeof node.x === 'number' && typeof node.y === 'number';
215
+ }
216
+ function spreadAtX(nodes, x, step = 280, centerY = 0) {
217
+ const startY = centerY - ((nodes.length - 1) * step) / 2;
218
+ nodes.forEach((node, index) => {
219
+ if (!hasPosition(node)) {
220
+ node.x = x;
221
+ node.y = Math.round((startY + index * step) / 40) * 40;
222
+ }
223
+ });
224
+ }
225
+ function gridPlace(nodes, columns, startX, startY, stepX, stepY) {
226
+ nodes.forEach((node, index) => {
227
+ if (hasPosition(node))
228
+ return;
229
+ node.x = startX + (index % columns) * stepX;
230
+ node.y = startY + Math.floor(index / columns) * stepY;
231
+ });
232
+ }
233
+ function applyContextLayout(nodes) {
234
+ const unpositioned = nodes.filter(node => !hasPosition(node));
235
+ if (!unpositioned.length)
236
+ return;
237
+ const actors = unpositioned.filter(isActorNode);
238
+ const stores = unpositioned.filter(isDatabaseNode);
239
+ const externals = unpositioned.filter(node => isExternalSystemNode(node) && !isDatabaseNode(node));
240
+ const centralCandidates = unpositioned.filter(node => isCentralSystemNode(node) &&
241
+ !isActorNode(node) &&
242
+ !isDatabaseNode(node) &&
243
+ !isExternalSystemNode(node));
244
+ const central = centralCandidates.slice(0, Math.max(1, Math.min(centralCandidates.length, 2)));
245
+ const centralSet = new Set(central);
246
+ const remaining = unpositioned.filter(node => !actors.includes(node) &&
247
+ !stores.includes(node) &&
248
+ !externals.includes(node) &&
249
+ !centralSet.has(node));
250
+ spreadAtX(actors, -880, 280);
251
+ spreadAtX(central, -280, 280);
252
+ spreadAtX(remaining, 360, 280);
253
+ const rightColumn = [...externals, ...stores];
254
+ if (rightColumn.length <= 3) {
255
+ spreadAtX(rightColumn, 920, 280);
256
+ }
257
+ else {
258
+ gridPlace(rightColumn, 2, 760, -280, 360, 280);
259
+ }
260
+ }
261
+ function applyFlowLayout(nodes) {
262
+ const unpositioned = nodes.filter(node => !hasPosition(node));
263
+ if (!unpositioned.length)
264
+ return;
265
+ const stepX = 320;
266
+ const startX = -Math.round(((unpositioned.length - 1) * stepX) / 2 / 40) * 40;
267
+ unpositioned.forEach((node, index) => {
268
+ node.x = startX + index * stepX;
269
+ node.y = 0;
270
+ });
271
+ }
272
+ function applyGridLayout(nodes) {
273
+ const unpositioned = nodes.filter(node => !hasPosition(node));
274
+ if (!unpositioned.length)
275
+ return;
276
+ const columns = Math.min(3, Math.max(1, Math.ceil(Math.sqrt(unpositioned.length))));
277
+ const startX = -Math.round(((columns - 1) * 360) / 2 / 40) * 40;
278
+ gridPlace(unpositioned, columns, startX, -240, 360, 240);
279
+ }
280
+ function applyDeterministicLayout(diagramType, nodes) {
281
+ if (!nodes.some(node => !hasPosition(node)))
282
+ return;
283
+ if (diagramType === 'screen-guide')
284
+ return;
285
+ if (diagramType === 'context') {
286
+ applyContextLayout(nodes);
287
+ return;
288
+ }
289
+ if (diagramType === 'flow') {
290
+ applyFlowLayout(nodes);
291
+ return;
292
+ }
293
+ applyGridLayout(nodes);
294
+ }
295
+ function copyExistingFields(source, target, keys) {
296
+ for (const key of keys) {
297
+ if (Object.prototype.hasOwnProperty.call(source, key))
298
+ target[key] = source[key];
299
+ }
300
+ return target;
301
+ }
302
+ // Maps semantic type names → vis-network shape properties.
303
+ // All shapes are rendered via the frontend's ctxRenderer (shape: 'custom'),
304
+ // but we keep `shape` here for backward compatibility with older stored diagrams.
305
+ const SHAPE_MAP = {
306
+ box: { shape: 'box', shapeType: 'box' },
307
+ rectangle: { shape: 'box', shapeType: 'box' },
308
+ system: { shape: 'box', shapeType: 'box' },
309
+ container: { shape: 'box', shapeType: 'box' },
310
+ component: { shape: 'box', shapeType: 'box' },
311
+ actor: { shape: 'custom', shapeType: 'actor' },
312
+ person: { shape: 'custom', shapeType: 'actor' },
313
+ user: { shape: 'custom', shapeType: 'actor' },
314
+ database: { shape: 'database', shapeType: 'database' },
315
+ db: { shape: 'database', shapeType: 'database' },
316
+ datastore: { shape: 'database', shapeType: 'database' },
317
+ ellipse: { shape: 'ellipse', shapeType: 'ellipse' },
318
+ circle: { shape: 'circle', shapeType: 'circle' },
319
+ 'post-it': { shape: 'custom', shapeType: 'post-it' },
320
+ postit: { shape: 'custom', shapeType: 'post-it' },
321
+ note: { shape: 'custom', shapeType: 'post-it' },
322
+ 'text-free': { shape: 'custom', shapeType: 'text-free' },
323
+ text: { shape: 'custom', shapeType: 'text-free' },
324
+ image: { shape: 'custom', shapeType: 'image' },
325
+ screenshot: { shape: 'custom', shapeType: 'image' },
326
+ anchor: { shape: 'custom', shapeType: 'anchor' },
327
+ };
328
+ // Maps short color names → colorKey values from constants.js
329
+ const COLOR_ALIASES = {
330
+ blue: 'c-blue', green: 'c-green', gray: 'c-gray', grey: 'c-gray',
331
+ amber: 'c-amber', rose: 'c-rose', purple: 'c-purple', teal: 'c-teal',
332
+ orange: 'c-orange', cyan: 'c-cyan', indigo: 'c-indigo', pink: 'c-pink',
333
+ lime: 'c-lime', red: 'c-red', sky: 'c-sky', slate: 'c-slate',
334
+ white: 'c-gray',
335
+ };
336
+ const VALID_COLOR_KEYS = new Set([
337
+ 'c-gray', 'c-blue', 'c-green', 'c-amber', 'c-rose', 'c-purple',
338
+ 'c-teal', 'c-orange', 'c-cyan', 'c-indigo', 'c-pink', 'c-lime',
339
+ 'c-red', 'c-sky', 'c-slate',
340
+ ]);
341
+ function resolveColor(raw) {
342
+ if (!raw)
343
+ return 'c-blue';
344
+ const key = raw.toLowerCase();
345
+ if (VALID_COLOR_KEYS.has(key))
346
+ return key;
347
+ return COLOR_ALIASES[key] ?? 'c-blue';
348
+ }
349
+ function normalizeKind(raw) {
350
+ if (!raw)
351
+ return null;
352
+ const kind = raw.toLowerCase();
353
+ if (!KIND_DEFAULTS[kind]) {
354
+ throw new Error(`Invalid kind "${raw}". Allowed: ${Object.keys(KIND_DEFAULTS).join(', ')}.`);
355
+ }
356
+ return kind;
357
+ }
358
+ function resolveRenderAs(n, kind) {
359
+ return n.renderAs ?? (kind ? KIND_DEFAULTS[kind].renderAs : n.type ?? 'box');
360
+ }
361
+ function resolveNodeColor(n, kind) {
362
+ return resolveColor(n.color ?? (kind ? KIND_DEFAULTS[kind].color : undefined));
363
+ }
364
+ function buildNodeLabel(n, kind) {
365
+ if (!kind || n.name.includes('\n'))
366
+ return n.name;
367
+ const lines = [n.name, `[${KIND_DEFAULTS[kind].labelType}]`];
368
+ if (n.description && n.description.trim())
369
+ lines.push(n.description.trim());
370
+ return lines.join('\n');
371
+ }
372
+ function diagramsFilePath(docsPath) {
373
+ return path_1.default.join(docsPath, '.diagrams.json');
374
+ }
375
+ function loadDiagrams(docsPath) {
376
+ const fp = diagramsFilePath(docsPath);
377
+ if (!fs_1.default.existsSync(fp))
378
+ return [];
379
+ try {
380
+ return JSON.parse(fs_1.default.readFileSync(fp, 'utf-8'));
381
+ }
382
+ catch {
383
+ return [];
384
+ }
385
+ }
386
+ function saveDiagrams(docsPath, diagrams) {
387
+ fs_1.default.writeFileSync(diagramsFilePath(docsPath), JSON.stringify(diagrams, null, 2), 'utf-8');
388
+ }
389
+ // ── Tool handlers ─────────────────────────────────────────────────────────────
390
+ function toolListDiagrams(docsPath) {
391
+ const list = loadDiagrams(docsPath).map(({ id, title }) => ({ id, title }));
392
+ return { content: [{ type: 'text', text: JSON.stringify(list, null, 2) }] };
393
+ }
394
+ function toolReadDiagram(docsPath, args) {
395
+ const all = loadDiagrams(docsPath);
396
+ const diagram = all.find(d => d.id === args.id);
397
+ if (!diagram)
398
+ throw new Error(`Diagram not found: "${args.id}"`);
399
+ // Build id→label map for edge resolution
400
+ const idToLabel = {};
401
+ for (const n of diagram.nodes)
402
+ idToLabel[n.id] = n.label;
403
+ const nodes = diagram.nodes.map(n => copyExistingFields(n, {
404
+ name: n.label,
405
+ type: n.shapeType,
406
+ color: n.colorKey,
407
+ ...(n.x !== undefined ? { x: n.x } : {}),
408
+ ...(n.y !== undefined ? { y: n.y } : {}),
409
+ ...(n.nodeWidth !== undefined ? { width: n.nodeWidth } : {}),
410
+ ...(n.nodeHeight !== undefined ? { height: n.nodeHeight } : {}),
411
+ }, NODE_STYLE_KEYS));
412
+ const edges = diagram.edges.map(e => copyExistingFields(e, {
413
+ from: idToLabel[e.from] ?? e.from,
414
+ ...(e.to !== undefined ? { to: idToLabel[e.to] ?? e.to } : {}),
415
+ ...(e.label !== undefined ? { label: e.label } : {}),
416
+ }, EDGE_STYLE_KEYS));
417
+ return {
418
+ content: [{
419
+ type: 'text',
420
+ text: JSON.stringify({
421
+ id: diagram.id,
422
+ title: diagram.title,
423
+ ...(diagram.edgesStraight !== undefined ? { edgesStraight: diagram.edgesStraight } : {}),
424
+ ...(diagram.gridEnabled !== undefined ? { gridEnabled: diagram.gridEnabled } : {}),
425
+ ...(diagram.alignGuides !== undefined ? { alignGuides: diagram.alignGuides } : {}),
426
+ nodes,
427
+ edges,
428
+ }, null, 2),
429
+ }],
430
+ };
431
+ }
432
+ const VALID_DIAGRAM_TYPES = new Set(['context', 'container', 'component', 'uml', 'flow', 'erd', 'screen-guide', 'other']);
433
+ const EXPLICIT_ONLY_TYPES = new Set(['container', 'component', 'uml', 'screen-guide']);
434
+ const CONTEXT_NODE_SOFT_LIMIT = 10;
435
+ function toolCreateDiagram(docsPath, args) {
436
+ const diagramType = (args.diagramType ?? '').toLowerCase();
437
+ if (!diagramType) {
438
+ throw new Error('diagramType is required. Use "context" for the default big-picture diagram; ' +
439
+ '"container", "component", or "uml" only when the user explicitly asked for that type ' +
440
+ '(and pass userRequestedExplicitly: true). Other values: "flow", "erd", "other".');
441
+ }
442
+ if (!VALID_DIAGRAM_TYPES.has(diagramType)) {
443
+ throw new Error(`Unknown diagramType "${args.diagramType}". Allowed: ${Array.from(VALID_DIAGRAM_TYPES).join(', ')}.`);
444
+ }
445
+ if (EXPLICIT_ONLY_TYPES.has(diagramType) && !args.userRequestedExplicitly) {
446
+ throw new Error(`diagramType "${diagramType}" requires explicit user request. ` +
447
+ `Only set userRequestedExplicitly: true if the user asked for a "${diagramType} diagram" by name. ` +
448
+ `If the request was generic ("a diagram", "the big picture", "documentation"), use diagramType: "context" instead.`);
449
+ }
450
+ const id = args.id ?? `d${Date.now()}`;
451
+ // Build name→id map for edge resolution
452
+ const nameToId = {};
453
+ const nodes = args.nodes.map((n, i) => {
454
+ const nodeId = `n${i + 1}`;
455
+ const kind = normalizeKind(n.kind);
456
+ const renderAs = resolveRenderAs(n, kind);
457
+ const label = buildNodeLabel(n, kind);
458
+ nameToId[n.name] = nodeId;
459
+ nameToId[label] = nodeId;
460
+ const shapeInfo = SHAPE_MAP[renderAs.toLowerCase()] ?? { shape: 'box', shapeType: 'box' };
461
+ if (shapeInfo.shapeType === 'image' && !n.imageSrc) {
462
+ throw new Error(`Node "${n.name || `#${i + 1}`}" uses type "image" but is missing \`imageSrc\`. ` +
463
+ `Upload the image via POST /api/images/upload and pass the returned URL (e.g. "/images/foo.png").`);
464
+ }
465
+ const estimated = estimateNodeSize(label, shapeInfo.shapeType);
466
+ const nodeWidth = n.width ?? estimated.nodeWidth;
467
+ const nodeHeight = n.height ?? estimated.nodeHeight;
468
+ const node = {
469
+ id: nodeId,
470
+ label,
471
+ shape: shapeInfo.shape,
472
+ shapeType: shapeInfo.shapeType,
473
+ kind,
474
+ renderAs: shapeInfo.shapeType,
475
+ description: stringOrNull(n.description),
476
+ evidence: normalizeEvidence(n.evidence),
477
+ colorKey: resolveNodeColor(n, kind),
478
+ nodeWidth,
479
+ nodeHeight,
480
+ fontSize: numberOrNull(n.fontSize, null),
481
+ textAlign: stringOrNull(n.textAlign),
482
+ textValign: stringOrNull(n.textValign),
483
+ bgOpacity: numberOrNull(n.bgOpacity, null),
484
+ rotation: numberOrNull(n.rotation, 0),
485
+ labelRotation: numberOrNull(n.labelRotation, 0),
486
+ imageSrc: stringOrNull(n.imageSrc),
487
+ groupId: stringOrNull(n.groupId),
488
+ nodeLink: resolveNodeLink(n),
489
+ locked: n.locked === true,
490
+ };
491
+ if (n.x !== undefined)
492
+ node.x = n.x;
493
+ if (n.y !== undefined)
494
+ node.y = n.y;
495
+ return node;
496
+ });
497
+ normalizeAlignedExternalSystemWidths(nodes);
498
+ applyDeterministicLayout(diagramType, nodes);
499
+ normalizeAlignedExternalSystemWidths(nodes);
500
+ const edges = args.edges.map((e, i) => {
501
+ const fromId = nameToId[e.from];
502
+ if (!fromId)
503
+ throw new Error(`Edge references unknown node: "${e.from}"`);
504
+ const fromNode = nodes.find(n => n.id === fromId);
505
+ if (!fromNode)
506
+ throw new Error(`Edge references unknown node: "${e.from}"`);
507
+ const label = e.label ?? '';
508
+ const edge = {
509
+ id: `e${i + 1}`,
510
+ from: fromId,
511
+ to: '',
512
+ label,
513
+ arrowDir: normalizeArrowDir(e.arrowDir),
514
+ dashes: e.dashes === true,
515
+ fontSize: numberOrNull(e.fontSize, estimateEdgeFontSize(label)),
516
+ labelRotation: numberOrNull(e.labelRotation, 0),
517
+ edgeLabelOffsetX: numberOrNull(e.edgeLabelOffsetX, 0),
518
+ edgeLabelOffsetY: numberOrNull(e.edgeLabelOffsetY, 0),
519
+ edgeColor: stringOrNull(e.edgeColor),
520
+ edgeWidth: numberOrNull(e.edgeWidth, null),
521
+ edgeLocked: e.edgeLocked === true,
522
+ edgeLabelWidth: numberOrNull(e.edgeLabelWidth, estimateEdgeLabelWidth(label)),
523
+ evidence: normalizeEvidence(e.evidence),
524
+ };
525
+ let toNode;
526
+ if (e.to !== undefined && e.to !== '') {
527
+ const toId = nameToId[e.to];
528
+ if (!toId)
529
+ throw new Error(`Edge references unknown node: "${e.to}"`);
530
+ edge.to = toId;
531
+ toNode = nodes.find(n => n.id === toId);
532
+ }
533
+ else {
534
+ delete edge.to;
535
+ }
536
+ const inferredPorts = inferPorts(fromNode, toNode);
537
+ const fromPort = normalizePort(e.fromPort, 'fromPort') ?? inferredPorts.fromPort;
538
+ const toPort = normalizePort(e.toPort, 'toPort') ?? inferredPorts.toPort;
539
+ edge.fromPort = fromPort;
540
+ edge.toPort = toPort;
541
+ return edge;
542
+ });
543
+ const diagram = {
544
+ id,
545
+ title: args.title,
546
+ nodes,
547
+ edges,
548
+ edgesStraight: args.edgesStraight ?? false,
549
+ gridEnabled: args.gridEnabled ?? false,
550
+ alignGuides: args.alignGuides ?? true,
551
+ };
552
+ const all = loadDiagrams(docsPath);
553
+ const existingIndex = all.findIndex(d => d.id === id);
554
+ if (existingIndex !== -1) {
555
+ all[existingIndex] = diagram;
556
+ }
557
+ else {
558
+ all.push(diagram);
559
+ }
560
+ saveDiagrams(docsPath, all);
561
+ const warnings = [];
562
+ if (diagramType !== 'screen-guide') {
563
+ const unlabeledEdges = args.edges.filter(e => !e.label || !e.label.trim()).length;
564
+ if (unlabeledEdges > 0) {
565
+ warnings.push(`${unlabeledEdges} edge(s) have no label. Every edge should describe the interaction as a verb phrase ` +
566
+ `("authenticates", "publishes events to", "reads from").`);
567
+ }
568
+ }
569
+ if (diagramType === 'context' && nodes.length > CONTEXT_NODE_SOFT_LIMIT) {
570
+ warnings.push(`Context diagram has ${nodes.length} nodes — keep it ≤ ${CONTEXT_NODE_SOFT_LIMIT} for readability. ` +
571
+ `If the system is too large, create a container diagram for the detailed view instead.`);
572
+ }
573
+ if (['context', 'container', 'component', 'uml'].includes(diagramType) &&
574
+ !hasEvidence(nodes) &&
575
+ !hasEvidence(edges)) {
576
+ warnings.push('Diagram has no evidence metadata. Consider adding document references for auditability.');
577
+ }
578
+ return {
579
+ content: [{
580
+ type: 'text',
581
+ text: JSON.stringify({
582
+ success: true,
583
+ id,
584
+ title: args.title,
585
+ diagramType,
586
+ nodeCount: nodes.length,
587
+ edgeCount: edges.length,
588
+ editorUrl: `/diagram?id=${id}`,
589
+ ...(warnings.length ? { warnings } : {}),
590
+ }, null, 2),
591
+ }],
592
+ };
593
+ }
594
+ //# sourceMappingURL=diagrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../../../src/mcp/tools/diagrams.ts"],"names":[],"mappings":"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"}