@jonathan0823/pi-sonarqube 0.1.3 → 0.2.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/README.md +25 -3
- package/dist/api.d.ts +39 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +443 -0
- package/dist/api.js.map +1 -0
- package/dist/commands.d.ts +69 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +248 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +275 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -54
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +315 -975
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +40 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +234 -0
- package/dist/ui.js.map +1 -0
- package/package.json +1 -1
- package/src/api.ts +587 -0
- package/src/commands.ts +314 -0
- package/src/config.ts +336 -0
- package/src/index.ts +477 -1262
- package/src/types.ts +112 -0
- package/src/ui.ts +320 -0
package/README.md
CHANGED
|
@@ -62,7 +62,7 @@ Pi will:
|
|
|
62
62
|
1. Run `sonar-scanner` against your server
|
|
63
63
|
2. Wait for the analysis to complete
|
|
64
64
|
3. Fetch the latest issues
|
|
65
|
-
4. Return a concise summary
|
|
65
|
+
4. Return a concise summary with issues and duplication metrics
|
|
66
66
|
|
|
67
67
|
### 3. Browse issues
|
|
68
68
|
|
|
@@ -75,7 +75,25 @@ Use **Up/Down** to move, **Enter** to preview the affected source code, and **Es
|
|
|
75
75
|
|
|
76
76
|
Tip: Tab-complete `/sonarqube` subcommands and filters in the editor.
|
|
77
77
|
|
|
78
|
-
### 4.
|
|
78
|
+
### 4. View project metrics
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
/sonarqube metrics
|
|
82
|
+
/sonarqube metrics apps/web
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Shows duplication percentage, block/line/file counts, and issue severity breakdown — no scanner needed.
|
|
86
|
+
|
|
87
|
+
### 5. Browse duplicated files
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
/sonarqube duplications
|
|
91
|
+
/sonarqube duplications apps/web
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Use **Up/Down** to move, **Enter** for block locations and line ranges. Pass a file number directly to skip the browser: `/sonarqube duplications 1`.
|
|
95
|
+
|
|
96
|
+
### 6. Open a specific issue
|
|
79
97
|
|
|
80
98
|
```
|
|
81
99
|
/sonarqube open 3
|
|
@@ -87,8 +105,10 @@ Tip: Tab-complete `/sonarqube` subcommands and filters in the editor.
|
|
|
87
105
|
| Command | Description |
|
|
88
106
|
| -------------------------------- | ----------------------------------------------- |
|
|
89
107
|
| `/sonarqube init [path]` | Set up project config for a path |
|
|
90
|
-
| `/sonarqube analyze [target]` | Run analysis
|
|
108
|
+
| `/sonarqube analyze [target]` | Run analysis and show issues + duplication metrics |
|
|
91
109
|
| `/sonarqube issues [target]` | Browse the latest analysis results for a target |
|
|
110
|
+
| `/sonarqube metrics [target]` | Show project metrics (duplication %, issue counts, no scanner) |
|
|
111
|
+
| `/sonarqube duplications [target]` | Browse duplicated files and blocks with drill-down |
|
|
92
112
|
| `/sonarqube open [target] <n>` | Preview source at issue #n |
|
|
93
113
|
|
|
94
114
|
## Tool (for the LLM)
|
|
@@ -97,6 +117,8 @@ The extension also registers a `sonarqube` tool that the LLM can call with actio
|
|
|
97
117
|
|
|
98
118
|
- `analyze` — run analysis
|
|
99
119
|
- `issues` — list issues
|
|
120
|
+
- `metrics` — show project-level duplication & issue counts
|
|
121
|
+
- `duplications` — list duplicated files and block details
|
|
100
122
|
- `open` — open an issue with its index
|
|
101
123
|
|
|
102
124
|
The tool accepts optional issue filters (`severities`, `statuses`, `types`, `rules`) so the agent can fetch just blocker/critical context.
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { SonarIssue, SonarAnalysisState, SonarProjectConfig, SonarIssueFetchOptions, SonarDuplicationMeasures, IssueSeverityCounts, FileDuplication, DuplicationBlockGroup } from "./types.js";
|
|
3
|
+
export declare function authHeader(token?: string): string | undefined;
|
|
4
|
+
export declare function fetchJson<T>(url: string, token?: string, signal?: AbortSignal): Promise<T>;
|
|
5
|
+
export declare function toIssuePath(component: string, projectKey: string): string;
|
|
6
|
+
export declare function normalizeIssueList(values?: string[], uppercase?: boolean): string[] | undefined;
|
|
7
|
+
export declare function normalizeIssueFilters(filters?: SonarIssueFetchOptions): SonarIssueFetchOptions | undefined;
|
|
8
|
+
export declare function parseIssueFilterToken(token: string): Partial<SonarIssueFetchOptions> | undefined;
|
|
9
|
+
export declare function parseSonarIssueArgs(tokens: string[], allowIssueIndex?: boolean): {
|
|
10
|
+
targetInput?: string;
|
|
11
|
+
issueIndex?: number;
|
|
12
|
+
filters?: SonarIssueFetchOptions;
|
|
13
|
+
};
|
|
14
|
+
export declare function issueFilterLabel(filters?: SonarIssueFetchOptions): string;
|
|
15
|
+
export declare function sonarScannerInstallHint(): string;
|
|
16
|
+
export declare function extractScannerHint(output: string, config: SonarProjectConfig, exitCode?: number): string;
|
|
17
|
+
export declare function runScanner(pi: ExtensionAPI, config: SonarProjectConfig, signal?: AbortSignal): Promise<string>;
|
|
18
|
+
export declare function readReportTask(baseDir: string): Promise<Record<string, string>>;
|
|
19
|
+
export declare function waitForAnalysis(serverUrl: string, token: string | undefined, ceTaskUrl: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
20
|
+
export declare function fetchIssuePage(serverUrl: string, token: string | undefined, projectKey: string, page: number, signal?: AbortSignal, filters?: SonarIssueFetchOptions): Promise<{
|
|
21
|
+
total: number;
|
|
22
|
+
issueRows: Array<{
|
|
23
|
+
key: string;
|
|
24
|
+
rule: string;
|
|
25
|
+
severity: string;
|
|
26
|
+
message: string;
|
|
27
|
+
component: string;
|
|
28
|
+
line?: number;
|
|
29
|
+
status?: string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function fetchIssues(serverUrl: string, token: string | undefined, projectKey: string, signal?: AbortSignal, filters?: SonarIssueFetchOptions): Promise<SonarIssue[]>;
|
|
33
|
+
export declare function fetchRuleName(serverUrl: string, token: string | undefined, ruleKey: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
34
|
+
export declare function createAnalysisState(config: Pick<SonarProjectConfig, "baseDir" | "serverUrl" | "projectKey">, issues: SonarIssue[], extras?: Partial<Pick<SonarAnalysisState, "dashboardUrl" | "ceTaskUrl" | "analysisId" | "filters" | "measures">>): SonarAnalysisState;
|
|
35
|
+
export declare function fetchDuplicationMeasures(serverUrl: string, token: string | undefined, projectKey: string, signal?: AbortSignal): Promise<SonarDuplicationMeasures | undefined>;
|
|
36
|
+
export declare function fetchIssueSeverityCounts(serverUrl: string, token: string | undefined, projectKey: string, signal?: AbortSignal): Promise<IssueSeverityCounts | undefined>;
|
|
37
|
+
export declare function fetchFileDuplications(serverUrl: string, token: string | undefined, projectKey: string, signal?: AbortSignal): Promise<FileDuplication[]>;
|
|
38
|
+
export declare function fetchFileDuplicationBlocks(serverUrl: string, token: string | undefined, fileKey: string, projectKey: string, signal?: AbortSignal): Promise<DuplicationBlockGroup[]>;
|
|
39
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { SONAR_SEVERITIES, SONAR_STATUSES, SONAR_TYPES } from "./types.js";
|
|
4
|
+
import { parseProperties } from "./config.js";
|
|
5
|
+
// ── Auth / HTTP helpers ─────────────────────────────────────────────────────
|
|
6
|
+
export function authHeader(token) {
|
|
7
|
+
if (!token)
|
|
8
|
+
return undefined;
|
|
9
|
+
const credentials = `${token}:`;
|
|
10
|
+
return `Basic ${Buffer.from(credentials).toString("base64")}`;
|
|
11
|
+
}
|
|
12
|
+
export async function fetchJson(url, token, signal) {
|
|
13
|
+
const headers = { Accept: "application/json" };
|
|
14
|
+
const auth = authHeader(token);
|
|
15
|
+
if (auth)
|
|
16
|
+
headers.Authorization = auth;
|
|
17
|
+
const response = await fetch(url, { headers, signal });
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
const body = await response.text().catch(() => "");
|
|
20
|
+
const suffix = body.trim() ? `: ${body.trim().slice(0, 240)}` : "";
|
|
21
|
+
throw new Error(`SonarQube API request failed (${response.status} ${response.statusText}) for ${url}${suffix}`);
|
|
22
|
+
}
|
|
23
|
+
return (await response.json());
|
|
24
|
+
}
|
|
25
|
+
export function toIssuePath(component, projectKey) {
|
|
26
|
+
const prefix = `${projectKey}:`;
|
|
27
|
+
if (component.startsWith(prefix))
|
|
28
|
+
return component.slice(prefix.length);
|
|
29
|
+
const colon = component.indexOf(":");
|
|
30
|
+
return colon >= 0 ? component.slice(colon + 1) : component;
|
|
31
|
+
}
|
|
32
|
+
// ── Issue filter helpers ────────────────────────────────────────────────────
|
|
33
|
+
export function normalizeIssueList(values, uppercase = false) {
|
|
34
|
+
const cleaned = values
|
|
35
|
+
?.map((v) => v.trim())
|
|
36
|
+
.filter(Boolean)
|
|
37
|
+
.map((v) => (uppercase ? v.toUpperCase() : v));
|
|
38
|
+
if (!cleaned?.length)
|
|
39
|
+
return undefined;
|
|
40
|
+
return [...new Set(cleaned)];
|
|
41
|
+
}
|
|
42
|
+
export function normalizeIssueFilters(filters) {
|
|
43
|
+
const normalized = {
|
|
44
|
+
severities: normalizeIssueList(filters?.severities, true),
|
|
45
|
+
statuses: normalizeIssueList(filters?.statuses, true),
|
|
46
|
+
types: normalizeIssueList(filters?.types, true),
|
|
47
|
+
rules: normalizeIssueList(filters?.rules),
|
|
48
|
+
};
|
|
49
|
+
return normalized.severities || normalized.statuses || normalized.types || normalized.rules ? normalized : undefined;
|
|
50
|
+
}
|
|
51
|
+
const EXPLICIT_FILTER_RE = /^([^:=]+)[:=](.+)$/;
|
|
52
|
+
export function parseIssueFilterToken(token) {
|
|
53
|
+
const trimmed = token.trim();
|
|
54
|
+
if (!trimmed)
|
|
55
|
+
return undefined;
|
|
56
|
+
const explicit = EXPLICIT_FILTER_RE.exec(trimmed);
|
|
57
|
+
if (explicit) {
|
|
58
|
+
const key = explicit[1].trim().toLowerCase();
|
|
59
|
+
const values = explicit[2].split(",").map((p) => p.trim()).filter(Boolean);
|
|
60
|
+
if (values.length === 0)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (key === "severity" || key === "severities")
|
|
63
|
+
return { severities: values.map((v) => v.toUpperCase()) };
|
|
64
|
+
if (key === "status" || key === "statuses")
|
|
65
|
+
return { statuses: values.map((v) => v.toUpperCase()) };
|
|
66
|
+
if (key === "type" || key === "types")
|
|
67
|
+
return { types: values.map((v) => v.toUpperCase()) };
|
|
68
|
+
if (key === "rule" || key === "rules")
|
|
69
|
+
return { rules: values };
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const upper = trimmed.toUpperCase();
|
|
73
|
+
if (SONAR_SEVERITIES.includes(upper))
|
|
74
|
+
return { severities: [upper] };
|
|
75
|
+
if (SONAR_STATUSES.includes(upper))
|
|
76
|
+
return { statuses: [upper] };
|
|
77
|
+
if (SONAR_TYPES.includes(upper))
|
|
78
|
+
return { types: [upper] };
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
export function parseSonarIssueArgs(tokens, allowIssueIndex = false) {
|
|
82
|
+
const filters = [];
|
|
83
|
+
let targetInput;
|
|
84
|
+
let issueIndex;
|
|
85
|
+
for (const token of tokens) {
|
|
86
|
+
if (!token)
|
|
87
|
+
continue;
|
|
88
|
+
if (allowIssueIndex && issueIndex === undefined && /^\d+$/.test(token)) {
|
|
89
|
+
issueIndex = Number(token);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const parsedFilter = parseIssueFilterToken(token);
|
|
93
|
+
if (parsedFilter) {
|
|
94
|
+
filters.push(parsedFilter);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!targetInput) {
|
|
98
|
+
targetInput = token;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { targetInput, issueIndex, filters: mergeFilters(...filters) };
|
|
102
|
+
}
|
|
103
|
+
function mergeFilters(...filters) {
|
|
104
|
+
const merged = {};
|
|
105
|
+
for (const filter of filters) {
|
|
106
|
+
if (!filter)
|
|
107
|
+
continue;
|
|
108
|
+
if (filter.severities?.length)
|
|
109
|
+
merged.severities = [...(merged.severities ?? []), ...filter.severities];
|
|
110
|
+
if (filter.statuses?.length)
|
|
111
|
+
merged.statuses = [...(merged.statuses ?? []), ...filter.statuses];
|
|
112
|
+
if (filter.types?.length)
|
|
113
|
+
merged.types = [...(merged.types ?? []), ...filter.types];
|
|
114
|
+
if (filter.rules?.length)
|
|
115
|
+
merged.rules = [...(merged.rules ?? []), ...filter.rules];
|
|
116
|
+
}
|
|
117
|
+
return normalizeIssueFilters(merged);
|
|
118
|
+
}
|
|
119
|
+
export function issueFilterLabel(filters) {
|
|
120
|
+
if (!filters)
|
|
121
|
+
return "";
|
|
122
|
+
const parts = [
|
|
123
|
+
filters.severities?.length ? `severities=${filters.severities.join(",")}` : "",
|
|
124
|
+
filters.statuses?.length ? `statuses=${filters.statuses.join(",")}` : "",
|
|
125
|
+
filters.types?.length ? `types=${filters.types.join(",")}` : "",
|
|
126
|
+
filters.rules?.length ? `rules=${filters.rules.join(",")}` : "",
|
|
127
|
+
].filter(Boolean);
|
|
128
|
+
return parts.join(" • ");
|
|
129
|
+
}
|
|
130
|
+
function severitySortRank(severity) {
|
|
131
|
+
switch (severity.toUpperCase()) {
|
|
132
|
+
case "BLOCKER":
|
|
133
|
+
return 0;
|
|
134
|
+
case "CRITICAL":
|
|
135
|
+
return 1;
|
|
136
|
+
case "MAJOR":
|
|
137
|
+
return 2;
|
|
138
|
+
case "MINOR":
|
|
139
|
+
return 3;
|
|
140
|
+
case "INFO":
|
|
141
|
+
return 4;
|
|
142
|
+
default:
|
|
143
|
+
return 5;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function compareIssuesForContext(left, right) {
|
|
147
|
+
const severityDiff = severitySortRank(left.severity) - severitySortRank(right.severity);
|
|
148
|
+
if (severityDiff !== 0)
|
|
149
|
+
return severityDiff;
|
|
150
|
+
const fileDiff = left.filePath.localeCompare(right.filePath);
|
|
151
|
+
if (fileDiff !== 0)
|
|
152
|
+
return fileDiff;
|
|
153
|
+
const leftLine = left.line ?? Number.POSITIVE_INFINITY;
|
|
154
|
+
const rightLine = right.line ?? Number.POSITIVE_INFINITY;
|
|
155
|
+
if (leftLine !== rightLine)
|
|
156
|
+
return leftLine - rightLine;
|
|
157
|
+
return left.message.localeCompare(right.message);
|
|
158
|
+
}
|
|
159
|
+
// ── Error hints ─────────────────────────────────────────────────────────────
|
|
160
|
+
export function sonarScannerInstallHint() {
|
|
161
|
+
return [
|
|
162
|
+
"SonarScanner is not installed or not on PATH.",
|
|
163
|
+
"Please install SonarScanner and make sure `sonar-scanner` is available, then retry.",
|
|
164
|
+
].join(" ");
|
|
165
|
+
}
|
|
166
|
+
export function extractScannerHint(output, config, exitCode) {
|
|
167
|
+
const lines = output.toLowerCase();
|
|
168
|
+
const isNotFoundOnPath = exitCode === 127 ||
|
|
169
|
+
/spawn .*enoent|enoent|command not found|is not recognized/i.test(lines);
|
|
170
|
+
if (isNotFoundOnPath) {
|
|
171
|
+
return sonarScannerInstallHint();
|
|
172
|
+
}
|
|
173
|
+
const isUnauthorized = /status code 401|status 401|unauthorized/i.test(lines);
|
|
174
|
+
if (isUnauthorized) {
|
|
175
|
+
const defaultHint = config.serverUrl === "http://localhost:9000" ? " (default: http://localhost:9000)" : "";
|
|
176
|
+
return [
|
|
177
|
+
`Authentication failed for ${config.serverUrl}${defaultHint}.`,
|
|
178
|
+
"Run `/sonarqube init` to set up your server URL and token, then retry.",
|
|
179
|
+
"Or set SONARQUBE_TOKEN in your environment.",
|
|
180
|
+
].join(" ");
|
|
181
|
+
}
|
|
182
|
+
const isForbidden = /status code 403|status 403|forbidden/i.test(lines);
|
|
183
|
+
if (isForbidden) {
|
|
184
|
+
return [
|
|
185
|
+
`Access denied by ${config.serverUrl}.`,
|
|
186
|
+
'Your token may not have the required permissions ("Execute Analysis").',
|
|
187
|
+
"Run `/sonarqube init` to update the token or check server permissions.",
|
|
188
|
+
].join(" ");
|
|
189
|
+
}
|
|
190
|
+
const isConnectionError = /connect econnrefused|connect refused|connect timeout|enotfound|econnreset/i.test(lines);
|
|
191
|
+
if (isConnectionError) {
|
|
192
|
+
return [
|
|
193
|
+
`Cannot reach SonarQube server at ${config.serverUrl}.`,
|
|
194
|
+
"Is the server running? Run `/sonarqube init` to check the server URL.",
|
|
195
|
+
"Default: http://localhost:9000",
|
|
196
|
+
].join(" ");
|
|
197
|
+
}
|
|
198
|
+
if (/not found|unknown url/i.test(lines) && (config.serverUrl === "http://localhost:9000" || /localhost/i.test(config.serverUrl))) {
|
|
199
|
+
return [
|
|
200
|
+
`SonarQube API at ${config.serverUrl} returned "not found".`,
|
|
201
|
+
"The default server URL is http://localhost:9000. Run `/sonarqube init` to configure.",
|
|
202
|
+
].join(" ");
|
|
203
|
+
}
|
|
204
|
+
return "";
|
|
205
|
+
}
|
|
206
|
+
// ── Scanner interaction ─────────────────────────────────────────────────────
|
|
207
|
+
export async function runScanner(pi, config, signal) {
|
|
208
|
+
const scannerCheck = process.platform === "win32"
|
|
209
|
+
? await pi.exec("cmd", ["/d", "/s", "/c", "where", "sonar-scanner"], {
|
|
210
|
+
cwd: config.baseDir,
|
|
211
|
+
signal,
|
|
212
|
+
timeout: 10_000,
|
|
213
|
+
})
|
|
214
|
+
: await pi.exec("sh", ["-lc", "command -v sonar-scanner"], {
|
|
215
|
+
cwd: config.baseDir,
|
|
216
|
+
signal,
|
|
217
|
+
timeout: 10_000,
|
|
218
|
+
});
|
|
219
|
+
if (scannerCheck.code !== 0 || !scannerCheck.stdout.trim()) {
|
|
220
|
+
throw new Error(sonarScannerInstallHint());
|
|
221
|
+
}
|
|
222
|
+
const args = [
|
|
223
|
+
`-Dsonar.projectKey=${config.projectKey}`,
|
|
224
|
+
`-Dsonar.projectBaseDir=${config.baseDir}`,
|
|
225
|
+
`-Dsonar.host.url=${config.serverUrl}`,
|
|
226
|
+
...(config.hasProperties ? [] : [`-Dsonar.sources=.`]),
|
|
227
|
+
`-Dsonar.scm.disabled=true`,
|
|
228
|
+
];
|
|
229
|
+
if (config.token) {
|
|
230
|
+
args.push(`-Dsonar.token=${config.token}`);
|
|
231
|
+
}
|
|
232
|
+
const result = await pi.exec("sonar-scanner", args, {
|
|
233
|
+
cwd: config.baseDir,
|
|
234
|
+
signal,
|
|
235
|
+
timeout: 30 * 60 * 1000,
|
|
236
|
+
});
|
|
237
|
+
if (result.code !== 0) {
|
|
238
|
+
const output = [result.stdout, result.stderr]
|
|
239
|
+
.filter(Boolean)
|
|
240
|
+
.join("\n")
|
|
241
|
+
.trim();
|
|
242
|
+
const hint = extractScannerHint(output, config, result.code);
|
|
243
|
+
const detail = output ? `\n\n${output.slice(-4000)}` : "";
|
|
244
|
+
const message = hint
|
|
245
|
+
? `SonarQube scan failed for ${config.projectKey}. ${hint}`
|
|
246
|
+
: `SonarQube scan failed for ${config.projectKey}${detail}`;
|
|
247
|
+
throw new Error(message);
|
|
248
|
+
}
|
|
249
|
+
return result.stdout || result.stderr;
|
|
250
|
+
}
|
|
251
|
+
export async function readReportTask(baseDir) {
|
|
252
|
+
const path = resolve(baseDir, ".scannerwork", "report-task.txt");
|
|
253
|
+
const text = await readFile(path, "utf8");
|
|
254
|
+
return parseProperties(text);
|
|
255
|
+
}
|
|
256
|
+
export async function waitForAnalysis(serverUrl, token, ceTaskUrl, signal) {
|
|
257
|
+
for (let attempt = 0; attempt < 120; attempt++) {
|
|
258
|
+
const result = await fetchJson(ceTaskUrl, token, signal);
|
|
259
|
+
const status = result.task.status.toUpperCase();
|
|
260
|
+
if (status === "SUCCESS")
|
|
261
|
+
return result.task.analysisId;
|
|
262
|
+
if (status === "FAILED") {
|
|
263
|
+
throw new Error(`SonarQube analysis failed: ${result.task.errorMessage || "unknown error"}`);
|
|
264
|
+
}
|
|
265
|
+
if (status === "CANCELED") {
|
|
266
|
+
throw new Error("SonarQube analysis was canceled by the server");
|
|
267
|
+
}
|
|
268
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
269
|
+
}
|
|
270
|
+
throw new Error(`Timed out waiting for SonarQube analysis at ${serverUrl}`);
|
|
271
|
+
}
|
|
272
|
+
// ── Issue fetching ──────────────────────────────────────────────────────────
|
|
273
|
+
function buildIssueSearchUrl(serverUrl, projectKey, page, filters) {
|
|
274
|
+
const url = new URL("/api/issues/search", serverUrl);
|
|
275
|
+
url.searchParams.set("projects", projectKey);
|
|
276
|
+
url.searchParams.set("resolved", "false");
|
|
277
|
+
url.searchParams.set("ps", "100");
|
|
278
|
+
url.searchParams.set("p", String(page));
|
|
279
|
+
if (filters?.severities?.length)
|
|
280
|
+
url.searchParams.set("severities", filters.severities.join(","));
|
|
281
|
+
if (filters?.statuses?.length)
|
|
282
|
+
url.searchParams.set("statuses", filters.statuses.join(","));
|
|
283
|
+
if (filters?.types?.length)
|
|
284
|
+
url.searchParams.set("types", filters.types.join(","));
|
|
285
|
+
if (filters?.rules?.length)
|
|
286
|
+
url.searchParams.set("rules", filters.rules.join(","));
|
|
287
|
+
return url.toString();
|
|
288
|
+
}
|
|
289
|
+
function mapRawIssue(raw, projectKey, ruleNames) {
|
|
290
|
+
return {
|
|
291
|
+
key: raw.key,
|
|
292
|
+
rule: raw.rule,
|
|
293
|
+
ruleName: ruleNames.get(raw.rule),
|
|
294
|
+
severity: raw.severity,
|
|
295
|
+
message: raw.message,
|
|
296
|
+
filePath: toIssuePath(raw.component, projectKey),
|
|
297
|
+
line: typeof raw.line === "number" ? raw.line : null,
|
|
298
|
+
status: raw.status,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
export async function fetchIssuePage(serverUrl, token, projectKey, page, signal, filters) {
|
|
302
|
+
const url = buildIssueSearchUrl(serverUrl, projectKey, page, filters);
|
|
303
|
+
const result = await fetchJson(url, token, signal);
|
|
304
|
+
return { total: result.total, issueRows: result.issues };
|
|
305
|
+
}
|
|
306
|
+
export async function fetchIssues(serverUrl, token, projectKey, signal, filters) {
|
|
307
|
+
const normalizedFilters = normalizeIssueFilters(filters);
|
|
308
|
+
const issues = [];
|
|
309
|
+
const ruleNames = new Map();
|
|
310
|
+
let page = 1;
|
|
311
|
+
let total = 0;
|
|
312
|
+
for (;;) {
|
|
313
|
+
const { total: pageTotal, issueRows } = await fetchIssuePage(serverUrl, token, projectKey, page, signal, normalizedFilters);
|
|
314
|
+
total = pageTotal;
|
|
315
|
+
for (const raw of issueRows) {
|
|
316
|
+
if (!ruleNames.has(raw.rule)) {
|
|
317
|
+
ruleNames.set(raw.rule, await fetchRuleName(serverUrl, token, raw.rule, signal));
|
|
318
|
+
}
|
|
319
|
+
issues.push(mapRawIssue(raw, projectKey, ruleNames));
|
|
320
|
+
}
|
|
321
|
+
if (issues.length >= total || issueRows.length === 0)
|
|
322
|
+
break;
|
|
323
|
+
page += 1;
|
|
324
|
+
}
|
|
325
|
+
if (normalizedFilters && issues.length > 1) {
|
|
326
|
+
issues.sort(compareIssuesForContext);
|
|
327
|
+
}
|
|
328
|
+
return issues;
|
|
329
|
+
}
|
|
330
|
+
export async function fetchRuleName(serverUrl, token, ruleKey, signal) {
|
|
331
|
+
try {
|
|
332
|
+
const result = await fetchJson(`${serverUrl}/api/rules/show?key=${encodeURIComponent(ruleKey)}`, token, signal);
|
|
333
|
+
return result.rule.name;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// ── Analysis state ──────────────────────────────────────────────────────────
|
|
340
|
+
export function createAnalysisState(config, issues, extras = {}) {
|
|
341
|
+
return {
|
|
342
|
+
version: 1,
|
|
343
|
+
analyzedAt: new Date().toISOString(),
|
|
344
|
+
baseDir: config.baseDir,
|
|
345
|
+
serverUrl: config.serverUrl,
|
|
346
|
+
projectKey: config.projectKey,
|
|
347
|
+
dashboardUrl: extras.dashboardUrl,
|
|
348
|
+
ceTaskUrl: extras.ceTaskUrl,
|
|
349
|
+
analysisId: extras.analysisId,
|
|
350
|
+
filters: extras.filters,
|
|
351
|
+
totalIssues: issues.length,
|
|
352
|
+
measures: extras.measures,
|
|
353
|
+
issues,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
// ── Measures ──────────────────────────────────────────────────────────────────
|
|
357
|
+
export async function fetchDuplicationMeasures(serverUrl, token, projectKey, signal) {
|
|
358
|
+
try {
|
|
359
|
+
const url = `${serverUrl}/api/measures/component?component=${encodeURIComponent(projectKey)}&metricKeys=duplicated_lines_density,duplicated_lines,duplicated_blocks,duplicated_files`;
|
|
360
|
+
const result = await fetchJson(url, token, signal);
|
|
361
|
+
const measures = result.component.measures;
|
|
362
|
+
const getValue = (key) => {
|
|
363
|
+
const m = measures.find((m) => m.metric === key);
|
|
364
|
+
return m ? Number.parseFloat(m.value) : 0;
|
|
365
|
+
};
|
|
366
|
+
return {
|
|
367
|
+
duplicatedLinesDensity: getValue("duplicated_lines_density"),
|
|
368
|
+
duplicatedLines: getValue("duplicated_lines"),
|
|
369
|
+
duplicatedBlocks: getValue("duplicated_blocks"),
|
|
370
|
+
duplicatedFiles: getValue("duplicated_files"),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
return undefined;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
export async function fetchIssueSeverityCounts(serverUrl, token, projectKey, signal) {
|
|
378
|
+
try {
|
|
379
|
+
const url = `${serverUrl}/api/issues/search?projects=${encodeURIComponent(projectKey)}&resolved=false&ps=1&facets=severities`;
|
|
380
|
+
const result = await fetchJson(url, token, signal);
|
|
381
|
+
const facet = result.facets?.find((f) => f.property === "severities");
|
|
382
|
+
if (!facet)
|
|
383
|
+
return undefined;
|
|
384
|
+
const getCount = (severity) => {
|
|
385
|
+
const entry = facet.values.find((v) => v.val === severity);
|
|
386
|
+
return entry?.count ?? 0;
|
|
387
|
+
};
|
|
388
|
+
return {
|
|
389
|
+
blocker: getCount("BLOCKER"),
|
|
390
|
+
critical: getCount("CRITICAL"),
|
|
391
|
+
major: getCount("MAJOR"),
|
|
392
|
+
minor: getCount("MINOR"),
|
|
393
|
+
info: getCount("INFO"),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// ── File duplications ─────────────────────────────────────────────────────────
|
|
401
|
+
export async function fetchFileDuplications(serverUrl, token, projectKey, signal) {
|
|
402
|
+
// Get file keys from issues search facets
|
|
403
|
+
const facetUrl = `${serverUrl}/api/issues/search?projects=${encodeURIComponent(projectKey)}&ps=1&facets=files`;
|
|
404
|
+
const facetResult = await fetchJson(facetUrl, token, signal);
|
|
405
|
+
const fileFacet = facetResult.facets?.find((f) => f.property === "files");
|
|
406
|
+
if (!fileFacet?.values?.length)
|
|
407
|
+
return [];
|
|
408
|
+
// Query per-file duplication measures. CATCH errors per file (404/403 = inaccessible)
|
|
409
|
+
const results = await Promise.all(fileFacet.values.map(async (entry) => {
|
|
410
|
+
try {
|
|
411
|
+
const fileKey = `${projectKey}:${entry.val}`;
|
|
412
|
+
const url = `${serverUrl}/api/measures/component?component=${encodeURIComponent(fileKey)}&metricKeys=duplicated_lines,duplicated_blocks`;
|
|
413
|
+
const res = await fetchJson(url, token, signal);
|
|
414
|
+
const measures = res.component.measures ?? [];
|
|
415
|
+
const getValue = (metric) => {
|
|
416
|
+
const m = measures.find((m) => m.metric === metric);
|
|
417
|
+
return m ? Number.parseInt(m.value, 10) : 0;
|
|
418
|
+
};
|
|
419
|
+
return {
|
|
420
|
+
filePath: entry.val,
|
|
421
|
+
fileKey: `${projectKey}:${entry.val}`,
|
|
422
|
+
duplicatedLines: getValue("duplicated_lines"),
|
|
423
|
+
duplicatedBlocks: getValue("duplicated_blocks"),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
}));
|
|
430
|
+
return results.filter((f) => f !== null && f.duplicatedBlocks > 0);
|
|
431
|
+
}
|
|
432
|
+
export async function fetchFileDuplicationBlocks(serverUrl, token, fileKey, projectKey, signal) {
|
|
433
|
+
const url = `${serverUrl}/api/duplications/show?key=${encodeURIComponent(fileKey)}`;
|
|
434
|
+
const result = await fetchJson(url, token, signal);
|
|
435
|
+
return result.duplications.map((d) => ({
|
|
436
|
+
blocks: d.blocks.map((b) => ({
|
|
437
|
+
from: b.from,
|
|
438
|
+
size: b.size,
|
|
439
|
+
filePath: toIssuePath(b.component, projectKey),
|
|
440
|
+
})),
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { AutocompleteItem, AutocompleteSuggestions } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { SonarIssue, SonarIssueFetchOptions, SonarDuplicationMeasures, IssueSeverityCounts, FileDuplication, DuplicationBlockGroup } from "./types.js";
|
|
3
|
+
export declare const STATE_TYPE = "sonarqube-analysis-state";
|
|
4
|
+
export declare function filterAutocompleteItems(items: readonly {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
}[], prefix: string): AutocompleteItem[];
|
|
9
|
+
export declare function mergeAutocompleteSuggestions(prefix: string, current: AutocompleteSuggestions | null, extraItems: AutocompleteItem[]): AutocompleteSuggestions | null;
|
|
10
|
+
export declare function splitSonarArgumentContext(argumentText: string): {
|
|
11
|
+
command: string;
|
|
12
|
+
current: string;
|
|
13
|
+
tokens: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function sonarArgumentCompletions(argumentText: string, issues?: SonarIssue[]): AutocompleteItem[] | null;
|
|
16
|
+
export type ParsedSonarCommand = {
|
|
17
|
+
action: "help";
|
|
18
|
+
} | {
|
|
19
|
+
action: "init";
|
|
20
|
+
alias?: string;
|
|
21
|
+
targetInput?: string;
|
|
22
|
+
} | {
|
|
23
|
+
action: "analyze";
|
|
24
|
+
targetInput?: string;
|
|
25
|
+
filters?: SonarIssueFetchOptions;
|
|
26
|
+
} | {
|
|
27
|
+
action: "issues";
|
|
28
|
+
targetInput?: string;
|
|
29
|
+
filters?: SonarIssueFetchOptions;
|
|
30
|
+
} | {
|
|
31
|
+
action: "open";
|
|
32
|
+
targetInput?: string;
|
|
33
|
+
issueIndex?: number;
|
|
34
|
+
filters?: SonarIssueFetchOptions;
|
|
35
|
+
} | {
|
|
36
|
+
action: "metrics";
|
|
37
|
+
targetInput?: string;
|
|
38
|
+
} | {
|
|
39
|
+
action: "duplications";
|
|
40
|
+
targetInput?: string;
|
|
41
|
+
issueIndex?: number;
|
|
42
|
+
};
|
|
43
|
+
export declare function parseCommandArgs(args: string): ParsedSonarCommand;
|
|
44
|
+
export declare function helpText(): string;
|
|
45
|
+
export declare function targetLabel(targetInput?: string): string;
|
|
46
|
+
export declare function sonarErrorMessage(error: unknown): string;
|
|
47
|
+
export declare function formatIssue(issue: SonarIssue, index?: number): string;
|
|
48
|
+
export declare function formatMetricsOutput(metrics: {
|
|
49
|
+
projectKey: string;
|
|
50
|
+
measures?: SonarDuplicationMeasures;
|
|
51
|
+
issueCounts?: IssueSeverityCounts;
|
|
52
|
+
}): string;
|
|
53
|
+
export declare function formatDuplicationsList(files: FileDuplication[]): string;
|
|
54
|
+
export declare function formatDuplicationBlockDetail(filePath: string, groups: DuplicationBlockGroup[]): string;
|
|
55
|
+
export declare function formatSummary(state: {
|
|
56
|
+
totalIssues: number;
|
|
57
|
+
projectKey: string;
|
|
58
|
+
filters?: SonarIssueFetchOptions;
|
|
59
|
+
}): string;
|
|
60
|
+
export declare function formatReport(state: {
|
|
61
|
+
projectKey: string;
|
|
62
|
+
serverUrl: string;
|
|
63
|
+
baseDir: string;
|
|
64
|
+
totalIssues: number;
|
|
65
|
+
filters?: SonarIssueFetchOptions;
|
|
66
|
+
measures?: SonarDuplicationMeasures;
|
|
67
|
+
issues: SonarIssue[];
|
|
68
|
+
}): string;
|
|
69
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|