@nemo-cli/shared 0.1.4 → 0.1.5

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/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from "node:module";
2
- import path, { dirname as dirname$1, resolve } from "node:path";
2
+ import path, { basename, dirname as dirname$1, join, parse, resolve } from "node:path";
3
3
  import fse from "fs-extra";
4
4
  import { glob as glob$1 } from "glob";
5
5
  import { cancel, confirm, group, groupMultiselect, intro, isCancel, log as log$1, multiselect, note, outro, progress, select, spinner, stream, taskLog, tasks, text } from "@clack/prompts";
@@ -7,20 +7,19 @@ import ansiEscapes, { clearScreen as clearScreen$1, clearTerminal as clearTermin
7
7
  import chalk, { default as colors } from "chalk";
8
8
  import winston from "winston";
9
9
  import { fileURLToPath } from "node:url";
10
- import { loadConfig } from "unconfig";
11
- import open, { apps, openApp } from "open";
10
+ import fs, { existsSync } from "node:fs";
12
11
  import process$1 from "node:process";
12
+ import fs$1 from "node:fs/promises";
13
13
  import { Command } from "commander";
14
14
  import { x as x$1 } from "tinyexec";
15
15
  import { $ } from "zx";
16
16
  import { ErrorMessage } from "@nemo-cli/ui";
17
- import { existsSync } from "node:fs";
18
- import { homedir } from "node:os";
19
- import Configstore from "configstore";
20
17
  import { search } from "@inquirer/prompts";
21
18
  import Fuse from "fuse.js";
19
+ import open, { apps, openApp } from "open";
20
+ import { homedir } from "node:os";
21
+ import Configstore from "configstore";
22
22
  import instance, { spinners } from "ora";
23
- import fs from "node:fs/promises";
24
23
  import yaml from "yaml";
25
24
 
26
25
  //#region \0rolldown/runtime.js
@@ -201,9 +200,520 @@ const log = {
201
200
  const filename = (importMate) => fileURLToPath(importMate.url);
202
201
  const dirname = (importMate) => dirname$1(filename(importMate));
203
202
  const cwdPathname = (dirname) => resolve(process.cwd(), dirname);
203
+ /**
204
+ * Join path segments and resolve to absolute path from current working directory
205
+ * @param segments - Path segments to join
206
+ * @returns Absolute path
207
+ *
208
+ * @example
209
+ * joinPath('packages', 'workspace', 'package.json')
210
+ * // Returns: /Users/user/project/packages/workspace/package.json
211
+ */
212
+ const joinPath = (...segments) => resolve(process.cwd(), join(...segments));
204
213
  const REGEXP_SPLIT_NAMES = /\W+/gm;
205
214
  const parseNames = (names) => names.split(REGEXP_SPLIT_NAMES);
206
215
 
216
+ //#endregion
217
+ //#region ../../node_modules/.pnpm/unconfig@7.4.2/node_modules/unconfig/dist/dist-A9poGcY_.mjs
218
+ function toArray(array) {
219
+ array = array ?? [];
220
+ return Array.isArray(array) ? array : [array];
221
+ }
222
+
223
+ //#endregion
224
+ //#region ../../node_modules/.pnpm/quansync@1.0.0/node_modules/quansync/dist/src-C2Pm6gXo.js
225
+ const GET_IS_ASYNC = Symbol.for("quansync.getIsAsync");
226
+ var QuansyncError = class extends Error {
227
+ constructor(message = "Unexpected promise in sync context") {
228
+ super(message);
229
+ this.name = "QuansyncError";
230
+ }
231
+ };
232
+ function isThenable(value) {
233
+ return value && typeof value === "object" && typeof value.then === "function";
234
+ }
235
+ function isQuansyncGenerator(value) {
236
+ return value && typeof value === "object" && typeof value[Symbol.iterator] === "function" && "__quansync" in value;
237
+ }
238
+ function fromObject(options) {
239
+ const generator = function* (...args) {
240
+ if (yield GET_IS_ASYNC) return yield options.async.apply(this, args);
241
+ return options.sync.apply(this, args);
242
+ };
243
+ function fn(...args) {
244
+ const iter = generator.apply(this, args);
245
+ iter.then = (...thenArgs) => options.async.apply(this, args).then(...thenArgs);
246
+ iter.__quansync = true;
247
+ return iter;
248
+ }
249
+ fn.sync = options.sync;
250
+ fn.async = options.async;
251
+ return fn;
252
+ }
253
+ function fromPromise(promise) {
254
+ return fromObject({
255
+ async: () => Promise.resolve(promise),
256
+ sync: () => {
257
+ if (isThenable(promise)) throw new QuansyncError();
258
+ return promise;
259
+ }
260
+ });
261
+ }
262
+ function unwrapYield(value, isAsync) {
263
+ if (value === GET_IS_ASYNC) return isAsync;
264
+ if (isQuansyncGenerator(value)) return isAsync ? iterateAsync(value) : iterateSync(value);
265
+ if (!isAsync && isThenable(value)) throw new QuansyncError();
266
+ return value;
267
+ }
268
+ const DEFAULT_ON_YIELD = (value) => value;
269
+ function iterateSync(generator, onYield = DEFAULT_ON_YIELD) {
270
+ let current = generator.next();
271
+ while (!current.done) try {
272
+ current = generator.next(unwrapYield(onYield(current.value, false)));
273
+ } catch (err) {
274
+ current = generator.throw(err);
275
+ }
276
+ return unwrapYield(current.value);
277
+ }
278
+ async function iterateAsync(generator, onYield = DEFAULT_ON_YIELD) {
279
+ let current = generator.next();
280
+ while (!current.done) try {
281
+ current = generator.next(await unwrapYield(onYield(current.value, true), true));
282
+ } catch (err) {
283
+ current = generator.throw(err);
284
+ }
285
+ return current.value;
286
+ }
287
+ function fromGeneratorFn(generatorFn, options) {
288
+ return fromObject({
289
+ name: generatorFn.name,
290
+ async(...args) {
291
+ return iterateAsync(generatorFn.apply(this, args), options?.onYield);
292
+ },
293
+ sync(...args) {
294
+ return iterateSync(generatorFn.apply(this, args), options?.onYield);
295
+ }
296
+ });
297
+ }
298
+ function quansync$1(input, options) {
299
+ if (isThenable(input)) return fromPromise(input);
300
+ if (typeof input === "function") return fromGeneratorFn(input, options);
301
+ else return fromObject(input);
302
+ }
303
+ /**
304
+ * @returns `true` if the current context is async, `false` otherwise.
305
+ */
306
+ const getIsAsync = quansync$1({
307
+ async: () => Promise.resolve(true),
308
+ sync: () => false
309
+ });
310
+
311
+ //#endregion
312
+ //#region ../../node_modules/.pnpm/@quansync+fs@1.0.0/node_modules/@quansync/fs/dist/index.mjs
313
+ /**
314
+ * @link https://nodejs.org/api/fs.html#fspromisesreadfilepath-options
315
+ */
316
+ const readFile$1 = quansync$1({
317
+ sync: fs.readFileSync,
318
+ async: fs.promises.readFile
319
+ });
320
+ /**
321
+ * @link https://nodejs.org/api/fs.html#fspromiseswritefilefile-data-options
322
+ */
323
+ const writeFile = quansync$1({
324
+ sync: fs.writeFileSync,
325
+ async: fs.promises.writeFile
326
+ });
327
+ /**
328
+ * @link https://nodejs.org/api/fs.html#fspromisesunlinkpath
329
+ */
330
+ const unlink = quansync$1({
331
+ sync: fs.unlinkSync,
332
+ async: fs.promises.unlink
333
+ });
334
+ /**
335
+ * @link https://nodejs.org/api/fs.html#fspromisesaccesspath-mode
336
+ */
337
+ const access = quansync$1({
338
+ sync: fs.accessSync,
339
+ async: fs.promises.access
340
+ });
341
+ /**
342
+ * @link https://nodejs.org/api/fs.html#fspromisesstatpath-options
343
+ */
344
+ const stat = quansync$1({
345
+ sync: fs.statSync,
346
+ async: fs.promises.stat
347
+ });
348
+ const lstat = quansync$1({
349
+ sync: fs.lstatSync,
350
+ async: fs.promises.lstat
351
+ });
352
+ /**
353
+ * @link https://nodejs.org/api/fs.html#fspromisescpsrc-dest-options
354
+ */
355
+ const cp = quansync$1({
356
+ sync: fs.copyFileSync,
357
+ async: fs.promises.copyFile
358
+ });
359
+ /**
360
+ * @link https://nodejs.org/api/fs.html#fspromisesrmpath-options
361
+ */
362
+ const rm = quansync$1({
363
+ sync: fs.rmSync,
364
+ async: fs.promises.rm
365
+ });
366
+ /**
367
+ * @link https://nodejs.org/api/fs.html#fspromisesmkdirpath-options
368
+ */
369
+ const mkdir = quansync$1({
370
+ sync: fs.mkdirSync,
371
+ async: fs.promises.mkdir
372
+ });
373
+ /**
374
+ * @link https://nodejs.org/api/fs.html#fspromisesrenameoldpath-newpath
375
+ */
376
+ const rename = quansync$1({
377
+ sync: fs.renameSync,
378
+ async: fs.promises.rename
379
+ });
380
+ /**
381
+ * @link https://nodejs.org/api/fs.html#fspromisesreaddirpath-options
382
+ */
383
+ const readdir = quansync$1({
384
+ sync: fs.readdirSync,
385
+ async: fs.promises.readdir
386
+ });
387
+ /**
388
+ * @link https://nodejs.org/api/fs.html#fspromisesrealpathpath-options
389
+ */
390
+ const realpath = quansync$1({
391
+ sync: fs.realpathSync,
392
+ async: fs.promises.realpath
393
+ });
394
+ /**
395
+ * @link https://nodejs.org/api/fs.html#fspromisesreadlinkpath-options
396
+ */
397
+ const readlink = quansync$1({
398
+ sync: fs.readlinkSync,
399
+ async: fs.promises.readlink
400
+ });
401
+ /**
402
+ * @link https://nodejs.org/api/fs.html#fspromisessymlinktarget-path-type
403
+ */
404
+ const symlink = quansync$1({
405
+ sync: fs.symlinkSync,
406
+ async: fs.promises.symlink
407
+ });
408
+ /**
409
+ * @link https://nodejs.org/api/fs.html#fspromiseschownpath-uid-gid
410
+ */
411
+ const chown = quansync$1({
412
+ sync: fs.chownSync,
413
+ async: fs.promises.chown
414
+ });
415
+ /**
416
+ * @link https://nodejs.org/api/fs.html#fspromiseslchownpath-uid-gid
417
+ */
418
+ const lchown = quansync$1({
419
+ sync: fs.lchownSync,
420
+ async: fs.promises.lchown
421
+ });
422
+ /**
423
+ * @link https://nodejs.org/api/fs.html#fspromiseschmodpath-mode
424
+ */
425
+ const chmod = quansync$1({
426
+ sync: fs.chmodSync,
427
+ async: fs.promises.chmod
428
+ });
429
+ /**
430
+ * @link https://nodejs.org/api/fs.html#fspromisesutimespath-atime-mtime
431
+ */
432
+ const utimes = quansync$1({
433
+ sync: fs.utimesSync,
434
+ async: fs.promises.utimes
435
+ });
436
+ /**
437
+ * @link https://nodejs.org/api/fs.html#fspromiseslutimespath-atime-mtime
438
+ */
439
+ const lutimes = quansync$1({
440
+ sync: fs.lutimesSync,
441
+ async: fs.promises.lutimes
442
+ });
443
+ /**
444
+ * @link https://nodejs.org/api/fs.html#fspromisesmkdtempprefix-options
445
+ */
446
+ const mkdtemp = quansync$1({
447
+ sync: fs.mkdtempSync,
448
+ async: fs.promises.mkdtemp
449
+ });
450
+
451
+ //#endregion
452
+ //#region ../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs
453
+ function isPlainObject$2(value) {
454
+ if (value === null || typeof value !== "object") return false;
455
+ const prototype = Object.getPrototypeOf(value);
456
+ if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) return false;
457
+ if (Symbol.iterator in value) return false;
458
+ if (Symbol.toStringTag in value) return Object.prototype.toString.call(value) === "[object Module]";
459
+ return true;
460
+ }
461
+ function _defu(baseObject, defaults, namespace = ".", merger) {
462
+ if (!isPlainObject$2(defaults)) return _defu(baseObject, {}, namespace, merger);
463
+ const object = Object.assign({}, defaults);
464
+ for (const key in baseObject) {
465
+ if (key === "__proto__" || key === "constructor") continue;
466
+ const value = baseObject[key];
467
+ if (value === null || value === void 0) continue;
468
+ if (merger && merger(object, key, value, namespace)) continue;
469
+ if (Array.isArray(value) && Array.isArray(object[key])) object[key] = [...value, ...object[key]];
470
+ else if (isPlainObject$2(value) && isPlainObject$2(object[key])) object[key] = _defu(value, object[key], (namespace ? `${namespace}.` : "") + key.toString(), merger);
471
+ else object[key] = value;
472
+ }
473
+ return object;
474
+ }
475
+ function createDefu(merger) {
476
+ return (...arguments_) => arguments_.reduce((p, c) => _defu(p, c, "", merger), {});
477
+ }
478
+ const defu = createDefu();
479
+ const defuFn = createDefu((object, key, currentValue) => {
480
+ if (object[key] !== void 0 && typeof currentValue === "function") {
481
+ object[key] = currentValue(object[key]);
482
+ return true;
483
+ }
484
+ });
485
+ const defuArrayFn = createDefu((object, key, currentValue) => {
486
+ if (Array.isArray(object[key]) && typeof currentValue === "function") {
487
+ object[key] = currentValue(object[key]);
488
+ return true;
489
+ }
490
+ });
491
+
492
+ //#endregion
493
+ //#region ../../node_modules/.pnpm/quansync@1.0.0/node_modules/quansync/dist/macro.js
494
+ /**
495
+ * This function is equivalent to `quansync` from main entry
496
+ * but accepts a fake argument type of async functions.
497
+ *
498
+ * This requires to be used with the macro transformer `unplugin-quansync`.
499
+ * Do NOT use it directly.
500
+ *
501
+ * @internal
502
+ */
503
+ const quansync = quansync$1;
504
+
505
+ //#endregion
506
+ //#region ../../node_modules/.pnpm/unconfig-core@7.4.2/node_modules/unconfig-core/dist/index.mjs
507
+ const isFile = quansync(function* (path, allowSymlinks) {
508
+ try {
509
+ return (yield (allowSymlinks ? stat : lstat)(path)).isFile();
510
+ } catch {
511
+ return false;
512
+ }
513
+ });
514
+ const findUp = quansync(function* (paths, options = {}) {
515
+ const { cwd = process$1.cwd(), stopAt = parse(cwd).root, multiple = false, allowSymlinks = true } = options;
516
+ let current = cwd;
517
+ const files = [];
518
+ while (current && current !== stopAt) {
519
+ for (const path of paths) {
520
+ const filepath = resolve(current, path);
521
+ if (yield isFile(filepath, allowSymlinks)) {
522
+ files.push(filepath);
523
+ if (!multiple) return files;
524
+ }
525
+ }
526
+ const parent = dirname$1(current);
527
+ if (parent === current) break;
528
+ current = parent;
529
+ }
530
+ return files;
531
+ });
532
+ const loadConfigFile$1 = quansync(function* (filepath, source) {
533
+ try {
534
+ const config = yield source.parser(filepath);
535
+ if (!config) return;
536
+ return {
537
+ config,
538
+ source: filepath
539
+ };
540
+ } catch (e) {
541
+ if (source.skipOnError) return;
542
+ throw e;
543
+ }
544
+ });
545
+ function createConfigCoreLoader(options) {
546
+ const { cwd = process$1.cwd(), multiple, sources } = options;
547
+ const results = [];
548
+ let matchedFiles;
549
+ const findConfigs = quansync(function* () {
550
+ if (matchedFiles == null) matchedFiles = [];
551
+ matchedFiles.length = 0;
552
+ for (const source of sources) {
553
+ const { extensions } = source;
554
+ const files = yield findUp(source.files.flatMap((file) => !extensions?.length ? [file] : extensions.map((ext) => ext ? `${file}.${ext}` : file)), {
555
+ cwd,
556
+ stopAt: options.stopAt,
557
+ multiple
558
+ });
559
+ matchedFiles.push([source, files]);
560
+ }
561
+ return matchedFiles.flatMap((i) => i[1]);
562
+ });
563
+ return {
564
+ load: quansync(function* (force = false) {
565
+ if (matchedFiles == null || force) yield findConfigs();
566
+ for (const [source, files] of matchedFiles) {
567
+ if (!files.length) continue;
568
+ if (!multiple) {
569
+ const result = yield loadConfigFile$1(files[0], source);
570
+ if (result) return [result];
571
+ } else for (const file of files) {
572
+ const result = yield loadConfigFile$1(file, source);
573
+ if (result) results.push(result);
574
+ }
575
+ }
576
+ return results;
577
+ }),
578
+ findConfigs
579
+ };
580
+ }
581
+
582
+ //#endregion
583
+ //#region ../../node_modules/.pnpm/unconfig@7.4.2/node_modules/unconfig/dist/index.mjs
584
+ function interopDefault(mod) {
585
+ if (mod == null || typeof mod !== "object" || !("default" in mod) || mod.default == null) return mod;
586
+ const defaultValue = mod.default;
587
+ if (typeof defaultValue !== "object") return defaultValue;
588
+ for (const key in mod) try {
589
+ if (key in defaultValue || key === "default" || mod[key] === defaultValue) continue;
590
+ Object.defineProperty(defaultValue, key, {
591
+ configurable: true,
592
+ enumerable: true,
593
+ get() {
594
+ return mod[key];
595
+ }
596
+ });
597
+ } catch {}
598
+ return defaultValue;
599
+ }
600
+ const defaultExtensions = [
601
+ "mts",
602
+ "cts",
603
+ "ts",
604
+ "mjs",
605
+ "cjs",
606
+ "js",
607
+ "json",
608
+ ""
609
+ ];
610
+ const require$2 = createRequire(import.meta.url);
611
+ const loadConfigFile = quansync(function* (filepath, source) {
612
+ let config;
613
+ let parser = source.parser || "auto";
614
+ let bundleFilepath = filepath;
615
+ let code;
616
+ let dependencies;
617
+ const read = quansync(function* () {
618
+ if (code == null) code = yield readFile$1(filepath, "utf8");
619
+ return code;
620
+ });
621
+ const importModule = quansync({
622
+ sync: () => {
623
+ const { createJiti } = require$2("jiti");
624
+ const jiti = createJiti(import.meta.url, {
625
+ fsCache: false,
626
+ moduleCache: false,
627
+ interopDefault: true
628
+ });
629
+ config = interopDefault(jiti(bundleFilepath));
630
+ dependencies = Object.values(jiti.cache).map((i) => i.filename).filter(Boolean);
631
+ },
632
+ async: async () => {
633
+ const { createJiti } = await import("jiti");
634
+ const jiti = createJiti(import.meta.url, {
635
+ fsCache: false,
636
+ moduleCache: false,
637
+ interopDefault: true
638
+ });
639
+ config = interopDefault(await jiti.import(bundleFilepath, { default: true }));
640
+ dependencies = Object.values(jiti.cache).map((i) => i.filename).filter(Boolean);
641
+ }
642
+ });
643
+ if (source.transform) {
644
+ const transformed = yield source.transform(yield read(), filepath);
645
+ if (transformed) {
646
+ bundleFilepath = join(dirname$1(filepath), `__unconfig_${basename(filepath)}`);
647
+ yield writeFile(bundleFilepath, transformed, "utf8");
648
+ code = transformed;
649
+ }
650
+ }
651
+ if (parser === "auto") try {
652
+ config = JSON.parse(yield read());
653
+ parser = "json";
654
+ } catch {
655
+ parser = "import";
656
+ }
657
+ try {
658
+ if (!config) {
659
+ if (typeof parser === "function") config = yield parser(filepath);
660
+ else if (parser === "import") yield importModule();
661
+ else if (parser === "json") config = JSON.parse(yield read());
662
+ }
663
+ if (!config) return;
664
+ const rewritten = source.rewrite ? yield source.rewrite(config, filepath) : config;
665
+ if (!rewritten) return void 0;
666
+ return [rewritten, dependencies];
667
+ } finally {
668
+ if (bundleFilepath !== filepath) try {
669
+ yield unlink(bundleFilepath);
670
+ } catch {}
671
+ }
672
+ });
673
+ function createConfigLoader(options) {
674
+ const { merge, defaults, sources, ...coreOptions } = options;
675
+ const coreSources = toArray(sources || []).map((source) => {
676
+ return {
677
+ ...source,
678
+ files: toArray(source.files),
679
+ extensions: source.extensions || defaultExtensions,
680
+ parser: (filepath) => loadConfigFile(filepath, source)
681
+ };
682
+ });
683
+ const core = createConfigCoreLoader({
684
+ ...coreOptions,
685
+ multiple: merge,
686
+ sources: coreSources
687
+ });
688
+ return {
689
+ load: quansync(function* (force = false) {
690
+ const results = yield core.load(force);
691
+ if (!results.length) return {
692
+ config: defaults,
693
+ sources: []
694
+ };
695
+ if (!merge) return {
696
+ config: results[0].config[0],
697
+ sources: [results[0].source],
698
+ dependencies: results[0].config[1]
699
+ };
700
+ return {
701
+ config: applyDefaults(...results.map((i) => i.config[0]), defaults),
702
+ sources: results.map((i) => i.source),
703
+ dependencies: results.flatMap((i) => i.config[1] || [])
704
+ };
705
+ }),
706
+ findConfigs: core.findConfigs
707
+ };
708
+ }
709
+ function applyDefaults(...args) {
710
+ return defu(...args.map((i) => ({ config: i }))).config;
711
+ }
712
+ const loadConfig = quansync(function* (options) {
713
+ return createConfigLoader(options).load();
714
+ });
715
+ const loadConfigSync = loadConfig.sync;
716
+
207
717
  //#endregion
208
718
  //#region src/utils/file.ts
209
719
  const readPackage = (importMeta, ...paths) => {
@@ -271,20 +781,698 @@ const readGitignore = (cwd = process.cwd()) => {
271
781
  log.verbose("gitignore", `未找到 .gitignore 文件: ${gitignorePath}`);
272
782
  return [];
273
783
  }
274
- try {
275
- const content = fse.readFileSync(gitignorePath, "utf-8");
276
- log.verbose("gitignore", `成功读取 .gitignore 文件: ${gitignorePath}`);
277
- return content.split("\n");
278
- } catch (err) {
279
- log.error("gitignore", `读取 .gitignore 文件失败: ${err.message}`);
280
- return [];
784
+ try {
785
+ const content = fse.readFileSync(gitignorePath, "utf-8");
786
+ log.verbose("gitignore", `成功读取 .gitignore 文件: ${gitignorePath}`);
787
+ return content.split("\n");
788
+ } catch (err) {
789
+ log.error("gitignore", `读取 .gitignore 文件失败: ${err.message}`);
790
+ return [];
791
+ }
792
+ };
793
+
794
+ //#endregion
795
+ //#region src/constants.ts
796
+ const LOWEST_NODE_VERSION = "18.0.0";
797
+ const CONFIG_NAME = ".nemoclirc";
798
+
799
+ //#endregion
800
+ //#region src/package-manager/adapters/bun.ts
801
+ /**
802
+ * Bun adapter - translates operations to bun-specific commands
803
+ */
804
+ var BunAdapter = class {
805
+ name = "bun";
806
+ supportsWorkspaces = true;
807
+ command = "bun";
808
+ buildAddCommand(packages, options) {
809
+ const args = ["add"];
810
+ args.push(...packages);
811
+ if (options.saveDev) args.push("--development");
812
+ if (options.exact) args.push("--exact");
813
+ if (options.root) args.push("--workspace");
814
+ else if (options.workspaces && options.workspaces.length > 0) options.workspaces.forEach((ws) => {
815
+ args.push("--workspace", ws);
816
+ });
817
+ return args;
818
+ }
819
+ buildRemoveCommand(packages, options) {
820
+ const args = ["remove", ...packages];
821
+ if (options.root) args.push("--workspace");
822
+ else if (options.workspaces && options.workspaces.length > 0) options.workspaces.forEach((ws) => {
823
+ args.push("--workspace", ws);
824
+ });
825
+ return args;
826
+ }
827
+ buildUpgradeCommand(packages, options) {
828
+ const target = options.target || "latest";
829
+ const packagesWithTarget = packages.map((pkg) => `${pkg}@${target}`);
830
+ return this.buildAddCommand(packagesWithTarget, {});
831
+ }
832
+ parsePackageSpec(packageSpec) {
833
+ const match = packageSpec.match(/^(@?[^@]+)(?:@(.+))?$/);
834
+ if (!match) return { name: packageSpec };
835
+ return {
836
+ name: match[1] ?? packageSpec,
837
+ version: match[2]
838
+ };
839
+ }
840
+ };
841
+
842
+ //#endregion
843
+ //#region src/package-manager/adapters/deno.ts
844
+ /**
845
+ * Deno adapter - translates operations to deno-specific commands
846
+ *
847
+ * Note: Deno has a different model (URL-based imports) so some operations
848
+ * are limited or not applicable.
849
+ */
850
+ var DenoAdapter = class {
851
+ name = "deno";
852
+ supportsWorkspaces = false;
853
+ command = "deno";
854
+ buildAddCommand(packages, options) {
855
+ const args = ["add", ...packages];
856
+ if (options.saveDev) args.push("--dev");
857
+ return args;
858
+ }
859
+ buildRemoveCommand(packages, options) {
860
+ return ["remove", ...packages];
861
+ }
862
+ buildUpgradeCommand(packages, options) {
863
+ return this.buildAddCommand(packages, {});
864
+ }
865
+ parsePackageSpec(packageSpec) {
866
+ const match = packageSpec.match(/^(@?[^@]+)(?:@(.+))?$/);
867
+ if (!match) return { name: packageSpec };
868
+ return {
869
+ name: match[1] ?? packageSpec,
870
+ version: match[2]
871
+ };
872
+ }
873
+ };
874
+
875
+ //#endregion
876
+ //#region src/package-manager/adapters/npm.ts
877
+ /**
878
+ * NPM adapter - translates operations to npm-specific commands
879
+ */
880
+ var NpmAdapter = class {
881
+ name = "npm";
882
+ supportsWorkspaces = true;
883
+ command = "npm";
884
+ buildAddCommand(packages, options) {
885
+ const args = ["install"];
886
+ args.push(...packages);
887
+ if (options.saveDev) args.push("--save-dev");
888
+ if (options.exact) args.push("--save-exact");
889
+ if (options.savePeer) args.push("--save-peer");
890
+ if (options.saveOptional) args.push("--save-optional");
891
+ if (options.root) args.push("-w");
892
+ else if (options.workspaces && options.workspaces.length > 0) if (options.workspaces.length === 1) args.push("--workspace", options.workspaces[0] ?? "");
893
+ else options.workspaces.forEach((ws) => {
894
+ args.push("--workspace", ws);
895
+ });
896
+ return args;
897
+ }
898
+ buildRemoveCommand(packages, options) {
899
+ const args = ["uninstall", ...packages];
900
+ if (options.root) args.push("-w");
901
+ else if (options.workspaces && options.workspaces.length > 0) if (options.workspaces.length === 1) args.push("--workspace", options.workspaces[0] ?? "");
902
+ else options.workspaces.forEach((ws) => {
903
+ args.push("--workspace", ws);
904
+ });
905
+ return args;
906
+ }
907
+ buildUpgradeCommand(packages, options) {
908
+ const target = options.target || "latest";
909
+ const packagesWithTarget = packages.map((pkg) => `${pkg}@${target}`);
910
+ return this.buildAddCommand(packagesWithTarget, {});
911
+ }
912
+ parsePackageSpec(packageSpec) {
913
+ const match = packageSpec.match(/^(@?[^@]+)(?:@(.+))?$/);
914
+ if (!match) return { name: packageSpec };
915
+ return {
916
+ name: match[1] ?? packageSpec,
917
+ version: match[2]
918
+ };
919
+ }
920
+ };
921
+
922
+ //#endregion
923
+ //#region src/package-manager/adapters/pnpm.ts
924
+ /**
925
+ * pnpm adapter - translates operations to pnpm-specific commands
926
+ */
927
+ var PnpmAdapter = class {
928
+ name = "pnpm";
929
+ supportsWorkspaces = true;
930
+ command = "pnpm";
931
+ buildAddCommand(packages, options) {
932
+ const args = ["add"];
933
+ args.push(...packages);
934
+ if (options.saveDev) args.push("--save-dev");
935
+ if (options.exact) args.push("--save-exact");
936
+ if (options.savePeer) args.push("--save-peer");
937
+ if (options.saveOptional) args.push("--save-optional");
938
+ if (options.root) args.push("-w");
939
+ else if (options.workspaces && options.workspaces.length > 0) options.workspaces.forEach((ws) => {
940
+ args.push("--filter", ws);
941
+ });
942
+ return args;
943
+ }
944
+ buildRemoveCommand(packages, options) {
945
+ const args = ["remove", ...packages];
946
+ if (options.root) args.push("-w");
947
+ else if (options.workspaces && options.workspaces.length > 0) options.workspaces.forEach((ws) => {
948
+ args.push("--filter", ws);
949
+ });
950
+ return args;
951
+ }
952
+ buildUpgradeCommand(packages, options) {
953
+ const target = options.target || "latest";
954
+ const packagesWithTarget = packages.map((pkg) => `${pkg}@${target}`);
955
+ return this.buildAddCommand(packagesWithTarget, {});
956
+ }
957
+ parsePackageSpec(packageSpec) {
958
+ const match = packageSpec.match(/^(@?[^@]+)(?:@(.+))?$/);
959
+ if (!match) return { name: packageSpec };
960
+ return {
961
+ name: match[1] ?? packageSpec,
962
+ version: match[2]
963
+ };
964
+ }
965
+ };
966
+
967
+ //#endregion
968
+ //#region src/package-manager/adapters/yarn.ts
969
+ /**
970
+ * Yarn adapter - translates operations to yarn-specific commands
971
+ */
972
+ var YarnAdapter = class {
973
+ name = "yarn";
974
+ supportsWorkspaces = true;
975
+ command = "yarn";
976
+ buildAddCommand(packages, options) {
977
+ const args = ["add"];
978
+ args.push(...packages);
979
+ if (options.saveDev) args.push("--dev");
980
+ if (options.exact) args.push("--exact");
981
+ if (options.savePeer) args.push("--peer");
982
+ if (options.saveOptional) args.push("--optional");
983
+ if (options.root) args.push("-W");
984
+ else if (options.workspaces && options.workspaces.length > 0) {
985
+ if (options.workspaces.length === 1) args.unshift("-c", "--", `workspace:${options.workspaces[0]}`);
986
+ }
987
+ return args;
988
+ }
989
+ buildRemoveCommand(packages, options) {
990
+ const args = ["remove", ...packages];
991
+ if (options.root) args.push("-W");
992
+ else if (options.workspaces && options.workspaces.length > 0) {
993
+ if (options.workspaces.length === 1) args.unshift("-c", "--", `workspace:${options.workspaces[0]}`);
994
+ }
995
+ return args;
996
+ }
997
+ buildUpgradeCommand(packages, options) {
998
+ const target = options.target || "latest";
999
+ const packagesWithTarget = packages.map((pkg) => `${pkg}@${target}`);
1000
+ return this.buildAddCommand(packagesWithTarget, {});
1001
+ }
1002
+ parsePackageSpec(packageSpec) {
1003
+ const match = packageSpec.match(/^(@?[^@]+)(?:@(.+))?$/);
1004
+ if (!match) return { name: packageSpec };
1005
+ return {
1006
+ name: match[1] ?? packageSpec,
1007
+ version: match[2]
1008
+ };
1009
+ }
1010
+ };
1011
+
1012
+ //#endregion
1013
+ //#region src/package-manager/adapters/index.ts
1014
+ /**
1015
+ * Adapter registry
1016
+ */
1017
+ const adapters = {
1018
+ npm: new NpmAdapter(),
1019
+ pnpm: new PnpmAdapter(),
1020
+ yarn: new YarnAdapter(),
1021
+ bun: new BunAdapter(),
1022
+ deno: new DenoAdapter()
1023
+ };
1024
+ /**
1025
+ * Get adapter for a specific package manager
1026
+ */
1027
+ function getAdapter(packageManager) {
1028
+ return adapters[packageManager];
1029
+ }
1030
+ /**
1031
+ * Get all available adapters
1032
+ */
1033
+ function getAllAdapters() {
1034
+ return { ...adapters };
1035
+ }
1036
+
1037
+ //#endregion
1038
+ //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs
1039
+ function isPlainObject$1(value) {
1040
+ if (!value || typeof value !== "object") return false;
1041
+ const proto = Object.getPrototypeOf(value);
1042
+ if (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;
1043
+ return Object.prototype.toString.call(value) === "[object Object]";
1044
+ }
1045
+
1046
+ //#endregion
1047
+ //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs
1048
+ function isUnsafeProperty(key) {
1049
+ return key === "__proto__";
1050
+ }
1051
+
1052
+ //#endregion
1053
+ //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/object/merge.mjs
1054
+ function merge(target, source) {
1055
+ const sourceKeys = Object.keys(source);
1056
+ for (let i = 0; i < sourceKeys.length; i++) {
1057
+ const key = sourceKeys[i];
1058
+ if (isUnsafeProperty(key)) continue;
1059
+ const sourceValue = source[key];
1060
+ const targetValue = target[key];
1061
+ if (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) target[key] = merge(targetValue, sourceValue);
1062
+ else if (Array.isArray(sourceValue)) target[key] = merge([], sourceValue);
1063
+ else if (isPlainObject$1(sourceValue)) target[key] = merge({}, sourceValue);
1064
+ else if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;
1065
+ }
1066
+ return target;
1067
+ }
1068
+ function isMergeableValue(value) {
1069
+ return isPlainObject$1(value) || Array.isArray(value);
1070
+ }
1071
+
1072
+ //#endregion
1073
+ //#region src/utils/error.ts
1074
+ const handleError = (err, message) => {
1075
+ if (isError(err)) ErrorMessage({ text: `${message}: ${err.message}` });
1076
+ else if (isString(err)) ErrorMessage({ text: `${message}: ${err}` });
1077
+ else log.error(message, err);
1078
+ };
1079
+
1080
+ //#endregion
1081
+ //#region src/utils/command.ts
1082
+ const exit = (code) => process$1.exit(code);
1083
+ const createHelpExample = (...commands) => {
1084
+ return `
1085
+ Example:
1086
+ ${commands.map((command) => ` $ ${command}`).join("\n")}
1087
+ `;
1088
+ };
1089
+ const createCommand = (name) => {
1090
+ const command = new Command(name);
1091
+ command.allowExcessArguments();
1092
+ command.allowUnknownOption();
1093
+ return command;
1094
+ };
1095
+ const buildCommand = (command, dynamicParts = []) => {
1096
+ return {
1097
+ command,
1098
+ parts: dynamicParts.filter((part) => !isEmpty(part)).map((part) => part?.toString())
1099
+ };
1100
+ };
1101
+ const x = (command, args, options = {}) => {
1102
+ return x$1(command, args, merge({
1103
+ nodeOptions: {
1104
+ cwd: process$1.cwd(),
1105
+ FORCE_COLOR: "1"
1106
+ },
1107
+ throwOnError: true
1108
+ }, options));
1109
+ };
1110
+ const zx = (baseCommand, dynamicParts = [], options = {}) => {
1111
+ const { command, parts } = buildCommand(baseCommand, dynamicParts);
1112
+ const { signal } = new AbortController();
1113
+ try {
1114
+ return (isEmpty(options) ? $ : $({
1115
+ ...options,
1116
+ signal
1117
+ }))`${command} ${parts}`;
1118
+ } catch (error) {
1119
+ handleError(error, `Failed to execute dynamic command: ${command}`);
1120
+ throw error;
1121
+ }
1122
+ };
1123
+ const xASync = async (command, args, options) => {
1124
+ try {
1125
+ const { timeout, quiet, ...execOptions } = options ?? {};
1126
+ const execPromise = x$1(command, args, merge({
1127
+ nodeOptions: {
1128
+ cwd: process$1.cwd(),
1129
+ FORCE_COLOR: "1"
1130
+ },
1131
+ throwOnError: true
1132
+ }, execOptions));
1133
+ let result;
1134
+ if (timeout) {
1135
+ let timer;
1136
+ const timeoutPromise = new Promise((_, reject) => {
1137
+ timer = setTimeout(() => reject(/* @__PURE__ */ new Error(`Command timeout after ${timeout}ms`)), timeout);
1138
+ });
1139
+ try {
1140
+ result = await Promise.race([execPromise, timeoutPromise]);
1141
+ } finally {
1142
+ timer && clearTimeout(timer);
1143
+ }
1144
+ } else result = await execPromise;
1145
+ if (result.exitCode) {
1146
+ if (!quiet) {
1147
+ log.show(`Failed to execute command ${command}. Command exited with code ${result.exitCode}.`, { type: "error" });
1148
+ log.show(result.stderr, { type: "error" });
1149
+ }
1150
+ return [new Error(result.stderr), null];
1151
+ }
1152
+ return [null, result];
1153
+ } catch (error) {
1154
+ handleError(error, `Failed to execute command ${command}.`);
1155
+ return [isError(error) ? error : new Error(error), null];
1156
+ }
1157
+ };
1158
+
1159
+ //#endregion
1160
+ //#region src/utils/prompts.ts
1161
+ const createOptions = (options) => options.map((option) => ({
1162
+ label: option.toString(),
1163
+ value: option
1164
+ }));
1165
+ const createPrompt = (fn) => {
1166
+ return async (options) => {
1167
+ const result = await fn(options);
1168
+ if (isCancel(result)) {
1169
+ cancel("User cancelled");
1170
+ exit(0);
1171
+ }
1172
+ return result;
1173
+ };
1174
+ };
1175
+ const createShowList = createPrompt((options) => {
1176
+ options.map((option) => {
1177
+ return isString(option) ? option : option.label;
1178
+ }).forEach((item) => {
1179
+ log.show(item, { type: "step" });
1180
+ });
1181
+ });
1182
+ const createSearch = ({ message, options }) => {
1183
+ const fuse = new Fuse(options, { keys: ["label"] });
1184
+ return search({
1185
+ message,
1186
+ source: (term) => {
1187
+ if (!term) return options;
1188
+ return fuse.search(term).map(({ item }) => item);
1189
+ }
1190
+ });
1191
+ };
1192
+ process.on("uncaughtException", (error) => {
1193
+ if (error instanceof Error && error.name === "ExitPromptError") log.show("User cancelled", { type: "error" });
1194
+ else throw error;
1195
+ });
1196
+ const createCheckbox = async (opts) => {
1197
+ const result = await multiselect(opts);
1198
+ if (isCancel(result)) {
1199
+ cancel("User cancelled");
1200
+ exit(0);
1201
+ }
1202
+ return result;
1203
+ };
1204
+ const createNote = ({ message = "", title = "", opts }) => note(message, title, opts);
1205
+ const createConfirm = createPrompt(confirm);
1206
+ const createTasks = createPrompt(tasks);
1207
+ const createSelect = async (opts) => {
1208
+ const result = await select(opts);
1209
+ if (isCancel(result)) {
1210
+ cancel("User cancelled");
1211
+ exit(0);
1212
+ }
1213
+ return result;
1214
+ };
1215
+ const createInput = async (opts) => {
1216
+ const result = await text(opts);
1217
+ if (isCancel(result)) {
1218
+ cancel("User cancelled");
1219
+ exit(0);
1220
+ }
1221
+ return result;
1222
+ };
1223
+ const createGroupMultiSelect = async (opts) => {
1224
+ const result = await groupMultiselect(opts);
1225
+ if (isCancel(result)) {
1226
+ cancel("User cancelled");
1227
+ process.exit(0);
1228
+ }
1229
+ return result;
1230
+ };
1231
+ const createGroup = async (opts) => {
1232
+ const result = await group(opts);
1233
+ if (isCancel(result)) {
1234
+ cancel("User cancelled");
1235
+ exit(0);
1236
+ }
1237
+ return result;
1238
+ };
1239
+ const createSpinner = (message, options) => {
1240
+ const s = spinner(options);
1241
+ s.start(message);
1242
+ return s;
1243
+ };
1244
+ const createTaskLog = (title, options) => taskLog({
1245
+ title,
1246
+ ...options
1247
+ });
1248
+
1249
+ //#endregion
1250
+ //#region src/package-manager/types.ts
1251
+ /**
1252
+ * Lock file patterns for detection
1253
+ */
1254
+ const LOCK_FILE_PATTERNS = {
1255
+ npm: ["package-lock.json"],
1256
+ pnpm: ["pnpm-lock.yaml"],
1257
+ yarn: ["yarn.lock"],
1258
+ bun: ["bun.lockb", "bun.lock"],
1259
+ deno: ["deno.json", "deno.jsonc"]
1260
+ };
1261
+ /**
1262
+ * Package manager display names
1263
+ */
1264
+ const PACKAGE_MANAGER_NAMES = {
1265
+ npm: "npm",
1266
+ pnpm: "pnpm",
1267
+ yarn: "yarn",
1268
+ bun: "Bun",
1269
+ deno: "Deno"
1270
+ };
1271
+
1272
+ //#endregion
1273
+ //#region src/package-manager/detector.ts
1274
+ /**
1275
+ * Cache file location
1276
+ */
1277
+ const CACHE_FILE = ".nemo/package-manager.json";
1278
+ const CACHE_DURATION = 10080 * 60 * 1e3;
1279
+ /**
1280
+ * PackageManagerDetector - Detects the package manager used by a project
1281
+ *
1282
+ * Detection priority:
1283
+ * 1. Lock file analysis (package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lockb)
1284
+ * 2. package.json packageManager field
1285
+ * 3. Interactive user selection
1286
+ */
1287
+ var PackageManagerDetector = class {
1288
+ projectRoot;
1289
+ cachePath;
1290
+ constructor(projectRoot = process.cwd()) {
1291
+ console.log("🚀 : PackageManagerDetector : constructor : projectRoot:", projectRoot);
1292
+ this.projectRoot = projectRoot;
1293
+ this.cachePath = path.join(projectRoot, CACHE_FILE);
1294
+ }
1295
+ /**
1296
+ * Detect the package manager for the project
1297
+ */
1298
+ async detect(forceRefresh = false) {
1299
+ if (!forceRefresh) {
1300
+ const cached = await this.loadCache();
1301
+ if (cached && !this.isCacheExpired(cached)) {
1302
+ log.info(`Using cached package manager: ${cached.result.packageManager}`);
1303
+ return cached.result;
1304
+ }
1305
+ }
1306
+ const lockFileResult = await this.detectByLockFile();
1307
+ if (lockFileResult) {
1308
+ const result = await this.createDetectionResult(lockFileResult, "lock-file");
1309
+ await this.saveCache(result);
1310
+ return result;
1311
+ }
1312
+ const packageJsonResult = await this.detectByPackageJson();
1313
+ if (packageJsonResult) {
1314
+ const result = await this.createDetectionResult(packageJsonResult, "package-json");
1315
+ await this.saveCache(result);
1316
+ return result;
1317
+ }
1318
+ log.warn("Could not auto-detect package manager");
1319
+ const userSelection = await this.promptUser();
1320
+ const result = await this.createDetectionResult(userSelection, "user-selection");
1321
+ await this.saveCache(result);
1322
+ return result;
1323
+ }
1324
+ /**
1325
+ * Detect package manager from lock files
1326
+ */
1327
+ async detectByLockFile() {
1328
+ for (const pm of [
1329
+ "pnpm",
1330
+ "yarn",
1331
+ "npm",
1332
+ "bun",
1333
+ "deno"
1334
+ ]) {
1335
+ const patterns = LOCK_FILE_PATTERNS[pm];
1336
+ for (const pattern of patterns) {
1337
+ const lockFilePath = path.join(this.projectRoot, pattern);
1338
+ console.log("🚀 : PackageManagerDetector : detectByLockFile : lockFilePath:", lockFilePath);
1339
+ if (existsSync(lockFilePath)) {
1340
+ log.info(`Detected ${pm} from lock file: ${pattern}`);
1341
+ return pm;
1342
+ }
1343
+ }
1344
+ }
1345
+ return null;
1346
+ }
1347
+ /**
1348
+ * Detect package manager from package.json packageManager field
1349
+ */
1350
+ async detectByPackageJson() {
1351
+ const packageJsonPath = path.join(this.projectRoot, "package.json");
1352
+ try {
1353
+ const content = await fs$1.readFile(packageJsonPath, "utf-8");
1354
+ const packageManagerField = JSON.parse(content).packageManager;
1355
+ if (!packageManagerField) return null;
1356
+ const match = packageManagerField.match(/^([a-z]+)@/);
1357
+ if (match) {
1358
+ const pm = match[1];
1359
+ if (this.isValidPackageManager(pm)) {
1360
+ log.info(`Detected ${pm} from package.json packageManager field`);
1361
+ return pm;
1362
+ }
1363
+ }
1364
+ return null;
1365
+ } catch (error) {
1366
+ log.error(`Could not read package.json: ${error}`);
1367
+ return null;
1368
+ }
1369
+ }
1370
+ /**
1371
+ * Prompt user to select package manager interactively
1372
+ */
1373
+ async promptUser() {
1374
+ const selected = await createSelect({
1375
+ message: "Could not detect package manager. Please select one:",
1376
+ options: Object.entries(PACKAGE_MANAGER_NAMES).map(([value, label]) => ({
1377
+ value,
1378
+ label
1379
+ }))
1380
+ });
1381
+ if (!selected || !this.isValidPackageManager(selected)) {
1382
+ log.error("Invalid selection. Defaulting to npm.");
1383
+ return "npm";
1384
+ }
1385
+ return selected;
1386
+ }
1387
+ /**
1388
+ * Check if a package manager is installed and available
1389
+ */
1390
+ async checkAvailability(pm) {
1391
+ try {
1392
+ return (await x(pm, ["--version"])).exitCode === 0;
1393
+ } catch {
1394
+ return false;
1395
+ }
1396
+ }
1397
+ /**
1398
+ * Create a detection result with metadata
1399
+ */
1400
+ async createDetectionResult(packageManager, method) {
1401
+ const isAvailable = await this.checkAvailability(packageManager);
1402
+ return {
1403
+ packageManager,
1404
+ method,
1405
+ detectedAt: (/* @__PURE__ */ new Date()).toISOString(),
1406
+ isAvailable
1407
+ };
1408
+ }
1409
+ /**
1410
+ * Load cached detection result
1411
+ */
1412
+ async loadCache() {
1413
+ try {
1414
+ if (!existsSync(this.cachePath)) return null;
1415
+ const content = await fs$1.readFile(this.cachePath, "utf-8");
1416
+ return JSON.parse(content);
1417
+ } catch {
1418
+ return null;
1419
+ }
1420
+ }
1421
+ /**
1422
+ * Save detection result to cache
1423
+ */
1424
+ async saveCache(result) {
1425
+ try {
1426
+ const cacheDir = path.dirname(this.cachePath);
1427
+ await fs$1.mkdir(cacheDir, { recursive: true });
1428
+ const cache = {
1429
+ result,
1430
+ expiresAt: new Date(Date.now() + CACHE_DURATION).toISOString()
1431
+ };
1432
+ await fs$1.writeFile(this.cachePath, JSON.stringify(cache, null, 2));
1433
+ } catch (error) {
1434
+ log.error(`Could not save cache: ${error}`);
1435
+ }
1436
+ }
1437
+ /**
1438
+ * Check if cache has expired
1439
+ */
1440
+ isCacheExpired(cache) {
1441
+ return new Date(cache.expiresAt) < /* @__PURE__ */ new Date();
1442
+ }
1443
+ /**
1444
+ * Validate package manager enum
1445
+ */
1446
+ isValidPackageManager(pm) {
1447
+ return [
1448
+ "npm",
1449
+ "pnpm",
1450
+ "yarn",
1451
+ "bun",
1452
+ "deno"
1453
+ ].includes(pm);
1454
+ }
1455
+ /**
1456
+ * Clear the cache (useful for testing or force re-detection)
1457
+ */
1458
+ async clearCache() {
1459
+ try {
1460
+ if (existsSync(this.cachePath)) {
1461
+ await fs$1.unlink(this.cachePath);
1462
+ log.info("Package manager cache cleared");
1463
+ }
1464
+ } catch (error) {
1465
+ log.error(`Could not clear cache: ${error}`);
1466
+ }
281
1467
  }
282
1468
  };
283
-
284
- //#endregion
285
- //#region src/constants.ts
286
- const LOWEST_NODE_VERSION = "18.0.0";
287
- const CONFIG_NAME = ".nemoclirc";
1469
+ /**
1470
+ * Get adapter for detected or specified package manager
1471
+ */
1472
+ async function getPackageManagerAdapter(packageManager) {
1473
+ const detector = new PackageManagerDetector();
1474
+ return getAdapter(packageManager || (await detector.detect()).packageManager);
1475
+ }
288
1476
 
289
1477
  //#endregion
290
1478
  //#region src/utils/browser.ts
@@ -303,117 +1491,6 @@ const getBrowserApps = () => {
303
1491
  const clearScreen = () => console.log(clearScreen$1);
304
1492
  const clearTerminal = () => console.log(clearTerminal$1);
305
1493
 
306
- //#endregion
307
- //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs
308
- function isPlainObject$1(value) {
309
- if (!value || typeof value !== "object") return false;
310
- const proto = Object.getPrototypeOf(value);
311
- if (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;
312
- return Object.prototype.toString.call(value) === "[object Object]";
313
- }
314
-
315
- //#endregion
316
- //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs
317
- function isUnsafeProperty(key) {
318
- return key === "__proto__";
319
- }
320
-
321
- //#endregion
322
- //#region ../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/object/merge.mjs
323
- function merge(target, source) {
324
- const sourceKeys = Object.keys(source);
325
- for (let i = 0; i < sourceKeys.length; i++) {
326
- const key = sourceKeys[i];
327
- if (isUnsafeProperty(key)) continue;
328
- const sourceValue = source[key];
329
- const targetValue = target[key];
330
- if (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) target[key] = merge(targetValue, sourceValue);
331
- else if (Array.isArray(sourceValue)) target[key] = merge([], sourceValue);
332
- else if (isPlainObject$1(sourceValue)) target[key] = merge({}, sourceValue);
333
- else if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;
334
- }
335
- return target;
336
- }
337
- function isMergeableValue(value) {
338
- return isPlainObject$1(value) || Array.isArray(value);
339
- }
340
-
341
- //#endregion
342
- //#region src/utils/error.ts
343
- const handleError = (err, message) => {
344
- if (isError(err)) ErrorMessage({ text: `${message}: ${err.message}` });
345
- else if (isString(err)) ErrorMessage({ text: `${message}: ${err}` });
346
- else log.error(message, err);
347
- };
348
-
349
- //#endregion
350
- //#region src/utils/command.ts
351
- const exit = (code) => process$1.exit(code);
352
- const createHelpExample = (...commands) => {
353
- return `
354
- Example:
355
- ${commands.map((command) => ` $ ${command}`).join("\n")}
356
- `;
357
- };
358
- const createCommand = (name) => {
359
- const command = new Command(name);
360
- command.allowExcessArguments();
361
- command.allowUnknownOption();
362
- return command;
363
- };
364
- const buildCommand = (command, dynamicParts = []) => {
365
- return {
366
- command,
367
- parts: dynamicParts.filter((part) => !isEmpty(part)).map((part) => part?.toString())
368
- };
369
- };
370
- const x = (command, args, options = {}) => {
371
- return x$1(command, args, merge({
372
- nodeOptions: {
373
- cwd: process$1.cwd(),
374
- FORCE_COLOR: "1"
375
- },
376
- throwOnError: true
377
- }, options));
378
- };
379
- const zx = (baseCommand, dynamicParts = [], options = {}) => {
380
- const { command, parts } = buildCommand(baseCommand, dynamicParts);
381
- const { signal } = new AbortController();
382
- try {
383
- return (isEmpty(options) ? $ : $({
384
- ...options,
385
- signal
386
- }))`${command} ${parts}`;
387
- } catch (error) {
388
- handleError(error, `Failed to execute dynamic command: ${command}`);
389
- throw error;
390
- }
391
- };
392
- const xASync = async (command, args, options) => {
393
- try {
394
- const { timeout, quiet, ...execOptions } = options ?? {};
395
- const execPromise = x$1(command, args, merge({
396
- nodeOptions: {
397
- cwd: process$1.cwd(),
398
- FORCE_COLOR: "1"
399
- },
400
- throwOnError: true
401
- }, execOptions));
402
- const result = timeout ? await Promise.race([execPromise, new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error(`Command timeout after ${timeout}ms`)), timeout))]) : await execPromise;
403
- if (result.exitCode) {
404
- if (!quiet) {
405
- log.show(`Failed to execute command ${command}. Command exited with code ${result.exitCode}.`, { type: "error" });
406
- log.show(result.stderr, { type: "error" });
407
- }
408
- return [new Error(result.stderr), null];
409
- }
410
- return [null, result];
411
- } catch (error) {
412
- handleError(error, `Failed to execute command ${command}.`);
413
- return [isError(error) ? error : new Error(error), null];
414
- }
415
- };
416
-
417
1494
  //#endregion
418
1495
  //#region src/utils/common.ts
419
1496
  const cached = (fn) => {
@@ -433,11 +1510,11 @@ const sleep = (millisecond, controller) => {
433
1510
  };
434
1511
 
435
1512
  //#endregion
436
- //#region ../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/package.json
1513
+ //#region ../../node_modules/.pnpm/dotenv@17.2.4/node_modules/dotenv/package.json
437
1514
  var require_package = /* @__PURE__ */ __commonJSMin(((exports, module) => {
438
1515
  module.exports = {
439
1516
  "name": "dotenv",
440
- "version": "17.2.3",
1517
+ "version": "17.2.4",
441
1518
  "description": "Loads environment variables from .env file",
442
1519
  "main": "lib/main.js",
443
1520
  "types": "lib/main.d.ts",
@@ -496,9 +1573,9 @@ var require_package = /* @__PURE__ */ __commonJSMin(((exports, module) => {
496
1573
  }));
497
1574
 
498
1575
  //#endregion
499
- //#region ../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/lib/main.js
1576
+ //#region ../../node_modules/.pnpm/dotenv@17.2.4/node_modules/dotenv/lib/main.js
500
1577
  var require_main = /* @__PURE__ */ __commonJSMin(((exports, module) => {
501
- const fs$2 = __require("fs");
1578
+ const fs$3 = __require("fs");
502
1579
  const path$13 = __require("path");
503
1580
  const os = __require("os");
504
1581
  const crypto = __require("crypto");
@@ -635,10 +1712,10 @@ var require_main = /* @__PURE__ */ __commonJSMin(((exports, module) => {
635
1712
  function _vaultPath(options) {
636
1713
  let possibleVaultPath = null;
637
1714
  if (options && options.path && options.path.length > 0) if (Array.isArray(options.path)) {
638
- for (const filepath of options.path) if (fs$2.existsSync(filepath)) possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`;
1715
+ for (const filepath of options.path) if (fs$3.existsSync(filepath)) possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`;
639
1716
  } else possibleVaultPath = options.path.endsWith(".vault") ? options.path : `${options.path}.vault`;
640
1717
  else possibleVaultPath = path$13.resolve(process.cwd(), ".env.vault");
641
- if (fs$2.existsSync(possibleVaultPath)) return possibleVaultPath;
1718
+ if (fs$3.existsSync(possibleVaultPath)) return possibleVaultPath;
642
1719
  return null;
643
1720
  }
644
1721
  function _resolveHome(envPath) {
@@ -672,7 +1749,7 @@ var require_main = /* @__PURE__ */ __commonJSMin(((exports, module) => {
672
1749
  let lastError;
673
1750
  const parsedAll = {};
674
1751
  for (const path of optionPaths) try {
675
- const parsed = DotenvModule.parse(fs$2.readFileSync(path, { encoding }));
1752
+ const parsed = DotenvModule.parse(fs$3.readFileSync(path, { encoding }));
676
1753
  DotenvModule.populate(parsedAll, parsed, options);
677
1754
  } catch (e) {
678
1755
  if (debug) _debug(`Failed to load ${path} ${e.message}`);
@@ -1252,7 +2329,7 @@ var require_clone = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1252
2329
  //#endregion
1253
2330
  //#region ../../node_modules/.pnpm/graceful-fs@4.2.11/node_modules/graceful-fs/graceful-fs.js
1254
2331
  var require_graceful_fs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1255
- var fs$1 = __require("fs");
2332
+ var fs$2 = __require("fs");
1256
2333
  var polyfills = require_polyfills();
1257
2334
  var legacy = require_legacy_streams();
1258
2335
  var clone = require_clone();
@@ -1281,36 +2358,36 @@ var require_graceful_fs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1281
2358
  m = "GFS4: " + m.split(/\n/).join("\nGFS4: ");
1282
2359
  console.error(m);
1283
2360
  };
1284
- if (!fs$1[gracefulQueue]) {
1285
- publishQueue(fs$1, global[gracefulQueue] || []);
1286
- fs$1.close = (function(fs$close) {
2361
+ if (!fs$2[gracefulQueue]) {
2362
+ publishQueue(fs$2, global[gracefulQueue] || []);
2363
+ fs$2.close = (function(fs$close) {
1287
2364
  function close(fd, cb) {
1288
- return fs$close.call(fs$1, fd, function(err) {
2365
+ return fs$close.call(fs$2, fd, function(err) {
1289
2366
  if (!err) resetQueue();
1290
2367
  if (typeof cb === "function") cb.apply(this, arguments);
1291
2368
  });
1292
2369
  }
1293
2370
  Object.defineProperty(close, previousSymbol, { value: fs$close });
1294
2371
  return close;
1295
- })(fs$1.close);
1296
- fs$1.closeSync = (function(fs$closeSync) {
2372
+ })(fs$2.close);
2373
+ fs$2.closeSync = (function(fs$closeSync) {
1297
2374
  function closeSync(fd) {
1298
- fs$closeSync.apply(fs$1, arguments);
2375
+ fs$closeSync.apply(fs$2, arguments);
1299
2376
  resetQueue();
1300
2377
  }
1301
2378
  Object.defineProperty(closeSync, previousSymbol, { value: fs$closeSync });
1302
2379
  return closeSync;
1303
- })(fs$1.closeSync);
2380
+ })(fs$2.closeSync);
1304
2381
  if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) process.on("exit", function() {
1305
- debug(fs$1[gracefulQueue]);
1306
- __require("assert").equal(fs$1[gracefulQueue].length, 0);
2382
+ debug(fs$2[gracefulQueue]);
2383
+ __require("assert").equal(fs$2[gracefulQueue].length, 0);
1307
2384
  });
1308
2385
  }
1309
- if (!global[gracefulQueue]) publishQueue(global, fs$1[gracefulQueue]);
1310
- module.exports = patch(clone(fs$1));
1311
- if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs$1.__patched) {
1312
- module.exports = patch(fs$1);
1313
- fs$1.__patched = true;
2386
+ if (!global[gracefulQueue]) publishQueue(global, fs$2[gracefulQueue]);
2387
+ module.exports = patch(clone(fs$2));
2388
+ if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs$2.__patched) {
2389
+ module.exports = patch(fs$2);
2390
+ fs$2.__patched = true;
1314
2391
  }
1315
2392
  function patch(fs) {
1316
2393
  polyfills(fs);
@@ -1565,23 +2642,23 @@ var require_graceful_fs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1565
2642
  }
1566
2643
  function enqueue(elem) {
1567
2644
  debug("ENQUEUE", elem[0].name, elem[1]);
1568
- fs$1[gracefulQueue].push(elem);
2645
+ fs$2[gracefulQueue].push(elem);
1569
2646
  retry();
1570
2647
  }
1571
2648
  var retryTimer;
1572
2649
  function resetQueue() {
1573
2650
  var now = Date.now();
1574
- for (var i = 0; i < fs$1[gracefulQueue].length; ++i) if (fs$1[gracefulQueue][i].length > 2) {
1575
- fs$1[gracefulQueue][i][3] = now;
1576
- fs$1[gracefulQueue][i][4] = now;
2651
+ for (var i = 0; i < fs$2[gracefulQueue].length; ++i) if (fs$2[gracefulQueue][i].length > 2) {
2652
+ fs$2[gracefulQueue][i][3] = now;
2653
+ fs$2[gracefulQueue][i][4] = now;
1577
2654
  }
1578
2655
  retry();
1579
2656
  }
1580
2657
  function retry() {
1581
2658
  clearTimeout(retryTimer);
1582
2659
  retryTimer = void 0;
1583
- if (fs$1[gracefulQueue].length === 0) return;
1584
- var elem = fs$1[gracefulQueue].shift();
2660
+ if (fs$2[gracefulQueue].length === 0) return;
2661
+ var elem = fs$2[gracefulQueue].shift();
1585
2662
  var fn = elem[0];
1586
2663
  var args = elem[1];
1587
2664
  var err = elem[2];
@@ -1600,7 +2677,7 @@ var require_graceful_fs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1600
2677
  if (sinceAttempt >= Math.min(sinceStart * 1.2, 100)) {
1601
2678
  debug("RETRY", fn.name, args);
1602
2679
  fn.apply(null, args.concat([startTime]));
1603
- } else fs$1[gracefulQueue].push(elem);
2680
+ } else fs$2[gracefulQueue].push(elem);
1604
2681
  }
1605
2682
  if (retryTimer === void 0) retryTimer = setTimeout(retry, 0);
1606
2683
  }
@@ -2892,96 +3969,6 @@ const safeAwait = async (promise) => {
2892
3969
  }
2893
3970
  };
2894
3971
 
2895
- //#endregion
2896
- //#region src/utils/prompts.ts
2897
- const createOptions = (options) => options.map((option) => ({
2898
- label: option.toString(),
2899
- value: option
2900
- }));
2901
- const createPrompt = (fn) => {
2902
- return async (options) => {
2903
- const result = await fn(options);
2904
- if (isCancel(result)) {
2905
- cancel("User cancelled");
2906
- exit(0);
2907
- }
2908
- return result;
2909
- };
2910
- };
2911
- const createShowList = createPrompt((options) => {
2912
- options.map((option) => {
2913
- return isString(option) ? option : option.label;
2914
- }).forEach((item) => {
2915
- log.show(item, { type: "step" });
2916
- });
2917
- });
2918
- const createSearch = ({ message, options }) => {
2919
- const fuse = new Fuse(options, { keys: ["label"] });
2920
- return search({
2921
- message,
2922
- source: (term) => {
2923
- if (!term) return options;
2924
- return fuse.search(term).map(({ item }) => item);
2925
- }
2926
- });
2927
- };
2928
- process.on("uncaughtException", (error) => {
2929
- if (error instanceof Error && error.name === "ExitPromptError") log.show("User cancelled", { type: "error" });
2930
- else throw error;
2931
- });
2932
- const createCheckbox = async (opts) => {
2933
- const result = await multiselect(opts);
2934
- if (isCancel(result)) {
2935
- cancel("User cancelled");
2936
- exit(0);
2937
- }
2938
- return result;
2939
- };
2940
- const createNote = ({ message = "", title = "", opts }) => note(message, title, opts);
2941
- const createConfirm = createPrompt(confirm);
2942
- const createTasks = createPrompt(tasks);
2943
- const createSelect = async (opts) => {
2944
- const result = await select(opts);
2945
- if (isCancel(result)) {
2946
- cancel("User cancelled");
2947
- exit(0);
2948
- }
2949
- return result;
2950
- };
2951
- const createInput = async (opts) => {
2952
- const result = await text(opts);
2953
- if (isCancel(result)) {
2954
- cancel("User cancelled");
2955
- exit(0);
2956
- }
2957
- return result;
2958
- };
2959
- const createGroupMultiSelect = async (opts) => {
2960
- const result = await groupMultiselect(opts);
2961
- if (isCancel(result)) {
2962
- cancel("User cancelled");
2963
- process.exit(0);
2964
- }
2965
- return result;
2966
- };
2967
- const createGroup = async (opts) => {
2968
- const result = await group(opts);
2969
- if (isCancel(result)) {
2970
- cancel("User cancelled");
2971
- exit(0);
2972
- }
2973
- return result;
2974
- };
2975
- const createSpinner = (message, options) => {
2976
- const s = spinner(options);
2977
- s.start(message);
2978
- return s;
2979
- };
2980
- const createTaskLog = (title, options) => taskLog({
2981
- title,
2982
- ...options
2983
- });
2984
-
2985
3972
  //#endregion
2986
3973
  //#region src/utils/spinner.ts
2987
3974
  const BASE_OPTIONS = { timeout: 1e4 };
@@ -2995,34 +3982,103 @@ const ora = (options) => {
2995
3982
 
2996
3983
  //#endregion
2997
3984
  //#region src/utils/workspace.ts
3985
+ /**
3986
+ * Workspace configuration files and their detection patterns
3987
+ */
3988
+ const WORKSPACE_CONFIGS = {
3989
+ pnpm: { file: "pnpm-workspace.yaml" },
3990
+ yarn: {
3991
+ file: "package.json",
3992
+ checkField: "workspaces"
3993
+ },
3994
+ npm: {
3995
+ file: "package.json",
3996
+ checkField: "workspaces"
3997
+ },
3998
+ bun: {
3999
+ file: "package.json",
4000
+ checkField: "workspaces"
4001
+ },
4002
+ deno: {
4003
+ file: "package.json",
4004
+ checkField: "workspaces"
4005
+ }
4006
+ };
4007
+ /**
4008
+ * Priority order for workspace detection (matches package manager detector)
4009
+ */
4010
+ const WORKSPACE_PRIORITY = [
4011
+ "pnpm",
4012
+ "yarn",
4013
+ "npm",
4014
+ "bun"
4015
+ ];
4016
+ /**
4017
+ * Find workspace root by detecting workspace configuration files
4018
+ * Supports pnpm, yarn, npm, and bun workspace configurations
4019
+ */
2998
4020
  async function findWorkspaceRoot(startDir = process.cwd()) {
2999
4021
  let currentDir = startDir;
3000
- while (true) try {
3001
- await fs.access(path.join(currentDir, "pnpm-workspace.yaml"));
3002
- return currentDir;
3003
- } catch {
4022
+ while (true) {
4023
+ for (const pm of WORKSPACE_PRIORITY) {
4024
+ const config = WORKSPACE_CONFIGS[pm];
4025
+ const configPath = path.join(currentDir, config.file);
4026
+ try {
4027
+ await fs$1.access(configPath);
4028
+ if (config.checkField === "workspaces") {
4029
+ if (readJSON(configPath)?.workspaces) {
4030
+ log.info(`Found ${pm} workspace at: ${currentDir}`);
4031
+ return {
4032
+ root: currentDir,
4033
+ packageManager: pm
4034
+ };
4035
+ }
4036
+ } else {
4037
+ log.info(`Found ${pm} workspace at: ${currentDir}`);
4038
+ return {
4039
+ root: currentDir,
4040
+ packageManager: pm
4041
+ };
4042
+ }
4043
+ } catch {}
4044
+ }
3004
4045
  const parentDir = path.dirname(currentDir);
3005
- if (parentDir === currentDir) throw new Error("pnpm-workspace.yaml not found in any parent directory.");
4046
+ if (parentDir === currentDir) throw new Error("Workspace configuration not found. Supported: pnpm-workspace.yaml or package.json with workspaces field");
3006
4047
  currentDir = parentDir;
3007
4048
  }
3008
4049
  }
4050
+ /**
4051
+ * Get workspace directories based on detected package manager
4052
+ * Supports pnpm-workspace.yaml and package.json workspaces field
4053
+ */
3009
4054
  async function getWorkspaceDirs() {
3010
- const workspaceRoot = await findWorkspaceRoot();
4055
+ const { root: workspaceRoot, packageManager } = await findWorkspaceRoot();
3011
4056
  try {
3012
- log.info(`Found workspace root at: ${workspaceRoot}`);
3013
- const workspaceConfigPath = path.join(workspaceRoot, "pnpm-workspace.yaml");
3014
- const configFileContent = await fs.readFile(workspaceConfigPath, "utf8");
3015
- const workspaceConfig = yaml.parse(configFileContent);
3016
- if (!workspaceConfig?.packages?.length) {
3017
- log.warn("No packages defined in pnpm-workspace.yaml or file is empty.");
4057
+ let packagePatterns = [];
4058
+ if (packageManager === "pnpm") {
4059
+ const workspaceConfigPath = path.join(workspaceRoot, "pnpm-workspace.yaml");
4060
+ const configFileContent = await fs$1.readFile(workspaceConfigPath, "utf8");
4061
+ const workspaceConfig = yaml.parse(configFileContent);
4062
+ if (workspaceConfig?.packages?.length) packagePatterns = workspaceConfig.packages;
4063
+ } else {
4064
+ const packageJsonPath = path.join(workspaceRoot, "package.json");
4065
+ const packageJson = JSON.parse(await fs$1.readFile(packageJsonPath, "utf8"));
4066
+ if (packageJson?.workspaces) {
4067
+ if (Array.isArray(packageJson.workspaces)) packagePatterns = packageJson.workspaces;
4068
+ else if (packageJson.workspaces?.packages && Array.isArray(packageJson.workspaces.packages)) packagePatterns = packageJson.workspaces.packages;
4069
+ }
4070
+ }
4071
+ if (!packagePatterns.length) {
4072
+ log.warn("No packages defined in workspace configuration or file is empty.");
3018
4073
  return {
3019
4074
  root: workspaceRoot,
3020
- packages: []
4075
+ packages: [],
4076
+ packageManager
3021
4077
  };
3022
4078
  }
3023
- log.info(`Workspace package patterns: ${workspaceConfig.packages.join(", ")}`);
4079
+ log.info(`Workspace package patterns: ${packagePatterns.join(", ")}`);
3024
4080
  const dirs = [];
3025
- for (const pattern of workspaceConfig.packages) {
4081
+ for (const pattern of packagePatterns) {
3026
4082
  const packagePaths = await glob(pattern, {
3027
4083
  cwd: workspaceRoot,
3028
4084
  absolute: true
@@ -3031,13 +4087,15 @@ async function getWorkspaceDirs() {
3031
4087
  }
3032
4088
  return {
3033
4089
  root: workspaceRoot,
3034
- packages: filterDirList(dirs)
4090
+ packages: filterDirList(dirs),
4091
+ packageManager
3035
4092
  };
3036
4093
  } catch (err) {
3037
4094
  handleError(err, "Failed to get workspace dirs: ");
3038
4095
  return {
3039
4096
  root: workspaceRoot,
3040
- packages: []
4097
+ packages: [],
4098
+ packageManager
3041
4099
  };
3042
4100
  }
3043
4101
  }
@@ -3045,6 +4103,7 @@ async function getWorkspaceNames() {
3045
4103
  const workspacePackages = [];
3046
4104
  try {
3047
4105
  const { root, packages } = await getWorkspaceDirs();
4106
+ console.log("🚀 : getWorkspaceNames : root, packages:", root, packages);
3048
4107
  for (const packageDir of packages) {
3049
4108
  const packageJson = readJSON(`${packageDir}/package.json`);
3050
4109
  if (packageJson) workspacePackages.push({
@@ -3066,5 +4125,5 @@ async function getWorkspaceNames() {
3066
4125
  const pkg = readPackage(import.meta, "..");
3067
4126
 
3068
4127
  //#endregion
3069
- export { $, BASE_OPTIONS, CONFIG_NAME, Configstore, LOWEST_NODE_VERSION, addFiles, buildCommand, cached, checkFile, clearScreen, clearTerminal, colors, copyFile, createCheckbox, createCommand, createConfirm, createGroup, createGroupMultiSelect, createHelpExample, createInput, createNote, createOptions, createSearch, createSelect, createShowList, createSpinner, createStore, createTaskLog, createTasks, cwdPathname, deleteFile, deleteFiles, dirList, dirname, emptyDir, emptyDirs, exit, fileList, filename, filterDirList, getBrowserApps, getCurrentBranch, getDiffFiles, getGitStatus, getLocalBranches, getPackageDependencies, getWorkspaceDirs, getWorkspaceNames, glob, handleError, has, hasOwn, intro, isArray, isBoolean, isChinese, isDate, isDebug, isEmpty, isEmptyDir, isError, isFormData, isFunction, isMap, isNull, isNumber, isPlainObject, isPromise, isSet, isString, isSymbol, isURLSearchParams, isUndefined, loadConfig, loadEnv, log, logger, openBrowser, openBrowserApp, ora, outro, parseNames, pkg, progress, readFile, readGitignore, readJSON, readPackage, require$1 as require, safeAwait, sleep, stream, writeJSON, x, xASync, zx };
4128
+ export { $, BASE_OPTIONS, CONFIG_NAME, Configstore, LOCK_FILE_PATTERNS, LOWEST_NODE_VERSION, PACKAGE_MANAGER_NAMES, PackageManagerDetector, addFiles, buildCommand, cached, checkFile, clearScreen, clearTerminal, colors, copyFile, createCheckbox, createCommand, createConfirm, createGroup, createGroupMultiSelect, createHelpExample, createInput, createNote, createOptions, createSearch, createSelect, createShowList, createSpinner, createStore, createTaskLog, createTasks, cwdPathname, deleteFile, deleteFiles, dirList, dirname, emptyDir, emptyDirs, exit, fileList, filename, filterDirList, getAdapter, getAllAdapters, getBrowserApps, getCurrentBranch, getDiffFiles, getGitStatus, getLocalBranches, getPackageDependencies, getPackageManagerAdapter, getWorkspaceDirs, getWorkspaceNames, glob, handleError, has, hasOwn, intro, isArray, isBoolean, isChinese, isDate, isDebug, isEmpty, isEmptyDir, isError, isFormData, isFunction, isMap, isNull, isNumber, isPlainObject, isPromise, isSet, isString, isSymbol, isURLSearchParams, isUndefined, joinPath, loadConfig, loadEnv, log, logger, openBrowser, openBrowserApp, ora, outro, parseNames, pkg, progress, readFile, readGitignore, readJSON, readPackage, require$1 as require, safeAwait, sleep, stream, writeJSON, x, xASync, zx };
3070
4129
  //# sourceMappingURL=index.js.map