@cat-factory/cli 0.2.1 → 0.3.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/args.d.ts +12 -3
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +35 -4
- package/dist/args.js.map +1 -1
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -1
- package/dist/host-shell.d.ts +41 -0
- package/dist/host-shell.d.ts.map +1 -0
- package/dist/host-shell.js +65 -0
- package/dist/host-shell.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/k3s-probe.d.ts +69 -0
- package/dist/k3s-probe.d.ts.map +1 -0
- package/dist/k3s-probe.js +154 -0
- package/dist/k3s-probe.js.map +1 -0
- package/dist/k3s.d.ts +25 -0
- package/dist/k3s.d.ts.map +1 -0
- package/dist/k3s.js +132 -0
- package/dist/k3s.js.map +1 -0
- package/dist/plan.js +6 -0
- package/dist/plan.js.map +1 -1
- package/dist/templates.d.ts +2 -2
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +9 -5
- package/dist/templates.js.map +1 -1
- package/package.json +1 -1
package/dist/args.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { type ContainerRuntime } from './templates.js';
|
|
2
2
|
import { type VcsProvider } from './vcs.js';
|
|
3
|
+
/** The Kubernetes distribution `cat-factory k3s` can provision/target. */
|
|
4
|
+
export declare const K3S_RUNTIMES: readonly ['k3d', 'kind', 'k3s'];
|
|
5
|
+
export type K3sRuntime = (typeof K3S_RUNTIMES)[number];
|
|
3
6
|
/** Parsed, validated CLI options. Unset optionals are resolved later (defaults / prompts). */
|
|
4
7
|
export interface CliOptions {
|
|
5
|
-
/** The subcommand.
|
|
6
|
-
command: 'init' | 'help' | 'version';
|
|
8
|
+
/** The subcommand. `init` (the default when omitted) or `k3s` (guided local-cluster setup). */
|
|
9
|
+
command: 'init' | 'k3s' | 'help' | 'version';
|
|
7
10
|
dir?: string;
|
|
8
11
|
projectName?: string;
|
|
9
12
|
appTitle?: string;
|
|
@@ -15,6 +18,10 @@ export interface CliOptions {
|
|
|
15
18
|
harnessImage?: string;
|
|
16
19
|
/** Container runtime that spawns agent jobs (`LOCAL_CONTAINER_RUNTIME`). */
|
|
17
20
|
containerRuntime?: ContainerRuntime;
|
|
21
|
+
/** `k3s` command: name for a provisioned local cluster. */
|
|
22
|
+
clusterName?: string;
|
|
23
|
+
/** `k3s` command: the Kubernetes distribution to provision/target. */
|
|
24
|
+
k3sRuntime?: K3sRuntime;
|
|
18
25
|
/** Skip opening the browser at the token-creation URL (still prints it). */
|
|
19
26
|
noOpen: boolean;
|
|
20
27
|
/** Non-interactive: never prompt; use defaults/flags. Fails if a required value is missing. */
|
|
@@ -35,6 +42,8 @@ export declare const OPTION_DEFAULTS: {
|
|
|
35
42
|
readonly port: 8787;
|
|
36
43
|
readonly harnessImage: "ghcr.io/kibertoad/cat-factory-executor:latest";
|
|
37
44
|
readonly containerRuntime: ContainerRuntime;
|
|
45
|
+
readonly k3sClusterName: 'cat-factory';
|
|
46
|
+
readonly k3sRuntime: K3sRuntime;
|
|
38
47
|
};
|
|
39
|
-
export declare const HELP_TEXT = "cat-factory \u2014 bootstrap a local cat-factory deployment\n\nUsage:\n cat-factory [init] [options]\n\
|
|
48
|
+
export declare const HELP_TEXT = "cat-factory \u2014 bootstrap a local cat-factory deployment\n\nUsage:\n cat-factory [init] [options]\n cat-factory k3s [options]\n\nCommands:\n init Scaffold a local-mode backend (local/) + frontend SPA (frontend/): generate the\n crypto secrets, mint a GitHub/GitLab PAT (opens your browser), write gitignored .env.\n k3s Guided local Kubernetes setup: probe the host for a usable cluster and report what's\n found + recommended (provisioning + handler wiring land in a follow-up).\n\nOptions (init):\n -d, --dir <path> Target directory (default: ./<name>)\n --name <name> Project name slug (default: cat-factory)\n --title <title> Frontend app title (default: Agent Architecture Board)\n --provider <p> Source control: github | gitlab (default: github)\n --token <token> PAT value (skips the browser/paste flow)\n --db-url <url> Postgres DATABASE_URL\n --api-base <url> Backend API base for the SPA (default: http://localhost:<port>)\n --port <n> Backend HTTP port (default: 8787; also sets the SPA's api-base)\n --harness-image <ref> Executor-harness image (default: ghcr.io ...:latest)\n --container-runtime <r> Agent container runtime: docker | podman | orbstack | colima | apple\n --no-open Don't open the browser (just print the token URL)\n -y, --yes Non-interactive: use defaults/flags, never prompt\n -f, --force Overwrite existing files\n -h, --help Show this help\n -v, --version Show the CLI version\n\nOptions (k3s):\n --cluster-name <n> Name for a provisioned local cluster (default: cat-factory)\n --runtime <r> Kubernetes distribution: k3d | kind | k3s (default: k3d)\n -y, --yes Non-interactive: pick the recommended path, never prompt\n";
|
|
40
49
|
//# sourceMappingURL=args.d.ts.map
|
package/dist/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,gBAAgB,EAAyB,MAAM,gBAAgB,CAAA;AACjG,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAE1D,8FAA8F;AAC9F,MAAM,WAAW,UAAU;IACzB
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,gBAAgB,EAAyB,MAAM,gBAAgB,CAAA;AACjG,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAE1D,0EAA0E;AAC1E,eAAO,MAAM,YAAY,YAAI,KAAK,EAAE,MAAM,EAAE,KAAK,CAAU,CAAA;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD,8FAA8F;AAC9F,MAAM,WAAW,UAAU;IACzB,+FAA+F;IAC/F,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAA;IACf,+FAA+F;IAC/F,GAAG,EAAE,OAAO,CAAA;IACZ,oDAAoD;IACpD,KAAK,EAAE,OAAO,CAAA;CACf;AAQD,qBAAa,QAAS,SAAQ,KAAK;CAAG;AAEtC,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgGpD;AA8BD,qEAAqE;AACrE,eAAO,MAAM,eAAe;aAC1B,WAAW,EAAE,aAAa;aAC1B,QAAQ,EAAE,0BAA0B;aACpC,QAAQ,EAAc,WAAW;aACjC,WAAW,EAAE,8CAA8C;aAI3D,IAAI,EAAE,IAAI;aACV,YAAY;aACZ,gBAAgB,EAAc,gBAAgB;aAE9C,cAAc,EAAE,aAAa;aAC7B,UAAU,EAAW,UAAU;CACvB,CAAA;AAEV,eAAO,MAAM,SAAS,m1DAiCrB,CAAA"}
|
package/dist/args.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { CONTAINER_RUNTIMES, DEFAULT_HARNESS_IMAGE } from './templates.js';
|
|
2
2
|
import { VCS_PROVIDERS } from './vcs.js';
|
|
3
|
+
/** The Kubernetes distribution `cat-factory k3s` can provision/target. */
|
|
4
|
+
export const K3S_RUNTIMES = ['k3d', 'kind', 'k3s'];
|
|
3
5
|
const DEFAULTS = {
|
|
4
6
|
noOpen: false,
|
|
5
7
|
yes: false,
|
|
@@ -32,6 +34,12 @@ export function parseArgs(argv) {
|
|
|
32
34
|
commandSet = true;
|
|
33
35
|
}
|
|
34
36
|
break;
|
|
37
|
+
case 'k3s':
|
|
38
|
+
if (!commandSet) {
|
|
39
|
+
opts.command = 'k3s';
|
|
40
|
+
commandSet = true;
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
35
43
|
case 'help':
|
|
36
44
|
case '--help':
|
|
37
45
|
case '-h':
|
|
@@ -75,6 +83,12 @@ export function parseArgs(argv) {
|
|
|
75
83
|
case '--container-runtime':
|
|
76
84
|
opts.containerRuntime = parseContainerRuntime(takeValue(flag, inline, queue));
|
|
77
85
|
break;
|
|
86
|
+
case '--cluster-name':
|
|
87
|
+
opts.clusterName = takeValue(flag, inline, queue);
|
|
88
|
+
break;
|
|
89
|
+
case '--runtime':
|
|
90
|
+
opts.k3sRuntime = parseK3sRuntime(takeValue(flag, inline, queue));
|
|
91
|
+
break;
|
|
78
92
|
case '--no-open':
|
|
79
93
|
opts.noOpen = true;
|
|
80
94
|
break;
|
|
@@ -104,6 +118,12 @@ function parseContainerRuntime(value) {
|
|
|
104
118
|
return v;
|
|
105
119
|
throw new ArgError(`Invalid --container-runtime "${value}" (expected: ${CONTAINER_RUNTIMES.join(' | ')})`);
|
|
106
120
|
}
|
|
121
|
+
function parseK3sRuntime(value) {
|
|
122
|
+
const v = value.toLowerCase();
|
|
123
|
+
if (K3S_RUNTIMES.includes(v))
|
|
124
|
+
return v;
|
|
125
|
+
throw new ArgError(`Invalid --runtime "${value}" (expected: ${K3S_RUNTIMES.join(' | ')})`);
|
|
126
|
+
}
|
|
107
127
|
function parsePort(value) {
|
|
108
128
|
const n = Number(value);
|
|
109
129
|
if (!Number.isInteger(n) || n < 1 || n > 65535) {
|
|
@@ -123,17 +143,23 @@ export const OPTION_DEFAULTS = {
|
|
|
123
143
|
port: 8787,
|
|
124
144
|
harnessImage: DEFAULT_HARNESS_IMAGE,
|
|
125
145
|
containerRuntime: 'docker',
|
|
146
|
+
// `k3s` command defaults.
|
|
147
|
+
k3sClusterName: 'cat-factory',
|
|
148
|
+
k3sRuntime: 'k3d',
|
|
126
149
|
};
|
|
127
150
|
export const HELP_TEXT = `cat-factory — bootstrap a local cat-factory deployment
|
|
128
151
|
|
|
129
152
|
Usage:
|
|
130
153
|
cat-factory [init] [options]
|
|
154
|
+
cat-factory k3s [options]
|
|
131
155
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
156
|
+
Commands:
|
|
157
|
+
init Scaffold a local-mode backend (local/) + frontend SPA (frontend/): generate the
|
|
158
|
+
crypto secrets, mint a GitHub/GitLab PAT (opens your browser), write gitignored .env.
|
|
159
|
+
k3s Guided local Kubernetes setup: probe the host for a usable cluster and report what's
|
|
160
|
+
found + recommended (provisioning + handler wiring land in a follow-up).
|
|
135
161
|
|
|
136
|
-
Options:
|
|
162
|
+
Options (init):
|
|
137
163
|
-d, --dir <path> Target directory (default: ./<name>)
|
|
138
164
|
--name <name> Project name slug (default: cat-factory)
|
|
139
165
|
--title <title> Frontend app title (default: Agent Architecture Board)
|
|
@@ -149,5 +175,10 @@ Options:
|
|
|
149
175
|
-f, --force Overwrite existing files
|
|
150
176
|
-h, --help Show this help
|
|
151
177
|
-v, --version Show the CLI version
|
|
178
|
+
|
|
179
|
+
Options (k3s):
|
|
180
|
+
--cluster-name <n> Name for a provisioned local cluster (default: cat-factory)
|
|
181
|
+
--runtime <r> Kubernetes distribution: k3d | kind | k3s (default: k3d)
|
|
182
|
+
-y, --yes Non-interactive: pick the recommended path, never prompt
|
|
152
183
|
`;
|
|
153
184
|
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAyB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { ArgError, HELP_TEXT, parseArgs } from './args.js';
|
|
5
5
|
import { bootstrap } from './bootstrap.js';
|
|
6
|
+
import { setupK3s } from './k3s.js';
|
|
6
7
|
function readVersion() {
|
|
7
8
|
try {
|
|
8
9
|
const pkgUrl = new URL('../package.json', import.meta.url);
|
|
@@ -33,6 +34,10 @@ async function main() {
|
|
|
33
34
|
process.stdout.write(`${readVersion()}\n`);
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
37
|
+
if (options.command === 'k3s') {
|
|
38
|
+
await setupK3s(options);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
36
41
|
await bootstrap(options);
|
|
37
42
|
}
|
|
38
43
|
main().catch((err) => {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAA;QAC3F,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAA;IACX,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,OAAO,SAAS,EAAE,CAAC,CAAA;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC/B,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,CAAA;QAC1C,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;QACvB,OAAM;IACR,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The result of running a host command. `code` is the process exit code; the special value
|
|
3
|
+
* {@link COMMAND_NOT_FOUND} (127) is used when the binary itself is missing (spawn `ENOENT`),
|
|
4
|
+
* so callers can distinguish "not installed" from "ran but failed".
|
|
5
|
+
*/
|
|
6
|
+
export interface ShellResult {
|
|
7
|
+
code: number;
|
|
8
|
+
stdout: string;
|
|
9
|
+
stderr: string;
|
|
10
|
+
}
|
|
11
|
+
/** Conventional exit code for a missing binary — returned by {@link HostShell.run} on `ENOENT`. */
|
|
12
|
+
export declare const COMMAND_NOT_FOUND = 127;
|
|
13
|
+
/** Conventional exit code for a command killed by the watchdog timeout (mirrors `timeout(1)`). */
|
|
14
|
+
export declare const COMMAND_TIMED_OUT = 124;
|
|
15
|
+
/**
|
|
16
|
+
* Default per-command watchdog (ms). A probe must stay responsive, but some detections shell out to
|
|
17
|
+
* `kubectl`, which contacts the apiserver — a kubeconfig pointing at a down/unroutable cluster would
|
|
18
|
+
* otherwise block on the TCP/HTTP timeout. The watchdog kills such a child and reports
|
|
19
|
+
* {@link COMMAND_TIMED_OUT} so the probe treats it as "ran but failed" (not reachable), never hangs.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_COMMAND_TIMEOUT_MS = 10000;
|
|
22
|
+
/**
|
|
23
|
+
* Host shell-out seam. The k3s flow depends on this interface (never on `node:child_process`
|
|
24
|
+
* directly), so probing/provisioning can be driven by a fake in tests. The real implementation
|
|
25
|
+
* ({@link createNodeShell}) spawns real processes; tests inject their own. Mirrors the `Io` /
|
|
26
|
+
* `FileSystem` seams used by the `init` command.
|
|
27
|
+
*/
|
|
28
|
+
export interface HostShell {
|
|
29
|
+
/**
|
|
30
|
+
* Run `cmd` with `args`, capturing stdout/stderr. Resolves with the exit code — it NEVER
|
|
31
|
+
* rejects: a missing binary resolves to `{ code: COMMAND_NOT_FOUND }` so the probe can treat
|
|
32
|
+
* "not installed" uniformly, and a command that overruns `timeoutMs` is killed and resolves to
|
|
33
|
+
* `{ code: COMMAND_TIMED_OUT }`. Output is returned to the caller, never logged here.
|
|
34
|
+
*/
|
|
35
|
+
run(cmd: string, args: string[], opts?: {
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
}): Promise<ShellResult>;
|
|
38
|
+
}
|
|
39
|
+
/** The real, process-backed {@link HostShell}. */
|
|
40
|
+
export declare function createNodeShell(): HostShell;
|
|
41
|
+
//# sourceMappingURL=host-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-shell.d.ts","sourceRoot":"","sources":["../src/host-shell.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mGAAmG;AACnG,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACtF;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,SAAS,CAkD3C"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/** Conventional exit code for a missing binary — returned by {@link HostShell.run} on `ENOENT`. */
|
|
3
|
+
export const COMMAND_NOT_FOUND = 127;
|
|
4
|
+
/** Conventional exit code for a command killed by the watchdog timeout (mirrors `timeout(1)`). */
|
|
5
|
+
export const COMMAND_TIMED_OUT = 124;
|
|
6
|
+
/**
|
|
7
|
+
* Default per-command watchdog (ms). A probe must stay responsive, but some detections shell out to
|
|
8
|
+
* `kubectl`, which contacts the apiserver — a kubeconfig pointing at a down/unroutable cluster would
|
|
9
|
+
* otherwise block on the TCP/HTTP timeout. The watchdog kills such a child and reports
|
|
10
|
+
* {@link COMMAND_TIMED_OUT} so the probe treats it as "ran but failed" (not reachable), never hangs.
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_COMMAND_TIMEOUT_MS = 10_000;
|
|
13
|
+
/** The real, process-backed {@link HostShell}. */
|
|
14
|
+
export function createNodeShell() {
|
|
15
|
+
return {
|
|
16
|
+
run(cmd, args, opts) {
|
|
17
|
+
const timeoutMs = opts?.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS;
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
let stdout = '';
|
|
20
|
+
let stderr = '';
|
|
21
|
+
let settled = false;
|
|
22
|
+
let timer;
|
|
23
|
+
const finish = (result) => {
|
|
24
|
+
if (settled)
|
|
25
|
+
return;
|
|
26
|
+
settled = true;
|
|
27
|
+
if (timer)
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
resolve(result);
|
|
30
|
+
};
|
|
31
|
+
let child;
|
|
32
|
+
try {
|
|
33
|
+
child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
finish({ code: COMMAND_NOT_FOUND, stdout: '', stderr: `${cmd}: not found` });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Watchdog: kill a child that runs past the deadline (e.g. `kubectl` stuck dialing an
|
|
40
|
+
// unreachable apiserver) and report it as timed-out rather than blocking the probe forever.
|
|
41
|
+
timer = setTimeout(() => {
|
|
42
|
+
child.kill('SIGKILL');
|
|
43
|
+
finish({ code: COMMAND_TIMED_OUT, stdout, stderr: stderr || `${cmd}: timed out` });
|
|
44
|
+
}, timeoutMs);
|
|
45
|
+
timer.unref?.();
|
|
46
|
+
child.stdout?.on('data', (chunk) => {
|
|
47
|
+
stdout += chunk.toString();
|
|
48
|
+
});
|
|
49
|
+
child.stderr?.on('data', (chunk) => {
|
|
50
|
+
stderr += chunk.toString();
|
|
51
|
+
});
|
|
52
|
+
child.on('error', (err) => {
|
|
53
|
+
// ENOENT ⇒ the binary is missing; anything else ⇒ a genuine spawn failure. Both are
|
|
54
|
+
// surfaced as a non-zero result rather than a throw so the caller stays branch-free.
|
|
55
|
+
const code = err.code === 'ENOENT' ? COMMAND_NOT_FOUND : 1;
|
|
56
|
+
finish({ code, stdout, stderr: stderr || err.message });
|
|
57
|
+
});
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
finish({ code: code ?? 1, stdout, stderr });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=host-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-shell.js","sourceRoot":"","sources":["../src/host-shell.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
export { type CliOptions, HELP_TEXT, OPTION_DEFAULTS, parseArgs, ArgError } from './args.js';
|
|
1
|
+
export { type CliOptions, HELP_TEXT, K3S_RUNTIMES, type K3sRuntime, OPTION_DEFAULTS, parseArgs, ArgError, } from './args.js';
|
|
2
2
|
export { bootstrap, type BootstrapDeps, type FileSystem, BootstrapError } from './bootstrap.js';
|
|
3
|
+
export { COMMAND_NOT_FOUND, COMMAND_TIMED_OUT, createNodeShell, DEFAULT_COMMAND_TIMEOUT_MS, type HostShell, type ShellResult, } from './host-shell.js';
|
|
4
|
+
export { K3S_INSTALL_COMMAND, type K3sDeps, type K3sResult, setupK3s } from './k3s.js';
|
|
5
|
+
export { classifyHost, hasServerVersion, type HostDetections, type HostState, type Offer, type OfferId, parseK3dClusters, parseKindClusters, probeHost, type ToolDetection, } from './k3s-probe.js';
|
|
3
6
|
export { buildFrontendEnv, buildLocalEnv, type EnvEntry, type FrontendEnvInput, type LocalEnvInput, renderEnvFile, } from './env.js';
|
|
4
7
|
export { buildGitignore, mergeGitignore, REQUIRED_GITIGNORE_RULES } from './gitignore.js';
|
|
5
8
|
export { type Io, createConsoleIo } from './io.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,UAAU,EACf,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACjG,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Public, programmatic API of @cat-factory/cli. The `cat-factory` command (bin.ts) is a thin
|
|
2
2
|
// shell over these; they are also exported so the bootstrap can be embedded in other tooling.
|
|
3
|
-
export { HELP_TEXT, OPTION_DEFAULTS, parseArgs, ArgError } from './args.js';
|
|
3
|
+
export { HELP_TEXT, K3S_RUNTIMES, OPTION_DEFAULTS, parseArgs, ArgError, } from './args.js';
|
|
4
4
|
export { bootstrap, BootstrapError } from './bootstrap.js';
|
|
5
|
+
export { COMMAND_NOT_FOUND, COMMAND_TIMED_OUT, createNodeShell, DEFAULT_COMMAND_TIMEOUT_MS, } from './host-shell.js';
|
|
6
|
+
export { K3S_INSTALL_COMMAND, setupK3s } from './k3s.js';
|
|
7
|
+
export { classifyHost, hasServerVersion, parseK3dClusters, parseKindClusters, probeHost, } from './k3s-probe.js';
|
|
5
8
|
export { buildFrontendEnv, buildLocalEnv, renderEnvFile, } from './env.js';
|
|
6
9
|
export { buildGitignore, mergeGitignore, REQUIRED_GITIGNORE_RULES } from './gitignore.js';
|
|
7
10
|
export { createConsoleIo } from './io.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,OAAO,EAEL,SAAS,EACT,YAAY,EAEZ,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAuC,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,GAG3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAgC,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAKhB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GAEV,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EAIb,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAW,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAuB,SAAS,EAAoB,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAyB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACjG,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,GAEd,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type K3sRuntime } from './args.js';
|
|
2
|
+
import { type HostShell } from './host-shell.js';
|
|
3
|
+
/** Whether a host CLI is installed, and its reported version string when detectable. */
|
|
4
|
+
export interface ToolDetection {
|
|
5
|
+
installed: boolean;
|
|
6
|
+
version?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The raw facts detected about the host, produced by {@link probeHost} and consumed by the pure
|
|
10
|
+
* {@link classifyHost}. Kept as plain data so classification is unit-testable with no shell.
|
|
11
|
+
*/
|
|
12
|
+
export interface HostDetections {
|
|
13
|
+
kubectl: ToolDetection;
|
|
14
|
+
k3d: ToolDetection;
|
|
15
|
+
kind: ToolDetection;
|
|
16
|
+
k3s: ToolDetection;
|
|
17
|
+
docker: {
|
|
18
|
+
installed: boolean;
|
|
19
|
+
running: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** A cluster is reachable via the current kubeconfig (apiserver answered a version request). */
|
|
22
|
+
reachableCluster: boolean;
|
|
23
|
+
/** The current kubeconfig context name, when one is set. */
|
|
24
|
+
clusterContext?: string;
|
|
25
|
+
/** Names of existing k3d-managed clusters (Docker). */
|
|
26
|
+
k3dClusters: string[];
|
|
27
|
+
/** Names of existing kind-managed clusters (Docker). */
|
|
28
|
+
kindClusters: string[];
|
|
29
|
+
}
|
|
30
|
+
/** The setup paths the probe can offer. */
|
|
31
|
+
export type OfferId = 'use-existing' | 'create-k3d' | 'create-kind' | 'install-k3s';
|
|
32
|
+
/** One offered setup path, with whether it's currently possible + why not. */
|
|
33
|
+
export interface Offer {
|
|
34
|
+
id: OfferId;
|
|
35
|
+
label: string;
|
|
36
|
+
available: boolean;
|
|
37
|
+
recommended: boolean;
|
|
38
|
+
/** When `available` is false, a short reason the UI can show. */
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
/** The classified host state: the raw detections plus the offered paths and the recommendation. */
|
|
42
|
+
export interface HostState {
|
|
43
|
+
detections: HostDetections;
|
|
44
|
+
offers: Offer[];
|
|
45
|
+
recommended: OfferId;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Classify the host from its detected facts into the offered setup paths. Pure — no IO — so it's
|
|
49
|
+
* the primary unit-test target. `recommended` is the highest-priority AVAILABLE offer for the
|
|
50
|
+
* `preferred` runtime (default `k3d`, the no-root Docker path).
|
|
51
|
+
*/
|
|
52
|
+
export declare function classifyHost(d: HostDetections, preferred?: K3sRuntime): HostState;
|
|
53
|
+
/** Parse `k3d cluster list --output json` (an array of `{ name }`) into cluster names. */
|
|
54
|
+
export declare function parseK3dClusters(stdout: string): string[];
|
|
55
|
+
/** Parse `kind get clusters` (newline-separated names; a "No kind clusters" note ⇒ empty). */
|
|
56
|
+
export declare function parseKindClusters(stdout: string): string[];
|
|
57
|
+
/** Detect whether a `kubectl version --output=json` payload reports a reachable apiserver. */
|
|
58
|
+
export declare function hasServerVersion(stdout: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Probe the host over the {@link HostShell} seam and classify it for the `preferred` runtime. Runs
|
|
61
|
+
* each tool's detection command, treats {@link COMMAND_NOT_FOUND} as "not installed", and folds the
|
|
62
|
+
* results through the pure {@link classifyHost}. Tested with a scripted fake shell.
|
|
63
|
+
*
|
|
64
|
+
* `kubectl version` / `config current-context` contact the apiserver, so they carry an explicit
|
|
65
|
+
* `--request-timeout` — a kubeconfig pointing at a down cluster then fails fast instead of hanging
|
|
66
|
+
* the probe (the {@link HostShell} watchdog is the outer backstop).
|
|
67
|
+
*/
|
|
68
|
+
export declare function probeHost(shell: HostShell, preferred?: K3sRuntime): Promise<HostState>;
|
|
69
|
+
//# sourceMappingURL=k3s-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k3s-probe.d.ts","sourceRoot":"","sources":["../src/k3s-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEnE,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,CAAA;IACtB,GAAG,EAAE,aAAa,CAAA;IAClB,IAAI,EAAE,aAAa,CAAA;IACnB,GAAG,EAAE,aAAa,CAAA;IAClB,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IAChD,gGAAgG;IAChG,gBAAgB,EAAE,OAAO,CAAA;IACzB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,wDAAwD;IACxD,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,CAAA;AAEnF,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,mGAAmG;AACnG,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAmBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,GAAE,UAAkB,GAAG,SAAS,CAsDxF;AAgBD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAYzD;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK1D;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,UAAkB,GAC5B,OAAO,CAAC,SAAS,CAAC,CA0CpB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {} from './args.js';
|
|
2
|
+
import { COMMAND_NOT_FOUND } from './host-shell.js';
|
|
3
|
+
/**
|
|
4
|
+
* Priority order for picking the recommendation, given the user's preferred runtime. A live cluster
|
|
5
|
+
* always wins; otherwise the preferred distribution's create/install path is tried first, then the
|
|
6
|
+
* others as fallbacks. Every list ends with `install-k3s`, which is always available.
|
|
7
|
+
*/
|
|
8
|
+
function offerPriority(preferred) {
|
|
9
|
+
switch (preferred) {
|
|
10
|
+
case 'kind':
|
|
11
|
+
return ['use-existing', 'create-kind', 'create-k3d', 'install-k3s'];
|
|
12
|
+
case 'k3s':
|
|
13
|
+
// An explicit k3s preference favours the guided single-node install over the Docker paths.
|
|
14
|
+
return ['use-existing', 'install-k3s', 'create-k3d', 'create-kind'];
|
|
15
|
+
default:
|
|
16
|
+
return ['use-existing', 'create-k3d', 'create-kind', 'install-k3s'];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Classify the host from its detected facts into the offered setup paths. Pure — no IO — so it's
|
|
21
|
+
* the primary unit-test target. `recommended` is the highest-priority AVAILABLE offer for the
|
|
22
|
+
* `preferred` runtime (default `k3d`, the no-root Docker path).
|
|
23
|
+
*/
|
|
24
|
+
export function classifyHost(d, preferred = 'k3d') {
|
|
25
|
+
const useExisting = {
|
|
26
|
+
id: 'use-existing',
|
|
27
|
+
label: d.clusterContext
|
|
28
|
+
? `Use the existing cluster (context: ${d.clusterContext})`
|
|
29
|
+
: 'Use the existing reachable cluster',
|
|
30
|
+
available: d.reachableCluster,
|
|
31
|
+
recommended: false,
|
|
32
|
+
reason: d.reachableCluster ? undefined : 'No cluster is reachable via your kubeconfig',
|
|
33
|
+
};
|
|
34
|
+
const dockerReason = !d.docker.installed
|
|
35
|
+
? 'Docker is not installed'
|
|
36
|
+
: !d.docker.running
|
|
37
|
+
? 'Docker is not running'
|
|
38
|
+
: undefined;
|
|
39
|
+
const createK3d = {
|
|
40
|
+
id: 'create-k3d',
|
|
41
|
+
label: 'Create a local k3d cluster (Docker, no root)',
|
|
42
|
+
available: d.docker.running && d.k3d.installed,
|
|
43
|
+
recommended: false,
|
|
44
|
+
reason: dockerReason ?? (!d.k3d.installed ? 'k3d is not installed (https://k3d.io)' : undefined),
|
|
45
|
+
};
|
|
46
|
+
const createKind = {
|
|
47
|
+
id: 'create-kind',
|
|
48
|
+
label: 'Create a local kind cluster (Docker, no root)',
|
|
49
|
+
available: d.docker.running && d.kind.installed,
|
|
50
|
+
recommended: false,
|
|
51
|
+
reason: dockerReason ??
|
|
52
|
+
(!d.kind.installed ? 'kind is not installed (https://kind.sigs.k8s.io)' : undefined),
|
|
53
|
+
};
|
|
54
|
+
// The guided k3s path is always available: when k3s is already installed it only points the user
|
|
55
|
+
// at starting the service; otherwise it PRINTS the install command (needs sudo). Never auto-runs.
|
|
56
|
+
const installK3s = {
|
|
57
|
+
id: 'install-k3s',
|
|
58
|
+
label: d.k3s.installed
|
|
59
|
+
? 'Start your already-installed k3s (needs sudo — not run for you)'
|
|
60
|
+
: 'Show the k3s install command (needs sudo — not run for you)',
|
|
61
|
+
available: true,
|
|
62
|
+
recommended: false,
|
|
63
|
+
};
|
|
64
|
+
const offers = [useExisting, createK3d, createKind, installK3s];
|
|
65
|
+
const recommended = offerPriority(preferred).find((id) => offers.find((o) => o.id === id)?.available) ??
|
|
66
|
+
'install-k3s';
|
|
67
|
+
for (const o of offers)
|
|
68
|
+
o.recommended = o.id === recommended;
|
|
69
|
+
return { detections: d, offers, recommended };
|
|
70
|
+
}
|
|
71
|
+
/** True when a `run` result indicates the binary exists (it ran, even if the subcommand failed). */
|
|
72
|
+
function isInstalled(code) {
|
|
73
|
+
return code !== COMMAND_NOT_FOUND;
|
|
74
|
+
}
|
|
75
|
+
/** First non-empty trimmed line of a command's stdout (used for `--version` style output). */
|
|
76
|
+
function firstLine(stdout) {
|
|
77
|
+
const line = stdout
|
|
78
|
+
.split('\n')
|
|
79
|
+
.map((l) => l.trim())
|
|
80
|
+
.find((l) => l.length > 0);
|
|
81
|
+
return line && line.length > 0 ? line : undefined;
|
|
82
|
+
}
|
|
83
|
+
/** Parse `k3d cluster list --output json` (an array of `{ name }`) into cluster names. */
|
|
84
|
+
export function parseK3dClusters(stdout) {
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(stdout);
|
|
87
|
+
if (!Array.isArray(parsed))
|
|
88
|
+
return [];
|
|
89
|
+
return parsed
|
|
90
|
+
.map((c) => typeof c === 'object' && c !== null ? c.name : undefined)
|
|
91
|
+
.filter((n) => typeof n === 'string' && n.length > 0);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Parse `kind get clusters` (newline-separated names; a "No kind clusters" note ⇒ empty). */
|
|
98
|
+
export function parseKindClusters(stdout) {
|
|
99
|
+
return stdout
|
|
100
|
+
.split('\n')
|
|
101
|
+
.map((l) => l.trim())
|
|
102
|
+
.filter((l) => l.length > 0 && !l.toLowerCase().startsWith('no kind clusters'));
|
|
103
|
+
}
|
|
104
|
+
/** Detect whether a `kubectl version --output=json` payload reports a reachable apiserver. */
|
|
105
|
+
export function hasServerVersion(stdout) {
|
|
106
|
+
try {
|
|
107
|
+
const parsed = JSON.parse(stdout);
|
|
108
|
+
return typeof parsed.serverVersion === 'object' && parsed.serverVersion !== null;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Probe the host over the {@link HostShell} seam and classify it for the `preferred` runtime. Runs
|
|
116
|
+
* each tool's detection command, treats {@link COMMAND_NOT_FOUND} as "not installed", and folds the
|
|
117
|
+
* results through the pure {@link classifyHost}. Tested with a scripted fake shell.
|
|
118
|
+
*
|
|
119
|
+
* `kubectl version` / `config current-context` contact the apiserver, so they carry an explicit
|
|
120
|
+
* `--request-timeout` — a kubeconfig pointing at a down cluster then fails fast instead of hanging
|
|
121
|
+
* the probe (the {@link HostShell} watchdog is the outer backstop).
|
|
122
|
+
*/
|
|
123
|
+
export async function probeHost(shell, preferred = 'k3d') {
|
|
124
|
+
const [kubectlVersion, kubectlContext, k3dVersion, k3dList, kindVersion, kindList, k3sVersion, dockerVersion,] = await Promise.all([
|
|
125
|
+
shell.run('kubectl', ['version', '--output=json', '--request-timeout=3s']),
|
|
126
|
+
shell.run('kubectl', ['config', 'current-context']),
|
|
127
|
+
shell.run('k3d', ['version']),
|
|
128
|
+
shell.run('k3d', ['cluster', 'list', '--output', 'json']),
|
|
129
|
+
shell.run('kind', ['version']),
|
|
130
|
+
shell.run('kind', ['get', 'clusters']),
|
|
131
|
+
shell.run('k3s', ['--version']),
|
|
132
|
+
shell.run('docker', ['version', '--format', '{{.Server.Version}}']),
|
|
133
|
+
]);
|
|
134
|
+
const context = kubectlContext.code === 0 ? firstLine(kubectlContext.stdout) : undefined;
|
|
135
|
+
const detections = {
|
|
136
|
+
kubectl: {
|
|
137
|
+
installed: isInstalled(kubectlVersion.code),
|
|
138
|
+
version: firstLine(kubectlVersion.stdout),
|
|
139
|
+
},
|
|
140
|
+
k3d: { installed: isInstalled(k3dVersion.code), version: firstLine(k3dVersion.stdout) },
|
|
141
|
+
kind: { installed: isInstalled(kindVersion.code), version: firstLine(kindVersion.stdout) },
|
|
142
|
+
k3s: { installed: isInstalled(k3sVersion.code), version: firstLine(k3sVersion.stdout) },
|
|
143
|
+
docker: {
|
|
144
|
+
installed: isInstalled(dockerVersion.code),
|
|
145
|
+
running: dockerVersion.code === 0 && firstLine(dockerVersion.stdout) !== undefined,
|
|
146
|
+
},
|
|
147
|
+
reachableCluster: kubectlVersion.code === 0 && hasServerVersion(kubectlVersion.stdout),
|
|
148
|
+
clusterContext: context,
|
|
149
|
+
k3dClusters: k3dList.code === 0 ? parseK3dClusters(k3dList.stdout) : [],
|
|
150
|
+
kindClusters: kindList.code === 0 ? parseKindClusters(kindList.stdout) : [],
|
|
151
|
+
};
|
|
152
|
+
return classifyHost(detections, preferred);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=k3s-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k3s-probe.js","sourceRoot":"","sources":["../src/k3s-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAkB,MAAM,iBAAiB,CAAA;AAgDnE;;;;GAIG;AACH,SAAS,aAAa,CAAC,SAAqB;IAC1C,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;QACrE,KAAK,KAAK;YACR,2FAA2F;YAC3F,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;QACrE;YACE,OAAO,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;IACvE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAiB,EAAE,SAAS,GAAe,KAAK;IAC3E,MAAM,WAAW,GAAU;QACzB,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,CAAC,CAAC,cAAc;YACrB,CAAC,CAAC,sCAAsC,CAAC,CAAC,cAAc,GAAG;YAC3D,CAAC,CAAC,oCAAoC;QACxC,SAAS,EAAE,CAAC,CAAC,gBAAgB;QAC7B,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6CAA6C;KACvF,CAAA;IAED,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;QACtC,CAAC,CAAC,yBAAyB;QAC3B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;YACjB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,SAAS,GAAU;QACvB,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,8CAA8C;QACrD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS;QAC9C,WAAW,EAAE,KAAK;QAClB,MAAM,EACJ,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC3F,CAAA;IAED,MAAM,UAAU,GAAU;QACxB,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,+CAA+C;QACtD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS;QAC/C,WAAW,EAAE,KAAK;QAClB,MAAM,EACJ,YAAY;YACZ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,SAAS,CAAC;KACvF,CAAA;IAED,iGAAiG;IACjG,kGAAkG;IAClG,MAAM,UAAU,GAAU;QACxB,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS;YACpB,CAAC,CAAC,iEAAiE;YACnE,CAAC,CAAC,6DAA6D;QACjE,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,KAAK;KACnB,CAAA;IAED,MAAM,MAAM,GAAY,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;IACxE,MAAM,WAAW,GACf,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;QACjF,aAAa,CAAA;IACf,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,KAAK,WAAW,CAAA;IAE5D,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AAC/C,CAAC;AAED,oGAAoG;AACpG,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,KAAK,iBAAiB,CAAA;AACnC,CAAC;AAED,8FAA8F;AAC9F,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,IAAI,GAAG,MAAM;SAChB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC5B,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AACnD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAA;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAA;QACrC,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAE,CAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CACjF;aACA,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAA;AACnF,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAgC,CAAA;QAChE,OAAO,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,CAAA;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAgB,EAChB,SAAS,GAAe,KAAK;IAE7B,MAAM,CACJ,cAAc,EACd,cAAc,EACd,UAAU,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EACR,UAAU,EACV,aAAa,EACd,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAC;QAC1E,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACzD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;KACpE,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAExF,MAAM,UAAU,GAAmB;QACjC,OAAO,EAAE;YACP,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC;YAC3C,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC;SAC1C;QACD,GAAG,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACvF,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;QAC1F,GAAG,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACvF,MAAM,EAAE;YACN,SAAS,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1C,OAAO,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,SAAS;SACnF;QACD,gBAAgB,EAAE,cAAc,CAAC,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC;QACtF,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACvE,YAAY,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;KAC5E,CAAA;IAED,OAAO,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;AAC5C,CAAC"}
|
package/dist/k3s.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CliOptions } from './args.js';
|
|
2
|
+
import { type HostShell } from './host-shell.js';
|
|
3
|
+
import { type Io } from './io.js';
|
|
4
|
+
import { type HostState, type OfferId } from './k3s-probe.js';
|
|
5
|
+
/** The k3s command's injectable dependencies (defaults to the real console IO + host shell). */
|
|
6
|
+
export interface K3sDeps {
|
|
7
|
+
io?: Io;
|
|
8
|
+
shell?: HostShell;
|
|
9
|
+
}
|
|
10
|
+
/** What {@link setupK3s} resolves to (returned for tests + programmatic callers). */
|
|
11
|
+
export interface K3sResult {
|
|
12
|
+
state: HostState;
|
|
13
|
+
chosen: OfferId;
|
|
14
|
+
}
|
|
15
|
+
/** The one-liner k3s install command (needs sudo — printed, never run for the user). */
|
|
16
|
+
export declare const K3S_INSTALL_COMMAND = "curl -sfL https://get.k3s.io | sh -";
|
|
17
|
+
/**
|
|
18
|
+
* `cat-factory k3s` — guided local-cluster setup (slice 1: probe + report + offer).
|
|
19
|
+
*
|
|
20
|
+
* Probes the host over the {@link HostShell} seam, reports what was found, and lets the user pick
|
|
21
|
+
* a setup path. Provisioning + handler wiring land in later slices; this slice stops at the choice
|
|
22
|
+
* and prints the appropriate guidance. `@clack/prompts` is reached only through {@link Io}.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setupK3s(options: CliOptions, deps?: K3sDeps): Promise<K3sResult>;
|
|
25
|
+
//# sourceMappingURL=k3s.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k3s.d.ts","sourceRoot":"","sources":["../src/k3s.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAmB,KAAK,EAAE,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,KAAK,SAAS,EAAc,KAAK,OAAO,EAAa,MAAM,gBAAgB,CAAA;AAEpF,gGAAgG;AAChG,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,EAAE,CAAA;IACP,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,qFAAqF;AACrF,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,wCAAwC,CAAA;AAExE;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE,OAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAgB1F"}
|
package/dist/k3s.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { OPTION_DEFAULTS } from './args.js';
|
|
2
|
+
import { createNodeShell } from './host-shell.js';
|
|
3
|
+
import { createConsoleIo } from './io.js';
|
|
4
|
+
import { probeHost } from './k3s-probe.js';
|
|
5
|
+
/** The one-liner k3s install command (needs sudo — printed, never run for the user). */
|
|
6
|
+
export const K3S_INSTALL_COMMAND = 'curl -sfL https://get.k3s.io | sh -';
|
|
7
|
+
/**
|
|
8
|
+
* `cat-factory k3s` — guided local-cluster setup (slice 1: probe + report + offer).
|
|
9
|
+
*
|
|
10
|
+
* Probes the host over the {@link HostShell} seam, reports what was found, and lets the user pick
|
|
11
|
+
* a setup path. Provisioning + handler wiring land in later slices; this slice stops at the choice
|
|
12
|
+
* and prints the appropriate guidance. `@clack/prompts` is reached only through {@link Io}.
|
|
13
|
+
*/
|
|
14
|
+
export async function setupK3s(options, deps = {}) {
|
|
15
|
+
const io = deps.io ?? createConsoleIo();
|
|
16
|
+
const shell = deps.shell ?? createNodeShell();
|
|
17
|
+
const preferred = options.k3sRuntime ?? OPTION_DEFAULTS.k3sRuntime;
|
|
18
|
+
io.info('\ncat-factory — guided local k3s / k3d setup\n');
|
|
19
|
+
io.info('Probing your machine for a usable Kubernetes cluster…');
|
|
20
|
+
const state = await probeHost(shell, preferred);
|
|
21
|
+
io.info(renderReport(state));
|
|
22
|
+
const chosen = await chooseOffer(state, options, io);
|
|
23
|
+
printGuidance(chosen, state, options, io);
|
|
24
|
+
return { state, chosen };
|
|
25
|
+
}
|
|
26
|
+
/** Render the human-readable findings report from the classified host state. */
|
|
27
|
+
function renderReport(state) {
|
|
28
|
+
const d = state.detections;
|
|
29
|
+
const tool = (name, t) => ` ${t.installed ? '✓' : '·'} ${name}${t.installed && t.version ? ` (${t.version})` : t.installed ? '' : ' — not found'}`;
|
|
30
|
+
const lines = [
|
|
31
|
+
'',
|
|
32
|
+
'Detected:',
|
|
33
|
+
tool('kubectl', d.kubectl),
|
|
34
|
+
tool('k3d', d.k3d),
|
|
35
|
+
tool('kind', d.kind),
|
|
36
|
+
tool('k3s', d.k3s),
|
|
37
|
+
` ${d.docker.running ? '✓' : '·'} docker${d.docker.running
|
|
38
|
+
? ' (running)'
|
|
39
|
+
: d.docker.installed
|
|
40
|
+
? ' — installed but not running'
|
|
41
|
+
: ' — not found'}`,
|
|
42
|
+
d.reachableCluster
|
|
43
|
+
? ` ✓ reachable cluster${d.clusterContext ? ` (context: ${d.clusterContext})` : ''}`
|
|
44
|
+
: ' · no reachable cluster via your kubeconfig',
|
|
45
|
+
];
|
|
46
|
+
if (d.k3dClusters.length > 0)
|
|
47
|
+
lines.push(` • existing k3d clusters: ${d.k3dClusters.join(', ')}`);
|
|
48
|
+
if (d.kindClusters.length > 0)
|
|
49
|
+
lines.push(` • existing kind clusters: ${d.kindClusters.join(', ')}`);
|
|
50
|
+
return lines.join('\n');
|
|
51
|
+
}
|
|
52
|
+
/** Pick an offer: `--yes` takes the recommendation; otherwise prompt over the available offers. */
|
|
53
|
+
async function chooseOffer(state, options, io) {
|
|
54
|
+
const available = state.offers.filter((o) => o.available);
|
|
55
|
+
// `install-k3s` is always available, so `available` is never empty.
|
|
56
|
+
if (options.yes || available.length === 1)
|
|
57
|
+
return state.recommended;
|
|
58
|
+
// Surface why an unavailable path is off, so the choice is informed.
|
|
59
|
+
for (const o of state.offers) {
|
|
60
|
+
if (!o.available && o.reason)
|
|
61
|
+
io.info(` (unavailable: ${o.label} — ${o.reason})`);
|
|
62
|
+
}
|
|
63
|
+
return io.select('How would you like to set up the cluster?', available.map((o) => ({ value: o.id, label: offerLabel(o) })), state.recommended);
|
|
64
|
+
}
|
|
65
|
+
/** Label an offer for the menu, tagging the recommended one. */
|
|
66
|
+
function offerLabel(o) {
|
|
67
|
+
return o.recommended ? `${o.label} (recommended)` : o.label;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Print the guidance for the chosen path. The k3s command is only ever PRINTED (it needs sudo). The
|
|
71
|
+
* k3d/kind / existing-cluster paths summarize what the follow-up slice will do — this slice
|
|
72
|
+
* intentionally stops before mutating the host.
|
|
73
|
+
*/
|
|
74
|
+
function printGuidance(chosen, state, options, io) {
|
|
75
|
+
if (chosen === 'install-k3s') {
|
|
76
|
+
// Don't tell a user who already has k3s to re-install it — point them at starting the service.
|
|
77
|
+
io.info(state.detections.k3s.installed
|
|
78
|
+
? [
|
|
79
|
+
'',
|
|
80
|
+
'k3s is already installed. Start it (needs sudo), e.g.:',
|
|
81
|
+
'',
|
|
82
|
+
' sudo systemctl start k3s # or: sudo k3s server',
|
|
83
|
+
'',
|
|
84
|
+
'Then re-run `cat-factory k3s` — it will detect the running cluster and offer to wire it.',
|
|
85
|
+
].join('\n')
|
|
86
|
+
: [
|
|
87
|
+
'',
|
|
88
|
+
'Install k3s (single-node) — run this yourself (needs sudo):',
|
|
89
|
+
'',
|
|
90
|
+
` ${K3S_INSTALL_COMMAND}`,
|
|
91
|
+
'',
|
|
92
|
+
'Then re-run `cat-factory k3s` — it will detect the new cluster and offer to wire it.',
|
|
93
|
+
].join('\n'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (chosen === 'use-existing') {
|
|
97
|
+
io.info([
|
|
98
|
+
'',
|
|
99
|
+
`Selected: reuse the existing cluster${state.detections.clusterContext ? ` (context: ${state.detections.clusterContext})` : ''}.`,
|
|
100
|
+
'',
|
|
101
|
+
'Next (coming in the follow-up step): cat-factory will',
|
|
102
|
+
' - read the apiserver URL from your kubeconfig',
|
|
103
|
+
' - create a least-privilege ServiceAccount + RBAC and mint a token',
|
|
104
|
+
' - hand the values to the Settings → Infrastructure → Local k3s form to Test + Save',
|
|
105
|
+
'',
|
|
106
|
+
'Provisioning is not performed in this release — nothing was changed on your host.',
|
|
107
|
+
].join('\n'));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// create-k3d | create-kind
|
|
111
|
+
const distro = chosen === 'create-kind' ? 'kind' : 'k3d';
|
|
112
|
+
const clusterName = options.clusterName ?? OPTION_DEFAULTS.k3sClusterName;
|
|
113
|
+
const existing = chosen === 'create-kind' ? state.detections.kindClusters : state.detections.k3dClusters;
|
|
114
|
+
const collision = existing.includes(clusterName);
|
|
115
|
+
io.info([
|
|
116
|
+
'',
|
|
117
|
+
`Selected: create a local ${distro} cluster "${clusterName}".`,
|
|
118
|
+
// A cluster of that name already exists — the follow-up provisioner is idempotent (it reuses
|
|
119
|
+
// rather than duplicates), so flag it now instead of surprising the user in the next slice.
|
|
120
|
+
...(collision
|
|
121
|
+
? [` ! a ${distro} cluster named "${clusterName}" already exists — it will be reused.`]
|
|
122
|
+
: []),
|
|
123
|
+
'',
|
|
124
|
+
'Next (coming in the follow-up step): cat-factory will',
|
|
125
|
+
` - create the ${distro} cluster and read its apiserver URL`,
|
|
126
|
+
' - create a least-privilege ServiceAccount + RBAC and mint a token',
|
|
127
|
+
' - hand the values to the Settings → Infrastructure → Local k3s form to Test + Save',
|
|
128
|
+
'',
|
|
129
|
+
'Provisioning is not performed in this release — nothing was changed on your host.',
|
|
130
|
+
].join('\n'));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=k3s.js.map
|
package/dist/k3s.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k3s.js","sourceRoot":"","sources":["../src/k3s.ts"],"names":[],"mappings":"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"}
|
package/dist/plan.js
CHANGED
|
@@ -123,6 +123,12 @@ npm run dev # Nuxt dev server on http://localhost:3000
|
|
|
123
123
|
Open http://localhost:3000. \`NUXT_PUBLIC_API_BASE\` (in \`frontend/.env\`) points at
|
|
124
124
|
\`${input.apiBase}\`.
|
|
125
125
|
|
|
126
|
+
Local mode requires sign-in (per-user credentials can't be stored anonymously). Because
|
|
127
|
+
\`${tokenVar}\` is set, the login screen offers **"Sign in with configured ${label} PAT"** —
|
|
128
|
+
click it and the token's ${label} account becomes your signed-in identity (chosen once, it
|
|
129
|
+
persists across refreshes and restarts). The token stays on the server; it is never shown in
|
|
130
|
+
the browser.
|
|
131
|
+
|
|
126
132
|
## Rotating the ${label} token
|
|
127
133
|
|
|
128
134
|
The token in \`local/.env\` (\`${tokenVar}\`) was minted at this URL with the right scopes
|
package/dist/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAA;AA4BrF,0FAA0F;AAC1F,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAChE,MAAM,SAAS,GACb,KAAK,CAAC,iBAAiB,KAAK,SAAS;QACnC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACzC,CAAC,CAAC,cAAc,EAAE,CAAA;IAEtB,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE;QAC1C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE;QAEpD,sBAAsB;QACtB,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QAC5E,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE;QACnD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QAC/E,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,EAAE;QACtD;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,eAAe,CAAC;gBACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC;SACH;QACD,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAEvD,gBAAgB;QAChB,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QAClF,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QAChF,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QACpF,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QAC7E,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;KAC9D,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,OAAyB;IAChD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO;;;;CAIV,CAAA;IACC,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO;;;;CAIV,CAAA;IACC,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,aAAa,CAAC,KAAqB;IAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC1C,OAAO,KAAK,KAAK,CAAC,QAAQ;;;;;;gFAMoD,KAAK;;;;;IAKjF,KAAK,aAAa,QAAQ;;;;;;;;;;gBAUd,KAAK,CAAC,YAAY;;;;;;;;;;;;;;mDAciB,KAAK,CAAC,IAAI;;EAE3D,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC;;;;;;;;;;;;;IAarC,KAAK,CAAC,OAAO;;;IAGb,QAAQ,iEAAiE,KAAK;2BACvD,KAAK;;;;kBAId,KAAK;;iCAEU,QAAQ;;;MAGnC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;;;;;;;IAOhC,QAAQ;;;;CAIX,CAAA;AACD,CAAC"}
|
package/dist/templates.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const LOCAL_SERVER_VERSION = "^0.
|
|
2
|
-
export declare const APP_VERSION = "^0.
|
|
1
|
+
export declare const LOCAL_SERVER_VERSION = "^0.33.0";
|
|
2
|
+
export declare const APP_VERSION = "^0.63.1";
|
|
3
3
|
export declare const NUXT_VERSION = "^4.4.8";
|
|
4
4
|
export declare const TYPES_NODE_VERSION = "^26.0.1";
|
|
5
5
|
export declare const TYPESCRIPT_VERSION = "7.0.1-rc";
|
package/dist/templates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAC7C,eAAO,MAAM,WAAW,YAAY,CAAA;AACpC,eAAO,MAAM,YAAY,WAAW,CAAA;AACpC,eAAO,MAAM,kBAAkB,YAAY,CAAA;AAC3C,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAC5C,eAAO,MAAM,gBAAgB,aAAa,CAAA;AAE1C,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,kDAAkD,CAAA;AAEpF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAC9F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAElE,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,KAAG,MA6BhD,CAAA;AAEP,eAAO,MAAM,WAAW,otBAcvB,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAuC7C,CAAA;AAED,+FAA+F;AAC/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,eAAe,WAAW,oBAAoB,KAAQ,MAmClE,CAAA;AAED,eAAO,MAAM,mBAAmB,gBAAiB,MAAM,KAAG,MA4BnD,CAAA;AAEP,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,MAalD,CAAA;AAED,eAAO,MAAM,oBAAoB,gBAAiB,MAAM,KAAG,MAS1D,CAAA;AAED,eAAO,MAAM,kBAAkB,wBAAwC,MAItE,CAAA;AAED,eAAO,MAAM,YAAY,sNAUxB,CAAA"}
|
package/dist/templates.js
CHANGED
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
// `deploy/frontend` in this repo, but depend on the PUBLISHED libraries (not `workspace:*`) so
|
|
3
3
|
// the generated project works standalone outside the monorepo.
|
|
4
4
|
// Pinned library versions the scaffolded project depends on. Pinned (not the `latest` dist-tag)
|
|
5
|
-
// so a scaffold is reproducible and the backend/frontend can't resolve to skewed releases
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
// so a scaffold is reproducible and the backend/frontend can't resolve to skewed releases. These
|
|
6
|
+
// are `0.x` libraries, so the caret only picks up in-range PATCH releases (`^0.33.0` allows
|
|
7
|
+
// `0.33.x` but NOT `0.34.0`) — every minor bump of a library needs a manual refresh here. Keep
|
|
8
|
+
// the caret covering the current published versions of `@cat-factory/local-server` and
|
|
9
|
+
// `@cat-factory/app`; `templates.pins.test.ts` fails the build if a pin drifts out of range of the
|
|
10
|
+
// workspace version. Bump these when cutting a CLI release against newer libraries. (The two
|
|
11
|
+
// libraries version independently.)
|
|
12
|
+
export const LOCAL_SERVER_VERSION = '^0.33.0';
|
|
13
|
+
export const APP_VERSION = '^0.63.1';
|
|
10
14
|
export const NUXT_VERSION = '^4.4.8';
|
|
11
15
|
export const TYPES_NODE_VERSION = '^26.0.1';
|
|
12
16
|
export const TYPESCRIPT_VERSION = '7.0.1-rc';
|
package/dist/templates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,+FAA+F;AAC/F,+DAA+D;AAE/D,gGAAgG;AAChG,+FAA+F;AAC/F,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Bootstrap CLI for the Agent Architecture Board: scaffold a local-mode deployment (Node/local backend + frontend SPA) on your own machine — generates the crypto secrets, populates and gitignores the .env files, and mints a GitHub/GitLab personal access token by opening the browser at the right pre-scoped URL.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bootstrap",
|