@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.
- package/bin/musubix.js +18 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +27 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +320 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +580 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/cli/base.d.ts +58 -0
- package/dist/cli/base.d.ts.map +1 -0
- package/dist/cli/base.js +93 -0
- package/dist/cli/base.js.map +1 -0
- package/dist/cli/commands/help.d.ts +17 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +228 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +25 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +38 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +258 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/codegen/coding-standards.d.ts +250 -0
- package/dist/codegen/coding-standards.d.ts.map +1 -0
- package/dist/codegen/coding-standards.js +976 -0
- package/dist/codegen/coding-standards.js.map +1 -0
- package/dist/codegen/coverage-reporter.d.ts +264 -0
- package/dist/codegen/coverage-reporter.d.ts.map +1 -0
- package/dist/codegen/coverage-reporter.js +697 -0
- package/dist/codegen/coverage-reporter.js.map +1 -0
- package/dist/codegen/dependency-analyzer.d.ts +271 -0
- package/dist/codegen/dependency-analyzer.d.ts.map +1 -0
- package/dist/codegen/dependency-analyzer.js +661 -0
- package/dist/codegen/dependency-analyzer.js.map +1 -0
- package/dist/codegen/generator.d.ts +275 -0
- package/dist/codegen/generator.d.ts.map +1 -0
- package/dist/codegen/generator.js +781 -0
- package/dist/codegen/generator.js.map +1 -0
- package/dist/codegen/index.d.ts +18 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +27 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/integration-test-generator.d.ts +312 -0
- package/dist/codegen/integration-test-generator.d.ts.map +1 -0
- package/dist/codegen/integration-test-generator.js +765 -0
- package/dist/codegen/integration-test-generator.js.map +1 -0
- package/dist/codegen/pattern-conformance.d.ts +309 -0
- package/dist/codegen/pattern-conformance.d.ts.map +1 -0
- package/dist/codegen/pattern-conformance.js +590 -0
- package/dist/codegen/pattern-conformance.js.map +1 -0
- package/dist/codegen/quality-metrics.d.ts +235 -0
- package/dist/codegen/quality-metrics.d.ts.map +1 -0
- package/dist/codegen/quality-metrics.js +439 -0
- package/dist/codegen/quality-metrics.js.map +1 -0
- package/dist/codegen/security-scanner.d.ts +179 -0
- package/dist/codegen/security-scanner.d.ts.map +1 -0
- package/dist/codegen/security-scanner.js +495 -0
- package/dist/codegen/security-scanner.js.map +1 -0
- package/dist/codegen/static-analyzer.d.ts +188 -0
- package/dist/codegen/static-analyzer.d.ts.map +1 -0
- package/dist/codegen/static-analyzer.js +490 -0
- package/dist/codegen/static-analyzer.js.map +1 -0
- package/dist/codegen/unit-test-generator.d.ts +289 -0
- package/dist/codegen/unit-test-generator.d.ts.map +1 -0
- package/dist/codegen/unit-test-generator.js +634 -0
- package/dist/codegen/unit-test-generator.js.map +1 -0
- package/dist/design/adr-generator.d.ts +227 -0
- package/dist/design/adr-generator.d.ts.map +1 -0
- package/dist/design/adr-generator.js +423 -0
- package/dist/design/adr-generator.js.map +1 -0
- package/dist/design/c4-generator.d.ts +267 -0
- package/dist/design/c4-generator.d.ts.map +1 -0
- package/dist/design/c4-generator.js +453 -0
- package/dist/design/c4-generator.js.map +1 -0
- package/dist/design/framework-optimizer.d.ts +190 -0
- package/dist/design/framework-optimizer.d.ts.map +1 -0
- package/dist/design/framework-optimizer.js +589 -0
- package/dist/design/framework-optimizer.js.map +1 -0
- package/dist/design/index.d.ts +12 -0
- package/dist/design/index.d.ts.map +1 -0
- package/dist/design/index.js +13 -0
- package/dist/design/index.js.map +1 -0
- package/dist/design/pattern-detector.d.ts +270 -0
- package/dist/design/pattern-detector.d.ts.map +1 -0
- package/dist/design/pattern-detector.js +621 -0
- package/dist/design/pattern-detector.js.map +1 -0
- package/dist/design/solid-validator.d.ts +188 -0
- package/dist/design/solid-validator.d.ts.map +1 -0
- package/dist/design/solid-validator.js +579 -0
- package/dist/design/solid-validator.js.map +1 -0
- package/dist/error/data-persistence.d.ts +311 -0
- package/dist/error/data-persistence.d.ts.map +1 -0
- package/dist/error/data-persistence.js +586 -0
- package/dist/error/data-persistence.js.map +1 -0
- package/dist/error/graceful-degradation.d.ts +309 -0
- package/dist/error/graceful-degradation.d.ts.map +1 -0
- package/dist/error/graceful-degradation.js +510 -0
- package/dist/error/graceful-degradation.js.map +1 -0
- package/dist/error/index.d.ts +11 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +19 -0
- package/dist/error/index.js.map +1 -0
- package/dist/explanation/explanation-generator.d.ts +228 -0
- package/dist/explanation/explanation-generator.d.ts.map +1 -0
- package/dist/explanation/explanation-generator.js +662 -0
- package/dist/explanation/explanation-generator.js.map +1 -0
- package/dist/explanation/index.d.ts +11 -0
- package/dist/explanation/index.d.ts.map +1 -0
- package/dist/explanation/index.js +19 -0
- package/dist/explanation/index.js.map +1 -0
- package/dist/explanation/reasoning-chain.d.ts +314 -0
- package/dist/explanation/reasoning-chain.d.ts.map +1 -0
- package/dist/explanation/reasoning-chain.js +414 -0
- package/dist/explanation/reasoning-chain.js.map +1 -0
- package/dist/explanation/visual-explanation.d.ts +315 -0
- package/dist/explanation/visual-explanation.d.ts.map +1 -0
- package/dist/explanation/visual-explanation.js +667 -0
- package/dist/explanation/visual-explanation.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/requirements/decomposer.d.ts +235 -0
- package/dist/requirements/decomposer.d.ts.map +1 -0
- package/dist/requirements/decomposer.js +587 -0
- package/dist/requirements/decomposer.js.map +1 -0
- package/dist/requirements/related-finder.d.ts +261 -0
- package/dist/requirements/related-finder.d.ts.map +1 -0
- package/dist/requirements/related-finder.js +629 -0
- package/dist/requirements/related-finder.js.map +1 -0
- package/dist/traceability/impact.d.ts +196 -0
- package/dist/traceability/impact.d.ts.map +1 -0
- package/dist/traceability/impact.js +438 -0
- package/dist/traceability/impact.js.map +1 -0
- package/dist/traceability/index.d.ts +9 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +10 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/traceability/manager.d.ts +266 -0
- package/dist/traceability/manager.d.ts.map +1 -0
- package/dist/traceability/manager.js +412 -0
- package/dist/traceability/manager.js.map +1 -0
- package/dist/types/common.d.ts +294 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +15 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/ears.d.ts +158 -0
- package/dist/types/ears.d.ts.map +1 -0
- package/dist/types/ears.js +33 -0
- package/dist/types/ears.js.map +1 -0
- package/dist/types/errors.d.ts +176 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +55 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/data-protector.d.ts +122 -0
- package/dist/utils/data-protector.d.ts.map +1 -0
- package/dist/utils/data-protector.js +275 -0
- package/dist/utils/data-protector.js.map +1 -0
- package/dist/utils/error-handler.d.ts +101 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +324 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/i18n-manager.d.ts +259 -0
- package/dist/utils/i18n-manager.d.ts.map +1 -0
- package/dist/utils/i18n-manager.js +554 -0
- package/dist/utils/i18n-manager.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +120 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +237 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance-profiler.d.ts +251 -0
- package/dist/utils/performance-profiler.d.ts.map +1 -0
- package/dist/utils/performance-profiler.js +458 -0
- package/dist/utils/performance-profiler.js.map +1 -0
- package/dist/utils/scalability-optimizer.d.ts +294 -0
- package/dist/utils/scalability-optimizer.d.ts.map +1 -0
- package/dist/utils/scalability-optimizer.js +606 -0
- package/dist/utils/scalability-optimizer.js.map +1 -0
- package/dist/utils/structured-logger.d.ts +294 -0
- package/dist/utils/structured-logger.d.ts.map +1 -0
- package/dist/utils/structured-logger.js +630 -0
- package/dist/utils/structured-logger.js.map +1 -0
- package/dist/utils/version-compatibility.d.ts +217 -0
- package/dist/utils/version-compatibility.d.ts.map +1 -0
- package/dist/utils/version-compatibility.js +443 -0
- package/dist/utils/version-compatibility.js.map +1 -0
- package/dist/validators/ears-validator.d.ts +182 -0
- package/dist/validators/ears-validator.d.ts.map +1 -0
- package/dist/validators/ears-validator.js +357 -0
- package/dist/validators/ears-validator.js.map +1 -0
- package/dist/validators/index.d.ts +8 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +9 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- 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
|