@extenshi/cli 0.0.8 → 0.1.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/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +92 -3
- package/dist/cli.js.map +1 -1
- package/dist/html-report.d.ts +44 -0
- package/dist/html-report.d.ts.map +1 -0
- package/dist/html-report.js +527 -0
- package/dist/html-report.js.map +1 -0
- package/dist/render.d.ts +22 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +82 -2
- package/dist/render.js.map +1 -1
- package/dist/report.d.ts +30 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +130 -0
- package/dist/report.js.map +1 -0
- package/dist/review-archive.d.ts +29 -0
- package/dist/review-archive.d.ts.map +1 -0
- package/dist/review-archive.js +106 -0
- package/dist/review-archive.js.map +1 -0
- package/dist/review-catalog.d.ts +43 -0
- package/dist/review-catalog.d.ts.map +1 -0
- package/dist/review-catalog.js +82 -0
- package/dist/review-catalog.js.map +1 -0
- package/dist/review-checks.d.ts +139 -0
- package/dist/review-checks.d.ts.map +1 -0
- package/dist/review-checks.js +560 -0
- package/dist/review-checks.js.map +1 -0
- package/dist/review-render.d.ts +10 -0
- package/dist/review-render.d.ts.map +1 -0
- package/dist/review-render.js +94 -0
- package/dist/review-render.js.map +1 -0
- package/dist/review-risk.d.ts +29 -0
- package/dist/review-risk.d.ts.map +1 -0
- package/dist/review-risk.js +85 -0
- package/dist/review-risk.js.map +1 -0
- package/dist/scan.d.ts +82 -2
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +164 -17
- package/dist/scan.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-risk — terminal rendering.
|
|
3
|
+
*
|
|
4
|
+
* Findings are grouped by consequence, worst first: what the store will REJECT,
|
|
5
|
+
* then what causes user ATTRITION on update, then what merely triggers a SLOW
|
|
6
|
+
* review. The label is the consequence, never a generic "error/warning".
|
|
7
|
+
*/
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
function badge(v) {
|
|
10
|
+
switch (v) {
|
|
11
|
+
case 'REJECTED':
|
|
12
|
+
return chalk.bgRed.white.bold(' WILL BE REJECTED ');
|
|
13
|
+
case 'ATTRITION':
|
|
14
|
+
return chalk.bgMagenta.white.bold(' USER ATTRITION ');
|
|
15
|
+
case 'SLOW':
|
|
16
|
+
return chalk.bgYellow.black.bold(' TRIGGERS SLOW REVIEW ');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function headlineLabel(v) {
|
|
20
|
+
switch (v) {
|
|
21
|
+
case 'REJECTED':
|
|
22
|
+
return chalk.red.bold('will be REJECTED');
|
|
23
|
+
case 'ATTRITION':
|
|
24
|
+
return chalk.magenta.bold('user ATTRITION');
|
|
25
|
+
case 'SLOW':
|
|
26
|
+
return chalk.yellow.bold('triggers SLOW review');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function renderReviewReport(summary) {
|
|
30
|
+
const { findings, counts, blocking } = summary;
|
|
31
|
+
console.log();
|
|
32
|
+
if (findings.length === 0) {
|
|
33
|
+
console.log(chalk.green.bold('✓ No review-risk issues found — clear for publishing.'));
|
|
34
|
+
console.log();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const parts = [];
|
|
38
|
+
if (counts.REJECTED)
|
|
39
|
+
parts.push(headlineLabel('REJECTED') + chalk.dim(` ×${counts.REJECTED}`));
|
|
40
|
+
if (counts.ATTRITION)
|
|
41
|
+
parts.push(headlineLabel('ATTRITION') + chalk.dim(` ×${counts.ATTRITION}`));
|
|
42
|
+
if (counts.SLOW)
|
|
43
|
+
parts.push(headlineLabel('SLOW') + chalk.dim(` ×${counts.SLOW}`));
|
|
44
|
+
console.log(`${chalk.bold('Review-risk report')} · ${parts.join(' · ')}`);
|
|
45
|
+
console.log();
|
|
46
|
+
let lastVerdict = '';
|
|
47
|
+
for (const f of findings) {
|
|
48
|
+
if (f.verdict !== lastVerdict) {
|
|
49
|
+
lastVerdict = f.verdict;
|
|
50
|
+
console.log(badge(f.verdict));
|
|
51
|
+
}
|
|
52
|
+
renderFinding(f);
|
|
53
|
+
}
|
|
54
|
+
// Footer: the most severe consequence drives the closing line.
|
|
55
|
+
if (blocking) {
|
|
56
|
+
console.log(chalk.red.bold('✖ This package will be rejected by the store. Fix the REJECTED items before publishing.'));
|
|
57
|
+
}
|
|
58
|
+
else if (counts.ATTRITION > 0) {
|
|
59
|
+
console.log(chalk.magenta('⚠ Publishable, but you will silently lose installed users. See the ATTRITION items.'));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(chalk.yellow('ℹ Publishable. Expect a slower review — see the SLOW items.'));
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
}
|
|
66
|
+
function renderFinding(f) {
|
|
67
|
+
console.log(` ${chalk.bold(f.title)}`);
|
|
68
|
+
for (const line of wrap(f.detail, 84))
|
|
69
|
+
console.log(chalk.dim(` ${line}`));
|
|
70
|
+
if (f.evidence)
|
|
71
|
+
console.log(chalk.dim(` ${chalk.cyan('found:')} ${f.evidence}`));
|
|
72
|
+
for (const line of wrap(f.recommendation, 84))
|
|
73
|
+
console.log(` ${chalk.green('→')} ${chalk.green(line)}`);
|
|
74
|
+
console.log(chalk.dim(` ${f.citation}`));
|
|
75
|
+
console.log();
|
|
76
|
+
}
|
|
77
|
+
/** Greedy word-wrap to `width` columns (matches render.ts). */
|
|
78
|
+
function wrap(text, width) {
|
|
79
|
+
const out = [];
|
|
80
|
+
let line = '';
|
|
81
|
+
for (const word of text.split(/\s+/)) {
|
|
82
|
+
if (line && line.length + word.length + 1 > width) {
|
|
83
|
+
out.push(line);
|
|
84
|
+
line = word;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
line = line ? `${line} ${word}` : word;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (line)
|
|
91
|
+
out.push(line);
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=review-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-render.js","sourceRoot":"","sources":["../src/review-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi review-risk <artifact>` — pre-publish check suite that predicts
|
|
3
|
+
* Chrome Web Store outcomes: what will be REJECTED, what triggers a SLOW review,
|
|
4
|
+
* and what causes user ATTRITION on update.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* read artifact → extract manifest + text files (review-archive)
|
|
8
|
+
* → [optional] fetch last-published manifest for --extension-id (review-catalog)
|
|
9
|
+
* → run checks (review-checks) → render (review-render) or --json
|
|
10
|
+
*
|
|
11
|
+
* Network is only touched for the manifest diff, and only when --extension-id is
|
|
12
|
+
* given. With no id, every other check still runs fully offline — no API key
|
|
13
|
+
* required. Exit code is 1 only when something WILL BE REJECTED, so it gates a
|
|
14
|
+
* publish step in CI without blocking on slow-review / attrition advisories.
|
|
15
|
+
*/
|
|
16
|
+
export interface ReviewRiskOptions {
|
|
17
|
+
artifactPath: string;
|
|
18
|
+
/** Numeric catalog ID — enables the auto-disable manifest diff (check 3). */
|
|
19
|
+
extensionId?: string;
|
|
20
|
+
/** BFF base URL for the manifest diff (default https://bff.extenshi.io). */
|
|
21
|
+
bffUrl: string;
|
|
22
|
+
/** Optional `ek_` key, forwarded only when the catalog read path is gated. */
|
|
23
|
+
apiKey?: string;
|
|
24
|
+
/** Store to diff the manifest against (default CHROME — this tool is CWS-centric). */
|
|
25
|
+
store?: 'CHROME' | 'FIREFOX' | 'EDGE';
|
|
26
|
+
outputJson: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function runReviewRisk(opts: ReviewRiskOptions): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=review-risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-risk.d.ts","sourceRoot":"","sources":["../src/review-risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,MAAM,WAAW,iBAAiB;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sFAAsF;IACtF,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IACrC,UAAU,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE1E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi review-risk <artifact>` — pre-publish check suite that predicts
|
|
3
|
+
* Chrome Web Store outcomes: what will be REJECTED, what triggers a SLOW review,
|
|
4
|
+
* and what causes user ATTRITION on update.
|
|
5
|
+
*
|
|
6
|
+
* Flow:
|
|
7
|
+
* read artifact → extract manifest + text files (review-archive)
|
|
8
|
+
* → [optional] fetch last-published manifest for --extension-id (review-catalog)
|
|
9
|
+
* → run checks (review-checks) → render (review-render) or --json
|
|
10
|
+
*
|
|
11
|
+
* Network is only touched for the manifest diff, and only when --extension-id is
|
|
12
|
+
* given. With no id, every other check still runs fully offline — no API key
|
|
13
|
+
* required. Exit code is 1 only when something WILL BE REJECTED, so it gates a
|
|
14
|
+
* publish step in CI without blocking on slow-review / attrition advisories.
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { loadArtifact } from './review-archive.js';
|
|
19
|
+
import { fetchPriorManifest } from './review-catalog.js';
|
|
20
|
+
import { runChecks, summarize } from './review-checks.js';
|
|
21
|
+
import { renderReviewReport } from './review-render.js';
|
|
22
|
+
const MAX_SIZE = 50 * 1024 * 1024; // 50 MB, matches `scan`
|
|
23
|
+
export async function runReviewRisk(opts) {
|
|
24
|
+
if (!fs.existsSync(opts.artifactPath)) {
|
|
25
|
+
throw new Error(`Artifact file not found: ${opts.artifactPath}`);
|
|
26
|
+
}
|
|
27
|
+
const stats = fs.statSync(opts.artifactPath);
|
|
28
|
+
if (!stats.isFile()) {
|
|
29
|
+
throw new Error(`Artifact path is not a file: ${opts.artifactPath}`);
|
|
30
|
+
}
|
|
31
|
+
if (stats.size > MAX_SIZE) {
|
|
32
|
+
throw new Error(`Artifact exceeds 50 MB limit (${(stats.size / 1024 / 1024).toFixed(1)} MB)`);
|
|
33
|
+
}
|
|
34
|
+
const { manifest, files, warnings } = await loadArtifact(fs.readFileSync(opts.artifactPath));
|
|
35
|
+
// Optional manifest diff (check 3) — only when an extension id is supplied.
|
|
36
|
+
let priorManifest = null;
|
|
37
|
+
let diffNote = null;
|
|
38
|
+
if (opts.extensionId) {
|
|
39
|
+
const spinner = ora({ text: 'Fetching last published manifest…', stream: process.stderr }).start();
|
|
40
|
+
const prior = await fetchPriorManifest({
|
|
41
|
+
bffUrl: opts.bffUrl,
|
|
42
|
+
extensionId: opts.extensionId,
|
|
43
|
+
apiKey: opts.apiKey,
|
|
44
|
+
store: opts.store,
|
|
45
|
+
});
|
|
46
|
+
if (prior.manifest) {
|
|
47
|
+
priorManifest = prior.manifest;
|
|
48
|
+
const v = prior.meta?.version ? ` (published v${prior.meta.version})` : '';
|
|
49
|
+
spinner.succeed(`Compared against the last published manifest${v}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
spinner.warn(`Auto-disable diff skipped: ${prior.reason}`);
|
|
53
|
+
diffNote = prior.reason ?? 'last published manifest unavailable';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
diffNote =
|
|
58
|
+
'pass --extension-id <numeric catalog id> to diff against your last published manifest (auto-disable check)';
|
|
59
|
+
}
|
|
60
|
+
const summary = summarize(runChecks({ manifest, files, priorManifest }));
|
|
61
|
+
if (opts.outputJson) {
|
|
62
|
+
process.stdout.write(`${JSON.stringify({
|
|
63
|
+
artifact: opts.artifactPath,
|
|
64
|
+
manifestVersion: manifest.manifest_version,
|
|
65
|
+
name: manifest.name,
|
|
66
|
+
version: manifest.version,
|
|
67
|
+
counts: summary.counts,
|
|
68
|
+
blocking: summary.blocking,
|
|
69
|
+
findings: summary.findings,
|
|
70
|
+
diffSkippedReason: priorManifest ? undefined : diffNote,
|
|
71
|
+
archiveWarnings: warnings,
|
|
72
|
+
}, null, 2)}\n`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
for (const w of warnings)
|
|
76
|
+
process.stderr.write(`note: ${w}\n`);
|
|
77
|
+
renderReviewReport(summary);
|
|
78
|
+
if (diffNote)
|
|
79
|
+
process.stderr.write(`note: ${diffNote}\n`);
|
|
80
|
+
}
|
|
81
|
+
// Block a publish pipeline only on a definite rejection.
|
|
82
|
+
if (summary.blocking)
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=review-risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-risk.js","sourceRoot":"","sources":["../src/review-risk.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.d.ts
CHANGED
|
@@ -66,16 +66,92 @@ export interface ElapsedSpinner {
|
|
|
66
66
|
stop: () => void;
|
|
67
67
|
seconds: () => number;
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Columns reserved beside the spinner text so the rendered line never reaches the
|
|
71
|
+
* wrap boundary: spinner glyph + leading space (2) + ora's own line-count
|
|
72
|
+
* measurement padding ("--" … "--" = 4) + a small safety buffer against resize
|
|
73
|
+
* jitter (2). Shared by `fitSpinnerText` and its tests so the two stay in sync.
|
|
74
|
+
*/
|
|
75
|
+
export declare const SPINNER_COLUMN_RESERVE = 8;
|
|
76
|
+
/**
|
|
77
|
+
* Truncate spinner text so the rendered line (spinner glyph + text) always fits
|
|
78
|
+
* within ONE terminal row. This is the fix for ora's scrollback-eating bug.
|
|
79
|
+
*
|
|
80
|
+
* ora measures how many rows the spinner occupies (`#lineCount`) by wrapping the
|
|
81
|
+
* text at the terminal width, then `clear()` moves the cursor UP `lineCount - 1`
|
|
82
|
+
* rows and clears them before the next frame. When the spinner line is longer
|
|
83
|
+
* than the terminal is wide it wraps, `#lineCount` becomes > 1 (and ora's own
|
|
84
|
+
* measurement padding makes it overcount right at the wrap boundary), so the
|
|
85
|
+
* clear walks up too far and erases whatever was printed *before* the CLI ran.
|
|
86
|
+
* The effect is intermittent because our line crosses the wrap boundary as the
|
|
87
|
+
* `(Ns)` timer and the progress bar grow and shrink.
|
|
88
|
+
*
|
|
89
|
+
* Pinning the line to a single row keeps `#lineCount` at 1, so `clear()` can only
|
|
90
|
+
* ever touch the spinner's own line. `columns` is `process.stderr.columns`; when
|
|
91
|
+
* it's undefined (non-TTY / unknown) the text is returned untouched — a non-TTY
|
|
92
|
+
* ora neither animates nor clears, so there is nothing to corrupt.
|
|
93
|
+
*
|
|
94
|
+
* Pure + exported for unit testing.
|
|
95
|
+
*/
|
|
96
|
+
export declare function fitSpinnerText(text: string, columns: number | undefined): string;
|
|
97
|
+
/** Primary output mode for the scan result. */
|
|
98
|
+
export type OutputFormat = 'html' | 'json' | 'stdout';
|
|
69
99
|
export interface ScanOptions {
|
|
70
100
|
artifactPath: string;
|
|
71
101
|
apiKey: string;
|
|
72
102
|
apiUrl: string;
|
|
73
103
|
extensionId?: string;
|
|
74
|
-
|
|
104
|
+
/** Primary output format: branded HTML file (default), raw JSON to stdout, or pretty terminal render. */
|
|
105
|
+
format: OutputFormat;
|
|
106
|
+
/** Destination path for the HTML file (format === 'html'); defaults to an auto-named file in cwd. */
|
|
107
|
+
outputPath?: string;
|
|
108
|
+
/** Open the HTML report in the default browser after writing (format === 'html'). */
|
|
109
|
+
openReport?: boolean;
|
|
75
110
|
skipPreflight: boolean;
|
|
76
111
|
/** Request live progress over SSE (default). `false` forces the legacy single-JSON mode. */
|
|
77
112
|
stream: boolean;
|
|
113
|
+
/** When set, also write a formatted report file to this path (in addition to the primary output). */
|
|
114
|
+
reportPath?: string;
|
|
115
|
+
/** Report file format. Defaults to inference from `reportPath`'s extension (.json → json, else md). */
|
|
116
|
+
reportFormat?: 'md' | 'json';
|
|
117
|
+
/** CLI version stamped into the report header. */
|
|
118
|
+
cliVersion?: string;
|
|
78
119
|
}
|
|
120
|
+
/** Everything the two render branches need to emit the final result identically. */
|
|
121
|
+
export interface OutputOptions {
|
|
122
|
+
format: OutputFormat;
|
|
123
|
+
artifactName: string;
|
|
124
|
+
cliVersion: string;
|
|
125
|
+
/** Resolved path for the HTML file (format === 'html'). */
|
|
126
|
+
htmlPath?: string;
|
|
127
|
+
/** Open the HTML file in the default browser after writing. */
|
|
128
|
+
open: boolean;
|
|
129
|
+
/** Optional secondary `--report` artifact — written regardless of `format`. */
|
|
130
|
+
reportFile?: ReportFileOptions;
|
|
131
|
+
}
|
|
132
|
+
/** Options threaded into the report-file writer once the artifact name is known. */
|
|
133
|
+
export interface ReportFileOptions {
|
|
134
|
+
reportPath: string;
|
|
135
|
+
reportFormat?: 'md' | 'json';
|
|
136
|
+
artifactName: string;
|
|
137
|
+
cliVersion: string;
|
|
138
|
+
}
|
|
139
|
+
/** Default HTML report path: `<artifact-without-ext>-extenshi-report.html` in cwd. */
|
|
140
|
+
export declare function defaultHtmlPath(artifactName: string): string;
|
|
141
|
+
/** Resolve the HTML destination: explicit --output wins, else the auto-named default. */
|
|
142
|
+
export declare function resolveHtmlPath(outputPath: string | undefined, artifactName: string): string;
|
|
143
|
+
/**
|
|
144
|
+
* Emit the final scan result in the chosen format. Shared by the streaming and
|
|
145
|
+
* legacy branches so both behave identically:
|
|
146
|
+
* - json → raw JSON to stdout (the machine-readable channel)
|
|
147
|
+
* - stdout → pretty chalk render to the terminal
|
|
148
|
+
* - html → write the branded self-contained report to disk, print its path,
|
|
149
|
+
* and (when `open`) launch the default browser
|
|
150
|
+
* The optional `--report` secondary artifact is written afterwards regardless.
|
|
151
|
+
*
|
|
152
|
+
* Exported for unit testing the html-write path (call with `open: false`).
|
|
153
|
+
*/
|
|
154
|
+
export declare function emitOutput(body: Record<string, unknown>, opts: OutputOptions): void;
|
|
79
155
|
export declare function runScan(opts: ScanOptions): Promise<void>;
|
|
80
156
|
/**
|
|
81
157
|
* Consume the SSE progress stream, updating the shared elapsed spinner on
|
|
@@ -92,6 +168,10 @@ export declare function runScan(opts: ScanOptions): Promise<void>;
|
|
|
92
168
|
*
|
|
93
169
|
* Exported for unit testing the "feedback before the first progress event"
|
|
94
170
|
* path — the regression that made the console look frozen during upload/queue.
|
|
171
|
+
*
|
|
172
|
+
* `output` carries the chosen format (html / json / stdout) plus the optional
|
|
173
|
+
* `--report` artifact; the terminal `result` event is emitted through the same
|
|
174
|
+
* `emitOutput` path as the legacy branch so the two stay identical.
|
|
95
175
|
*/
|
|
96
|
-
export declare function renderSseStream(response: Response,
|
|
176
|
+
export declare function renderSseStream(response: Response, output: OutputOptions, progress: ElapsedSpinner): Promise<void>;
|
|
97
177
|
//# sourceMappingURL=scan.d.ts.map
|
package/dist/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.js
CHANGED
|
@@ -22,11 +22,14 @@
|
|
|
22
22
|
* "при network error не делайте автоматический retry —
|
|
23
23
|
* списанный credit вернётся автоматически в течение 1 минуты (auto-refund cron)"
|
|
24
24
|
*/
|
|
25
|
+
import { spawn } from 'node:child_process';
|
|
25
26
|
import fs from 'node:fs';
|
|
26
27
|
import path from 'node:path';
|
|
27
28
|
import ora from 'ora';
|
|
28
29
|
import { FormData, fetch } from 'undici';
|
|
30
|
+
import { renderHtmlReport } from './html-report.js';
|
|
29
31
|
import { renderReport } from './render.js';
|
|
32
|
+
import { renderMarkdownReport } from './report.js';
|
|
30
33
|
import { parseSseFrames } from './sse.js';
|
|
31
34
|
const SCAN_TIMEOUT_MS = 240_000; // 240 seconds
|
|
32
35
|
const PREFLIGHT_TIMEOUT_MS = 70_000; // 70 seconds
|
|
@@ -70,13 +73,54 @@ export function buildAccessDeniedMessage(body) {
|
|
|
70
73
|
` • Buy credits to scan arbitrary / unclaimed artifacts:\n` +
|
|
71
74
|
` ${CLI_BILLING_URL}`);
|
|
72
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Columns reserved beside the spinner text so the rendered line never reaches the
|
|
78
|
+
* wrap boundary: spinner glyph + leading space (2) + ora's own line-count
|
|
79
|
+
* measurement padding ("--" … "--" = 4) + a small safety buffer against resize
|
|
80
|
+
* jitter (2). Shared by `fitSpinnerText` and its tests so the two stay in sync.
|
|
81
|
+
*/
|
|
82
|
+
export const SPINNER_COLUMN_RESERVE = 8;
|
|
83
|
+
/**
|
|
84
|
+
* Truncate spinner text so the rendered line (spinner glyph + text) always fits
|
|
85
|
+
* within ONE terminal row. This is the fix for ora's scrollback-eating bug.
|
|
86
|
+
*
|
|
87
|
+
* ora measures how many rows the spinner occupies (`#lineCount`) by wrapping the
|
|
88
|
+
* text at the terminal width, then `clear()` moves the cursor UP `lineCount - 1`
|
|
89
|
+
* rows and clears them before the next frame. When the spinner line is longer
|
|
90
|
+
* than the terminal is wide it wraps, `#lineCount` becomes > 1 (and ora's own
|
|
91
|
+
* measurement padding makes it overcount right at the wrap boundary), so the
|
|
92
|
+
* clear walks up too far and erases whatever was printed *before* the CLI ran.
|
|
93
|
+
* The effect is intermittent because our line crosses the wrap boundary as the
|
|
94
|
+
* `(Ns)` timer and the progress bar grow and shrink.
|
|
95
|
+
*
|
|
96
|
+
* Pinning the line to a single row keeps `#lineCount` at 1, so `clear()` can only
|
|
97
|
+
* ever touch the spinner's own line. `columns` is `process.stderr.columns`; when
|
|
98
|
+
* it's undefined (non-TTY / unknown) the text is returned untouched — a non-TTY
|
|
99
|
+
* ora neither animates nor clears, so there is nothing to corrupt.
|
|
100
|
+
*
|
|
101
|
+
* Pure + exported for unit testing.
|
|
102
|
+
*/
|
|
103
|
+
export function fitSpinnerText(text, columns) {
|
|
104
|
+
if (!columns || columns <= 0)
|
|
105
|
+
return text;
|
|
106
|
+
// Keep the line under the wrap boundary (see SPINNER_COLUMN_RESERVE).
|
|
107
|
+
const max = Math.max(SPINNER_COLUMN_RESERVE, columns - SPINNER_COLUMN_RESERVE);
|
|
108
|
+
// Our spinner text is all single-width characters (ASCII + the block glyphs
|
|
109
|
+
// █/░ + the ellipsis), so a code-point count equals the display width.
|
|
110
|
+
const chars = Array.from(text);
|
|
111
|
+
if (chars.length <= max)
|
|
112
|
+
return text;
|
|
113
|
+
return `${chars.slice(0, max - 1).join('')}…`;
|
|
114
|
+
}
|
|
73
115
|
function startElapsedSpinner(label) {
|
|
74
116
|
const startedAt = Date.now();
|
|
75
117
|
const seconds = () => Math.round((Date.now() - startedAt) / 1000);
|
|
76
118
|
let base = label;
|
|
77
|
-
|
|
119
|
+
// Recompute the width on every render so a mid-scan terminal resize is honoured.
|
|
120
|
+
const fitLine = (text) => fitSpinnerText(text, process.stderr.isTTY ? process.stderr.columns : undefined);
|
|
121
|
+
const spinner = ora({ text: fitLine(label), stream: process.stderr }).start();
|
|
78
122
|
const render = () => {
|
|
79
|
-
spinner.text = `${base} (${seconds()}s)
|
|
123
|
+
spinner.text = fitLine(`${base} (${seconds()}s)`);
|
|
80
124
|
};
|
|
81
125
|
const ticker = setInterval(render, 1000);
|
|
82
126
|
// Don't let the 1s ticker keep the event loop alive on its own.
|
|
@@ -102,8 +146,98 @@ function startElapsedSpinner(label) {
|
|
|
102
146
|
seconds,
|
|
103
147
|
};
|
|
104
148
|
}
|
|
149
|
+
/** Resolve the on-disk report format: explicit flag wins, else infer from the path. */
|
|
150
|
+
function resolveReportFormat(reportPath, explicit) {
|
|
151
|
+
if (explicit)
|
|
152
|
+
return explicit;
|
|
153
|
+
return path.extname(reportPath).toLowerCase() === '.json' ? 'json' : 'md';
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Write the final report to disk in the requested format and announce it on
|
|
157
|
+
* stderr (never stdout — that channel is reserved for --json). The Markdown
|
|
158
|
+
* branch defers to the pure `renderMarkdownReport`; the json branch writes the
|
|
159
|
+
* raw server payload verbatim so it stays a faithful machine-readable artifact.
|
|
160
|
+
*/
|
|
161
|
+
function writeReportFile(body, opts) {
|
|
162
|
+
const format = resolveReportFormat(opts.reportPath, opts.reportFormat);
|
|
163
|
+
const content = format === 'json'
|
|
164
|
+
? `${JSON.stringify(body, null, 2)}\n`
|
|
165
|
+
: renderMarkdownReport(body, {
|
|
166
|
+
artifactName: opts.artifactName,
|
|
167
|
+
cliVersion: opts.cliVersion,
|
|
168
|
+
generatedAt: new Date(),
|
|
169
|
+
});
|
|
170
|
+
fs.writeFileSync(opts.reportPath, content, 'utf8');
|
|
171
|
+
process.stderr.write(`Report written to ${opts.reportPath}\n`);
|
|
172
|
+
}
|
|
173
|
+
/** Default HTML report path: `<artifact-without-ext>-extenshi-report.html` in cwd. */
|
|
174
|
+
export function defaultHtmlPath(artifactName) {
|
|
175
|
+
const base = path.basename(artifactName, path.extname(artifactName)) || 'extenshi-scan';
|
|
176
|
+
return path.resolve(process.cwd(), `${base}-extenshi-report.html`);
|
|
177
|
+
}
|
|
178
|
+
/** Resolve the HTML destination: explicit --output wins, else the auto-named default. */
|
|
179
|
+
export function resolveHtmlPath(outputPath, artifactName) {
|
|
180
|
+
return outputPath ? path.resolve(process.cwd(), outputPath) : defaultHtmlPath(artifactName);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Open a file in the OS default browser using the platform-native opener
|
|
184
|
+
* (`open` / `start` / `xdg-open`) — no extra dependency. Fully fail-soft: a
|
|
185
|
+
* detached, unref'd child with an `error` listener so a missing opener (common
|
|
186
|
+
* in headless/CI environments) never crashes the CLI or leaves it hanging.
|
|
187
|
+
*/
|
|
188
|
+
function openInBrowser(target) {
|
|
189
|
+
try {
|
|
190
|
+
const [command, args] = process.platform === 'darwin'
|
|
191
|
+
? ['open', [target]]
|
|
192
|
+
: process.platform === 'win32'
|
|
193
|
+
? ['cmd', ['/c', 'start', '', target]]
|
|
194
|
+
: ['xdg-open', [target]];
|
|
195
|
+
const child = spawn(command, args, { detached: true, stdio: 'ignore' });
|
|
196
|
+
// Swallow async spawn failures (e.g. xdg-open absent) — the path is already printed.
|
|
197
|
+
child.on('error', () => { });
|
|
198
|
+
child.unref();
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Synchronous spawn failure — already printed the path, nothing else to do.
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Emit the final scan result in the chosen format. Shared by the streaming and
|
|
206
|
+
* legacy branches so both behave identically:
|
|
207
|
+
* - json → raw JSON to stdout (the machine-readable channel)
|
|
208
|
+
* - stdout → pretty chalk render to the terminal
|
|
209
|
+
* - html → write the branded self-contained report to disk, print its path,
|
|
210
|
+
* and (when `open`) launch the default browser
|
|
211
|
+
* The optional `--report` secondary artifact is written afterwards regardless.
|
|
212
|
+
*
|
|
213
|
+
* Exported for unit testing the html-write path (call with `open: false`).
|
|
214
|
+
*/
|
|
215
|
+
export function emitOutput(body, opts) {
|
|
216
|
+
if (opts.format === 'json') {
|
|
217
|
+
process.stdout.write(`${JSON.stringify(body, null, 2)}\n`);
|
|
218
|
+
}
|
|
219
|
+
else if (opts.format === 'stdout') {
|
|
220
|
+
renderReport(body);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
const htmlPath = opts.htmlPath ?? defaultHtmlPath(opts.artifactName);
|
|
224
|
+
const html = renderHtmlReport(body, {
|
|
225
|
+
artifactName: opts.artifactName,
|
|
226
|
+
cliVersion: opts.cliVersion,
|
|
227
|
+
generatedAt: new Date(),
|
|
228
|
+
});
|
|
229
|
+
fs.writeFileSync(htmlPath, html, 'utf8');
|
|
230
|
+
process.stderr.write(`HTML report written to ${htmlPath}\n`);
|
|
231
|
+
if (opts.open) {
|
|
232
|
+
process.stderr.write('Opening in your default browser…\n');
|
|
233
|
+
openInBrowser(htmlPath);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (opts.reportFile)
|
|
237
|
+
writeReportFile(body, opts.reportFile);
|
|
238
|
+
}
|
|
105
239
|
export async function runScan(opts) {
|
|
106
|
-
const { artifactPath, apiKey, apiUrl, extensionId,
|
|
240
|
+
const { artifactPath, apiKey, apiUrl, extensionId, skipPreflight, stream } = opts;
|
|
107
241
|
// Validate artifact file exists
|
|
108
242
|
if (!fs.existsSync(artifactPath)) {
|
|
109
243
|
throw new Error(`Artifact file not found: ${artifactPath}`);
|
|
@@ -126,6 +260,25 @@ export async function runScan(opts) {
|
|
|
126
260
|
// Step 2: Upload and scan
|
|
127
261
|
const artifactData = fs.readFileSync(artifactPath);
|
|
128
262
|
const artifactName = path.basename(artifactPath);
|
|
263
|
+
// Resolve report-file options now that we know the artifact name. Undefined
|
|
264
|
+
// when --report was not passed — both render branches then skip the write.
|
|
265
|
+
const reportFileOpts = opts.reportPath
|
|
266
|
+
? {
|
|
267
|
+
reportPath: opts.reportPath,
|
|
268
|
+
reportFormat: opts.reportFormat,
|
|
269
|
+
artifactName,
|
|
270
|
+
cliVersion: opts.cliVersion ?? 'dev',
|
|
271
|
+
}
|
|
272
|
+
: undefined;
|
|
273
|
+
// Everything the render branches need to emit the result identically.
|
|
274
|
+
const outputOpts = {
|
|
275
|
+
format: opts.format,
|
|
276
|
+
artifactName,
|
|
277
|
+
cliVersion: opts.cliVersion ?? 'dev',
|
|
278
|
+
htmlPath: opts.format === 'html' ? resolveHtmlPath(opts.outputPath, artifactName) : undefined,
|
|
279
|
+
open: opts.format === 'html' && (opts.openReport ?? true),
|
|
280
|
+
reportFile: reportFileOpts,
|
|
281
|
+
};
|
|
129
282
|
const form = new FormData();
|
|
130
283
|
form.append('apiKey', apiKey);
|
|
131
284
|
form.append('artifact', new File([artifactData], artifactName));
|
|
@@ -176,7 +329,7 @@ export async function runScan(opts) {
|
|
|
176
329
|
if (contentType.includes('text/event-stream')) {
|
|
177
330
|
// Hand the live spinner to renderSseStream — it owns the single
|
|
178
331
|
// succeed/fail settle from here, so this branch must not settle it.
|
|
179
|
-
await renderSseStream(response,
|
|
332
|
+
await renderSseStream(response, outputOpts, progress);
|
|
180
333
|
return;
|
|
181
334
|
}
|
|
182
335
|
// Single JSON body (legacy mode, or a server that ignored the streaming
|
|
@@ -193,12 +346,7 @@ export async function runScan(opts) {
|
|
|
193
346
|
throw err;
|
|
194
347
|
}
|
|
195
348
|
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
196
|
-
|
|
197
|
-
process.stdout.write(`${JSON.stringify(body, null, 2)}\n`);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
renderReport(body);
|
|
201
|
-
}
|
|
349
|
+
emitOutput(body, outputOpts);
|
|
202
350
|
}
|
|
203
351
|
/**
|
|
204
352
|
* Read the response body as JSON, with a clear error if the endpoint returns
|
|
@@ -283,8 +431,12 @@ function formatProgress(p) {
|
|
|
283
431
|
*
|
|
284
432
|
* Exported for unit testing the "feedback before the first progress event"
|
|
285
433
|
* path — the regression that made the console look frozen during upload/queue.
|
|
434
|
+
*
|
|
435
|
+
* `output` carries the chosen format (html / json / stdout) plus the optional
|
|
436
|
+
* `--report` artifact; the terminal `result` event is emitted through the same
|
|
437
|
+
* `emitOutput` path as the legacy branch so the two stay identical.
|
|
286
438
|
*/
|
|
287
|
-
export async function renderSseStream(response,
|
|
439
|
+
export async function renderSseStream(response, output, progress) {
|
|
288
440
|
// Headers are in and the upload is done, but the worker may still be
|
|
289
441
|
// queueing before it emits the first `accepted`/`progress` frame. Swap the
|
|
290
442
|
// label now so the (still-ticking) spinner reads "Connecting to scanner
|
|
@@ -338,12 +490,7 @@ export async function renderSseStream(response, outputJson, progress) {
|
|
|
338
490
|
throw new Error('Scan stream ended before returning a result');
|
|
339
491
|
}
|
|
340
492
|
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
341
|
-
|
|
342
|
-
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
renderReport(report);
|
|
346
|
-
}
|
|
493
|
+
emitOutput(report, output);
|
|
347
494
|
}
|
|
348
495
|
/**
|
|
349
496
|
* CI timeout pre-flight probe.
|
package/dist/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|