@the-librarian/cli 1.0.0-rc.21

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.
Files changed (155) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +94 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +15 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/commands/install.d.ts +28 -0
  8. package/dist/commands/install.d.ts.map +1 -0
  9. package/dist/commands/install.js +204 -0
  10. package/dist/commands/install.js.map +1 -0
  11. package/dist/commands/shared.d.ts +16 -0
  12. package/dist/commands/shared.d.ts.map +1 -0
  13. package/dist/commands/shared.js +30 -0
  14. package/dist/commands/shared.js.map +1 -0
  15. package/dist/commands/uninstall.d.ts +18 -0
  16. package/dist/commands/uninstall.d.ts.map +1 -0
  17. package/dist/commands/uninstall.js +67 -0
  18. package/dist/commands/uninstall.js.map +1 -0
  19. package/dist/commands/update.d.ts +21 -0
  20. package/dist/commands/update.d.ts.map +1 -0
  21. package/dist/commands/update.js +75 -0
  22. package/dist/commands/update.js.map +1 -0
  23. package/dist/config.d.ts +40 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +65 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/doctor.d.ts +23 -0
  28. package/dist/doctor.d.ts.map +1 -0
  29. package/dist/doctor.js +81 -0
  30. package/dist/doctor.js.map +1 -0
  31. package/dist/env.d.ts +39 -0
  32. package/dist/env.d.ts.map +1 -0
  33. package/dist/env.js +208 -0
  34. package/dist/env.js.map +1 -0
  35. package/dist/exec.d.ts +37 -0
  36. package/dist/exec.d.ts.map +1 -0
  37. package/dist/exec.js +81 -0
  38. package/dist/exec.js.map +1 -0
  39. package/dist/harnesses/claude.d.ts +3 -0
  40. package/dist/harnesses/claude.d.ts.map +1 -0
  41. package/dist/harnesses/claude.js +88 -0
  42. package/dist/harnesses/claude.js.map +1 -0
  43. package/dist/harnesses/cli.d.ts +4 -0
  44. package/dist/harnesses/cli.d.ts.map +1 -0
  45. package/dist/harnesses/cli.js +16 -0
  46. package/dist/harnesses/cli.js.map +1 -0
  47. package/dist/harnesses/codex.d.ts +3 -0
  48. package/dist/harnesses/codex.d.ts.map +1 -0
  49. package/dist/harnesses/codex.js +183 -0
  50. package/dist/harnesses/codex.js.map +1 -0
  51. package/dist/harnesses/hermes.d.ts +16 -0
  52. package/dist/harnesses/hermes.d.ts.map +1 -0
  53. package/dist/harnesses/hermes.js +158 -0
  54. package/dist/harnesses/hermes.js.map +1 -0
  55. package/dist/harnesses/index.d.ts +12 -0
  56. package/dist/harnesses/index.d.ts.map +1 -0
  57. package/dist/harnesses/index.js +29 -0
  58. package/dist/harnesses/index.js.map +1 -0
  59. package/dist/harnesses/opencode.d.ts +3 -0
  60. package/dist/harnesses/opencode.d.ts.map +1 -0
  61. package/dist/harnesses/opencode.js +141 -0
  62. package/dist/harnesses/opencode.js.map +1 -0
  63. package/dist/harnesses/pi.d.ts +3 -0
  64. package/dist/harnesses/pi.d.ts.map +1 -0
  65. package/dist/harnesses/pi.js +72 -0
  66. package/dist/harnesses/pi.js.map +1 -0
  67. package/dist/harnesses/types.d.ts +48 -0
  68. package/dist/harnesses/types.d.ts.map +1 -0
  69. package/dist/harnesses/types.js +22 -0
  70. package/dist/harnesses/types.js.map +1 -0
  71. package/dist/index.d.ts +11 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +15 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/machine.d.ts +10 -0
  76. package/dist/machine.d.ts.map +1 -0
  77. package/dist/machine.js +39 -0
  78. package/dist/machine.js.map +1 -0
  79. package/dist/parse-args.d.ts +12 -0
  80. package/dist/parse-args.d.ts.map +1 -0
  81. package/dist/parse-args.js +54 -0
  82. package/dist/parse-args.js.map +1 -0
  83. package/dist/paths.d.ts +32 -0
  84. package/dist/paths.d.ts.map +1 -0
  85. package/dist/paths.js +75 -0
  86. package/dist/paths.js.map +1 -0
  87. package/dist/prompt.d.ts +53 -0
  88. package/dist/prompt.d.ts.map +1 -0
  89. package/dist/prompt.js +165 -0
  90. package/dist/prompt.js.map +1 -0
  91. package/dist/runtime.d.ts +45 -0
  92. package/dist/runtime.d.ts.map +1 -0
  93. package/dist/runtime.js +370 -0
  94. package/dist/runtime.js.map +1 -0
  95. package/dist/semver.d.ts +13 -0
  96. package/dist/semver.d.ts.map +1 -0
  97. package/dist/semver.js +98 -0
  98. package/dist/semver.js.map +1 -0
  99. package/dist/server/admin.d.ts +31 -0
  100. package/dist/server/admin.d.ts.map +1 -0
  101. package/dist/server/admin.js +110 -0
  102. package/dist/server/admin.js.map +1 -0
  103. package/dist/server/boot.d.ts +51 -0
  104. package/dist/server/boot.d.ts.map +1 -0
  105. package/dist/server/boot.js +233 -0
  106. package/dist/server/boot.js.map +1 -0
  107. package/dist/server/deploy-state.d.ts +33 -0
  108. package/dist/server/deploy-state.d.ts.map +1 -0
  109. package/dist/server/deploy-state.js +79 -0
  110. package/dist/server/deploy-state.js.map +1 -0
  111. package/dist/server/docker.d.ts +37 -0
  112. package/dist/server/docker.d.ts.map +1 -0
  113. package/dist/server/docker.js +138 -0
  114. package/dist/server/docker.js.map +1 -0
  115. package/dist/server/down.d.ts +19 -0
  116. package/dist/server/down.d.ts.map +1 -0
  117. package/dist/server/down.js +62 -0
  118. package/dist/server/down.js.map +1 -0
  119. package/dist/server/index.d.ts +8 -0
  120. package/dist/server/index.d.ts.map +1 -0
  121. package/dist/server/index.js +48 -0
  122. package/dist/server/index.js.map +1 -0
  123. package/dist/server/logs.d.ts +50 -0
  124. package/dist/server/logs.d.ts.map +1 -0
  125. package/dist/server/logs.js +162 -0
  126. package/dist/server/logs.js.map +1 -0
  127. package/dist/server/preflight.d.ts +24 -0
  128. package/dist/server/preflight.d.ts.map +1 -0
  129. package/dist/server/preflight.js +58 -0
  130. package/dist/server/preflight.js.map +1 -0
  131. package/dist/server/redact.d.ts +2 -0
  132. package/dist/server/redact.d.ts.map +1 -0
  133. package/dist/server/redact.js +26 -0
  134. package/dist/server/redact.js.map +1 -0
  135. package/dist/server/status.d.ts +20 -0
  136. package/dist/server/status.d.ts.map +1 -0
  137. package/dist/server/status.js +103 -0
  138. package/dist/server/status.js.map +1 -0
  139. package/dist/server/up.d.ts +211 -0
  140. package/dist/server/up.d.ts.map +1 -0
  141. package/dist/server/up.js +625 -0
  142. package/dist/server/up.js.map +1 -0
  143. package/dist/server/update.d.ts +35 -0
  144. package/dist/server/update.d.ts.map +1 -0
  145. package/dist/server/update.js +308 -0
  146. package/dist/server/update.js.map +1 -0
  147. package/dist/status.d.ts +18 -0
  148. package/dist/status.d.ts.map +1 -0
  149. package/dist/status.js +113 -0
  150. package/dist/status.js.map +1 -0
  151. package/dist/version.d.ts +2 -0
  152. package/dist/version.d.ts.map +1 -0
  153. package/dist/version.js +20 -0
  154. package/dist/version.js.map +1 -0
  155. package/package.json +36 -0
package/dist/prompt.js ADDED
@@ -0,0 +1,165 @@
1
+ // A tiny `node:readline`-based prompt layer, injectable for tests.
2
+ //
3
+ // Two surfaces:
4
+ // - `selectHarnesses(available)` — a numbered multi-select; the user types
5
+ // numbers (`1 3`), `all`, or `none`.
6
+ // - `promptText(question, opts)` — a single line; `secret` suppresses the
7
+ // echo (for the token).
8
+ //
9
+ // EVERYTHING is injectable so tests never touch a real TTY or stdin:
10
+ // - pass a `prompt` fn to answer questions deterministically, OR
11
+ // - pass `input`/`output` streams the readline reads from / writes to.
12
+ // Non-interactive (no TTY, no injected prompt) NEVER hangs: `selectHarnesses`
13
+ // falls back to "everything available", and `promptText` returns the default
14
+ // (or throws a clear error when a required value has no default).
15
+ import readline from "node:readline";
16
+ /** A clear, typed error thrown when a required value can't be obtained. */
17
+ export class MissingValueError extends Error {
18
+ constructor(what) {
19
+ super(`${what} is required but no value was provided (non-interactive run).`);
20
+ this.name = "MissingValueError";
21
+ }
22
+ }
23
+ /** Build a Prompter over the given options (defaults to the real stdio). */
24
+ export function createPrompter(options = {}) {
25
+ const input = options.input ?? process.stdin;
26
+ const output = options.output ?? process.stdout;
27
+ const interactive = options.interactive ??
28
+ (options.prompt !== undefined ? true : Boolean(input.isTTY));
29
+ // ONE line reader (over ONE readline interface) for this prompter's whole
30
+ // lifetime. Created lazily on the first real prompt — so a non-interactive
31
+ // or injected-`prompt` run never opens stdin — and reused for EVERY question.
32
+ //
33
+ // The old code built a FRESH `createInterface` per question and `rl.close()`d
34
+ // it. Closing the first interface discarded the input buffered past its line,
35
+ // so a second read over a single shared stream (e.g. a piped
36
+ // `librarian install <<EOF`, where both answers arrive in one chunk) never
37
+ // saw its input and the read hung — `resolveConfig` then threw "required".
38
+ // `close()` (called from the command lifecycle) tears the reader down exactly
39
+ // once so the open readline doesn't keep the Node event loop alive.
40
+ let reader;
41
+ const lineReader = () => {
42
+ if (!reader)
43
+ reader = createLineReader(input, output);
44
+ return reader;
45
+ };
46
+ const ask = options.prompt ?? ((question, opts) => lineReader().ask(question, opts.secret));
47
+ return {
48
+ async selectHarnesses(available) {
49
+ if (available.length === 0)
50
+ return [];
51
+ if (!interactive && options.prompt === undefined) {
52
+ // No way to ask — default to every available harness.
53
+ return available.map((h) => h.id);
54
+ }
55
+ write(output, "Select harnesses to install:\n");
56
+ available.forEach((h, i) => write(output, ` ${i + 1}) ${h.label}\n`));
57
+ write(output, "Enter numbers (e.g. 1 3), 'all', or 'none' [all]: ");
58
+ const answer = (await ask("", { secret: false })).trim();
59
+ return resolveSelection(answer, available);
60
+ },
61
+ async promptText(question, opts = {}) {
62
+ const hasDefault = opts.default !== undefined;
63
+ if (!interactive && options.prompt === undefined) {
64
+ if (hasDefault)
65
+ return opts.default;
66
+ throw new MissingValueError(question);
67
+ }
68
+ const hint = hasDefault && !opts.secret ? ` [${opts.default}]` : "";
69
+ const raw = (await ask(`${question}${hint}: `, { secret: Boolean(opts.secret) })).trim();
70
+ if (raw.length === 0 && hasDefault)
71
+ return opts.default;
72
+ if (raw.length === 0 && !hasDefault)
73
+ throw new MissingValueError(question);
74
+ return raw;
75
+ },
76
+ close() {
77
+ // Idempotent: only the shared reader (if one was ever opened) is torn
78
+ // down. An open readline keeps the Node event loop alive, so the command
79
+ // lifecycle MUST call this once prompting is done or the process hangs.
80
+ if (reader) {
81
+ reader.close();
82
+ reader = undefined;
83
+ }
84
+ },
85
+ };
86
+ }
87
+ /** Map a multi-select answer string to the chosen harness ids. */
88
+ export function resolveSelection(answer, available) {
89
+ const normalized = answer.trim().toLowerCase();
90
+ if (normalized === "" || normalized === "all")
91
+ return available.map((h) => h.id);
92
+ if (normalized === "none")
93
+ return [];
94
+ const picked = new Set();
95
+ for (const token of normalized.split(/[\s,]+/).filter(Boolean)) {
96
+ const n = Number.parseInt(token, 10);
97
+ if (Number.isInteger(n) && n >= 1 && n <= available.length) {
98
+ const choice = available[n - 1];
99
+ if (choice)
100
+ picked.add(choice.id);
101
+ }
102
+ }
103
+ return available.filter((h) => picked.has(h.id)).map((h) => h.id);
104
+ }
105
+ // --- readline plumbing ---------------------------------------------------
106
+ function write(output, text) {
107
+ output.write(text);
108
+ }
109
+ function createLineReader(input, output) {
110
+ const rl = readline.createInterface({ input, output, terminal: true });
111
+ const queue = [];
112
+ let waiting = null;
113
+ rl.on("line", (line) => {
114
+ if (waiting) {
115
+ const resolve = waiting;
116
+ waiting = null;
117
+ resolve(line);
118
+ }
119
+ else {
120
+ queue.push(line);
121
+ }
122
+ });
123
+ // The original echo writer; restored after each secret question so a later
124
+ // non-secret prompt renders normally. Typed to allow `undefined` so the
125
+ // restore assignment is sound under `exactOptionalPropertyTypes`.
126
+ const ref = rl;
127
+ const nextLine = () => new Promise((resolve) => {
128
+ const queued = queue.shift();
129
+ if (queued !== undefined)
130
+ resolve(queued);
131
+ else
132
+ waiting = resolve;
133
+ });
134
+ return {
135
+ async ask(question, secret) {
136
+ if (!secret) {
137
+ if (question)
138
+ write(output, question);
139
+ return nextLine();
140
+ }
141
+ // Mute the echo just for this question: swallow each typed character so
142
+ // the token never renders, passing only newlines through. Restore the
143
+ // original writer afterwards so a following non-secret prompt echoes.
144
+ const original = ref._writeToOutput;
145
+ ref._writeToOutput = (s) => {
146
+ if (s.includes("\n") || s.includes("\r"))
147
+ original?.call(rl, s);
148
+ };
149
+ try {
150
+ if (question)
151
+ write(output, question);
152
+ const line = await nextLine();
153
+ return line;
154
+ }
155
+ finally {
156
+ ref._writeToOutput = original;
157
+ write(output, "\n");
158
+ }
159
+ },
160
+ close() {
161
+ rl.close();
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type Shell } from "./env.js";
2
+ import { type Prompter } from "./prompt.js";
3
+ export interface CliResult {
4
+ stdout: string;
5
+ stderr: string;
6
+ exitCode: number;
7
+ }
8
+ export interface RuntimeOptions {
9
+ /** Override the home dir (tests). Defaults to the real `os.homedir()`. */
10
+ home?: string;
11
+ /** Override the detected shell (tests / `--shell`). */
12
+ shell?: Shell;
13
+ /** Inject a prompter (tests). Defaults to a real stdio-backed prompter. */
14
+ prompter?: Prompter;
15
+ /**
16
+ * The process environment to read existing `LIBRARIAN_*` vars from (BUG 2).
17
+ * Injectable so tests never touch the real `process.env` and never log a
18
+ * token. Defaults to `process.env` in `runInstall`.
19
+ */
20
+ env?: NodeJS.ProcessEnv;
21
+ /**
22
+ * Whether the run is interactive (a TTY is attached). Gates `server up`'s
23
+ * best-effort offers (the Tailscale offer; the `0.0.0.0` confirm). Defaults
24
+ * to `process.stdin.isTTY` — a non-interactive run never silently exposes the
25
+ * server beyond localhost (it keeps `127.0.0.1`). Injectable for tests.
26
+ */
27
+ interactive?: boolean;
28
+ /**
29
+ * The host platform, defaulting to `process.platform`. Threads into the
30
+ * `server` ops that branch on it: preflight's daemon hint and boot
31
+ * persistence (Linux systemd vs the macOS deferred notice). Injectable so the
32
+ * darwin path is testable from a Linux host.
33
+ */
34
+ platform?: NodeJS.Platform;
35
+ }
36
+ /**
37
+ * The CLI entrypoint. Dispatches to the command handlers and — crucially —
38
+ * turns any escaped error into one clean stderr line + exit 1, so a failure
39
+ * never leaks a stack trace into the user's terminal (house rule: "never
40
+ * leak a stack trace"). `MissingValueError` (a required prompt with no value
41
+ * in a non-interactive run) gets a specific, actionable message.
42
+ */
43
+ export declare function runCli(argv: string[], options?: RuntimeOptions): Promise<CliResult>;
44
+ export declare function usage(): string;
45
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAY/E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAID;;;;;;GAMG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAY7F;AAgUD,wBAAgB,KAAK,IAAI,MAAM,CAyB9B"}
@@ -0,0 +1,370 @@
1
+ // The `librarian` CLI runtime — an async function over argv.
2
+ //
3
+ // `runCli(argv, options)` resolves to `{ stdout, stderr, exitCode }` so the
4
+ // bin entry shapes it into a real process exit and tests assert against
5
+ // captured output without spawning a subprocess. Everything that touches the
6
+ // system is injectable through `options`: `home` (temp dir), `shell`, a
7
+ // `prompter` (prompt answers), and the per-module seams the commands pull in
8
+ // (`setRunner` / `setHomeOverride` / `setAdapterFetcher` / `setLatestFetcher`
9
+ // / `setServerProbe`). NOTHING here touches the real system, network, or
10
+ // stdin in tests.
11
+ import { runInstall } from "./commands/install.js";
12
+ import { runUninstall } from "./commands/uninstall.js";
13
+ import { runUpdate } from "./commands/update.js";
14
+ import { formatConfig, readConfig, redact, setConfig } from "./config.js";
15
+ import { doctor } from "./doctor.js";
16
+ import { detectShell } from "./env.js";
17
+ import { allHarnesses } from "./harnesses/index.js";
18
+ import { flagBool, flagString, parseArgs } from "./parse-args.js";
19
+ import { createPrompter, MissingValueError } from "./prompt.js";
20
+ import { runAdmin } from "./server/admin.js";
21
+ import { disableBoot, enableBoot } from "./server/boot.js";
22
+ import { runDown } from "./server/down.js";
23
+ import { serverUsage } from "./server/index.js";
24
+ import { runLogs } from "./server/logs.js";
25
+ import { serverStatus } from "./server/status.js";
26
+ import { runUp } from "./server/up.js";
27
+ import { runUpdate as runServerUpdate } from "./server/update.js";
28
+ import { status } from "./status.js";
29
+ import { cliVersion } from "./version.js";
30
+ const PHASE_2_STUBS = new Set(["report", "self-update"]);
31
+ /**
32
+ * The CLI entrypoint. Dispatches to the command handlers and — crucially —
33
+ * turns any escaped error into one clean stderr line + exit 1, so a failure
34
+ * never leaks a stack trace into the user's terminal (house rule: "never
35
+ * leak a stack trace"). `MissingValueError` (a required prompt with no value
36
+ * in a non-interactive run) gets a specific, actionable message.
37
+ */
38
+ export async function runCli(argv, options = {}) {
39
+ try {
40
+ return await dispatch(argv, options);
41
+ }
42
+ catch (error) {
43
+ if (error instanceof MissingValueError) {
44
+ return err("MCP URL and token are required — re-run interactively, or pass --mcp-url/--token.");
45
+ }
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ return err(`librarian: ${message}`);
48
+ }
49
+ }
50
+ async function dispatch(argv, options) {
51
+ const [command, ...rest] = argv;
52
+ if (!command || command === "--help" || command === "-h" || command === "help") {
53
+ return ok(usage());
54
+ }
55
+ if (command === "--version" || command === "-v" || command === "version") {
56
+ return ok(cliVersion());
57
+ }
58
+ if (command === "config") {
59
+ return runConfig(rest, options);
60
+ }
61
+ if (command === "install") {
62
+ return runInstallCommand(rest, options);
63
+ }
64
+ if (command === "uninstall") {
65
+ return runUninstallCommand(rest, options);
66
+ }
67
+ if (command === "update") {
68
+ return runUpdateCommand(rest, options);
69
+ }
70
+ if (command === "status") {
71
+ return ok(await status(options.home));
72
+ }
73
+ if (command === "doctor") {
74
+ // Diagnostic: exits 0 even when it flags problems.
75
+ return ok(await doctor(options.home));
76
+ }
77
+ if (command === "server") {
78
+ return runServerCommand(rest, options);
79
+ }
80
+ if (PHASE_2_STUBS.has(command)) {
81
+ return runPhase2Stub(command);
82
+ }
83
+ return err(`Unknown command: ${command}\n\n${usage()}`);
84
+ }
85
+ // --- config (fully implemented) ------------------------------------------
86
+ function runConfig(rest, options) {
87
+ const { flags } = parseArgs(rest);
88
+ const mcpUrl = flagString(flags["mcp-url"]) ?? flagString(flags.url);
89
+ const token = flagString(flags.token);
90
+ const shell = options.shell ?? resolveShellFlag(flags);
91
+ const wantsSet = mcpUrl !== undefined || token !== undefined;
92
+ if (wantsSet) {
93
+ const updated = setConfig({ mcpUrl, token }, { home: options.home, shell });
94
+ // Confirm what changed WITHOUT echoing the token.
95
+ return ok(["Updated config.", "", formatConfig(redact(updated))].join("\n"));
96
+ }
97
+ const current = readConfig(options.home);
98
+ if (!current) {
99
+ return ok([
100
+ "No config set yet.",
101
+ "",
102
+ "Set it with:",
103
+ " librarian config --mcp-url <url> --token <token>",
104
+ ].join("\n"));
105
+ }
106
+ return ok(formatConfig(redact(current)));
107
+ }
108
+ function resolveShellFlag(flags) {
109
+ const raw = flagString(flags.shell);
110
+ if (!raw)
111
+ return undefined;
112
+ return detectShell(raw);
113
+ }
114
+ // --- harness-touching commands -------------------------------------------
115
+ async function runInstallCommand(rest, options) {
116
+ const { positionals, flags } = parseArgs(rest);
117
+ const shell = options.shell ?? resolveShellFlag(flags);
118
+ const prompter = options.prompter ?? createPrompter();
119
+ try {
120
+ const outcome = await runInstall(positionals, {
121
+ home: options.home,
122
+ shell,
123
+ prompter,
124
+ env: options.env,
125
+ });
126
+ // A mid-install failure makes the command non-zero so scripts notice; a
127
+ // pure skip (CLI absent) is a success.
128
+ return outcome.failed.length > 0 ? errOut(outcome.output) : ok(outcome.output);
129
+ }
130
+ finally {
131
+ // Tear down the shared readline (BUG 1) so an open interface doesn't keep
132
+ // the event loop alive and hang the process after the command completes.
133
+ prompter.close();
134
+ }
135
+ }
136
+ async function runUninstallCommand(rest, options) {
137
+ const { positionals, flags } = parseArgs(rest);
138
+ const shell = options.shell ?? resolveShellFlag(flags);
139
+ const prompter = options.prompter ?? createPrompter();
140
+ try {
141
+ const outcome = await runUninstall(positionals, { home: options.home, shell, prompter });
142
+ return outcome.failed.length > 0 ? errOut(outcome.output) : ok(outcome.output);
143
+ }
144
+ finally {
145
+ prompter.close();
146
+ }
147
+ }
148
+ async function runUpdateCommand(rest, options) {
149
+ const { positionals } = parseArgs(rest);
150
+ const outcome = await runUpdate(positionals, { home: options.home });
151
+ return outcome.failed.length > 0 ? errOut(outcome.output) : ok(outcome.output);
152
+ }
153
+ // --- server command group (self-host) ------------------------------------
154
+ /**
155
+ * `librarian server [subcommand]`. With no subcommand (or `--help`/`-h`) it
156
+ * prints the command surface (§4). Implemented: `up` (S2/S3), `down` / `logs` /
157
+ * `status` (S4), `update` (S5), `enable-boot` / `disable-boot` (S6), `admin`
158
+ * (S7a). An unknown subcommand errors with the surface. Preflight + the
159
+ * `docker.ts` seam (S1) back every container op.
160
+ */
161
+ async function runServerCommand(rest, options) {
162
+ const [subcommand, ...subRest] = rest;
163
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
164
+ return ok(serverUsage());
165
+ }
166
+ if (subcommand === "up") {
167
+ return runServerUpCommand(subRest, options);
168
+ }
169
+ if (subcommand === "update") {
170
+ return runServerUpdateCommand(subRest, options);
171
+ }
172
+ if (subcommand === "down") {
173
+ return runServerDownCommand();
174
+ }
175
+ if (subcommand === "logs") {
176
+ return runServerLogsCommand(subRest);
177
+ }
178
+ if (subcommand === "status") {
179
+ return runServerStatusCommand(subRest, options);
180
+ }
181
+ if (subcommand === "enable-boot") {
182
+ return runServerEnableBootCommand(options);
183
+ }
184
+ if (subcommand === "disable-boot") {
185
+ return runServerDisableBootCommand(options);
186
+ }
187
+ if (subcommand === "admin") {
188
+ return runServerAdminCommand(subRest, options);
189
+ }
190
+ return err(`Unknown server subcommand: ${subcommand}\n\n${serverUsage()}`);
191
+ }
192
+ /**
193
+ * `librarian server up [flags]` (S2, localhost path). Parses the flags, builds
194
+ * a prompter (for the loop-closer env offer), and runs the orchestrated flow.
195
+ * A failure surfaces as one clean stderr line via the top-level catch — no
196
+ * stack trace, and the master key (carried only on the success stdout) never
197
+ * reaches an error path.
198
+ */
199
+ async function runServerUpCommand(rest, options) {
200
+ const { flags } = parseArgs(rest);
201
+ const prompter = options.prompter ?? createPrompter();
202
+ // Interactivity gates the best-effort offers (Tailscale; the `0.0.0.0`
203
+ // confirm). Explicit override wins; otherwise a TTY means interactive. A
204
+ // non-interactive run never silently exposes the server beyond localhost.
205
+ const interactive = options.interactive ?? Boolean(process.stdin.isTTY);
206
+ try {
207
+ const result = await runUp({
208
+ ref: flagString(flags.ref),
209
+ dir: flagString(flags.dir),
210
+ host: flagString(flags.host),
211
+ dataVolume: flagString(flags["data-volume"]),
212
+ enableBoot: flagBool(flags["enable-boot"]),
213
+ yes: flagBool(flags.yes),
214
+ }, {
215
+ home: options.home,
216
+ prompter,
217
+ interactive,
218
+ ...(options.platform ? { platform: options.platform } : {}),
219
+ });
220
+ return ok(result.output);
221
+ }
222
+ finally {
223
+ prompter.close();
224
+ }
225
+ }
226
+ /**
227
+ * `librarian server enable-boot` (S6). On Linux, installs + enables the systemd
228
+ * unit that starts the existing named container on boot (the unit references the
229
+ * container by name and carries NO secret). On macOS, prints the deferred notice
230
+ * and exits 0 (NOT an error). A real failure surfaces as one clean stderr line.
231
+ */
232
+ async function runServerEnableBootCommand(options) {
233
+ const result = await enableBoot(options.platform ? { platform: options.platform } : {});
234
+ return ok(result.output);
235
+ }
236
+ /**
237
+ * `librarian server disable-boot` (S6). On Linux, disables + removes the systemd
238
+ * unit and reloads systemd; safe if already disabled/absent (a teaching message,
239
+ * no crash). On macOS, prints the deferred notice and exits 0.
240
+ */
241
+ async function runServerDisableBootCommand(options) {
242
+ const result = await disableBoot(options.platform ? { platform: options.platform } : {});
243
+ return ok(result.output);
244
+ }
245
+ /**
246
+ * `librarian server admin <backup|restore|auth|rebuild> [args…]` (S7a). Runs a
247
+ * curated admin verb inside the running container via
248
+ * `docker exec [-it] the-librarian the-librarian <verb> [args…]` (spec §7). The
249
+ * args are passed through VERBATIM — so we do NOT run them through `parseArgs`
250
+ * (that would reorder/strip flags); the in-container CLI parses them. An
251
+ * interactive run adds `-it` so the CLI can prompt (e.g. `restore`'s
252
+ * `--secret-key`). A rejected verb or a down container surfaces as one clean
253
+ * stderr line via the top-level catch, with no `docker exec`.
254
+ */
255
+ async function runServerAdminCommand(subRest, options) {
256
+ const interactive = options.interactive ?? Boolean(process.stdin.isTTY);
257
+ const result = await runAdmin(subRest, {
258
+ interactive,
259
+ ...(options.platform ? { platform: options.platform } : {}),
260
+ });
261
+ return ok(result.output);
262
+ }
263
+ /**
264
+ * `librarian server update [--ref <tag|main>] [--yes]` (S5). Re-pins the deploy
265
+ * dir to the resolved ref, rebuilds the image, recreates the container
266
+ * (PRESERVING the data volume), waits for health (rolling back on failure), and
267
+ * applies pending data-dir migrations. Idempotent: already at the ref + healthy
268
+ * → a clean no-op. The agent token is reused from the running container (clients
269
+ * keep working) and never reaches an error path or a file. A failure surfaces as
270
+ * one clean stderr line via the top-level catch (already secret-redacted).
271
+ */
272
+ async function runServerUpdateCommand(rest, options) {
273
+ const { flags } = parseArgs(rest);
274
+ const result = await runServerUpdate({
275
+ ref: flagString(flags.ref),
276
+ dir: flagString(flags.dir),
277
+ yes: flagBool(flags.yes),
278
+ home: options.home,
279
+ });
280
+ return ok(result.output);
281
+ }
282
+ /**
283
+ * `librarian server down` (S4). Stops the container — DATA SACRED (it issues
284
+ * only `docker stop`, never any `rm`/volume op). A not-running container is a
285
+ * friendly success; a real failure surfaces via the top-level catch as one
286
+ * clean stderr line. No flags today.
287
+ */
288
+ async function runServerDownCommand() {
289
+ const result = await runDown({});
290
+ return ok(result.output);
291
+ }
292
+ /**
293
+ * `librarian server logs [-f] [--service mcp|dashboard|all]` (S4). `-f` is a
294
+ * short flag the tiny parser treats as a positional, so we accept it there (or
295
+ * `--follow`). `--service` selects which of the two co-located services to show
296
+ * (filtered from the combined stream). A bad `--service` value is a teaching
297
+ * error via the top-level catch.
298
+ *
299
+ * A FOLLOW (`-f`) streams its lines straight to `process.stdout` LIVE inside
300
+ * `runLogs` (a tail never closes on its own — buffering it to return here is the
301
+ * old hang), so there's no captured `output` to print; we just propagate the
302
+ * followed process's exit code. The one-shot path returns its captured output.
303
+ */
304
+ async function runServerLogsCommand(rest) {
305
+ const { positionals, flags } = parseArgs(rest);
306
+ const follow = positionals.includes("-f") || flagBool(flags.follow) || flagBool(flags.f);
307
+ const result = await runLogs({ follow, service: flagString(flags.service) });
308
+ if (follow) {
309
+ // Lines already streamed live; pass through the follow's exit code.
310
+ return { stdout: "", stderr: "", exitCode: result.exitCode ?? 0 };
311
+ }
312
+ return ok(result.output);
313
+ }
314
+ /**
315
+ * `librarian server status` (S4). Reports running/health (from `docker inspect`)
316
+ * and the deployed-vs-latest badge (deploy-state ref vs `fetchLatestVersion`).
317
+ * Offline/unknown degrades to `unknown`/`?` and still exits 0 — only a missing
318
+ * docker (preflight) makes it non-zero, via the top-level catch.
319
+ */
320
+ async function runServerStatusCommand(rest, options) {
321
+ const { flags } = parseArgs(rest);
322
+ const result = await serverStatus({ home: options.home, dir: flagString(flags.dir) });
323
+ return ok(result.output);
324
+ }
325
+ // --- Phase 2 stubs (friendly "coming later") -----------------------------
326
+ function runPhase2Stub(command) {
327
+ const detail = command === "report"
328
+ ? "Server reporting (the dashboard's Installs view) arrives in a later release."
329
+ : "Self-update of the CLI arrives in a later release. For now: `npm i -g @the-librarian/cli`.";
330
+ return ok(`librarian ${command}: coming in a later release.\n\n${detail}`);
331
+ }
332
+ // --- usage ---------------------------------------------------------------
333
+ export function usage() {
334
+ const harnesses = allHarnesses.map((h) => h.id).join(", ");
335
+ return [
336
+ "Usage: librarian <command> [harness…] [flags]",
337
+ "",
338
+ "Commands:",
339
+ " install [harness…] Install The Librarian into one or more harnesses",
340
+ " uninstall [harness…] Remove The Librarian from one or more harnesses",
341
+ " update [harness…] Update the integration to the current version",
342
+ " status Live table of harness / installed / version",
343
+ " doctor Diagnose token, server reachability, harness CLIs",
344
+ " config Show or set MCP URL, token, server URL",
345
+ " server Self-host the Librarian server (run `server` for its commands)",
346
+ " self-update Update the librarian CLI itself",
347
+ " report Push this machine's state to the server",
348
+ "",
349
+ "Flags:",
350
+ " --mcp-url <url> config: set the MCP endpoint URL",
351
+ " --token <token> config: set the bearer token (never printed)",
352
+ " --shell <bash|zsh|fish> override shell detection for the rc block",
353
+ " -h, --help Show this help",
354
+ " -v, --version Show the CLI version",
355
+ "",
356
+ `Harnesses: ${harnesses}`,
357
+ ].join("\n");
358
+ }
359
+ // --- result helpers ------------------------------------------------------
360
+ function ok(stdout) {
361
+ return { stdout, stderr: "", exitCode: 0 };
362
+ }
363
+ function err(stderr) {
364
+ return { stdout: "", stderr, exitCode: 1 };
365
+ }
366
+ /** A non-zero result that still carries its (already-formatted) report on stdout. */
367
+ function errOut(stdout) {
368
+ return { stdout, stderr: "", exitCode: 1 };
369
+ }
370
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Compare two version strings. Returns <0 if `a` precedes `b`, >0 if `a`
3
+ * follows `b`, 0 if equal or either is unparseable (so an unknown version
4
+ * never reads as "behind").
5
+ */
6
+ export declare function compareVersions(a: string, b: string): number;
7
+ /**
8
+ * True iff `installed` is strictly behind `latest`. Either side being unknown
9
+ * (empty / unparseable) yields `false` — the caller renders `?`, never a
10
+ * false "update available".
11
+ */
12
+ export declare function isBehind(installed: string, latest: string): boolean;
13
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../src/semver.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqB5D;AAyBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGnE"}