@kaynooo/cli-docker 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sf-cli.js CHANGED
@@ -2,13 +2,37 @@
2
2
  // @bun
3
3
 
4
4
  // src/sf-cli.ts
5
- import process16 from "process";
5
+ import process18 from "process";
6
6
  // ../kit/src/args.ts
7
- import process7 from "process";
7
+ import process9 from "process";
8
8
  import { parseArgs } from "util";
9
9
 
10
+ // ../kit/src/format.ts
11
+ import process7 from "process";
12
+
13
+ // ../kit/src/mode.ts
14
+ import process2 from "process";
15
+ var MODES = new Set(["terminal", "ci", "agent", "pipe"]);
16
+ var AGENT_VARIABLES = ["CLAUDECODE", "AI_AGENT"];
17
+ function isSet(value) {
18
+ return value !== undefined && value !== "" && value !== "0" && value.toLowerCase() !== "false";
19
+ }
20
+ function outputMode(stream = process2.stdout, env = process2.env) {
21
+ const chosen = env.KIT_MODE;
22
+ if (chosen !== undefined && MODES.has(chosen))
23
+ return chosen;
24
+ if (AGENT_VARIABLES.some((name) => isSet(env[name])))
25
+ return "agent";
26
+ if (stream.isTTY === true)
27
+ return "terminal";
28
+ return isSet(env.CI) ? "ci" : "pipe";
29
+ }
30
+ function isInteractive(streams = process2) {
31
+ return streams.stdin?.isTTY === true && streams.stderr?.isTTY === true;
32
+ }
33
+
10
34
  // ../kit/src/style.ts
11
- import process5 from "process";
35
+ import process6 from "process";
12
36
 
13
37
  // ../../node_modules/.bun/@kaynooo+utils@2.31.2+d0769e28dc4dad16/node_modules/@kaynooo/utils/dist/chunk-mtetydvc.js
14
38
  function x(s) {
@@ -275,13 +299,13 @@ var t = le();
275
299
  import { existsSync as existsSync2, readFileSync, statSync } from "fs";
276
300
  import { homedir as homedir2 } from "os";
277
301
  import { join as join3, resolve as resolve2 } from "path";
278
- import process4 from "process";
302
+ import process5 from "process";
279
303
 
280
304
  // ../kit/src/config.ts
281
305
  import { existsSync } from "fs";
282
306
  import { dirname, join, resolve } from "path";
283
- import process2 from "process";
284
- function findUp(names, from = process2.cwd(), stop = () => false) {
307
+ import process3 from "process";
308
+ function findUp(names, from = process3.cwd(), stop = () => false) {
285
309
  const wanted = typeof names === "string" ? [names] : names;
286
310
  for (let dir = resolve(from);; dir = dirname(dir)) {
287
311
  const found = wanted.map((name) => join(dir, name)).find((path) => existsSync(path));
@@ -295,9 +319,9 @@ function findUp(names, from = process2.cwd(), stop = () => false) {
295
319
  // ../kit/src/user-config.ts
296
320
  import { homedir } from "os";
297
321
  import { join as join2 } from "path";
298
- import process3 from "process";
322
+ import process4 from "process";
299
323
  function configBase(where = {}) {
300
- const xdg = where.xdg ?? (where.home === undefined ? process3.env.XDG_CONFIG_HOME : undefined);
324
+ const xdg = where.xdg ?? (where.home === undefined ? process4.env.XDG_CONFIG_HOME : undefined);
301
325
  return xdg !== undefined && xdg !== "" ? xdg : join2(where.home ?? homedir(), ".config");
302
326
  }
303
327
  function userConfigPath(bin, where = {}) {
@@ -330,10 +354,30 @@ function isColorSpec(spec) {
330
354
  return Number.isInteger(spec) && spec >= 0 && spec <= 255;
331
355
  return typeof spec === "string" && spec.trim() !== "" && spec.trim().split(SPACES).every((token) => STYLES.has(token) || HEX.test(token));
332
356
  }
333
- function tinted(colors, spec) {
357
+ var CUBE = [0, 95, 135, 175, 215, 255];
358
+ function cubeLevel(channel) {
359
+ return CUBE.reduce((best, value, level) => Math.abs(value - channel) < Math.abs(CUBE[best] - channel) ? level : best, 0);
360
+ }
361
+ function nearest256(hex) {
362
+ const rgb = [1, 3, 5].map((at) => Number.parseInt(hex.slice(at, at + 2), 16));
363
+ const levels = rgb.map(cubeLevel);
364
+ const cube = levels.map((level) => CUBE[level]);
365
+ const grey = Math.min(23, Math.max(0, Math.round((rgb.reduce((sum, channel) => sum + channel, 0) / 3 - 8) / 10)));
366
+ const greyValue = 8 + grey * 10;
367
+ const distance = (colour) => colour.reduce((sum, channel, at) => sum + (channel - rgb[at]) ** 2, 0);
368
+ return distance([greyValue, greyValue, greyValue]) < distance(cube) ? 232 + grey : 16 + 36 * levels[0] + 6 * levels[1] + levels[2];
369
+ }
370
+ function hasTrueColor(env) {
371
+ return env.COLORTERM === "truecolor" || env.COLORTERM === "24bit";
372
+ }
373
+ function tinted(colors, spec, env = process5.env) {
334
374
  if (typeof spec === "number")
335
375
  return colors.ansi256(spec);
336
- return spec.trim().split(SPACES).reduce((chain, token) => HEX.test(token) ? chain.hex(token) : chain[token] ?? chain, colors);
376
+ return spec.trim().split(SPACES).reduce((chain, token) => {
377
+ if (HEX.test(token))
378
+ return hasTrueColor(env) ? chain.hex(token) : chain.ansi256(nearest256(token));
379
+ return chain[token] ?? chain;
380
+ }, colors);
337
381
  }
338
382
  function isRecord(value) {
339
383
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -417,7 +461,7 @@ function warnOnce(message) {
417
461
  function isPath(chosen) {
418
462
  return chosen.includes("/") || chosen.endsWith(".json");
419
463
  }
420
- function loadTheme({ env = process4.env, from = process4.cwd(), home = homedir2(), warn = warnOnce } = {}) {
464
+ function loadTheme({ env = process5.env, from = process5.cwd(), home = homedir2(), warn = warnOnce } = {}) {
421
465
  const theme = { colors: { ...DEFAULT.colors }, glyphs: { ...DEFAULT.glyphs }, accents: [...DEFAULT.accents], bins: Object.create(null) };
422
466
  const sources = [];
423
467
  const chosen = env.KIT_THEME ?? "";
@@ -447,7 +491,7 @@ function loadTheme({ env = process4.env, from = process4.cwd(), home = homedir2(
447
491
  var current;
448
492
  var currentKey = "";
449
493
  function activeTheme() {
450
- const key = `${process4.cwd()}\x00${process4.env.KIT_THEME ?? ""}\x00${process4.env.XDG_CONFIG_HOME ?? ""}`;
494
+ const key = `${process5.cwd()}\x00${process5.env.KIT_THEME ?? ""}\x00${process5.env.XDG_CONFIG_HOME ?? ""}`;
451
495
  if (current === undefined || key !== currentKey) {
452
496
  current = loadTheme();
453
497
  currentKey = key;
@@ -456,20 +500,20 @@ function activeTheme() {
456
500
  }
457
501
 
458
502
  // ../kit/src/style.ts
459
- function takesControlCodes(stream, env = process5.env) {
460
- return stream.isTTY === true && env.NO_COLOR === undefined && env.NODE_DISABLE_COLORS === undefined && env.TERM !== "dumb";
503
+ function takesControlCodes(stream, env = process6.env) {
504
+ return stream.isTTY === true && env.NO_COLOR === undefined && env.NODE_DISABLE_COLORS === undefined && env.TERM !== "dumb" && outputMode(stream, env) === "terminal";
461
505
  }
462
- function paint(stream, env = process5.env) {
506
+ function paint(stream, env = process6.env) {
463
507
  return le({ stream: { isTTY: takesControlCodes(stream, env) }, env });
464
508
  }
465
- function role(name, stream, env = process5.env) {
509
+ function role(name, stream, env = process6.env) {
466
510
  const colors = paint(stream, env);
467
- return takesControlCodes(stream, env) ? tinted(colors, activeTheme().theme.colors[name]) : colors;
511
+ return takesControlCodes(stream, env) ? tinted(colors, activeTheme().theme.colors[name], env) : colors;
468
512
  }
469
513
  var STATUS_WORDS = {
470
514
  passed: ["passed", "success", "succeeded", "ok"],
471
515
  failed: ["failed", "failure", "error", "errored"],
472
- running: ["running", "in_progress", "started"],
516
+ running: ["running", "in_progress", "started", "holding"],
473
517
  queued: ["queued", "waiting", "pending", "created", "blocked", "scheduled"],
474
518
  skipped: ["skipped", "cancelled", "canceled", "manual"]
475
519
  };
@@ -481,32 +525,35 @@ function upTo(text, separator) {
481
525
  return end === -1 ? text : text.slice(0, end);
482
526
  }
483
527
  var ESCAPE = String.fromCharCode(27);
528
+ function jsonText(value, replacer, { stream = process7.stdout, env = process7.env } = {}) {
529
+ return JSON.stringify(value, replacer, outputMode(stream, env) === "agent" ? undefined : 2);
530
+ }
484
531
  function printJson(value) {
485
- console.log(JSON.stringify(value, undefined, 2));
532
+ console.log(jsonText(value));
486
533
  }
487
534
 
488
535
  // ../kit/src/help.ts
489
- import process6 from "process";
536
+ import process8 from "process";
490
537
  var OPTIONAL = /\[[^\]]+\]/g;
491
538
  var USAGE_PREFIX = /^usage:\s*/i;
492
539
  var FULL_STOP = /\.$/;
493
- function usageLine(usage, colors = paint(process6.stdout)) {
540
+ function usageLine(usage, colors = paint(process8.stdout)) {
494
541
  return `${colors.bold("Usage:")} ${usage.replace(USAGE_PREFIX, "").replaceAll(OPTIONAL, (part) => colors.dim(part))}`;
495
542
  }
496
- function helpText(usage, options, colors = paint(process6.stdout), { examples = [], replaces, exits = [] } = {}) {
543
+ function helpText(usage, options, colors = paint(process8.stdout), { examples = [], replaces, exits = [] } = {}) {
497
544
  return [usageLine(usage, colors), ...replacesRows(replaces, colors), "", colors.bold("Options:"), ...optionRows(options, colors), ...exitRows(exits, colors), ...exampleRows(examples, colors)].join(`
498
545
  `);
499
546
  }
500
- function exitRows(exits, colors = paint(process6.stdout)) {
547
+ function exitRows(exits, colors = paint(process8.stdout)) {
501
548
  if (exits.length === 0)
502
549
  return [];
503
550
  const width = Math.max(...exits.map(([code]) => String(code).length));
504
551
  return ["", colors.bold("Exits:"), ...exits.map(([code, meaning]) => ` ${colors.cyan(String(code).padEnd(width))} ${meaning}`)];
505
552
  }
506
- function replacesRows(replaces, colors = paint(process6.stdout)) {
507
- return replaces === undefined ? [] : ["", `${colors.bold("Instead of:")} ${replaces}`];
553
+ function replacesRows(replaces, colors = paint(process8.stdout)) {
554
+ return replaces === undefined || outputMode() === "agent" ? [] : ["", `${colors.bold("Instead of:")} ${replaces}`];
508
555
  }
509
- function wantsHelpJson(env = process6.env) {
556
+ function wantsHelpJson(env = process8.env) {
510
557
  return env.KIT_HELP === "json";
511
558
  }
512
559
  function description(usage, { examples = [], replaces, exits } = {}, options) {
@@ -525,12 +572,12 @@ function description(usage, { examples = [], replaces, exits } = {}, options) {
525
572
  ...options === undefined ? {} : { options: Object.entries(options).map(([name, { short, description }]) => ({ name, ...short === undefined ? {} : { short }, ...description === undefined ? {} : { description } })) }
526
573
  };
527
574
  }
528
- function exampleRows(examples, colors = paint(process6.stdout)) {
529
- if (examples.length === 0)
575
+ function exampleRows(examples, colors = paint(process8.stdout)) {
576
+ if (examples.length === 0 || outputMode() === "agent")
530
577
  return [];
531
578
  return ["", colors.bold("Examples:"), ...examples.map((example) => typeof example === "string" ? ` ${example}` : ` ${example[0]} ${colors.dim(`# ${example[1]}`)}`)];
532
579
  }
533
- function optionRows(options, colors = paint(process6.stdout)) {
580
+ function optionRows(options, colors = paint(process8.stdout)) {
534
581
  const rows = Object.entries(options).map(([name, option]) => {
535
582
  const short = option.short === undefined ? " " : `${colors.cyan(`-${option.short}`)}, `;
536
583
  const named = option.choices === undefined ? "<value>" : `<${option.choices.join("|")}>`;
@@ -624,7 +671,7 @@ var OUTPUT_OPTIONS = {
624
671
  color: { type: "string", description: "auto (on a terminal alone), always or never" },
625
672
  plain: { type: "boolean", description: "plain text, no colour or spinner: --color never" }
626
673
  };
627
- function applyOutput(color, plain, env = process7.env) {
674
+ function applyOutput(color, plain, env = process9.env) {
628
675
  const when = plain === true ? "never" : color ?? "auto";
629
676
  if (when === "auto")
630
677
  return;
@@ -801,13 +848,13 @@ var CLOSE_LINK = `${ESC}]8;;${ESC}\\`;
801
848
  // ../kit/src/cli.ts
802
849
  import { readFileSync as readFileSync2, realpathSync } from "fs";
803
850
  import { dirname as dirname3, join as join5 } from "path";
804
- import process9 from "process";
851
+ import process11 from "process";
805
852
 
806
853
  // ../kit/src/usage.ts
807
854
  import { appendFileSync, mkdirSync } from "fs";
808
855
  import { homedir as homedir3 } from "os";
809
856
  import { dirname as dirname2, isAbsolute, join as join4 } from "path";
810
- import process8 from "process";
857
+ import process10 from "process";
811
858
 
812
859
  // ../kit/src/logs.ts
813
860
  var DAY_MS = 24 * 60 * 60 * 1000;
@@ -821,14 +868,14 @@ var usageError;
821
868
  function noteUsageError(message) {
822
869
  usageError = message;
823
870
  }
824
- function stateHome(env = process8.env) {
871
+ function stateHome(env = process10.env) {
825
872
  const dir = env.XDG_STATE_HOME;
826
873
  return dir !== undefined && isAbsolute(dir) ? dir : join4(homedir3(), ".local", "state");
827
874
  }
828
- function usagePath(env = process8.env) {
875
+ function usagePath(env = process10.env) {
829
876
  return join4(stateHome(env), CLI_FOLDER, "usage.jsonl");
830
877
  }
831
- function usageRecorded(env = process8.env) {
878
+ function usageRecorded(env = process10.env) {
832
879
  const off = env.KAYNOOO_CLI_NO_USAGE;
833
880
  return env.NODE_ENV !== "test" && (off === undefined || off === "" || off === "0");
834
881
  }
@@ -842,7 +889,7 @@ function usageEntry(bin, command, argv, code, now = new Date) {
842
889
  usageError = undefined;
843
890
  return { at: now.toISOString(), bin, ...command === undefined ? {} : { command }, flags: flagNames(argv), code, ...unknown === undefined ? {} : { unknown } };
844
891
  }
845
- function recordUsage(entry, env = process8.env) {
892
+ function recordUsage(entry, env = process10.env) {
846
893
  if (!usageRecorded(env))
847
894
  return;
848
895
  try {
@@ -860,8 +907,8 @@ var LEVEL_OPTIONS = {
860
907
  };
861
908
  var TOP_OPTIONS = { ...LEVEL_OPTIONS, version: { type: "boolean", short: "v", description: "print the version" } };
862
909
  function printError(prefix, message, hint, cause) {
863
- const colors = paint(process9.stderr);
864
- const styled = takesControlCodes(process9.stderr);
910
+ const colors = paint(process11.stderr);
911
+ const styled = takesControlCodes(process11.stderr);
865
912
  const head = styled ? `${colors.red.bold("error")} ${colors.dim(`${prefix}:`)}` : `error: ${prefix}:`;
866
913
  const under = (label, text, tint) => text === undefined ? "" : `
867
914
  ${styled ? tint(label) : `${label}:`} ${text}`;
@@ -954,7 +1001,7 @@ function packageVersion(entry = Bun.main) {
954
1001
  return "0.0.0";
955
1002
  }
956
1003
  }
957
- async function runMain({ name, version, run, redact, usage }, argv = process9.argv.slice(2)) {
1004
+ async function runMain({ name, version, run, redact, usage }, argv = process11.argv.slice(2)) {
958
1005
  if (argv[0] === COMPLETE)
959
1006
  return printCandidates(leafCandidates(run, argv.slice(1)));
960
1007
  if (argv.length === 1 && (argv[0] === "--version" || argv[0] === "-v")) {
@@ -1000,13 +1047,13 @@ var ACCOUNT_DIRS = new Glob("*/sessions");
1000
1047
  import { existsSync as existsSync5, mkdirSync as mkdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync2 } from "fs";
1001
1048
  import { homedir as homedir5 } from "os";
1002
1049
  import { dirname as dirname7, join as join9, resolve as resolve4 } from "path";
1003
- import process15 from "process";
1050
+ import process17 from "process";
1004
1051
 
1005
1052
  // ../kit/src/picker.ts
1006
1053
  import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync } from "fs";
1007
1054
  import { homedir as homedir4 } from "os";
1008
1055
  import { dirname as dirname4, join as join6 } from "path";
1009
- import process13 from "process";
1056
+ import process15 from "process";
1010
1057
 
1011
1058
  // ../kit/src/picker/score.ts
1012
1059
  var MATCH = 16;
@@ -1249,11 +1296,11 @@ function chosen(state) {
1249
1296
 
1250
1297
  // ../kit/src/picker/terminal.ts
1251
1298
  import { openSync } from "fs";
1252
- import process12 from "process";
1299
+ import process14 from "process";
1253
1300
  import tty from "tty";
1254
1301
 
1255
1302
  // ../kit/src/picker/preview.ts
1256
- import process11 from "process";
1303
+ import process13 from "process";
1257
1304
 
1258
1305
  // ../kit/src/shell.ts
1259
1306
  var SEPARATORS = new Set([`
@@ -1322,7 +1369,7 @@ async function runPreview(template, line, signal, hidden = []) {
1322
1369
  ${previewCommand(template, line, hidden)}`], { stdin: "ignore", stdout: "pipe", stderr: "ignore", detached: true });
1323
1370
  const stop = () => {
1324
1371
  try {
1325
- process11.kill(-proc.pid, "SIGKILL");
1372
+ process13.kill(-proc.pid, "SIGKILL");
1326
1373
  } catch {
1327
1374
  proc.kill();
1328
1375
  }
@@ -1453,7 +1500,7 @@ function openTerminal() {
1453
1500
  } catch {
1454
1501
  return fail("no terminal to read keys from (/dev/tty)");
1455
1502
  }
1456
- const out = process12.stderr;
1503
+ const out = process14.stderr;
1457
1504
  let resize;
1458
1505
  return {
1459
1506
  get columns() {
@@ -1596,9 +1643,9 @@ async function select(rows, settings, terminal = openTerminal()) {
1596
1643
  const ended = new Promise((resolve) => {
1597
1644
  finish = resolve;
1598
1645
  });
1599
- process12.once("exit", restore);
1646
+ process14.once("exit", restore);
1600
1647
  for (const signal of SIGNALS)
1601
- process12.once(signal, stop);
1648
+ process14.once(signal, stop);
1602
1649
  try {
1603
1650
  terminal.write(PASTE_ON);
1604
1651
  terminal.listen(onChunk, () => draw(true));
@@ -1611,8 +1658,8 @@ async function select(rows, settings, terminal = openTerminal()) {
1611
1658
  await ended;
1612
1659
  } finally {
1613
1660
  for (const signal of SIGNALS)
1614
- process12.off(signal, stop);
1615
- process12.off("exit", restore);
1661
+ process14.off(signal, stop);
1662
+ process14.off("exit", restore);
1616
1663
  restore();
1617
1664
  }
1618
1665
  return state.done === "accept" ? { rows: chosen(state), key: state.key, query: state.query } : undefined;
@@ -1650,7 +1697,7 @@ function heightFor(count) {
1650
1697
  return String(Math.max(15, Math.ceil((count + 4) / 0.6)));
1651
1698
  }
1652
1699
  function historyFile(name) {
1653
- return join6(process13.env.XDG_CACHE_HOME ?? join6(homedir4(), ".cache"), name, "history.json");
1700
+ return join6(process15.env.XDG_CACHE_HOME ?? join6(homedir4(), ".cache"), name, "history.json");
1654
1701
  }
1655
1702
  function history(name) {
1656
1703
  try {
@@ -1661,12 +1708,12 @@ function history(name) {
1661
1708
  }
1662
1709
  }
1663
1710
  function runs(name) {
1664
- return history(name)[process13.cwd()] ?? [];
1711
+ return history(name)[process15.cwd()] ?? [];
1665
1712
  }
1666
1713
  function record(name, run) {
1667
1714
  const all = history(name);
1668
1715
  const file = historyFile(name);
1669
- all[process13.cwd()] = [run, ...(all[process13.cwd()] ?? []).filter((earlier) => earlier.id !== run.id)].slice(0, REMEMBERED);
1716
+ all[process15.cwd()] = [run, ...(all[process15.cwd()] ?? []).filter((earlier) => earlier.id !== run.id)].slice(0, REMEMBERED);
1670
1717
  mkdirSync2(dirname4(file), { recursive: true });
1671
1718
  writeFileSync(file, JSON.stringify(all));
1672
1719
  }
@@ -1690,7 +1737,7 @@ function list(rows) {
1690
1737
  }
1691
1738
 
1692
1739
  // ../kit/src/prompt.ts
1693
- import process14 from "process";
1740
+ import process16 from "process";
1694
1741
  var KEY_SEQUENCES2 = /\x1B\[[0-9;]*[A-Z~]|\x1BO[A-Z]|[\s\S]/giu;
1695
1742
  var CONTROL3 = /^[\x00-\x1F\x7F]/;
1696
1743
  var KEYS2 = { "\x1B[A": "up", "\x1BOA": "up", "\x1B[B": "down", "\x1BOB": "down", "\r": "enter", "\n": "enter", "\x03": "cancel", "\x1B": "cancel", "\x7F": "erase", "\b": "erase" };
@@ -1729,9 +1776,9 @@ async function input2(question, { default: fallback, mask = false, validate, ...
1729
1776
  function answer(colors, question, state, picked) {
1730
1777
  return state === "enter" ? `${colors.green("\u2713")} ${question} ${colors.cyan(picked)}` : `${colors.red("\u2717")} ${question} ${colors.dim("cancelled")}`;
1731
1778
  }
1732
- async function ask(question, { hint, terminal = process14 }, render, press) {
1779
+ async function ask(question, { hint, terminal = process16 }, render, press) {
1733
1780
  const { stdin, stderr } = terminal;
1734
- if (stdin.isTTY !== true || stderr.isTTY !== true)
1781
+ if (!isInteractive(terminal))
1735
1782
  fail(`cannot ask "${question}" off a terminal`, 2, hint);
1736
1783
  const colors = paint(stderr);
1737
1784
  let drawn = 0;
@@ -2326,7 +2373,7 @@ async function consoleAt(dir) {
2326
2373
  const php = stack === undefined ? undefined : phpService((await services(stack)).map((service) => service.name));
2327
2374
  if (stack !== undefined && php !== undefined)
2328
2375
  return { dir, run: [...stack.run, "exec", php, "bin/console"], list: { ...stack.list, argv: [...stack.list.argv, "exec", "-T", php, "bin/console"] } };
2329
- return { dir, run: from(dir, ["php", "bin/console"]), list: { argv: ["php", "bin/console"], cwd: resolve4(dir), env: process15.env } };
2376
+ return { dir, run: from(dir, ["php", "bin/console"]), list: { argv: ["php", "bin/console"], cwd: resolve4(dir), env: process17.env } };
2330
2377
  }
2331
2378
  async function consoles() {
2332
2379
  const here = up2(".").find((dir) => existsSync5(join9(dir, "bin/console")));
@@ -2334,7 +2381,7 @@ async function consoles() {
2334
2381
  return Promise.all([...new Set(dirs)].map(consoleAt));
2335
2382
  }
2336
2383
  function cached(dir) {
2337
- return join9(process15.env.XDG_CACHE_HOME ?? join9(homedir5(), ".cache"), "sf", `${resolve4(dir).replaceAll("/", "%")}.json`);
2384
+ return join9(process17.env.XDG_CACHE_HOME ?? join9(homedir5(), ".cache"), "sf", `${resolve4(dir).replaceAll("/", "%")}.json`);
2338
2385
  }
2339
2386
  function fromCache(dir) {
2340
2387
  try {
@@ -2428,7 +2475,7 @@ async function answered(command, ask) {
2428
2475
  return { argv, given };
2429
2476
  }
2430
2477
  function interactive() {
2431
- return process15.stdin.isTTY && process15.stderr.isTTY;
2478
+ return isInteractive();
2432
2479
  }
2433
2480
  async function execute(emitting, typed, recorded, command) {
2434
2481
  if (emitting) {
@@ -2475,7 +2522,7 @@ async function hidden(flag, rest) {
2475
2522
  return 0;
2476
2523
  }
2477
2524
  if (refreshed)
2478
- Bun.spawn([process15.execPath, process15.argv[1], "--rows"], { stdio: ["ignore", "ignore", "ignore"] }).unref();
2525
+ Bun.spawn([process17.execPath, process17.argv[1], "--rows"], { stdio: ["ignore", "ignore", "ignore"] }).unref();
2479
2526
  list(byRecency(found, runs("sf"), key2).map((entry) => ({
2480
2527
  label: [key2(entry), signature(entry.command)].filter(Boolean).join(" "),
2481
2528
  hint: entry.command.description,
@@ -2535,7 +2582,7 @@ async function sf(args) {
2535
2582
  const picked = await pick(rows(found), {
2536
2583
  prompt: "sf> ",
2537
2584
  searched: 1,
2538
- preview: `${process15.execPath} ${process15.argv[1]} --show {1} {2}`,
2585
+ preview: `${process17.execPath} ${process17.argv[1]} --show {1} {2}`,
2539
2586
  reload: refreshed ? { onOpen: true, run: async () => ({ rows: rows(await entries2(true)) }) } : undefined
2540
2587
  });
2541
2588
  const entry = picked && (await entries2(false)).find((candidate) => candidate.app.dir === picked.hidden[0] && candidate.command.name === picked.hidden[1]);
@@ -2543,4 +2590,4 @@ async function sf(args) {
2543
2590
  }
2544
2591
 
2545
2592
  // src/sf-cli.ts
2546
- process16.exitCode = await runMain({ name: "sf", run: sf });
2593
+ process18.exitCode = await runMain({ name: "sf", run: sf });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaynooo/cli-docker",
3
3
  "type": "module",
4
- "version": "0.6.0",
4
+ "version": "0.7.0",
5
5
  "description": "dc, dx, dlog and sf: docker compose on the stack found here, including one only its containers tell of, a compose service's shell, logs, restart, stop or rebuild, every service's health and recent errors in one call, and a Symfony console command picked and run.",
6
6
  "author": "Kaynooo <contact@kaynooo.fr>",
7
7
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "sf": "$npm_execpath src/sf-cli.ts"
38
38
  },
39
39
  "devDependencies": {
40
- "@kaynooo/cli-env": "0.10.0",
41
- "@kaynooo/cli-kit": "0.21.1"
40
+ "@kaynooo/cli-env": "0.11.0",
41
+ "@kaynooo/cli-kit": "0.22.0"
42
42
  }
43
43
  }
package/src/dc.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Labels, Stack } from './stack'
2
2
  import process from 'node:process'
3
- import { paint } from '@kaynooo/cli-kit'
3
+ import { isInteractive, paint } from '@kaynooo/cli-kit'
4
4
  import { nearestStack, recordedNearby, stackAt, stackOf } from './stack'
5
5
 
6
6
  // The words a compose command starts with, which never name a stack, so the containers are not listed to check.
@@ -39,7 +39,7 @@ export async function target(args: string[]): Promise<Target> {
39
39
  async function choose(recorded: Labels[]): Promise<Labels | undefined> {
40
40
  const picker = Bun.which('pick')
41
41
 
42
- if (picker === null || !process.stdin.isTTY)
42
+ if (picker === null || !isInteractive())
43
43
  return undefined
44
44
 
45
45
  const proc = Bun.spawn([picker, '--prompt', 'dc> '], { stdin: new Blob([recorded.map(stack => stack.project).join('\n')]), stdout: 'pipe', stderr: 'inherit' })
package/src/dx.ts CHANGED
@@ -3,7 +3,7 @@ import type { Action, Service } from './stack'
3
3
  import process from 'node:process'
4
4
  import { loadKnown } from '@kaynooo/cli-env/files'
5
5
  import { Redactor } from '@kaynooo/cli-env/redactor'
6
- import { closest, fail, jsonOption, paint, parse, printJson, wholeNumber } from '@kaynooo/cli-kit'
6
+ import { closest, fail, isInteractive, jsonOption, paint, parse, printJson, wholeNumber } from '@kaynooo/cli-kit'
7
7
  import { byRecency, record, runs } from '@kaynooo/cli-kit/picker'
8
8
  import { KEY_LABELS, KEYS, pickService } from './picker'
9
9
  import { ACTIONS, allServices, commandFor, defaultAction, key, LOGS_TAIL, logsOf, serviceNamed, stateColor } from './stack'
@@ -139,7 +139,7 @@ export async function dx(args: string[]): Promise<number> {
139
139
  let action: Action | undefined
140
140
 
141
141
  if (named === undefined) {
142
- const interactive = process.stdin.isTTY && process.stderr.isTTY && parsed.values.json !== true
142
+ const interactive = isInteractive() && parsed.values.json !== true
143
143
 
144
144
  if (!interactive) {
145
145
  if (emit)
package/src/sf.ts CHANGED
@@ -4,7 +4,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
4
4
  import { homedir } from 'node:os'
5
5
  import { dirname, join, resolve } from 'node:path'
6
6
  import process from 'node:process'
7
- import { fail, paint, parse, printJson } from '@kaynooo/cli-kit'
7
+ import { fail, isInteractive, paint, parse, printJson } from '@kaynooo/cli-kit'
8
8
  import { byRecency, emit, list, pick, record, runs, table } from '@kaynooo/cli-kit/picker'
9
9
  import { input } from '@kaynooo/cli-kit/prompt'
10
10
  import { children, from, nearestStack, services, up } from './stack'
@@ -234,7 +234,7 @@ export async function answered(command: Arg[], ask: (name: string) => Promise<st
234
234
  }
235
235
 
236
236
  function interactive(): boolean {
237
- return process.stdin.isTTY && process.stderr.isTTY
237
+ return isInteractive()
238
238
  }
239
239
 
240
240
  /** What `--emit` prints for tmux, or, standalone, the command run once its prompts are answered. */