@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 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. Open a specific issue
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 for a target or path |
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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGpE,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7D;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAahG;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAKzE;AAID,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,UAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAO7F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,sBAAsB,GAAG,SAAS,CAQ1G;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,GAAG,SAAS,CAsBhG;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EAAE,EAChB,eAAe,UAAQ,GACtB;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;CAAE,CAwBjF;AAgBD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CASzE;AAgCD,wBAAgB,uBAAuB,IAAI,MAAM,CAKhD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA8CxG;AAID,wBAAsB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDpH;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAIrF;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AA+CD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAenK;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BvB;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAID,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC,EACxE,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC,CAAM,GACnH,kBAAkB,CAepB;AAID,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAoB/C;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAsB1C;AAID,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,EAAE,CAAC,CAqC5B;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAclC"}
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
@@ -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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"}