@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/dc-cli.js +91 -44
- package/dist/dlog-cli.js +91 -44
- package/dist/dx-cli.js +108 -61
- package/dist/sf-cli.js +108 -61
- package/package.json +3 -3
- package/src/dc.ts +2 -2
- package/src/dx.ts +2 -2
- package/src/sf.ts +2 -2
package/dist/sf-cli.js
CHANGED
|
@@ -2,13 +2,37 @@
|
|
|
2
2
|
// @bun
|
|
3
3
|
|
|
4
4
|
// src/sf-cli.ts
|
|
5
|
-
import
|
|
5
|
+
import process18 from "process";
|
|
6
6
|
// ../kit/src/args.ts
|
|
7
|
-
import
|
|
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
|
|
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
|
|
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
|
|
284
|
-
function findUp(names, from =
|
|
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
|
|
322
|
+
import process4 from "process";
|
|
299
323
|
function configBase(where = {}) {
|
|
300
|
-
const xdg = where.xdg ?? (where.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
|
-
|
|
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) =>
|
|
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 =
|
|
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 = `${
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
532
|
+
console.log(jsonText(value));
|
|
486
533
|
}
|
|
487
534
|
|
|
488
535
|
// ../kit/src/help.ts
|
|
489
|
-
import
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
875
|
+
function usagePath(env = process10.env) {
|
|
829
876
|
return join4(stateHome(env), CLI_FOLDER, "usage.jsonl");
|
|
830
877
|
}
|
|
831
|
-
function usageRecorded(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 =
|
|
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(
|
|
864
|
-
const styled = takesControlCodes(
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
1299
|
+
import process14 from "process";
|
|
1253
1300
|
import tty from "tty";
|
|
1254
1301
|
|
|
1255
1302
|
// ../kit/src/picker/preview.ts
|
|
1256
|
-
import
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
1646
|
+
process14.once("exit", restore);
|
|
1600
1647
|
for (const signal of SIGNALS)
|
|
1601
|
-
|
|
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
|
-
|
|
1615
|
-
|
|
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(
|
|
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)[
|
|
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[
|
|
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
|
|
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 =
|
|
1779
|
+
async function ask(question, { hint, terminal = process16 }, render, press) {
|
|
1733
1780
|
const { stdin, stderr } = terminal;
|
|
1734
|
-
if (
|
|
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:
|
|
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(
|
|
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
|
|
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([
|
|
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: `${
|
|
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
|
-
|
|
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.
|
|
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.
|
|
41
|
-
"@kaynooo/cli-kit": "0.
|
|
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 || !
|
|
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 =
|
|
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
|
|
237
|
+
return isInteractive()
|
|
238
238
|
}
|
|
239
239
|
|
|
240
240
|
/** What `--emit` prints for tmux, or, standalone, the command run once its prompts are answered. */
|