code-auditor-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +362 -0
- package/configs/hhra-compat.json +168 -0
- package/dist/analyzers/analyzerUtils.d.ts +69 -0
- package/dist/analyzers/analyzerUtils.d.ts.map +1 -0
- package/dist/analyzers/analyzerUtils.js +188 -0
- package/dist/analyzers/analyzerUtils.js.map +1 -0
- package/dist/analyzers/dataAccessAnalyzer.d.ts +46 -0
- package/dist/analyzers/dataAccessAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/dataAccessAnalyzer.js +448 -0
- package/dist/analyzers/dataAccessAnalyzer.js.map +1 -0
- package/dist/analyzers/dryAnalyzer.d.ts +30 -0
- package/dist/analyzers/dryAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/dryAnalyzer.js +537 -0
- package/dist/analyzers/dryAnalyzer.js.map +1 -0
- package/dist/analyzers/solidAnalyzer.d.ts +23 -0
- package/dist/analyzers/solidAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/solidAnalyzer.js +355 -0
- package/dist/analyzers/solidAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts +20 -0
- package/dist/auditRunner.d.ts.map +1 -0
- package/dist/auditRunner.js +214 -0
- package/dist/auditRunner.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/configLoader.d.ts +19 -0
- package/dist/config/configLoader.d.ts.map +1 -0
- package/dist/config/configLoader.js +124 -0
- package/dist/config/configLoader.js.map +1 -0
- package/dist/config/defaults.d.ts +69 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +142 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-standalone.d.ts +3 -0
- package/dist/mcp-standalone.d.ts.map +1 -0
- package/dist/mcp-standalone.js +171 -0
- package/dist/mcp-standalone.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +340 -0
- package/dist/mcp.js.map +1 -0
- package/dist/reporting/csvReportGenerator.d.ts +29 -0
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -0
- package/dist/reporting/csvReportGenerator.js +182 -0
- package/dist/reporting/csvReportGenerator.js.map +1 -0
- package/dist/reporting/htmlReportGenerator.d.ts +18 -0
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -0
- package/dist/reporting/htmlReportGenerator.js +352 -0
- package/dist/reporting/htmlReportGenerator.js.map +1 -0
- package/dist/reporting/jsonReportGenerator.d.ts +23 -0
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -0
- package/dist/reporting/jsonReportGenerator.js +103 -0
- package/dist/reporting/jsonReportGenerator.js.map +1 -0
- package/dist/reporting/reportGenerator.d.ts +21 -0
- package/dist/reporting/reportGenerator.d.ts.map +1 -0
- package/dist/reporting/reportGenerator.js +53 -0
- package/dist/reporting/reportGenerator.js.map +1 -0
- package/dist/types.d.ts +246 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/astParser.d.ts +71 -0
- package/dist/utils/astParser.d.ts.map +1 -0
- package/dist/utils/astParser.js +244 -0
- package/dist/utils/astParser.js.map +1 -0
- package/dist/utils/astUtils.d.ts +89 -0
- package/dist/utils/astUtils.d.ts.map +1 -0
- package/dist/utils/astUtils.js +289 -0
- package/dist/utils/astUtils.js.map +1 -0
- package/dist/utils/fileDiscovery.d.ts +58 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -0
- package/dist/utils/fileDiscovery.js +203 -0
- package/dist/utils/fileDiscovery.js.map +1 -0
- package/examples/.auditrc.example.json +61 -0
- package/examples/.auditrc.json +201 -0
- package/examples/nextjs.auditrc.json +65 -0
- package/examples/node-api.auditrc.json +82 -0
- package/examples/react.auditrc.json +59 -0
- package/package.json +62 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
const tools = [
|
|
9
|
+
{
|
|
10
|
+
name: 'audit_run',
|
|
11
|
+
description: 'Run a comprehensive code audit on the specified codebase',
|
|
12
|
+
parameters: [
|
|
13
|
+
{
|
|
14
|
+
name: 'path',
|
|
15
|
+
type: 'string',
|
|
16
|
+
required: false,
|
|
17
|
+
description: 'The directory path to audit (defaults to current directory)',
|
|
18
|
+
default: process.cwd(),
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'audit_check_health',
|
|
24
|
+
description: 'Quick health check of a codebase',
|
|
25
|
+
parameters: [
|
|
26
|
+
{
|
|
27
|
+
name: 'path',
|
|
28
|
+
type: 'string',
|
|
29
|
+
required: false,
|
|
30
|
+
description: 'The directory path to check',
|
|
31
|
+
default: process.cwd(),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
async function runCliCommand(args) {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
const cliPath = path.join(path.dirname(new URL(import.meta.url).pathname), 'cli.js');
|
|
39
|
+
const child = spawn('node', [cliPath, ...args], {
|
|
40
|
+
cwd: process.cwd(),
|
|
41
|
+
env: process.env,
|
|
42
|
+
});
|
|
43
|
+
let stdout = '';
|
|
44
|
+
let stderr = '';
|
|
45
|
+
child.stdout.on('data', (data) => {
|
|
46
|
+
stdout += data.toString();
|
|
47
|
+
});
|
|
48
|
+
child.stderr.on('data', (data) => {
|
|
49
|
+
stderr += data.toString();
|
|
50
|
+
});
|
|
51
|
+
child.on('error', (error) => {
|
|
52
|
+
reject(error);
|
|
53
|
+
});
|
|
54
|
+
child.on('close', (code) => {
|
|
55
|
+
if (code !== 0) {
|
|
56
|
+
reject(new Error(`Command failed with exit code ${code}: ${stderr}`));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
try {
|
|
60
|
+
// Try to parse as JSON first
|
|
61
|
+
const result = JSON.parse(stdout);
|
|
62
|
+
resolve(result);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// If not JSON, return as text
|
|
66
|
+
resolve({ output: stdout, stderr });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async function startMcpServer() {
|
|
73
|
+
const server = new Server({
|
|
74
|
+
name: 'code-auditor',
|
|
75
|
+
version: '0.1.0',
|
|
76
|
+
}, {
|
|
77
|
+
capabilities: {
|
|
78
|
+
tools: {},
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Handle tool listing
|
|
82
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
83
|
+
return {
|
|
84
|
+
tools: tools.map(tool => ({
|
|
85
|
+
name: tool.name,
|
|
86
|
+
description: tool.description,
|
|
87
|
+
inputSchema: {
|
|
88
|
+
type: 'object',
|
|
89
|
+
properties: tool.parameters.reduce((acc, param) => {
|
|
90
|
+
acc[param.name] = {
|
|
91
|
+
type: param.type,
|
|
92
|
+
description: param.description,
|
|
93
|
+
...(param.default !== undefined && { default: param.default }),
|
|
94
|
+
...(param.enum && { enum: param.enum }),
|
|
95
|
+
};
|
|
96
|
+
return acc;
|
|
97
|
+
}, {}),
|
|
98
|
+
required: tool.parameters.filter(p => p.required).map(p => p.name),
|
|
99
|
+
},
|
|
100
|
+
})),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
// Handle tool execution
|
|
104
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
105
|
+
const { name, arguments: args } = request.params;
|
|
106
|
+
try {
|
|
107
|
+
let result;
|
|
108
|
+
switch (name) {
|
|
109
|
+
case 'audit_run': {
|
|
110
|
+
const auditPath = args.path || process.cwd();
|
|
111
|
+
result = await runCliCommand(['--json', '--path', auditPath]);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case 'audit_check_health': {
|
|
115
|
+
const auditPath = args.path || process.cwd();
|
|
116
|
+
// Run a quick audit and calculate health score
|
|
117
|
+
const auditResult = await runCliCommand(['--json', '--path', auditPath, '--quick']);
|
|
118
|
+
// Simple health calculation
|
|
119
|
+
const violations = auditResult.violations || [];
|
|
120
|
+
const critical = violations.filter((v) => v.severity === 'critical').length;
|
|
121
|
+
const warnings = violations.filter((v) => v.severity === 'warning').length;
|
|
122
|
+
const healthScore = Math.max(0, 100 - (critical * 10) - (warnings * 2));
|
|
123
|
+
result = {
|
|
124
|
+
healthScore,
|
|
125
|
+
status: healthScore >= 70 ? 'healthy' : 'needs-attention',
|
|
126
|
+
metrics: {
|
|
127
|
+
totalViolations: violations.length,
|
|
128
|
+
criticalViolations: critical,
|
|
129
|
+
warningViolations: warnings,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
default:
|
|
135
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
content: [
|
|
139
|
+
{
|
|
140
|
+
type: 'text',
|
|
141
|
+
text: JSON.stringify(result, null, 2),
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: 'text',
|
|
151
|
+
text: JSON.stringify({
|
|
152
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
153
|
+
tool: name,
|
|
154
|
+
}),
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
isError: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
const transport = new StdioServerTransport();
|
|
162
|
+
await server.connect(transport);
|
|
163
|
+
console.error(chalk.green('✓ Code Auditor MCP Server started (standalone mode)'));
|
|
164
|
+
console.error(chalk.gray('Listening on stdio...'));
|
|
165
|
+
}
|
|
166
|
+
// Start server
|
|
167
|
+
startMcpServer().catch(error => {
|
|
168
|
+
console.error(chalk.red('Failed to start MCP server:'), error);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=mcp-standalone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-standalone.js","sourceRoot":"","sources":["../src/mcp-standalone.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { createAuditRunner } from './auditRunner.js';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import fs from 'node:fs/promises';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
const tools = [
|
|
10
|
+
{
|
|
11
|
+
name: 'audit_run',
|
|
12
|
+
description: 'Run a comprehensive code audit on the specified codebase',
|
|
13
|
+
parameters: [
|
|
14
|
+
{
|
|
15
|
+
name: 'path',
|
|
16
|
+
type: 'string',
|
|
17
|
+
required: false,
|
|
18
|
+
description: 'The directory path to audit (defaults to current directory)',
|
|
19
|
+
default: process.cwd(),
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'enabledAnalyzers',
|
|
23
|
+
type: 'array',
|
|
24
|
+
required: false,
|
|
25
|
+
description: 'List of analyzers to run (solid, dry, security, component, data-access)',
|
|
26
|
+
default: ['solid', 'dry', 'security'],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'minSeverity',
|
|
30
|
+
type: 'string',
|
|
31
|
+
required: false,
|
|
32
|
+
description: 'Minimum severity level to report',
|
|
33
|
+
default: 'warning',
|
|
34
|
+
enum: ['info', 'warning', 'critical'],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'audit_analyze_file',
|
|
40
|
+
description: 'Analyze a specific file for code quality issues',
|
|
41
|
+
parameters: [
|
|
42
|
+
{
|
|
43
|
+
name: 'filePath',
|
|
44
|
+
type: 'string',
|
|
45
|
+
required: true,
|
|
46
|
+
description: 'The file path to analyze',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'analyzers',
|
|
50
|
+
type: 'array',
|
|
51
|
+
required: false,
|
|
52
|
+
description: 'Specific analyzers to run on this file',
|
|
53
|
+
default: ['solid', 'dry', 'security'],
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'audit_check_health',
|
|
59
|
+
description: 'Quick health check of a codebase with key metrics',
|
|
60
|
+
parameters: [
|
|
61
|
+
{
|
|
62
|
+
name: 'path',
|
|
63
|
+
type: 'string',
|
|
64
|
+
required: false,
|
|
65
|
+
description: 'The directory path to check',
|
|
66
|
+
default: process.cwd(),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'threshold',
|
|
70
|
+
type: 'number',
|
|
71
|
+
required: false,
|
|
72
|
+
description: 'Health score threshold (0-100) for pass/fail',
|
|
73
|
+
default: 70,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'audit_list_analyzers',
|
|
79
|
+
description: 'List all available code analyzers and their capabilities',
|
|
80
|
+
parameters: [],
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
async function startMcpServer() {
|
|
84
|
+
const server = new Server({
|
|
85
|
+
name: 'code-auditor',
|
|
86
|
+
version: '0.1.0',
|
|
87
|
+
}, {
|
|
88
|
+
capabilities: {
|
|
89
|
+
tools: {},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// Handle tool listing
|
|
93
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
94
|
+
return {
|
|
95
|
+
tools: tools.map(tool => ({
|
|
96
|
+
name: tool.name,
|
|
97
|
+
description: tool.description,
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: tool.parameters.reduce((acc, param) => {
|
|
101
|
+
acc[param.name] = {
|
|
102
|
+
type: param.type,
|
|
103
|
+
description: param.description,
|
|
104
|
+
...(param.default !== undefined && { default: param.default }),
|
|
105
|
+
...(param.enum && { enum: param.enum }),
|
|
106
|
+
};
|
|
107
|
+
return acc;
|
|
108
|
+
}, {}),
|
|
109
|
+
required: tool.parameters.filter(p => p.required).map(p => p.name),
|
|
110
|
+
},
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
// Handle tool execution
|
|
115
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
116
|
+
const { name, arguments: args } = request.params;
|
|
117
|
+
try {
|
|
118
|
+
let result;
|
|
119
|
+
switch (name) {
|
|
120
|
+
case 'audit_run': {
|
|
121
|
+
const auditPath = path.resolve(args.path || process.cwd());
|
|
122
|
+
const options = {
|
|
123
|
+
projectRoot: auditPath,
|
|
124
|
+
enabledAnalyzers: args.enabledAnalyzers || ['solid', 'dry', 'security'],
|
|
125
|
+
minSeverity: (args.minSeverity || 'warning'),
|
|
126
|
+
verbose: false,
|
|
127
|
+
};
|
|
128
|
+
const runner = createAuditRunner(options);
|
|
129
|
+
const auditResult = await runner.run();
|
|
130
|
+
// Format for MCP
|
|
131
|
+
result = {
|
|
132
|
+
summary: {
|
|
133
|
+
totalViolations: auditResult.summary.totalViolations,
|
|
134
|
+
criticalIssues: auditResult.summary.criticalIssues,
|
|
135
|
+
warnings: auditResult.summary.warnings,
|
|
136
|
+
suggestions: auditResult.summary.suggestions,
|
|
137
|
+
filesAnalyzed: auditResult.metadata.filesAnalyzed,
|
|
138
|
+
executionTime: auditResult.metadata.auditDuration,
|
|
139
|
+
healthScore: calculateHealthScore(auditResult),
|
|
140
|
+
},
|
|
141
|
+
violations: getAllViolations(auditResult).slice(0, 100), // Limit to first 100
|
|
142
|
+
recommendations: auditResult.recommendations,
|
|
143
|
+
};
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case 'audit_analyze_file': {
|
|
147
|
+
const absolutePath = path.resolve(args.filePath);
|
|
148
|
+
await fs.access(absolutePath); // Check file exists
|
|
149
|
+
const options = {
|
|
150
|
+
projectRoot: path.dirname(absolutePath),
|
|
151
|
+
enabledAnalyzers: args.analyzers || ['solid', 'dry', 'security'],
|
|
152
|
+
includePaths: [absolutePath],
|
|
153
|
+
verbose: false,
|
|
154
|
+
};
|
|
155
|
+
const runner = createAuditRunner(options);
|
|
156
|
+
const auditResult = await runner.run();
|
|
157
|
+
const fileViolations = getAllViolations(auditResult).filter(v => v.file === absolutePath);
|
|
158
|
+
result = {
|
|
159
|
+
file: absolutePath,
|
|
160
|
+
violations: fileViolations,
|
|
161
|
+
summary: {
|
|
162
|
+
total: fileViolations.length,
|
|
163
|
+
bySeverity: fileViolations
|
|
164
|
+
.reduce((acc, v) => {
|
|
165
|
+
acc[v.severity] = (acc[v.severity] || 0) + 1;
|
|
166
|
+
return acc;
|
|
167
|
+
}, {}),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
case 'audit_check_health': {
|
|
173
|
+
const auditPath = path.resolve(args.path || process.cwd());
|
|
174
|
+
const threshold = args.threshold || 70;
|
|
175
|
+
const runner = createAuditRunner({
|
|
176
|
+
projectRoot: auditPath,
|
|
177
|
+
enabledAnalyzers: ['solid', 'dry', 'security'],
|
|
178
|
+
minSeverity: 'warning',
|
|
179
|
+
verbose: false,
|
|
180
|
+
});
|
|
181
|
+
const auditResult = await runner.run();
|
|
182
|
+
const healthScore = calculateHealthScore(auditResult);
|
|
183
|
+
result = {
|
|
184
|
+
healthScore,
|
|
185
|
+
threshold,
|
|
186
|
+
passed: healthScore >= threshold,
|
|
187
|
+
status: healthScore >= threshold ? 'healthy' : 'needs-attention',
|
|
188
|
+
metrics: {
|
|
189
|
+
filesAnalyzed: auditResult.metadata.filesAnalyzed,
|
|
190
|
+
totalViolations: auditResult.summary.totalViolations,
|
|
191
|
+
criticalViolations: auditResult.summary.criticalIssues,
|
|
192
|
+
warningViolations: auditResult.summary.warnings,
|
|
193
|
+
},
|
|
194
|
+
recommendation: getHealthRecommendation(healthScore, auditResult),
|
|
195
|
+
};
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
case 'audit_list_analyzers': {
|
|
199
|
+
result = {
|
|
200
|
+
analyzers: [
|
|
201
|
+
{
|
|
202
|
+
id: 'solid',
|
|
203
|
+
name: 'SOLID Analyzer',
|
|
204
|
+
description: 'Checks adherence to SOLID principles',
|
|
205
|
+
checks: [
|
|
206
|
+
'Single Responsibility violations',
|
|
207
|
+
'Open/Closed violations',
|
|
208
|
+
'Liskov Substitution issues',
|
|
209
|
+
'Interface Segregation problems',
|
|
210
|
+
'Dependency Inversion violations',
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: 'dry',
|
|
215
|
+
name: 'DRY Analyzer',
|
|
216
|
+
description: 'Identifies code duplication',
|
|
217
|
+
checks: [
|
|
218
|
+
'Exact code duplicates',
|
|
219
|
+
'Similar code patterns',
|
|
220
|
+
'Duplicate imports',
|
|
221
|
+
'Repeated string literals',
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: 'security',
|
|
226
|
+
name: 'Security Analyzer',
|
|
227
|
+
description: 'Verifies security patterns',
|
|
228
|
+
checks: [
|
|
229
|
+
'Missing authentication',
|
|
230
|
+
'Authorization issues',
|
|
231
|
+
'SQL injection risks',
|
|
232
|
+
'Unvalidated inputs',
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 'component',
|
|
237
|
+
name: 'Component Analyzer',
|
|
238
|
+
description: 'Analyzes UI components',
|
|
239
|
+
checks: [
|
|
240
|
+
'Missing error boundaries',
|
|
241
|
+
'Complex render methods',
|
|
242
|
+
'Deep nesting',
|
|
243
|
+
'Performance issues',
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
id: 'data-access',
|
|
248
|
+
name: 'Data Access Analyzer',
|
|
249
|
+
description: 'Reviews database patterns',
|
|
250
|
+
checks: [
|
|
251
|
+
'N+1 queries',
|
|
252
|
+
'Missing transactions',
|
|
253
|
+
'Direct DB access in UI',
|
|
254
|
+
'Performance issues',
|
|
255
|
+
],
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
};
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
default:
|
|
262
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
content: [
|
|
266
|
+
{
|
|
267
|
+
type: 'text',
|
|
268
|
+
text: JSON.stringify(result, null, 2),
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
return {
|
|
275
|
+
content: [
|
|
276
|
+
{
|
|
277
|
+
type: 'text',
|
|
278
|
+
text: JSON.stringify({
|
|
279
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
280
|
+
tool: name,
|
|
281
|
+
}),
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
isError: true,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
const transport = new StdioServerTransport();
|
|
289
|
+
await server.connect(transport);
|
|
290
|
+
console.error(chalk.green('✓ Code Auditor MCP Server started'));
|
|
291
|
+
console.error(chalk.gray('Listening on stdio...'));
|
|
292
|
+
}
|
|
293
|
+
function getAllViolations(result) {
|
|
294
|
+
const violations = [];
|
|
295
|
+
for (const [analyzerName, analyzerResult] of Object.entries(result.analyzerResults)) {
|
|
296
|
+
for (const violation of analyzerResult.violations) {
|
|
297
|
+
violations.push({
|
|
298
|
+
...violation,
|
|
299
|
+
analyzer: analyzerName,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return violations;
|
|
304
|
+
}
|
|
305
|
+
function calculateHealthScore(result) {
|
|
306
|
+
let score = 100;
|
|
307
|
+
const critical = result.summary.criticalIssues;
|
|
308
|
+
const warning = result.summary.warnings;
|
|
309
|
+
score -= critical * 10;
|
|
310
|
+
score -= warning * 2;
|
|
311
|
+
return Math.max(0, Math.min(100, score));
|
|
312
|
+
}
|
|
313
|
+
function generateRecommendations(result) {
|
|
314
|
+
const recommendations = [];
|
|
315
|
+
if (result.summary.criticalIssues > 0) {
|
|
316
|
+
recommendations.push({
|
|
317
|
+
priority: 'high',
|
|
318
|
+
title: 'Fix critical violations immediately',
|
|
319
|
+
description: `${result.summary.criticalIssues} critical issues require immediate attention`,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Add more recommendation logic based on patterns
|
|
323
|
+
return recommendations;
|
|
324
|
+
}
|
|
325
|
+
function getHealthRecommendation(score, result) {
|
|
326
|
+
if (score >= 90)
|
|
327
|
+
return 'Excellent code health!';
|
|
328
|
+
if (score >= 70)
|
|
329
|
+
return 'Good code health with room for improvement';
|
|
330
|
+
if (result.summary.criticalIssues > 0) {
|
|
331
|
+
return `Fix ${result.summary.criticalIssues} critical violations first`;
|
|
332
|
+
}
|
|
333
|
+
return 'Code health needs attention - run detailed audit';
|
|
334
|
+
}
|
|
335
|
+
// Start server
|
|
336
|
+
startMcpServer().catch(error => {
|
|
337
|
+
console.error(chalk.red('Failed to start MCP server:'), error);
|
|
338
|
+
process.exit(1);
|
|
339
|
+
});
|
|
340
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV Report Generator (Functional)
|
|
3
|
+
* Generates CSV formatted audit reports
|
|
4
|
+
*/
|
|
5
|
+
import { AuditResult, Violation } from '../types.js';
|
|
6
|
+
export interface CSVReportConfig {
|
|
7
|
+
delimiter?: string;
|
|
8
|
+
includeHeaders?: boolean;
|
|
9
|
+
columns?: string[];
|
|
10
|
+
customColumns?: Record<string, (violation: Violation & {
|
|
11
|
+
analyzer: string;
|
|
12
|
+
}) => string>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate a CSV report from audit results
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateCSVReport(result: AuditResult, config?: CSVReportConfig): string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a summary CSV report
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateSummaryCSVReport(result: AuditResult, config?: CSVReportConfig): string;
|
|
22
|
+
/**
|
|
23
|
+
* Generate a pivot table style CSV report
|
|
24
|
+
*/
|
|
25
|
+
export declare function generatePivotCSVReport(result: AuditResult): string;
|
|
26
|
+
export declare const CSVReportGenerator: {
|
|
27
|
+
generate: typeof generateCSVReport;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=csvReportGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/csvReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC,CAAC;CACzF;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAiCR;AAmGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsBlE;AAGD,eAAO,MAAM,kBAAkB;;CAE9B,CAAC"}
|