@pipobscure/bundle 0.0.1

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 (98) hide show
  1. package/HISTORY.md +1924 -0
  2. package/README.md +623 -0
  3. package/bundle.run +0 -0
  4. package/dist/api.d.ts +147 -0
  5. package/dist/api.d.ts.map +1 -0
  6. package/dist/api.js +174 -0
  7. package/dist/api.js.map +1 -0
  8. package/dist/archive.d.ts +115 -0
  9. package/dist/archive.d.ts.map +1 -0
  10. package/dist/archive.js +188 -0
  11. package/dist/archive.js.map +1 -0
  12. package/dist/audit.d.ts +78 -0
  13. package/dist/audit.d.ts.map +1 -0
  14. package/dist/audit.js +119 -0
  15. package/dist/audit.js.map +1 -0
  16. package/dist/cli.d.ts +23 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +555 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/files.d.ts +53 -0
  21. package/dist/files.d.ts.map +1 -0
  22. package/dist/files.js +118 -0
  23. package/dist/files.js.map +1 -0
  24. package/dist/index.d.ts +10 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +35 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/launch.d.ts +97 -0
  29. package/dist/launch.d.ts.map +1 -0
  30. package/dist/launch.js +267 -0
  31. package/dist/launch.js.map +1 -0
  32. package/dist/main.d.ts +3 -0
  33. package/dist/main.d.ts.map +1 -0
  34. package/dist/main.js +19 -0
  35. package/dist/main.js.map +1 -0
  36. package/dist/manifest.d.ts +139 -0
  37. package/dist/manifest.d.ts.map +1 -0
  38. package/dist/manifest.js +504 -0
  39. package/dist/manifest.js.map +1 -0
  40. package/dist/oidc.d.ts +40 -0
  41. package/dist/oidc.d.ts.map +1 -0
  42. package/dist/oidc.js +320 -0
  43. package/dist/oidc.js.map +1 -0
  44. package/dist/preload.d.ts +14 -0
  45. package/dist/preload.d.ts.map +1 -0
  46. package/dist/preload.js +38 -0
  47. package/dist/preload.js.map +1 -0
  48. package/dist/provider.d.ts +83 -0
  49. package/dist/provider.d.ts.map +1 -0
  50. package/dist/provider.js +206 -0
  51. package/dist/provider.js.map +1 -0
  52. package/dist/record.d.ts +2 -0
  53. package/dist/record.d.ts.map +1 -0
  54. package/dist/record.js +23 -0
  55. package/dist/record.js.map +1 -0
  56. package/dist/recorder.d.ts +64 -0
  57. package/dist/recorder.d.ts.map +1 -0
  58. package/dist/recorder.js +111 -0
  59. package/dist/recorder.js.map +1 -0
  60. package/dist/register.d.ts +2 -0
  61. package/dist/register.d.ts.map +1 -0
  62. package/dist/register.js +28 -0
  63. package/dist/register.js.map +1 -0
  64. package/dist/sea.d.ts +97 -0
  65. package/dist/sea.d.ts.map +1 -0
  66. package/dist/sea.js +220 -0
  67. package/dist/sea.js.map +1 -0
  68. package/dist/sigstore.d.ts +112 -0
  69. package/dist/sigstore.d.ts.map +1 -0
  70. package/dist/sigstore.js +385 -0
  71. package/dist/sigstore.js.map +1 -0
  72. package/dist/skill.d.ts +36 -0
  73. package/dist/skill.d.ts.map +1 -0
  74. package/dist/skill.js +108 -0
  75. package/dist/skill.js.map +1 -0
  76. package/package.json +84 -0
  77. package/shell-base +2 -0
  78. package/skills/audit-bundle/SKILL.md +271 -0
  79. package/src/api.ts +293 -0
  80. package/src/archive.ts +312 -0
  81. package/src/audit.ts +206 -0
  82. package/src/cli.ts +575 -0
  83. package/src/files.ts +156 -0
  84. package/src/index.ts +114 -0
  85. package/src/launch.ts +336 -0
  86. package/src/main.ts +20 -0
  87. package/src/manifest.ts +615 -0
  88. package/src/oidc.ts +372 -0
  89. package/src/preload.ts +40 -0
  90. package/src/provider.ts +270 -0
  91. package/src/record.ts +25 -0
  92. package/src/recorder.ts +166 -0
  93. package/src/register.ts +30 -0
  94. package/src/sea.ts +341 -0
  95. package/src/sigstore.ts +492 -0
  96. package/src/skill.ts +132 -0
  97. package/src/types/node-vfs.d.ts +90 -0
  98. package/src/types/node-zip.d.ts +85 -0
package/dist/cli.js ADDED
@@ -0,0 +1,555 @@
1
+ import * as FS from 'node:fs';
2
+ import * as PATH from 'node:path';
3
+ import { parseArgs } from 'node:util';
4
+ import { createBundle, signBundle, verifyBundle, runBundle, fileSigner } from './api.js';
5
+ import { members } from './archive.js';
6
+ import { launcherPath } from './files.js';
7
+ import * as AUDIT from './audit.js';
8
+ import { message, STATES } from './manifest.js';
9
+ // Re-exported because this is where a CLI consumer looks for it; it is defined
10
+ // in the format layer so the `bundle` launcher can report an exit code without
11
+ // loading the whole CLI.
12
+ export { STATES };
13
+ import * as SKILLS from './skill.js';
14
+ // Argument parsing and reporting, and nothing else. Every command below is a
15
+ // `parseArgs` call, a message or two, and one call into `api.ts` — which is
16
+ // deliberate: what the CLI can do is exactly what an embedder can do, because
17
+ // they are the same functions.
18
+ export const USAGE = `usage: bundle <command> [options]
19
+
20
+ commands:
21
+ create build an archive from a list of files
22
+ sign sign an archive into a new file, optionally behind a prefix
23
+ audit report what is about to be reviewed, and gate signing on the verdict
24
+ verify verify an archive and report its trust state
25
+ run mount a signed archive and run it
26
+ sea build a node runtime that verifies an archive before running it
27
+ trust refresh the sigstore trust root used to check sigstore signatures
28
+ skill install this package's bundle-auditing skill into a project
29
+
30
+ create options:
31
+ -b, --base <dir> base directory the file list is relative to (default: .)
32
+ -p, --prefix <file> prefix prepended before the archive (launcher or binary);
33
+ omit it for a plain archive meant to be run from a mount
34
+ -f, --files <file> read the newline-separated file list from here (default: stdin)
35
+ -o, --output <file> write the archive here (default: stdout)
36
+ -k, --key <file> leaf private key (PEM); signs at build time with --chain
37
+ -c, --chain <file> full certificate chain (PEM, leaf first)
38
+ --hash <alg> digest for the whole-file hash and member digests (default: sha256)
39
+ --sign <alg> digest the signature over that hash uses (default: sha256)
40
+
41
+ sign options: usage: sign [options] <archive>
42
+ -o, --output <file> write the signed archive here (default: stdout)
43
+ -l, --launcher prepend this package's shell launcher, so the result runs
44
+ by name — the usual way to make a self-executing archive
45
+ -p, --prefix <file> prepend some other prefix: a launcher of your own, or a
46
+ node binary; omit both for a plain mountable archive
47
+ -x, --executable make the output executable (implied by --launcher/--prefix)
48
+ --hash <alg> digest for the whole-file hash and member digests (default: sha256)
49
+ --sign <alg> digest the signature over that hash uses (default: sha256)
50
+
51
+ by default this signs through sigstore, taking the identity from CI when
52
+ there is one and otherwise opening a GitHub sign-in:
53
+ --flow <how> auto | ci | browser | device (default: auto)
54
+ --token <jwt> use this OIDC token instead of signing in
55
+ --oidc-issuer <url> OIDC issuer (default: sigstore's dex)
56
+ --connector <name> identity provider to jump to (default: github)
57
+ --fulcio <url> certificate authority (default: fulcio.sigstore.dev)
58
+ --rekor <url> transparency log; empty string to skip it
59
+ --tsa <url> timestamp authority; empty string to skip it
60
+
61
+ or, to sign against a certificate authority of your own:
62
+ -k, --key <file> leaf private key (PEM)
63
+ -c, --chain <file> full certificate chain (PEM, leaf first)
64
+
65
+ audit options: usage: audit [options] <archive>
66
+ -b, --baseline <file> a previously approved archive to review against, so the
67
+ review is of what changed rather than of everything
68
+ -v, --verdict <file> where the verdict is (default: <archive>.audit.json)
69
+ --check exit non-zero unless a clean verdict pins these bytes
70
+ --approve record a clean verdict you reached by reading it yourself
71
+ -n, --note <text> what you checked, recorded with --approve
72
+
73
+ with none of those it reports what is about to be reviewed and how. The review
74
+ itself needs judgement, so no command performs it: install the skill with
75
+ 'bundle skill' and run /audit-bundle, or read the archive yourself and
76
+ --approve. Signing is not gated unless you run --check before it.
77
+
78
+ verify options: usage: verify [options] <archive>
79
+ -a, --archive <file> archive to verify (or pass it as a positional argument)
80
+ -r, --root <file> extra trusted root certificate (PEM); repeatable
81
+ --identity <san> require this sigstore signing identity
82
+ --issuer <url> require this sigstore OIDC issuer
83
+ --sigstore-root <file> sigstore trust root (default: the cache 'trust' fills)
84
+ --json print the result as JSON
85
+
86
+ run options: usage: run [options] <archive> [-- <app args>]
87
+ -r, --root <file> extra trusted root certificate (PEM); repeatable
88
+ --identity <san> require this sigstore signing identity
89
+ --issuer <url> require this sigstore OIDC issuer
90
+ --untrusted run an archive whose signature is good but untrusted
91
+
92
+ sea options: usage: sea [options] [archive]
93
+ -o, --output <file> write the executable here (required)
94
+ --node <file> node binary to embed (default: the running one)
95
+ --base <file> reuse a SEA base built earlier instead of building one
96
+ --no-sigstore leave the sigstore libraries out of the embedded verifier
97
+ --untrusted let the finished executable run an archive whose
98
+ signature is good but unanchored
99
+ -r, --root <file> trusted root the executable checks against; repeatable
100
+ --identity <san> identity the executable requires of a signature
101
+ --issuer <url> issuer the executable requires of a signature
102
+
103
+ with an archive, the result is that application: one file that verifies
104
+ itself and runs what is inside it. without one, the result is a verifying
105
+ node — a runtime that takes an archive on its own command line:
106
+
107
+ bundle sea -o node-verifying
108
+ ./node-verifying ./my-app.zip --args --for --the --app
109
+
110
+ a runtime built with a policy (-r, --identity, --issuer) is sealed: it
111
+ accepts no policy from its command line, because a binary that demands a
112
+ signing identity is not one whose user can ask it to stop.
113
+
114
+ the signing options are the same as 'sign': sigstore by default, or --key
115
+ with --chain against a certificate authority of your own
116
+
117
+ trust options:
118
+ --mirror <url> TUF repository to refresh from (default: sigstore's)
119
+
120
+ skill options: usage: skill [options] [name]
121
+ -d, --dir <dir> where to install (default: .claude/skills)
122
+ -f, --force overwrite files that are already there
123
+ -l, --list list the skills this package carries and stop
124
+
125
+ -h, --help show this help`;
126
+ const CONSOLE = {
127
+ out: (line) => { process.stdout.write(`${line}\n`); },
128
+ err: (line) => { process.stderr.write(`${line}\n`); },
129
+ };
130
+ /**
131
+ * The commands, in the order the usage text lists them. Keeping the dispatch
132
+ * table and the help in one place is what stops the two drifting apart.
133
+ */
134
+ export const COMMANDS = {
135
+ create, sign, audit, verify: check, run, sea, trust, skill,
136
+ };
137
+ /**
138
+ * Run one CLI invocation. `argv` is the user's arguments — everything after the
139
+ * runtime and the entry point — and the return value is the process exit code,
140
+ * so a caller decides what to do with it rather than being exited out from
141
+ * under.
142
+ */
143
+ export async function main(argv, io = CONSOLE) {
144
+ const [cmd, ...rest] = argv;
145
+ try {
146
+ if (cmd === undefined) {
147
+ io.out(USAGE);
148
+ return 64;
149
+ }
150
+ if (cmd === '-h' || cmd === '--help' || cmd === 'help') {
151
+ io.out(USAGE);
152
+ return 0;
153
+ }
154
+ const command = Object.hasOwn(COMMANDS, cmd) ? COMMANDS[cmd] : undefined;
155
+ if (!command)
156
+ throw new Error(`unknown command: ${cmd}`);
157
+ return await command(rest, io);
158
+ }
159
+ catch (err) {
160
+ io.err(`error: ${message(err)}`);
161
+ return 70;
162
+ }
163
+ }
164
+ async function create(args, io) {
165
+ const { values } = parseArgs({
166
+ args,
167
+ options: {
168
+ base: { type: 'string', short: 'b', default: '.' },
169
+ prefix: { type: 'string', short: 'p' },
170
+ files: { type: 'string', short: 'f' },
171
+ output: { type: 'string', short: 'o' },
172
+ key: { type: 'string', short: 'k' },
173
+ chain: { type: 'string', short: 'c' },
174
+ hash: { type: 'string', default: 'sha256' },
175
+ sign: { type: 'string', default: 'sha256' },
176
+ },
177
+ });
178
+ if (Boolean(values.key) !== Boolean(values.chain))
179
+ throw new Error('create: --key and --chain must be given together');
180
+ const listing = values.files ? FS.readFileSync(values.files, 'utf-8') : await readStdin();
181
+ const files = [...new Set(listing.split(/\r?\n/).filter(Boolean))].sort();
182
+ if (!files.length)
183
+ throw new Error('create: the file list is empty');
184
+ for (const file of files)
185
+ io.err(`+ ${file}`);
186
+ io.err(values.key
187
+ ? `* signed archive (${files.length} members, ${values.hash} digests, ${values.sign} signature)`
188
+ : `* unsigned archive (${files.length} members, ${values.hash} digests)`);
189
+ await createBundle({
190
+ base: values.base, files, prefix: values.prefix, output: values.output,
191
+ hashAlg: values.hash, signAlg: values.sign,
192
+ key: values.key ? FS.readFileSync(values.key) : undefined,
193
+ chain: values.chain ? FS.readFileSync(values.chain, 'utf-8') : undefined,
194
+ });
195
+ return 0;
196
+ }
197
+ async function sign(args, io) {
198
+ const { values, positionals } = parseArgs({
199
+ args,
200
+ allowPositionals: true,
201
+ options: {
202
+ output: { type: 'string', short: 'o' },
203
+ launcher: { type: 'boolean', short: 'l' },
204
+ prefix: { type: 'string', short: 'p' },
205
+ executable: { type: 'boolean', short: 'x' },
206
+ key: { type: 'string', short: 'k' },
207
+ chain: { type: 'string', short: 'c' },
208
+ hash: { type: 'string', default: 'sha256' },
209
+ sign: { type: 'string', default: 'sha256' },
210
+ flow: { type: 'string', default: 'auto' },
211
+ token: { type: 'string' },
212
+ 'oidc-issuer': { type: 'string' },
213
+ connector: { type: 'string' },
214
+ fulcio: { type: 'string' },
215
+ rekor: { type: 'string' },
216
+ tsa: { type: 'string' },
217
+ },
218
+ });
219
+ const source = positionals[0];
220
+ if (!source)
221
+ throw new Error('sign: an archive path is required');
222
+ if (Boolean(values.key) !== Boolean(values.chain))
223
+ throw new Error('sign: --key and --chain must be given together');
224
+ if (values.launcher && values.prefix)
225
+ throw new Error('sign: --launcher and --prefix are alternatives');
226
+ // `--launcher` is `--prefix <this package's shell-base>`, spelled so that
227
+ // nobody has to know the prefix ships inside node_modules.
228
+ const prefix = values.launcher ? launcherPath() : values.prefix;
229
+ for (const name of members(source))
230
+ io.err(`+ ${name}`);
231
+ if (prefix)
232
+ io.err(`* prefix ${prefix} (${FS.statSync(prefix).size} bytes)`);
233
+ const signer = await chooseSigner(values, io);
234
+ const res = await signBundle({
235
+ source, output: values.output, prefix, executable: values.executable,
236
+ hashAlg: values.hash, signAlg: values.sign, signer,
237
+ });
238
+ io.err(`* signed: ${res.hash}`);
239
+ if (res.output)
240
+ io.err(`* wrote ${res.output} (${res.size} bytes)`);
241
+ return 0;
242
+ }
243
+ async function check(args, io) {
244
+ const { values, positionals } = parseArgs({
245
+ args,
246
+ allowPositionals: true,
247
+ options: {
248
+ archive: { type: 'string', short: 'a' },
249
+ root: { type: 'string', short: 'r', multiple: true },
250
+ identity: { type: 'string' },
251
+ issuer: { type: 'string' },
252
+ 'sigstore-root': { type: 'string' },
253
+ json: { type: 'boolean' },
254
+ },
255
+ });
256
+ const archive = values.archive ?? positionals[0];
257
+ if (!archive)
258
+ throw new Error('verify: an archive path is required');
259
+ const res = await verifyBundle(archive, {
260
+ roots: values.root ?? [],
261
+ identity: values.identity,
262
+ issuer: values.issuer,
263
+ trustedRoot: values['sigstore-root'],
264
+ });
265
+ report(res, Boolean(values.json), io);
266
+ return STATES[res.state].code;
267
+ }
268
+ /** Print a verification result, as text or as the JSON `--json` produces. */
269
+ export function report(res, json, io) {
270
+ const state = STATES[res.state];
271
+ if (json) {
272
+ io.out(JSON.stringify({
273
+ state: res.state, reason: res.reason, subject: res.subject,
274
+ signed: res.signed, trusted: res.trusted, sigstore: Boolean(res.sigstore),
275
+ identity: res.identity, issuer: res.issuer,
276
+ signedAt: res.signedAt ? res.signedAt.toISOString() : undefined,
277
+ members: res.digests ? [...res.digests.keys()] : undefined,
278
+ code: state.code,
279
+ }, null, 2));
280
+ return;
281
+ }
282
+ io.out(`${state.label} — ${res.reason ?? state.note}`);
283
+ // For a sigstore signature the identity is the answer to "who signed this";
284
+ // the certificate subject is an ephemeral Fulcio artifact and says nothing
285
+ // useful.
286
+ if (res.identity)
287
+ io.out(` identity: ${res.identity}`);
288
+ if (res.issuer)
289
+ io.out(` issuer: ${res.issuer}`);
290
+ if (res.signedAt)
291
+ io.out(` signed: ${res.signedAt.toISOString()}`);
292
+ if (res.subject && !res.identity)
293
+ io.out(` certificate: ${res.subject.replace(/\n/g, ', ')}`);
294
+ }
295
+ // Run an archive the way a mount does. Everything after `--` is the
296
+ // application's own argv.
297
+ function run(args, io) {
298
+ const split = args.indexOf('--');
299
+ const mine = split < 0 ? args : args.slice(0, split);
300
+ const theirs = split < 0 ? [] : args.slice(split + 1);
301
+ const { values, positionals } = parseArgs({
302
+ args: mine,
303
+ allowPositionals: true,
304
+ options: {
305
+ root: { type: 'string', short: 'r', multiple: true },
306
+ identity: { type: 'string' },
307
+ issuer: { type: 'string' },
308
+ untrusted: { type: 'boolean' },
309
+ },
310
+ });
311
+ const archive = positionals[0];
312
+ if (!archive)
313
+ throw new Error('run: an archive path is required');
314
+ let res;
315
+ try {
316
+ res = runBundle(archive, {
317
+ roots: values.root ?? [], identity: values.identity, issuer: values.issuer,
318
+ allowUntrusted: values.untrusted, args: theirs,
319
+ });
320
+ }
321
+ catch (err) {
322
+ if (err.code !== 'ERR_BUNDLE_UNTRUSTED')
323
+ throw err;
324
+ const state = err.state;
325
+ io.err(`error: ${message(err)}`);
326
+ return state ? STATES[state].code : 2;
327
+ }
328
+ if (res.signal)
329
+ process.kill(process.pid, res.signal);
330
+ return res.status ?? 70;
331
+ }
332
+ // The audit gate. The review itself needs judgement, so this command does the
333
+ // two mechanical halves around it: say what is about to be reviewed, and refuse
334
+ // to let signing proceed without a clean verdict over exactly these bytes.
335
+ function audit(args, io) {
336
+ const { values, positionals } = parseArgs({
337
+ args,
338
+ allowPositionals: true,
339
+ options: {
340
+ baseline: { type: 'string', short: 'b' },
341
+ verdict: { type: 'string', short: 'v' },
342
+ note: { type: 'string', short: 'n' },
343
+ check: { type: 'boolean' },
344
+ approve: { type: 'boolean' },
345
+ },
346
+ });
347
+ const bundle = positionals[0];
348
+ if (!bundle)
349
+ throw new Error('audit: an archive path is required');
350
+ if (values.check && values.approve)
351
+ throw new Error('audit: --check and --approve are alternatives');
352
+ const options = { bundle, verdict: values.verdict, baseline: values.baseline };
353
+ if (values.check) {
354
+ const verdict = AUDIT.check(options);
355
+ const notes = (verdict.findings ?? []).length;
356
+ io.err(`* audited: ${verdict.summary ?? 'pass'}`);
357
+ io.err(` ${verdict.reviewed ?? '?'} of ${verdict.members ?? '?'} members reviewed, ` +
358
+ `${notes} finding${notes === 1 ? '' : 's'}`);
359
+ if (verdict.baselineSha256)
360
+ io.err(` as a diff against ${verdict.baselineSha256.slice(0, 16)}…`);
361
+ return 0;
362
+ }
363
+ if (values.approve) {
364
+ const verdict = AUDIT.approve({ ...options, note: values.note });
365
+ io.err(`* recorded a pass over ${verdict.sha256.slice(0, 16)}… in ${AUDIT.verdictPath(bundle, values.verdict)}`);
366
+ return 0;
367
+ }
368
+ const found = AUDIT.prepare(options);
369
+ io.out(`${found.bundle}: ${STATES[found.state]?.label ?? found.state}, ${found.members.length} members`);
370
+ io.out(` sha256: ${found.sha256}`);
371
+ if (found.state === 'unsigned') {
372
+ io.out(' unsigned, as an archive that has not been signed yet should be');
373
+ }
374
+ if (found.baseline) {
375
+ io.out(` against ${found.baseline.path} (${found.baseline.sha256.slice(0, 16)}…)`);
376
+ io.out(` ${found.baseline.added.length} added, ${found.baseline.removed.length} removed, ` +
377
+ `${found.baseline.carried} carried over`);
378
+ for (const name of found.baseline.added.slice(0, 10))
379
+ io.out(` + ${name}`);
380
+ for (const name of found.baseline.removed.slice(0, 10))
381
+ io.out(` - ${name}`);
382
+ }
383
+ else {
384
+ io.out(' no baseline — the review is of everything, not a diff');
385
+ }
386
+ io.err('');
387
+ io.err('* review it, then record the verdict:');
388
+ io.err(` BUNDLE_AUDIT_VERDICT=${found.verdict} \\`);
389
+ io.err(found.baseline
390
+ ? ` claude "/audit-bundle ${bundle} against ${found.baseline.path}"`
391
+ : ` claude "/audit-bundle ${bundle}"`);
392
+ io.err(' or, having read it yourself:');
393
+ io.err(` bundle audit --approve --note '<what you checked>' ${bundle}`);
394
+ io.err("* then gate signing on it: bundle audit --check ... && bundle sign ...");
395
+ return 0;
396
+ }
397
+ // Wrap an archive in a node runtime that verifies itself before running it.
398
+ // The signing half is the same as `sign` — the finished executable is one
399
+ // signed file whose hash covers the runtime, the verifier and the application
400
+ // alike, which is what lets it check itself with something inside itself.
401
+ async function sea(args, io) {
402
+ const { values, positionals } = parseArgs({
403
+ args,
404
+ allowPositionals: true,
405
+ options: {
406
+ output: { type: 'string', short: 'o' },
407
+ node: { type: 'string' },
408
+ base: { type: 'string' },
409
+ sigstore: { type: 'boolean', default: true },
410
+ untrusted: { type: 'boolean' },
411
+ root: { type: 'string', short: 'r', multiple: true },
412
+ identity: { type: 'string' },
413
+ issuer: { type: 'string' },
414
+ key: { type: 'string', short: 'k' },
415
+ chain: { type: 'string', short: 'c' },
416
+ hash: { type: 'string', default: 'sha256' },
417
+ sign: { type: 'string', default: 'sha256' },
418
+ flow: { type: 'string', default: 'auto' },
419
+ token: { type: 'string' },
420
+ 'oidc-issuer': { type: 'string' },
421
+ connector: { type: 'string' },
422
+ fulcio: { type: 'string' },
423
+ rekor: { type: 'string' },
424
+ tsa: { type: 'string' },
425
+ },
426
+ });
427
+ const app = positionals[0];
428
+ if (!values.output)
429
+ throw new Error('sea: --output is required');
430
+ if (Boolean(values.key) !== Boolean(values.chain))
431
+ throw new Error('sea: --key and --chain must be given together');
432
+ const SEA = await import('./sea.js');
433
+ // A policy baked into a runtime is the last word: it would be no policy at
434
+ // all if the command line could drop it. Nothing baked, nothing to seal —
435
+ // that runtime takes its policy from flags and the environment, the way
436
+ // `bundle run` does.
437
+ const bootstrap = {
438
+ roots: values.root,
439
+ identity: values.identity,
440
+ issuer: values.issuer,
441
+ allowUntrusted: values.untrusted,
442
+ sealed: Boolean(values.root?.length || values.identity || values.issuer),
443
+ };
444
+ if (!app) {
445
+ if (values.key || values.chain) {
446
+ throw new Error('sea: signing options need an archive to sign — a verifying node carries none');
447
+ }
448
+ if (values.base)
449
+ throw new Error('sea: --base reuses a runtime; without an archive there is nothing to add to it');
450
+ io.err('* building a verifying node (node runtime + verifier, no application)');
451
+ const built = await SEA.createSeaBase({
452
+ output: values.output,
453
+ node: values.node,
454
+ sigstore: values.sigstore,
455
+ bootstrap,
456
+ });
457
+ io.err(`* wrote ${built.output} (${built.size} bytes, ${built.verifier.length} verifier members)`);
458
+ io.err(`* run an archive with it: ${values.output} <archive> [args...]`);
459
+ return 0;
460
+ }
461
+ const signer = await chooseSigner(values, io);
462
+ const res = await SEA.buildSea({
463
+ app,
464
+ output: values.output,
465
+ node: values.node,
466
+ base: values.base,
467
+ sigstore: values.sigstore,
468
+ signer,
469
+ hashAlg: values.hash,
470
+ signAlg: values.sign,
471
+ bootstrap,
472
+ log: io.err,
473
+ });
474
+ if (res.output)
475
+ io.err(`* wrote ${res.output} (${res.size} bytes)`);
476
+ return 0;
477
+ }
478
+ // Refresh the sigstore trust root. Verification is deliberately offline — it
479
+ // will not reach for the network to decide whether to mount something — so the
480
+ // trust material has to be fetched by an explicit step like this one. It comes
481
+ // over TUF, which is signed metadata with its own root of trust rather than a
482
+ // plain download.
483
+ async function trust(args, io) {
484
+ const { values } = parseArgs({ args, options: { mirror: { type: 'string' } } });
485
+ const SIGSTORE = await import('./sigstore.js');
486
+ const path = await SIGSTORE.refreshTrustedRoot(values.mirror ? { mirror: values.mirror } : {});
487
+ io.out(`sigstore trust root refreshed: ${path}`);
488
+ return 0;
489
+ }
490
+ // Install the auditing skill into a project, so whoever is about to run an
491
+ // archive has the review procedure to hand rather than having to find it here.
492
+ function skill(args, io) {
493
+ const { values, positionals } = parseArgs({
494
+ args,
495
+ allowPositionals: true,
496
+ options: {
497
+ dir: { type: 'string', short: 'd' },
498
+ force: { type: 'boolean', short: 'f' },
499
+ list: { type: 'boolean', short: 'l' },
500
+ },
501
+ });
502
+ const available = SKILLS.skills();
503
+ if (values.list) {
504
+ if (!available.length)
505
+ io.out('this package carries no skills');
506
+ for (const entry of available)
507
+ io.out(`${entry.name}\n ${entry.description}`);
508
+ return 0;
509
+ }
510
+ const names = positionals.length ? positionals : available.map((entry) => entry.name);
511
+ if (!names.length)
512
+ throw new Error('skill: this package carries no skills to install');
513
+ for (const name of names) {
514
+ const res = SKILLS.install(name, { dir: values.dir, force: values.force });
515
+ for (const file of res.written)
516
+ io.err(`+ ${PATH.relative(process.cwd(), file)}`);
517
+ for (const file of res.skipped)
518
+ io.err(`= ${PATH.relative(process.cwd(), file)} (already there; --force to overwrite)`);
519
+ io.out(`installed skill '${res.name}' into ${PATH.relative(process.cwd(), res.path) || res.path}`);
520
+ }
521
+ return 0;
522
+ }
523
+ // Two signers, one interface. Either way the certificate has to be in hand
524
+ // before the archive is built, because AUTHORITY.PEM carries it and
525
+ // AUTHORITY.PEM is inside the region the hash covers — so this runs first and
526
+ // the signature itself is made later, over the finished bytes.
527
+ async function chooseSigner(values, io) {
528
+ if (values.key && values.chain) {
529
+ io.err('* signing against the supplied certificate chain');
530
+ return fileSigner({ key: values.key, chain: values.chain, signAlg: values.sign });
531
+ }
532
+ const SIGSTORE = await import('./sigstore.js');
533
+ io.err('* signing through sigstore');
534
+ return await SIGSTORE.signer({
535
+ signAlg: values.sign,
536
+ flow: values.flow,
537
+ token: values.token,
538
+ issuer: values['oidc-issuer'],
539
+ connector: values.connector,
540
+ fulcioURL: values.fulcio,
541
+ rekorURL: values.rekor,
542
+ tsaURL: values.tsa,
543
+ log: io.err,
544
+ });
545
+ }
546
+ function readStdin() {
547
+ return new Promise((resolve, reject) => {
548
+ let data = '';
549
+ process.stdin.setEncoding('utf-8');
550
+ process.stdin.on('data', (chunk) => { data += chunk; })
551
+ .on('end', () => resolve(data))
552
+ .on('error', reject);
553
+ });
554
+ }
555
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface WalkOptions {
2
+ /** Directory names skipped wherever they appear (default: ['node_modules']). */
3
+ exclude?: string[] | undefined;
4
+ }
5
+ /**
6
+ * Every file under `dir`, as `/`-separated paths relative to it, sorted.
7
+ *
8
+ * A nested `node_modules` is skipped by default: its contents belong to the
9
+ * packages inside it, which `dependencyFiles` reaches through the dependency
10
+ * graph instead — so a hoisted tree and a nested one produce the same set.
11
+ */
12
+ export declare function walk(dir: string, { exclude }?: WalkOptions, prefix?: string): string[];
13
+ /**
14
+ * Every file of `names` and of everything they depend on, as paths relative to
15
+ * `base`, sorted. Packages are located the way node locates them, so the answer
16
+ * describes the tree that is actually installed rather than what a lock file
17
+ * says should be.
18
+ *
19
+ * A dependency that is not installed under `base` — missing, or hoisted above
20
+ * it, where no member path can name it — is an error rather than a silent
21
+ * omission, because a bundle whose closure is incomplete is a bundle that
22
+ * fails at runtime on a machine other than the one that built it. Only an
23
+ * optional dependency may be absent.
24
+ */
25
+ export declare function dependencyFiles(names: string[], base: string): string[];
26
+ export interface ModuleFilesOptions {
27
+ /** Directory the result is relative to. */
28
+ base: string;
29
+ /** Individual files to include, relative to `base`. */
30
+ files?: string[] | undefined;
31
+ /** Directories to include whole, relative to `base`. */
32
+ dirs?: string[] | undefined;
33
+ /** Package names whose dependency closure to include. */
34
+ dependencies?: string[] | undefined;
35
+ /** Keep only files matching one of these; a bare extension counts. */
36
+ filter?: ((name: string) => boolean) | undefined;
37
+ }
38
+ /** The three sources above, combined and de-duplicated. */
39
+ export declare function moduleFiles({ base, files, dirs, dependencies, filter }: ModuleFilesOptions): string[];
40
+ /**
41
+ * The shell launcher this package ships: the prefix that turns an archive into
42
+ * a file you can run by name. `bundle sign --launcher` uses it, so nobody has
43
+ * to know it lives inside `node_modules`.
44
+ */
45
+ export declare function launcherPath(): string;
46
+ /** This package's own root — the directory its `package.json` sits in. */
47
+ export declare function packageRoot(): string;
48
+ /**
49
+ * The directory this package's runnable modules are in: `dist` once compiled,
50
+ * `src` when the source is being run directly under node's type stripping.
51
+ */
52
+ export declare function moduleDir(): string;
53
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IACxB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAA0B,EAAE,GAAE,WAAgB,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CASzG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAkCvE;AAkBD,MAAM,WAAW,kBAAkB;IAC/B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;CACpD;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAU,EAAE,IAAS,EAAE,YAAiB,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAQpH;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC"}