@stackguide/mcp-server 3.2.0 → 3.8.1
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/README.md +315 -9
- package/dist/config/persistence.d.ts +16 -0
- package/dist/config/persistence.d.ts.map +1 -1
- package/dist/config/persistence.js +53 -0
- package/dist/config/persistence.js.map +1 -1
- package/dist/handlers/analyze.d.ts +11 -0
- package/dist/handlers/analyze.d.ts.map +1 -0
- package/dist/handlers/analyze.js +274 -0
- package/dist/handlers/analyze.js.map +1 -0
- package/dist/handlers/config.d.ts +1 -8
- package/dist/handlers/config.d.ts.map +1 -1
- package/dist/handlers/config.js +7 -1
- package/dist/handlers/config.js.map +1 -1
- package/dist/handlers/context.d.ts +1 -5
- package/dist/handlers/context.d.ts.map +1 -1
- package/dist/handlers/context.js +7 -1
- package/dist/handlers/context.js.map +1 -1
- package/dist/handlers/cursor.d.ts +1 -7
- package/dist/handlers/cursor.d.ts.map +1 -1
- package/dist/handlers/cursor.js +7 -1
- package/dist/handlers/cursor.js.map +1 -1
- package/dist/handlers/custom-rule.d.ts +1 -11
- package/dist/handlers/custom-rule.d.ts.map +1 -1
- package/dist/handlers/custom-rule.js +7 -1
- package/dist/handlers/custom-rule.js.map +1 -1
- package/dist/handlers/docs.d.ts +1 -8
- package/dist/handlers/docs.d.ts.map +1 -1
- package/dist/handlers/docs.js +7 -1
- package/dist/handlers/docs.js.map +1 -1
- package/dist/handlers/generate.d.ts +1 -13
- package/dist/handlers/generate.d.ts.map +1 -1
- package/dist/handlers/generate.js +6 -3
- package/dist/handlers/generate.js.map +1 -1
- package/dist/handlers/health.d.ts +1 -8
- package/dist/handlers/health.d.ts.map +1 -1
- package/dist/handlers/health.js +11 -3
- package/dist/handlers/health.js.map +1 -1
- package/dist/handlers/help.d.ts +1 -5
- package/dist/handlers/help.d.ts.map +1 -1
- package/dist/handlers/help.js +7 -1
- package/dist/handlers/help.js.map +1 -1
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/knowledge.d.ts +1 -8
- package/dist/handlers/knowledge.d.ts.map +1 -1
- package/dist/handlers/knowledge.js +7 -1
- package/dist/handlers/knowledge.js.map +1 -1
- package/dist/handlers/prompts.d.ts +31 -0
- package/dist/handlers/prompts.d.ts.map +1 -0
- package/dist/handlers/prompts.js +225 -0
- package/dist/handlers/prompts.js.map +1 -0
- package/dist/handlers/resources.d.ts +27 -0
- package/dist/handlers/resources.d.ts.map +1 -0
- package/dist/handlers/resources.js +210 -0
- package/dist/handlers/resources.js.map +1 -0
- package/dist/handlers/review.d.ts.map +1 -1
- package/dist/handlers/review.js +18 -1
- package/dist/handlers/review.js.map +1 -1
- package/dist/handlers/rules.d.ts +1 -9
- package/dist/handlers/rules.d.ts.map +1 -1
- package/dist/handlers/rules.js +7 -1
- package/dist/handlers/rules.js.map +1 -1
- package/dist/handlers/setup.d.ts +1 -0
- package/dist/handlers/setup.d.ts.map +1 -1
- package/dist/handlers/setup.js +42 -0
- package/dist/handlers/setup.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -417
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +69 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +151 -0
- package/dist/router/index.js.map +1 -0
- package/dist/services/ast/analyzer.d.ts +55 -0
- package/dist/services/ast/analyzer.d.ts.map +1 -0
- package/dist/services/ast/analyzer.js +268 -0
- package/dist/services/ast/analyzer.js.map +1 -0
- package/dist/services/ast/index.d.ts +10 -0
- package/dist/services/ast/index.d.ts.map +1 -0
- package/dist/services/ast/index.js +12 -0
- package/dist/services/ast/index.js.map +1 -0
- package/dist/services/ast/rules.d.ts +13 -0
- package/dist/services/ast/rules.d.ts.map +1 -0
- package/dist/services/ast/rules.js +358 -0
- package/dist/services/ast/rules.js.map +1 -0
- package/dist/services/ast/treeSitterParser.d.ts +54 -0
- package/dist/services/ast/treeSitterParser.d.ts.map +1 -0
- package/dist/services/ast/treeSitterParser.js +394 -0
- package/dist/services/ast/treeSitterParser.js.map +1 -0
- package/dist/services/ast/types.d.ts +167 -0
- package/dist/services/ast/types.d.ts.map +1 -0
- package/dist/services/ast/types.js +35 -0
- package/dist/services/ast/types.js.map +1 -0
- package/dist/services/codeAnalyzer.d.ts.map +1 -1
- package/dist/services/codeAnalyzer.js +43 -3
- package/dist/services/codeAnalyzer.js.map +1 -1
- package/dist/services/httpClient.d.ts +45 -0
- package/dist/services/httpClient.d.ts.map +1 -0
- package/dist/services/httpClient.js +309 -0
- package/dist/services/httpClient.js.map +1 -0
- package/dist/services/intelligence/configGenerator.d.ts +28 -0
- package/dist/services/intelligence/configGenerator.d.ts.map +1 -0
- package/dist/services/intelligence/configGenerator.js +404 -0
- package/dist/services/intelligence/configGenerator.js.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts +24 -0
- package/dist/services/intelligence/dependencyAdvisor.d.ts.map +1 -0
- package/dist/services/intelligence/dependencyAdvisor.js +404 -0
- package/dist/services/intelligence/dependencyAdvisor.js.map +1 -0
- package/dist/services/intelligence/index.d.ts +12 -0
- package/dist/services/intelligence/index.d.ts.map +1 -0
- package/dist/services/intelligence/index.js +16 -0
- package/dist/services/intelligence/index.js.map +1 -0
- package/dist/services/intelligence/projectFs.d.ts +11 -0
- package/dist/services/intelligence/projectFs.d.ts.map +1 -0
- package/dist/services/intelligence/projectFs.js +30 -0
- package/dist/services/intelligence/projectFs.js.map +1 -0
- package/dist/services/intelligence/projectIntelligence.d.ts +26 -0
- package/dist/services/intelligence/projectIntelligence.d.ts.map +1 -0
- package/dist/services/intelligence/projectIntelligence.js +344 -0
- package/dist/services/intelligence/projectIntelligence.js.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts +27 -0
- package/dist/services/intelligence/structureAnalyzer.d.ts.map +1 -0
- package/dist/services/intelligence/structureAnalyzer.js +286 -0
- package/dist/services/intelligence/structureAnalyzer.js.map +1 -0
- package/dist/services/intelligence/templates.d.ts +22 -0
- package/dist/services/intelligence/templates.d.ts.map +1 -0
- package/dist/services/intelligence/templates.js +521 -0
- package/dist/services/intelligence/templates.js.map +1 -0
- package/dist/services/intelligence/types.d.ts +222 -0
- package/dist/services/intelligence/types.d.ts.map +1 -0
- package/dist/services/intelligence/types.js +7 -0
- package/dist/services/intelligence/types.js.map +1 -0
- package/dist/services/projectFs.d.ts +85 -0
- package/dist/services/projectFs.d.ts.map +1 -0
- package/dist/services/projectFs.js +287 -0
- package/dist/services/projectFs.js.map +1 -0
- package/dist/services/rulesEngine.d.ts +255 -0
- package/dist/services/rulesEngine.d.ts.map +1 -0
- package/dist/services/rulesEngine.js +483 -0
- package/dist/services/rulesEngine.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +9 -0
- package/dist/services/webDocumentation.d.ts.map +1 -1
- package/dist/services/webDocumentation.js +144 -1
- package/dist/services/webDocumentation.js.map +1 -1
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite.d.ts +92 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +471 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +147 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +13 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/definitions.d.ts +87 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +34 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +30 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validation.d.ts +3 -3
- package/dist/validation/index.d.ts +8 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +19 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +341 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +244 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter AST Rules
|
|
3
|
+
* Semantic analysis rules using tree-sitter pattern matching
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Helper Functions
|
|
8
|
+
// ============================================================================
|
|
9
|
+
function createIssue(ruleId, message, severity, node, options = {}) {
|
|
10
|
+
return {
|
|
11
|
+
ruleId,
|
|
12
|
+
message,
|
|
13
|
+
severity,
|
|
14
|
+
line: node.startPosition.row + 1,
|
|
15
|
+
column: node.startPosition.column + 1,
|
|
16
|
+
suggestion: options.suggestion,
|
|
17
|
+
quickFix: options.quickFix
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function checkMatches(matches, captureName, predicate, createIssueForMatch) {
|
|
21
|
+
const issues = [];
|
|
22
|
+
for (const match of matches) {
|
|
23
|
+
const capture = match.captures.find(c => c.name === captureName);
|
|
24
|
+
if (capture && predicate(capture.node.text)) {
|
|
25
|
+
issues.push(createIssueForMatch(capture.node));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return issues;
|
|
29
|
+
}
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// TypeScript/JavaScript Rules
|
|
32
|
+
// ============================================================================
|
|
33
|
+
const evalUsageRule = {
|
|
34
|
+
id: 'TS-SEC001',
|
|
35
|
+
name: 'No eval()',
|
|
36
|
+
description: 'Avoid using eval() as it can lead to code injection vulnerabilities',
|
|
37
|
+
category: 'security',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
40
|
+
enabled: true,
|
|
41
|
+
query: '(call_expression function: (identifier) @fn)',
|
|
42
|
+
check: (matches) => checkMatches(matches, 'fn', text => text === 'eval', node => createIssue('TS-SEC001', 'Avoid eval() - code injection vulnerability', 'error', node, {
|
|
43
|
+
suggestion: 'Use JSON.parse() or Function constructor if needed'
|
|
44
|
+
}))
|
|
45
|
+
};
|
|
46
|
+
const innerHTMLRule = {
|
|
47
|
+
id: 'TS-SEC002',
|
|
48
|
+
name: 'No innerHTML',
|
|
49
|
+
description: 'Avoid innerHTML for XSS prevention',
|
|
50
|
+
category: 'security',
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
53
|
+
enabled: true,
|
|
54
|
+
query: '(member_expression property: (property_identifier) @prop)',
|
|
55
|
+
check: (matches) => checkMatches(matches, 'prop', text => text === 'innerHTML', node => createIssue('TS-SEC002', 'Avoid innerHTML - XSS vulnerability', 'warning', node, {
|
|
56
|
+
suggestion: 'Use textContent or DOM manipulation methods'
|
|
57
|
+
}))
|
|
58
|
+
};
|
|
59
|
+
const hardcodedSecretsRule = {
|
|
60
|
+
id: 'TS-SEC003',
|
|
61
|
+
name: 'No hardcoded secrets',
|
|
62
|
+
description: 'Detect hardcoded secrets',
|
|
63
|
+
category: 'security',
|
|
64
|
+
severity: 'error',
|
|
65
|
+
languages: ['typescript', 'javascript', 'tsx', 'python'],
|
|
66
|
+
enabled: true,
|
|
67
|
+
query: '(variable_declarator name: (identifier) @name value: (string) @value)',
|
|
68
|
+
check: (matches) => {
|
|
69
|
+
const issues = [];
|
|
70
|
+
const secretPatterns = /(password|secret|api[_-]?key|token|auth|credential)/i;
|
|
71
|
+
for (const match of matches) {
|
|
72
|
+
const nameCapture = match.captures.find(c => c.name === 'name');
|
|
73
|
+
const valueCapture = match.captures.find(c => c.name === 'value');
|
|
74
|
+
if (nameCapture && valueCapture && secretPatterns.test(nameCapture.node.text) && valueCapture.node.text.length > 2) {
|
|
75
|
+
issues.push(createIssue('TS-SEC003', 'Hardcoded secret in "' + nameCapture.node.text + '"', 'error', nameCapture.node, {
|
|
76
|
+
suggestion: 'Use environment variables'
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return issues;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const sqlInjectionRule = {
|
|
84
|
+
id: 'TS-SEC004',
|
|
85
|
+
name: 'SQL Injection Prevention',
|
|
86
|
+
description: 'Detect SQL injection vulnerabilities',
|
|
87
|
+
category: 'security',
|
|
88
|
+
severity: 'error',
|
|
89
|
+
languages: ['typescript', 'javascript', 'tsx', 'python'],
|
|
90
|
+
enabled: true,
|
|
91
|
+
query: '(template_string) @template',
|
|
92
|
+
check: (matches) => {
|
|
93
|
+
const issues = [];
|
|
94
|
+
const sqlPatterns = /\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER)\b/i;
|
|
95
|
+
for (const match of matches) {
|
|
96
|
+
const capture = match.captures.find(c => c.name === 'template');
|
|
97
|
+
if (capture && sqlPatterns.test(capture.node.text) && capture.node.text.includes('${')) {
|
|
98
|
+
issues.push(createIssue('TS-SEC004', 'SQL injection: avoid string interpolation in SQL', 'error', capture.node, {
|
|
99
|
+
suggestion: 'Use parameterized queries'
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return issues;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const consoleLogRule = {
|
|
107
|
+
id: 'TS-BP001',
|
|
108
|
+
name: 'No console.log',
|
|
109
|
+
description: 'Remove console statements',
|
|
110
|
+
category: 'best-practices',
|
|
111
|
+
severity: 'warning',
|
|
112
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
113
|
+
enabled: true,
|
|
114
|
+
query: '(call_expression function: (member_expression object: (identifier) @obj))',
|
|
115
|
+
check: (matches) => {
|
|
116
|
+
return checkMatches(matches, 'obj', text => text === 'console', node => createIssue('TS-BP001', 'Remove console statement', 'warning', node, {
|
|
117
|
+
suggestion: 'Use a logging library'
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const debuggerRule = {
|
|
122
|
+
id: 'TS-BP002',
|
|
123
|
+
name: 'No debugger',
|
|
124
|
+
description: 'Remove debugger statements',
|
|
125
|
+
category: 'best-practices',
|
|
126
|
+
severity: 'error',
|
|
127
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
128
|
+
enabled: true,
|
|
129
|
+
query: '(debugger_statement) @debugger',
|
|
130
|
+
check: (matches) => {
|
|
131
|
+
return checkMatches(matches, 'debugger', () => true, node => createIssue('TS-BP002', 'Remove debugger statement', 'error', node));
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const emptyCatchRule = {
|
|
135
|
+
id: 'TS-BP003',
|
|
136
|
+
name: 'No empty catch',
|
|
137
|
+
description: 'Catch blocks should not be empty',
|
|
138
|
+
category: 'best-practices',
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
141
|
+
enabled: true,
|
|
142
|
+
query: '(catch_clause body: (statement_block) @body)',
|
|
143
|
+
check: (matches) => {
|
|
144
|
+
const issues = [];
|
|
145
|
+
for (const match of matches) {
|
|
146
|
+
const bodyCapture = match.captures.find(c => c.name === 'body');
|
|
147
|
+
if (bodyCapture) {
|
|
148
|
+
const content = bodyCapture.node.text.replace(/[\s{}]/g, '').replace(/\/\/.*/g, '');
|
|
149
|
+
if (content.length === 0) {
|
|
150
|
+
issues.push(createIssue('TS-BP003', 'Empty catch block', 'warning', bodyCapture.node, {
|
|
151
|
+
suggestion: 'Add error handling or logging'
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return issues;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const noVarRule = {
|
|
160
|
+
id: 'TS-BP004',
|
|
161
|
+
name: 'No var',
|
|
162
|
+
description: 'Use let/const instead of var',
|
|
163
|
+
category: 'best-practices',
|
|
164
|
+
severity: 'warning',
|
|
165
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
166
|
+
enabled: true,
|
|
167
|
+
query: '(variable_declaration) @var',
|
|
168
|
+
check: (matches) => {
|
|
169
|
+
return checkMatches(matches, 'var', text => text.startsWith('var '), node => createIssue('TS-BP004', 'Use let/const instead of var', 'warning', node, {
|
|
170
|
+
suggestion: 'Replace var with const or let'
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const looseEqualityRule = {
|
|
175
|
+
id: 'TS-BP005',
|
|
176
|
+
name: 'Use strict equality',
|
|
177
|
+
description: 'Use === instead of ==',
|
|
178
|
+
category: 'best-practices',
|
|
179
|
+
severity: 'warning',
|
|
180
|
+
languages: ['typescript', 'javascript', 'tsx'],
|
|
181
|
+
enabled: true,
|
|
182
|
+
query: '(binary_expression operator: "==" @op)',
|
|
183
|
+
check: (matches) => {
|
|
184
|
+
return checkMatches(matches, 'op', text => text === '==' || text === '!=', node => createIssue('TS-BP005', 'Use strict equality (===)', 'warning', node));
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const nestedLoopsRule = {
|
|
188
|
+
id: 'TS-PERF002',
|
|
189
|
+
name: 'Nested loops',
|
|
190
|
+
description: 'Avoid deeply nested loops',
|
|
191
|
+
category: 'performance',
|
|
192
|
+
severity: 'warning',
|
|
193
|
+
languages: ['typescript', 'javascript', 'tsx', 'python', 'go', 'rust'],
|
|
194
|
+
enabled: true,
|
|
195
|
+
query: '(for_statement) @loop',
|
|
196
|
+
check: (_matches, context) => {
|
|
197
|
+
const issues = [];
|
|
198
|
+
const loopPattern = /\bfor\s*\([^)]+\)\s*\{[^}]*\bfor\s*\([^)]+\)\s*\{/g;
|
|
199
|
+
let match;
|
|
200
|
+
while ((match = loopPattern.exec(context.code)) !== null) {
|
|
201
|
+
const lines = context.code.substring(0, match.index).split('\n');
|
|
202
|
+
issues.push({
|
|
203
|
+
ruleId: 'TS-PERF002',
|
|
204
|
+
message: 'Nested loops - O(n²) complexity',
|
|
205
|
+
severity: 'warning',
|
|
206
|
+
line: lines.length,
|
|
207
|
+
column: 1
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return issues;
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const longFunctionRule = {
|
|
214
|
+
id: 'TS-MAINT001',
|
|
215
|
+
name: 'Long function',
|
|
216
|
+
description: 'Functions should be short',
|
|
217
|
+
category: 'maintainability',
|
|
218
|
+
severity: 'warning',
|
|
219
|
+
languages: ['typescript', 'javascript', 'tsx', 'python', 'go', 'rust'],
|
|
220
|
+
enabled: true,
|
|
221
|
+
query: '(function_declaration) @func',
|
|
222
|
+
check: (matches) => {
|
|
223
|
+
const issues = [];
|
|
224
|
+
const maxLines = 50;
|
|
225
|
+
for (const match of matches) {
|
|
226
|
+
const funcCapture = match.captures.find(c => c.name === 'func');
|
|
227
|
+
if (funcCapture) {
|
|
228
|
+
const lines = funcCapture.node.text.split('\n').length;
|
|
229
|
+
if (lines > maxLines) {
|
|
230
|
+
issues.push(createIssue('TS-MAINT001', 'Function has ' + lines + ' lines (max ' + maxLines + ')', 'warning', funcCapture.node));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return issues;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
const tooManyParamsRule = {
|
|
238
|
+
id: 'TS-MAINT002',
|
|
239
|
+
name: 'Too many parameters',
|
|
240
|
+
description: 'Functions should have fewer parameters',
|
|
241
|
+
category: 'maintainability',
|
|
242
|
+
severity: 'warning',
|
|
243
|
+
languages: ['typescript', 'javascript', 'tsx', 'python', 'go', 'rust'],
|
|
244
|
+
enabled: true,
|
|
245
|
+
query: '(function_declaration parameters: (formal_parameters) @params)',
|
|
246
|
+
check: (matches) => {
|
|
247
|
+
const issues = [];
|
|
248
|
+
const maxParams = 4;
|
|
249
|
+
for (const match of matches) {
|
|
250
|
+
const paramsCapture = match.captures.find(c => c.name === 'params');
|
|
251
|
+
if (paramsCapture) {
|
|
252
|
+
const paramCount = paramsCapture.node.text === '()' ? 0 : (paramsCapture.node.text.match(/,/g) || []).length + 1;
|
|
253
|
+
if (paramCount > maxParams) {
|
|
254
|
+
issues.push(createIssue('TS-MAINT002', paramCount + ' params (max ' + maxParams + ')', 'warning', paramsCapture.node));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return issues;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
// Python rules
|
|
262
|
+
const bareExceptRule = {
|
|
263
|
+
id: 'TS-PY001',
|
|
264
|
+
name: 'No bare except',
|
|
265
|
+
description: 'Catch specific exceptions',
|
|
266
|
+
category: 'best-practices',
|
|
267
|
+
severity: 'warning',
|
|
268
|
+
languages: ['python'],
|
|
269
|
+
enabled: true,
|
|
270
|
+
query: '(except_clause) @except',
|
|
271
|
+
check: (matches) => {
|
|
272
|
+
const issues = [];
|
|
273
|
+
for (const match of matches) {
|
|
274
|
+
const exceptCapture = match.captures.find(c => c.name === 'except');
|
|
275
|
+
if (exceptCapture && /^except\s*:/.test(exceptCapture.node.text)) {
|
|
276
|
+
issues.push(createIssue('TS-PY001', 'Bare except - catch specific exceptions', 'warning', exceptCapture.node));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return issues;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const mutableDefaultRule = {
|
|
283
|
+
id: 'TS-PY002',
|
|
284
|
+
name: 'No mutable defaults',
|
|
285
|
+
description: 'Avoid mutable default arguments',
|
|
286
|
+
category: 'best-practices',
|
|
287
|
+
severity: 'error',
|
|
288
|
+
languages: ['python'],
|
|
289
|
+
enabled: true,
|
|
290
|
+
query: '(default_parameter value: (list) @default)',
|
|
291
|
+
check: (matches) => checkMatches(matches, 'default', () => true, node => createIssue('TS-PY002', 'Mutable default argument', 'error', node))
|
|
292
|
+
};
|
|
293
|
+
// Go rules
|
|
294
|
+
const ignoredErrorRule = {
|
|
295
|
+
id: 'TS-GO001',
|
|
296
|
+
name: 'Handle errors',
|
|
297
|
+
description: 'Error returns should be handled',
|
|
298
|
+
category: 'best-practices',
|
|
299
|
+
severity: 'warning',
|
|
300
|
+
languages: ['go'],
|
|
301
|
+
enabled: true,
|
|
302
|
+
query: '(short_var_declaration left: (expression_list) @left)',
|
|
303
|
+
check: (matches) => {
|
|
304
|
+
const issues = [];
|
|
305
|
+
for (const match of matches) {
|
|
306
|
+
const leftCapture = match.captures.find(c => c.name === 'left');
|
|
307
|
+
if (leftCapture && (/, _$/.test(leftCapture.node.text) || /^_,/.test(leftCapture.node.text))) {
|
|
308
|
+
issues.push(createIssue('TS-GO001', 'Error value ignored', 'warning', leftCapture.node));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return issues;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
// Rust rules
|
|
315
|
+
const unwrapUsageRule = {
|
|
316
|
+
id: 'TS-RS001',
|
|
317
|
+
name: 'Avoid unwrap()',
|
|
318
|
+
description: 'Use proper error handling',
|
|
319
|
+
category: 'best-practices',
|
|
320
|
+
severity: 'warning',
|
|
321
|
+
languages: ['rust'],
|
|
322
|
+
enabled: true,
|
|
323
|
+
query: '(call_expression function: (field_expression field: (field_identifier) @method))',
|
|
324
|
+
check: (matches) => checkMatches(matches, 'method', text => text === 'unwrap' || text === 'expect', node => createIssue('TS-RS001', 'Avoid ' + node.text + '() - use ? or match', 'warning', node))
|
|
325
|
+
};
|
|
326
|
+
// ============================================================================
|
|
327
|
+
// Exports
|
|
328
|
+
// ============================================================================
|
|
329
|
+
export const TYPESCRIPT_RULES = [
|
|
330
|
+
evalUsageRule, innerHTMLRule, hardcodedSecretsRule, sqlInjectionRule,
|
|
331
|
+
consoleLogRule, debuggerRule, emptyCatchRule, noVarRule, looseEqualityRule,
|
|
332
|
+
nestedLoopsRule, longFunctionRule, tooManyParamsRule
|
|
333
|
+
];
|
|
334
|
+
export const PYTHON_RULES = [
|
|
335
|
+
hardcodedSecretsRule, sqlInjectionRule, nestedLoopsRule, longFunctionRule,
|
|
336
|
+
tooManyParamsRule, bareExceptRule, mutableDefaultRule
|
|
337
|
+
];
|
|
338
|
+
export const GO_RULES = [
|
|
339
|
+
nestedLoopsRule, longFunctionRule, tooManyParamsRule, ignoredErrorRule
|
|
340
|
+
];
|
|
341
|
+
export const RUST_RULES = [
|
|
342
|
+
nestedLoopsRule, longFunctionRule, tooManyParamsRule, unwrapUsageRule
|
|
343
|
+
];
|
|
344
|
+
export const ALL_TREE_SITTER_RULES = [
|
|
345
|
+
...TYPESCRIPT_RULES, bareExceptRule, mutableDefaultRule, ignoredErrorRule, unwrapUsageRule
|
|
346
|
+
];
|
|
347
|
+
export function getRulesForLanguage(language) {
|
|
348
|
+
const languageRules = {
|
|
349
|
+
typescript: TYPESCRIPT_RULES,
|
|
350
|
+
javascript: TYPESCRIPT_RULES,
|
|
351
|
+
tsx: TYPESCRIPT_RULES,
|
|
352
|
+
python: PYTHON_RULES,
|
|
353
|
+
go: GO_RULES,
|
|
354
|
+
rust: RUST_RULES
|
|
355
|
+
};
|
|
356
|
+
return (languageRules[language] || []).filter(r => r.enabled);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/services/ast/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter Core Parser
|
|
3
|
+
* Multi-language AST parsing using tree-sitter
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
import type { ASTNode, ParsedAST, SupportedASTLanguage, TreeSitterMetrics } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect language from file extension
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectLanguage(filePath: string): SupportedASTLanguage | null;
|
|
11
|
+
/**
|
|
12
|
+
* Parse source code into AST using tree-sitter
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseCode(code: string, filePath: string, language?: SupportedASTLanguage): Promise<ParsedAST | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Query AST using tree-sitter query syntax
|
|
17
|
+
*/
|
|
18
|
+
export declare function queryAST(ast: ParsedAST, queryPattern: string): Promise<Array<{
|
|
19
|
+
captures: Map<string, ASTNode[]>;
|
|
20
|
+
}>>;
|
|
21
|
+
/**
|
|
22
|
+
* Walk the AST and call visitor functions
|
|
23
|
+
*/
|
|
24
|
+
export declare function walkAST(node: ASTNode, visitor: {
|
|
25
|
+
enter?: (node: ASTNode, parent?: ASTNode) => boolean | void;
|
|
26
|
+
leave?: (node: ASTNode, parent?: ASTNode) => void;
|
|
27
|
+
}, parent?: ASTNode): void;
|
|
28
|
+
/**
|
|
29
|
+
* Find all nodes matching a predicate
|
|
30
|
+
*/
|
|
31
|
+
export declare function findNodes(ast: ParsedAST, predicate: (node: ASTNode) => boolean): ASTNode[];
|
|
32
|
+
/**
|
|
33
|
+
* Find nodes by type
|
|
34
|
+
*/
|
|
35
|
+
export declare function findNodesByType(ast: ParsedAST, ...types: string[]): ASTNode[];
|
|
36
|
+
/**
|
|
37
|
+
* Extract code metrics from AST
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractMetrics(ast: ParsedAST): TreeSitterMetrics;
|
|
40
|
+
export declare function parseCodeCached(code: string, filePath: string, language?: SupportedASTLanguage): Promise<ParsedAST | null>;
|
|
41
|
+
export declare function clearASTParserCache(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get the text of a specific line from code
|
|
44
|
+
*/
|
|
45
|
+
export declare function getLineText(code: string, lineNumber: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* Check if language is supported
|
|
48
|
+
*/
|
|
49
|
+
export declare function isLanguageSupported(language: string): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Get list of supported languages
|
|
52
|
+
*/
|
|
53
|
+
export declare function getSupportedLanguages(): Promise<SupportedASTLanguage[]>;
|
|
54
|
+
//# sourceMappingURL=treeSitterParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treeSitterParser.d.ts","sourceRoot":"","sources":["../../../src/services/ast/treeSitterParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,oBAAoB,EAEpB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AA8GpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAoB5E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAuC3B;AA2CD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC,CA6BtD;AAMD;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,EACD,MAAM,CAAC,EAAE,OAAO,GACf,IAAI,CAmBN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GACpC,OAAO,EAAE,CAYX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAG7E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,iBAAiB,CAyEhE;AASD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAkB3B;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAG7E"}
|