@nielspeter/sonarlint-mcp-server 0.4.0 → 0.5.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/CHANGELOG.md +24 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +10 -4
- package/dist/errors.js.map +1 -1
- package/dist/index.js +68 -49
- package/dist/index.js.map +1 -1
- package/dist/resources/session.d.ts +1 -1
- package/dist/resources/session.d.ts.map +1 -1
- package/dist/resources/session.js +22 -18
- package/dist/resources/session.js.map +1 -1
- package/dist/sloop-bridge.d.ts +14 -0
- package/dist/sloop-bridge.d.ts.map +1 -1
- package/dist/sloop-bridge.js +103 -89
- package/dist/sloop-bridge.js.map +1 -1
- package/dist/state.d.ts +2 -3
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -2
- package/dist/state.js.map +1 -1
- package/dist/tools/analyze-content.d.ts.map +1 -1
- package/dist/tools/analyze-content.js +17 -17
- package/dist/tools/analyze-content.js.map +1 -1
- package/dist/tools/analyze-file.d.ts.map +1 -1
- package/dist/tools/analyze-file.js +16 -18
- package/dist/tools/analyze-file.js.map +1 -1
- package/dist/tools/analyze-files.d.ts.map +1 -1
- package/dist/tools/analyze-files.js +71 -96
- package/dist/tools/analyze-files.js.map +1 -1
- package/dist/tools/apply-all-quick-fixes.d.ts.map +1 -1
- package/dist/tools/apply-all-quick-fixes.js +71 -141
- package/dist/tools/apply-all-quick-fixes.js.map +1 -1
- package/dist/tools/apply-quick-fix.d.ts.map +1 -1
- package/dist/tools/apply-quick-fix.js +13 -84
- package/dist/tools/apply-quick-fix.js.map +1 -1
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +30 -22
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/list-active-rules.d.ts.map +1 -1
- package/dist/tools/list-active-rules.js +25 -15
- package/dist/tools/list-active-rules.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/config.d.ts +32 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +54 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-registration.d.ts.map +1 -1
- package/dist/utils/file-registration.js +2 -2
- package/dist/utils/file-registration.js.map +1 -1
- package/dist/utils/filesystem.js +8 -8
- package/dist/utils/filesystem.js.map +1 -1
- package/dist/utils/formatting.d.ts +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +2 -4
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/language.js +11 -11
- package/dist/utils/language.js.map +1 -1
- package/dist/utils/quick-fix.d.ts +14 -0
- package/dist/utils/quick-fix.d.ts.map +1 -0
- package/dist/utils/quick-fix.js +48 -0
- package/dist/utils/quick-fix.js.map +1 -0
- package/dist/utils/scope.d.ts +4 -0
- package/dist/utils/scope.d.ts.map +1 -1
- package/dist/utils/scope.js +8 -7
- package/dist/utils/scope.js.map +1 -1
- package/dist/utils/sloop.d.ts +4 -3
- package/dist/utils/sloop.d.ts.map +1 -1
- package/dist/utils/sloop.js +22 -13
- package/dist/utils/sloop.js.map +1 -1
- package/dist/utils/transforms.d.ts +1 -1
- package/dist/utils/transforms.d.ts.map +1 -1
- package/dist/utils/transforms.js.map +1 -1
- package/package.json +12 -2
- package/scripts/generate-rules-doc.mjs +86 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-quick-fix.d.ts","sourceRoot":"","sources":["../../src/tools/apply-quick-fix.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apply-quick-fix.d.ts","sourceRoot":"","sources":["../../src/tools/apply-quick-fix.ts"],"names":[],"mappings":"AAOA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG;;;;;GAuDlD"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from
|
|
2
|
-
import { SloopError } from
|
|
3
|
-
import { ensureSloopBridge } from
|
|
4
|
-
import { getOrCreateScope } from
|
|
5
|
-
import { notifyFileSystemChanged } from
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { SloopError } from '../errors.js';
|
|
3
|
+
import { ensureSloopBridge } from '../utils/sloop.js';
|
|
4
|
+
import { getOrCreateScope } from '../utils/scope.js';
|
|
5
|
+
import { notifyFileSystemChanged } from '../utils/filesystem.js';
|
|
6
|
+
import { applyTextEdits } from '../utils/quick-fix.js';
|
|
6
7
|
export async function handleApplyQuickFix(args) {
|
|
7
8
|
const { filePath, line, rule } = args;
|
|
8
9
|
console.error(`[MCP] Applying quick fix for ${rule} at ${filePath}:${line}`);
|
|
9
|
-
// Validate file exists
|
|
10
10
|
if (!existsSync(filePath)) {
|
|
11
11
|
throw new SloopError(`File not found: ${filePath}`, `The file ${filePath} does not exist. Please check the path and try again.`, false);
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
const bridge = await ensureSloopBridge();
|
|
13
|
+
const bridge = await ensureSloopBridge(filePath);
|
|
15
14
|
const scopeId = await getOrCreateScope(filePath);
|
|
16
15
|
const rawResult = await bridge.analyzeFilesAndTrack(scopeId, [filePath]);
|
|
17
|
-
const rawIssues = rawResult.raisedIssues?.length ? rawResult.raisedIssues :
|
|
18
|
-
// Find the issue at the specified line with the specified rule
|
|
16
|
+
const rawIssues = rawResult.raisedIssues?.length ? rawResult.raisedIssues : rawResult.rawIssues || [];
|
|
19
17
|
const targetIssue = rawIssues.find((issue) => {
|
|
20
18
|
const issueLine = issue.textRange?.startLine || issue.startLine || 0;
|
|
21
19
|
return issueLine === line && issue.ruleKey === rule;
|
|
@@ -26,85 +24,16 @@ export async function handleApplyQuickFix(args) {
|
|
|
26
24
|
if (!targetIssue.quickFixes || targetIssue.quickFixes.length === 0) {
|
|
27
25
|
throw new SloopError(`No quick fix available`, `The issue at line ${line} (${rule}) does not have an automated quick fix available.`, false);
|
|
28
26
|
}
|
|
29
|
-
// Apply the first quick fix
|
|
30
27
|
const quickFix = targetIssue.quickFixes[0];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
writeFileSync(
|
|
34
|
-
targetIssue: {
|
|
35
|
-
ruleKey: targetIssue.ruleKey,
|
|
36
|
-
textRange: targetIssue.textRange,
|
|
37
|
-
quickFixes: targetIssue.quickFixes
|
|
38
|
-
},
|
|
39
|
-
quickFix: quickFix
|
|
40
|
-
}, null, 2), 'utf-8');
|
|
41
|
-
let fileContent = readFileSync(filePath, 'utf-8');
|
|
42
|
-
const lines = fileContent.split('\n');
|
|
43
|
-
// Apply each edit in the quick fix
|
|
44
|
-
const fileEdits = quickFix.inputFileEdits || quickFix.fileEdits || [];
|
|
45
|
-
if (fileEdits.length > 0) {
|
|
46
|
-
console.error(`[DEBUG] Found ${fileEdits.length} file edits`);
|
|
47
|
-
for (const fileEdit of fileEdits) {
|
|
48
|
-
if (fileEdit.textEdits) {
|
|
49
|
-
console.error(`[DEBUG] Found ${fileEdit.textEdits.length} text edits`);
|
|
50
|
-
// Sort edits in reverse order to maintain line numbers
|
|
51
|
-
const sortedEdits = [...fileEdit.textEdits].sort((a, b) => {
|
|
52
|
-
const aStart = a.range?.startLine || 0;
|
|
53
|
-
const bStart = b.range?.startLine || 0;
|
|
54
|
-
return bStart - aStart; // Reverse order
|
|
55
|
-
});
|
|
56
|
-
for (const edit of sortedEdits) {
|
|
57
|
-
const startLine = (edit.range?.startLine || 1) - 1; // Convert to 0-based
|
|
58
|
-
const startCol = edit.range?.startLineOffset || 0;
|
|
59
|
-
const endLine = (edit.range?.endLine || startLine + 1) - 1;
|
|
60
|
-
const endCol = edit.range?.endLineOffset || lines[endLine]?.length || 0;
|
|
61
|
-
const newText = edit.newText || '';
|
|
62
|
-
console.error(`[DEBUG] Applying edit at line ${startLine + 1}:${startCol} to ${endLine + 1}:${endCol}`);
|
|
63
|
-
console.error(`[DEBUG] Old text: "${lines[startLine].substring(startCol, endCol)}"`);
|
|
64
|
-
console.error(`[DEBUG] New text: "${newText}"`);
|
|
65
|
-
// Apply the edit
|
|
66
|
-
if (startLine === endLine) {
|
|
67
|
-
const line = lines[startLine];
|
|
68
|
-
lines[startLine] = line.substring(0, startCol) + newText + line.substring(endCol);
|
|
69
|
-
console.error(`[DEBUG] Result: "${lines[startLine]}"`);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
// Multi-line edit
|
|
73
|
-
const firstLine = lines[startLine].substring(0, startCol) + newText;
|
|
74
|
-
const lastLine = lines[endLine].substring(endCol);
|
|
75
|
-
lines.splice(startLine, endLine - startLine + 1, firstLine + lastLine);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
console.error('[DEBUG] No fileEdits found in quick fix!');
|
|
83
|
-
}
|
|
84
|
-
// Write the modified content back
|
|
85
|
-
fileContent = lines.join('\n');
|
|
86
|
-
console.error(`[DEBUG] About to write file: ${filePath}`);
|
|
87
|
-
console.error(`[DEBUG] File content length: ${fileContent.length} chars`);
|
|
88
|
-
console.error(`[DEBUG] First 200 chars: ${fileContent.substring(0, 200)}`);
|
|
89
|
-
try {
|
|
90
|
-
writeFileSync(filePath, fileContent, 'utf-8');
|
|
91
|
-
console.error(`[DEBUG] File written successfully`);
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
console.error(`[DEBUG] Error writing file:`, err);
|
|
95
|
-
throw err;
|
|
96
|
-
}
|
|
97
|
-
// Notify SLOOP that file system was updated (proper cache invalidation)
|
|
98
|
-
console.error(`[Cache] Sending file system update notification...`);
|
|
28
|
+
const lines = readFileSync(filePath, 'utf-8').split('\n');
|
|
29
|
+
applyTextEdits(lines, quickFix);
|
|
30
|
+
writeFileSync(filePath, lines.join('\n'), 'utf-8');
|
|
99
31
|
await notifyFileSystemChanged(filePath, scopeId);
|
|
100
|
-
|
|
101
|
-
// CRITICAL: Give SLOOP time to process the file system notification
|
|
102
|
-
// Without this delay, the next analysis request may arrive before SLOOP updates its registry
|
|
103
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
32
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
104
33
|
return {
|
|
105
34
|
content: [
|
|
106
35
|
{
|
|
107
|
-
type:
|
|
36
|
+
type: 'text',
|
|
108
37
|
text: `✅ **Quick fix applied successfully**\n\nFile: ${filePath}\nLine: ${line}\nRule: ${rule}\nFix: ${quickFix.message || 'Applied automated fix'}\n\nThe file has been modified. You may want to re-analyze it to confirm the issue is resolved.`,
|
|
109
38
|
},
|
|
110
39
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-quick-fix.js","sourceRoot":"","sources":["../../src/tools/apply-quick-fix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"apply-quick-fix.js","sourceRoot":"","sources":["../../src/tools/apply-quick-fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AAyBA,wBAAsB,iBAAiB;;;;;GAyHtC"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync } from
|
|
2
|
-
import { join } from
|
|
3
|
-
import { fileURLToPath } from
|
|
4
|
-
import {
|
|
5
|
-
import { sessionResults, batchResults, sloopBridge, serverStartTime } from "../state.js";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { sessionResults, batchResults, getSloopBridge, serverStartTime } from '../state.js';
|
|
6
5
|
// Get package root directory (where sonarlint-backend is installed)
|
|
7
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
7
|
const __dirname = dirname(__filename);
|
|
9
8
|
const PACKAGE_ROOT = join(__dirname, '..', '..'); // Go up from dist/tools/ to package root
|
|
9
|
+
function getHealthStatus(pluginsExist) {
|
|
10
|
+
if (!pluginsExist)
|
|
11
|
+
return 'degraded';
|
|
12
|
+
return getSloopBridge() ? 'healthy' : 'ready';
|
|
13
|
+
}
|
|
10
14
|
// Read version from package.json
|
|
11
15
|
function getPackageVersion() {
|
|
12
16
|
try {
|
|
13
|
-
const packageJson = JSON.parse(readFileSync(join(PACKAGE_ROOT,
|
|
17
|
+
const packageJson = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf-8'));
|
|
14
18
|
return packageJson.version;
|
|
15
19
|
}
|
|
16
20
|
catch {
|
|
17
|
-
return
|
|
21
|
+
return 'unknown';
|
|
18
22
|
}
|
|
19
23
|
}
|
|
20
24
|
export async function handleHealthCheck() {
|
|
@@ -26,14 +30,14 @@ export async function handleHealthCheck() {
|
|
|
26
30
|
const memoryUsage = process.memoryUsage();
|
|
27
31
|
const memoryMB = Math.round(memoryUsage.heapUsed / 1024 / 1024);
|
|
28
32
|
// Check SLOOP status - reflect actual backend state
|
|
29
|
-
const sloopStatus =
|
|
33
|
+
const sloopStatus = getSloopBridge() ? 'running' : 'not started (starts on first analysis)';
|
|
30
34
|
// Get plugin information
|
|
31
|
-
const pluginsDir = join(PACKAGE_ROOT,
|
|
35
|
+
const pluginsDir = join(PACKAGE_ROOT, 'sonarlint-backend', 'plugins');
|
|
32
36
|
const pluginsExist = existsSync(pluginsDir);
|
|
33
|
-
|
|
37
|
+
const plugins = [];
|
|
34
38
|
if (pluginsExist) {
|
|
35
39
|
const files = readdirSync(pluginsDir);
|
|
36
|
-
const jarFiles = files.filter(f => f.endsWith('.jar'));
|
|
40
|
+
const jarFiles = files.filter((f) => f.endsWith('.jar'));
|
|
37
41
|
for (const jarFile of jarFiles) {
|
|
38
42
|
// Parse plugin name and version from filename
|
|
39
43
|
const match = jarFile.match(/sonar-(\w+)-plugin-([\d.]+)\.jar/);
|
|
@@ -41,7 +45,7 @@ export async function handleHealthCheck() {
|
|
|
41
45
|
plugins.push({
|
|
42
46
|
name: match[1].charAt(0).toUpperCase() + match[1].slice(1),
|
|
43
47
|
version: match[2],
|
|
44
|
-
status:
|
|
48
|
+
status: 'active',
|
|
45
49
|
});
|
|
46
50
|
}
|
|
47
51
|
}
|
|
@@ -52,7 +56,7 @@ export async function handleHealthCheck() {
|
|
|
52
56
|
batchResults: batchResults.size,
|
|
53
57
|
};
|
|
54
58
|
const healthStatus = {
|
|
55
|
-
status: pluginsExist
|
|
59
|
+
status: getHealthStatus(pluginsExist),
|
|
56
60
|
version: getPackageVersion(),
|
|
57
61
|
uptime: {
|
|
58
62
|
milliseconds: uptimeMs,
|
|
@@ -63,7 +67,7 @@ export async function handleHealthCheck() {
|
|
|
63
67
|
},
|
|
64
68
|
backend: {
|
|
65
69
|
status: sloopStatus,
|
|
66
|
-
pluginsDirectory: pluginsExist ?
|
|
70
|
+
pluginsDirectory: pluginsExist ? 'found' : 'missing',
|
|
67
71
|
},
|
|
68
72
|
plugins,
|
|
69
73
|
memory: {
|
|
@@ -72,17 +76,21 @@ export async function handleHealthCheck() {
|
|
|
72
76
|
rss: `${Math.round(memoryUsage.rss / 1024 / 1024)}MB`,
|
|
73
77
|
},
|
|
74
78
|
cache: cacheStats,
|
|
75
|
-
tools: [
|
|
79
|
+
tools: ['check_quality', 'check_files', 'check_code', 'list_rules', 'fix_issue', 'fix_all_issues', 'health_check'],
|
|
76
80
|
features: [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
'Session storage for multi-turn conversations',
|
|
82
|
+
'Batch analysis',
|
|
83
|
+
'Content analysis (unsaved files)',
|
|
84
|
+
'MCP resources',
|
|
85
|
+
'Quick fixes support',
|
|
82
86
|
],
|
|
83
87
|
};
|
|
84
88
|
let output = `# SonarLint MCP Server Health Check\n\n`;
|
|
85
|
-
|
|
89
|
+
let statusEmoji = '⚠️ Degraded';
|
|
90
|
+
if (healthStatus.status === 'healthy')
|
|
91
|
+
statusEmoji = '✅ Healthy';
|
|
92
|
+
else if (healthStatus.status === 'ready')
|
|
93
|
+
statusEmoji = '🟡 Ready';
|
|
86
94
|
output += `**Status**: ${statusEmoji}\n`;
|
|
87
95
|
output += `**Version**: ${healthStatus.version}\n`;
|
|
88
96
|
output += `**Uptime**: ${healthStatus.uptime.formatted}\n\n`;
|
|
@@ -115,7 +123,7 @@ export async function handleHealthCheck() {
|
|
|
115
123
|
return {
|
|
116
124
|
content: [
|
|
117
125
|
{
|
|
118
|
-
type:
|
|
126
|
+
type: 'text',
|
|
119
127
|
text: output,
|
|
120
128
|
},
|
|
121
129
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-active-rules.d.ts","sourceRoot":"","sources":["../../src/tools/list-active-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-active-rules.d.ts","sourceRoot":"","sources":["../../src/tools/list-active-rules.ts"],"names":[],"mappings":"AASA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,GAAG;;;;;GA4EpD"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import { ensureSloopBridge } from
|
|
1
|
+
import { ensureSloopBridge } from '../utils/sloop.js';
|
|
2
|
+
function formatParams(paramsByKey) {
|
|
3
|
+
if (!paramsByKey)
|
|
4
|
+
return '';
|
|
5
|
+
const entries = Object.values(paramsByKey);
|
|
6
|
+
if (entries.length === 0)
|
|
7
|
+
return '';
|
|
8
|
+
return entries.map((p) => `${p.key}=${p.defaultValue} (${p.type})`).join(', ');
|
|
9
|
+
}
|
|
2
10
|
export async function handleListActiveRules(args) {
|
|
3
11
|
const { language } = args;
|
|
4
|
-
|
|
12
|
+
const langSuffix = language ? ` for ${language}` : '';
|
|
13
|
+
console.error(`[MCP] Listing active rules${langSuffix}`);
|
|
5
14
|
const bridge = await ensureSloopBridge();
|
|
6
15
|
try {
|
|
7
16
|
const response = await bridge.listAllStandaloneRulesDefinitions();
|
|
@@ -10,7 +19,6 @@ export async function handleListActiveRules(args) {
|
|
|
10
19
|
const rulesByLanguage = new Map();
|
|
11
20
|
for (const [key, rule] of Object.entries(rulesByKey)) {
|
|
12
21
|
const ruleDef = rule;
|
|
13
|
-
// Filter by language if specified
|
|
14
22
|
const ruleLang = ruleDef.language?.toLowerCase();
|
|
15
23
|
if (language && ruleLang !== language.toLowerCase()) {
|
|
16
24
|
continue;
|
|
@@ -25,38 +33,40 @@ export async function handleListActiveRules(args) {
|
|
|
25
33
|
}
|
|
26
34
|
let output = `# Active SonarLint Rules\n\n`;
|
|
27
35
|
let totalRules = 0;
|
|
28
|
-
|
|
29
|
-
const sortedLangs = [...rulesByLanguage.keys()].sort();
|
|
36
|
+
let configurableCount = 0;
|
|
37
|
+
const sortedLangs = [...rulesByLanguage.keys()].sort((a, b) => a.localeCompare(b));
|
|
30
38
|
for (const lang of sortedLangs) {
|
|
31
39
|
const rules = rulesByLanguage.get(lang);
|
|
32
40
|
totalRules += rules.length;
|
|
33
41
|
output += `## ${lang} (${rules.length} rules)\n\n`;
|
|
34
|
-
output += `| Rule | Name |
|
|
42
|
+
output += `| Rule | Name | Parameters | Impacts |\n`;
|
|
35
43
|
output += `|------|------|------------|----------|\n`;
|
|
36
|
-
// Sort by rule key
|
|
37
44
|
rules.sort((a, b) => a.key.localeCompare(b.key));
|
|
38
45
|
for (const rule of rules) {
|
|
39
46
|
const impacts = (rule.softwareImpacts || [])
|
|
40
47
|
.map((i) => `${i.softwareQuality}:${i.impactSeverity}`)
|
|
41
48
|
.join(', ');
|
|
42
|
-
const
|
|
43
|
-
|
|
49
|
+
const params = formatParams(rule.paramsByKey);
|
|
50
|
+
if (params)
|
|
51
|
+
configurableCount++;
|
|
52
|
+
output += `| \`${rule.key}\` | ${rule.name} | ${params} | ${impacts} |\n`;
|
|
44
53
|
}
|
|
45
54
|
output += `\n`;
|
|
46
55
|
}
|
|
47
|
-
output = output.replace('# Active SonarLint Rules\n\n', `# Active SonarLint Rules\n\n**Total Active Rules**: ${totalRules}\n\n`);
|
|
56
|
+
output = output.replace('# Active SonarLint Rules\n\n', `# Active SonarLint Rules\n\n**Total Active Rules**: ${totalRules} (${configurableCount} configurable)\n\n`);
|
|
48
57
|
return {
|
|
49
|
-
content: [{ type:
|
|
58
|
+
content: [{ type: 'text', text: output }],
|
|
50
59
|
};
|
|
51
60
|
}
|
|
52
61
|
catch (error) {
|
|
53
62
|
console.error('[MCP] Failed to list rules from SLOOP:', error);
|
|
54
|
-
// Fallback: return basic info if SLOOP RPC fails
|
|
55
63
|
return {
|
|
56
|
-
content: [
|
|
57
|
-
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
58
67
|
text: `# Active SonarLint Rules\n\nFailed to retrieve rules from SLOOP backend. Ensure the server is running and try again.\n\nError: ${error}\n`,
|
|
59
|
-
}
|
|
68
|
+
},
|
|
69
|
+
],
|
|
60
70
|
};
|
|
61
71
|
}
|
|
62
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-active-rules.js","sourceRoot":"","sources":["../../src/tools/list-active-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAS;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAA6B,CAAC;IAEnD,
|
|
1
|
+
{"version":3,"file":"list-active-rules.js","sourceRoot":"","sources":["../../src/tools/list-active-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,SAAS,YAAY,CAAC,WAA4C;IAChE,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAS;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAA6B,CAAC;IAEnD,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,iCAAiC,EAAE,CAAC;QAClE,MAAM,UAAU,GAAwB,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAElE,0BAA0B;QAC1B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAiB,CAAC;QACjD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,IAAW,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;YACjD,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBAAE,SAAS;YAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;YAC3C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,MAAM,GAAG,8BAA8B,CAAC;QAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YACzC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;YAE3B,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC,MAAM,aAAa,CAAC;YACnD,MAAM,IAAI,0CAA0C,CAAC;YACrD,MAAM,IAAI,2CAA2C,CAAC;YAEtD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;qBACzC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;qBAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9C,IAAI,MAAM;oBAAE,iBAAiB,EAAE,CAAC;gBAChC,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,IAAI,MAAM,MAAM,MAAM,OAAO,MAAM,CAAC;YAC5E,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,8BAA8B,EAC9B,uDAAuD,UAAU,KAAK,iBAAiB,oBAAoB,CAC5G,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,kIAAkI,KAAK,IAAI;iBAClJ;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface AnalysisIssue {
|
|
|
6
6
|
column: number;
|
|
7
7
|
endLine: number;
|
|
8
8
|
endColumn: number;
|
|
9
|
-
severity:
|
|
9
|
+
severity: 'INFO' | 'MINOR' | 'MAJOR' | 'CRITICAL' | 'BLOCKER';
|
|
10
10
|
rule: string;
|
|
11
11
|
ruleDescription: string;
|
|
12
12
|
message: string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load and parse sonarlint.json rule configuration
|
|
3
|
+
*/
|
|
4
|
+
/** User-facing format in sonarlint.json */
|
|
5
|
+
interface SonarlintRuleEntry {
|
|
6
|
+
level?: 'on' | 'off';
|
|
7
|
+
parameters?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
interface SonarlintConfig {
|
|
10
|
+
rules?: Record<string, SonarlintRuleEntry>;
|
|
11
|
+
}
|
|
12
|
+
/** SLOOP internal format (matches StandaloneRuleConfigDto) */
|
|
13
|
+
export interface StandaloneRuleConfig {
|
|
14
|
+
isActive: boolean;
|
|
15
|
+
paramValueByKey: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find the config file in a project root.
|
|
19
|
+
* Primary: sonarlint.json, Fallback: .sonarlint/settings.json
|
|
20
|
+
*/
|
|
21
|
+
export declare function findConfigFile(projectRoot: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Transform user-facing rule config to SLOOP's standaloneRuleConfigByKey format.
|
|
24
|
+
*/
|
|
25
|
+
export declare function transformRuleConfig(config: SonarlintConfig): Record<string, StandaloneRuleConfig>;
|
|
26
|
+
/**
|
|
27
|
+
* Load rule configuration from a project root.
|
|
28
|
+
* Returns empty config if no file found or on parse error (never throws).
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadRuleConfig(projectRoot: string): Record<string, StandaloneRuleConfig>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,2CAA2C;AAC3C,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC5C;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAajG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAcxF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load and parse sonarlint.json rule configuration
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* Find the config file in a project root.
|
|
8
|
+
* Primary: sonarlint.json, Fallback: .sonarlint/settings.json
|
|
9
|
+
*/
|
|
10
|
+
export function findConfigFile(projectRoot) {
|
|
11
|
+
const primary = join(projectRoot, 'sonarlint.json');
|
|
12
|
+
if (existsSync(primary))
|
|
13
|
+
return primary;
|
|
14
|
+
const fallback = join(projectRoot, '.sonarlint', 'settings.json');
|
|
15
|
+
if (existsSync(fallback))
|
|
16
|
+
return fallback;
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Transform user-facing rule config to SLOOP's standaloneRuleConfigByKey format.
|
|
21
|
+
*/
|
|
22
|
+
export function transformRuleConfig(config) {
|
|
23
|
+
const result = {};
|
|
24
|
+
if (!config.rules || typeof config.rules !== 'object')
|
|
25
|
+
return result;
|
|
26
|
+
for (const [ruleKey, entry] of Object.entries(config.rules)) {
|
|
27
|
+
result[ruleKey] = {
|
|
28
|
+
isActive: entry.level !== 'off',
|
|
29
|
+
paramValueByKey: entry.parameters ?? {},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load rule configuration from a project root.
|
|
36
|
+
* Returns empty config if no file found or on parse error (never throws).
|
|
37
|
+
*/
|
|
38
|
+
export function loadRuleConfig(projectRoot) {
|
|
39
|
+
const configPath = findConfigFile(projectRoot);
|
|
40
|
+
if (!configPath)
|
|
41
|
+
return {};
|
|
42
|
+
try {
|
|
43
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
const ruleConfig = transformRuleConfig(parsed);
|
|
46
|
+
console.error(`[MCP] Loaded rule config from ${configPath} (${Object.keys(ruleConfig).length} rules)`);
|
|
47
|
+
return ruleConfig;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(`[MCP] Warning: failed to parse ${configPath}: ${error}`);
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAkB5B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,MAAM,MAAM,GAAyC,EAAE,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAErE,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK;YAC/B,eAAe,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,iCAAiC,UAAU,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC;QACvG,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-registration.d.ts","sourceRoot":"","sources":["../../src/utils/file-registration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"file-registration.d.ts","sourceRoot":"","sources":["../../src/utils/file-registration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAoBrH"}
|
|
@@ -12,7 +12,7 @@ import { languageToEnum, detectLanguage } from './language.js';
|
|
|
12
12
|
*/
|
|
13
13
|
export function buildClientFileDtos(filePaths, configScopeId, projectRoot) {
|
|
14
14
|
const baseDir = projectRoot || dirname(filePaths[0]);
|
|
15
|
-
return filePaths.map(filePath => {
|
|
15
|
+
return filePaths.map((filePath) => {
|
|
16
16
|
const content = readFileSync(filePath, 'utf-8');
|
|
17
17
|
const language = detectLanguage(filePath);
|
|
18
18
|
const sloopLanguage = language !== 'unknown' ? languageToEnum(language) : null;
|
|
@@ -21,7 +21,7 @@ export function buildClientFileDtos(filePaths, configScopeId, projectRoot) {
|
|
|
21
21
|
fsPath: filePath,
|
|
22
22
|
ideRelativePath: relative(baseDir, filePath),
|
|
23
23
|
configScopeId,
|
|
24
|
-
isTest: /
|
|
24
|
+
isTest: /tests?[/\\]/.test(filePath),
|
|
25
25
|
charset: 'UTF-8',
|
|
26
26
|
content,
|
|
27
27
|
detectedLanguage: sloopLanguage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-registration.js","sourceRoot":"","sources":["../../src/utils/file-registration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAc/D;;GAEG;AACH,MAAM,UAAU,mBAAmB,
|
|
1
|
+
{"version":3,"file":"file-registration.js","sourceRoot":"","sources":["../../src/utils/file-registration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAc/D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAmB,EAAE,aAAqB,EAAE,WAAoB;IAClG,MAAM,OAAO,GAAG,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,aAAa,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,OAAO;YACL,GAAG,EAAE,UAAU,QAAQ,EAAE;YACzB,MAAM,EAAE,QAAQ;YAChB,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC5C,aAAa;YACb,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,OAAO;YAChB,OAAO;YACP,gBAAgB,EAAE,aAAa;YAC/B,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/utils/filesystem.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* File system utilities for SLOOP integration
|
|
3
3
|
*/
|
|
4
|
-
import { dirname, relative } from
|
|
5
|
-
import { readFileSync } from
|
|
6
|
-
import { scopeMap } from
|
|
7
|
-
import { detectLanguage, languageToEnum } from
|
|
8
|
-
import { ensureSloopBridge } from
|
|
4
|
+
import { dirname, relative } from 'path';
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
6
|
+
import { scopeMap } from '../state.js';
|
|
7
|
+
import { detectLanguage, languageToEnum } from './language.js';
|
|
8
|
+
import { ensureSloopBridge } from './sloop.js';
|
|
9
9
|
/**
|
|
10
10
|
* Notify SLOOP that file system was updated (proper cache invalidation)
|
|
11
11
|
*/
|
|
@@ -33,7 +33,7 @@ export async function notifyFileSystemChanged(filePath, configScopeId) {
|
|
|
33
33
|
// Without this, SLOOP ignores changes to "closed" files
|
|
34
34
|
bridge.sendNotification('file/didOpenFile', {
|
|
35
35
|
configurationScopeId: configScopeId,
|
|
36
|
-
fileUri: uri
|
|
36
|
+
fileUri: uri,
|
|
37
37
|
});
|
|
38
38
|
console.error(`[FS] Marked file as open: ${filePath}`);
|
|
39
39
|
// Read the actual file content to pass to SLOOP
|
|
@@ -50,13 +50,13 @@ export async function notifyFileSystemChanged(filePath, configScopeId) {
|
|
|
50
50
|
fsPath: filePath, // Provide fsPath for analyzers that need it
|
|
51
51
|
content: fileContent, // Providing content calls setDirty(), which takes precedence over fsPath
|
|
52
52
|
detectedLanguage: languageEnum, // e.g., "JS", "TS", "PYTHON"
|
|
53
|
-
isUserDefined: true // CRITICAL: Must be true for SLOOP to analyze!
|
|
53
|
+
isUserDefined: true, // CRITICAL: Must be true for SLOOP to analyze!
|
|
54
54
|
};
|
|
55
55
|
// Send file/didUpdateFileSystem notification
|
|
56
56
|
bridge.sendNotification('file/didUpdateFileSystem', {
|
|
57
57
|
addedFiles: [],
|
|
58
58
|
changedFiles: [clientFileDto],
|
|
59
|
-
removedFiles: []
|
|
59
|
+
removedFiles: [],
|
|
60
60
|
});
|
|
61
61
|
console.error(`[FS] Notified file system update:`);
|
|
62
62
|
console.error(`[FS] URI: ${uri}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB,EAAE,aAAqB;IACnF,MAAM,GAAG,GAAG,UAAU,QAAQ,EAAE,CAAC;IAEjC,kDAAkD;IAClD,IAAI,WAA+B,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC9B,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,sCAAsC;QACtC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9C,uFAAuF;QACvF,wDAAwD;QACxD,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;YAC1C,oBAAoB,EAAE,aAAa;YACnC,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAEvD,gDAAgD;QAChD,+EAA+E;QAC/E,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpD,sBAAsB;QACtB,4FAA4F;QAC5F,MAAM,aAAa,GAAG;YACpB,GAAG;YACH,eAAe,EAAE,YAAY;YAC7B,aAAa;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,QAAQ,EAAE,4CAA4C;YAC9D,OAAO,EAAE,WAAW,EAAE,yEAAyE;YAC/F,gBAAgB,EAAE,YAAY,EAAE,6BAA6B;YAC7D,aAAa,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB,EAAE,aAAqB;IACnF,MAAM,GAAG,GAAG,UAAU,QAAQ,EAAE,CAAC;IAEjC,kDAAkD;IAClD,IAAI,WAA+B,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC9B,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,sCAAsC;QACtC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9C,uFAAuF;QACvF,wDAAwD;QACxD,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;YAC1C,oBAAoB,EAAE,aAAa;YACnC,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAEvD,gDAAgD;QAChD,+EAA+E;QAC/E,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpD,sBAAsB;QACtB,4FAA4F;QAC5F,MAAM,aAAa,GAAG;YACpB,GAAG;YACH,eAAe,EAAE,YAAY;YAC7B,aAAa;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,QAAQ,EAAE,4CAA4C;YAC9D,OAAO,EAAE,WAAW,EAAE,yEAAyE;YAC/F,gBAAgB,EAAE,YAAY,EAAE,6BAA6B;YAC7D,aAAa,EAAE,IAAI,EAAE,+CAA+C;SACrE,CAAC;QAEF,6CAA6C;QAC7C,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,EAAE;YAClD,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,CAAC,aAAa,CAAC;YAC7B,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,0BAA0B,WAAW,CAAC,MAAM,QAAQ,CAAC,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,2BAA2B,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;QAChF,qCAAqC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyCnE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAgD7E"}
|