@extenshi/cli 0.5.1 → 0.5.3
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 +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +57 -60
- package/dist/cli.js.map +1 -1
- package/dist/compliance-review.d.ts +53 -0
- package/dist/compliance-review.d.ts.map +1 -0
- package/dist/compliance-review.js +87 -0
- package/dist/compliance-review.js.map +1 -0
- package/dist/html-report.d.ts.map +1 -1
- package/dist/html-report.js +64 -1
- package/dist/html-report.js.map +1 -1
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +29 -18
- package/dist/publish.js.map +1 -1
- package/dist/render.d.ts +28 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +111 -0
- package/dist/render.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +55 -1
- package/dist/report.js.map +1 -1
- package/dist/scan.d.ts +14 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +39 -3
- package/dist/scan.js.map +1 -1
- package/dist/telemetry.d.ts +62 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +259 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/validate-artifact.d.ts +27 -0
- package/dist/validate-artifact.d.ts.map +1 -0
- package/dist/validate-artifact.js +94 -0
- package/dist/validate-artifact.js.map +1 -0
- package/package.json +5 -2
- package/scripts/postinstall.cjs +132 -0
package/dist/scan.js
CHANGED
|
@@ -27,10 +27,12 @@ import fs from 'node:fs';
|
|
|
27
27
|
import path from 'node:path';
|
|
28
28
|
import ora from 'ora';
|
|
29
29
|
import { FormData, fetch } from 'undici';
|
|
30
|
+
import { buildComplianceReview } from './compliance-review.js';
|
|
30
31
|
import { renderHtmlReport } from './html-report.js';
|
|
31
32
|
import { renderReport } from './render.js';
|
|
32
33
|
import { renderMarkdownReport } from './report.js';
|
|
33
34
|
import { parseSseFrames } from './sse.js';
|
|
35
|
+
import { assertValidArtifact } from './validate-artifact.js';
|
|
34
36
|
const SCAN_TIMEOUT_MS = 240_000; // 240 seconds
|
|
35
37
|
const PREFLIGHT_TIMEOUT_MS = 70_000; // 70 seconds
|
|
36
38
|
const CLI_BILLING_URL = 'https://dojo.extenshi.io/billing';
|
|
@@ -213,6 +215,10 @@ function openInBrowser(target) {
|
|
|
213
215
|
* Exported for unit testing the html-write path (call with `open: false`).
|
|
214
216
|
*/
|
|
215
217
|
export function emitOutput(body, opts) {
|
|
218
|
+
// Fold the client-side review-risk result into the body BEFORE rendering, so
|
|
219
|
+
// json dumps it and every renderer reads it via summarizeComplianceReview().
|
|
220
|
+
if (opts.complianceReview)
|
|
221
|
+
body.complianceReview = opts.complianceReview;
|
|
216
222
|
if (opts.format === 'json') {
|
|
217
223
|
process.stdout.write(`${JSON.stringify(body, null, 2)}\n`);
|
|
218
224
|
}
|
|
@@ -251,6 +257,9 @@ export async function runScan(opts) {
|
|
|
251
257
|
if (artifactStats.size > MAX_SIZE) {
|
|
252
258
|
throw new Error(`Artifact file exceeds 50 MB limit (${(artifactStats.size / 1024 / 1024).toFixed(1)} MB)`);
|
|
253
259
|
}
|
|
260
|
+
// Refuse non-extension files (executables, scripts, HTML error pages, …) by
|
|
261
|
+
// extension + magic bytes before we read or upload anything.
|
|
262
|
+
assertValidArtifact(artifactPath);
|
|
254
263
|
// Step 1: CI timeout pre-flight.
|
|
255
264
|
// Skipped in streaming mode: the SSE keep-alive pings keep the connection
|
|
256
265
|
// alive past any outbound idle timeout, which is the very failure the
|
|
@@ -271,6 +280,25 @@ export async function runScan(opts) {
|
|
|
271
280
|
cliVersion: opts.cliVersion ?? 'dev',
|
|
272
281
|
}
|
|
273
282
|
: undefined;
|
|
283
|
+
// Kick off the pre-publish review-risk checks NOW (concurrent with the upload
|
|
284
|
+
// + server scan) so they add ~no wall-clock. Fully fail-soft — buildComplianceReview
|
|
285
|
+
// never throws, but the .catch is a belt-and-suspenders guard. Skipped entirely
|
|
286
|
+
// under --exclude-compliance-review. Resolved right before emitOutput in both
|
|
287
|
+
// the streaming and legacy branches.
|
|
288
|
+
const reviewPromise = opts.excludeComplianceReview
|
|
289
|
+
? Promise.resolve(undefined)
|
|
290
|
+
: buildComplianceReview({
|
|
291
|
+
artifact: artifactData,
|
|
292
|
+
extensionId,
|
|
293
|
+
bffUrl: opts.bffUrl ?? 'https://bff.extenshi.io',
|
|
294
|
+
apiKey,
|
|
295
|
+
}).catch((err) => ({
|
|
296
|
+
available: false,
|
|
297
|
+
reason: `review-risk checks failed: ${err.message}`,
|
|
298
|
+
blocking: false,
|
|
299
|
+
counts: { REJECTED: 0, ATTRITION: 0, SLOW: 0 },
|
|
300
|
+
findings: [],
|
|
301
|
+
}));
|
|
274
302
|
// Everything the render branches need to emit the result identically.
|
|
275
303
|
const outputOpts = {
|
|
276
304
|
format: opts.format,
|
|
@@ -330,8 +358,10 @@ export async function runScan(opts) {
|
|
|
330
358
|
const contentType = response.headers.get('content-type') ?? '';
|
|
331
359
|
if (contentType.includes('text/event-stream')) {
|
|
332
360
|
// Hand the live spinner to renderSseStream — it owns the single
|
|
333
|
-
// succeed/fail settle from here, so this branch must not settle it.
|
|
334
|
-
|
|
361
|
+
// succeed/fail settle from here, so this branch must not settle it. The
|
|
362
|
+
// review promise is awaited AFTER the stream drains (inside renderSseStream)
|
|
363
|
+
// so it never blocks reading the SSE body.
|
|
364
|
+
await renderSseStream(response, outputOpts, progress, reviewPromise);
|
|
335
365
|
return;
|
|
336
366
|
}
|
|
337
367
|
// Single JSON body (legacy mode, or a server that ignored the streaming
|
|
@@ -348,6 +378,7 @@ export async function runScan(opts) {
|
|
|
348
378
|
throw err;
|
|
349
379
|
}
|
|
350
380
|
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
381
|
+
outputOpts.complianceReview = await reviewPromise;
|
|
351
382
|
emitOutput(body, outputOpts);
|
|
352
383
|
}
|
|
353
384
|
/**
|
|
@@ -438,7 +469,9 @@ function formatProgress(p) {
|
|
|
438
469
|
* `--report` artifact; the terminal `result` event is emitted through the same
|
|
439
470
|
* `emitOutput` path as the legacy branch so the two stay identical.
|
|
440
471
|
*/
|
|
441
|
-
export async function renderSseStream(response, output, progress
|
|
472
|
+
export async function renderSseStream(response, output, progress,
|
|
473
|
+
/** Resolved AFTER the stream drains and folded into `output` before emit. */
|
|
474
|
+
reviewPromise) {
|
|
442
475
|
// Headers are in and the upload is done, but the worker may still be
|
|
443
476
|
// queueing before it emits the first `accepted`/`progress` frame. Swap the
|
|
444
477
|
// label now so the (still-ticking) spinner reads "Connecting to scanner
|
|
@@ -491,6 +524,9 @@ export async function renderSseStream(response, output, progress) {
|
|
|
491
524
|
progress.fail('Scan ended without a result');
|
|
492
525
|
throw new Error('Scan stream ended before returning a result');
|
|
493
526
|
}
|
|
527
|
+
// Stream drained — now resolve the concurrently-running review and fold it in.
|
|
528
|
+
if (reviewPromise)
|
|
529
|
+
output.complianceReview = await reviewPromise;
|
|
494
530
|
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
495
531
|
emitOutput(report, output);
|
|
496
532
|
}
|
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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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous, opt-out usage telemetry — VENDORED, kept byte-identical between
|
|
3
|
+
* @extenshi/cli and @extenshi/mcp (same pattern as validate-artifact.ts). Edit
|
|
4
|
+
* one, copy to the other.
|
|
5
|
+
*
|
|
6
|
+
* Why it exists: we want to know which commands/tools are used most, which fail,
|
|
7
|
+
* and what errors recur — without shipping a heavyweight client or leaking PII.
|
|
8
|
+
*
|
|
9
|
+
* What it sends (and ONLY this):
|
|
10
|
+
* - command/tool name, surface ('cli' | 'mcp'), package + Node version,
|
|
11
|
+
* coarse os/arch, a CI bool
|
|
12
|
+
* - the NAMES of CLI flags used (never their values — see flagsFromArgv)
|
|
13
|
+
* - a coarse error_kind classification + durations
|
|
14
|
+
* - a path-redacted exception signature (message + stack, $HOME stripped)
|
|
15
|
+
*
|
|
16
|
+
* What it NEVER sends: file paths, artifact names/contents, API keys, manifest
|
|
17
|
+
* data, or raw user input.
|
|
18
|
+
*
|
|
19
|
+
* Identity is an anonymous per-install UUID in ~/.extenshi/config.json
|
|
20
|
+
* (`anonId`) — it identifies an install, not a person, and is never linked to
|
|
21
|
+
* the API key client-side.
|
|
22
|
+
*
|
|
23
|
+
* On by default: the shared-project ingestion key is embedded (see
|
|
24
|
+
* EMBEDDED_KEY), so telemetry is active unless the user opts out. Disabled
|
|
25
|
+
* (no-op, never blocks the command) when ANY holds:
|
|
26
|
+
* - DO_NOT_TRACK is truthy (industry standard, https://consoledonottrack.com)
|
|
27
|
+
* - EXTENSHI_TELEMETRY in {0,false,off,no}
|
|
28
|
+
* - config file has "telemetry": false
|
|
29
|
+
* - the key is cleared (EMBEDDED_KEY emptied AND no EXTENSHI_POSTHOG_KEY)
|
|
30
|
+
*
|
|
31
|
+
* Everything here is fail-soft: any throw inside telemetry is swallowed so a
|
|
32
|
+
* PostHog/network/disk problem can never break or slow the actual command.
|
|
33
|
+
*/
|
|
34
|
+
/** Record the surface + version once at process startup. */
|
|
35
|
+
export declare function initTelemetry(opts: {
|
|
36
|
+
surface: string;
|
|
37
|
+
version: string;
|
|
38
|
+
}): void;
|
|
39
|
+
export declare function telemetryEnabled(): boolean;
|
|
40
|
+
/** Strip absolute home paths from any string before it leaves the machine. */
|
|
41
|
+
export declare function redactText(s: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Coarse error bucket. Driven by a numeric `status` when the error carries one
|
|
44
|
+
* (MCP ScanError), else by message patterns (CLI throws plain Errors). Order
|
|
45
|
+
* matters — status first, then transport, then semantic buckets.
|
|
46
|
+
*/
|
|
47
|
+
export declare function classifyError(err: unknown): string;
|
|
48
|
+
/**
|
|
49
|
+
* The NAMES of long flags the user passed, with values stripped. `--out=/x`
|
|
50
|
+
* becomes `--out`; the separate-token value of `--output /x` is never a `--`
|
|
51
|
+
* token, so it is never collected. No flag VALUE can leak through here.
|
|
52
|
+
*/
|
|
53
|
+
export declare function flagsFromArgv(argv?: string[]): string[];
|
|
54
|
+
export declare function captureEvent(event: string, properties?: Record<string, unknown>): void;
|
|
55
|
+
export declare function captureError(err: unknown, context?: Record<string, unknown>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Flush buffered events and close the client. Hard-capped so a slow/hung
|
|
58
|
+
* PostHog endpoint can never delay the command's exit. Safe to call when
|
|
59
|
+
* telemetry is disabled (no-op) or more than once.
|
|
60
|
+
*/
|
|
61
|
+
export declare function flushTelemetry(): Promise<void>;
|
|
62
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AA+BH,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG9E;AAmCD,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AA6CD,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C;AAUD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAsBlD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,MAAM,EAAE,CAM9E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAQ1F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAQtF;AASD;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous, opt-out usage telemetry — VENDORED, kept byte-identical between
|
|
3
|
+
* @extenshi/cli and @extenshi/mcp (same pattern as validate-artifact.ts). Edit
|
|
4
|
+
* one, copy to the other.
|
|
5
|
+
*
|
|
6
|
+
* Why it exists: we want to know which commands/tools are used most, which fail,
|
|
7
|
+
* and what errors recur — without shipping a heavyweight client or leaking PII.
|
|
8
|
+
*
|
|
9
|
+
* What it sends (and ONLY this):
|
|
10
|
+
* - command/tool name, surface ('cli' | 'mcp'), package + Node version,
|
|
11
|
+
* coarse os/arch, a CI bool
|
|
12
|
+
* - the NAMES of CLI flags used (never their values — see flagsFromArgv)
|
|
13
|
+
* - a coarse error_kind classification + durations
|
|
14
|
+
* - a path-redacted exception signature (message + stack, $HOME stripped)
|
|
15
|
+
*
|
|
16
|
+
* What it NEVER sends: file paths, artifact names/contents, API keys, manifest
|
|
17
|
+
* data, or raw user input.
|
|
18
|
+
*
|
|
19
|
+
* Identity is an anonymous per-install UUID in ~/.extenshi/config.json
|
|
20
|
+
* (`anonId`) — it identifies an install, not a person, and is never linked to
|
|
21
|
+
* the API key client-side.
|
|
22
|
+
*
|
|
23
|
+
* On by default: the shared-project ingestion key is embedded (see
|
|
24
|
+
* EMBEDDED_KEY), so telemetry is active unless the user opts out. Disabled
|
|
25
|
+
* (no-op, never blocks the command) when ANY holds:
|
|
26
|
+
* - DO_NOT_TRACK is truthy (industry standard, https://consoledonottrack.com)
|
|
27
|
+
* - EXTENSHI_TELEMETRY in {0,false,off,no}
|
|
28
|
+
* - config file has "telemetry": false
|
|
29
|
+
* - the key is cleared (EMBEDDED_KEY emptied AND no EXTENSHI_POSTHOG_KEY)
|
|
30
|
+
*
|
|
31
|
+
* Everything here is fail-soft: any throw inside telemetry is swallowed so a
|
|
32
|
+
* PostHog/network/disk problem can never break or slow the actual command.
|
|
33
|
+
*/
|
|
34
|
+
import { randomUUID } from 'node:crypto';
|
|
35
|
+
import fs from 'node:fs';
|
|
36
|
+
import os from 'node:os';
|
|
37
|
+
import path from 'node:path';
|
|
38
|
+
import { PostHog } from 'posthog-node';
|
|
39
|
+
// Shared PostHog *project* ingestion key (EU project 114791 — the same project
|
|
40
|
+
// the web apps use; we run on the free tier so CLI/MCP share it). It is the
|
|
41
|
+
// public, write-only key already shipped in our web bundles, so embedding it
|
|
42
|
+
// here is not a secret leak. CLI/MCP events are namespaced (`cli_*` / `mcp_*`,
|
|
43
|
+
// plus a `surface` property) so they stay separable from web analytics.
|
|
44
|
+
// Override at runtime with EXTENSHI_POSTHOG_KEY; set it empty to ship dark.
|
|
45
|
+
const EMBEDDED_KEY = 'phc_fqKrAmtNZvJqe0krpYB3UwYqALLpT1WM8m5LtNs9eUu';
|
|
46
|
+
const DEFAULT_HOST = 'https://eu.i.posthog.com';
|
|
47
|
+
const CONFIG_PATH = path.join(os.homedir(), '.extenshi', 'config.json');
|
|
48
|
+
const HOME = os.homedir();
|
|
49
|
+
let surface = 'unknown';
|
|
50
|
+
let appVersion = '0.0.0';
|
|
51
|
+
let client = null;
|
|
52
|
+
let triedInit = false;
|
|
53
|
+
let cachedAnonId = null;
|
|
54
|
+
/** Record the surface + version once at process startup. */
|
|
55
|
+
export function initTelemetry(opts) {
|
|
56
|
+
surface = opts.surface;
|
|
57
|
+
appVersion = opts.version;
|
|
58
|
+
}
|
|
59
|
+
function telemetryKey() {
|
|
60
|
+
return (process.env.EXTENSHI_POSTHOG_KEY ?? EMBEDDED_KEY).trim();
|
|
61
|
+
}
|
|
62
|
+
function telemetryHost() {
|
|
63
|
+
return (process.env.EXTENSHI_POSTHOG_HOST ?? DEFAULT_HOST).trim();
|
|
64
|
+
}
|
|
65
|
+
function readConfig() {
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8'));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Merge-write so we never clobber apiKey/apiUrl written by `extenshi login`. */
|
|
74
|
+
function mergeWriteConfig(update) {
|
|
75
|
+
try {
|
|
76
|
+
const existing = readConfig();
|
|
77
|
+
const merged = { ...existing, ...update };
|
|
78
|
+
fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });
|
|
79
|
+
fs.writeFileSync(CONFIG_PATH, `${JSON.stringify(merged, null, 2)}\n`, { mode: 0o600 });
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Read-only home / unwritable config — fall back to an ephemeral id.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function isTruthy(v) {
|
|
86
|
+
const t = (v ?? '').trim().toLowerCase();
|
|
87
|
+
return t === '1' || t === 'true' || t === 'yes' || t === 'on';
|
|
88
|
+
}
|
|
89
|
+
export function telemetryEnabled() {
|
|
90
|
+
if (!telemetryKey())
|
|
91
|
+
return false;
|
|
92
|
+
if (isTruthy(process.env.DO_NOT_TRACK))
|
|
93
|
+
return false;
|
|
94
|
+
const t = (process.env.EXTENSHI_TELEMETRY ?? '').trim().toLowerCase();
|
|
95
|
+
if (t === '0' || t === 'false' || t === 'off' || t === 'no')
|
|
96
|
+
return false;
|
|
97
|
+
if (readConfig().telemetry === false)
|
|
98
|
+
return false;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
function anonId() {
|
|
102
|
+
if (cachedAnonId)
|
|
103
|
+
return cachedAnonId;
|
|
104
|
+
const existing = readConfig().anonId;
|
|
105
|
+
if (existing) {
|
|
106
|
+
cachedAnonId = existing;
|
|
107
|
+
return existing;
|
|
108
|
+
}
|
|
109
|
+
const id = randomUUID();
|
|
110
|
+
cachedAnonId = id;
|
|
111
|
+
mergeWriteConfig({ anonId: id });
|
|
112
|
+
return id;
|
|
113
|
+
}
|
|
114
|
+
function getClient() {
|
|
115
|
+
// Fast path after the first call: never re-read the config file
|
|
116
|
+
// (telemetryEnabled does a sync read) on subsequent events — matters for the
|
|
117
|
+
// long-running MCP server, which can handle many tool calls.
|
|
118
|
+
if (client)
|
|
119
|
+
return client;
|
|
120
|
+
if (triedInit)
|
|
121
|
+
return null;
|
|
122
|
+
triedInit = true;
|
|
123
|
+
if (!telemetryEnabled())
|
|
124
|
+
return null;
|
|
125
|
+
try {
|
|
126
|
+
// Batch events; the 2–3 events a CLI run emits flush together on
|
|
127
|
+
// flushTelemetry()/shutdown(). The MCP server (long-running) also gets a
|
|
128
|
+
// periodic interval flush.
|
|
129
|
+
client = new PostHog(telemetryKey(), { host: telemetryHost(), flushAt: 20, flushInterval: 5000 });
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
client = null;
|
|
133
|
+
}
|
|
134
|
+
return client;
|
|
135
|
+
}
|
|
136
|
+
function baseProps() {
|
|
137
|
+
return {
|
|
138
|
+
surface,
|
|
139
|
+
version: appVersion,
|
|
140
|
+
node: process.version,
|
|
141
|
+
os: process.platform,
|
|
142
|
+
arch: process.arch,
|
|
143
|
+
ci: Boolean(process.env.CI),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Strip absolute home paths from any string before it leaves the machine. */
|
|
147
|
+
export function redactText(s) {
|
|
148
|
+
if (!s)
|
|
149
|
+
return s;
|
|
150
|
+
let out = s;
|
|
151
|
+
if (HOME)
|
|
152
|
+
out = out.split(HOME).join('~');
|
|
153
|
+
out = out.replace(/\/(?:Users|home)\/[^/\s]+/g, '~');
|
|
154
|
+
out = out.replace(/[A-Za-z]:\\Users\\[^\\\s]+/g, '~');
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
function sanitizeError(err) {
|
|
158
|
+
const original = err instanceof Error ? err : new Error(String(err));
|
|
159
|
+
const e = new Error(redactText(original.message));
|
|
160
|
+
e.name = original.name;
|
|
161
|
+
if (original.stack)
|
|
162
|
+
e.stack = redactText(original.stack);
|
|
163
|
+
return e;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Coarse error bucket. Driven by a numeric `status` when the error carries one
|
|
167
|
+
* (MCP ScanError), else by message patterns (CLI throws plain Errors). Order
|
|
168
|
+
* matters — status first, then transport, then semantic buckets.
|
|
169
|
+
*/
|
|
170
|
+
export function classifyError(err) {
|
|
171
|
+
const status = typeof err?.status === 'number' ? err.status : undefined;
|
|
172
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
173
|
+
if (status === 401 || status === 403)
|
|
174
|
+
return 'auth';
|
|
175
|
+
if (status === 402)
|
|
176
|
+
return 'quota';
|
|
177
|
+
if (status === 429)
|
|
178
|
+
return 'rate_limit';
|
|
179
|
+
if (status && status >= 500)
|
|
180
|
+
return 'api_5xx';
|
|
181
|
+
if (status && status >= 400)
|
|
182
|
+
return 'api_4xx';
|
|
183
|
+
if (/enotfound|econnrefused|econnreset|eai_again|fetch failed|network|socket hang|und_err/.test(msg))
|
|
184
|
+
return 'network';
|
|
185
|
+
if (/timed out|timeout|aborted|aborterror/.test(msg))
|
|
186
|
+
return 'timeout';
|
|
187
|
+
if (/authentication failed|unauthorized|api key|access denied|forbidden/.test(msg))
|
|
188
|
+
return 'auth';
|
|
189
|
+
if (/insufficient credits|out of .*credits|\bquota\b/.test(msg))
|
|
190
|
+
return 'quota';
|
|
191
|
+
if (/rate limit/.test(msg))
|
|
192
|
+
return 'rate_limit';
|
|
193
|
+
if (/artifact|not a file|file not found|exceeds .*mb|invalid .*(crx|xpi|zip)|magic|unsupported/.test(msg))
|
|
194
|
+
return 'invalid_artifact';
|
|
195
|
+
if (/http 4\d{2}/.test(msg))
|
|
196
|
+
return 'api_4xx';
|
|
197
|
+
if (/non-json response|http 5\d{2}|server returned/.test(msg))
|
|
198
|
+
return 'api_5xx';
|
|
199
|
+
return 'unexpected';
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The NAMES of long flags the user passed, with values stripped. `--out=/x`
|
|
203
|
+
* becomes `--out`; the separate-token value of `--output /x` is never a `--`
|
|
204
|
+
* token, so it is never collected. No flag VALUE can leak through here.
|
|
205
|
+
*/
|
|
206
|
+
export function flagsFromArgv(argv = process.argv.slice(2)) {
|
|
207
|
+
const flags = new Set();
|
|
208
|
+
for (const tok of argv) {
|
|
209
|
+
if (tok.startsWith('--'))
|
|
210
|
+
flags.add(tok.split('=')[0]);
|
|
211
|
+
}
|
|
212
|
+
return [...flags];
|
|
213
|
+
}
|
|
214
|
+
export function captureEvent(event, properties = {}) {
|
|
215
|
+
const c = getClient();
|
|
216
|
+
if (!c)
|
|
217
|
+
return;
|
|
218
|
+
try {
|
|
219
|
+
c.capture({ distinctId: anonId(), event, properties: { ...baseProps(), ...properties } });
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Telemetry must never throw into the command path.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export function captureError(err, context = {}) {
|
|
226
|
+
const c = getClient();
|
|
227
|
+
if (!c)
|
|
228
|
+
return;
|
|
229
|
+
try {
|
|
230
|
+
c.captureException(sanitizeError(err), anonId(), { ...baseProps(), ...context });
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Swallow — see captureEvent.
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function timeout(ms) {
|
|
237
|
+
return new Promise((resolve) => {
|
|
238
|
+
// unref so the flush timer can't keep a short-lived CLI process alive.
|
|
239
|
+
setTimeout(resolve, ms).unref();
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Flush buffered events and close the client. Hard-capped so a slow/hung
|
|
244
|
+
* PostHog endpoint can never delay the command's exit. Safe to call when
|
|
245
|
+
* telemetry is disabled (no-op) or more than once.
|
|
246
|
+
*/
|
|
247
|
+
export async function flushTelemetry() {
|
|
248
|
+
if (!client)
|
|
249
|
+
return;
|
|
250
|
+
const c = client;
|
|
251
|
+
client = null;
|
|
252
|
+
try {
|
|
253
|
+
await Promise.race([c.shutdown(2000), timeout(2500)]);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// Best-effort.
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Artifact safety gate — shared by the `scan` and `publish` commands.
|
|
3
|
+
*
|
|
4
|
+
* Before we read an extension package into memory, upload it to the scan
|
|
5
|
+
* backend, or push it to a store, we confirm it really is an extension
|
|
6
|
+
* archive:
|
|
7
|
+
*
|
|
8
|
+
* 1. the filename extension is one of .crx / .xpi / .zip, AND
|
|
9
|
+
* 2. the file's leading bytes are a ZIP (`PK\x03\x04`, or the empty-archive
|
|
10
|
+
* marker `PK\x05\x06`) or a CRX (`Cr24`) container — an .xpi is a ZIP.
|
|
11
|
+
*
|
|
12
|
+
* Anything else — an ELF/PE/Mach-O executable, a shell script, a gzip stream,
|
|
13
|
+
* an HTML error page — is refused outright: we never upload it or hand it on.
|
|
14
|
+
* The scan server enforces the same rule at its own boundary; this is a fast,
|
|
15
|
+
* local, defence-in-depth check so a non-extension never leaves the machine.
|
|
16
|
+
*
|
|
17
|
+
* This module is intentionally vendored (copied) into both @extenshi/cli and
|
|
18
|
+
* @extenshi/mcp rather than shared — npm rejects `workspace:*`, so each package
|
|
19
|
+
* stays independently publishable.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Throw unless `artifactPath` is a real extension package (.crx/.xpi/.zip whose
|
|
23
|
+
* leading bytes are a ZIP or CRX archive). Call this before reading, uploading,
|
|
24
|
+
* or publishing the file. Assumes the path already exists and is a regular file.
|
|
25
|
+
*/
|
|
26
|
+
export declare function assertValidArtifact(artifactPath: string): void;
|
|
27
|
+
//# sourceMappingURL=validate-artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-artifact.d.ts","sourceRoot":"","sources":["../src/validate-artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAgDH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA6B9D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Artifact safety gate — shared by the `scan` and `publish` commands.
|
|
3
|
+
*
|
|
4
|
+
* Before we read an extension package into memory, upload it to the scan
|
|
5
|
+
* backend, or push it to a store, we confirm it really is an extension
|
|
6
|
+
* archive:
|
|
7
|
+
*
|
|
8
|
+
* 1. the filename extension is one of .crx / .xpi / .zip, AND
|
|
9
|
+
* 2. the file's leading bytes are a ZIP (`PK\x03\x04`, or the empty-archive
|
|
10
|
+
* marker `PK\x05\x06`) or a CRX (`Cr24`) container — an .xpi is a ZIP.
|
|
11
|
+
*
|
|
12
|
+
* Anything else — an ELF/PE/Mach-O executable, a shell script, a gzip stream,
|
|
13
|
+
* an HTML error page — is refused outright: we never upload it or hand it on.
|
|
14
|
+
* The scan server enforces the same rule at its own boundary; this is a fast,
|
|
15
|
+
* local, defence-in-depth check so a non-extension never leaves the machine.
|
|
16
|
+
*
|
|
17
|
+
* This module is intentionally vendored (copied) into both @extenshi/cli and
|
|
18
|
+
* @extenshi/mcp rather than shared — npm rejects `workspace:*`, so each package
|
|
19
|
+
* stays independently publishable.
|
|
20
|
+
*/
|
|
21
|
+
import fs from 'node:fs';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
const ALLOWED_EXTENSIONS = new Set(['.crx', '.xpi', '.zip']);
|
|
24
|
+
/** Compare the head buffer against a byte signature. */
|
|
25
|
+
function startsWith(head, sig) {
|
|
26
|
+
if (head.length < sig.length)
|
|
27
|
+
return false;
|
|
28
|
+
for (let i = 0; i < sig.length; i++) {
|
|
29
|
+
if (head[i] !== sig[i])
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/** A ZIP local-file header `PK\x03\x04` or the empty-archive marker `PK\x05\x06`. */
|
|
35
|
+
function isZip(head) {
|
|
36
|
+
return startsWith(head, [0x50, 0x4b, 0x03, 0x04]) || startsWith(head, [0x50, 0x4b, 0x05, 0x06]);
|
|
37
|
+
}
|
|
38
|
+
/** The Chrome/Edge CRX container magic `Cr24`. */
|
|
39
|
+
function isCrx(head) {
|
|
40
|
+
return startsWith(head, [0x43, 0x72, 0x32, 0x34]);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Best-effort label for a clearer refusal message. NOT the security gate — the
|
|
44
|
+
* ZIP/CRX allow-list is. We only reach here for a file that is already rejected.
|
|
45
|
+
*/
|
|
46
|
+
function sniffNonArchive(head) {
|
|
47
|
+
const signatures = [
|
|
48
|
+
[[0x7f, 0x45, 0x4c, 0x46], 'an ELF executable'],
|
|
49
|
+
[[0x4d, 0x5a], 'a Windows PE executable'],
|
|
50
|
+
[[0xfe, 0xed, 0xfa, 0xce], 'a Mach-O executable'],
|
|
51
|
+
[[0xfe, 0xed, 0xfa, 0xcf], 'a Mach-O executable'],
|
|
52
|
+
[[0xce, 0xfa, 0xed, 0xfe], 'a Mach-O executable'],
|
|
53
|
+
[[0xcf, 0xfa, 0xed, 0xfe], 'a Mach-O executable'],
|
|
54
|
+
[[0xca, 0xfe, 0xba, 0xbe], 'a Mach-O or fat binary'],
|
|
55
|
+
[[0x23, 0x21], 'a script'],
|
|
56
|
+
[[0x1f, 0x8b], 'a gzip stream'],
|
|
57
|
+
];
|
|
58
|
+
for (const [sig, label] of signatures) {
|
|
59
|
+
if (startsWith(head, sig))
|
|
60
|
+
return label;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Throw unless `artifactPath` is a real extension package (.crx/.xpi/.zip whose
|
|
66
|
+
* leading bytes are a ZIP or CRX archive). Call this before reading, uploading,
|
|
67
|
+
* or publishing the file. Assumes the path already exists and is a regular file.
|
|
68
|
+
*/
|
|
69
|
+
export function assertValidArtifact(artifactPath) {
|
|
70
|
+
const ext = path.extname(artifactPath).toLowerCase();
|
|
71
|
+
if (!ALLOWED_EXTENSIONS.has(ext)) {
|
|
72
|
+
throw new Error(`Unsupported artifact type "${ext || '(no extension)'}". ` +
|
|
73
|
+
'Provide a packaged extension: .crx (Chrome/Edge), .xpi (Firefox), or .zip.');
|
|
74
|
+
}
|
|
75
|
+
// Read just the first 8 bytes — enough to identify the container.
|
|
76
|
+
const head = Buffer.alloc(8);
|
|
77
|
+
const fd = fs.openSync(artifactPath, 'r');
|
|
78
|
+
let bytesRead = 0;
|
|
79
|
+
try {
|
|
80
|
+
bytesRead = fs.readSync(fd, head, 0, 8, 0);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
fs.closeSync(fd);
|
|
84
|
+
}
|
|
85
|
+
const leading = head.subarray(0, bytesRead);
|
|
86
|
+
if (isZip(leading) || isCrx(leading))
|
|
87
|
+
return;
|
|
88
|
+
const detected = sniffNonArchive(leading);
|
|
89
|
+
throw new Error(`"${path.basename(artifactPath)}" is not a valid extension package — its contents are ` +
|
|
90
|
+
'not a ZIP or CRX archive' +
|
|
91
|
+
(detected ? ` (looks like ${detected})` : '') +
|
|
92
|
+
'. Refusing to process it.');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=validate-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-artifact.js","sourceRoot":"","sources":["../src/validate-artifact.ts"],"names":[],"mappings":"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"}
|