pyfig 0.6.3 → 0.7.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 (75) hide show
  1. package/README.md +77 -166
  2. package/SECURITY.md +16 -5
  3. package/dist/cjs/index.js +471 -980
  4. package/dist/cjs/index.js.map +6 -15
  5. package/dist/index.d.ts +2 -9
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/process.d.ts +6 -12
  10. package/dist/process.d.ts.map +1 -1
  11. package/dist/process.js +35 -54
  12. package/dist/process.js.map +1 -1
  13. package/dist/pyfig.d.ts +31 -0
  14. package/dist/pyfig.d.ts.map +1 -0
  15. package/dist/pyfig.js +275 -0
  16. package/dist/pyfig.js.map +1 -0
  17. package/dist/uv.d.ts +3 -0
  18. package/dist/uv.d.ts.map +1 -0
  19. package/dist/uv.js +423 -0
  20. package/dist/uv.js.map +1 -0
  21. package/package.json +6 -12
  22. package/dist/cjs/sync-resolver.js +0 -1217
  23. package/dist/cjs/sync-resolver.js.map +0 -19
  24. package/dist/cli.d.ts +0 -3
  25. package/dist/cli.d.ts.map +0 -1
  26. package/dist/cli.js +0 -48
  27. package/dist/cli.js.map +0 -1
  28. package/dist/client.d.ts +0 -15
  29. package/dist/client.d.ts.map +0 -1
  30. package/dist/client.js +0 -25
  31. package/dist/client.js.map +0 -1
  32. package/dist/config.d.ts +0 -62
  33. package/dist/config.d.ts.map +0 -1
  34. package/dist/config.js +0 -112
  35. package/dist/config.js.map +0 -1
  36. package/dist/package-target.d.ts +0 -8
  37. package/dist/package-target.d.ts.map +0 -1
  38. package/dist/package-target.js +0 -81
  39. package/dist/package-target.js.map +0 -1
  40. package/dist/pep440.d.ts +0 -12
  41. package/dist/pep440.d.ts.map +0 -1
  42. package/dist/pep440.js +0 -21
  43. package/dist/pep440.js.map +0 -1
  44. package/dist/probes.d.ts +0 -37
  45. package/dist/probes.d.ts.map +0 -1
  46. package/dist/probes.js +0 -145
  47. package/dist/probes.js.map +0 -1
  48. package/dist/project-root.d.ts +0 -3
  49. package/dist/project-root.d.ts.map +0 -1
  50. package/dist/project-root.js +0 -22
  51. package/dist/project-root.js.map +0 -1
  52. package/dist/provision-lock.d.ts +0 -10
  53. package/dist/provision-lock.d.ts.map +0 -1
  54. package/dist/provision-lock.js +0 -24
  55. package/dist/provision-lock.js.map +0 -1
  56. package/dist/provision.d.ts +0 -26
  57. package/dist/provision.d.ts.map +0 -1
  58. package/dist/provision.js +0 -685
  59. package/dist/provision.js.map +0 -1
  60. package/dist/runners.d.ts +0 -14
  61. package/dist/runners.d.ts.map +0 -1
  62. package/dist/runners.js +0 -71
  63. package/dist/runners.js.map +0 -1
  64. package/dist/runtime-files.d.ts +0 -3
  65. package/dist/runtime-files.d.ts.map +0 -1
  66. package/dist/runtime-files.js +0 -12
  67. package/dist/runtime-files.js.map +0 -1
  68. package/dist/sync-resolver.d.ts +0 -2
  69. package/dist/sync-resolver.d.ts.map +0 -1
  70. package/dist/sync-resolver.js +0 -15
  71. package/dist/sync-resolver.js.map +0 -1
  72. package/dist/virtual-environment.d.ts +0 -11
  73. package/dist/virtual-environment.d.ts.map +0 -1
  74. package/dist/virtual-environment.js +0 -49
  75. package/dist/virtual-environment.js.map +0 -1
package/dist/uv.js ADDED
@@ -0,0 +1,423 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { createReadStream, createWriteStream } from 'node:fs';
3
+ import { chmod, copyFile, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile, } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { Readable } from 'node:stream';
7
+ import { pipeline } from 'node:stream/promises';
8
+ import { maxSatisfying, valid as validVersion, } from '@renovatebot/pep440';
9
+ import { unzipSync } from 'fflate';
10
+ import { withLock } from 'loqkit';
11
+ import * as tar from 'tar';
12
+ import { EnvHttpProxyAgent, fetch } from 'undici';
13
+ import { capture, environmentValue, findExecutable } from './process.js';
14
+ const RELEASE_PAGE_SIZE = 100;
15
+ const RELEASE_MAX_PAGES = 20;
16
+ const RELEASE_METADATA_TTL_MS = 24 * 60 * 60_000;
17
+ const METADATA_TIMEOUT_MS = 30_000;
18
+ const DOWNLOAD_TIMEOUT_MS = 5 * 60_000;
19
+ const COORDINATION_TIMEOUT_MS = 15 * 60_000;
20
+ /** Prefer a compatible PATH or cached uv, then provision an official release. */
21
+ export async function resolveUv(specifier, cwd, env) {
22
+ const context = {
23
+ cache: uvCacheDirectory(env),
24
+ cwd,
25
+ env,
26
+ specifier,
27
+ };
28
+ const existing = await findAvailableUv(context);
29
+ if (existing)
30
+ return existing;
31
+ const policy = createHash('sha256').update(specifier).digest('hex');
32
+ return withProvisioningLock({
33
+ key: `uv-policy:${canonicalPath(context.cache)}:${policy}`,
34
+ check: () => findAvailableUv(context),
35
+ mutate: async () => {
36
+ const release = await resolveUvRelease(context);
37
+ const destination = uvInstallDirectory(context, release.version);
38
+ return withProvisioningLock({
39
+ key: `uv-release:${canonicalPath(destination)}`,
40
+ check: () => probeUv(uvExecutable(context, release.version), context, release.version),
41
+ mutate: async () => {
42
+ await installUv(release, context);
43
+ const installed = await probeUv(uvExecutable(context, release.version), context, release.version);
44
+ if (!installed) {
45
+ throw new Error(`Managed uv ${release.version} failed its post-install probe.`);
46
+ }
47
+ return installed;
48
+ },
49
+ });
50
+ },
51
+ });
52
+ }
53
+ async function findAvailableUv(context) {
54
+ const external = await findExecutable('uv', context.cwd, context.env);
55
+ if (external && await probeUv(external, context))
56
+ return external;
57
+ return findCachedUv(context);
58
+ }
59
+ async function findCachedUv(context) {
60
+ const root = uvInstallRoot(context);
61
+ const entries = await readdir(root, { withFileTypes: true }).catch(() => []);
62
+ let versions = entries
63
+ .filter(entry => entry.isDirectory() && validVersion(entry.name) === entry.name)
64
+ .map(entry => entry.name);
65
+ while (versions.length > 0) {
66
+ const version = maxSatisfying(versions, context.specifier);
67
+ if (!version)
68
+ return null;
69
+ const executable = await probeUv(uvExecutable(context, version), context, version);
70
+ if (executable)
71
+ return executable;
72
+ versions = versions.filter(candidate => candidate !== version);
73
+ }
74
+ return null;
75
+ }
76
+ async function probeUv(executable, context, expectedVersion) {
77
+ try {
78
+ const output = await capture(executable, ['--version'], context.cwd, context.env);
79
+ const version = validVersion(output.match(/^uv\s+(\S+)/iu)?.[1] ?? '');
80
+ return version && (!expectedVersion || version === expectedVersion) &&
81
+ maxSatisfying([version], context.specifier)
82
+ ? executable
83
+ : null;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ async function resolveUvRelease(context) {
90
+ const catalog = await ensureUvReleaseCatalog(context);
91
+ const asset = uvAsset();
92
+ const candidates = catalog.releases.filter(release => release.assets.includes(asset) && release.assets.includes(`${asset}.sha256`));
93
+ const version = maxSatisfying(candidates.map(release => release.version), context.specifier);
94
+ const release = candidates.find(candidate => candidate.version === version);
95
+ if (!release)
96
+ throw new Error(`No published uv release satisfies ${context.specifier}.`);
97
+ return release;
98
+ }
99
+ async function ensureUvReleaseCatalog(context) {
100
+ const file = uvReleaseMetadataFile(context);
101
+ const stale = await readUvReleaseCatalog(file);
102
+ try {
103
+ return await withProvisioningLock({
104
+ key: `uv-metadata:${canonicalPath(file)}`,
105
+ check: () => readFreshUvReleaseCatalog(file),
106
+ mutate: async () => {
107
+ const catalog = await fetchUvReleaseCatalog(context.env);
108
+ await writeUvReleaseCatalog(file, catalog);
109
+ return catalog;
110
+ },
111
+ });
112
+ }
113
+ catch (error) {
114
+ const fallback = await readUvReleaseCatalog(file) ?? stale;
115
+ if (fallback)
116
+ return fallback;
117
+ throw error;
118
+ }
119
+ }
120
+ async function fetchUvReleaseCatalog(env) {
121
+ const dispatcher = proxyDispatcher(env);
122
+ const releases = new Map();
123
+ let exhausted = false;
124
+ try {
125
+ for (let page = 1; page <= RELEASE_MAX_PAGES; page += 1) {
126
+ const text = await downloadText(`https://api.github.com/repos/astral-sh/uv/releases?per_page=${RELEASE_PAGE_SIZE}&page=${page}`, METADATA_TIMEOUT_MS, dispatcher, githubApiHeaders(env));
127
+ const payload = JSON.parse(text);
128
+ if (!Array.isArray(payload))
129
+ throw new Error('GitHub returned invalid uv release metadata.');
130
+ for (const candidate of payload) {
131
+ if (!candidate || typeof candidate !== 'object')
132
+ continue;
133
+ const value = candidate;
134
+ if (value.draft === true || typeof value.tag_name !== 'string')
135
+ continue;
136
+ const version = validVersion(value.tag_name);
137
+ if (version) {
138
+ releases.set(version, {
139
+ assets: releaseAssetNames(value.assets),
140
+ tag: value.tag_name,
141
+ version,
142
+ });
143
+ }
144
+ }
145
+ if (payload.length < RELEASE_PAGE_SIZE) {
146
+ exhausted = true;
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ finally {
152
+ await dispatcher?.close();
153
+ }
154
+ if (!exhausted)
155
+ throw new Error(`uv release catalog exceeded ${RELEASE_MAX_PAGES} pages.`);
156
+ if (releases.size === 0)
157
+ throw new Error('GitHub returned no usable uv releases.');
158
+ return { fetchedAt: Date.now(), releases: [...releases.values()] };
159
+ }
160
+ function githubApiHeaders(env) {
161
+ const token = [environmentValue(env, 'GITHUB_TOKEN'), environmentValue(env, 'GH_TOKEN')]
162
+ .find(value => typeof value === 'string' && value.trim().length > 0);
163
+ if (token && /[\r\n]/u.test(token)) {
164
+ throw new TypeError('GitHub API token must not contain line breaks.');
165
+ }
166
+ return {
167
+ Accept: 'application/vnd.github+json',
168
+ 'User-Agent': 'pyfig',
169
+ 'X-GitHub-Api-Version': '2022-11-28',
170
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
171
+ };
172
+ }
173
+ async function readFreshUvReleaseCatalog(file) {
174
+ const catalog = await readUvReleaseCatalog(file);
175
+ if (!catalog)
176
+ return null;
177
+ const age = Date.now() - catalog.fetchedAt;
178
+ return age >= 0 && age < RELEASE_METADATA_TTL_MS ? catalog : null;
179
+ }
180
+ async function readUvReleaseCatalog(file) {
181
+ try {
182
+ return parseUvReleaseCatalog(JSON.parse(await readFile(file, 'utf8')));
183
+ }
184
+ catch {
185
+ return null;
186
+ }
187
+ }
188
+ function parseUvReleaseCatalog(value) {
189
+ if (!value || typeof value !== 'object')
190
+ return null;
191
+ const catalog = value;
192
+ if (!Number.isSafeInteger(catalog.fetchedAt) || catalog.fetchedAt < 0 ||
193
+ !Array.isArray(catalog.releases))
194
+ return null;
195
+ const releases = [];
196
+ for (const candidate of catalog.releases) {
197
+ if (!candidate || typeof candidate !== 'object')
198
+ return null;
199
+ const release = candidate;
200
+ if (!Array.isArray(release.assets) ||
201
+ !release.assets.every(asset => typeof asset === 'string') ||
202
+ typeof release.tag !== 'string' ||
203
+ !/^[A-Za-z0-9][A-Za-z0-9._+-]*$/u.test(release.tag) ||
204
+ typeof release.version !== 'string' ||
205
+ validVersion(release.version) !== release.version)
206
+ return null;
207
+ releases.push({
208
+ assets: release.assets,
209
+ tag: release.tag,
210
+ version: release.version,
211
+ });
212
+ }
213
+ return { fetchedAt: catalog.fetchedAt, releases };
214
+ }
215
+ async function writeUvReleaseCatalog(file, catalog) {
216
+ await mkdir(path.dirname(file), { recursive: true });
217
+ const staged = path.join(path.dirname(file), `.${path.basename(file)}.${uniqueSuffix()}.tmp`);
218
+ try {
219
+ await writeFile(staged, `${JSON.stringify(catalog)}\n`, { encoding: 'utf8', flag: 'wx' });
220
+ if (process.platform === 'win32')
221
+ await rm(file, { force: true });
222
+ await rename(staged, file);
223
+ }
224
+ finally {
225
+ await rm(staged, { force: true });
226
+ }
227
+ }
228
+ async function installUv(release, context) {
229
+ const asset = uvAsset();
230
+ const baseUrl = `https://github.com/astral-sh/uv/releases/download/${release.tag}`;
231
+ const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-uv-'));
232
+ const dispatcher = proxyDispatcher(context.env);
233
+ try {
234
+ const archive = path.join(temporary, asset);
235
+ await download(`${baseUrl}/${asset}`, archive, dispatcher);
236
+ const expected = (await downloadText(`${baseUrl}/${asset}.sha256`, DOWNLOAD_TIMEOUT_MS, dispatcher)).trim().split(/\s+/u)[0];
237
+ const actual = await sha256File(archive);
238
+ if (!expected || expected.toLowerCase() !== actual.toLowerCase()) {
239
+ throw new Error(`uv archive checksum mismatch for ${asset}.`);
240
+ }
241
+ const extracted = path.join(temporary, 'extracted');
242
+ await mkdir(extracted, { recursive: true });
243
+ const source = await extractUvExecutable(archive, asset, extracted);
244
+ if (!source)
245
+ throw new Error(`uv archive did not contain the expected executable: ${asset}.`);
246
+ await publishUv(source, release.version, context);
247
+ }
248
+ finally {
249
+ await dispatcher?.close();
250
+ await rm(temporary, { recursive: true, force: true });
251
+ }
252
+ }
253
+ async function extractUvExecutable(archive, asset, destination) {
254
+ const executableName = process.platform === 'win32' ? 'uv.exe' : 'uv';
255
+ if (!asset.endsWith('.zip')) {
256
+ await tar.x({ file: archive, cwd: destination, strict: true });
257
+ return findFile(destination, executableName);
258
+ }
259
+ // Extract only uv's bytes; archive paths never become filesystem paths.
260
+ const entries = unzipSync(await readFile(archive), {
261
+ filter: ({ name }) => path.posix.basename(name.replaceAll('\\', '/')) === executableName,
262
+ });
263
+ const matches = Object.entries(entries)
264
+ .filter(([name]) => path.posix.basename(name.replaceAll('\\', '/')) === executableName);
265
+ if (matches.length !== 1 || !matches[0])
266
+ return null;
267
+ const source = path.join(destination, executableName);
268
+ await writeFile(source, matches[0][1], { flag: 'wx' });
269
+ return source;
270
+ }
271
+ async function publishUv(source, version, context) {
272
+ const installDirectory = uvInstallDirectory(context, version);
273
+ await mkdir(installDirectory, { recursive: true });
274
+ const executable = uvExecutable(context, version);
275
+ const staged = path.join(installDirectory, `.${path.basename(executable)}.${uniqueSuffix()}.tmp`);
276
+ try {
277
+ await copyFile(source, staged);
278
+ if (process.platform !== 'win32')
279
+ await chmod(staged, 0o755);
280
+ if (!await probeUv(staged, { ...context, specifier: `==${version}` })) {
281
+ throw new Error(`Downloaded uv executable is not version ${version}.`);
282
+ }
283
+ if (process.platform === 'win32')
284
+ await rm(executable, { force: true });
285
+ await rename(staged, executable);
286
+ }
287
+ finally {
288
+ await rm(staged, { force: true });
289
+ }
290
+ }
291
+ async function download(url, destination, dispatcher) {
292
+ const response = await fetch(url, {
293
+ dispatcher,
294
+ redirect: 'follow',
295
+ signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS),
296
+ });
297
+ if (!response.ok || !response.body) {
298
+ await response.body?.cancel();
299
+ throw new Error(`Could not download ${url}: HTTP ${response.status}.`);
300
+ }
301
+ await pipeline(Readable.fromWeb(response.body), createWriteStream(destination, { flags: 'wx' }));
302
+ }
303
+ async function downloadText(url, timeoutMs, dispatcher, headers) {
304
+ const response = await fetch(url, {
305
+ dispatcher,
306
+ headers,
307
+ redirect: 'follow',
308
+ signal: AbortSignal.timeout(timeoutMs),
309
+ });
310
+ if (!response.ok) {
311
+ await response.body?.cancel();
312
+ throw new Error(`Could not download ${url}: HTTP ${response.status}.`);
313
+ }
314
+ return response.text();
315
+ }
316
+ function proxyDispatcher(env) {
317
+ const httpProxy = environmentValue(env, 'http_proxy') ?? environmentValue(env, 'HTTP_PROXY');
318
+ const httpsProxy = environmentValue(env, 'https_proxy') ?? environmentValue(env, 'HTTPS_PROXY');
319
+ if (!httpProxy && !httpsProxy)
320
+ return undefined;
321
+ return new EnvHttpProxyAgent({
322
+ httpProxy,
323
+ httpsProxy,
324
+ noProxy: environmentValue(env, 'no_proxy') ?? environmentValue(env, 'NO_PROXY'),
325
+ });
326
+ }
327
+ async function sha256File(file) {
328
+ const hash = createHash('sha256');
329
+ for await (const chunk of createReadStream(file))
330
+ hash.update(chunk);
331
+ return hash.digest('hex');
332
+ }
333
+ async function findFile(directory, name) {
334
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
335
+ const target = path.join(directory, entry.name);
336
+ if (entry.isFile() && entry.name === name)
337
+ return target;
338
+ if (entry.isDirectory()) {
339
+ const nested = await findFile(target, name);
340
+ if (nested)
341
+ return nested;
342
+ }
343
+ }
344
+ return null;
345
+ }
346
+ /** Apply Loqkit's pre-lock and post-lock predicates to one cache mutation. */
347
+ async function withProvisioningLock(options) {
348
+ let existing;
349
+ const result = await withLock({ resource: options.key }, options.mutate, {
350
+ key: options.key,
351
+ name: 'Pyfig uv setup',
352
+ namespace: 'pyfig',
353
+ timeout: COORDINATION_TIMEOUT_MS,
354
+ predicate: async () => {
355
+ const value = await options.check();
356
+ if (value === null)
357
+ return true;
358
+ existing = { value };
359
+ return false;
360
+ },
361
+ });
362
+ if (result.context.state === 'executed')
363
+ return result.value;
364
+ if (existing)
365
+ return existing.value;
366
+ throw new Error(`Provisioning check for ${options.key} did not produce uv.`);
367
+ }
368
+ function uvCacheDirectory(env) {
369
+ const home = environmentValue(env, process.platform === 'win32' ? 'USERPROFILE' : 'HOME') ??
370
+ os.homedir();
371
+ const root = process.platform === 'win32'
372
+ ? environmentValue(env, 'LOCALAPPDATA') ?? path.join(home, 'AppData', 'Local')
373
+ : process.platform === 'darwin'
374
+ ? path.join(home, 'Library', 'Caches')
375
+ : environmentValue(env, 'XDG_CACHE_HOME') ?? path.join(home, '.cache');
376
+ return path.resolve(root, 'pyfig');
377
+ }
378
+ function uvInstallRoot(context) {
379
+ return path.join(context.cache, 'tools', 'uv');
380
+ }
381
+ function uvInstallDirectory(context, version) {
382
+ return path.join(uvInstallRoot(context), version);
383
+ }
384
+ function uvExecutable(context, version) {
385
+ return path.join(uvInstallDirectory(context, version), process.platform === 'win32' ? 'uv.exe' : 'uv');
386
+ }
387
+ function uvReleaseMetadataFile(context) {
388
+ return path.join(context.cache, 'metadata', 'uv-releases.json');
389
+ }
390
+ function uvAsset() {
391
+ const architecture = process.arch === 'x64'
392
+ ? 'x86_64'
393
+ : process.arch === 'arm64'
394
+ ? 'aarch64'
395
+ : null;
396
+ if (!architecture)
397
+ throw new Error(`uv setup does not support architecture ${process.arch}.`);
398
+ if (process.platform === 'win32')
399
+ return `uv-${architecture}-pc-windows-msvc.zip`;
400
+ if (process.platform === 'darwin')
401
+ return `uv-${architecture}-apple-darwin.tar.gz`;
402
+ if (process.platform === 'linux')
403
+ return `uv-${architecture}-unknown-linux-musl.tar.gz`;
404
+ throw new Error(`uv setup does not support platform ${process.platform}.`);
405
+ }
406
+ function releaseAssetNames(value) {
407
+ if (!Array.isArray(value))
408
+ return [];
409
+ return value.flatMap(entry => {
410
+ if (!entry || typeof entry !== 'object')
411
+ return [];
412
+ const name = entry.name;
413
+ return typeof name === 'string' ? [name] : [];
414
+ });
415
+ }
416
+ function canonicalPath(value) {
417
+ const normalized = path.resolve(value);
418
+ return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
419
+ }
420
+ function uniqueSuffix() {
421
+ return `${process.pid}.${randomUUID()}`;
422
+ }
423
+ //# sourceMappingURL=uv.js.map
package/dist/uv.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uv.js","sourceRoot":"","sources":["../src/uv.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pyfig",
3
- "version": "0.6.3",
4
- "description": "Prepare uv-first Python runtime environments without editing project files.",
3
+ "version": "0.7.1",
4
+ "description": "Resolve uv and Python executables into one pinned runtime context.",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -12,9 +12,6 @@
12
12
  "require": "./dist/cjs/index.js"
13
13
  }
14
14
  },
15
- "bin": {
16
- "pyfig": "dist/cli.js"
17
- },
18
15
  "files": [
19
16
  "dist/",
20
17
  "LICENSE",
@@ -24,7 +21,6 @@
24
21
  "scripts": {
25
22
  "build": "bun run scripts/build.ts",
26
23
  "test": "bun test",
27
- "test:zero-python": "bun run scripts/smoke-zero-python.ts",
28
24
  "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.scripts.json",
29
25
  "verify": "bun run typecheck && bun test",
30
26
  "release": "bun run scripts/release.ts",
@@ -35,9 +31,8 @@
35
31
  "keywords": [
36
32
  "python",
37
33
  "uv",
38
- "bootstrap",
39
34
  "bun",
40
- "cli"
35
+ "node"
41
36
  ],
42
37
  "author": "Reggie Bowser",
43
38
  "license": "MIT",
@@ -62,12 +57,10 @@
62
57
  },
63
58
  "dependencies": {
64
59
  "@renovatebot/pep440": "^5.0.1",
65
- "commander": "^14.0.3",
66
- "env-paths": "^4.0.0",
67
60
  "fflate": "^0.8.3",
68
61
  "loqkit": ">=0.0.5 <0.1.0",
69
- "tar": "^7.4.3",
70
- "undici": "^7.30.1",
62
+ "tar": "^7.5.22",
63
+ "undici": "^8.12.3",
71
64
  "which": "^6.0.1"
72
65
  },
73
66
  "devDependencies": {
@@ -75,6 +68,7 @@
75
68
  "@types/node": "^26.6.6",
76
69
  "@types/semver": "^7.8.0",
77
70
  "@types/which": "^3.0.4",
71
+ "commander": "^14.0.3",
78
72
  "semver": "^7.8.5",
79
73
  "typescript": "^7.0.2"
80
74
  }