sdd-mcp-server 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/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/__tests__/setup.d.ts +44 -0
- package/dist/__tests__/setup.js +178 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/test-helpers/mock-factories.d.ts +26 -0
- package/dist/__tests__/test-helpers/mock-factories.js +466 -0
- package/dist/__tests__/test-helpers/mock-factories.js.map +1 -0
- package/dist/adapters/cli/SDDToolAdapter.d.ts +26 -0
- package/dist/adapters/cli/SDDToolAdapter.js +273 -0
- package/dist/adapters/cli/SDDToolAdapter.js.map +1 -0
- package/dist/application/services/CodebaseAnalysisService.d.ts +38 -0
- package/dist/application/services/CodebaseAnalysisService.js +737 -0
- package/dist/application/services/CodebaseAnalysisService.js.map +1 -0
- package/dist/application/services/LocalizationService.d.ts +184 -0
- package/dist/application/services/LocalizationService.js +536 -0
- package/dist/application/services/LocalizationService.js.map +1 -0
- package/dist/application/services/ProjectContextService.d.ts +61 -0
- package/dist/application/services/ProjectContextService.js +550 -0
- package/dist/application/services/ProjectContextService.js.map +1 -0
- package/dist/application/services/ProjectInitializationService.d.ts +57 -0
- package/dist/application/services/ProjectInitializationService.js +485 -0
- package/dist/application/services/ProjectInitializationService.js.map +1 -0
- package/dist/application/services/ProjectService.d.ts +19 -0
- package/dist/application/services/ProjectService.js +159 -0
- package/dist/application/services/ProjectService.js.map +1 -0
- package/dist/application/services/QualityGateService.d.ts +62 -0
- package/dist/application/services/QualityGateService.js +428 -0
- package/dist/application/services/QualityGateService.js.map +1 -0
- package/dist/application/services/QualityService.d.ts +43 -0
- package/dist/application/services/QualityService.js +245 -0
- package/dist/application/services/QualityService.js.map +1 -0
- package/dist/application/services/SteeringDocumentService.d.ts +62 -0
- package/dist/application/services/SteeringDocumentService.js +694 -0
- package/dist/application/services/SteeringDocumentService.js.map +1 -0
- package/dist/application/services/TemplateService.d.ts +47 -0
- package/dist/application/services/TemplateService.js +438 -0
- package/dist/application/services/TemplateService.js.map +1 -0
- package/dist/application/services/WorkflowEngineService.d.ts +56 -0
- package/dist/application/services/WorkflowEngineService.js +348 -0
- package/dist/application/services/WorkflowEngineService.js.map +1 -0
- package/dist/application/services/WorkflowService.d.ts +22 -0
- package/dist/application/services/WorkflowService.js +147 -0
- package/dist/application/services/WorkflowService.js.map +1 -0
- package/dist/application/services/WorkflowValidationService.d.ts +51 -0
- package/dist/application/services/WorkflowValidationService.js +665 -0
- package/dist/application/services/WorkflowValidationService.js.map +1 -0
- package/dist/domain/context/ProjectContext.d.ts +350 -0
- package/dist/domain/context/ProjectContext.js +138 -0
- package/dist/domain/context/ProjectContext.js.map +1 -0
- package/dist/domain/i18n/index.d.ts +286 -0
- package/dist/domain/i18n/index.js +97 -0
- package/dist/domain/i18n/index.js.map +1 -0
- package/dist/domain/plugins/index.d.ts +498 -0
- package/dist/domain/plugins/index.js +157 -0
- package/dist/domain/plugins/index.js.map +1 -0
- package/dist/domain/ports.d.ts +54 -0
- package/dist/domain/ports.js +3 -0
- package/dist/domain/ports.js.map +1 -0
- package/dist/domain/quality/index.d.ts +361 -0
- package/dist/domain/quality/index.js +113 -0
- package/dist/domain/quality/index.js.map +1 -0
- package/dist/domain/services/DomainService.d.ts +18 -0
- package/dist/domain/services/DomainService.js +71 -0
- package/dist/domain/services/DomainService.js.map +1 -0
- package/dist/domain/templates/index.d.ts +158 -0
- package/dist/domain/templates/index.js +22 -0
- package/dist/domain/templates/index.js.map +1 -0
- package/dist/domain/types.d.ts +115 -0
- package/dist/domain/types.js +37 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/domain/workflow/WorkflowStateMachine.d.ts +62 -0
- package/dist/domain/workflow/WorkflowStateMachine.js +286 -0
- package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.d.ts +7 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.js +37 -0
- package/dist/infrastructure/adapters/AjvValidationAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.d.ts +8 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js +41 -0
- package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.d.ts +9 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.js +41 -0
- package/dist/infrastructure/adapters/FileBasedTaskTracker.js.map +1 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.d.ts +8 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js +38 -0
- package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js.map +1 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.d.ts +7 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.js +24 -0
- package/dist/infrastructure/adapters/JsonConfigurationAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.d.ts +9 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.js +75 -0
- package/dist/infrastructure/adapters/LinusQualityAnalyzer.js.map +1 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.d.ts +12 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.js +39 -0
- package/dist/infrastructure/adapters/NodeFileSystemAdapter.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +3 -0
- package/dist/infrastructure/di/container.js +98 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/types.d.ts +39 -0
- package/dist/infrastructure/di/types.js +45 -0
- package/dist/infrastructure/di/types.js.map +1 -0
- package/dist/infrastructure/i18n/I18nextService.d.ts +27 -0
- package/dist/infrastructure/i18n/I18nextService.js +357 -0
- package/dist/infrastructure/i18n/I18nextService.js.map +1 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.d.ts +21 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.js +75 -0
- package/dist/infrastructure/mcp/CapabilityNegotiator.js.map +1 -0
- package/dist/infrastructure/mcp/ErrorHandler.d.ts +29 -0
- package/dist/infrastructure/mcp/ErrorHandler.js +101 -0
- package/dist/infrastructure/mcp/ErrorHandler.js.map +1 -0
- package/dist/infrastructure/mcp/MCPServer.d.ts +25 -0
- package/dist/infrastructure/mcp/MCPServer.js +246 -0
- package/dist/infrastructure/mcp/MCPServer.js.map +1 -0
- package/dist/infrastructure/mcp/PromptManager.d.ts +18 -0
- package/dist/infrastructure/mcp/PromptManager.js +373 -0
- package/dist/infrastructure/mcp/PromptManager.js.map +1 -0
- package/dist/infrastructure/mcp/ResourceManager.d.ts +15 -0
- package/dist/infrastructure/mcp/ResourceManager.js +229 -0
- package/dist/infrastructure/mcp/ResourceManager.js.map +1 -0
- package/dist/infrastructure/mcp/SessionManager.d.ts +64 -0
- package/dist/infrastructure/mcp/SessionManager.js +221 -0
- package/dist/infrastructure/mcp/SessionManager.js.map +1 -0
- package/dist/infrastructure/mcp/ToolRegistry.d.ts +48 -0
- package/dist/infrastructure/mcp/ToolRegistry.js +235 -0
- package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -0
- package/dist/infrastructure/platform/PlatformAdapter.d.ts +46 -0
- package/dist/infrastructure/platform/PlatformAdapter.js +355 -0
- package/dist/infrastructure/platform/PlatformAdapter.js.map +1 -0
- package/dist/infrastructure/plugins/HookSystem.d.ts +40 -0
- package/dist/infrastructure/plugins/HookSystem.js +415 -0
- package/dist/infrastructure/plugins/HookSystem.js.map +1 -0
- package/dist/infrastructure/plugins/PluginManager.d.ts +51 -0
- package/dist/infrastructure/plugins/PluginManager.js +650 -0
- package/dist/infrastructure/plugins/PluginManager.js.map +1 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.d.ts +63 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.js +439 -0
- package/dist/infrastructure/plugins/PluginSteeringRegistry.js.map +1 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.d.ts +54 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.js +490 -0
- package/dist/infrastructure/plugins/PluginToolRegistry.js.map +1 -0
- package/dist/infrastructure/quality/ASTAnalyzer.d.ts +65 -0
- package/dist/infrastructure/quality/ASTAnalyzer.js +439 -0
- package/dist/infrastructure/quality/ASTAnalyzer.js.map +1 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.d.ts +52 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.js +551 -0
- package/dist/infrastructure/quality/LinusCodeReviewer.js.map +1 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.d.ts +10 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.js +35 -0
- package/dist/infrastructure/repositories/InMemoryProjectRepository.js.map +1 -0
- package/dist/infrastructure/schemas/project.schema.d.ts +192 -0
- package/dist/infrastructure/schemas/project.schema.js +114 -0
- package/dist/infrastructure/schemas/project.schema.js.map +1 -0
- package/dist/infrastructure/templates/FileGenerator.d.ts +15 -0
- package/dist/infrastructure/templates/FileGenerator.js +385 -0
- package/dist/infrastructure/templates/FileGenerator.js.map +1 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.d.ts +16 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.js +252 -0
- package/dist/infrastructure/templates/HandlebarsRenderer.js.map +1 -0
- package/dist/infrastructure/templates/TemplateManager.d.ts +36 -0
- package/dist/infrastructure/templates/TemplateManager.js +777 -0
- package/dist/infrastructure/templates/TemplateManager.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
// Linus-style code reviewer implementing the five-layer analysis framework
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
import { injectable, inject } from 'inversify';
|
|
15
|
+
import { ASTAnalyzer } from './ASTAnalyzer.js';
|
|
16
|
+
import { TYPES } from '../di/types.js';
|
|
17
|
+
let LinusCodeReviewer = class LinusCodeReviewer {
|
|
18
|
+
logger;
|
|
19
|
+
astAnalyzer;
|
|
20
|
+
constructor(logger, astAnalyzer = new ASTAnalyzer(this.logger)) {
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
this.astAnalyzer = astAnalyzer;
|
|
23
|
+
}
|
|
24
|
+
async analyzeFile(filePath, content) {
|
|
25
|
+
const language = this.detectLanguage(filePath);
|
|
26
|
+
const ast = await this.astAnalyzer.parseFile(content, language, filePath);
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
const context = {
|
|
29
|
+
filePath,
|
|
30
|
+
content,
|
|
31
|
+
ast,
|
|
32
|
+
lines
|
|
33
|
+
};
|
|
34
|
+
try {
|
|
35
|
+
// Apply the five-layer Linus analysis framework
|
|
36
|
+
const tasteAnalysis = await this.analyzeTaste(context);
|
|
37
|
+
const complexityAnalysis = await this.analyzeComplexity(context);
|
|
38
|
+
const specialCaseAnalysis = await this.analyzeSpecialCases(context);
|
|
39
|
+
const dataStructureAnalysis = await this.analyzeDataStructures(context);
|
|
40
|
+
const organizationAnalysis = await this.analyzeOrganization(context);
|
|
41
|
+
// Collect all violations and improvements
|
|
42
|
+
const violations = [
|
|
43
|
+
...this.extractTasteViolations(tasteAnalysis),
|
|
44
|
+
...this.extractComplexityViolations(complexityAnalysis),
|
|
45
|
+
...this.extractSpecialCaseViolations(specialCaseAnalysis),
|
|
46
|
+
...this.extractDataStructureViolations(dataStructureAnalysis),
|
|
47
|
+
...this.extractOrganizationViolations(organizationAnalysis)
|
|
48
|
+
];
|
|
49
|
+
const suggestions = [
|
|
50
|
+
...this.generateTasteImprovements(tasteAnalysis),
|
|
51
|
+
...this.generateComplexityImprovements(complexityAnalysis),
|
|
52
|
+
...this.generateSpecialCaseImprovements(specialCaseAnalysis),
|
|
53
|
+
...this.generateDataStructureImprovements(dataStructureAnalysis),
|
|
54
|
+
...this.generateOrganizationImprovements(organizationAnalysis)
|
|
55
|
+
];
|
|
56
|
+
// Calculate overall score
|
|
57
|
+
const overallScore = this.calculateOverallScore(tasteAnalysis, complexityAnalysis, specialCaseAnalysis, dataStructureAnalysis, organizationAnalysis);
|
|
58
|
+
const metrics = this.calculateCodeMetrics(context);
|
|
59
|
+
const result = {
|
|
60
|
+
filePath,
|
|
61
|
+
language,
|
|
62
|
+
overallScore,
|
|
63
|
+
tasteAnalysis,
|
|
64
|
+
complexityAnalysis,
|
|
65
|
+
specialCaseAnalysis,
|
|
66
|
+
dataStructureAnalysis,
|
|
67
|
+
organizationAnalysis,
|
|
68
|
+
violations,
|
|
69
|
+
suggestions,
|
|
70
|
+
metrics,
|
|
71
|
+
analyzedAt: new Date()
|
|
72
|
+
};
|
|
73
|
+
this.logger.info('Code analysis completed', {
|
|
74
|
+
filePath,
|
|
75
|
+
overallScore,
|
|
76
|
+
violationsCount: violations.length,
|
|
77
|
+
suggestionsCount: suggestions.length
|
|
78
|
+
});
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
this.logger.error('Code analysis failed', {
|
|
83
|
+
filePath,
|
|
84
|
+
error: error instanceof Error ? error.message : String(error)
|
|
85
|
+
});
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async analyzeBatch(files) {
|
|
90
|
+
const results = [];
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
try {
|
|
93
|
+
const result = await this.analyzeFile(file.path, file.content);
|
|
94
|
+
results.push(result);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
this.logger.warn('Failed to analyze file in batch', {
|
|
98
|
+
filePath: file.path,
|
|
99
|
+
error: error instanceof Error ? error.message : String(error)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
async getQualityReport(results) {
|
|
106
|
+
const summary = this.calculateQualitySummary(results);
|
|
107
|
+
const trends = this.calculateQualityTrends(results);
|
|
108
|
+
const recommendations = this.generateQualityRecommendations(results);
|
|
109
|
+
const goodCount = results.filter(r => r.overallScore === QualityScore.GOOD).length;
|
|
110
|
+
const passableCount = results.filter(r => r.overallScore === QualityScore.PASSABLE).length;
|
|
111
|
+
const garbageCount = results.filter(r => r.overallScore === QualityScore.GARBAGE).length;
|
|
112
|
+
let overall;
|
|
113
|
+
if (garbageCount > results.length * 0.2) {
|
|
114
|
+
overall = QualityScore.GARBAGE;
|
|
115
|
+
}
|
|
116
|
+
else if (passableCount > results.length * 0.5) {
|
|
117
|
+
overall = QualityScore.PASSABLE;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
overall = QualityScore.GOOD;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
overall,
|
|
124
|
+
summary,
|
|
125
|
+
files: results,
|
|
126
|
+
trends,
|
|
127
|
+
recommendations,
|
|
128
|
+
generatedAt: new Date()
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// Layer 1: Taste Analysis (Good/Passable/Garbage)
|
|
132
|
+
async analyzeTaste(context) {
|
|
133
|
+
const examples = [];
|
|
134
|
+
let eleganceScore = 10;
|
|
135
|
+
let simplicityScore = 10;
|
|
136
|
+
let intuitionScore = 10;
|
|
137
|
+
let readabilityScore = 10;
|
|
138
|
+
// Check for elegance issues
|
|
139
|
+
const longLines = context.lines.filter((line, index) => {
|
|
140
|
+
if (line.length > 120) {
|
|
141
|
+
examples.push({
|
|
142
|
+
category: TasteCategory.ELEGANCE,
|
|
143
|
+
code: line.substring(0, 80) + '...',
|
|
144
|
+
issue: `Line ${index + 1} is too long (${line.length} characters)`,
|
|
145
|
+
improvement: 'Break into multiple lines or extract to variable',
|
|
146
|
+
impact: TasteImpact.MEDIUM
|
|
147
|
+
});
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
});
|
|
152
|
+
eleganceScore -= Math.min(longLines.length * 0.5, 3);
|
|
153
|
+
// Check for simplicity issues (nested ternary operators, complex expressions)
|
|
154
|
+
const nestedTernary = context.content.match(/\?[^:]*\?[^:]*:/g);
|
|
155
|
+
if (nestedTernary) {
|
|
156
|
+
simplicityScore -= nestedTernary.length * 2;
|
|
157
|
+
examples.push({
|
|
158
|
+
category: TasteCategory.SIMPLICITY,
|
|
159
|
+
code: nestedTernary[0],
|
|
160
|
+
issue: 'Nested ternary operators reduce readability',
|
|
161
|
+
improvement: 'Use if-else statements or extract to function',
|
|
162
|
+
impact: TasteImpact.HIGH
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// Check for intuitive naming
|
|
166
|
+
const confusingNames = this.findConfusingNames(context);
|
|
167
|
+
intuitionScore -= confusingNames.length * 0.5;
|
|
168
|
+
examples.push(...confusingNames.map(name => ({
|
|
169
|
+
category: TasteCategory.CLARITY,
|
|
170
|
+
code: name.name,
|
|
171
|
+
issue: name.issue,
|
|
172
|
+
improvement: name.suggestion,
|
|
173
|
+
impact: TasteImpact.MEDIUM
|
|
174
|
+
})));
|
|
175
|
+
// Check readability
|
|
176
|
+
const commentRatio = context.ast.metrics.linesOfComments / context.ast.metrics.linesOfCode;
|
|
177
|
+
if (commentRatio < 0.1) {
|
|
178
|
+
readabilityScore -= 2;
|
|
179
|
+
examples.push({
|
|
180
|
+
category: TasteCategory.CLARITY,
|
|
181
|
+
code: '// Missing comments',
|
|
182
|
+
issue: 'Low comment ratio, code may be hard to understand',
|
|
183
|
+
improvement: 'Add meaningful comments explaining complex logic',
|
|
184
|
+
impact: TasteImpact.MEDIUM
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const averageScore = (eleganceScore + simplicityScore + intuitionScore + readabilityScore) / 4;
|
|
188
|
+
let score;
|
|
189
|
+
if (averageScore >= 8)
|
|
190
|
+
score = TasteScore.GOOD;
|
|
191
|
+
else if (averageScore >= 6)
|
|
192
|
+
score = TasteScore.PASSABLE;
|
|
193
|
+
else
|
|
194
|
+
score = TasteScore.GARBAGE;
|
|
195
|
+
return {
|
|
196
|
+
score,
|
|
197
|
+
reasoning: this.generateTasteReasoning(score, eleganceScore, simplicityScore, intuitionScore, readabilityScore),
|
|
198
|
+
elegance: eleganceScore,
|
|
199
|
+
simplicity: simplicityScore,
|
|
200
|
+
intuition: intuitionScore,
|
|
201
|
+
readability: readabilityScore,
|
|
202
|
+
examples
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Layer 2: Complexity Analysis
|
|
206
|
+
async analyzeComplexity(context) {
|
|
207
|
+
const hotspots = this.astAnalyzer.findComplexityHotspots(context.ast.ast, context.filePath);
|
|
208
|
+
const metrics = context.ast.metrics;
|
|
209
|
+
// Score based on complexity metrics (0-10, higher is better)
|
|
210
|
+
let complexityScore = 10;
|
|
211
|
+
if (metrics.cyclomaticComplexity > 20)
|
|
212
|
+
complexityScore -= 4;
|
|
213
|
+
else if (metrics.cyclomaticComplexity > 10)
|
|
214
|
+
complexityScore -= 2;
|
|
215
|
+
if (metrics.nestingDepth > 5)
|
|
216
|
+
complexityScore -= 3;
|
|
217
|
+
else if (metrics.nestingDepth > 3)
|
|
218
|
+
complexityScore -= 1;
|
|
219
|
+
const avgFunctionLength = metrics.linesOfCode / (metrics.functionCount || 1);
|
|
220
|
+
if (avgFunctionLength > 50)
|
|
221
|
+
complexityScore -= 2;
|
|
222
|
+
const recommendations = [];
|
|
223
|
+
if (metrics.cyclomaticComplexity > 10) {
|
|
224
|
+
recommendations.push('Reduce cyclomatic complexity by extracting functions and simplifying conditional logic');
|
|
225
|
+
}
|
|
226
|
+
if (metrics.nestingDepth > 3) {
|
|
227
|
+
recommendations.push('Reduce nesting depth by using early returns and extracting nested logic');
|
|
228
|
+
}
|
|
229
|
+
if (hotspots.length > 0) {
|
|
230
|
+
recommendations.push(`Address ${hotspots.length} complexity hotspots identified in the code`);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
cyclomaticComplexity: metrics.cyclomaticComplexity,
|
|
234
|
+
cognitiveComplexity: metrics.cyclomaticComplexity * 1.2, // Approximate cognitive complexity
|
|
235
|
+
nestingDepth: metrics.nestingDepth,
|
|
236
|
+
lineCount: metrics.linesOfCode,
|
|
237
|
+
functionCount: metrics.functionCount,
|
|
238
|
+
classCount: metrics.classCount,
|
|
239
|
+
score: Math.max(complexityScore, 0),
|
|
240
|
+
hotspots,
|
|
241
|
+
recommendations
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// Layer 3: Special Case Analysis
|
|
245
|
+
async analyzeSpecialCases(context) {
|
|
246
|
+
const specialCases = [];
|
|
247
|
+
const magicNumbers = this.findMagicNumbers(context);
|
|
248
|
+
const hardcodedValues = this.findHardcodedValues(context);
|
|
249
|
+
// Look for special case handling patterns
|
|
250
|
+
context.lines.forEach((line, index) => {
|
|
251
|
+
const trimmed = line.trim();
|
|
252
|
+
// Detect special case conditionals
|
|
253
|
+
if (trimmed.includes('if') && (trimmed.includes('null') || trimmed.includes('undefined') || trimmed.includes('===') && (trimmed.includes('"') || trimmed.includes("'")))) {
|
|
254
|
+
specialCases.push({
|
|
255
|
+
line: index + 1,
|
|
256
|
+
type: SpecialCaseType.CONDITIONAL,
|
|
257
|
+
description: 'Special case conditional handling',
|
|
258
|
+
generalization: 'Consider using polymorphism or strategy pattern',
|
|
259
|
+
confidence: 0.7
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
// Detect try-catch with specific exception handling
|
|
263
|
+
if (trimmed.includes('catch') && trimmed.includes('instanceof')) {
|
|
264
|
+
specialCases.push({
|
|
265
|
+
line: index + 1,
|
|
266
|
+
type: SpecialCaseType.EXCEPTION,
|
|
267
|
+
description: 'Specific exception type handling',
|
|
268
|
+
generalization: 'Consider using a general error handling strategy',
|
|
269
|
+
confidence: 0.8
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Detect workaround comments
|
|
273
|
+
if (trimmed.includes('//') && (trimmed.toLowerCase().includes('hack') || trimmed.toLowerCase().includes('workaround') || trimmed.toLowerCase().includes('todo'))) {
|
|
274
|
+
specialCases.push({
|
|
275
|
+
line: index + 1,
|
|
276
|
+
type: SpecialCaseType.WORKAROUND,
|
|
277
|
+
description: 'Code marked as hack or workaround',
|
|
278
|
+
generalization: 'Refactor to proper solution',
|
|
279
|
+
confidence: 0.9
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
const score = Math.max(10 - specialCases.length - magicNumbers.length * 0.5 - hardcodedValues.length * 0.3, 0);
|
|
284
|
+
const generalizations = this.generateGeneralizations(specialCases, magicNumbers, hardcodedValues);
|
|
285
|
+
return {
|
|
286
|
+
specialCases,
|
|
287
|
+
score,
|
|
288
|
+
generalizations,
|
|
289
|
+
magicNumbers,
|
|
290
|
+
hardcodedValues
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// Layer 4: Data Structure Analysis
|
|
294
|
+
async analyzeDataStructures(context) {
|
|
295
|
+
const appropriateness = this.analyzeDataStructureAppropriateness(context);
|
|
296
|
+
const efficiency = this.analyzeDataStructureEfficiency(context);
|
|
297
|
+
const memoryAnalysis = this.analyzeMemoryUsage(context);
|
|
298
|
+
const accessPatterns = this.analyzeAccessPatterns(context);
|
|
299
|
+
const suggestions = this.generateDataStructureSuggestions(context);
|
|
300
|
+
return {
|
|
301
|
+
appropriateness,
|
|
302
|
+
efficiency,
|
|
303
|
+
memoryUsage: memoryAnalysis,
|
|
304
|
+
accessPatterns,
|
|
305
|
+
suggestions
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// Layer 5: Organization Analysis
|
|
309
|
+
async analyzeOrganization(context) {
|
|
310
|
+
const singleResponsibility = this.analyzeSingleResponsibility(context);
|
|
311
|
+
const separationOfConcerns = this.analyzeSeparationOfConcerns(context);
|
|
312
|
+
const naming = this.analyzeNaming(context);
|
|
313
|
+
const structure = this.analyzeStructure(context);
|
|
314
|
+
const dependencies = this.analyzeDependencies(context);
|
|
315
|
+
const cohesion = this.calculateCohesion(context);
|
|
316
|
+
const coupling = this.calculateCoupling(context);
|
|
317
|
+
return {
|
|
318
|
+
singleResponsibility,
|
|
319
|
+
separationOfConcerns,
|
|
320
|
+
naming,
|
|
321
|
+
structure,
|
|
322
|
+
dependencies,
|
|
323
|
+
cohesion,
|
|
324
|
+
coupling
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Helper methods for analysis
|
|
328
|
+
detectLanguage(filePath) {
|
|
329
|
+
const extension = filePath.split('.').pop()?.toLowerCase();
|
|
330
|
+
switch (extension) {
|
|
331
|
+
case 'ts':
|
|
332
|
+
case 'tsx':
|
|
333
|
+
return ProgrammingLanguage.TYPESCRIPT;
|
|
334
|
+
case 'js':
|
|
335
|
+
case 'jsx':
|
|
336
|
+
return ProgrammingLanguage.JAVASCRIPT;
|
|
337
|
+
case 'py':
|
|
338
|
+
return ProgrammingLanguage.PYTHON;
|
|
339
|
+
case 'java':
|
|
340
|
+
return ProgrammingLanguage.JAVA;
|
|
341
|
+
case 'go':
|
|
342
|
+
return ProgrammingLanguage.GO;
|
|
343
|
+
case 'rs':
|
|
344
|
+
return ProgrammingLanguage.RUST;
|
|
345
|
+
case 'cpp':
|
|
346
|
+
case 'cc':
|
|
347
|
+
case 'cxx':
|
|
348
|
+
return ProgrammingLanguage.CPP;
|
|
349
|
+
case 'cs':
|
|
350
|
+
return ProgrammingLanguage.CSHARP;
|
|
351
|
+
default:
|
|
352
|
+
return ProgrammingLanguage.TYPESCRIPT; // Default fallback
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
calculateOverallScore(taste, complexity, specialCase, dataStructure, organization) {
|
|
356
|
+
// Weight the scores based on Linus priorities
|
|
357
|
+
const tasteWeight = 0.3;
|
|
358
|
+
const complexityWeight = 0.25;
|
|
359
|
+
const specialCaseWeight = 0.2;
|
|
360
|
+
const dataStructureWeight = 0.15;
|
|
361
|
+
const organizationWeight = 0.1;
|
|
362
|
+
const tasteScore = taste.score === TasteScore.GOOD ? 10 : taste.score === TasteScore.PASSABLE ? 6 : 2;
|
|
363
|
+
const weightedScore = tasteScore * tasteWeight +
|
|
364
|
+
complexity.score * complexityWeight +
|
|
365
|
+
specialCase.score * specialCaseWeight +
|
|
366
|
+
(dataStructure.appropriateness + dataStructure.efficiency) / 2 * dataStructureWeight +
|
|
367
|
+
(organization.singleResponsibility + organization.separationOfConcerns + organization.cohesion + (10 - organization.coupling)) / 4 * organizationWeight;
|
|
368
|
+
if (weightedScore >= 8)
|
|
369
|
+
return QualityScore.GOOD;
|
|
370
|
+
if (weightedScore >= 5)
|
|
371
|
+
return QualityScore.PASSABLE;
|
|
372
|
+
return QualityScore.GARBAGE;
|
|
373
|
+
}
|
|
374
|
+
// Placeholder implementations for helper methods (would be fully implemented in production)
|
|
375
|
+
findConfusingNames(context) {
|
|
376
|
+
const confusing = [];
|
|
377
|
+
const singleLetterVars = context.content.match(/\b[a-z]\b/g);
|
|
378
|
+
if (singleLetterVars) {
|
|
379
|
+
confusing.push({
|
|
380
|
+
name: singleLetterVars[0],
|
|
381
|
+
issue: 'Single letter variable names are not descriptive',
|
|
382
|
+
suggestion: 'Use descriptive variable names'
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
return confusing;
|
|
386
|
+
}
|
|
387
|
+
findMagicNumbers(context) {
|
|
388
|
+
const magicNumbers = [];
|
|
389
|
+
const numberRegex = /\b(\d+(?:\.\d+)?)\b/g;
|
|
390
|
+
context.lines.forEach((line, index) => {
|
|
391
|
+
let match;
|
|
392
|
+
while ((match = numberRegex.exec(line)) !== null) {
|
|
393
|
+
const num = parseFloat(match[1]);
|
|
394
|
+
if (num !== 0 && num !== 1 && num !== -1) { // Ignore common constants
|
|
395
|
+
magicNumbers.push({
|
|
396
|
+
value: num,
|
|
397
|
+
line: index + 1,
|
|
398
|
+
context: line.trim(),
|
|
399
|
+
suggestedConstant: `CONSTANT_${num.toString().replace('.', '_')}`
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
return magicNumbers;
|
|
405
|
+
}
|
|
406
|
+
findHardcodedValues(context) {
|
|
407
|
+
const hardcoded = [];
|
|
408
|
+
// Find string literals that look like URLs, paths, or config values
|
|
409
|
+
const stringRegex = /(['"`])((?:(?!\1)[^\\]|\\.)*)(\1)/g;
|
|
410
|
+
context.lines.forEach((line, index) => {
|
|
411
|
+
let match;
|
|
412
|
+
while ((match = stringRegex.exec(line)) !== null) {
|
|
413
|
+
const value = match[2];
|
|
414
|
+
if (value.length > 10) { // Only flag longer strings
|
|
415
|
+
let type = HardcodedType.STRING;
|
|
416
|
+
if (value.startsWith('http'))
|
|
417
|
+
type = HardcodedType.URL;
|
|
418
|
+
else if (value.includes('/') || value.includes('\\'))
|
|
419
|
+
type = HardcodedType.PATH;
|
|
420
|
+
hardcoded.push({
|
|
421
|
+
value,
|
|
422
|
+
line: index + 1,
|
|
423
|
+
type,
|
|
424
|
+
suggestion: 'Move to configuration or constants file'
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
return hardcoded;
|
|
430
|
+
}
|
|
431
|
+
// More placeholder implementations (would be expanded in production)
|
|
432
|
+
generateTasteReasoning(score, elegance, simplicity, intuition, readability) {
|
|
433
|
+
if (score === TasteScore.GOOD) {
|
|
434
|
+
return 'Code demonstrates good taste with clear, elegant solutions and intuitive design choices.';
|
|
435
|
+
}
|
|
436
|
+
else if (score === TasteScore.PASSABLE) {
|
|
437
|
+
return 'Code is functional but lacks elegance. Some areas need refinement for better clarity and maintainability.';
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
return 'Code quality is poor. Major improvements needed in clarity, simplicity, and overall design approach.';
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
generateGeneralizations(specialCases, magicNumbers, hardcodedValues) {
|
|
444
|
+
return [{
|
|
445
|
+
description: 'Extract constants and configuration',
|
|
446
|
+
impact: 'Improved maintainability and reduced coupling',
|
|
447
|
+
effort: EffortEstimate.SMALL,
|
|
448
|
+
examples: ['Replace magic numbers with named constants', 'Move hardcoded strings to config']
|
|
449
|
+
}];
|
|
450
|
+
}
|
|
451
|
+
// Simplified implementations for remaining analysis methods
|
|
452
|
+
analyzeDataStructureAppropriateness = (context) => 8;
|
|
453
|
+
analyzeDataStructureEfficiency = (context) => 7;
|
|
454
|
+
analyzeMemoryUsage = (context) => ({
|
|
455
|
+
usage: 'moderate',
|
|
456
|
+
efficiency: 7,
|
|
457
|
+
leaks: [],
|
|
458
|
+
optimizations: []
|
|
459
|
+
});
|
|
460
|
+
analyzeAccessPatterns = (context) => [];
|
|
461
|
+
generateDataStructureSuggestions = (context) => [];
|
|
462
|
+
analyzeSingleResponsibility = (context) => 7;
|
|
463
|
+
analyzeSeparationOfConcerns = (context) => 7;
|
|
464
|
+
analyzeNaming = (context) => ({
|
|
465
|
+
consistency: 8,
|
|
466
|
+
clarity: 7,
|
|
467
|
+
conventions: [],
|
|
468
|
+
suggestions: []
|
|
469
|
+
});
|
|
470
|
+
analyzeStructure = (context) => ({
|
|
471
|
+
logicalFlow: 7,
|
|
472
|
+
layering: 8,
|
|
473
|
+
modularity: 7,
|
|
474
|
+
issues: []
|
|
475
|
+
});
|
|
476
|
+
analyzeDependencies = (context) => ({
|
|
477
|
+
count: 5,
|
|
478
|
+
depth: 3,
|
|
479
|
+
circular: [],
|
|
480
|
+
unnecessary: [],
|
|
481
|
+
suggestions: []
|
|
482
|
+
});
|
|
483
|
+
calculateCohesion = (context) => 7;
|
|
484
|
+
calculateCoupling = (context) => 4;
|
|
485
|
+
calculateCodeMetrics(context) {
|
|
486
|
+
return {
|
|
487
|
+
linesOfCode: context.ast.metrics.linesOfCode,
|
|
488
|
+
linesOfComments: context.ast.metrics.linesOfComments,
|
|
489
|
+
commentRatio: context.ast.metrics.linesOfComments / context.ast.metrics.linesOfCode,
|
|
490
|
+
maintainabilityIndex: 85, // Simplified calculation
|
|
491
|
+
technicalDebt: {
|
|
492
|
+
totalHours: 8,
|
|
493
|
+
categories: [{ name: 'Complexity', hours: 5, percentage: 62.5 }],
|
|
494
|
+
priority: [{ issue: 'High complexity functions', hours: 3, impact: 'High', urgency: 8 }],
|
|
495
|
+
trends: [{ period: 'current', change: -2, direction: 'decreasing' }]
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
// Quality report generation methods
|
|
500
|
+
calculateQualitySummary(results) {
|
|
501
|
+
const total = results.length;
|
|
502
|
+
const good = results.filter(r => r.overallScore === QualityScore.GOOD).length;
|
|
503
|
+
const passable = results.filter(r => r.overallScore === QualityScore.PASSABLE).length;
|
|
504
|
+
const garbage = results.filter(r => r.overallScore === QualityScore.GARBAGE).length;
|
|
505
|
+
return {
|
|
506
|
+
totalFiles: total,
|
|
507
|
+
goodFiles: good,
|
|
508
|
+
passableFiles: passable,
|
|
509
|
+
garbageFiles: garbage,
|
|
510
|
+
averageScore: (good * 10 + passable * 6 + garbage * 2) / total,
|
|
511
|
+
topIssues: ['High complexity', 'Magic numbers', 'Poor naming'],
|
|
512
|
+
technicalDebt: results.reduce((sum, r) => sum + r.metrics.technicalDebt.totalHours, 0)
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
calculateQualityTrends(results) {
|
|
516
|
+
return [{
|
|
517
|
+
metric: 'Overall Quality',
|
|
518
|
+
current: 7.5,
|
|
519
|
+
previous: 7.0,
|
|
520
|
+
change: 0.5,
|
|
521
|
+
direction: 'improving'
|
|
522
|
+
}];
|
|
523
|
+
}
|
|
524
|
+
generateQualityRecommendations(results) {
|
|
525
|
+
return [{
|
|
526
|
+
priority: ImprovementPriority.HIGH,
|
|
527
|
+
description: 'Address high complexity functions',
|
|
528
|
+
impact: 'Improved maintainability and reduced bugs',
|
|
529
|
+
effort: EffortEstimate.MEDIUM,
|
|
530
|
+
files: results.filter(r => r.complexityAnalysis.score < 6).map(r => r.filePath)
|
|
531
|
+
}];
|
|
532
|
+
}
|
|
533
|
+
// Extract violations and generate improvements (simplified implementations)
|
|
534
|
+
extractTasteViolations = (taste) => [];
|
|
535
|
+
extractComplexityViolations = (complexity) => [];
|
|
536
|
+
extractSpecialCaseViolations = (specialCase) => [];
|
|
537
|
+
extractDataStructureViolations = (dataStructure) => [];
|
|
538
|
+
extractOrganizationViolations = (organization) => [];
|
|
539
|
+
generateTasteImprovements = (taste) => [];
|
|
540
|
+
generateComplexityImprovements = (complexity) => [];
|
|
541
|
+
generateSpecialCaseImprovements = (specialCase) => [];
|
|
542
|
+
generateDataStructureImprovements = (dataStructure) => [];
|
|
543
|
+
generateOrganizationImprovements = (organization) => [];
|
|
544
|
+
};
|
|
545
|
+
LinusCodeReviewer = __decorate([
|
|
546
|
+
injectable(),
|
|
547
|
+
__param(0, inject(TYPES.LoggerPort)),
|
|
548
|
+
__metadata("design:paramtypes", [Object, ASTAnalyzer])
|
|
549
|
+
], LinusCodeReviewer);
|
|
550
|
+
export { LinusCodeReviewer };
|
|
551
|
+
//# sourceMappingURL=LinusCodeReviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinusCodeReviewer.js","sourceRoot":"","sources":["../../../src/infrastructure/quality/LinusCodeReviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Project } from '../../domain/types.js';
|
|
2
|
+
import { ProjectRepository } from '../../domain/ports.js';
|
|
3
|
+
export declare class InMemoryProjectRepository implements ProjectRepository {
|
|
4
|
+
private readonly projects;
|
|
5
|
+
save(project: Project): Promise<void>;
|
|
6
|
+
findById(id: string): Promise<Project | null>;
|
|
7
|
+
findByPath(path: string): Promise<Project | null>;
|
|
8
|
+
list(): Promise<Project[]>;
|
|
9
|
+
delete(id: string): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { injectable } from 'inversify';
|
|
8
|
+
let InMemoryProjectRepository = class InMemoryProjectRepository {
|
|
9
|
+
projects = new Map();
|
|
10
|
+
async save(project) {
|
|
11
|
+
this.projects.set(project.id, project);
|
|
12
|
+
}
|
|
13
|
+
async findById(id) {
|
|
14
|
+
return this.projects.get(id) ?? null;
|
|
15
|
+
}
|
|
16
|
+
async findByPath(path) {
|
|
17
|
+
for (const project of this.projects.values()) {
|
|
18
|
+
if (project.path === path) {
|
|
19
|
+
return project;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
async list() {
|
|
25
|
+
return Array.from(this.projects.values());
|
|
26
|
+
}
|
|
27
|
+
async delete(id) {
|
|
28
|
+
this.projects.delete(id);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
InMemoryProjectRepository = __decorate([
|
|
32
|
+
injectable()
|
|
33
|
+
], InMemoryProjectRepository);
|
|
34
|
+
export { InMemoryProjectRepository };
|
|
35
|
+
//# sourceMappingURL=InMemoryProjectRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryProjectRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/InMemoryProjectRepository.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAKhC,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEvD,KAAK,CAAC,IAAI,CAAC,OAAgB;QACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;CACF,CAAA;AA3BY,yBAAyB;IADrC,UAAU,EAAE;GACA,yBAAyB,CA2BrC"}
|