@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
package/dist/utils/formatting.js
CHANGED
|
@@ -11,7 +11,7 @@ export function formatAnalysisResult(result) {
|
|
|
11
11
|
output += `**Rules Checked**: ${summary.rulesChecked}\n`;
|
|
12
12
|
output += `**Total Issues**: ${summary.total}\n\n`;
|
|
13
13
|
if (summary.total === 0) {
|
|
14
|
-
output +=
|
|
14
|
+
output += '✅ No issues found!\n';
|
|
15
15
|
return output;
|
|
16
16
|
}
|
|
17
17
|
// Severity breakdown
|
|
@@ -71,9 +71,7 @@ export function formatBatchAnalysisResult(result) {
|
|
|
71
71
|
}
|
|
72
72
|
output += `\n`;
|
|
73
73
|
// Only show files with issues, sorted by issue count descending
|
|
74
|
-
const filesWithIssues = files
|
|
75
|
-
.filter(f => f.issueCount > 0)
|
|
76
|
-
.sort((a, b) => b.issueCount - a.issueCount);
|
|
74
|
+
const filesWithIssues = files.filter((f) => f.issueCount > 0).sort((a, b) => b.issueCount - a.issueCount);
|
|
77
75
|
for (const file of filesWithIssues) {
|
|
78
76
|
output += `### ${file.filePath} (${file.issueCount} issue${file.issueCount > 1 ? 's' : ''})\n\n`;
|
|
79
77
|
output += `| Line | Severity | Rule | Message |\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAEvD,IAAI,MAAM,GAAG,uBAAuB,QAAQ,MAAM,CAAC;IACnD,MAAM,IAAI,iBAAiB,QAAQ,IAAI,CAAC;IACxC,MAAM,IAAI,sBAAsB,OAAO,CAAC,YAAY,IAAI,CAAC;IACzD,MAAM,IAAI,qBAAqB,OAAO,CAAC,KAAK,MAAM,CAAC;IAEnD,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,sBAAsB,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,2BAA2B,CAAC;IACtC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC;IAClG,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,sBAAsB,OAAO,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC;IACrG,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,mBAAmB,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC5F,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,mBAAmB,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC5F,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,iBAAiB,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IACxF,MAAM,IAAI,IAAI,CAAC;IAEf,kBAAkB;IAClB,MAAM,IAAI,wBAAwB,CAAC;IAEnC,sBAAsB;IACtB,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,QAAQ,MAAM,CAAC;QAC3E,MAAM,IAAI,eAAe,KAAK,CAAC,IAAI,QAAQ,CAAC;QAC5C,MAAM,IAAI,gBAAgB,KAAK,CAAC,OAAO,MAAM,CAAC;QAE9C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,4BAA4B,KAAK,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,SAAS,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAA2B;IACnE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;IAEhE,IAAI,MAAM,GAAG,8BAA8B,CAAC;IAC5C,MAAM,IAAI,uBAAuB,OAAO,CAAC,UAAU,IAAI,CAAC;IACxD,MAAM,IAAI,0BAA0B,OAAO,CAAC,eAAe,IAAI,CAAC;IAChE,MAAM,IAAI,qBAAqB,OAAO,CAAC,WAAW,MAAM,CAAC;IAEzD,IAAI,OAAO,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,UAAU,mCAAmC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAA+B;QAC7C,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7C,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC/C,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QACzC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QACzC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;KACvC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QAC9C,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,OAAO,KAAK,IAAI,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,IAAI,CAAC;IAEf,gEAAgE;IAChE,MAAM,eAAe,GAAG,KAAK
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/language.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Language detection and mapping utilities
|
|
3
3
|
*/
|
|
4
|
-
import { extname } from
|
|
4
|
+
import { extname } from 'path';
|
|
5
5
|
/**
|
|
6
6
|
* Detect language from file extension
|
|
7
7
|
*/
|
|
@@ -28,16 +28,16 @@ export function detectLanguage(filePath) {
|
|
|
28
28
|
*/
|
|
29
29
|
export function languageToEnum(language) {
|
|
30
30
|
const enumMap = {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
javascript: 'JS',
|
|
32
|
+
typescript: 'TS',
|
|
33
|
+
python: 'PYTHON',
|
|
34
|
+
java: 'JAVA',
|
|
35
|
+
go: 'GO',
|
|
36
|
+
php: 'PHP',
|
|
37
|
+
ruby: 'RUBY',
|
|
38
|
+
html: 'HTML',
|
|
39
|
+
css: 'CSS',
|
|
40
|
+
xml: 'XML',
|
|
41
41
|
};
|
|
42
42
|
return enumMap[language] || language.toUpperCase();
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,WAAW,GAA2B;QAC1C,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;KACd,CAAC;IACF,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAA2B;QACtC,
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,WAAW,GAA2B;QAC1C,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;KACd,CAAC;IACF,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAA2B;QACtC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;KACX,CAAC;IACF,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared logic for applying SLOOP quick-fix text edits to file content.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Apply a SLOOP quick fix's text edits to an array of lines (mutates in place).
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyTextEdits(lines: string[], quickFix: any): void;
|
|
8
|
+
/**
|
|
9
|
+
* Filter issues by minimum severity level.
|
|
10
|
+
*/
|
|
11
|
+
export declare function filterBySeverity<T extends {
|
|
12
|
+
severity: string;
|
|
13
|
+
}>(issues: T[], minSeverity: string): T[];
|
|
14
|
+
//# sourceMappingURL=quick-fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-fix.d.ts","sourceRoot":"","sources":["../../src/utils/quick-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CA2BnE;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,CAGtG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared logic for applying SLOOP quick-fix text edits to file content.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Apply a SLOOP quick fix's text edits to an array of lines (mutates in place).
|
|
6
|
+
*/
|
|
7
|
+
export function applyTextEdits(lines, quickFix) {
|
|
8
|
+
const fileEdits = quickFix.inputFileEdits || quickFix.fileEdits || [];
|
|
9
|
+
for (const fileEdit of fileEdits) {
|
|
10
|
+
if (!fileEdit.textEdits)
|
|
11
|
+
continue;
|
|
12
|
+
// Sort edits in reverse order to maintain line numbers
|
|
13
|
+
const sortedEdits = [...fileEdit.textEdits].sort((a, b) => {
|
|
14
|
+
return (b.range?.startLine || 0) - (a.range?.startLine || 0);
|
|
15
|
+
});
|
|
16
|
+
for (const edit of sortedEdits) {
|
|
17
|
+
const startLine = (edit.range?.startLine || 1) - 1;
|
|
18
|
+
const startCol = edit.range?.startLineOffset || 0;
|
|
19
|
+
const endLine = (edit.range?.endLine || startLine + 1) - 1;
|
|
20
|
+
const endCol = edit.range?.endLineOffset || lines[endLine]?.length || 0;
|
|
21
|
+
const newText = edit.newText || '';
|
|
22
|
+
if (startLine === endLine) {
|
|
23
|
+
const line = lines[startLine];
|
|
24
|
+
lines[startLine] = line.substring(0, startCol) + newText + line.substring(endCol);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const firstLine = lines[startLine].substring(0, startCol) + newText;
|
|
28
|
+
const lastLine = lines[endLine].substring(endCol);
|
|
29
|
+
lines.splice(startLine, endLine - startLine + 1, firstLine + lastLine);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const SEVERITY_ORDER = {
|
|
35
|
+
INFO: 0,
|
|
36
|
+
MINOR: 1,
|
|
37
|
+
MAJOR: 2,
|
|
38
|
+
CRITICAL: 3,
|
|
39
|
+
BLOCKER: 4,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Filter issues by minimum severity level.
|
|
43
|
+
*/
|
|
44
|
+
export function filterBySeverity(issues, minSeverity) {
|
|
45
|
+
const minLevel = SEVERITY_ORDER[minSeverity] ?? 0;
|
|
46
|
+
return issues.filter((issue) => (SEVERITY_ORDER[issue.severity] ?? 0) >= minLevel);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=quick-fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-fix.js","sourceRoot":"","sources":["../../src/utils/quick-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,QAAa;IAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;IACtE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,SAAS;QAElC,uDAAuD;QACvD,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE;YAClE,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,eAAe,IAAI,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YAEnC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC9B,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC;gBACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;CACX,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAiC,MAAW,EAAE,WAAmB;IAC/F,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;AACrF,CAAC"}
|
package/dist/utils/scope.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Configuration scope management utilities
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* Find the project root by walking up to find package.json, .git, etc.
|
|
6
|
+
*/
|
|
7
|
+
export declare function findProjectRoot(startPath: string): string;
|
|
4
8
|
/**
|
|
5
9
|
* Get or create a SLOOP configuration scope for a project.
|
|
6
10
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/utils/scope.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/utils/scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C9F"}
|
package/dist/utils/scope.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Configuration scope management utilities
|
|
3
3
|
*/
|
|
4
|
-
import { dirname, join } from
|
|
5
|
-
import { existsSync } from
|
|
6
|
-
import { createHash } from
|
|
7
|
-
import { scopeMap, scopeToProjectRoot, scopeFiles, getSloopBridge } from
|
|
8
|
-
import { buildClientFileDtos } from
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { createHash } from 'crypto';
|
|
7
|
+
import { scopeMap, scopeToProjectRoot, scopeFiles, getSloopBridge } from '../state.js';
|
|
8
|
+
import { buildClientFileDtos } from './file-registration.js';
|
|
9
9
|
/**
|
|
10
10
|
* Find the project root by walking up to find package.json, .git, etc.
|
|
11
11
|
*/
|
|
12
|
-
function findProjectRoot(startPath) {
|
|
12
|
+
export function findProjectRoot(startPath) {
|
|
13
13
|
let dir = startPath;
|
|
14
14
|
const markers = ['package.json', '.git', 'pom.xml', 'build.gradle', 'pyproject.toml', 'go.mod'];
|
|
15
|
-
while (dir !== dirname(dir)) {
|
|
15
|
+
while (dir !== dirname(dir)) {
|
|
16
|
+
// stop at filesystem root
|
|
16
17
|
for (const marker of markers) {
|
|
17
18
|
if (existsSync(join(dir, marker))) {
|
|
18
19
|
return dir;
|
package/dist/utils/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/utils/scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/utils/scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAEhG,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,0BAA0B;QAC1B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAClC,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,uCAAuC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAoB;IAC3E,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACZ,kEAAkE;QAClE,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/C,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,SAAS,IAAI,EAAE,CAAC;IAEnC,OAAO,CAAC,KAAK,CAAC,2CAA2C,UAAU,QAAQ,WAAW,EAAE,CAAC,CAAC;IAE1F,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAEtC,oDAAoD;IACpD,+EAA+E;IAC/E,2EAA2E;IAC3E,6BAA6B;IAC7B,MAAM,eAAe,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3E,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEjC,gDAAgD;IAChD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC/D,WAAW,CAAC,qBAAqB,CAAC,UAAU,EAAE;YAC5C,IAAI,EAAE,YAAY,WAAW,EAAE;SAChC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,qBAAqB,CAAC,CAAC;QAC1E,MAAM,YAAY,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,eAAe,UAAU,wBAAwB,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/utils/sloop.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SLOOP bridge initialization and management
|
|
3
3
|
*/
|
|
4
|
-
import { SloopBridge } from
|
|
4
|
+
import { SloopBridge } from '../sloop-bridge.js';
|
|
5
5
|
export declare const PACKAGE_ROOT: string;
|
|
6
6
|
/**
|
|
7
|
-
* Ensure SLOOP bridge is initialized
|
|
7
|
+
* Ensure SLOOP bridge is initialized.
|
|
8
|
+
* Pass a filePath so the bridge can load rule config from the project's sonarlint.json on first init.
|
|
8
9
|
*/
|
|
9
|
-
export declare function ensureSloopBridge(): Promise<SloopBridge>;
|
|
10
|
+
export declare function ensureSloopBridge(filePath?: string): Promise<SloopBridge>;
|
|
10
11
|
//# sourceMappingURL=sloop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sloop.d.ts","sourceRoot":"","sources":["../../src/utils/sloop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sloop.d.ts","sourceRoot":"","sources":["../../src/utils/sloop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AASjD,eAAO,MAAM,YAAY,QAA2B,CAAC;AAErD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C/E"}
|
package/dist/utils/sloop.js
CHANGED
|
@@ -1,35 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SLOOP bridge initialization and management
|
|
3
3
|
*/
|
|
4
|
-
import { join, dirname } from
|
|
5
|
-
import { existsSync } from
|
|
6
|
-
import { fileURLToPath } from
|
|
7
|
-
import { SloopBridge } from
|
|
8
|
-
import { setSloopBridge, getSloopBridge } from
|
|
9
|
-
import { SloopError } from
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { SloopBridge } from '../sloop-bridge.js';
|
|
8
|
+
import { setSloopBridge, getSloopBridge } from '../state.js';
|
|
9
|
+
import { SloopError } from '../errors.js';
|
|
10
|
+
import { findProjectRoot } from './scope.js';
|
|
11
|
+
import { loadRuleConfig } from './config.js';
|
|
10
12
|
// Get package root directory (where sonarlint-backend is installed)
|
|
11
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
14
|
const __dirname = dirname(__filename);
|
|
13
15
|
export const PACKAGE_ROOT = join(__dirname, '../..'); // Go up from dist/utils/ to package root
|
|
14
16
|
/**
|
|
15
|
-
* Ensure SLOOP bridge is initialized
|
|
17
|
+
* Ensure SLOOP bridge is initialized.
|
|
18
|
+
* Pass a filePath so the bridge can load rule config from the project's sonarlint.json on first init.
|
|
16
19
|
*/
|
|
17
|
-
export async function ensureSloopBridge() {
|
|
20
|
+
export async function ensureSloopBridge(filePath) {
|
|
18
21
|
const existing = getSloopBridge();
|
|
19
22
|
if (existing) {
|
|
20
23
|
return existing;
|
|
21
24
|
}
|
|
22
25
|
const t0 = Date.now();
|
|
23
26
|
const elapsed = () => `${((Date.now() - t0) / 1000).toFixed(1)}s`;
|
|
24
|
-
console.error(
|
|
27
|
+
console.error('[MCP] Initializing SLOOP bridge...');
|
|
25
28
|
// Check if plugins are downloaded
|
|
26
|
-
const pluginsDir = join(PACKAGE_ROOT,
|
|
29
|
+
const pluginsDir = join(PACKAGE_ROOT, 'sonarlint-backend', 'plugins');
|
|
27
30
|
if (!existsSync(pluginsDir)) {
|
|
28
|
-
throw new SloopError(
|
|
31
|
+
throw new SloopError('Backend not found', 'SonarLint backend not installed. The postinstall script may have failed. Try reinstalling: npm install -g @nielspeter/sonarlint-mcp-server', false);
|
|
32
|
+
}
|
|
33
|
+
// Load rule config from project root if a file path is available
|
|
34
|
+
let standaloneRuleConfig;
|
|
35
|
+
if (filePath) {
|
|
36
|
+
const projectRoot = findProjectRoot(dirname(filePath));
|
|
37
|
+
standaloneRuleConfig = loadRuleConfig(projectRoot);
|
|
29
38
|
}
|
|
30
39
|
try {
|
|
31
40
|
console.error(`[MCP] +${elapsed()} Creating bridge...`);
|
|
32
|
-
const bridge = new SloopBridge(PACKAGE_ROOT);
|
|
41
|
+
const bridge = new SloopBridge(PACKAGE_ROOT, { standaloneRuleConfig });
|
|
33
42
|
console.error(`[MCP] +${elapsed()} Connecting (starts Java + sends initialize)...`);
|
|
34
43
|
await bridge.connect();
|
|
35
44
|
setSloopBridge(bridge);
|
|
@@ -37,7 +46,7 @@ export async function ensureSloopBridge() {
|
|
|
37
46
|
return bridge;
|
|
38
47
|
}
|
|
39
48
|
catch (error) {
|
|
40
|
-
throw new SloopError(`Failed to initialize SLOOP: ${error}`,
|
|
49
|
+
throw new SloopError(`Failed to initialize SLOOP: ${error}`, 'Failed to start SonarLint backend. Please check that Java is installed and try again.', true);
|
|
41
50
|
}
|
|
42
51
|
}
|
|
43
52
|
//# sourceMappingURL=sloop.js.map
|
package/dist/utils/sloop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sloop.js","sourceRoot":"","sources":["../../src/utils/sloop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"sloop.js","sourceRoot":"","sources":["../../src/utils/sloop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,oEAAoE;AACpE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,yCAAyC;AAE/F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAiB;IACvD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAElE,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEpD,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,mBAAmB,EACnB,4IAA4I,EAC5I,KAAK,CACN,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,IAAI,oBAAgH,CAAC;IACrH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,oBAAoB,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,iDAAiD,CAAC,CAAC;QACpF,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,wCAAwC,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAClB,+BAA+B,KAAK,EAAE,EACtC,uFAAuF,EACvF,IAAI,CACL,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,CAuCtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;EAqB1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAgB;IACnD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,+CAA+C;QAC/C,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,MAAM,WAAW,GAAkB;YACjC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC;YACxD,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,eAAe,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC;YAClE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC;YACxG,SAAS,
|
|
1
|
+
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nielspeter/sonarlint-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "MCP server providing SonarLint code analysis for Claude Desktop and other MCP clients",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -29,7 +29,12 @@
|
|
|
29
29
|
"release": "standard-version",
|
|
30
30
|
"release:minor": "standard-version --release-as minor",
|
|
31
31
|
"release:major": "standard-version --release-as major",
|
|
32
|
-
"release:patch": "standard-version --release-as patch"
|
|
32
|
+
"release:patch": "standard-version --release-as patch",
|
|
33
|
+
"lint": "eslint src/ tests/",
|
|
34
|
+
"lint:fix": "eslint src/ tests/ --fix",
|
|
35
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
36
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
37
|
+
"docs:rules": "node scripts/generate-rules-doc.mjs"
|
|
33
38
|
},
|
|
34
39
|
"bin": {
|
|
35
40
|
"sonarlint-mcp": "./dist/index.js",
|
|
@@ -61,12 +66,17 @@
|
|
|
61
66
|
"zod": "^3.25.76"
|
|
62
67
|
},
|
|
63
68
|
"devDependencies": {
|
|
69
|
+
"@eslint/js": "^10.0.1",
|
|
64
70
|
"@modelcontextprotocol/inspector": "^0.16.6",
|
|
65
71
|
"@types/node": "^20.10.0",
|
|
66
72
|
"@vitest/ui": "^4.0.8",
|
|
73
|
+
"eslint": "^10.1.0",
|
|
74
|
+
"eslint-config-prettier": "^10.1.8",
|
|
75
|
+
"prettier": "^3.8.1",
|
|
67
76
|
"standard-version": "^9.5.0",
|
|
68
77
|
"tsx": "^4.6.0",
|
|
69
78
|
"typescript": "^5.3.0",
|
|
79
|
+
"typescript-eslint": "^8.58.0",
|
|
70
80
|
"vitest": "^4.0.8"
|
|
71
81
|
}
|
|
72
82
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generates docs/configurable-rules.md from the SLOOP backend.
|
|
5
|
+
* Usage: npm run docs:rules
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { SloopBridge } from '../dist/sloop-bridge.js';
|
|
9
|
+
import { writeFileSync } from 'fs';
|
|
10
|
+
import { join, dirname } from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
|
|
13
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const OUTPUT = join(__dirname, '..', 'docs', 'configurable-rules.md');
|
|
15
|
+
|
|
16
|
+
const bridge = new SloopBridge();
|
|
17
|
+
await bridge.connect();
|
|
18
|
+
|
|
19
|
+
const result = await bridge.listAllStandaloneRulesDefinitions();
|
|
20
|
+
const rulesByKey = result.rulesByKey || {};
|
|
21
|
+
|
|
22
|
+
// Group configurable rules by language
|
|
23
|
+
const byLang = new Map();
|
|
24
|
+
for (const [key, rule] of Object.entries(rulesByKey)) {
|
|
25
|
+
if (!rule.paramsByKey || Object.keys(rule.paramsByKey).length === 0) continue;
|
|
26
|
+
const lang = rule.language || 'UNKNOWN';
|
|
27
|
+
if (!byLang.has(lang)) byLang.set(lang, []);
|
|
28
|
+
byLang.get(lang).push({ key, ...rule });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let total = 0;
|
|
32
|
+
const sortedLangs = [...byLang.keys()].sort();
|
|
33
|
+
|
|
34
|
+
let md = '# Configurable SonarLint Rules\n\n';
|
|
35
|
+
|
|
36
|
+
// Placeholder for total count (replaced below)
|
|
37
|
+
const totalPlaceholder = '{{TOTAL}}';
|
|
38
|
+
md += totalPlaceholder + '\n\n';
|
|
39
|
+
|
|
40
|
+
md += '> Auto-generated from SLOOP backend. Regenerate with `npm run docs:rules`.\n';
|
|
41
|
+
md += '>\n';
|
|
42
|
+
md += "> Configure these rules in your project's `sonarlint.json`:\n";
|
|
43
|
+
md += '>\n';
|
|
44
|
+
md += '> ```json\n';
|
|
45
|
+
md += '> {\n';
|
|
46
|
+
md += '> "rules": {\n';
|
|
47
|
+
md += '> "javascript:S3776": {\n';
|
|
48
|
+
md += '> "level": "on",\n';
|
|
49
|
+
md += '> "parameters": { "threshold": "20" }\n';
|
|
50
|
+
md += '> }\n';
|
|
51
|
+
md += '> }\n';
|
|
52
|
+
md += '> }\n';
|
|
53
|
+
md += '> ```\n\n';
|
|
54
|
+
|
|
55
|
+
for (const lang of sortedLangs) {
|
|
56
|
+
const rules = byLang.get(lang);
|
|
57
|
+
rules.sort((a, b) => a.key.localeCompare(b.key));
|
|
58
|
+
total += rules.length;
|
|
59
|
+
|
|
60
|
+
md += `## ${lang} (${rules.length} rules)\n\n`;
|
|
61
|
+
md += '| Rule | Name | Parameter | Default | Type |\n';
|
|
62
|
+
md += '|------|------|-----------|---------|------|\n';
|
|
63
|
+
|
|
64
|
+
for (const rule of rules) {
|
|
65
|
+
const params = Object.values(rule.paramsByKey);
|
|
66
|
+
for (let i = 0; i < params.length; i++) {
|
|
67
|
+
const p = params[i];
|
|
68
|
+
const ruleCol = i === 0 ? `\`${rule.key}\`` : '';
|
|
69
|
+
const nameCol = i === 0 ? rule.name : '';
|
|
70
|
+
const defVal = p.defaultValue === null ? '—' : `\`${p.defaultValue}\``;
|
|
71
|
+
md += `| ${ruleCol} | ${nameCol} | \`${p.key}\` | ${defVal} | ${p.type} |\n`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
md += '\n';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
md = md.replace(
|
|
78
|
+
totalPlaceholder,
|
|
79
|
+
`**${total} configurable rules** across ${sortedLangs.length} languages.`,
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
writeFileSync(OUTPUT, md);
|
|
83
|
+
console.log(`Wrote ${total} configurable rules to ${OUTPUT}`);
|
|
84
|
+
|
|
85
|
+
await bridge.disconnect();
|
|
86
|
+
process.exit(0);
|