@somewhere-tech/cli 0.31.21 → 0.31.22
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 +0 -59
- package/dist/commands/check.js +1 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/init-install.js +12 -15
- package/dist/lib/init-install.js.map +1 -1
- package/dist/lib/notify/index.js +5 -8
- package/dist/lib/notify/index.js.map +1 -1
- package/dist/lib/temp-auth.js +1 -1
- package/npm-shrinkwrap.json +3 -5
- package/package.json +2 -4
- package/bin/swpm.js +0 -9
- package/bin/swpx.js +0 -9
- package/dist/commands/swpx.js +0 -43
- package/dist/commands/swpx.js.map +0 -1
- package/dist/lib/notify/providers/advisory.js +0 -30
- package/dist/lib/notify/providers/advisory.js.map +0 -1
- package/dist/swpm-bin.js +0 -11
- package/dist/swpm-bin.js.map +0 -1
- package/dist/swpx/check.js +0 -80
- package/dist/swpx/check.js.map +0 -1
- package/dist/swpx/enforce.js +0 -57
- package/dist/swpx/enforce.js.map +0 -1
- package/dist/swpx/registry.js +0 -68
- package/dist/swpx/registry.js.map +0 -1
- package/dist/swpx/render.js +0 -363
- package/dist/swpx/render.js.map +0 -1
- package/dist/swpx/run-common.js +0 -24
- package/dist/swpx/run-common.js.map +0 -1
- package/dist/swpx/run-swpm.js +0 -163
- package/dist/swpx/run-swpm.js.map +0 -1
- package/dist/swpx/run-swpx.js +0 -102
- package/dist/swpx/run-swpx.js.map +0 -1
- package/dist/swpx/spawn.js +0 -30
- package/dist/swpx/spawn.js.map +0 -1
- package/dist/swpx/tree.js +0 -101
- package/dist/swpx/tree.js.map +0 -1
- package/dist/swpx/types.js +0 -14
- package/dist/swpx/types.js.map +0 -1
- package/dist/swpx/verdict-client.js +0 -165
- package/dist/swpx/verdict-client.js.map +0 -1
- package/dist/swpx-bin.js +0 -20
- package/dist/swpx-bin.js.map +0 -1
package/dist/swpx/enforce.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/** Fail-open policy for swpx / swpm.
|
|
2
|
-
*
|
|
3
|
-
* Default is fail-OPEN (the verdict service being down must never break a
|
|
4
|
-
* build) — but never SILENTLY: when we can't verify, we print a loud warning so
|
|
5
|
-
* the developer always knows the check didn't run (a blocked check can be an
|
|
6
|
-
* attacker hiding malware, not just an outage). `enforce` flips it to
|
|
7
|
-
* fail-CLOSED for CI / security-conscious users. Precedence:
|
|
8
|
-
* --enforce / --no-enforce > SWPX_ENFORCE env > config.enforce > false */
|
|
9
|
-
import { loadConfig } from '../lib/config.js';
|
|
10
|
-
import { red, yellow, dim } from '../lib/output.js';
|
|
11
|
-
const OWN_FLAGS = new Set(['--enforce', '--no-enforce']);
|
|
12
|
-
/** Strip our own flags so they're never forwarded to npx/npm. */
|
|
13
|
-
export function stripEnforceFlags(args) {
|
|
14
|
-
return args.filter((a) => !OWN_FLAGS.has(a));
|
|
15
|
-
}
|
|
16
|
-
export function resolveEnforce(args) {
|
|
17
|
-
if (args.includes('--no-enforce'))
|
|
18
|
-
return false;
|
|
19
|
-
if (args.includes('--enforce'))
|
|
20
|
-
return true;
|
|
21
|
-
const env = process.env.SWPX_ENFORCE;
|
|
22
|
-
if (env === '1' || env === 'true')
|
|
23
|
-
return true;
|
|
24
|
-
if (env === '0' || env === 'false')
|
|
25
|
-
return false;
|
|
26
|
-
try {
|
|
27
|
-
return loadConfig()?.enforce === true;
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/** The LOUD "couldn't verify" block — printed to stderr, never silent. `cause` is
|
|
34
|
-
* the underlying reason (timeout / HTTP status / network error / bad body); we
|
|
35
|
-
* surface it so a timeout is distinguishable from an outage or a tamper — the
|
|
36
|
-
* thing this banner claims to care about must itself be debuggable. */
|
|
37
|
-
export function loudUnavailable(emit, pkg, rateLimited, cause) {
|
|
38
|
-
emit('');
|
|
39
|
-
if (rateLimited) {
|
|
40
|
-
emit(`${yellow('⚠')} Rate limited checking ${pkg} — the verdict service is throttling.`);
|
|
41
|
-
emit(` ${dim('Wait a moment and retry.')}`);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
emit(`${red('⚠')} COULD NOT VERIFY ${pkg} — the verdict service was unreachable.`);
|
|
45
|
-
emit(` ${dim('Running UNCHECKED (like plain npx/npm). Usually an outage — but a blocked')}`);
|
|
46
|
-
emit(` ${dim("check can also be malware hiding. If you didn't expect this, stop and retry.")}`);
|
|
47
|
-
if (cause)
|
|
48
|
-
emit(` ${dim(`Reason: ${cause}`)}`);
|
|
49
|
-
}
|
|
50
|
-
emit('');
|
|
51
|
-
}
|
|
52
|
-
/** Message when refusing to proceed under enforce (fail-closed). */
|
|
53
|
-
export function refused(emit, pkg, tool) {
|
|
54
|
-
emit(`${red('✖')} Refusing: could not verify ${pkg} and enforce is on.`);
|
|
55
|
-
emit(` ${dim(`Run real \`${tool}\` yourself to override, or set --no-enforce.`)}`);
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=enforce.js.map
|
package/dist/swpx/enforce.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/swpx/enforce.ts"],"names":[],"mappings":"AAAA;;;;;;;mFAOmF;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzD,iEAAiE;AACjE,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,UAAU,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;wEAGwE;AACxE,MAAM,UAAU,eAAe,CAC7B,IAAyB,EACzB,GAAW,EACX,WAAoB,EACpB,KAAc;IAEd,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,GAAG,uCAAuC,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAsB,GAAG,yCAAyC,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,GAAG,CAAC,2EAA2E,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,MAAM,GAAG,CAAC,8EAA8E,CAAC,EAAE,CAAC,CAAC;QAClG,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACX,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,OAAO,CAAC,IAAyB,EAAE,GAAW,EAAE,IAAmB;IACjF,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,+BAA+B,GAAG,qBAAqB,CAAC,CAAC;IACzE,IAAI,CAAC,KAAK,GAAG,CAAC,cAAc,IAAI,+CAA+C,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/swpx/registry.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/** npm registry resolution for swpx / swpm.
|
|
2
|
-
*
|
|
3
|
-
* We never download tarballs — npm's CDN does that (the whole point of the
|
|
4
|
-
* notary architecture). We only resolve a user-typed spec (`foo`, `foo@1.2.3`,
|
|
5
|
-
* `foo@^1`, `@scope/name@next`) to ONE concrete version so we can ask the
|
|
6
|
-
* verdict API about it. Resolution uses the abbreviated packument
|
|
7
|
-
* (application/vnd.npm.install-v1+json) and semver — npm's own resolver — so a
|
|
8
|
-
* range picks the same version npm would install.
|
|
9
|
-
*
|
|
10
|
-
* All network goes through an injectable `FetchLike` so the pure parsing and
|
|
11
|
-
* version-selection logic is unit-tested without hitting the registry. */
|
|
12
|
-
import semver from 'semver';
|
|
13
|
-
const REGISTRY = process.env.SWPX_REGISTRY?.replace(/\/$/, '') || 'https://registry.npmjs.org';
|
|
14
|
-
const defaultFetch = (url, init) => fetch(url, init);
|
|
15
|
-
/** Split a CLI spec into name + optional version/range/tag, handling scoped
|
|
16
|
-
* packages. `@scope/name@1.2.3` → { name: '@scope/name', version: '1.2.3' }. */
|
|
17
|
-
export function parseSpec(arg) {
|
|
18
|
-
const split = (at) => {
|
|
19
|
-
const version = arg.slice(at + 1);
|
|
20
|
-
return version ? { name: arg.slice(0, at), version } : { name: arg.slice(0, at) };
|
|
21
|
-
};
|
|
22
|
-
if (arg.startsWith('@')) {
|
|
23
|
-
const slash = arg.indexOf('/');
|
|
24
|
-
if (slash === -1)
|
|
25
|
-
return { name: arg }; // malformed scope — pass through
|
|
26
|
-
const at = arg.indexOf('@', slash + 1);
|
|
27
|
-
return at === -1 ? { name: arg } : split(at);
|
|
28
|
-
}
|
|
29
|
-
const at = arg.indexOf('@');
|
|
30
|
-
return at <= 0 ? { name: arg } : split(at);
|
|
31
|
-
}
|
|
32
|
-
/** Registry path segment for a package name (scoped slash → %2f, @ kept). */
|
|
33
|
-
function registryName(name) {
|
|
34
|
-
return name.startsWith('@') ? name.replace('/', '%2f') : name;
|
|
35
|
-
}
|
|
36
|
-
export async function fetchPackument(name, fetchImpl = defaultFetch) {
|
|
37
|
-
const res = await fetchImpl(`${REGISTRY}/${registryName(name)}`, {
|
|
38
|
-
headers: { Accept: 'application/vnd.npm.install-v1+json' },
|
|
39
|
-
});
|
|
40
|
-
if (!res.ok)
|
|
41
|
-
throw new Error(`npm registry returned ${res.status} for ${name}`);
|
|
42
|
-
return (await res.json());
|
|
43
|
-
}
|
|
44
|
-
/** Resolve a spec's version field to a single concrete version.
|
|
45
|
-
* - exact valid version → returned as-is (no network).
|
|
46
|
-
* - undefined → the `latest` dist-tag.
|
|
47
|
-
* - a dist-tag (next, beta…) → that tag's version.
|
|
48
|
-
* - a range (^1, ~2.3, >=1 <2) → the greatest published version that satisfies. */
|
|
49
|
-
export async function resolveVersion(name, version, fetchImpl = defaultFetch) {
|
|
50
|
-
if (version && semver.valid(version))
|
|
51
|
-
return version;
|
|
52
|
-
const pack = await fetchPackument(name, fetchImpl);
|
|
53
|
-
const tags = pack['dist-tags'] ?? {};
|
|
54
|
-
const versions = Object.keys(pack.versions ?? {});
|
|
55
|
-
if (!version) {
|
|
56
|
-
const latest = tags.latest ?? semver.maxSatisfying(versions, '*', { includePrerelease: false });
|
|
57
|
-
if (!latest)
|
|
58
|
-
throw new Error(`no published versions for ${name}`);
|
|
59
|
-
return latest;
|
|
60
|
-
}
|
|
61
|
-
if (tags[version])
|
|
62
|
-
return tags[version];
|
|
63
|
-
const match = semver.maxSatisfying(versions, version, { includePrerelease: false });
|
|
64
|
-
if (match)
|
|
65
|
-
return match;
|
|
66
|
-
throw new Error(`no version of ${name} satisfies "${version}"`);
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/swpx/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/swpx/render.js
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
/** Pure renderers for the swpx / swpm / check output.
|
|
2
|
-
*
|
|
3
|
-
* Every string here is byte-matched to the terminal examples on
|
|
4
|
-
* npm.somewhere.tech, which the spec (tsk_f30faf55) names as the source of
|
|
5
|
-
* truth for CLI output. These functions take a Verdict and return lines — they
|
|
6
|
-
* never touch the console — so they are unit-tested directly against the
|
|
7
|
-
* landing-page examples (test/swpx-render.test.mjs). The command layer
|
|
8
|
-
* (run-swpx / run-swpm / check) prints them.
|
|
9
|
-
*
|
|
10
|
-
* Color is applied via the shared output helpers; tests strip ANSI before
|
|
11
|
-
* asserting, so the assertions read the plain text. */
|
|
12
|
-
import { dim, green, red, yellow } from '../lib/output.js';
|
|
13
|
-
/** blocked → block; verified → run; EVERYTHING ELSE → stop.
|
|
14
|
-
* Fail safe: only an explicit `verified` runs. unverified/suspicious and any
|
|
15
|
-
* unrecognized or future level (a malformed row, `"Blocked "`, a new backend
|
|
16
|
-
* level like `"quarantined"`) get a soft stop, never a silent run. */
|
|
17
|
-
export function decide(v) {
|
|
18
|
-
if (v.verdict === 'blocked')
|
|
19
|
-
return 'block';
|
|
20
|
-
if (v.verdict === 'verified')
|
|
21
|
-
return 'run';
|
|
22
|
-
return 'stop';
|
|
23
|
-
}
|
|
24
|
-
function checkMark(level) {
|
|
25
|
-
if (level === 'ok')
|
|
26
|
-
return green('✓');
|
|
27
|
-
if (level === 'bad')
|
|
28
|
-
return red('✖');
|
|
29
|
-
return yellow('⚠');
|
|
30
|
-
}
|
|
31
|
-
/** 1400622 → "1.4M", 11000 → "11k", 11 → "11". */
|
|
32
|
-
function humanizeDownloads(n) {
|
|
33
|
-
if (n >= 1_000_000_000)
|
|
34
|
-
return `${(n / 1_000_000_000).toFixed(1).replace(/\.0$/, '')}B`;
|
|
35
|
-
if (n >= 1_000_000)
|
|
36
|
-
return `${(n / 1_000_000).toFixed(1).replace(/\.0$/, '')}M`;
|
|
37
|
-
if (n >= 10_000)
|
|
38
|
-
return `${Math.round(n / 1000)}k`;
|
|
39
|
-
if (n >= 1_000)
|
|
40
|
-
return `${(n / 1000).toFixed(1).replace(/\.0$/, '')}k`;
|
|
41
|
-
return String(n);
|
|
42
|
-
}
|
|
43
|
-
/** 0.3 → "18m", 5 → "5h", 50 → "2d", 1500 → "2mo". (Uses the existing
|
|
44
|
-
* ageHours() helper defined below for the hours value.) */
|
|
45
|
-
function humanizeAge(h) {
|
|
46
|
-
if (h < 1)
|
|
47
|
-
return `${Math.max(1, Math.round(h * 60))}m`;
|
|
48
|
-
if (h < 48)
|
|
49
|
-
return `${Math.round(h)}h`;
|
|
50
|
-
const d = h / 24;
|
|
51
|
-
if (d < 60)
|
|
52
|
-
return `${Math.round(d)}d`;
|
|
53
|
-
const mo = d / 30;
|
|
54
|
-
return mo < 24 ? `${Math.round(mo)}mo` : `${Math.round(d / 365)}y`;
|
|
55
|
-
}
|
|
56
|
-
/** "20 verified · 2 flagged · 6 not yet checked" from the enrich breakdown
|
|
57
|
-
* counts, or null when the counts aren't present (a pre-enrich row). */
|
|
58
|
-
function depBreakdown(v) {
|
|
59
|
-
const verified = v.dep_verified;
|
|
60
|
-
const unknown = v.dep_unknown;
|
|
61
|
-
if (typeof verified !== 'number' && typeof unknown !== 'number')
|
|
62
|
-
return null;
|
|
63
|
-
const flagged = (v.dependency_flags ?? []).length;
|
|
64
|
-
const bits = [];
|
|
65
|
-
if (typeof verified === 'number')
|
|
66
|
-
bits.push(`${verified} verified`);
|
|
67
|
-
if (flagged)
|
|
68
|
-
bits.push(`${flagged} flagged`);
|
|
69
|
-
if (typeof unknown === 'number' && unknown > 0)
|
|
70
|
-
bits.push(`${unknown} not yet checked`);
|
|
71
|
-
return bits.join(' · ') || null;
|
|
72
|
-
}
|
|
73
|
-
/** The per-dimension evidence rows — "show the work, evidence not a grade".
|
|
74
|
-
* Every check the verdict layer ran becomes a row: ok (green ✓), warn
|
|
75
|
-
* (yellow ⚠), or bad (red ✖). A clean package reads as a wall of green with the
|
|
76
|
-
* one honest ⚠; a sketchy one's red/yellow stands out immediately. Rows are
|
|
77
|
-
* omitted only when the signal genuinely wasn't checked (e.g. GitHub tag with
|
|
78
|
-
* no repo, description match before the LLM backfill ran). */
|
|
79
|
-
export function buildChecks(v) {
|
|
80
|
-
const checks = [];
|
|
81
|
-
const dl = v.weekly_downloads;
|
|
82
|
-
if (typeof dl === 'number' && dl > 0) {
|
|
83
|
-
checks.push({ level: dl >= 1000 ? 'ok' : 'warn', text: `${humanizeDownloads(dl)} weekly downloads` });
|
|
84
|
-
}
|
|
85
|
-
if (v.publisher) {
|
|
86
|
-
const pc = v.author_package_count;
|
|
87
|
-
const adl = v.author_total_downloads;
|
|
88
|
-
const bits = [];
|
|
89
|
-
if (typeof pc === 'number' && pc > 0)
|
|
90
|
-
bits.push(`${pc} package${pc === 1 ? '' : 's'}`);
|
|
91
|
-
if (typeof adl === 'number' && adl > 0)
|
|
92
|
-
bits.push(`${humanizeDownloads(adl)} combined`);
|
|
93
|
-
const detail = bits.length ? ` (${bits.join(', ')})` : '';
|
|
94
|
-
// A single-package (or brand-new) author is a caution; an established one reassures.
|
|
95
|
-
checks.push({ level: typeof pc === 'number' && pc <= 1 ? 'warn' : 'ok', text: `Author: ${v.publisher}${detail}` });
|
|
96
|
-
}
|
|
97
|
-
if (v.license) {
|
|
98
|
-
checks.push({ level: 'ok', text: `${v.license} licensed` });
|
|
99
|
-
}
|
|
100
|
-
if (v.maintainer_changed === true) {
|
|
101
|
-
checks.push({
|
|
102
|
-
level: 'warn',
|
|
103
|
-
text: `Publisher changed since previous release${v.previous_publisher ? ` (was ${v.previous_publisher})` : ''}`,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else if (v.maintainer_changed === false) {
|
|
107
|
-
checks.push({ level: 'ok', text: 'Same publisher as previous release' });
|
|
108
|
-
}
|
|
109
|
-
const ageH = ageHours(v.publish_time);
|
|
110
|
-
if (ageH != null) {
|
|
111
|
-
checks.push(ageH < 24
|
|
112
|
-
? { level: 'warn', text: `Published ${humanizeAge(ageH)} ago (too new to be vetted)` }
|
|
113
|
-
: { level: 'ok', text: `Published ${humanizeAge(ageH)} ago` });
|
|
114
|
-
}
|
|
115
|
-
if (v.has_install_scripts) {
|
|
116
|
-
const t = (v.install_script_types ?? []).filter(Boolean)[0];
|
|
117
|
-
checks.push({ level: 'bad', text: t ? `Has ${t} script` : 'Has install scripts' });
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
checks.push({ level: 'ok', text: 'No install scripts' });
|
|
121
|
-
}
|
|
122
|
-
checks.push(v.is_minified ? { level: 'bad', text: 'Minified (unreadable)' } : { level: 'ok', text: 'Readable source' });
|
|
123
|
-
const caps = (v.capabilities ?? []).filter(Boolean);
|
|
124
|
-
checks.push(caps.length ? { level: 'warn', text: caps.join(', ') } : { level: 'ok', text: 'No system access' });
|
|
125
|
-
if (Array.isArray(v.dependencies)) {
|
|
126
|
-
const deps = v.dependencies;
|
|
127
|
-
const flags = Array.isArray(v.dependency_flags) ? v.dependency_flags : null;
|
|
128
|
-
const breakdown = depBreakdown(v);
|
|
129
|
-
const checked = Math.min(deps.length, 50);
|
|
130
|
-
if (deps.length === 0) {
|
|
131
|
-
checks.push({ level: 'ok', text: 'No dependencies' });
|
|
132
|
-
}
|
|
133
|
-
else if (flags && flags.length) {
|
|
134
|
-
// Some dependency is known-bad — name them, with the verified/not-yet-
|
|
135
|
-
// checked context when the enrich breakdown is available.
|
|
136
|
-
const list = flags.map((d) => `${d.name} (${d.verdict})`).join(', ');
|
|
137
|
-
const level = flags.some((d) => d.verdict === 'blocked') ? 'bad' : 'warn';
|
|
138
|
-
checks.push({
|
|
139
|
-
level,
|
|
140
|
-
text: breakdown ? `${deps.length} dependencies — ${breakdown}: ${list}` : `${flags.length} of ${checked} flagged: ${list}`,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
else if (breakdown) {
|
|
144
|
-
// Enrich ran: show the real verified / not-yet-checked split.
|
|
145
|
-
checks.push({ level: 'ok', text: `${deps.length} dependencies — ${breakdown}` });
|
|
146
|
-
}
|
|
147
|
-
else if (flags) {
|
|
148
|
-
// Flags array present but empty, no counts yet: bad ones surfaced, but
|
|
149
|
-
// uncached deps are unknown — "none flagged", not "all verified".
|
|
150
|
-
checks.push({ level: 'ok', text: `${checked} dependenc${checked === 1 ? 'y' : 'ies'}, none flagged` });
|
|
151
|
-
}
|
|
152
|
-
else if (deps.length <= 5) {
|
|
153
|
-
checks.push({ level: 'ok', text: `${deps.length} dependenc${deps.length === 1 ? 'y' : 'ies'}: ${deps.join(', ')}` });
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
checks.push({ level: 'ok', text: `${deps.length} dependencies` });
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
const mals = v.mal ?? [];
|
|
160
|
-
const compromised = v.compromised_history ?? [];
|
|
161
|
-
if (compromised.length) {
|
|
162
|
-
const date = compromised[0]?.published ? compromised[0].published.slice(0, 7) : 'unknown date';
|
|
163
|
-
checks.push({
|
|
164
|
-
level: 'warn',
|
|
165
|
-
text: `Compromised ${date}${mals.length ? '' : ' (current version clean)'}`,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
if (typeof v.known_cves === 'number') {
|
|
169
|
-
checks.push(v.known_cves > 0
|
|
170
|
-
? { level: 'warn', text: `${v.known_cves} known CVE${v.known_cves === 1 ? '' : 's'}` }
|
|
171
|
-
: { level: 'ok', text: 'No known CVEs' });
|
|
172
|
-
}
|
|
173
|
-
if (mals.length) {
|
|
174
|
-
const m = mals[0];
|
|
175
|
-
checks.push({ level: 'bad', text: m.summary ? `${m.id}: ${m.summary}` : `${m.id} advisory` });
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
checks.push({ level: 'ok', text: 'No advisories' });
|
|
179
|
-
}
|
|
180
|
-
if (v.typosquat_of) {
|
|
181
|
-
const d = v.typosquat_distance != null ? ` (distance ${v.typosquat_distance})` : '';
|
|
182
|
-
checks.push({ level: 'bad', text: `Possible typosquat of ${v.typosquat_of}${d}` });
|
|
183
|
-
}
|
|
184
|
-
if (v.has_github_tag === 1)
|
|
185
|
-
checks.push({ level: 'ok', text: 'GitHub tag exists' });
|
|
186
|
-
else if (v.has_github_tag === 0)
|
|
187
|
-
checks.push({ level: 'warn', text: 'No GitHub tag' });
|
|
188
|
-
if (v.repo_archived === true)
|
|
189
|
-
checks.push({ level: 'warn', text: 'Source repo is archived' });
|
|
190
|
-
const lastCommitH = ageHours(v.repo_last_commit);
|
|
191
|
-
if (lastCommitH != null) {
|
|
192
|
-
const stale = lastCommitH > 365 * 24;
|
|
193
|
-
const issues = typeof v.repo_open_issues === 'number' ? `, ${v.repo_open_issues} open issue${v.repo_open_issues === 1 ? '' : 's'}` : '';
|
|
194
|
-
checks.push({ level: stale ? 'warn' : 'ok', text: `Repo last updated ${humanizeAge(lastCommitH)} ago${issues}` });
|
|
195
|
-
}
|
|
196
|
-
checks.push(v.has_provenance
|
|
197
|
-
? { level: 'ok', text: 'Provenance verified' }
|
|
198
|
-
: { level: 'warn', text: 'No provenance' });
|
|
199
|
-
if (v.description_match === 'match') {
|
|
200
|
-
checks.push({ level: 'ok', text: 'Matches description' });
|
|
201
|
-
}
|
|
202
|
-
else if (v.description_match === 'mismatch') {
|
|
203
|
-
checks.push({ level: 'bad', text: v.description ? `Doesn't match: "${v.description}"` : "Doesn't match its description" });
|
|
204
|
-
}
|
|
205
|
-
return checks;
|
|
206
|
-
}
|
|
207
|
-
/** The verbose, color-coded checklist for one package — header marked by the
|
|
208
|
-
* overall verdict (✓/⚠/✖), then every check as its own row. */
|
|
209
|
-
export function renderChecklist(v) {
|
|
210
|
-
const out = [`${mark(v.verdict)} ${v.package}@${v.version}`];
|
|
211
|
-
for (const c of buildChecks(v))
|
|
212
|
-
out.push(` ${checkMark(c.level)} ${c.text}`);
|
|
213
|
-
return out;
|
|
214
|
-
}
|
|
215
|
-
/** Word-wrap a paragraph to `width` columns (the narrative reads as prose). */
|
|
216
|
-
function wrap(text, width = 76) {
|
|
217
|
-
const lines = [];
|
|
218
|
-
let cur = '';
|
|
219
|
-
for (const word of text.split(/\s+/).filter(Boolean)) {
|
|
220
|
-
if (cur && cur.length + 1 + word.length > width) {
|
|
221
|
-
lines.push(cur);
|
|
222
|
-
cur = word;
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
cur = cur ? `${cur} ${word}` : word;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (cur)
|
|
229
|
-
lines.push(cur);
|
|
230
|
-
return lines;
|
|
231
|
-
}
|
|
232
|
-
/** Full single-package output: the LLM narrative as the headline (when present),
|
|
233
|
-
* the checklist as the receipts, the GitHub link, and a state-specific footer
|
|
234
|
-
* (how to override on a stop; the malware warning + safe versions on a block). */
|
|
235
|
-
export function renderVerdict(v) {
|
|
236
|
-
const out = [`${mark(v.verdict)} ${v.package}@${v.version}`];
|
|
237
|
-
// The narrative is the judgment — show it first, in prose, so a glance decides.
|
|
238
|
-
if (v.summary) {
|
|
239
|
-
out.push('');
|
|
240
|
-
for (const l of wrap(v.summary))
|
|
241
|
-
out.push(` ${l}`);
|
|
242
|
-
out.push('');
|
|
243
|
-
}
|
|
244
|
-
for (const c of buildChecks(v))
|
|
245
|
-
out.push(` ${checkMark(c.level)} ${c.text}`);
|
|
246
|
-
if (v.github_repo)
|
|
247
|
-
out.push(` ${dim(`→ ${v.github_repo}`)}`);
|
|
248
|
-
const action = decide(v);
|
|
249
|
-
if (action === 'block') {
|
|
250
|
-
const first = (v.mal ?? [])[0];
|
|
251
|
-
const safe = first?.safe_versions ?? [];
|
|
252
|
-
if (safe.length) {
|
|
253
|
-
out.push(` ${dim('Safe versions:')} ${safe.map((s) => green(`${v.package}@${s}`)).join(', ')}`);
|
|
254
|
-
}
|
|
255
|
-
out.push(` ${red('Confirmed malware. Do not install.')}`);
|
|
256
|
-
}
|
|
257
|
-
else if (action === 'stop') {
|
|
258
|
-
out.push(` ${dim(`Run npx ${v.package} to proceed unverified.`)}`);
|
|
259
|
-
}
|
|
260
|
-
return out;
|
|
261
|
-
}
|
|
262
|
-
/** Back-compat name used by the check command + bin. */
|
|
263
|
-
export function renderSingle(v) {
|
|
264
|
-
return renderVerdict(v);
|
|
265
|
-
}
|
|
266
|
-
/** Compact reason string for a row in the tree summary.
|
|
267
|
-
* e.g. "minified, no provenance" / "no provenance, has postinstall" / a MAL id. */
|
|
268
|
-
export function shortReasons(v) {
|
|
269
|
-
if (v.verdict === 'blocked')
|
|
270
|
-
return (v.mal ?? [])[0]?.id ?? 'confirmed malware';
|
|
271
|
-
const r = [];
|
|
272
|
-
if (v.is_minified)
|
|
273
|
-
r.push('minified');
|
|
274
|
-
if (v.has_provenance === false)
|
|
275
|
-
r.push('no provenance');
|
|
276
|
-
if (v.has_install_scripts) {
|
|
277
|
-
const t = (v.install_script_types ?? []).filter(Boolean)[0];
|
|
278
|
-
r.push(t ? `has ${t}` : 'has install scripts');
|
|
279
|
-
}
|
|
280
|
-
if (v.typosquat_of)
|
|
281
|
-
r.push(`typosquat of ${v.typosquat_of}`);
|
|
282
|
-
if (v.description_match === 'mismatch')
|
|
283
|
-
r.push('description mismatch');
|
|
284
|
-
if (v.has_github_tag === 0)
|
|
285
|
-
r.push('no github tag');
|
|
286
|
-
return r.join(', ') || 'unverified';
|
|
287
|
-
}
|
|
288
|
-
const isVerified = (v) => v.verdict === 'verified';
|
|
289
|
-
const isBlocked = (v) => v.verdict === 'blocked';
|
|
290
|
-
/** The full `swpm install` tree summary. `directCount` is how many of `items`
|
|
291
|
-
* are direct (top-level) dependencies; the rest count as transitive. */
|
|
292
|
-
export function renderTree(items, directCount, expandedSummaryKeys = new Set()) {
|
|
293
|
-
const total = items.length;
|
|
294
|
-
const transitive = Math.max(0, total - directCount);
|
|
295
|
-
const verified = items.filter(isVerified);
|
|
296
|
-
const blocked = items.filter(isBlocked);
|
|
297
|
-
const unverified = items.filter((v) => !isVerified(v) && !isBlocked(v));
|
|
298
|
-
const out = [];
|
|
299
|
-
out.push(`Checking ${total} package${total === 1 ? '' : 's'} (${directCount} direct, ${transitive} transitive)`);
|
|
300
|
-
out.push(` ${green('✓')} ${String(verified.length).padStart(2)} verified`);
|
|
301
|
-
const branchList = (rows) => {
|
|
302
|
-
rows.forEach((v, i) => {
|
|
303
|
-
const branch = i === rows.length - 1 ? '└' : '├';
|
|
304
|
-
out.push(` ${branch} ${v.package}@${v.version} — ${shortReasons(v)}`);
|
|
305
|
-
if (v.summary) {
|
|
306
|
-
for (const line of wrap(v.summary, 68))
|
|
307
|
-
out.push(` ${dim(line)}`);
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
};
|
|
311
|
-
// Verified rows are normally collapsed into the count above. When swpm just
|
|
312
|
-
// waited for a direct package's narrative, expand that row so the generated
|
|
313
|
-
// result is actually visible before npm takes over.
|
|
314
|
-
const expandedVerified = verified.filter((v) => expandedSummaryKeys.has(`${v.package}@${v.version}`) && v.summary?.trim());
|
|
315
|
-
if (expandedVerified.length)
|
|
316
|
-
branchList(expandedVerified);
|
|
317
|
-
if (unverified.length) {
|
|
318
|
-
out.push(` ${yellow('⚠')} ${String(unverified.length).padStart(2)} unverified`);
|
|
319
|
-
branchList(unverified);
|
|
320
|
-
}
|
|
321
|
-
if (blocked.length) {
|
|
322
|
-
out.push(` ${red('✖')} ${String(blocked.length).padStart(2)} blocked`);
|
|
323
|
-
branchList(blocked);
|
|
324
|
-
out.push(' Remove or replace blocked packages to continue.');
|
|
325
|
-
out.push(' Run npm install to bypass all checks.');
|
|
326
|
-
}
|
|
327
|
-
return out;
|
|
328
|
-
}
|
|
329
|
-
function ageHours(publishTime) {
|
|
330
|
-
if (!publishTime)
|
|
331
|
-
return null;
|
|
332
|
-
const t = new Date(publishTime).getTime();
|
|
333
|
-
if (!Number.isFinite(t))
|
|
334
|
-
return null;
|
|
335
|
-
return Math.max(0, Math.round((Date.now() - t) / 3_600_000));
|
|
336
|
-
}
|
|
337
|
-
/** The stable `--json` projection shown on the landing page. */
|
|
338
|
-
export function toJsonVerdict(v) {
|
|
339
|
-
return {
|
|
340
|
-
package: v.package,
|
|
341
|
-
version: v.version,
|
|
342
|
-
verdict: v.verdict,
|
|
343
|
-
signals: {
|
|
344
|
-
provenance: v.has_provenance === true,
|
|
345
|
-
readable: v.is_minified !== true,
|
|
346
|
-
install_scripts: v.install_script_types ?? [],
|
|
347
|
-
capabilities: v.capabilities ?? [],
|
|
348
|
-
description_match: v.description_match === 'match',
|
|
349
|
-
mal_advisories: (v.mal ?? []).map((m) => m.id),
|
|
350
|
-
typosquat_distance: v.typosquat_distance ?? null,
|
|
351
|
-
age_hours: ageHours(v.publish_time),
|
|
352
|
-
},
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
/** Map a verdict level to the single mark used in compact contexts. */
|
|
356
|
-
export function mark(level) {
|
|
357
|
-
if (level === 'verified')
|
|
358
|
-
return green('✓');
|
|
359
|
-
if (level === 'blocked')
|
|
360
|
-
return red('✖');
|
|
361
|
-
return yellow('⚠');
|
|
362
|
-
}
|
|
363
|
-
//# sourceMappingURL=render.js.map
|
package/dist/swpx/render.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/swpx/render.ts"],"names":[],"mappings":"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"}
|
package/dist/swpx/run-common.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/** Shared dependency-injection seam for the three run functions
|
|
2
|
-
* (run-swpx / run-swpm / check). Every external effect — registry resolution,
|
|
3
|
-
* the verdict API, spawning the real tool, reading the lockfile, and the two
|
|
4
|
-
* output streams — is overridable, so the orchestration logic is unit-tested
|
|
5
|
-
* with spies and never touches the network or spawns a process. Production
|
|
6
|
-
* callers pass `{}` and get the real implementations. */
|
|
7
|
-
import { resolveVersion as realResolveVersion } from './registry.js';
|
|
8
|
-
import { getVerdict as realGetVerdict, getVerdictBatch as realGetVerdictBatch, pollVerdictSummary as realPollVerdictSummary, } from './verdict-client.js';
|
|
9
|
-
import { runReal as realRunReal } from './spawn.js';
|
|
10
|
-
import { readTree as realReadTree } from './tree.js';
|
|
11
|
-
export function bindDeps(deps) {
|
|
12
|
-
return {
|
|
13
|
-
resolveVersion: deps.resolveVersion ?? ((n, v) => realResolveVersion(n, v)),
|
|
14
|
-
getVerdict: deps.getVerdict ?? ((n, v) => realGetVerdict(n, v)),
|
|
15
|
-
getVerdictBatch: deps.getVerdictBatch ?? ((p) => realGetVerdictBatch(p)),
|
|
16
|
-
pollVerdictSummary: deps.pollVerdictSummary ?? ((n, v) => realPollVerdictSummary(n, v)),
|
|
17
|
-
runReal: deps.runReal ?? realRunReal,
|
|
18
|
-
readTree: deps.readTree ?? realReadTree,
|
|
19
|
-
log: deps.log ?? ((s) => console.log(s)),
|
|
20
|
-
errLog: deps.errLog ?? ((s) => console.error(s)),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export const msg = (e) => (e instanceof Error ? e.message : String(e));
|
|
24
|
-
//# sourceMappingURL=run-common.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-common.js","sourceRoot":"","sources":["../../src/swpx/run-common.ts"],"names":[],"mappings":"AAAA;;;;;0DAK0D;AAE1D,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,UAAU,IAAI,cAAc,EAC5B,eAAe,IAAI,mBAAmB,EACtC,kBAAkB,IAAI,sBAAsB,GAC7C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAqB,MAAM,WAAW,CAAC;AA8BxE,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACxE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,YAAY;QACvC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
|