@stackguide/mcp-server 3.0.0 → 3.2.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 (36) hide show
  1. package/dist/config/types.d.ts +51 -4
  2. package/dist/config/types.d.ts.map +1 -1
  3. package/dist/config/types.js.map +1 -1
  4. package/dist/services/astAnalyzer.d.ts +21 -0
  5. package/dist/services/astAnalyzer.d.ts.map +1 -0
  6. package/dist/services/astAnalyzer.js +593 -0
  7. package/dist/services/astAnalyzer.js.map +1 -0
  8. package/dist/services/codeAnalyzer.d.ts +54 -14
  9. package/dist/services/codeAnalyzer.d.ts.map +1 -1
  10. package/dist/services/codeAnalyzer.js +209 -37
  11. package/dist/services/codeAnalyzer.js.map +1 -1
  12. package/dist/services/parsers/baseParser.d.ts +44 -0
  13. package/dist/services/parsers/baseParser.d.ts.map +1 -0
  14. package/dist/services/parsers/baseParser.js +177 -0
  15. package/dist/services/parsers/baseParser.js.map +1 -0
  16. package/dist/services/parsers/goParser.d.ts +28 -0
  17. package/dist/services/parsers/goParser.d.ts.map +1 -0
  18. package/dist/services/parsers/goParser.js +590 -0
  19. package/dist/services/parsers/goParser.js.map +1 -0
  20. package/dist/services/parsers/index.d.ts +62 -0
  21. package/dist/services/parsers/index.d.ts.map +1 -0
  22. package/dist/services/parsers/index.js +121 -0
  23. package/dist/services/parsers/index.js.map +1 -0
  24. package/dist/services/parsers/pythonParser.d.ts +28 -0
  25. package/dist/services/parsers/pythonParser.d.ts.map +1 -0
  26. package/dist/services/parsers/pythonParser.js +663 -0
  27. package/dist/services/parsers/pythonParser.js.map +1 -0
  28. package/dist/services/parsers/rustParser.d.ts +28 -0
  29. package/dist/services/parsers/rustParser.d.ts.map +1 -0
  30. package/dist/services/parsers/rustParser.js +654 -0
  31. package/dist/services/parsers/rustParser.js.map +1 -0
  32. package/dist/services/parsers/types.d.ts +241 -0
  33. package/dist/services/parsers/types.d.ts.map +1 -0
  34. package/dist/services/parsers/types.js +47 -0
  35. package/dist/services/parsers/types.js.map +1 -0
  36. package/package.json +2 -1
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Base Language Parser
3
+ * Abstract base class for language-specific parsers
4
+ * @version 3.2.0
5
+ */
6
+ import { logger } from '../../utils/logger.js';
7
+ /**
8
+ * Abstract base class for language parsers
9
+ */
10
+ export class BaseLanguageParser {
11
+ rules = [];
12
+ /**
13
+ * Get language-specific rules
14
+ */
15
+ getRules() {
16
+ return this.rules.filter(r => r.enabled);
17
+ }
18
+ /**
19
+ * Check if parser can handle this file
20
+ */
21
+ canHandle(filePath) {
22
+ const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase();
23
+ return this.extensions.includes(ext);
24
+ }
25
+ /**
26
+ * Analyze code using language-specific rules
27
+ */
28
+ analyze(code, filePath) {
29
+ const startTime = Date.now();
30
+ const issues = [];
31
+ try {
32
+ const parseResult = this.parse(code, filePath);
33
+ const context = this.createContext(code, filePath, parseResult);
34
+ for (const rule of this.getRules()) {
35
+ try {
36
+ const result = rule.check(context);
37
+ if (result?.hasIssue) {
38
+ issues.push({
39
+ severity: rule.severity,
40
+ rule: rule.id,
41
+ category: rule.category,
42
+ message: result.message,
43
+ line: result.line,
44
+ column: result.column,
45
+ source: 'builtin',
46
+ suggestion: result.suggestion,
47
+ details: result.details
48
+ });
49
+ }
50
+ }
51
+ catch (error) {
52
+ logger.warn(`Rule ${rule.id} failed`, { error, filePath });
53
+ }
54
+ }
55
+ logger.debug(`${this.language} analysis complete`, {
56
+ filePath,
57
+ issues: issues.length,
58
+ duration: Date.now() - startTime
59
+ });
60
+ }
61
+ catch (error) {
62
+ logger.error(`${this.language} parsing failed`, { error, filePath });
63
+ }
64
+ return issues;
65
+ }
66
+ /**
67
+ * Create parse context for rules
68
+ */
69
+ createContext(code, filePath, parseResult) {
70
+ const lines = code.split('\n');
71
+ return {
72
+ code,
73
+ filePath,
74
+ language: this.language,
75
+ symbols: parseResult.symbols,
76
+ imports: parseResult.imports,
77
+ functions: parseResult.functions,
78
+ classes: parseResult.classes,
79
+ variables: parseResult.variables,
80
+ comments: parseResult.comments,
81
+ getLine: (lineNumber) => lines[lineNumber - 1] || '',
82
+ getLines: (start, end) => lines.slice(start - 1, end),
83
+ containsPattern: (pattern) => pattern.test(code),
84
+ findPatternMatches: (pattern) => {
85
+ const matches = [];
86
+ const globalPattern = new RegExp(pattern.source, 'gm');
87
+ let match;
88
+ while ((match = globalPattern.exec(code)) !== null) {
89
+ const beforeMatch = code.substring(0, match.index);
90
+ const lineNumber = beforeMatch.split('\n').length;
91
+ const lastNewline = beforeMatch.lastIndexOf('\n');
92
+ const column = match.index - lastNewline;
93
+ matches.push({
94
+ match: match[0],
95
+ line: lineNumber,
96
+ column,
97
+ groups: match.groups
98
+ });
99
+ }
100
+ return matches;
101
+ }
102
+ };
103
+ }
104
+ /**
105
+ * Helper: Extract comments from code
106
+ */
107
+ extractComments(code, lineCommentPrefix, blockStart, blockEnd) {
108
+ const comments = [];
109
+ const lines = code.split('\n');
110
+ // Line comments
111
+ const lineCommentRegex = new RegExp(`${escapeRegex(lineCommentPrefix)}(.*)$`, 'gm');
112
+ let match;
113
+ while ((match = lineCommentRegex.exec(code)) !== null) {
114
+ const beforeMatch = code.substring(0, match.index);
115
+ const lineNumber = beforeMatch.split('\n').length;
116
+ const text = match[1].trim();
117
+ comments.push({
118
+ text,
119
+ line: lineNumber,
120
+ type: 'line',
121
+ isTodo: /\bTODO\b/i.test(text),
122
+ isFixme: /\bFIXME\b/i.test(text)
123
+ });
124
+ }
125
+ // Block comments
126
+ if (blockStart && blockEnd) {
127
+ const blockRegex = new RegExp(`${escapeRegex(blockStart)}([\\s\\S]*?)${escapeRegex(blockEnd)}`, 'gm');
128
+ while ((match = blockRegex.exec(code)) !== null) {
129
+ const beforeMatch = code.substring(0, match.index);
130
+ const startLine = beforeMatch.split('\n').length;
131
+ const endLine = startLine + match[0].split('\n').length - 1;
132
+ const text = match[1].trim();
133
+ comments.push({
134
+ text,
135
+ line: startLine,
136
+ endLine,
137
+ type: text.startsWith('*') ? 'doc' : 'block',
138
+ isTodo: /\bTODO\b/i.test(text),
139
+ isFixme: /\bFIXME\b/i.test(text)
140
+ });
141
+ }
142
+ }
143
+ return comments;
144
+ }
145
+ /**
146
+ * Helper: Count complexity (basic cyclomatic)
147
+ */
148
+ calculateComplexity(code) {
149
+ // Count decision points
150
+ const decisionPatterns = [
151
+ /\bif\b/g,
152
+ /\belse\s+if\b/g,
153
+ /\bwhile\b/g,
154
+ /\bfor\b/g,
155
+ /\bcase\b/g,
156
+ /\bcatch\b/g,
157
+ /\b\?\s*:/g, // ternary
158
+ /\&\&/g,
159
+ /\|\|/g
160
+ ];
161
+ let complexity = 1; // Base complexity
162
+ for (const pattern of decisionPatterns) {
163
+ const matches = code.match(pattern);
164
+ if (matches) {
165
+ complexity += matches.length;
166
+ }
167
+ }
168
+ return complexity;
169
+ }
170
+ }
171
+ /**
172
+ * Escape special regex characters
173
+ */
174
+ function escapeRegex(str) {
175
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
176
+ }
177
+ //# sourceMappingURL=baseParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseParser.js","sourceRoot":"","sources":["../../../src/services/parsers/baseParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Go Language Parser
3
+ * Semantic analysis for Go code
4
+ * @version 3.2.0
5
+ */
6
+ import { BaseLanguageParser } from './baseParser.js';
7
+ import type { ParseResult, LanguageRule } from './types.js';
8
+ /**
9
+ * Go-specific parser with semantic rules
10
+ */
11
+ export declare class GoParser extends BaseLanguageParser {
12
+ readonly language: "go";
13
+ readonly extensions: string[];
14
+ constructor();
15
+ parse(code: string, filePath: string): ParseResult;
16
+ private extractImports;
17
+ private extractFunctions;
18
+ private parseGoParams;
19
+ private splitGoParams;
20
+ private extractStructs;
21
+ private extractVariables;
22
+ }
23
+ /**
24
+ * Go-specific semantic rules
25
+ */
26
+ declare const GO_RULES: LanguageRule[];
27
+ export { GO_RULES };
28
+ //# sourceMappingURL=goParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goParser.d.ts","sourceRoot":"","sources":["../../../src/services/parsers/goParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,WAAW,EASX,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,QAAS,SAAQ,kBAAkB;IAC9C,QAAQ,CAAC,QAAQ,EAAG,IAAI,CAAU;IAClC,QAAQ,CAAC,UAAU,WAAW;;IAO9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAwElD,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,gBAAgB;IAuDxB,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,cAAc;IAkDtB,OAAO,CAAC,gBAAgB;CAyBzB;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,EAAE,YAAY,EA2T3B,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}