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.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/__tests__/setup.d.ts +44 -0
  4. package/dist/__tests__/setup.js +178 -0
  5. package/dist/__tests__/setup.js.map +1 -0
  6. package/dist/__tests__/test-helpers/mock-factories.d.ts +26 -0
  7. package/dist/__tests__/test-helpers/mock-factories.js +466 -0
  8. package/dist/__tests__/test-helpers/mock-factories.js.map +1 -0
  9. package/dist/adapters/cli/SDDToolAdapter.d.ts +26 -0
  10. package/dist/adapters/cli/SDDToolAdapter.js +273 -0
  11. package/dist/adapters/cli/SDDToolAdapter.js.map +1 -0
  12. package/dist/application/services/CodebaseAnalysisService.d.ts +38 -0
  13. package/dist/application/services/CodebaseAnalysisService.js +737 -0
  14. package/dist/application/services/CodebaseAnalysisService.js.map +1 -0
  15. package/dist/application/services/LocalizationService.d.ts +184 -0
  16. package/dist/application/services/LocalizationService.js +536 -0
  17. package/dist/application/services/LocalizationService.js.map +1 -0
  18. package/dist/application/services/ProjectContextService.d.ts +61 -0
  19. package/dist/application/services/ProjectContextService.js +550 -0
  20. package/dist/application/services/ProjectContextService.js.map +1 -0
  21. package/dist/application/services/ProjectInitializationService.d.ts +57 -0
  22. package/dist/application/services/ProjectInitializationService.js +485 -0
  23. package/dist/application/services/ProjectInitializationService.js.map +1 -0
  24. package/dist/application/services/ProjectService.d.ts +19 -0
  25. package/dist/application/services/ProjectService.js +159 -0
  26. package/dist/application/services/ProjectService.js.map +1 -0
  27. package/dist/application/services/QualityGateService.d.ts +62 -0
  28. package/dist/application/services/QualityGateService.js +428 -0
  29. package/dist/application/services/QualityGateService.js.map +1 -0
  30. package/dist/application/services/QualityService.d.ts +43 -0
  31. package/dist/application/services/QualityService.js +245 -0
  32. package/dist/application/services/QualityService.js.map +1 -0
  33. package/dist/application/services/SteeringDocumentService.d.ts +62 -0
  34. package/dist/application/services/SteeringDocumentService.js +694 -0
  35. package/dist/application/services/SteeringDocumentService.js.map +1 -0
  36. package/dist/application/services/TemplateService.d.ts +47 -0
  37. package/dist/application/services/TemplateService.js +438 -0
  38. package/dist/application/services/TemplateService.js.map +1 -0
  39. package/dist/application/services/WorkflowEngineService.d.ts +56 -0
  40. package/dist/application/services/WorkflowEngineService.js +348 -0
  41. package/dist/application/services/WorkflowEngineService.js.map +1 -0
  42. package/dist/application/services/WorkflowService.d.ts +22 -0
  43. package/dist/application/services/WorkflowService.js +147 -0
  44. package/dist/application/services/WorkflowService.js.map +1 -0
  45. package/dist/application/services/WorkflowValidationService.d.ts +51 -0
  46. package/dist/application/services/WorkflowValidationService.js +665 -0
  47. package/dist/application/services/WorkflowValidationService.js.map +1 -0
  48. package/dist/domain/context/ProjectContext.d.ts +350 -0
  49. package/dist/domain/context/ProjectContext.js +138 -0
  50. package/dist/domain/context/ProjectContext.js.map +1 -0
  51. package/dist/domain/i18n/index.d.ts +286 -0
  52. package/dist/domain/i18n/index.js +97 -0
  53. package/dist/domain/i18n/index.js.map +1 -0
  54. package/dist/domain/plugins/index.d.ts +498 -0
  55. package/dist/domain/plugins/index.js +157 -0
  56. package/dist/domain/plugins/index.js.map +1 -0
  57. package/dist/domain/ports.d.ts +54 -0
  58. package/dist/domain/ports.js +3 -0
  59. package/dist/domain/ports.js.map +1 -0
  60. package/dist/domain/quality/index.d.ts +361 -0
  61. package/dist/domain/quality/index.js +113 -0
  62. package/dist/domain/quality/index.js.map +1 -0
  63. package/dist/domain/services/DomainService.d.ts +18 -0
  64. package/dist/domain/services/DomainService.js +71 -0
  65. package/dist/domain/services/DomainService.js.map +1 -0
  66. package/dist/domain/templates/index.d.ts +158 -0
  67. package/dist/domain/templates/index.js +22 -0
  68. package/dist/domain/templates/index.js.map +1 -0
  69. package/dist/domain/types.d.ts +115 -0
  70. package/dist/domain/types.js +37 -0
  71. package/dist/domain/types.js.map +1 -0
  72. package/dist/domain/workflow/WorkflowStateMachine.d.ts +62 -0
  73. package/dist/domain/workflow/WorkflowStateMachine.js +286 -0
  74. package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -0
  75. package/dist/index.d.ts +19 -0
  76. package/dist/index.js +97 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/infrastructure/adapters/AjvValidationAdapter.d.ts +7 -0
  79. package/dist/infrastructure/adapters/AjvValidationAdapter.js +37 -0
  80. package/dist/infrastructure/adapters/AjvValidationAdapter.js.map +1 -0
  81. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.d.ts +8 -0
  82. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js +41 -0
  83. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js.map +1 -0
  84. package/dist/infrastructure/adapters/FileBasedTaskTracker.d.ts +9 -0
  85. package/dist/infrastructure/adapters/FileBasedTaskTracker.js +41 -0
  86. package/dist/infrastructure/adapters/FileBasedTaskTracker.js.map +1 -0
  87. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.d.ts +8 -0
  88. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js +38 -0
  89. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js.map +1 -0
  90. package/dist/infrastructure/adapters/JsonConfigurationAdapter.d.ts +7 -0
  91. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js +24 -0
  92. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js.map +1 -0
  93. package/dist/infrastructure/adapters/LinusQualityAnalyzer.d.ts +9 -0
  94. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js +75 -0
  95. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js.map +1 -0
  96. package/dist/infrastructure/adapters/NodeFileSystemAdapter.d.ts +12 -0
  97. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js +39 -0
  98. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js.map +1 -0
  99. package/dist/infrastructure/di/container.d.ts +3 -0
  100. package/dist/infrastructure/di/container.js +98 -0
  101. package/dist/infrastructure/di/container.js.map +1 -0
  102. package/dist/infrastructure/di/types.d.ts +39 -0
  103. package/dist/infrastructure/di/types.js +45 -0
  104. package/dist/infrastructure/di/types.js.map +1 -0
  105. package/dist/infrastructure/i18n/I18nextService.d.ts +27 -0
  106. package/dist/infrastructure/i18n/I18nextService.js +357 -0
  107. package/dist/infrastructure/i18n/I18nextService.js.map +1 -0
  108. package/dist/infrastructure/mcp/CapabilityNegotiator.d.ts +21 -0
  109. package/dist/infrastructure/mcp/CapabilityNegotiator.js +75 -0
  110. package/dist/infrastructure/mcp/CapabilityNegotiator.js.map +1 -0
  111. package/dist/infrastructure/mcp/ErrorHandler.d.ts +29 -0
  112. package/dist/infrastructure/mcp/ErrorHandler.js +101 -0
  113. package/dist/infrastructure/mcp/ErrorHandler.js.map +1 -0
  114. package/dist/infrastructure/mcp/MCPServer.d.ts +25 -0
  115. package/dist/infrastructure/mcp/MCPServer.js +246 -0
  116. package/dist/infrastructure/mcp/MCPServer.js.map +1 -0
  117. package/dist/infrastructure/mcp/PromptManager.d.ts +18 -0
  118. package/dist/infrastructure/mcp/PromptManager.js +373 -0
  119. package/dist/infrastructure/mcp/PromptManager.js.map +1 -0
  120. package/dist/infrastructure/mcp/ResourceManager.d.ts +15 -0
  121. package/dist/infrastructure/mcp/ResourceManager.js +229 -0
  122. package/dist/infrastructure/mcp/ResourceManager.js.map +1 -0
  123. package/dist/infrastructure/mcp/SessionManager.d.ts +64 -0
  124. package/dist/infrastructure/mcp/SessionManager.js +221 -0
  125. package/dist/infrastructure/mcp/SessionManager.js.map +1 -0
  126. package/dist/infrastructure/mcp/ToolRegistry.d.ts +48 -0
  127. package/dist/infrastructure/mcp/ToolRegistry.js +235 -0
  128. package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -0
  129. package/dist/infrastructure/platform/PlatformAdapter.d.ts +46 -0
  130. package/dist/infrastructure/platform/PlatformAdapter.js +355 -0
  131. package/dist/infrastructure/platform/PlatformAdapter.js.map +1 -0
  132. package/dist/infrastructure/plugins/HookSystem.d.ts +40 -0
  133. package/dist/infrastructure/plugins/HookSystem.js +415 -0
  134. package/dist/infrastructure/plugins/HookSystem.js.map +1 -0
  135. package/dist/infrastructure/plugins/PluginManager.d.ts +51 -0
  136. package/dist/infrastructure/plugins/PluginManager.js +650 -0
  137. package/dist/infrastructure/plugins/PluginManager.js.map +1 -0
  138. package/dist/infrastructure/plugins/PluginSteeringRegistry.d.ts +63 -0
  139. package/dist/infrastructure/plugins/PluginSteeringRegistry.js +439 -0
  140. package/dist/infrastructure/plugins/PluginSteeringRegistry.js.map +1 -0
  141. package/dist/infrastructure/plugins/PluginToolRegistry.d.ts +54 -0
  142. package/dist/infrastructure/plugins/PluginToolRegistry.js +490 -0
  143. package/dist/infrastructure/plugins/PluginToolRegistry.js.map +1 -0
  144. package/dist/infrastructure/quality/ASTAnalyzer.d.ts +65 -0
  145. package/dist/infrastructure/quality/ASTAnalyzer.js +439 -0
  146. package/dist/infrastructure/quality/ASTAnalyzer.js.map +1 -0
  147. package/dist/infrastructure/quality/LinusCodeReviewer.d.ts +52 -0
  148. package/dist/infrastructure/quality/LinusCodeReviewer.js +551 -0
  149. package/dist/infrastructure/quality/LinusCodeReviewer.js.map +1 -0
  150. package/dist/infrastructure/repositories/InMemoryProjectRepository.d.ts +10 -0
  151. package/dist/infrastructure/repositories/InMemoryProjectRepository.js +35 -0
  152. package/dist/infrastructure/repositories/InMemoryProjectRepository.js.map +1 -0
  153. package/dist/infrastructure/schemas/project.schema.d.ts +192 -0
  154. package/dist/infrastructure/schemas/project.schema.js +114 -0
  155. package/dist/infrastructure/schemas/project.schema.js.map +1 -0
  156. package/dist/infrastructure/templates/FileGenerator.d.ts +15 -0
  157. package/dist/infrastructure/templates/FileGenerator.js +385 -0
  158. package/dist/infrastructure/templates/FileGenerator.js.map +1 -0
  159. package/dist/infrastructure/templates/HandlebarsRenderer.d.ts +16 -0
  160. package/dist/infrastructure/templates/HandlebarsRenderer.js +252 -0
  161. package/dist/infrastructure/templates/HandlebarsRenderer.js.map +1 -0
  162. package/dist/infrastructure/templates/TemplateManager.d.ts +36 -0
  163. package/dist/infrastructure/templates/TemplateManager.js +777 -0
  164. package/dist/infrastructure/templates/TemplateManager.js.map +1 -0
  165. package/package.json +89 -0
@@ -0,0 +1,439 @@
1
+ // AST parsing and analysis for multiple programming languages
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 * as typescript from '@typescript-eslint/typescript-estree';
16
+ import { parse as parseJavaScript } from 'esprima';
17
+ import { parse as parseBabel } from '@babel/parser';
18
+ import { TYPES } from '../di/types.js';
19
+ let ASTAnalyzer = class ASTAnalyzer {
20
+ logger;
21
+ constructor(logger) {
22
+ this.logger = logger;
23
+ }
24
+ async parseFile(content, language, filePath) {
25
+ try {
26
+ switch (language) {
27
+ case ProgrammingLanguage.TYPESCRIPT:
28
+ return this.parseTypeScript(content, filePath);
29
+ case ProgrammingLanguage.JAVASCRIPT:
30
+ return this.parseJavaScript(content, filePath);
31
+ default:
32
+ throw new Error(`Unsupported language for AST parsing: ${language}`);
33
+ }
34
+ }
35
+ catch (error) {
36
+ this.logger.error('AST parsing failed', {
37
+ language,
38
+ filePath,
39
+ error: error instanceof Error ? error.message : String(error)
40
+ });
41
+ return {
42
+ ast: { type: 'Error' },
43
+ language,
44
+ errors: [{
45
+ message: error instanceof Error ? error.message : String(error),
46
+ severity: 'error'
47
+ }],
48
+ metrics: this.getEmptyMetrics()
49
+ };
50
+ }
51
+ }
52
+ parseTypeScript(content, filePath) {
53
+ const errors = [];
54
+ try {
55
+ const ast = typescript.parse(content, {
56
+ loc: true,
57
+ range: true,
58
+ comment: true,
59
+ attachComments: true,
60
+ errorOnUnknownASTType: false,
61
+ errorOnTypeScriptSyntacticAndSemanticIssues: false,
62
+ jsx: filePath?.endsWith('.tsx') || content.includes('jsx'),
63
+ useJSXTextNode: true
64
+ });
65
+ const metrics = this.calculateMetrics(ast, content);
66
+ this.logger.debug('TypeScript AST parsed successfully', {
67
+ filePath,
68
+ nodeCount: this.countNodes(ast),
69
+ linesOfCode: metrics.linesOfCode
70
+ });
71
+ return {
72
+ ast: ast,
73
+ language: ProgrammingLanguage.TYPESCRIPT,
74
+ errors,
75
+ metrics
76
+ };
77
+ }
78
+ catch (error) {
79
+ if (error instanceof Error) {
80
+ errors.push({
81
+ message: error.message,
82
+ severity: 'error'
83
+ });
84
+ }
85
+ throw error;
86
+ }
87
+ }
88
+ parseJavaScript(content, filePath) {
89
+ const errors = [];
90
+ try {
91
+ // Try Babel parser first for modern JavaScript features
92
+ const ast = parseBabel(content, {
93
+ sourceType: 'module',
94
+ allowImportExportEverywhere: true,
95
+ allowReturnOutsideFunction: true,
96
+ plugins: [
97
+ 'jsx',
98
+ 'typescript',
99
+ 'decorators-legacy',
100
+ 'classProperties',
101
+ 'functionBind',
102
+ 'exportDefaultFrom',
103
+ 'exportNamespaceFrom',
104
+ 'dynamicImport',
105
+ 'nullishCoalescingOperator',
106
+ 'optionalChaining',
107
+ 'objectRestSpread',
108
+ 'asyncGenerators'
109
+ ],
110
+ ranges: true
111
+ });
112
+ const metrics = this.calculateMetrics(ast, content);
113
+ this.logger.debug('JavaScript AST parsed successfully', {
114
+ filePath,
115
+ nodeCount: this.countNodes(ast),
116
+ linesOfCode: metrics.linesOfCode
117
+ });
118
+ return {
119
+ ast: ast,
120
+ language: ProgrammingLanguage.JAVASCRIPT,
121
+ errors,
122
+ metrics
123
+ };
124
+ }
125
+ catch (babelError) {
126
+ // Fallback to Esprima for compatibility
127
+ try {
128
+ const ast = parseJavaScript(content, {
129
+ loc: true,
130
+ range: true,
131
+ attachComments: true,
132
+ tolerant: true,
133
+ jsx: true
134
+ });
135
+ const metrics = this.calculateMetrics(ast, content);
136
+ return {
137
+ ast: ast,
138
+ language: ProgrammingLanguage.JAVASCRIPT,
139
+ errors,
140
+ metrics
141
+ };
142
+ }
143
+ catch (esprimaError) {
144
+ if (babelError instanceof Error) {
145
+ errors.push({
146
+ message: `Babel: ${babelError.message}`,
147
+ severity: 'error'
148
+ });
149
+ }
150
+ if (esprimaError instanceof Error) {
151
+ errors.push({
152
+ message: `Esprima: ${esprimaError.message}`,
153
+ severity: 'error'
154
+ });
155
+ }
156
+ throw babelError;
157
+ }
158
+ }
159
+ }
160
+ calculateMetrics(ast, content) {
161
+ const lines = content.split('\n');
162
+ const linesOfCode = this.countLinesOfCode(lines);
163
+ const linesOfComments = this.countLinesOfComments(lines);
164
+ const functionCount = this.countFunctions(ast);
165
+ const classCount = this.countClasses(ast);
166
+ const cyclomaticComplexity = this.calculateCyclomaticComplexity(ast);
167
+ const nestingDepth = this.calculateMaxNestingDepth(ast);
168
+ return {
169
+ linesOfCode,
170
+ linesOfComments,
171
+ functionCount,
172
+ classCount,
173
+ cyclomaticComplexity,
174
+ nestingDepth
175
+ };
176
+ }
177
+ countLinesOfCode(lines) {
178
+ let count = 0;
179
+ for (const line of lines) {
180
+ const trimmed = line.trim();
181
+ if (trimmed && !trimmed.startsWith('//') && !trimmed.startsWith('/*') && trimmed !== '*/') {
182
+ count++;
183
+ }
184
+ }
185
+ return count;
186
+ }
187
+ countLinesOfComments(lines) {
188
+ let count = 0;
189
+ let inBlockComment = false;
190
+ for (const line of lines) {
191
+ const trimmed = line.trim();
192
+ if (trimmed.includes('/*'))
193
+ inBlockComment = true;
194
+ if (inBlockComment || trimmed.startsWith('//')) {
195
+ count++;
196
+ }
197
+ if (trimmed.includes('*/'))
198
+ inBlockComment = false;
199
+ }
200
+ return count;
201
+ }
202
+ countNodes(node) {
203
+ let count = 1;
204
+ for (const [key, value] of Object.entries(node)) {
205
+ if (key === 'parent' || key === 'leadingComments' || key === 'trailingComments') {
206
+ continue;
207
+ }
208
+ if (Array.isArray(value)) {
209
+ for (const item of value) {
210
+ if (item && typeof item === 'object' && 'type' in item) {
211
+ count += this.countNodes(item);
212
+ }
213
+ }
214
+ }
215
+ else if (value && typeof value === 'object' && 'type' in value) {
216
+ count += this.countNodes(value);
217
+ }
218
+ }
219
+ return count;
220
+ }
221
+ countFunctions(ast) {
222
+ const functionTypes = [
223
+ 'FunctionDeclaration',
224
+ 'FunctionExpression',
225
+ 'ArrowFunctionExpression',
226
+ 'MethodDefinition',
227
+ 'Property' // For object method properties
228
+ ];
229
+ return this.countNodeTypes(ast, functionTypes);
230
+ }
231
+ countClasses(ast) {
232
+ return this.countNodeTypes(ast, ['ClassDeclaration', 'ClassExpression']);
233
+ }
234
+ countNodeTypes(node, types) {
235
+ let count = types.includes(node.type) ? 1 : 0;
236
+ for (const [key, value] of Object.entries(node)) {
237
+ if (key === 'parent' || key === 'leadingComments' || key === 'trailingComments') {
238
+ continue;
239
+ }
240
+ if (Array.isArray(value)) {
241
+ for (const item of value) {
242
+ if (item && typeof item === 'object' && 'type' in item) {
243
+ count += this.countNodeTypes(item, types);
244
+ }
245
+ }
246
+ }
247
+ else if (value && typeof value === 'object' && 'type' in value) {
248
+ count += this.countNodeTypes(value, types);
249
+ }
250
+ }
251
+ return count;
252
+ }
253
+ calculateCyclomaticComplexity(ast) {
254
+ // Start with base complexity of 1
255
+ let complexity = 1;
256
+ const complexityNodes = [
257
+ 'IfStatement',
258
+ 'ConditionalExpression',
259
+ 'SwitchCase',
260
+ 'WhileStatement',
261
+ 'ForStatement',
262
+ 'ForInStatement',
263
+ 'ForOfStatement',
264
+ 'DoWhileStatement',
265
+ 'CatchClause',
266
+ 'LogicalExpression'
267
+ ];
268
+ complexity += this.countNodeTypes(ast, complexityNodes);
269
+ // Add complexity for logical operators
270
+ complexity += this.countLogicalOperators(ast);
271
+ return complexity;
272
+ }
273
+ countLogicalOperators(node) {
274
+ let count = 0;
275
+ if (node.type === 'LogicalExpression') {
276
+ const operator = node.operator;
277
+ if (operator === '&&' || operator === '||') {
278
+ count += 1;
279
+ }
280
+ }
281
+ for (const [key, value] of Object.entries(node)) {
282
+ if (key === 'parent' || key === 'leadingComments' || key === 'trailingComments') {
283
+ continue;
284
+ }
285
+ if (Array.isArray(value)) {
286
+ for (const item of value) {
287
+ if (item && typeof item === 'object' && 'type' in item) {
288
+ count += this.countLogicalOperators(item);
289
+ }
290
+ }
291
+ }
292
+ else if (value && typeof value === 'object' && 'type' in value) {
293
+ count += this.countLogicalOperators(value);
294
+ }
295
+ }
296
+ return count;
297
+ }
298
+ calculateMaxNestingDepth(ast, currentDepth = 0) {
299
+ const nestingNodes = [
300
+ 'BlockStatement',
301
+ 'IfStatement',
302
+ 'WhileStatement',
303
+ 'ForStatement',
304
+ 'ForInStatement',
305
+ 'ForOfStatement',
306
+ 'DoWhileStatement',
307
+ 'SwitchStatement',
308
+ 'TryStatement',
309
+ 'CatchClause',
310
+ 'FunctionDeclaration',
311
+ 'FunctionExpression',
312
+ 'ArrowFunctionExpression'
313
+ ];
314
+ const isNestingNode = nestingNodes.includes(ast.type);
315
+ const depth = isNestingNode ? currentDepth + 1 : currentDepth;
316
+ let maxDepth = depth;
317
+ for (const [key, value] of Object.entries(ast)) {
318
+ if (key === 'parent' || key === 'leadingComments' || key === 'trailingComments') {
319
+ continue;
320
+ }
321
+ if (Array.isArray(value)) {
322
+ for (const item of value) {
323
+ if (item && typeof item === 'object' && 'type' in item) {
324
+ const childDepth = this.calculateMaxNestingDepth(item, depth);
325
+ maxDepth = Math.max(maxDepth, childDepth);
326
+ }
327
+ }
328
+ }
329
+ else if (value && typeof value === 'object' && 'type' in value) {
330
+ const childDepth = this.calculateMaxNestingDepth(value, depth);
331
+ maxDepth = Math.max(maxDepth, childDepth);
332
+ }
333
+ }
334
+ return maxDepth;
335
+ }
336
+ findComplexityHotspots(ast, filePath) {
337
+ const hotspots = [];
338
+ this.findHotspotsRecursive(ast, hotspots, filePath);
339
+ // Sort by complexity descending
340
+ return hotspots.sort((a, b) => b.complexity - a.complexity);
341
+ }
342
+ findHotspotsRecursive(node, hotspots, filePath) {
343
+ const functionTypes = [
344
+ 'FunctionDeclaration',
345
+ 'FunctionExpression',
346
+ 'ArrowFunctionExpression',
347
+ 'MethodDefinition'
348
+ ];
349
+ if (functionTypes.includes(node.type)) {
350
+ const complexity = this.calculateCyclomaticComplexity(node);
351
+ const nestingDepth = this.calculateMaxNestingDepth(node);
352
+ const name = this.getFunctionName(node);
353
+ const line = node.loc?.start.line || 0;
354
+ // Consider functions with complexity > 10 or nesting > 4 as hotspots
355
+ if (complexity > 10) {
356
+ hotspots.push({
357
+ functionName: name,
358
+ line,
359
+ complexity,
360
+ type: ComplexityType.CYCLOMATIC,
361
+ reason: `High cyclomatic complexity (${complexity})`,
362
+ suggestion: 'Break down into smaller functions and reduce branching'
363
+ });
364
+ }
365
+ if (nestingDepth > 4) {
366
+ hotspots.push({
367
+ functionName: name,
368
+ line,
369
+ complexity: nestingDepth,
370
+ type: ComplexityType.NESTING,
371
+ reason: `Deep nesting (${nestingDepth} levels)`,
372
+ suggestion: 'Extract nested logic into separate functions'
373
+ });
374
+ }
375
+ // Check function length
376
+ if (node.loc) {
377
+ const length = node.loc.end.line - node.loc.start.line;
378
+ if (length > 50) {
379
+ hotspots.push({
380
+ functionName: name,
381
+ line,
382
+ complexity: length,
383
+ type: ComplexityType.LENGTH,
384
+ reason: `Long function (${length} lines)`,
385
+ suggestion: 'Split into smaller, focused functions'
386
+ });
387
+ }
388
+ }
389
+ }
390
+ // Recursively check child nodes
391
+ for (const [key, value] of Object.entries(node)) {
392
+ if (key === 'parent' || key === 'leadingComments' || key === 'trailingComments') {
393
+ continue;
394
+ }
395
+ if (Array.isArray(value)) {
396
+ for (const item of value) {
397
+ if (item && typeof item === 'object' && 'type' in item) {
398
+ this.findHotspotsRecursive(item, hotspots, filePath);
399
+ }
400
+ }
401
+ }
402
+ else if (value && typeof value === 'object' && 'type' in value) {
403
+ this.findHotspotsRecursive(value, hotspots, filePath);
404
+ }
405
+ }
406
+ }
407
+ getFunctionName(node) {
408
+ const nodeAny = node;
409
+ switch (node.type) {
410
+ case 'FunctionDeclaration':
411
+ return nodeAny.id?.name || 'anonymous';
412
+ case 'FunctionExpression':
413
+ return nodeAny.id?.name || 'anonymous';
414
+ case 'ArrowFunctionExpression':
415
+ return 'arrow function';
416
+ case 'MethodDefinition':
417
+ return nodeAny.key?.name || 'method';
418
+ default:
419
+ return 'unknown';
420
+ }
421
+ }
422
+ getEmptyMetrics() {
423
+ return {
424
+ linesOfCode: 0,
425
+ linesOfComments: 0,
426
+ functionCount: 0,
427
+ classCount: 0,
428
+ cyclomaticComplexity: 0,
429
+ nestingDepth: 0
430
+ };
431
+ }
432
+ };
433
+ ASTAnalyzer = __decorate([
434
+ injectable(),
435
+ __param(0, inject(TYPES.LoggerPort)),
436
+ __metadata("design:paramtypes", [Object])
437
+ ], ASTAnalyzer);
438
+ export { ASTAnalyzer };
439
+ //# sourceMappingURL=ASTAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ASTAnalyzer.js","sourceRoot":"","sources":["../../../src/infrastructure/quality/ASTAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { LoggerPort } from '../../domain/ports.js';
2
+ import type { CodeQualityAnalyzerPort, CodeAnalysisResult, QualityReport } from '../../domain/quality/index.js';
3
+ import { ASTAnalyzer } from './ASTAnalyzer.js';
4
+ export declare class LinusCodeReviewer implements CodeQualityAnalyzerPort {
5
+ private readonly logger;
6
+ private readonly astAnalyzer;
7
+ constructor(logger: LoggerPort, astAnalyzer?: ASTAnalyzer);
8
+ analyzeFile(filePath: string, content: string): Promise<CodeAnalysisResult>;
9
+ analyzeBatch(files: Array<{
10
+ path: string;
11
+ content: string;
12
+ }>): Promise<CodeAnalysisResult[]>;
13
+ getQualityReport(results: CodeAnalysisResult[]): Promise<QualityReport>;
14
+ private analyzeTaste;
15
+ private analyzeComplexity;
16
+ private analyzeSpecialCases;
17
+ private analyzeDataStructures;
18
+ private analyzeOrganization;
19
+ private detectLanguage;
20
+ private calculateOverallScore;
21
+ private findConfusingNames;
22
+ private findMagicNumbers;
23
+ private findHardcodedValues;
24
+ private generateTasteReasoning;
25
+ private generateGeneralizations;
26
+ private analyzeDataStructureAppropriateness;
27
+ private analyzeDataStructureEfficiency;
28
+ private analyzeMemoryUsage;
29
+ private analyzeAccessPatterns;
30
+ private generateDataStructureSuggestions;
31
+ private analyzeSingleResponsibility;
32
+ private analyzeSeparationOfConcerns;
33
+ private analyzeNaming;
34
+ private analyzeStructure;
35
+ private analyzeDependencies;
36
+ private calculateCohesion;
37
+ private calculateCoupling;
38
+ private calculateCodeMetrics;
39
+ private calculateQualitySummary;
40
+ private calculateQualityTrends;
41
+ private generateQualityRecommendations;
42
+ private extractTasteViolations;
43
+ private extractComplexityViolations;
44
+ private extractSpecialCaseViolations;
45
+ private extractDataStructureViolations;
46
+ private extractOrganizationViolations;
47
+ private generateTasteImprovements;
48
+ private generateComplexityImprovements;
49
+ private generateSpecialCaseImprovements;
50
+ private generateDataStructureImprovements;
51
+ private generateOrganizationImprovements;
52
+ }