@somewhere-tech/cli 0.31.20 → 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/browser.js +2 -3
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/check.js +1 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/deploy.js +5 -0
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/typecheck.js +7 -7
- package/dist/commands/typecheck.js.map +1 -1
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/init-agent-guide.js +4 -4
- 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/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"}
|
package/dist/swpx/run-swpm.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/** `swpm <args...>` — the verdict gate in front of `npm`.
|
|
2
|
-
*
|
|
3
|
-
* Only install-family subcommands are gated (install/i/add/ci); everything else
|
|
4
|
-
* (run, test, publish, …) passes straight through to npm untouched. For an
|
|
5
|
-
* install we batch-check the resolved tree and print the summary, then:
|
|
6
|
-
* - any BLOCKED package → stop, exit 1, don't install.
|
|
7
|
-
* - otherwise → run the real npm install (unverified rows warn but
|
|
8
|
-
* don't gate every install).
|
|
9
|
-
* Couldn't verify (unreachable / unresolvable tree) → LOUD warning then fall
|
|
10
|
-
* back to npm, OR refuse under enforce. Summary goes to stderr; npm owns stdout. */
|
|
11
|
-
import { parseSpec } from './registry.js';
|
|
12
|
-
import { renderTree } from './render.js';
|
|
13
|
-
import { bindDeps } from './run-common.js';
|
|
14
|
-
import { dim, yellow } from '../lib/output.js';
|
|
15
|
-
import { resolveEnforce, stripEnforceFlags, loudUnavailable, refused } from './enforce.js';
|
|
16
|
-
import { VerdictUnavailable } from './verdict-client.js';
|
|
17
|
-
/** npm's own install aliases (including its built-in typo aliases). */
|
|
18
|
-
const INSTALL_SUBS = new Set(['install', 'i', 'in', 'ins', 'add', 'ci', 'isntall']);
|
|
19
|
-
function alignVerdicts(toCheck, verdicts) {
|
|
20
|
-
const byKey = new Map(verdicts.map((v) => [`${v.package}@${v.version}`, v]));
|
|
21
|
-
// A row the service didn't return is "unknown" → surfaced as unverified, never
|
|
22
|
-
// silently counted as verified.
|
|
23
|
-
return toCheck.map((t) => byKey.get(`${t.package}@${t.version}`) ?? {
|
|
24
|
-
package: t.package,
|
|
25
|
-
version: t.version,
|
|
26
|
-
verdict: 'unverified',
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
export async function runSwpm(args, deps = {}) {
|
|
30
|
-
const d = bindDeps(deps);
|
|
31
|
-
const enforce = deps.enforce ?? resolveEnforce(args);
|
|
32
|
-
const clean = stripEnforceFlags(args);
|
|
33
|
-
// npm accepts config flags (and a `--` terminator) BEFORE the subcommand, so the
|
|
34
|
-
// command is the first non-flag token, not necessarily clean[0]. Keying off
|
|
35
|
-
// clean[0] let `swpm -g install evil` / `swpm -- install evil` skip the gate
|
|
36
|
-
// silently. (Residual: a value-flag whose value precedes the sub, e.g.
|
|
37
|
-
// `swpm --prefix /x install`, can still hide it — needs npm's flag schema.)
|
|
38
|
-
const subIdx = clean.findIndex((a) => !a.startsWith('-'));
|
|
39
|
-
const sub = subIdx === -1 ? undefined : clean[subIdx];
|
|
40
|
-
if (!sub || !INSTALL_SUBS.has(sub)) {
|
|
41
|
-
return { exitCode: await d.runReal('npm', clean), action: 'passthrough' };
|
|
42
|
-
}
|
|
43
|
-
// Couldn't verify the tree → LOUD, then fall back (default) or refuse (enforce).
|
|
44
|
-
const failOpen = async (rateLimited, cause, timedOut = false) => {
|
|
45
|
-
if (timedOut) {
|
|
46
|
-
d.errLog(`${yellow('⚠')} verdict pending — proceeding with npm install without waiting for a result.`);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
loudUnavailable(d.errLog, 'this install', rateLimited, cause);
|
|
50
|
-
}
|
|
51
|
-
if (enforce) {
|
|
52
|
-
refused(d.errLog, 'this install', 'npm');
|
|
53
|
-
return { exitCode: 1, action: 'blocked' };
|
|
54
|
-
}
|
|
55
|
-
return { exitCode: await d.runReal('npm', clean), action: 'fallback' };
|
|
56
|
-
};
|
|
57
|
-
const causeOf = (err) => (err instanceof Error ? err.message : String(err));
|
|
58
|
-
const explicit = clean.slice(subIdx + 1).filter((a) => !a.startsWith('-'));
|
|
59
|
-
let toCheck = [];
|
|
60
|
-
let directCount = 0;
|
|
61
|
-
const directPackageNames = new Set();
|
|
62
|
-
try {
|
|
63
|
-
if (explicit.length) {
|
|
64
|
-
toCheck = await Promise.all(explicit.map(async (a) => {
|
|
65
|
-
const s = parseSpec(a);
|
|
66
|
-
return { package: s.name, version: await d.resolveVersion(s.name, s.version) };
|
|
67
|
-
}));
|
|
68
|
-
directCount = toCheck.length;
|
|
69
|
-
for (const pkg of toCheck)
|
|
70
|
-
directPackageNames.add(pkg.package);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
const tree = d.readTree(process.cwd());
|
|
74
|
-
for (const name of tree.directNames)
|
|
75
|
-
directPackageNames.add(name);
|
|
76
|
-
if (tree.locked.length) {
|
|
77
|
-
toCheck = tree.locked;
|
|
78
|
-
const directSet = new Set(tree.directNames);
|
|
79
|
-
directCount = tree.locked.filter((l) => directSet.has(l.package)).length;
|
|
80
|
-
// A dep added to package.json AFTER the lockfile was written isn't in
|
|
81
|
-
// `locked`, but `npm install` will add it — resolve + check those too, or
|
|
82
|
-
// they'd install unchecked behind a clean "N verified" summary.
|
|
83
|
-
const lockedNames = new Set(tree.locked.map((l) => l.package));
|
|
84
|
-
const missing = tree.directNames.filter((n) => !lockedNames.has(n));
|
|
85
|
-
if (missing.length) {
|
|
86
|
-
const extra = await Promise.all(missing.map(async (name) => ({
|
|
87
|
-
package: name,
|
|
88
|
-
version: await d.resolveVersion(name, tree.ranges[name]),
|
|
89
|
-
})));
|
|
90
|
-
toCheck = [...toCheck, ...extra];
|
|
91
|
-
directCount += extra.length;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
else if (tree.directNames.length) {
|
|
95
|
-
toCheck = await Promise.all(tree.directNames.map(async (name) => ({
|
|
96
|
-
package: name,
|
|
97
|
-
version: await d.resolveVersion(name, tree.ranges[name]),
|
|
98
|
-
})));
|
|
99
|
-
directCount = toCheck.length;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
d.errLog(dim('swpm: no dependencies found in package.json — running npm'));
|
|
103
|
-
return { exitCode: await d.runReal('npm', clean), action: 'passthrough' };
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
catch (err) {
|
|
108
|
-
return failOpen(false, causeOf(err));
|
|
109
|
-
}
|
|
110
|
-
let verdicts;
|
|
111
|
-
try {
|
|
112
|
-
verdicts = await d.getVerdictBatch(toCheck);
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
115
|
-
return failOpen(err instanceof VerdictUnavailable && err.rateLimited, causeOf(err), err instanceof VerdictUnavailable && err.timedOut);
|
|
116
|
-
}
|
|
117
|
-
const aligned = alignVerdicts(toCheck, verdicts);
|
|
118
|
-
const pendingIndexes = aligned
|
|
119
|
-
.map((verdict, index) => ({ verdict, index }))
|
|
120
|
-
.filter(({ verdict }) => directPackageNames.has(verdict.package)
|
|
121
|
-
&& verdict.verdict !== 'blocked'
|
|
122
|
-
&& !verdict.summary?.trim())
|
|
123
|
-
.map(({ index }) => index);
|
|
124
|
-
const resolvedSummaryKeys = new Set();
|
|
125
|
-
if (pendingIndexes.length > 0) {
|
|
126
|
-
d.errLog(dim('Generating LLM summary…'));
|
|
127
|
-
const refreshed = await Promise.all(pendingIndexes.map(async (index) => {
|
|
128
|
-
const verdict = aligned[index];
|
|
129
|
-
try {
|
|
130
|
-
return await d.pollVerdictSummary(verdict.package, verdict.version);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
}));
|
|
136
|
-
let unresolved = 0;
|
|
137
|
-
refreshed.forEach((verdict, resultIndex) => {
|
|
138
|
-
const alignedIndex = pendingIndexes[resultIndex];
|
|
139
|
-
if (verdict?.summary?.trim()) {
|
|
140
|
-
aligned[alignedIndex] = verdict;
|
|
141
|
-
resolvedSummaryKeys.add(`${verdict.package}@${verdict.version}`);
|
|
142
|
-
}
|
|
143
|
-
else
|
|
144
|
-
unresolved++;
|
|
145
|
-
});
|
|
146
|
-
if (unresolved > 0) {
|
|
147
|
-
d.errLog(dim(unresolved === 1
|
|
148
|
-
? 'LLM summary timed out — continuing with raw verdict metadata.'
|
|
149
|
-
: `LLM summaries timed out for ${unresolved} packages — continuing with raw verdict metadata.`));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
for (const l of renderTree(aligned, directCount, resolvedSummaryKeys))
|
|
153
|
-
d.errLog(l);
|
|
154
|
-
// Halt on a hard block OR any level we don't recognize as installable. Known
|
|
155
|
-
// installable levels warn but proceed (unverified/suspicious); an unrecognized
|
|
156
|
-
// or future-harsher level (e.g. "quarantined") must NOT install behind a warn.
|
|
157
|
-
const INSTALLABLE = new Set(['verified', 'unverified', 'suspicious']);
|
|
158
|
-
if (aligned.some((v) => !INSTALLABLE.has(v.verdict))) {
|
|
159
|
-
return { exitCode: 1, action: 'blocked' };
|
|
160
|
-
}
|
|
161
|
-
return { exitCode: await d.runReal('npm', clean), action: 'ran' };
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=run-swpm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-swpm.js","sourceRoot":"","sources":["../../src/swpx/run-swpm.ts"],"names":[],"mappings":"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"}
|