@nahisaho/musubix-core 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 (214) hide show
  1. package/bin/musubix.js +18 -0
  2. package/dist/__tests__/index.test.d.ts +2 -0
  3. package/dist/__tests__/index.test.d.ts.map +1 -0
  4. package/dist/__tests__/index.test.js +27 -0
  5. package/dist/__tests__/index.test.js.map +1 -0
  6. package/dist/auth/auth-manager.d.ts +320 -0
  7. package/dist/auth/auth-manager.d.ts.map +1 -0
  8. package/dist/auth/auth-manager.js +580 -0
  9. package/dist/auth/auth-manager.js.map +1 -0
  10. package/dist/cli/base.d.ts +58 -0
  11. package/dist/cli/base.d.ts.map +1 -0
  12. package/dist/cli/base.js +93 -0
  13. package/dist/cli/base.js.map +1 -0
  14. package/dist/cli/commands/help.d.ts +17 -0
  15. package/dist/cli/commands/help.d.ts.map +1 -0
  16. package/dist/cli/commands/help.js +228 -0
  17. package/dist/cli/commands/help.js.map +1 -0
  18. package/dist/cli/commands/index.d.ts +14 -0
  19. package/dist/cli/commands/index.d.ts.map +1 -0
  20. package/dist/cli/commands/index.js +25 -0
  21. package/dist/cli/commands/index.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +38 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +258 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/index.d.ts +9 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +9 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/codegen/coding-standards.d.ts +250 -0
  31. package/dist/codegen/coding-standards.d.ts.map +1 -0
  32. package/dist/codegen/coding-standards.js +976 -0
  33. package/dist/codegen/coding-standards.js.map +1 -0
  34. package/dist/codegen/coverage-reporter.d.ts +264 -0
  35. package/dist/codegen/coverage-reporter.d.ts.map +1 -0
  36. package/dist/codegen/coverage-reporter.js +697 -0
  37. package/dist/codegen/coverage-reporter.js.map +1 -0
  38. package/dist/codegen/dependency-analyzer.d.ts +271 -0
  39. package/dist/codegen/dependency-analyzer.d.ts.map +1 -0
  40. package/dist/codegen/dependency-analyzer.js +661 -0
  41. package/dist/codegen/dependency-analyzer.js.map +1 -0
  42. package/dist/codegen/generator.d.ts +275 -0
  43. package/dist/codegen/generator.d.ts.map +1 -0
  44. package/dist/codegen/generator.js +781 -0
  45. package/dist/codegen/generator.js.map +1 -0
  46. package/dist/codegen/index.d.ts +18 -0
  47. package/dist/codegen/index.d.ts.map +1 -0
  48. package/dist/codegen/index.js +27 -0
  49. package/dist/codegen/index.js.map +1 -0
  50. package/dist/codegen/integration-test-generator.d.ts +312 -0
  51. package/dist/codegen/integration-test-generator.d.ts.map +1 -0
  52. package/dist/codegen/integration-test-generator.js +765 -0
  53. package/dist/codegen/integration-test-generator.js.map +1 -0
  54. package/dist/codegen/pattern-conformance.d.ts +309 -0
  55. package/dist/codegen/pattern-conformance.d.ts.map +1 -0
  56. package/dist/codegen/pattern-conformance.js +590 -0
  57. package/dist/codegen/pattern-conformance.js.map +1 -0
  58. package/dist/codegen/quality-metrics.d.ts +235 -0
  59. package/dist/codegen/quality-metrics.d.ts.map +1 -0
  60. package/dist/codegen/quality-metrics.js +439 -0
  61. package/dist/codegen/quality-metrics.js.map +1 -0
  62. package/dist/codegen/security-scanner.d.ts +179 -0
  63. package/dist/codegen/security-scanner.d.ts.map +1 -0
  64. package/dist/codegen/security-scanner.js +495 -0
  65. package/dist/codegen/security-scanner.js.map +1 -0
  66. package/dist/codegen/static-analyzer.d.ts +188 -0
  67. package/dist/codegen/static-analyzer.d.ts.map +1 -0
  68. package/dist/codegen/static-analyzer.js +490 -0
  69. package/dist/codegen/static-analyzer.js.map +1 -0
  70. package/dist/codegen/unit-test-generator.d.ts +289 -0
  71. package/dist/codegen/unit-test-generator.d.ts.map +1 -0
  72. package/dist/codegen/unit-test-generator.js +634 -0
  73. package/dist/codegen/unit-test-generator.js.map +1 -0
  74. package/dist/design/adr-generator.d.ts +227 -0
  75. package/dist/design/adr-generator.d.ts.map +1 -0
  76. package/dist/design/adr-generator.js +423 -0
  77. package/dist/design/adr-generator.js.map +1 -0
  78. package/dist/design/c4-generator.d.ts +267 -0
  79. package/dist/design/c4-generator.d.ts.map +1 -0
  80. package/dist/design/c4-generator.js +453 -0
  81. package/dist/design/c4-generator.js.map +1 -0
  82. package/dist/design/framework-optimizer.d.ts +190 -0
  83. package/dist/design/framework-optimizer.d.ts.map +1 -0
  84. package/dist/design/framework-optimizer.js +589 -0
  85. package/dist/design/framework-optimizer.js.map +1 -0
  86. package/dist/design/index.d.ts +12 -0
  87. package/dist/design/index.d.ts.map +1 -0
  88. package/dist/design/index.js +13 -0
  89. package/dist/design/index.js.map +1 -0
  90. package/dist/design/pattern-detector.d.ts +270 -0
  91. package/dist/design/pattern-detector.d.ts.map +1 -0
  92. package/dist/design/pattern-detector.js +621 -0
  93. package/dist/design/pattern-detector.js.map +1 -0
  94. package/dist/design/solid-validator.d.ts +188 -0
  95. package/dist/design/solid-validator.d.ts.map +1 -0
  96. package/dist/design/solid-validator.js +579 -0
  97. package/dist/design/solid-validator.js.map +1 -0
  98. package/dist/error/data-persistence.d.ts +311 -0
  99. package/dist/error/data-persistence.d.ts.map +1 -0
  100. package/dist/error/data-persistence.js +586 -0
  101. package/dist/error/data-persistence.js.map +1 -0
  102. package/dist/error/graceful-degradation.d.ts +309 -0
  103. package/dist/error/graceful-degradation.d.ts.map +1 -0
  104. package/dist/error/graceful-degradation.js +510 -0
  105. package/dist/error/graceful-degradation.js.map +1 -0
  106. package/dist/error/index.d.ts +11 -0
  107. package/dist/error/index.d.ts.map +1 -0
  108. package/dist/error/index.js +19 -0
  109. package/dist/error/index.js.map +1 -0
  110. package/dist/explanation/explanation-generator.d.ts +228 -0
  111. package/dist/explanation/explanation-generator.d.ts.map +1 -0
  112. package/dist/explanation/explanation-generator.js +662 -0
  113. package/dist/explanation/explanation-generator.js.map +1 -0
  114. package/dist/explanation/index.d.ts +11 -0
  115. package/dist/explanation/index.d.ts.map +1 -0
  116. package/dist/explanation/index.js +19 -0
  117. package/dist/explanation/index.js.map +1 -0
  118. package/dist/explanation/reasoning-chain.d.ts +314 -0
  119. package/dist/explanation/reasoning-chain.d.ts.map +1 -0
  120. package/dist/explanation/reasoning-chain.js +414 -0
  121. package/dist/explanation/reasoning-chain.js.map +1 -0
  122. package/dist/explanation/visual-explanation.d.ts +315 -0
  123. package/dist/explanation/visual-explanation.d.ts.map +1 -0
  124. package/dist/explanation/visual-explanation.js +667 -0
  125. package/dist/explanation/visual-explanation.js.map +1 -0
  126. package/dist/index.d.ts +33 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +47 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/requirements/decomposer.d.ts +235 -0
  131. package/dist/requirements/decomposer.d.ts.map +1 -0
  132. package/dist/requirements/decomposer.js +587 -0
  133. package/dist/requirements/decomposer.js.map +1 -0
  134. package/dist/requirements/related-finder.d.ts +261 -0
  135. package/dist/requirements/related-finder.d.ts.map +1 -0
  136. package/dist/requirements/related-finder.js +629 -0
  137. package/dist/requirements/related-finder.js.map +1 -0
  138. package/dist/traceability/impact.d.ts +196 -0
  139. package/dist/traceability/impact.d.ts.map +1 -0
  140. package/dist/traceability/impact.js +438 -0
  141. package/dist/traceability/impact.js.map +1 -0
  142. package/dist/traceability/index.d.ts +9 -0
  143. package/dist/traceability/index.d.ts.map +1 -0
  144. package/dist/traceability/index.js +10 -0
  145. package/dist/traceability/index.js.map +1 -0
  146. package/dist/traceability/manager.d.ts +266 -0
  147. package/dist/traceability/manager.d.ts.map +1 -0
  148. package/dist/traceability/manager.js +412 -0
  149. package/dist/traceability/manager.js.map +1 -0
  150. package/dist/types/common.d.ts +294 -0
  151. package/dist/types/common.d.ts.map +1 -0
  152. package/dist/types/common.js +15 -0
  153. package/dist/types/common.js.map +1 -0
  154. package/dist/types/ears.d.ts +158 -0
  155. package/dist/types/ears.d.ts.map +1 -0
  156. package/dist/types/ears.js +33 -0
  157. package/dist/types/ears.js.map +1 -0
  158. package/dist/types/errors.d.ts +176 -0
  159. package/dist/types/errors.d.ts.map +1 -0
  160. package/dist/types/errors.js +55 -0
  161. package/dist/types/errors.js.map +1 -0
  162. package/dist/types/index.d.ts +10 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +10 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/utils/data-protector.d.ts +122 -0
  167. package/dist/utils/data-protector.d.ts.map +1 -0
  168. package/dist/utils/data-protector.js +275 -0
  169. package/dist/utils/data-protector.js.map +1 -0
  170. package/dist/utils/error-handler.d.ts +101 -0
  171. package/dist/utils/error-handler.d.ts.map +1 -0
  172. package/dist/utils/error-handler.js +324 -0
  173. package/dist/utils/error-handler.js.map +1 -0
  174. package/dist/utils/i18n-manager.d.ts +259 -0
  175. package/dist/utils/i18n-manager.d.ts.map +1 -0
  176. package/dist/utils/i18n-manager.js +554 -0
  177. package/dist/utils/i18n-manager.js.map +1 -0
  178. package/dist/utils/index.d.ts +10 -0
  179. package/dist/utils/index.d.ts.map +1 -0
  180. package/dist/utils/index.js +10 -0
  181. package/dist/utils/index.js.map +1 -0
  182. package/dist/utils/logger.d.ts +120 -0
  183. package/dist/utils/logger.d.ts.map +1 -0
  184. package/dist/utils/logger.js +237 -0
  185. package/dist/utils/logger.js.map +1 -0
  186. package/dist/utils/performance-profiler.d.ts +251 -0
  187. package/dist/utils/performance-profiler.d.ts.map +1 -0
  188. package/dist/utils/performance-profiler.js +458 -0
  189. package/dist/utils/performance-profiler.js.map +1 -0
  190. package/dist/utils/scalability-optimizer.d.ts +294 -0
  191. package/dist/utils/scalability-optimizer.d.ts.map +1 -0
  192. package/dist/utils/scalability-optimizer.js +606 -0
  193. package/dist/utils/scalability-optimizer.js.map +1 -0
  194. package/dist/utils/structured-logger.d.ts +294 -0
  195. package/dist/utils/structured-logger.d.ts.map +1 -0
  196. package/dist/utils/structured-logger.js +630 -0
  197. package/dist/utils/structured-logger.js.map +1 -0
  198. package/dist/utils/version-compatibility.d.ts +217 -0
  199. package/dist/utils/version-compatibility.d.ts.map +1 -0
  200. package/dist/utils/version-compatibility.js +443 -0
  201. package/dist/utils/version-compatibility.js.map +1 -0
  202. package/dist/validators/ears-validator.d.ts +182 -0
  203. package/dist/validators/ears-validator.d.ts.map +1 -0
  204. package/dist/validators/ears-validator.js +357 -0
  205. package/dist/validators/ears-validator.js.map +1 -0
  206. package/dist/validators/index.d.ts +8 -0
  207. package/dist/validators/index.d.ts.map +1 -0
  208. package/dist/validators/index.js +9 -0
  209. package/dist/validators/index.js.map +1 -0
  210. package/dist/version.d.ts +8 -0
  211. package/dist/version.d.ts.map +1 -0
  212. package/dist/version.js +8 -0
  213. package/dist/version.js.map +1 -0
  214. package/package.json +100 -0
@@ -0,0 +1,667 @@
1
+ /**
2
+ * Visual Explanation Generator
3
+ *
4
+ * Generates visual diagrams and explanations for complex concepts
5
+ *
6
+ * @packageDocumentation
7
+ * @module explanation/visual
8
+ *
9
+ * @see REQ-EXP-003 - Visual Explanation Generation
10
+ * @see Article VI - Explainable AI
11
+ */
12
+ /**
13
+ * Default themes
14
+ */
15
+ export const DIAGRAM_THEMES = {
16
+ default: {
17
+ primary: '#2196F3',
18
+ secondary: '#4CAF50',
19
+ background: '#FFFFFF',
20
+ text: '#333333',
21
+ accents: ['#FF9800', '#9C27B0', '#00BCD4'],
22
+ },
23
+ dark: {
24
+ primary: '#90CAF9',
25
+ secondary: '#A5D6A7',
26
+ background: '#1E1E1E',
27
+ text: '#FFFFFF',
28
+ accents: ['#FFB74D', '#CE93D8', '#80DEEA'],
29
+ },
30
+ minimal: {
31
+ primary: '#666666',
32
+ secondary: '#999999',
33
+ background: '#FFFFFF',
34
+ text: '#333333',
35
+ accents: ['#888888', '#AAAAAA', '#CCCCCC'],
36
+ },
37
+ };
38
+ /**
39
+ * Default configuration
40
+ */
41
+ export const DEFAULT_VISUAL_CONFIG = {
42
+ defaultType: 'flowchart',
43
+ defaultFormat: 'mermaid',
44
+ defaultTheme: 'default',
45
+ includeNarrative: true,
46
+ includeInsights: true,
47
+ maxElements: 50,
48
+ };
49
+ /**
50
+ * Visual Explanation Generator
51
+ */
52
+ export class VisualExplanationGenerator {
53
+ config;
54
+ elementCounter = 0;
55
+ constructor(config) {
56
+ this.config = { ...DEFAULT_VISUAL_CONFIG, ...config };
57
+ }
58
+ /**
59
+ * Generate visual explanation
60
+ */
61
+ generate(context, diagramType) {
62
+ const type = diagramType ?? this.config.defaultType;
63
+ // Create diagram structure
64
+ const diagram = this.createDiagram(context, type);
65
+ // Generate narrative
66
+ const narrative = this.config.includeNarrative
67
+ ? this.generateNarrative(context, diagram)
68
+ : '';
69
+ // Extract insights
70
+ const insights = this.config.includeInsights
71
+ ? this.extractInsights(context, diagram)
72
+ : [];
73
+ // Render in multiple formats
74
+ const rendered = this.renderAllFormats(diagram);
75
+ return {
76
+ diagram,
77
+ narrative,
78
+ insights,
79
+ rendered,
80
+ relatedConcepts: this.findRelatedConcepts(context),
81
+ };
82
+ }
83
+ /**
84
+ * Create diagram from context
85
+ */
86
+ createDiagram(context, type) {
87
+ const theme = DIAGRAM_THEMES[this.config.defaultTheme];
88
+ const diagram = {
89
+ id: this.generateId('diagram'),
90
+ title: `${context.subject} Overview`,
91
+ type,
92
+ description: context.additionalContext,
93
+ elements: [],
94
+ direction: 'TB',
95
+ theme,
96
+ };
97
+ // Generate elements based on diagram type
98
+ switch (type) {
99
+ case 'flowchart':
100
+ diagram.elements = this.generateFlowchartElements(context);
101
+ break;
102
+ case 'sequence':
103
+ diagram.elements = this.generateSequenceElements(context);
104
+ break;
105
+ case 'class':
106
+ diagram.elements = this.generateClassElements(context);
107
+ break;
108
+ case 'mindmap':
109
+ diagram.elements = this.generateMindmapElements(context);
110
+ break;
111
+ case 'state':
112
+ diagram.elements = this.generateStateElements(context);
113
+ break;
114
+ case 'component':
115
+ diagram.elements = this.generateComponentElements(context);
116
+ break;
117
+ default:
118
+ diagram.elements = this.generateGenericElements(context);
119
+ }
120
+ return diagram;
121
+ }
122
+ /**
123
+ * Generate flowchart elements
124
+ */
125
+ generateFlowchartElements(context) {
126
+ const elements = [];
127
+ // Start node
128
+ const start = this.createNode('Start', 'Begin process', { shape: 'ellipse' });
129
+ elements.push(start);
130
+ // Process steps based on complexity
131
+ const steps = this.deriveProcessSteps(context);
132
+ let prevId = start.id;
133
+ for (const step of steps) {
134
+ const node = this.createNode(step.name, step.description, { shape: 'rectangle' });
135
+ elements.push(node);
136
+ const edge = this.createEdge(prevId, node.id, step.transition);
137
+ elements.push(edge);
138
+ prevId = node.id;
139
+ }
140
+ // End node
141
+ const end = this.createNode('End', 'Process complete', { shape: 'ellipse' });
142
+ elements.push(end);
143
+ elements.push(this.createEdge(prevId, end.id, ''));
144
+ return elements;
145
+ }
146
+ /**
147
+ * Generate sequence diagram elements
148
+ */
149
+ generateSequenceElements(context) {
150
+ const elements = [];
151
+ // Participants
152
+ const participants = this.deriveParticipants(context);
153
+ for (const p of participants) {
154
+ elements.push(this.createNode(p.name, p.role, { shape: 'rectangle' }));
155
+ }
156
+ // Interactions
157
+ const interactions = this.deriveInteractions(context);
158
+ for (const interaction of interactions) {
159
+ elements.push(this.createEdge(interaction.from, interaction.to, interaction.message, { arrow: 'single' }));
160
+ }
161
+ return elements;
162
+ }
163
+ /**
164
+ * Generate class diagram elements
165
+ */
166
+ generateClassElements(context) {
167
+ const elements = [];
168
+ // Classes
169
+ const classes = this.deriveClasses(context);
170
+ for (const cls of classes) {
171
+ const node = this.createNode(cls.name, cls.description, { shape: 'rectangle' });
172
+ node.metadata = {
173
+ attributes: cls.attributes,
174
+ methods: cls.methods,
175
+ };
176
+ elements.push(node);
177
+ }
178
+ // Relationships
179
+ const relationships = this.deriveRelationships(context);
180
+ for (const rel of relationships) {
181
+ elements.push(this.createEdge(rel.from, rel.to, rel.type, { arrow: rel.type === 'inheritance' ? 'open' : 'filled' }));
182
+ }
183
+ return elements;
184
+ }
185
+ /**
186
+ * Generate mindmap elements
187
+ */
188
+ generateMindmapElements(context) {
189
+ const elements = [];
190
+ // Central concept
191
+ const center = this.createNode(context.subject, 'Main concept', { shape: 'ellipse' });
192
+ elements.push(center);
193
+ // Branches
194
+ const branches = this.deriveBranches(context);
195
+ for (const branch of branches) {
196
+ const node = this.createNode(branch.topic, branch.description, { shape: 'rectangle' });
197
+ elements.push(node);
198
+ elements.push(this.createEdge(center.id, node.id, ''));
199
+ // Sub-branches
200
+ for (const sub of branch.subtopics) {
201
+ const subNode = this.createNode(sub, '', { shape: 'rectangle' });
202
+ elements.push(subNode);
203
+ elements.push(this.createEdge(node.id, subNode.id, ''));
204
+ }
205
+ }
206
+ return elements;
207
+ }
208
+ /**
209
+ * Generate state diagram elements
210
+ */
211
+ generateStateElements(context) {
212
+ const elements = [];
213
+ // Initial state
214
+ const initial = this.createNode('[*]', 'Initial state', { shape: 'ellipse' });
215
+ elements.push(initial);
216
+ // States
217
+ const states = this.deriveStates(context);
218
+ for (const state of states) {
219
+ const node = this.createNode(state.name, state.description, { shape: 'rectangle' });
220
+ elements.push(node);
221
+ }
222
+ // Transitions
223
+ const transitions = this.deriveTransitions(context);
224
+ for (const t of transitions) {
225
+ elements.push(this.createEdge(t.from, t.to, t.trigger));
226
+ }
227
+ // Final state
228
+ const final = this.createNode('[*]', 'Final state', { shape: 'ellipse' });
229
+ final.id = this.generateId('final');
230
+ elements.push(final);
231
+ return elements;
232
+ }
233
+ /**
234
+ * Generate component diagram elements
235
+ */
236
+ generateComponentElements(context) {
237
+ const elements = [];
238
+ // Components
239
+ const components = this.deriveComponents(context);
240
+ for (const comp of components) {
241
+ const node = this.createNode(comp.name, comp.description, { shape: 'rectangle' });
242
+ node.metadata = { interfaces: comp.interfaces };
243
+ elements.push(node);
244
+ }
245
+ // Dependencies
246
+ const deps = this.deriveDependencies(context);
247
+ for (const dep of deps) {
248
+ elements.push(this.createEdge(dep.from, dep.to, dep.type, { lineStyle: 'dashed' }));
249
+ }
250
+ return elements;
251
+ }
252
+ /**
253
+ * Generate generic elements
254
+ */
255
+ generateGenericElements(context) {
256
+ const elements = [];
257
+ // Main subject
258
+ const main = this.createNode(context.subject, '', { shape: 'rectangle' });
259
+ elements.push(main);
260
+ // Related concepts
261
+ const concepts = this.findRelatedConcepts(context);
262
+ for (const concept of concepts) {
263
+ const node = this.createNode(concept, '', { shape: 'rectangle' });
264
+ elements.push(node);
265
+ elements.push(this.createEdge(main.id, node.id, 'relates to'));
266
+ }
267
+ return elements;
268
+ }
269
+ /**
270
+ * Create node element
271
+ */
272
+ createNode(label, description, style) {
273
+ return {
274
+ id: this.generateId('node'),
275
+ type: 'node',
276
+ label,
277
+ description,
278
+ style: { ...style },
279
+ };
280
+ }
281
+ /**
282
+ * Create edge element
283
+ */
284
+ createEdge(source, target, label, style) {
285
+ return {
286
+ id: this.generateId('edge'),
287
+ type: 'edge',
288
+ source,
289
+ target,
290
+ label,
291
+ arrow: style?.arrow ?? 'single',
292
+ style: style ? { ...style } : undefined,
293
+ };
294
+ }
295
+ /**
296
+ * Derive process steps from context
297
+ */
298
+ deriveProcessSteps(context) {
299
+ // Generate based on complexity
300
+ const baseSteps = [
301
+ { name: 'Input', description: 'Receive input data', transition: '' },
302
+ { name: 'Process', description: 'Process the data', transition: '' },
303
+ { name: 'Validate', description: 'Validate results', transition: '' },
304
+ { name: 'Output', description: 'Generate output', transition: '' },
305
+ ];
306
+ if (context.complexity === 'detailed') {
307
+ return [
308
+ { name: 'Initialize', description: 'Setup environment', transition: '' },
309
+ ...baseSteps,
310
+ { name: 'Log', description: 'Record operation', transition: '' },
311
+ { name: 'Cleanup', description: 'Release resources', transition: '' },
312
+ ];
313
+ }
314
+ if (context.complexity === 'simple') {
315
+ return [
316
+ { name: 'Process', description: `Process ${context.subject}`, transition: '' },
317
+ ];
318
+ }
319
+ return baseSteps;
320
+ }
321
+ /**
322
+ * Derive participants for sequence diagram
323
+ */
324
+ deriveParticipants(_context) {
325
+ return [
326
+ { name: 'User', role: 'Initiator' },
327
+ { name: 'System', role: 'Processor' },
328
+ { name: 'Database', role: 'Storage' },
329
+ ];
330
+ }
331
+ /**
332
+ * Derive interactions for sequence diagram
333
+ */
334
+ deriveInteractions(_context) {
335
+ return [
336
+ { from: 'user', to: 'system', message: 'Request' },
337
+ { from: 'system', to: 'database', message: 'Query' },
338
+ { from: 'database', to: 'system', message: 'Result' },
339
+ { from: 'system', to: 'user', message: 'Response' },
340
+ ];
341
+ }
342
+ /**
343
+ * Derive classes for class diagram
344
+ */
345
+ deriveClasses(context) {
346
+ return [
347
+ {
348
+ name: context.subject,
349
+ description: 'Main class',
350
+ attributes: ['id: string', 'data: any'],
351
+ methods: ['process()', 'validate()'],
352
+ },
353
+ ];
354
+ }
355
+ /**
356
+ * Derive relationships for class diagram
357
+ */
358
+ deriveRelationships(_context) {
359
+ return [];
360
+ }
361
+ /**
362
+ * Derive branches for mindmap
363
+ */
364
+ deriveBranches(_context) {
365
+ return [
366
+ { topic: 'Features', description: 'Key features', subtopics: ['Feature A', 'Feature B'] },
367
+ { topic: 'Benefits', description: 'Key benefits', subtopics: ['Benefit A', 'Benefit B'] },
368
+ { topic: 'Use Cases', description: 'Applications', subtopics: ['Case A', 'Case B'] },
369
+ ];
370
+ }
371
+ /**
372
+ * Derive states for state diagram
373
+ */
374
+ deriveStates(_context) {
375
+ return [
376
+ { name: 'Idle', description: 'Waiting for input' },
377
+ { name: 'Processing', description: 'Processing data' },
378
+ { name: 'Complete', description: 'Operation finished' },
379
+ ];
380
+ }
381
+ /**
382
+ * Derive transitions for state diagram
383
+ */
384
+ deriveTransitions(_context) {
385
+ return [
386
+ { from: '[*]', to: 'idle', trigger: 'start' },
387
+ { from: 'idle', to: 'processing', trigger: 'input received' },
388
+ { from: 'processing', to: 'complete', trigger: 'done' },
389
+ { from: 'complete', to: '[*]', trigger: 'finish' },
390
+ ];
391
+ }
392
+ /**
393
+ * Derive components for component diagram
394
+ */
395
+ deriveComponents(_context) {
396
+ return [
397
+ { name: 'API', description: 'External interface', interfaces: ['REST', 'GraphQL'] },
398
+ { name: 'Service', description: 'Business logic', interfaces: ['IService'] },
399
+ { name: 'Repository', description: 'Data access', interfaces: ['IRepository'] },
400
+ ];
401
+ }
402
+ /**
403
+ * Derive dependencies for component diagram
404
+ */
405
+ deriveDependencies(_context) {
406
+ return [
407
+ { from: 'api', to: 'service', type: 'uses' },
408
+ { from: 'service', to: 'repository', type: 'uses' },
409
+ ];
410
+ }
411
+ /**
412
+ * Generate narrative explanation
413
+ */
414
+ generateNarrative(context, diagram) {
415
+ const lines = [];
416
+ lines.push(`## ${context.subject}`);
417
+ lines.push('');
418
+ // Introduction based on audience
419
+ switch (context.audience) {
420
+ case 'developer':
421
+ lines.push(`This technical overview explains the ${context.subject} architecture and implementation details.`);
422
+ break;
423
+ case 'manager':
424
+ lines.push(`This summary provides a high-level view of ${context.subject} and its business value.`);
425
+ break;
426
+ case 'stakeholder':
427
+ lines.push(`This document outlines how ${context.subject} addresses your requirements.`);
428
+ break;
429
+ default:
430
+ lines.push(`This explanation covers the key aspects of ${context.subject}.`);
431
+ }
432
+ lines.push('');
433
+ // Describe diagram
434
+ lines.push(`### Visual Overview`);
435
+ lines.push('');
436
+ lines.push(`The ${diagram.type} diagram above illustrates the key components and their relationships.`);
437
+ lines.push('');
438
+ // Key elements
439
+ const nodes = diagram.elements.filter((e) => e.type === 'node');
440
+ if (nodes.length > 0) {
441
+ lines.push('### Key Elements');
442
+ lines.push('');
443
+ for (const node of nodes.slice(0, 5)) {
444
+ lines.push(`- **${node.label}**: ${node.description || 'Part of the system'}`);
445
+ }
446
+ }
447
+ return lines.join('\n');
448
+ }
449
+ /**
450
+ * Extract insights from explanation
451
+ */
452
+ extractInsights(context, diagram) {
453
+ const insights = [];
454
+ // Analyze diagram structure
455
+ const nodes = diagram.elements.filter((e) => e.type === 'node').length;
456
+ const edges = diagram.elements.filter((e) => e.type === 'edge').length;
457
+ if (nodes > 5) {
458
+ insights.push(`The system has ${nodes} major components, indicating moderate complexity`);
459
+ }
460
+ if (edges > nodes) {
461
+ insights.push('High interconnectivity suggests tight coupling between components');
462
+ }
463
+ // Context-based insights
464
+ switch (context.complexity) {
465
+ case 'detailed':
466
+ insights.push('Detailed view reveals implementation nuances');
467
+ break;
468
+ case 'simple':
469
+ insights.push('Simplified view focuses on core concepts');
470
+ break;
471
+ }
472
+ // Audience-specific insights
473
+ switch (context.audience) {
474
+ case 'developer':
475
+ insights.push('Technical implementation follows established patterns');
476
+ break;
477
+ case 'manager':
478
+ insights.push('Architecture supports scalability and maintainability');
479
+ break;
480
+ }
481
+ return insights;
482
+ }
483
+ /**
484
+ * Find related concepts
485
+ */
486
+ findRelatedConcepts(context) {
487
+ const subject = context.subject.toLowerCase();
488
+ const related = [];
489
+ // Common related concepts
490
+ const conceptMap = {
491
+ api: ['REST', 'GraphQL', 'Authentication', 'Rate Limiting'],
492
+ database: ['SQL', 'NoSQL', 'Indexing', 'Transactions'],
493
+ authentication: ['OAuth', 'JWT', 'Sessions', 'MFA'],
494
+ architecture: ['Microservices', 'Monolith', 'Event-Driven', 'Layered'],
495
+ testing: ['Unit Tests', 'Integration Tests', 'E2E Tests', 'TDD'],
496
+ deployment: ['CI/CD', 'Docker', 'Kubernetes', 'Cloud'],
497
+ };
498
+ for (const [key, concepts] of Object.entries(conceptMap)) {
499
+ if (subject.includes(key)) {
500
+ related.push(...concepts);
501
+ }
502
+ }
503
+ return related.slice(0, 5);
504
+ }
505
+ /**
506
+ * Render diagram in all formats
507
+ */
508
+ renderAllFormats(diagram) {
509
+ return {
510
+ mermaid: this.renderMermaid(diagram),
511
+ plantuml: this.renderPlantUML(diagram),
512
+ svg: this.renderSVG(diagram),
513
+ ascii: this.renderASCII(diagram),
514
+ json: JSON.stringify(diagram, null, 2),
515
+ };
516
+ }
517
+ /**
518
+ * Render as Mermaid
519
+ */
520
+ renderMermaid(diagram) {
521
+ const lines = [];
522
+ // Diagram type declaration
523
+ switch (diagram.type) {
524
+ case 'flowchart':
525
+ lines.push(`flowchart ${diagram.direction ?? 'TB'}`);
526
+ break;
527
+ case 'sequence':
528
+ lines.push('sequenceDiagram');
529
+ break;
530
+ case 'class':
531
+ lines.push('classDiagram');
532
+ break;
533
+ case 'state':
534
+ lines.push('stateDiagram-v2');
535
+ break;
536
+ case 'mindmap':
537
+ lines.push('mindmap');
538
+ lines.push(` root((${diagram.title}))`);
539
+ break;
540
+ default:
541
+ lines.push(`flowchart ${diagram.direction ?? 'TB'}`);
542
+ }
543
+ // Render elements
544
+ for (const element of diagram.elements) {
545
+ if (element.type === 'node') {
546
+ const node = element;
547
+ const shape = this.mermaidShape(node.style?.shape);
548
+ lines.push(` ${node.id}${shape[0]}${node.label}${shape[1]}`);
549
+ }
550
+ else if (element.type === 'edge') {
551
+ const edge = element;
552
+ const arrow = this.mermaidArrow(edge.arrow, edge.style?.lineStyle);
553
+ const label = edge.label ? `|${edge.label}|` : '';
554
+ lines.push(` ${edge.source} ${arrow}${label} ${edge.target}`);
555
+ }
556
+ }
557
+ return lines.join('\n');
558
+ }
559
+ /**
560
+ * Get Mermaid shape syntax
561
+ */
562
+ mermaidShape(shape) {
563
+ switch (shape) {
564
+ case 'ellipse': return ['((', '))'];
565
+ case 'diamond': return ['{', '}'];
566
+ case 'hexagon': return ['{{', '}}'];
567
+ case 'cylinder': return ['[(', ')]'];
568
+ case 'cloud': return [')', ')'];
569
+ default: return ['[', ']'];
570
+ }
571
+ }
572
+ /**
573
+ * Get Mermaid arrow syntax
574
+ */
575
+ mermaidArrow(arrow, lineStyle) {
576
+ const line = lineStyle === 'dashed' ? '-.-' : lineStyle === 'dotted' ? '...' : '--';
577
+ switch (arrow) {
578
+ case 'none': return `${line}`;
579
+ case 'double': return `<${line}>`;
580
+ case 'open': return `${line}>`;
581
+ default: return `${line}>`;
582
+ }
583
+ }
584
+ /**
585
+ * Render as PlantUML
586
+ */
587
+ renderPlantUML(diagram) {
588
+ const lines = ['@startuml'];
589
+ lines.push(`title ${diagram.title}`);
590
+ lines.push('');
591
+ // Render based on type
592
+ for (const element of diagram.elements) {
593
+ if (element.type === 'node') {
594
+ const node = element;
595
+ lines.push(`rectangle "${node.label}" as ${node.id}`);
596
+ }
597
+ else if (element.type === 'edge') {
598
+ const edge = element;
599
+ const arrow = edge.arrow === 'double' ? '<-->' : '-->';
600
+ const label = edge.label ? ` : ${edge.label}` : '';
601
+ lines.push(`${edge.source} ${arrow} ${edge.target}${label}`);
602
+ }
603
+ }
604
+ lines.push('');
605
+ lines.push('@enduml');
606
+ return lines.join('\n');
607
+ }
608
+ /**
609
+ * Render as SVG (simplified)
610
+ */
611
+ renderSVG(diagram) {
612
+ const nodes = diagram.elements.filter((e) => e.type === 'node');
613
+ const width = 800;
614
+ const height = Math.max(400, nodes.length * 100);
615
+ let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}">`;
616
+ svg += `<style>
617
+ .node { fill: ${diagram.theme?.primary ?? '#2196F3'}; stroke: #333; stroke-width: 2; }
618
+ .label { font-family: Arial; font-size: 14px; fill: white; text-anchor: middle; }
619
+ </style>`;
620
+ // Render nodes
621
+ nodes.forEach((node, i) => {
622
+ const x = width / 2 - 50;
623
+ const y = 50 + i * 100;
624
+ svg += `<rect class="node" x="${x}" y="${y}" width="100" height="40" rx="5"/>`;
625
+ svg += `<text class="label" x="${x + 50}" y="${y + 25}">${node.label}</text>`;
626
+ });
627
+ svg += '</svg>';
628
+ return svg;
629
+ }
630
+ /**
631
+ * Render as ASCII art
632
+ */
633
+ renderASCII(diagram) {
634
+ const lines = [];
635
+ const nodes = diagram.elements.filter((e) => e.type === 'node');
636
+ lines.push(`┌${'─'.repeat(40)}┐`);
637
+ lines.push(`│ ${diagram.title.padEnd(38)} │`);
638
+ lines.push(`├${'─'.repeat(40)}┤`);
639
+ for (let i = 0; i < nodes.length; i++) {
640
+ const node = nodes[i];
641
+ const boxWidth = Math.min(36, Math.max(10, node.label.length + 4));
642
+ const padding = Math.floor((boxWidth - node.label.length) / 2);
643
+ lines.push(`│ ┌${'─'.repeat(boxWidth)}┐${' '.repeat(36 - boxWidth)}│`);
644
+ lines.push(`│ │${' '.repeat(padding)}${node.label}${' '.repeat(boxWidth - padding - node.label.length)}│${' '.repeat(36 - boxWidth)}│`);
645
+ lines.push(`│ └${'─'.repeat(boxWidth)}┘${' '.repeat(36 - boxWidth)}│`);
646
+ if (i < nodes.length - 1) {
647
+ lines.push(`│${' '.repeat(19)}│${' '.repeat(20)}│`);
648
+ lines.push(`│${' '.repeat(19)}▼${' '.repeat(20)}│`);
649
+ }
650
+ }
651
+ lines.push(`└${'─'.repeat(40)}┘`);
652
+ return lines.join('\n');
653
+ }
654
+ /**
655
+ * Generate unique ID
656
+ */
657
+ generateId(prefix) {
658
+ return `${prefix}_${++this.elementCounter}`;
659
+ }
660
+ }
661
+ /**
662
+ * Create visual explanation generator instance
663
+ */
664
+ export function createVisualExplanationGenerator(config) {
665
+ return new VisualExplanationGenerator(config);
666
+ }
667
+ //# sourceMappingURL=visual-explanation.js.map