@stackguide/mcp-server 3.3.0 ā 3.8.2
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 +259 -10
- 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/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/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 +236 -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 +45 -4
- 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/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -419
- 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/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/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 +523 -0
- package/dist/services/rulesEngine.js.map +1 -0
- package/dist/services/webDocumentation.d.ts +11 -0
- package/dist/services/webDocumentation.d.ts.map +1 -1
- package/dist/services/webDocumentation.js +231 -27
- 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/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/safeFetch.d.ts +12 -0
- package/dist/utils/safeFetch.d.ts.map +1 -0
- package/dist/utils/safeFetch.js +107 -0
- package/dist/utils/safeFetch.js.map +1 -0
- package/dist/utils/validation.d.ts +1 -1
- 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 +346 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +256 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router - Handler Registry Pattern for MCP Server
|
|
3
|
+
* Replaces switch statements with clean registry-based routing
|
|
4
|
+
* @version 3.6.0
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { ServerState } from '../handlers/index.js';
|
|
8
|
+
export interface ToolResponse {
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: 'text';
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export type ToolHandler<TArgs = Record<string, unknown>> = (args: TArgs, state: ServerState) => Promise<ToolResponse>;
|
|
15
|
+
export type PromptHandler = (args: Record<string, unknown>, state: ServerState) => Promise<{
|
|
16
|
+
messages: Array<{
|
|
17
|
+
role: 'user' | 'assistant';
|
|
18
|
+
content: {
|
|
19
|
+
type: 'text';
|
|
20
|
+
text: string;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
export type ResourceReader = (uri: string, state: ServerState) => Promise<{
|
|
25
|
+
contents: Array<{
|
|
26
|
+
uri: string;
|
|
27
|
+
mimeType: string;
|
|
28
|
+
text: string;
|
|
29
|
+
}>;
|
|
30
|
+
} | null>;
|
|
31
|
+
declare class ToolRouter {
|
|
32
|
+
private handlers;
|
|
33
|
+
register(name: string, handler: ToolHandler, schema?: z.ZodSchema): this;
|
|
34
|
+
registerWithSchema<T>(name: string, schema: z.ZodSchema<T>, handler: (args: T, state: ServerState) => Promise<ToolResponse>): this;
|
|
35
|
+
registerAll(handlers: Record<string, ToolHandler>): this;
|
|
36
|
+
has(name: string): boolean;
|
|
37
|
+
handle(name: string, args: Record<string, unknown>, state: ServerState): Promise<ToolResponse>;
|
|
38
|
+
listTools(): string[];
|
|
39
|
+
}
|
|
40
|
+
declare class ResourceRouter {
|
|
41
|
+
private routes;
|
|
42
|
+
register(pattern: RegExp | string, reader: ResourceReader): this;
|
|
43
|
+
read(uri: string, state: ServerState): Promise<{
|
|
44
|
+
contents: Array<{
|
|
45
|
+
uri: string;
|
|
46
|
+
mimeType: string;
|
|
47
|
+
text: string;
|
|
48
|
+
}>;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
declare class PromptRouter {
|
|
52
|
+
private handlers;
|
|
53
|
+
register(name: string, handler: PromptHandler): this;
|
|
54
|
+
handle(name: string, args: Record<string, unknown>, state: ServerState): Promise<{
|
|
55
|
+
messages: Array<{
|
|
56
|
+
role: 'user' | 'assistant';
|
|
57
|
+
content: {
|
|
58
|
+
type: 'text';
|
|
59
|
+
text: string;
|
|
60
|
+
};
|
|
61
|
+
}>;
|
|
62
|
+
}>;
|
|
63
|
+
listPrompts(): string[];
|
|
64
|
+
}
|
|
65
|
+
export declare function createToolRouter(): ToolRouter;
|
|
66
|
+
export declare function createResourceRouter(): ResourceRouter;
|
|
67
|
+
export declare function createPromptRouter(): PromptRouter;
|
|
68
|
+
export { ToolRouter, ResourceRouter, PromptRouter };
|
|
69
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router - Handler Registry Pattern for MCP Server
|
|
3
|
+
* Replaces switch statements with clean registry-based routing
|
|
4
|
+
* @version 3.6.0
|
|
5
|
+
*/
|
|
6
|
+
import { textResponse } from '../handlers/index.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Tool Router
|
|
10
|
+
// ============================================================================
|
|
11
|
+
class ToolRouter {
|
|
12
|
+
handlers = new Map();
|
|
13
|
+
register(name, handler, schema) {
|
|
14
|
+
if (this.handlers.has(name)) {
|
|
15
|
+
logger.warn(`Overwriting handler for tool: ${name}`);
|
|
16
|
+
}
|
|
17
|
+
this.handlers.set(name, { handler, schema });
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
registerWithSchema(name, schema, handler) {
|
|
21
|
+
return this.register(name, handler, schema);
|
|
22
|
+
}
|
|
23
|
+
registerAll(handlers) {
|
|
24
|
+
for (const [name, handler] of Object.entries(handlers)) {
|
|
25
|
+
this.register(name, handler);
|
|
26
|
+
}
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
has(name) {
|
|
30
|
+
return this.handlers.has(name);
|
|
31
|
+
}
|
|
32
|
+
async handle(name, args, state) {
|
|
33
|
+
const registered = this.handlers.get(name);
|
|
34
|
+
if (!registered) {
|
|
35
|
+
logger.warn(`Unknown tool: ${name}`);
|
|
36
|
+
return textResponse(`Unknown tool: ${name}`);
|
|
37
|
+
}
|
|
38
|
+
const { handler, schema } = registered;
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
logger.debug(`Tool called: ${name}`, { args });
|
|
41
|
+
try {
|
|
42
|
+
// Validate input if schema is provided
|
|
43
|
+
let validatedArgs = args;
|
|
44
|
+
if (schema) {
|
|
45
|
+
const result = schema.safeParse(args);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
const errorMessages = result.error.issues.map(issue => {
|
|
48
|
+
const path = issue.path.join('.');
|
|
49
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
50
|
+
}).join('; ');
|
|
51
|
+
logger.warn(`Validation failed for ${name}`, { errors: errorMessages });
|
|
52
|
+
return textResponse(`Invalid input for "${name}": ${errorMessages}`);
|
|
53
|
+
}
|
|
54
|
+
validatedArgs = result.data;
|
|
55
|
+
}
|
|
56
|
+
const result = await handler(validatedArgs, state);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
+
logger.error(`Tool error: ${name}`, { error: message });
|
|
62
|
+
return textResponse(`Error executing tool "${name}": ${message}`);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
logger.debug(`Tool completed: ${name}`, { duration: `${Date.now() - startTime}ms` });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
listTools() {
|
|
69
|
+
return Array.from(this.handlers.keys());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
class ResourceRouter {
|
|
73
|
+
routes = [];
|
|
74
|
+
register(pattern, reader) {
|
|
75
|
+
this.routes.push({ pattern, reader });
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
async read(uri, state) {
|
|
79
|
+
for (const route of this.routes) {
|
|
80
|
+
const matches = typeof route.pattern === 'string'
|
|
81
|
+
? uri === route.pattern
|
|
82
|
+
: route.pattern.test(uri);
|
|
83
|
+
if (matches) {
|
|
84
|
+
try {
|
|
85
|
+
const result = await route.reader(uri, state);
|
|
86
|
+
if (result)
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
91
|
+
return {
|
|
92
|
+
contents: [{
|
|
93
|
+
uri,
|
|
94
|
+
mimeType: 'text/plain',
|
|
95
|
+
text: `Error reading resource: ${message}`
|
|
96
|
+
}]
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
contents: [{
|
|
103
|
+
uri,
|
|
104
|
+
mimeType: 'text/plain',
|
|
105
|
+
text: 'Resource not found'
|
|
106
|
+
}]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// Prompt Router
|
|
112
|
+
// ============================================================================
|
|
113
|
+
class PromptRouter {
|
|
114
|
+
handlers = new Map();
|
|
115
|
+
register(name, handler) {
|
|
116
|
+
this.handlers.set(name, handler);
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
async handle(name, args, state) {
|
|
120
|
+
const handler = this.handlers.get(name);
|
|
121
|
+
if (!handler) {
|
|
122
|
+
return {
|
|
123
|
+
messages: [{
|
|
124
|
+
role: 'user',
|
|
125
|
+
content: { type: 'text', text: `Unknown prompt: ${name}` }
|
|
126
|
+
}]
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return handler(args, state);
|
|
130
|
+
}
|
|
131
|
+
listPrompts() {
|
|
132
|
+
return Array.from(this.handlers.keys());
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// Factory Functions
|
|
137
|
+
// ============================================================================
|
|
138
|
+
export function createToolRouter() {
|
|
139
|
+
return new ToolRouter();
|
|
140
|
+
}
|
|
141
|
+
export function createResourceRouter() {
|
|
142
|
+
return new ResourceRouter();
|
|
143
|
+
}
|
|
144
|
+
export function createPromptRouter() {
|
|
145
|
+
return new PromptRouter();
|
|
146
|
+
}
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Exports
|
|
149
|
+
// ============================================================================
|
|
150
|
+
export { ToolRouter, ResourceRouter, PromptRouter };
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter Analyzer
|
|
3
|
+
* High-level API for AST-based code analysis
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
import { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages } from './treeSitterParser.js';
|
|
7
|
+
import { ALL_TREE_SITTER_RULES, getRulesForLanguage } from './rules.js';
|
|
8
|
+
import type { ParsedAST, TreeSitterRule, TreeSitterIssue, TreeSitterContext, TreeSitterAnalysisResult, TreeSitterMetrics, SupportedASTLanguage, ASTNode } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Analyze code using tree-sitter AST
|
|
11
|
+
*/
|
|
12
|
+
export declare function analyzeWithTreeSitter(code: string, filePath: string, options?: {
|
|
13
|
+
language?: SupportedASTLanguage;
|
|
14
|
+
categories?: Array<TreeSitterRule['category']>;
|
|
15
|
+
useCache?: boolean;
|
|
16
|
+
}): Promise<TreeSitterAnalysisResult | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Analyze multiple files
|
|
19
|
+
*/
|
|
20
|
+
export declare function analyzeMultipleWithTreeSitter(files: Array<{
|
|
21
|
+
path: string;
|
|
22
|
+
code: string;
|
|
23
|
+
}>, options?: {
|
|
24
|
+
categories?: Array<TreeSitterRule['category']>;
|
|
25
|
+
maxConcurrent?: number;
|
|
26
|
+
}): Promise<TreeSitterAnalysisResult[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Aggregate metrics from multiple analysis results
|
|
29
|
+
*/
|
|
30
|
+
export declare function aggregateMetrics(results: TreeSitterAnalysisResult[]): {
|
|
31
|
+
totalFiles: number;
|
|
32
|
+
totalIssues: number;
|
|
33
|
+
issuesBySeverity: Record<string, number>;
|
|
34
|
+
issuesByCategory: Record<string, number>;
|
|
35
|
+
avgMetrics: TreeSitterMetrics;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Generate a markdown report from analysis results
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateReport(result: TreeSitterAnalysisResult): string;
|
|
41
|
+
/**
|
|
42
|
+
* Convert tree-sitter issues to codeAnalyzer format
|
|
43
|
+
*/
|
|
44
|
+
export declare function convertToCodeIssues(issues: TreeSitterIssue[]): Array<{
|
|
45
|
+
ruleId: string;
|
|
46
|
+
message: string;
|
|
47
|
+
severity: string;
|
|
48
|
+
line: number;
|
|
49
|
+
column: number;
|
|
50
|
+
suggestion?: string;
|
|
51
|
+
source: 'tree-sitter';
|
|
52
|
+
}>;
|
|
53
|
+
export { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages, ALL_TREE_SITTER_RULES, getRulesForLanguage };
|
|
54
|
+
export type { ParsedAST, TreeSitterRule, TreeSitterIssue, TreeSitterContext, TreeSitterAnalysisResult, TreeSitterMetrics, SupportedASTLanguage, ASTNode };
|
|
55
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/services/ast/analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,OAAO,EACP,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EAEpB,OAAO,EACR,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,UAAU,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACf,GACL,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CA4D1C;AAwED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC5C,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAqBrC;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,EAAE,GAAG;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CA4DA;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAmDvE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC,CAUD;AAMD,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,OAAO,EACP,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACpB,CAAC;AAEF,YAAY,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,OAAO,EACR,CAAC"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter Analyzer
|
|
3
|
+
* High-level API for AST-based code analysis
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
7
|
+
import { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages } from './treeSitterParser.js';
|
|
8
|
+
import { ALL_TREE_SITTER_RULES, getRulesForLanguage } from './rules.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Main Analysis Functions
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Analyze code using tree-sitter AST
|
|
14
|
+
*/
|
|
15
|
+
export async function analyzeWithTreeSitter(code, filePath, options = {}) {
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
const { categories, useCache = true } = options;
|
|
18
|
+
const language = options.language || detectLanguage(filePath);
|
|
19
|
+
if (!language) {
|
|
20
|
+
logger.debug(`Unsupported file type for tree-sitter: ${filePath}`);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Parse the code
|
|
24
|
+
const ast = useCache
|
|
25
|
+
? await parseCodeCached(code, filePath, language)
|
|
26
|
+
: await parseCode(code, filePath, language);
|
|
27
|
+
if (!ast) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// Get applicable rules
|
|
31
|
+
let rules = getRulesForLanguage(language);
|
|
32
|
+
if (categories && categories.length > 0) {
|
|
33
|
+
const categorySet = new Set(categories);
|
|
34
|
+
rules = rules.filter(r => categorySet.has(r.category));
|
|
35
|
+
}
|
|
36
|
+
// Run rules
|
|
37
|
+
const issues = [];
|
|
38
|
+
for (const rule of rules) {
|
|
39
|
+
try {
|
|
40
|
+
const ruleIssues = await runRule(rule, ast, code, filePath);
|
|
41
|
+
issues.push(...ruleIssues);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger.warn(`Rule ${rule.id} failed`, { error: String(error) });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Extract metrics
|
|
48
|
+
const metrics = extractMetrics(ast);
|
|
49
|
+
const result = {
|
|
50
|
+
filePath,
|
|
51
|
+
language,
|
|
52
|
+
issues,
|
|
53
|
+
metrics,
|
|
54
|
+
parseTime: ast.parseTime,
|
|
55
|
+
analysisTime: Date.now() - startTime
|
|
56
|
+
};
|
|
57
|
+
logger.info('Tree-sitter analysis complete', {
|
|
58
|
+
file: filePath,
|
|
59
|
+
language,
|
|
60
|
+
issuesFound: issues.length,
|
|
61
|
+
rulesApplied: rules.length,
|
|
62
|
+
time: result.analysisTime
|
|
63
|
+
});
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run a single rule against the AST
|
|
68
|
+
*/
|
|
69
|
+
async function runRule(rule, ast, code, filePath) {
|
|
70
|
+
const context = {
|
|
71
|
+
filePath,
|
|
72
|
+
code,
|
|
73
|
+
ast
|
|
74
|
+
};
|
|
75
|
+
// For now, we use a simplified pattern matching approach
|
|
76
|
+
// since tree-sitter queries require the actual tree-sitter tree
|
|
77
|
+
// We'll match patterns by walking the AST
|
|
78
|
+
const matches = findMatchingNodes(ast, rule);
|
|
79
|
+
if (matches.length === 0) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
return rule.check(matches, context);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find nodes matching a rule's pattern
|
|
86
|
+
* This is a simplified matcher that works with our converted AST nodes
|
|
87
|
+
*/
|
|
88
|
+
function findMatchingNodes(ast, rule) {
|
|
89
|
+
const matches = [];
|
|
90
|
+
// Extract node types from the query pattern
|
|
91
|
+
// Pattern format: (node_type ...) @capture
|
|
92
|
+
const nodeTypeMatch = rule.query.match(/\((\w+)/);
|
|
93
|
+
const captureMatch = rule.query.match(/@(\w+)/g);
|
|
94
|
+
if (!nodeTypeMatch) {
|
|
95
|
+
return matches;
|
|
96
|
+
}
|
|
97
|
+
const targetType = nodeTypeMatch[1];
|
|
98
|
+
const captureNames = captureMatch?.map(c => c.slice(1)) || ['match'];
|
|
99
|
+
// Walk AST and find matching nodes
|
|
100
|
+
walkAST(ast.rootNode, {
|
|
101
|
+
enter: (node) => {
|
|
102
|
+
if (node.type === targetType) {
|
|
103
|
+
// Create a match with the node as a capture
|
|
104
|
+
matches.push({
|
|
105
|
+
pattern: 0,
|
|
106
|
+
captures: captureNames.map(name => ({
|
|
107
|
+
name,
|
|
108
|
+
node
|
|
109
|
+
}))
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return matches;
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// Batch Analysis
|
|
118
|
+
// ============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Analyze multiple files
|
|
121
|
+
*/
|
|
122
|
+
export async function analyzeMultipleWithTreeSitter(files, options = {}) {
|
|
123
|
+
const { maxConcurrent = 5 } = options;
|
|
124
|
+
const results = [];
|
|
125
|
+
// Process in batches
|
|
126
|
+
for (let i = 0; i < files.length; i += maxConcurrent) {
|
|
127
|
+
const batch = files.slice(i, i + maxConcurrent);
|
|
128
|
+
const batchPromises = batch.map(file => analyzeWithTreeSitter(file.code, file.path, options));
|
|
129
|
+
const batchResults = await Promise.all(batchPromises);
|
|
130
|
+
for (const result of batchResults) {
|
|
131
|
+
if (result) {
|
|
132
|
+
results.push(result);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
// ============================================================================
|
|
139
|
+
// Metrics Aggregation
|
|
140
|
+
// ============================================================================
|
|
141
|
+
/**
|
|
142
|
+
* Aggregate metrics from multiple analysis results
|
|
143
|
+
*/
|
|
144
|
+
export function aggregateMetrics(results) {
|
|
145
|
+
const issuesBySeverity = {
|
|
146
|
+
error: 0,
|
|
147
|
+
warning: 0,
|
|
148
|
+
info: 0,
|
|
149
|
+
suggestion: 0
|
|
150
|
+
};
|
|
151
|
+
const issuesByCategory = {};
|
|
152
|
+
const sumMetrics = {
|
|
153
|
+
loc: 0,
|
|
154
|
+
functions: 0,
|
|
155
|
+
classes: 0,
|
|
156
|
+
maxNestingDepth: 0,
|
|
157
|
+
complexity: 0,
|
|
158
|
+
imports: 0
|
|
159
|
+
};
|
|
160
|
+
for (const result of results) {
|
|
161
|
+
// Count issues
|
|
162
|
+
for (const issue of result.issues) {
|
|
163
|
+
issuesBySeverity[issue.severity] = (issuesBySeverity[issue.severity] || 0) + 1;
|
|
164
|
+
// Extract category from rule ID prefix
|
|
165
|
+
const rulePrefix = issue.ruleId.split('-')[1]?.substring(0, 2);
|
|
166
|
+
const category = rulePrefix === 'SE' ? 'security' :
|
|
167
|
+
rulePrefix === 'BP' ? 'best-practices' :
|
|
168
|
+
rulePrefix === 'PE' ? 'performance' :
|
|
169
|
+
rulePrefix === 'MA' ? 'maintainability' :
|
|
170
|
+
'other';
|
|
171
|
+
issuesByCategory[category] = (issuesByCategory[category] || 0) + 1;
|
|
172
|
+
}
|
|
173
|
+
// Sum metrics
|
|
174
|
+
sumMetrics.loc += result.metrics.loc;
|
|
175
|
+
sumMetrics.functions += result.metrics.functions;
|
|
176
|
+
sumMetrics.classes += result.metrics.classes;
|
|
177
|
+
sumMetrics.maxNestingDepth = Math.max(sumMetrics.maxNestingDepth, result.metrics.maxNestingDepth);
|
|
178
|
+
sumMetrics.complexity += result.metrics.complexity;
|
|
179
|
+
sumMetrics.imports += result.metrics.imports;
|
|
180
|
+
}
|
|
181
|
+
const totalFiles = results.length;
|
|
182
|
+
return {
|
|
183
|
+
totalFiles,
|
|
184
|
+
totalIssues: results.reduce((sum, r) => sum + r.issues.length, 0),
|
|
185
|
+
issuesBySeverity,
|
|
186
|
+
issuesByCategory,
|
|
187
|
+
avgMetrics: {
|
|
188
|
+
loc: Math.round(sumMetrics.loc / totalFiles) || 0,
|
|
189
|
+
functions: Math.round(sumMetrics.functions / totalFiles) || 0,
|
|
190
|
+
classes: Math.round(sumMetrics.classes / totalFiles) || 0,
|
|
191
|
+
maxNestingDepth: sumMetrics.maxNestingDepth,
|
|
192
|
+
complexity: Math.round(sumMetrics.complexity / totalFiles) || 0,
|
|
193
|
+
imports: Math.round(sumMetrics.imports / totalFiles) || 0
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// ============================================================================
|
|
198
|
+
// Report Generation
|
|
199
|
+
// ============================================================================
|
|
200
|
+
/**
|
|
201
|
+
* Generate a markdown report from analysis results
|
|
202
|
+
*/
|
|
203
|
+
export function generateReport(result) {
|
|
204
|
+
const { filePath, language, issues, metrics, parseTime, analysisTime } = result;
|
|
205
|
+
let report = `# Code Analysis Report\n\n`;
|
|
206
|
+
report += `**File:** ${filePath}\n`;
|
|
207
|
+
report += `**Language:** ${language}\n`;
|
|
208
|
+
report += `**Parse Time:** ${parseTime}ms\n`;
|
|
209
|
+
report += `**Analysis Time:** ${analysisTime}ms\n\n`;
|
|
210
|
+
// Metrics
|
|
211
|
+
report += `## Metrics\n\n`;
|
|
212
|
+
report += `| Metric | Value |\n`;
|
|
213
|
+
report += `|--------|-------|\n`;
|
|
214
|
+
report += `| Lines of Code | ${metrics.loc} |\n`;
|
|
215
|
+
report += `| Functions | ${metrics.functions} |\n`;
|
|
216
|
+
report += `| Classes | ${metrics.classes} |\n`;
|
|
217
|
+
report += `| Cyclomatic Complexity | ${metrics.complexity} |\n`;
|
|
218
|
+
report += `| Max Nesting Depth | ${metrics.maxNestingDepth} |\n`;
|
|
219
|
+
report += `| Imports | ${metrics.imports} |\n\n`;
|
|
220
|
+
// Issues
|
|
221
|
+
if (issues.length === 0) {
|
|
222
|
+
report += `## Issues\n\nā
No issues found!\n`;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const errors = issues.filter(i => i.severity === 'error');
|
|
226
|
+
const warnings = issues.filter(i => i.severity === 'warning');
|
|
227
|
+
const infos = issues.filter(i => i.severity === 'info' || i.severity === 'suggestion');
|
|
228
|
+
report += `## Issues (${issues.length} total)\n\n`;
|
|
229
|
+
report += `- š“ Errors: ${errors.length}\n`;
|
|
230
|
+
report += `- š Warnings: ${warnings.length}\n`;
|
|
231
|
+
report += `- šµ Info: ${infos.length}\n\n`;
|
|
232
|
+
for (const issue of issues) {
|
|
233
|
+
const icon = issue.severity === 'error' ? 'š“' :
|
|
234
|
+
issue.severity === 'warning' ? 'š ' : 'šµ';
|
|
235
|
+
report += `### ${icon} ${issue.ruleId}: ${issue.message}\n\n`;
|
|
236
|
+
report += `**Line ${issue.line}:${issue.column}**\n\n`;
|
|
237
|
+
if (issue.suggestion) {
|
|
238
|
+
report += `š” **Suggestion:** ${issue.suggestion}\n\n`;
|
|
239
|
+
}
|
|
240
|
+
if (issue.quickFix) {
|
|
241
|
+
report += `š§ **Quick Fix:** ${issue.quickFix.description}\n\n`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return report;
|
|
246
|
+
}
|
|
247
|
+
// ============================================================================
|
|
248
|
+
// Integration Helpers
|
|
249
|
+
// ============================================================================
|
|
250
|
+
/**
|
|
251
|
+
* Convert tree-sitter issues to codeAnalyzer format
|
|
252
|
+
*/
|
|
253
|
+
export function convertToCodeIssues(issues) {
|
|
254
|
+
return issues.map(issue => ({
|
|
255
|
+
ruleId: issue.ruleId,
|
|
256
|
+
message: issue.message,
|
|
257
|
+
severity: issue.severity,
|
|
258
|
+
line: issue.line,
|
|
259
|
+
column: issue.column,
|
|
260
|
+
suggestion: issue.suggestion,
|
|
261
|
+
source: 'tree-sitter'
|
|
262
|
+
}));
|
|
263
|
+
}
|
|
264
|
+
// ============================================================================
|
|
265
|
+
// Exports
|
|
266
|
+
// ============================================================================
|
|
267
|
+
export { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages, ALL_TREE_SITTER_RULES, getRulesForLanguage };
|
|
268
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/services/ast/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Analysis Module
|
|
3
|
+
* Real AST-based code analysis using tree-sitter
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
export { analyzeWithTreeSitter, analyzeMultipleWithTreeSitter, aggregateMetrics, generateReport, convertToCodeIssues } from './analyzer.js';
|
|
7
|
+
export { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages } from './treeSitterParser.js';
|
|
8
|
+
export { ALL_TREE_SITTER_RULES, getRulesForLanguage, TYPESCRIPT_RULES, PYTHON_RULES, GO_RULES, RUST_RULES } from './rules.js';
|
|
9
|
+
export type { ASTNode, ASTNodeLocation, ParsedAST, SupportedASTLanguage, TreeSitterRule, TreeSitterIssue, TreeSitterQuickFix, TreeSitterContext, TreeSitterAnalysisResult, TreeSitterMetrics, ASTQueryMatch, ASTCapture, ASTVisitor, CommonNodeTypes } from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/ast/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,OAAO,EACP,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAC;AAGpB,YAAY,EAEV,OAAO,EACP,eAAe,EACf,SAAS,EAGT,oBAAoB,EAGpB,cAAc,EACd,eAAe,EACf,kBAAkB,EAGlB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAGjB,aAAa,EACb,UAAU,EAGV,UAAU,EAGV,eAAe,EAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Analysis Module
|
|
3
|
+
* Real AST-based code analysis using tree-sitter
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
// Main analyzer
|
|
7
|
+
export { analyzeWithTreeSitter, analyzeMultipleWithTreeSitter, aggregateMetrics, generateReport, convertToCodeIssues } from './analyzer.js';
|
|
8
|
+
// Parser utilities
|
|
9
|
+
export { parseCode, parseCodeCached, detectLanguage, extractMetrics, findNodesByType, walkAST, clearASTParserCache, getSupportedLanguages } from './treeSitterParser.js';
|
|
10
|
+
// Rules
|
|
11
|
+
export { ALL_TREE_SITTER_RULES, getRulesForLanguage, TYPESCRIPT_RULES, PYTHON_RULES, GO_RULES, RUST_RULES } from './rules.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/ast/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,OAAO,EACP,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,QAAQ;AACR,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter AST Rules
|
|
3
|
+
* Semantic analysis rules using tree-sitter pattern matching
|
|
4
|
+
* @version 3.5.0
|
|
5
|
+
*/
|
|
6
|
+
import type { TreeSitterRule } from './types.js';
|
|
7
|
+
export declare const TYPESCRIPT_RULES: TreeSitterRule[];
|
|
8
|
+
export declare const PYTHON_RULES: TreeSitterRule[];
|
|
9
|
+
export declare const GO_RULES: TreeSitterRule[];
|
|
10
|
+
export declare const RUST_RULES: TreeSitterRule[];
|
|
11
|
+
export declare const ALL_TREE_SITTER_RULES: TreeSitterRule[];
|
|
12
|
+
export declare function getRulesForLanguage(language: string): TreeSitterRule[];
|
|
13
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/services/ast/rules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAsC,MAAM,YAAY,CAAC;AA4XpG,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAI5C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,EAGxC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,cAAc,EAEpC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,cAAc,EAEtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAAc,EAEjD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAUtE"}
|