dev-cockpit 0.2.8 → 0.2.9

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.
@@ -25,6 +25,21 @@ export interface MountCommandOptions {
25
25
  quiet?: boolean;
26
26
  }
27
27
  export declare function mergeMounts(configMounts: readonly Mount[], providerMounts: readonly Mount[]): Mount[];
28
+ /**
29
+ * Interactive picker. Lazy-imports @inquirer/prompts to keep the `dev`
30
+ * command's startup time clean. Three phases:
31
+ *
32
+ * 1. Checkbox of discovered candidates (skipped if none).
33
+ * 2. For any selected mount with `alternativeSources` to choose from, offer
34
+ * a per-row source override via list-picker (with the current `hostPath`
35
+ * preselected and a `Custom path...` escape hatch).
36
+ * 3. `Add a custom mount?` loop — free-form bind entries with an auto-
37
+ * suggested `containerPath` drawn from the discovered candidates.
38
+ *
39
+ * Returns the final mount set in source-of-truth order. The caller writes
40
+ * the overlay / manifest from this list.
41
+ */
42
+ export declare function pickMounts(candidates: readonly Mount[]): Promise<Mount[]>;
28
43
  export declare function mountCommand(opts?: MountCommandOptions): Promise<void>;
29
44
  export declare function mountStatusCommand(opts?: MountCommandOptions): Promise<void>;
30
45
  export declare function mountClearCommand(opts?: MountCommandOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/commands/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAoBvD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAWD,wBAAgB,WAAW,CACzB,YAAY,EAAE,SAAS,KAAK,EAAE,EAC9B,cAAc,EAAE,SAAS,KAAK,EAAE,GAC/B,KAAK,EAAE,CAKT;AA+FD,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFhF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEtF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCrF"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/commands/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAoBvD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAWD,wBAAgB,WAAW,CACzB,YAAY,EAAE,SAAS,KAAK,EAAE,EAC9B,cAAc,EAAE,SAAS,KAAK,EAAE,GAC/B,KAAK,EAAE,CAKT;AAyHD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAuK/E;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FhF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEtF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCrF"}
@@ -204,26 +204,31 @@ export declare const BaseCockpitConfigSchema: z.ZodObject<{
204
204
  hostPath: z.ZodString;
205
205
  containerPath: z.ZodOptional<z.ZodString>;
206
206
  kind: z.ZodOptional<z.ZodEnum<["bind", "symlink-only"]>>;
207
+ alternativeSources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
207
208
  meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
208
209
  }, "strip", z.ZodTypeAny, {
209
210
  hostPath: string;
210
211
  containerPath?: string | undefined;
211
212
  kind?: "bind" | "symlink-only" | undefined;
213
+ alternativeSources?: string[] | undefined;
212
214
  meta?: Record<string, unknown> | undefined;
213
215
  }, {
214
216
  hostPath: string;
215
217
  containerPath?: string | undefined;
216
218
  kind?: "bind" | "symlink-only" | undefined;
219
+ alternativeSources?: string[] | undefined;
217
220
  meta?: Record<string, unknown> | undefined;
218
221
  }>, {
219
222
  hostPath: string;
220
223
  containerPath?: string | undefined;
221
224
  kind?: "bind" | "symlink-only" | undefined;
225
+ alternativeSources?: string[] | undefined;
222
226
  meta?: Record<string, unknown> | undefined;
223
227
  }, {
224
228
  hostPath: string;
225
229
  containerPath?: string | undefined;
226
230
  kind?: "bind" | "symlink-only" | undefined;
231
+ alternativeSources?: string[] | undefined;
227
232
  meta?: Record<string, unknown> | undefined;
228
233
  }>, "many">>>;
229
234
  mount: z.ZodDefault<z.ZodOptional<z.ZodObject<{
@@ -355,6 +360,7 @@ export declare const BaseCockpitConfigSchema: z.ZodObject<{
355
360
  hostPath: string;
356
361
  containerPath?: string | undefined;
357
362
  kind?: "bind" | "symlink-only" | undefined;
363
+ alternativeSources?: string[] | undefined;
358
364
  meta?: Record<string, unknown> | undefined;
359
365
  }[];
360
366
  mount: {
@@ -448,6 +454,7 @@ export declare const BaseCockpitConfigSchema: z.ZodObject<{
448
454
  hostPath: string;
449
455
  containerPath?: string | undefined;
450
456
  kind?: "bind" | "symlink-only" | undefined;
457
+ alternativeSources?: string[] | undefined;
451
458
  meta?: Record<string, unknown> | undefined;
452
459
  }[] | undefined;
453
460
  mount?: {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,mFAAmF;AACnF,eAAO,MAAM,cAAc,IAAI,CAAC;AA0IhC,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAhBlC;;;;;;WAMG;;QAEH,iDAAiD;;QAEjD,gEAAgE;;;;;;;;;;;IAwBhE,2EAA2E;;IAE3E,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEzE;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,OAAO;aACd,SAAS,EAAE,MAAM;gBAFjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM;CAOpC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,OAAO;gBADd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO;CAKjC;AAID,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC7C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,iBAAiB,CA0C5F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,mFAAmF;AACnF,eAAO,MAAM,cAAc,IAAI,CAAC;AA2IhC,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAhBlC;;;;;;WAMG;;QAEH,iDAAiD;;QAEjD,gEAAgE;;;;;;;;;;;IAwBhE,2EAA2E;;IAE3E,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEzE;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,OAAO;aACd,SAAS,EAAE,MAAM;gBAFjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM;CAOpC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,OAAO;gBADd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO;CAKjC;AAID,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC7C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,iBAAiB,CA0C5F"}
@@ -75,6 +75,14 @@ export interface Mount {
75
75
  * redirect a pre-existing compose bind to the dev clone).
76
76
  */
77
77
  kind?: 'bind' | 'symlink-only';
78
+ /**
79
+ * Optional list of alternative parent-dir clones the user can swap in for
80
+ * `hostPath` via the interactive picker (e.g. forks of the same package
81
+ * sitting alongside the auto-detected default). The profile populates this
82
+ * from its source scan; dev-cockpit only consumes it at picker time. When
83
+ * empty/absent the picker has nothing to offer and accepts `hostPath` as-is.
84
+ */
85
+ alternativeSources?: string[];
78
86
  /**
79
87
  * Optional metadata attached by profiles (e.g. `{name, type, installPath}`)
80
88
  * for richer status output and lifecycle decisions. dev-cockpit treats this
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -83972,6 +83972,7 @@ var MountSchema = external_exports.object({
83972
83972
  hostPath: external_exports.string(),
83973
83973
  containerPath: external_exports.string().optional(),
83974
83974
  kind: external_exports.enum(["bind", "symlink-only"]).optional(),
83975
+ alternativeSources: external_exports.array(external_exports.string()).optional(),
83975
83976
  meta: external_exports.record(external_exports.unknown()).optional()
83976
83977
  }).refine(
83977
83978
  (m) => m.kind === "symlink-only" ? true : typeof m.containerPath === "string" && m.containerPath.length > 0,
@@ -92625,19 +92626,155 @@ var stdoutSink = (line2) => process.stdout.write(`${line2}
92625
92626
  `);
92626
92627
  var stderrSink = (line2) => process.stderr.write(`${line2}
92627
92628
  `);
92628
- async function pickMounts(candidates) {
92629
- const { checkbox } = await import("@inquirer/prompts");
92630
- const choices = candidates.map((m) => {
92631
- const fallbackName = m.containerPath ?? (m.kind === "symlink-only" ? `(symlink) ${m.hostPath}` : m.hostPath);
92632
- const name = m.meta?.["name"] ?? fallbackName;
92633
- const type = m.meta?.["type"];
92634
- const label = type ? `${name} (${type}) ${m.hostPath}` : `${name} ${m.hostPath}`;
92635
- return { name: label, value: m, checked: true };
92636
- });
92637
- return checkbox({
92638
- message: "Select mounts to apply:",
92639
- choices
92629
+ function mountLabel(m) {
92630
+ const fallbackName = m.containerPath ?? (m.kind === "symlink-only" ? `(symlink) ${m.hostPath}` : m.hostPath);
92631
+ const name = m.meta?.["name"] ?? fallbackName;
92632
+ const type = m.meta?.["type"];
92633
+ return type ? `${name} (${type})` : name;
92634
+ }
92635
+ function isUnmatched(m) {
92636
+ return m.meta?.["unmatched"] === true;
92637
+ }
92638
+ var CUSTOM_PATH_SENTINEL = "__custom__";
92639
+ async function pickSourceForMount(m, prompts) {
92640
+ const alts = m.alternativeSources ?? [];
92641
+ const choices = [
92642
+ ...alts.map((s) => ({ name: s, value: s })),
92643
+ { name: "Custom path...", value: CUSTOM_PATH_SENTINEL }
92644
+ ];
92645
+ const chosen = await prompts.select({
92646
+ message: `Source for ${mountLabel(m)}:`,
92647
+ choices,
92648
+ default: alts.includes(m.hostPath) ? m.hostPath : void 0
92640
92649
  });
92650
+ if (chosen !== CUSTOM_PATH_SENTINEL) return chosen;
92651
+ return (await prompts.input({
92652
+ message: "Host path (absolute):",
92653
+ validate: (v) => v.trim().length > 0 && path20.isAbsolute(v.trim()) ? true : "must be an absolute path"
92654
+ })).trim();
92655
+ }
92656
+ async function pickMounts(candidates) {
92657
+ const { checkbox, confirm, input, select } = await import("@inquirer/prompts");
92658
+ const prompts = { select, input };
92659
+ let selected = [];
92660
+ if (candidates.length > 0) {
92661
+ const choices = candidates.map((m) => {
92662
+ const unmatched = isUnmatched(m);
92663
+ const suffix = unmatched ? " (no source found \u2014 pick one)" : ` ${m.hostPath}`;
92664
+ return {
92665
+ name: `${mountLabel(m)}${suffix}`,
92666
+ value: m,
92667
+ checked: !unmatched
92668
+ };
92669
+ });
92670
+ selected = await checkbox({ message: "Select mounts to apply:", choices });
92671
+ }
92672
+ const unmatchedRows = selected.filter(isUnmatched);
92673
+ const matchedWithAlts = selected.filter(
92674
+ (m) => !isUnmatched(m) && (m.alternativeSources?.length ?? 0) > 0
92675
+ );
92676
+ for (const m of unmatchedRows) {
92677
+ const chosen = await pickSourceForMount(m, prompts);
92678
+ const next = { ...m, hostPath: chosen };
92679
+ if (next.meta && "unmatched" in next.meta) {
92680
+ const cleaned = { ...next.meta };
92681
+ delete cleaned["unmatched"];
92682
+ next.meta = cleaned;
92683
+ }
92684
+ const idx = selected.indexOf(m);
92685
+ if (idx >= 0) selected[idx] = next;
92686
+ }
92687
+ const overridable = matchedWithAlts;
92688
+ if (overridable.length > 0) {
92689
+ const wantOverride = await confirm({
92690
+ message: "Override the source dir for any of the selected mounts?",
92691
+ default: false
92692
+ });
92693
+ if (wantOverride) {
92694
+ const toEdit = await checkbox({
92695
+ message: "Pick the mounts whose source you want to change:",
92696
+ choices: overridable.map((m) => ({
92697
+ name: `${mountLabel(m)} (current: ${m.hostPath})`,
92698
+ value: m,
92699
+ checked: false
92700
+ }))
92701
+ });
92702
+ for (const m of toEdit) {
92703
+ const chosen = await pickSourceForMount(m, prompts);
92704
+ const idx = selected.indexOf(m);
92705
+ if (idx >= 0) selected[idx] = { ...m, hostPath: chosen };
92706
+ }
92707
+ }
92708
+ }
92709
+ const knownContainerPaths = Array.from(
92710
+ new Set(
92711
+ candidates.map((c3) => c3.containerPath).filter((p) => typeof p === "string" && p.length > 0)
92712
+ )
92713
+ );
92714
+ const knownHostPaths = Array.from(
92715
+ new Set(candidates.flatMap((c3) => c3.alternativeSources ?? []))
92716
+ );
92717
+ while (await confirm({
92718
+ message: candidates.length === 0 ? "Add a custom mount?" : "Add another (custom) mount?",
92719
+ default: false
92720
+ })) {
92721
+ let hostPath;
92722
+ if (knownHostPaths.length > 0) {
92723
+ const picked = await select({
92724
+ message: "Host path:",
92725
+ choices: [
92726
+ ...knownHostPaths.map((s) => ({ name: s, value: s })),
92727
+ { name: "Custom path...", value: CUSTOM_PATH_SENTINEL }
92728
+ ]
92729
+ });
92730
+ if (picked === CUSTOM_PATH_SENTINEL) {
92731
+ hostPath = (await input({
92732
+ message: "Host path (absolute):",
92733
+ validate: (v) => v.trim().length > 0 && path20.isAbsolute(v.trim()) ? true : "must be an absolute path"
92734
+ })).trim();
92735
+ } else {
92736
+ hostPath = picked;
92737
+ }
92738
+ } else {
92739
+ hostPath = (await input({
92740
+ message: "Host path (absolute):",
92741
+ validate: (v) => v.trim().length > 0 && path20.isAbsolute(v.trim()) ? true : "must be an absolute path"
92742
+ })).trim();
92743
+ }
92744
+ let containerPath;
92745
+ if (knownContainerPaths.length > 0) {
92746
+ const picked = await select({
92747
+ message: "Container path:",
92748
+ choices: [
92749
+ ...knownContainerPaths.map((p) => ({ name: p, value: p })),
92750
+ { name: "Custom path...", value: CUSTOM_PATH_SENTINEL }
92751
+ ]
92752
+ });
92753
+ if (picked === CUSTOM_PATH_SENTINEL) {
92754
+ containerPath = (await input({
92755
+ message: "Container path (absolute):",
92756
+ validate: (v) => v.trim().length > 0 && path20.isAbsolute(v.trim()) ? true : "must be an absolute path"
92757
+ })).trim();
92758
+ } else {
92759
+ containerPath = picked;
92760
+ }
92761
+ } else {
92762
+ containerPath = (await input({
92763
+ message: "Container path (absolute):",
92764
+ validate: (v) => v.trim().length > 0 && path20.isAbsolute(v.trim()) ? true : "must be an absolute path"
92765
+ })).trim();
92766
+ }
92767
+ const name = (await input({
92768
+ message: "Name (optional, used for status table + log lines):"
92769
+ })).trim();
92770
+ selected.push({
92771
+ hostPath,
92772
+ containerPath,
92773
+ kind: "bind",
92774
+ ...name ? { meta: { name } } : {}
92775
+ });
92776
+ }
92777
+ return selected;
92641
92778
  }
92642
92779
  async function mountCommand(opts = {}) {
92643
92780
  const ctx = await resolveContext(opts);
@@ -92652,20 +92789,25 @@ async function mountCommand(opts = {}) {
92652
92789
  profile
92653
92790
  } = ctx;
92654
92791
  const merged = mergeMounts(configMounts, providerMounts);
92655
- if (merged.length === 0) {
92656
- process.stdout.write(
92657
- "dev-cockpit mount: no mount candidates from config.mounts[] or profile.mountCandidatesProvider.\n"
92658
- );
92659
- return;
92660
- }
92661
92792
  let selected;
92662
92793
  if (opts.quiet || configMounts.length > 0 && providerMounts.length === 0) {
92794
+ if (merged.length === 0) {
92795
+ process.stdout.write(
92796
+ "dev-cockpit mount: no mount candidates from config.mounts[] or profile.mountCandidatesProvider.\n"
92797
+ );
92798
+ return;
92799
+ }
92663
92800
  selected = merged;
92664
92801
  if (opts.quiet) {
92665
92802
  process.stdout.write(`dev-cockpit mount: applying all ${selected.length} candidate(s).
92666
92803
  `);
92667
92804
  }
92668
92805
  } else {
92806
+ if (merged.length === 0) {
92807
+ process.stdout.write(
92808
+ "dev-cockpit mount: no mount candidates discovered. You can add custom mounts interactively below, or Ctrl-C to bail.\n"
92809
+ );
92810
+ }
92669
92811
  selected = await pickMounts(merged);
92670
92812
  if (selected.length === 0) {
92671
92813
  process.stdout.write("dev-cockpit mount: nothing selected; nothing to apply.\n");