@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.
Files changed (72) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/errors.d.ts.map +1 -1
  3. package/dist/errors.js +10 -4
  4. package/dist/errors.js.map +1 -1
  5. package/dist/index.js +68 -49
  6. package/dist/index.js.map +1 -1
  7. package/dist/resources/session.d.ts +1 -1
  8. package/dist/resources/session.d.ts.map +1 -1
  9. package/dist/resources/session.js +22 -18
  10. package/dist/resources/session.js.map +1 -1
  11. package/dist/sloop-bridge.d.ts +14 -0
  12. package/dist/sloop-bridge.d.ts.map +1 -1
  13. package/dist/sloop-bridge.js +103 -89
  14. package/dist/sloop-bridge.js.map +1 -1
  15. package/dist/state.d.ts +2 -3
  16. package/dist/state.d.ts.map +1 -1
  17. package/dist/state.js +2 -2
  18. package/dist/state.js.map +1 -1
  19. package/dist/tools/analyze-content.d.ts.map +1 -1
  20. package/dist/tools/analyze-content.js +17 -17
  21. package/dist/tools/analyze-content.js.map +1 -1
  22. package/dist/tools/analyze-file.d.ts.map +1 -1
  23. package/dist/tools/analyze-file.js +16 -18
  24. package/dist/tools/analyze-file.js.map +1 -1
  25. package/dist/tools/analyze-files.d.ts.map +1 -1
  26. package/dist/tools/analyze-files.js +71 -96
  27. package/dist/tools/analyze-files.js.map +1 -1
  28. package/dist/tools/apply-all-quick-fixes.d.ts.map +1 -1
  29. package/dist/tools/apply-all-quick-fixes.js +71 -141
  30. package/dist/tools/apply-all-quick-fixes.js.map +1 -1
  31. package/dist/tools/apply-quick-fix.d.ts.map +1 -1
  32. package/dist/tools/apply-quick-fix.js +13 -84
  33. package/dist/tools/apply-quick-fix.js.map +1 -1
  34. package/dist/tools/health-check.d.ts.map +1 -1
  35. package/dist/tools/health-check.js +30 -22
  36. package/dist/tools/health-check.js.map +1 -1
  37. package/dist/tools/list-active-rules.d.ts.map +1 -1
  38. package/dist/tools/list-active-rules.js +25 -15
  39. package/dist/tools/list-active-rules.js.map +1 -1
  40. package/dist/types.d.ts +1 -1
  41. package/dist/utils/config.d.ts +32 -0
  42. package/dist/utils/config.d.ts.map +1 -0
  43. package/dist/utils/config.js +54 -0
  44. package/dist/utils/config.js.map +1 -0
  45. package/dist/utils/file-registration.d.ts.map +1 -1
  46. package/dist/utils/file-registration.js +2 -2
  47. package/dist/utils/file-registration.js.map +1 -1
  48. package/dist/utils/filesystem.js +8 -8
  49. package/dist/utils/filesystem.js.map +1 -1
  50. package/dist/utils/formatting.d.ts +1 -1
  51. package/dist/utils/formatting.d.ts.map +1 -1
  52. package/dist/utils/formatting.js +2 -4
  53. package/dist/utils/formatting.js.map +1 -1
  54. package/dist/utils/language.js +11 -11
  55. package/dist/utils/language.js.map +1 -1
  56. package/dist/utils/quick-fix.d.ts +14 -0
  57. package/dist/utils/quick-fix.d.ts.map +1 -0
  58. package/dist/utils/quick-fix.js +48 -0
  59. package/dist/utils/quick-fix.js.map +1 -0
  60. package/dist/utils/scope.d.ts +4 -0
  61. package/dist/utils/scope.d.ts.map +1 -1
  62. package/dist/utils/scope.js +8 -7
  63. package/dist/utils/scope.js.map +1 -1
  64. package/dist/utils/sloop.d.ts +4 -3
  65. package/dist/utils/sloop.d.ts.map +1 -1
  66. package/dist/utils/sloop.js +22 -13
  67. package/dist/utils/sloop.js.map +1 -1
  68. package/dist/utils/transforms.d.ts +1 -1
  69. package/dist/utils/transforms.d.ts.map +1 -1
  70. package/dist/utils/transforms.js.map +1 -1
  71. package/package.json +12 -2
  72. 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":"AAMA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG;;;;;GAsIlD"}
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 "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";
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
- // Re-analyze the file to get current issues with quick fixes
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 : (rawResult.rawIssues || []);
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
- console.error('[DEBUG] Quick fix structure:', JSON.stringify(quickFix, null, 2).substring(0, 1000));
32
- // Write debug info to a file we can read
33
- writeFileSync('/tmp/quickfix-debug.json', JSON.stringify({
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
- console.error(`[Cache] File system update notification sent, waiting for SLOOP to process...`);
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: "text",
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":"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"}
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":"AAqBA,wBAAsB,iBAAiB;;;;;GAuHtC"}
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 "fs";
2
- import { join } from "path";
3
- import { fileURLToPath } from "url";
4
- import { dirname } from "path";
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, "package.json"), "utf-8"));
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 "unknown";
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 = sloopBridge ? "running" : "not started (starts on first analysis)";
33
+ const sloopStatus = getSloopBridge() ? 'running' : 'not started (starts on first analysis)';
30
34
  // Get plugin information
31
- const pluginsDir = join(PACKAGE_ROOT, "sonarlint-backend", "plugins");
35
+ const pluginsDir = join(PACKAGE_ROOT, 'sonarlint-backend', 'plugins');
32
36
  const pluginsExist = existsSync(pluginsDir);
33
- let plugins = [];
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: "active",
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 ? (sloopBridge ? "healthy" : "ready") : "degraded",
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 ? "found" : "missing",
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: ["check_quality", "check_files", "check_code", "list_rules", "fix_issue", "fix_all_issues", "health_check"],
79
+ tools: ['check_quality', 'check_files', 'check_code', 'list_rules', 'fix_issue', 'fix_all_issues', 'health_check'],
76
80
  features: [
77
- "Session storage for multi-turn conversations",
78
- "Batch analysis",
79
- "Content analysis (unsaved files)",
80
- "MCP resources",
81
- "Quick fixes support",
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
- const statusEmoji = healthStatus.status === "healthy" ? "✅ Healthy" : healthStatus.status === "ready" ? "🟡 Ready" : "⚠️ Degraded";
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: "text",
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":"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"}
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":"AAEA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,GAAG;;;;;GA2EpD"}
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 "../utils/sloop.js";
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
- console.error(`[MCP] Listing active rules${language ? ` for ${language}` : ''}`);
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
- // Sort languages alphabetically
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 | Clean Code | Impacts |\n`;
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 cleanCode = rule.cleanCodeAttribute || '';
43
- output += `| \`${rule.key}\` | ${rule.name} | ${cleanCode} | ${impacts} |\n`;
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: "text", text: output }],
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
- type: "text",
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":"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"}
1
+ {"version":3,"file":"list-active-rules.js","sourceRoot":"","sources":["../../src/tools/list-active-rules.ts"],"names":[],"mappings":"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"}
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: "INFO" | "MINOR" | "MAJOR" | "CRITICAL" | "BLOCKER";
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,CACjC,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,CAoBjB"}
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: /test[s]?[/\\]/.test(filePath),
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,CACjC,SAAmB,EACnB,aAAqB,EACrB,WAAoB;IAEpB,MAAM,OAAO,GAAG,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QAC9B,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,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,OAAO,EAAE,OAAO;YAChB,OAAO;YACP,gBAAgB,EAAE,aAAa;YAC/B,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
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"}
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * File system utilities for SLOOP integration
3
3
  */
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";
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":"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"}
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Output formatting utilities
3
3
  */
4
- import type { AnalysisResult, BatchAnalysisResult } from "../types.js";
4
+ import type { AnalysisResult, BatchAnalysisResult } from '../types.js';
5
5
  /**
6
6
  * Format analysis result for display
7
7
  */
@@ -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,EAAiB,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyCnE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAkD7E"}
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"}