@somewhere-tech/cli 0.12.7 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +59 -1
  2. package/bin/swpm.js +9 -0
  3. package/bin/swpx.js +9 -0
  4. package/dist/commands/auth.js +5 -5
  5. package/dist/commands/auth.js.map +1 -1
  6. package/dist/commands/db.js +1 -1
  7. package/dist/commands/db.js.map +1 -1
  8. package/dist/commands/deploy.js +30 -1
  9. package/dist/commands/deploy.js.map +1 -1
  10. package/dist/commands/dev.js +2 -2
  11. package/dist/commands/dev.js.map +1 -1
  12. package/dist/commands/init.js +7 -7
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/mcp.js +9 -8
  15. package/dist/commands/mcp.js.map +1 -1
  16. package/dist/commands/open.js +1 -1
  17. package/dist/commands/open.js.map +1 -1
  18. package/dist/commands/project.js +1 -1
  19. package/dist/commands/project.js.map +1 -1
  20. package/dist/commands/promote.js +1 -1
  21. package/dist/commands/promote.js.map +1 -1
  22. package/dist/commands/pull.js +1 -1
  23. package/dist/commands/pull.js.map +1 -1
  24. package/dist/commands/rollback.js +1 -1
  25. package/dist/commands/rollback.js.map +1 -1
  26. package/dist/commands/swpx.js +43 -0
  27. package/dist/commands/swpx.js.map +1 -0
  28. package/dist/commands/typecheck.js +1 -1
  29. package/dist/commands/typecheck.js.map +1 -1
  30. package/dist/index.js +6 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/lib/auth.js +8 -3
  33. package/dist/lib/auth.js.map +1 -1
  34. package/dist/lib/client.js +57 -1
  35. package/dist/lib/client.js.map +1 -1
  36. package/dist/lib/config.js +37 -19
  37. package/dist/lib/config.js.map +1 -1
  38. package/dist/lib/device-login.js +4 -1
  39. package/dist/lib/device-login.js.map +1 -1
  40. package/dist/lib/open.js +25 -0
  41. package/dist/lib/open.js.map +1 -0
  42. package/dist/lib/output.js +11 -7
  43. package/dist/lib/output.js.map +1 -1
  44. package/dist/lib/spinner.js +85 -0
  45. package/dist/lib/spinner.js.map +1 -0
  46. package/dist/swpm-bin.js +11 -0
  47. package/dist/swpm-bin.js.map +1 -0
  48. package/dist/swpx/check.js +52 -0
  49. package/dist/swpx/check.js.map +1 -0
  50. package/dist/swpx/registry.js +68 -0
  51. package/dist/swpx/registry.js.map +1 -0
  52. package/dist/swpx/render.js +308 -0
  53. package/dist/swpx/render.js.map +1 -0
  54. package/dist/swpx/run-common.js +23 -0
  55. package/dist/swpx/run-common.js.map +1 -0
  56. package/dist/swpx/run-swpm.js +87 -0
  57. package/dist/swpx/run-swpm.js.map +1 -0
  58. package/dist/swpx/run-swpx.js +54 -0
  59. package/dist/swpx/run-swpx.js.map +1 -0
  60. package/dist/swpx/spawn.js +30 -0
  61. package/dist/swpx/spawn.js.map +1 -0
  62. package/dist/swpx/tree.js +101 -0
  63. package/dist/swpx/tree.js.map +1 -0
  64. package/dist/swpx/types.js +14 -0
  65. package/dist/swpx/types.js.map +1 -0
  66. package/dist/swpx/verdict-client.js +109 -0
  67. package/dist/swpx/verdict-client.js.map +1 -0
  68. package/dist/swpx-bin.js +20 -0
  69. package/dist/swpx-bin.js.map +1 -0
  70. package/package.json +6 -5
  71. package/runtime/platform-context.mjs +668 -23
  72. package/runtime/sw-init.mjs +1 -1
@@ -0,0 +1,85 @@
1
+ const frames = ['-', '\\', '|', '/'];
2
+ const useColor = () => Boolean(process.stderr.isTTY && !process.env.NO_COLOR);
3
+ function normalize(input) {
4
+ if (typeof input === 'string')
5
+ return { text: input, color: 'cyan' };
6
+ return { text: input?.text ?? '', color: input?.color ?? 'cyan' };
7
+ }
8
+ function colorize(value, color) {
9
+ if (!useColor())
10
+ return value;
11
+ const code = color === 'green'
12
+ ? 32
13
+ : color === 'red'
14
+ ? 31
15
+ : color === 'yellow'
16
+ ? 33
17
+ : 36;
18
+ return `\x1b[${code}m${value}\x1b[39m`;
19
+ }
20
+ class TinySpinner {
21
+ frame = 0;
22
+ timer = null;
23
+ color;
24
+ _text;
25
+ constructor(input) {
26
+ const options = normalize(input);
27
+ this._text = options.text;
28
+ this.color = options.color;
29
+ }
30
+ get text() {
31
+ return this._text;
32
+ }
33
+ set text(value) {
34
+ this._text = value;
35
+ if (this.timer)
36
+ this.render();
37
+ }
38
+ start(text) {
39
+ if (text !== undefined)
40
+ this._text = text;
41
+ if (!process.stderr.isTTY) {
42
+ if (this._text)
43
+ console.error(this._text);
44
+ return this;
45
+ }
46
+ if (!this.timer)
47
+ this.timer = setInterval(() => this.render(), 80);
48
+ this.render();
49
+ return this;
50
+ }
51
+ stop() {
52
+ if (this.timer) {
53
+ clearInterval(this.timer);
54
+ this.timer = null;
55
+ }
56
+ if (process.stderr.isTTY)
57
+ process.stderr.write('\r\x1b[2K');
58
+ return this;
59
+ }
60
+ succeed(text) {
61
+ return this.finish('✓', 'green', text);
62
+ }
63
+ fail(text) {
64
+ return this.finish('✗', 'red', text);
65
+ }
66
+ render() {
67
+ const frame = frames[this.frame++ % frames.length];
68
+ process.stderr.write(`\r\x1b[2K${colorize(frame, this.color)} ${this._text}`);
69
+ }
70
+ finish(symbol, color, text) {
71
+ const message = text ?? this._text;
72
+ if (!process.stderr.isTTY) {
73
+ if (message)
74
+ console.error(message);
75
+ return this;
76
+ }
77
+ this.stop();
78
+ console.error(message ? `${colorize(symbol, color)} ${message}` : colorize(symbol, color));
79
+ return this;
80
+ }
81
+ }
82
+ export default function ora(input) {
83
+ return new TinySpinner(input);
84
+ }
85
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Entry for the standalone `swpm` binary (and `somewhere npm`).
2
+ *
3
+ * Every arg goes to runSwpm, which gates install-family subcommands and passes
4
+ * everything else straight through to npm. `main` is side-effect-free (deps
5
+ * injectable) so it's unit-tested; bin/swpm.js does the process.exit. */
6
+ import { runSwpm } from './swpx/run-swpm.js';
7
+ export async function main(argv, deps = {}) {
8
+ const { exitCode } = await runSwpm(argv, deps);
9
+ return exitCode;
10
+ }
11
+ //# sourceMappingURL=swpm-bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swpm-bin.js","sourceRoot":"","sources":["../src/swpm-bin.ts"],"names":[],"mappings":"AAAA;;;;0EAI0E;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,OAAgB,EAAE;IAC3D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /** `somewhere check <pkg>[@version] [--json]` (also `swpx check …`) — inspect a
2
+ * package WITHOUT running or installing anything. Prints the same verdict block
3
+ * as swpx, or the stable `--json` projection for agents.
4
+ *
5
+ * Exit code is a severity ladder so it composes in CI / agent loops:
6
+ * 0 verified · 1 unverified/suspicious · 2 blocked · 3 couldn't determine
7
+ * (unresolvable name or verdict service unreachable). Output is the command's
8
+ * product, so it goes to STDOUT (errors/unavailability to stderr). */
9
+ import { parseSpec } from './registry.js';
10
+ import { renderSingle, toJsonVerdict } from './render.js';
11
+ import { bindDeps, msg } from './run-common.js';
12
+ import { dim } from '../lib/output.js';
13
+ function exitForLevel(level) {
14
+ if (level === 'verified')
15
+ return 0;
16
+ if (level === 'blocked')
17
+ return 2;
18
+ return 1; // unverified | suspicious
19
+ }
20
+ export async function runCheck(specArg, opts = {}, deps = {}) {
21
+ const d = bindDeps(deps);
22
+ if (!specArg) {
23
+ d.errLog('Usage: somewhere check <package>[@version] [--json]');
24
+ return 3;
25
+ }
26
+ const spec = parseSpec(specArg);
27
+ let version;
28
+ try {
29
+ version = await d.resolveVersion(spec.name, spec.version);
30
+ }
31
+ catch (err) {
32
+ d.errLog(`Could not resolve ${spec.name}: ${msg(err)}`);
33
+ return 3;
34
+ }
35
+ let verdict;
36
+ try {
37
+ verdict = await d.getVerdict(spec.name, version);
38
+ }
39
+ catch {
40
+ d.errLog(dim(`Verdict service unavailable for ${spec.name}@${version}.`));
41
+ return 3;
42
+ }
43
+ if (opts.json) {
44
+ d.log(JSON.stringify(toJsonVerdict(verdict), null, 2));
45
+ }
46
+ else {
47
+ for (const l of renderSingle(verdict))
48
+ d.log(l);
49
+ }
50
+ return exitForLevel(verdict.verdict);
51
+ }
52
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/swpx/check.ts"],"names":[],"mappings":"AAAA;;;;;;;uEAOuE;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAgB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,SAAS,YAAY,CAAC,KAAmB;IACvC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,CAAC,CAAC,0BAA0B;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAA2B,EAC3B,OAA2B,EAAE,EAC7B,OAAgB,EAAE;IAElB,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,CAAC,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEhC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC;YAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,68 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/swpx/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,308 @@
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
+ /** verified → run; unverified/suspicious → stop; blocked → block. */
14
+ export function decide(v) {
15
+ if (v.verdict === 'blocked')
16
+ return 'block';
17
+ if (v.verdict === 'unverified' || v.verdict === 'suspicious')
18
+ return 'stop';
19
+ return 'run';
20
+ }
21
+ function checkMark(level) {
22
+ if (level === 'ok')
23
+ return green('✓');
24
+ if (level === 'bad')
25
+ return red('✖');
26
+ return yellow('⚠');
27
+ }
28
+ /** 1400622 → "1.4M", 11000 → "11k", 11 → "11". */
29
+ function humanizeDownloads(n) {
30
+ if (n >= 1_000_000)
31
+ return `${(n / 1_000_000).toFixed(1).replace(/\.0$/, '')}M`;
32
+ if (n >= 10_000)
33
+ return `${Math.round(n / 1000)}k`;
34
+ if (n >= 1_000)
35
+ return `${(n / 1000).toFixed(1).replace(/\.0$/, '')}k`;
36
+ return String(n);
37
+ }
38
+ /** 0.3 → "18m", 5 → "5h", 50 → "2d", 1500 → "2mo". (Uses the existing
39
+ * ageHours() helper defined below for the hours value.) */
40
+ function humanizeAge(h) {
41
+ if (h < 1)
42
+ return `${Math.max(1, Math.round(h * 60))}m`;
43
+ if (h < 48)
44
+ return `${Math.round(h)}h`;
45
+ const d = h / 24;
46
+ return d < 60 ? `${Math.round(d)}d` : `${Math.round(d / 30)}mo`;
47
+ }
48
+ /** The per-dimension evidence rows — "show the work, evidence not a grade".
49
+ * Every check the verdict layer ran becomes a row: ok (green ✓), warn
50
+ * (yellow ⚠), or bad (red ✖). A clean package reads as a wall of green with the
51
+ * one honest ⚠; a sketchy one's red/yellow stands out immediately. Rows are
52
+ * omitted only when the signal genuinely wasn't checked (e.g. GitHub tag with
53
+ * no repo, description match before the LLM backfill ran). */
54
+ export function buildChecks(v) {
55
+ const checks = [];
56
+ const dl = v.weekly_downloads;
57
+ if (typeof dl === 'number' && dl > 0) {
58
+ checks.push({ level: dl >= 1000 ? 'ok' : 'warn', text: `${humanizeDownloads(dl)} weekly downloads` });
59
+ }
60
+ if (v.publisher) {
61
+ const pc = v.author_package_count;
62
+ const adl = v.author_total_downloads;
63
+ const bits = [];
64
+ if (typeof pc === 'number' && pc > 0)
65
+ bits.push(`${pc} package${pc === 1 ? '' : 's'}`);
66
+ if (typeof adl === 'number' && adl > 0)
67
+ bits.push(`${humanizeDownloads(adl)} combined`);
68
+ const detail = bits.length ? ` (${bits.join(', ')})` : '';
69
+ // A single-package (or brand-new) author is a caution; an established one reassures.
70
+ checks.push({ level: typeof pc === 'number' && pc <= 1 ? 'warn' : 'ok', text: `Author: ${v.publisher}${detail}` });
71
+ }
72
+ const ageH = ageHours(v.publish_time);
73
+ if (ageH != null) {
74
+ checks.push(ageH < 24
75
+ ? { level: 'warn', text: `Published ${humanizeAge(ageH)} ago (too new to be vetted)` }
76
+ : { level: 'ok', text: `Published ${humanizeAge(ageH)} ago` });
77
+ }
78
+ if (v.has_install_scripts) {
79
+ const t = (v.install_script_types ?? []).filter(Boolean)[0];
80
+ checks.push({ level: 'bad', text: t ? `Has ${t} script` : 'Has install scripts' });
81
+ }
82
+ else {
83
+ checks.push({ level: 'ok', text: 'No install scripts' });
84
+ }
85
+ checks.push(v.is_minified ? { level: 'bad', text: 'Minified (unreadable)' } : { level: 'ok', text: 'Readable source' });
86
+ const caps = (v.capabilities ?? []).filter(Boolean);
87
+ checks.push(caps.length ? { level: 'warn', text: caps.join(', ') } : { level: 'ok', text: 'No system access' });
88
+ if (Array.isArray(v.dependencies)) {
89
+ const deps = v.dependencies;
90
+ const flags = Array.isArray(v.dependency_flags) ? v.dependency_flags : null;
91
+ if (flags) {
92
+ const checked = Math.min(deps.length, 50);
93
+ if (deps.length === 0) {
94
+ checks.push({ level: 'ok', text: 'No dependencies' });
95
+ }
96
+ else if (flags.length) {
97
+ checks.push({
98
+ level: 'bad',
99
+ text: `${flags.length} of ${checked} flagged: ${flags.map((d) => `${d.name} (${d.verdict})`).join(', ')}`,
100
+ });
101
+ }
102
+ else {
103
+ // "none flagged" not "all verified": uncached deps are unknown, not
104
+ // verified — we surface the bad ones, so absence of flags ≠ all-clean.
105
+ // (Post-prewarm, when the tree is cached, this becomes a true all-clear.)
106
+ checks.push({
107
+ level: 'ok',
108
+ text: `${checked} dependenc${checked === 1 ? 'y' : 'ies'}, none flagged`,
109
+ });
110
+ }
111
+ }
112
+ else if (deps.length === 0) {
113
+ checks.push({ level: 'ok', text: 'No dependencies' });
114
+ }
115
+ else if (deps.length <= 5) {
116
+ checks.push({ level: 'ok', text: `${deps.length} dependenc${deps.length === 1 ? 'y' : 'ies'}: ${deps.join(', ')}` });
117
+ }
118
+ else {
119
+ checks.push({ level: 'ok', text: `${deps.length} dependencies` });
120
+ }
121
+ }
122
+ const mals = v.mal ?? [];
123
+ const compromised = v.compromised_history ?? [];
124
+ if (compromised.length) {
125
+ const date = compromised[0]?.published ? compromised[0].published.slice(0, 7) : 'unknown date';
126
+ checks.push({
127
+ level: 'warn',
128
+ text: `Compromised ${date}${mals.length ? '' : ' (current version clean)'}`,
129
+ });
130
+ }
131
+ if (typeof v.known_cves === 'number') {
132
+ checks.push(v.known_cves > 0
133
+ ? { level: 'warn', text: `${v.known_cves} known CVE${v.known_cves === 1 ? '' : 's'}` }
134
+ : { level: 'ok', text: 'No known CVEs' });
135
+ }
136
+ if (mals.length) {
137
+ const m = mals[0];
138
+ checks.push({ level: 'bad', text: m.summary ? `${m.id}: ${m.summary}` : `${m.id} advisory` });
139
+ }
140
+ else {
141
+ checks.push({ level: 'ok', text: 'No advisories' });
142
+ }
143
+ if (v.typosquat_of) {
144
+ const d = v.typosquat_distance != null ? ` (distance ${v.typosquat_distance})` : '';
145
+ checks.push({ level: 'bad', text: `Possible typosquat of ${v.typosquat_of}${d}` });
146
+ }
147
+ if (v.has_github_tag === 1)
148
+ checks.push({ level: 'ok', text: 'GitHub tag exists' });
149
+ else if (v.has_github_tag === 0)
150
+ checks.push({ level: 'warn', text: 'No GitHub tag' });
151
+ checks.push(v.has_provenance
152
+ ? { level: 'ok', text: 'Provenance verified' }
153
+ : { level: 'warn', text: 'No provenance' });
154
+ if (v.description_match === 'match') {
155
+ checks.push({ level: 'ok', text: 'Matches description' });
156
+ }
157
+ else if (v.description_match === 'mismatch') {
158
+ checks.push({ level: 'bad', text: v.description ? `Doesn't match: "${v.description}"` : "Doesn't match its description" });
159
+ }
160
+ return checks;
161
+ }
162
+ /** The verbose, color-coded checklist for one package — header marked by the
163
+ * overall verdict (✓/⚠/✖), then every check as its own row. */
164
+ export function renderChecklist(v) {
165
+ const out = [`${mark(v.verdict)} ${v.package}@${v.version}`];
166
+ for (const c of buildChecks(v))
167
+ out.push(` ${checkMark(c.level)} ${c.text}`);
168
+ return out;
169
+ }
170
+ /** Word-wrap a paragraph to `width` columns (the narrative reads as prose). */
171
+ function wrap(text, width = 76) {
172
+ const lines = [];
173
+ let cur = '';
174
+ for (const word of text.split(/\s+/).filter(Boolean)) {
175
+ if (cur && cur.length + 1 + word.length > width) {
176
+ lines.push(cur);
177
+ cur = word;
178
+ }
179
+ else {
180
+ cur = cur ? `${cur} ${word}` : word;
181
+ }
182
+ }
183
+ if (cur)
184
+ lines.push(cur);
185
+ return lines;
186
+ }
187
+ /** Full single-package output: the LLM narrative as the headline (when present),
188
+ * the checklist as the receipts, the GitHub link, and a state-specific footer
189
+ * (how to override on a stop; the malware warning + safe versions on a block). */
190
+ export function renderVerdict(v) {
191
+ const out = [`${mark(v.verdict)} ${v.package}@${v.version}`];
192
+ // The narrative is the judgment — show it first, in prose, so a glance decides.
193
+ if (v.summary) {
194
+ out.push('');
195
+ for (const l of wrap(v.summary))
196
+ out.push(` ${l}`);
197
+ out.push('');
198
+ }
199
+ for (const c of buildChecks(v))
200
+ out.push(` ${checkMark(c.level)} ${c.text}`);
201
+ if (v.github_repo)
202
+ out.push(` ${dim(`→ ${v.github_repo}`)}`);
203
+ const action = decide(v);
204
+ if (action === 'block') {
205
+ const first = (v.mal ?? [])[0];
206
+ const safe = first?.safe_versions ?? [];
207
+ if (safe.length) {
208
+ out.push(` ${dim('Safe versions:')} ${safe.map((s) => green(`${v.package}@${s}`)).join(', ')}`);
209
+ }
210
+ out.push(` ${red('Confirmed malware. Do not install.')}`);
211
+ }
212
+ else if (action === 'stop') {
213
+ out.push(` ${dim(`Run npx ${v.package} to proceed unverified.`)}`);
214
+ }
215
+ return out;
216
+ }
217
+ /** Back-compat name used by the check command + bin. */
218
+ export function renderSingle(v) {
219
+ return renderVerdict(v);
220
+ }
221
+ /** Compact reason string for a row in the tree summary.
222
+ * e.g. "minified, no provenance" / "no provenance, has postinstall" / a MAL id. */
223
+ export function shortReasons(v) {
224
+ if (v.verdict === 'blocked')
225
+ return (v.mal ?? [])[0]?.id ?? 'confirmed malware';
226
+ const r = [];
227
+ if (v.is_minified)
228
+ r.push('minified');
229
+ if (v.has_provenance === false)
230
+ r.push('no provenance');
231
+ if (v.has_install_scripts) {
232
+ const t = (v.install_script_types ?? []).filter(Boolean)[0];
233
+ r.push(t ? `has ${t}` : 'has install scripts');
234
+ }
235
+ if (v.typosquat_of)
236
+ r.push(`typosquat of ${v.typosquat_of}`);
237
+ if (v.description_match === 'mismatch')
238
+ r.push('description mismatch');
239
+ if (v.has_github_tag === 0)
240
+ r.push('no github tag');
241
+ return r.join(', ') || 'unverified';
242
+ }
243
+ const isVerified = (v) => v.verdict === 'verified';
244
+ const isBlocked = (v) => v.verdict === 'blocked';
245
+ /** The full `swpm install` tree summary. `directCount` is how many of `items`
246
+ * are direct (top-level) dependencies; the rest count as transitive. */
247
+ export function renderTree(items, directCount) {
248
+ const total = items.length;
249
+ const transitive = Math.max(0, total - directCount);
250
+ const verified = items.filter(isVerified);
251
+ const blocked = items.filter(isBlocked);
252
+ const unverified = items.filter((v) => !isVerified(v) && !isBlocked(v));
253
+ const out = [];
254
+ out.push(`Checking ${total} package${total === 1 ? '' : 's'} (${directCount} direct, ${transitive} transitive)`);
255
+ out.push(` ${green('✓')} ${String(verified.length).padStart(2)} verified`);
256
+ const branchList = (rows) => {
257
+ rows.forEach((v, i) => {
258
+ const branch = i === rows.length - 1 ? '└' : '├';
259
+ out.push(` ${branch} ${v.package}@${v.version} — ${shortReasons(v)}`);
260
+ });
261
+ };
262
+ if (unverified.length) {
263
+ out.push(` ${yellow('⚠')} ${String(unverified.length).padStart(2)} unverified`);
264
+ branchList(unverified);
265
+ }
266
+ if (blocked.length) {
267
+ out.push(` ${red('✖')} ${String(blocked.length).padStart(2)} blocked`);
268
+ branchList(blocked);
269
+ out.push(' Remove or replace blocked packages to continue.');
270
+ out.push(' Run npm install to bypass all checks.');
271
+ }
272
+ return out;
273
+ }
274
+ function ageHours(publishTime) {
275
+ if (!publishTime)
276
+ return null;
277
+ const t = new Date(publishTime).getTime();
278
+ if (!Number.isFinite(t))
279
+ return null;
280
+ return Math.max(0, Math.round((Date.now() - t) / 3_600_000));
281
+ }
282
+ /** The stable `--json` projection shown on the landing page. */
283
+ export function toJsonVerdict(v) {
284
+ return {
285
+ package: v.package,
286
+ version: v.version,
287
+ verdict: v.verdict,
288
+ signals: {
289
+ provenance: v.has_provenance === true,
290
+ readable: v.is_minified !== true,
291
+ install_scripts: v.install_script_types ?? [],
292
+ capabilities: v.capabilities ?? [],
293
+ description_match: v.description_match === 'match',
294
+ mal_advisories: (v.mal ?? []).map((m) => m.id),
295
+ typosquat_distance: v.typosquat_distance ?? null,
296
+ age_hours: ageHours(v.publish_time),
297
+ },
298
+ };
299
+ }
300
+ /** Map a verdict level to the single mark used in compact contexts. */
301
+ export function mark(level) {
302
+ if (level === 'verified')
303
+ return green('✓');
304
+ if (level === 'blocked')
305
+ return red('✖');
306
+ return yellow('⚠');
307
+ }
308
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/swpx/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
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 } 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
+ runReal: deps.runReal ?? realRunReal,
17
+ readTree: deps.readTree ?? realReadTree,
18
+ log: deps.log ?? ((s) => console.log(s)),
19
+ errLog: deps.errLog ?? ((s) => console.error(s)),
20
+ };
21
+ }
22
+ export const msg = (e) => (e instanceof Error ? e.message : String(e));
23
+ //# sourceMappingURL=run-common.js.map
@@ -0,0 +1 @@
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,EAAE,UAAU,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAqB,MAAM,WAAW,CAAC;AAyBxE,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,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"}