@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
@@ -0,0 +1,67 @@
1
+ // `librarian uninstall [harness…]` orchestration.
2
+ //
3
+ // Each harness's `uninstall()` is no-op safe, so we just call them. After
4
+ // removing the named (or all) harnesses, if NO harness remains installed we
5
+ // OFFER to remove the managed shell block + `~/.librarian/env` — prompting,
6
+ // defaulting to NO (we never tear down the user's env without consent).
7
+ import fs from "node:fs";
8
+ import { readConfig } from "../config.js";
9
+ import { detectShell, removeShellBlock } from "../env.js";
10
+ import { allHarnesses } from "../harnesses/index.js";
11
+ import { envFilePath } from "../paths.js";
12
+ import { messageOf, resolveNamed } from "./shared.js";
13
+ export async function runUninstall(named, deps) {
14
+ const lines = [];
15
+ const { harnesses, unknown } = resolveNamed(named);
16
+ for (const id of unknown)
17
+ lines.push(`Skipping unknown harness: ${id}`);
18
+ const removed = [];
19
+ const failed = [];
20
+ for (const harness of harnesses) {
21
+ try {
22
+ await harness.uninstall();
23
+ removed.push(harness.id);
24
+ }
25
+ catch (error) {
26
+ failed.push({ id: harness.id, reason: messageOf(error) });
27
+ }
28
+ }
29
+ lines.push("Uninstall summary:");
30
+ if (removed.length > 0)
31
+ lines.push(` Removed: ${removed.join(", ")}`);
32
+ for (const f of failed)
33
+ lines.push(` Failed ${f.id}: ${f.reason}`);
34
+ if (removed.length === 0 && failed.length === 0)
35
+ lines.push(" (nothing to remove)");
36
+ // If nothing remains installed across ALL harnesses, offer to tear down env.
37
+ let envRemoved = false;
38
+ const stillInstalled = await anyInstalled();
39
+ if (!stillInstalled && readConfig(deps.home)) {
40
+ const answer = await deps.prompter.promptText("No harnesses remain installed. Remove the shell block + ~/.librarian/env?", { default: "no" });
41
+ if (isYes(answer)) {
42
+ const shell = deps.shell ?? detectShell();
43
+ removeShellBlock(shell, deps.home);
44
+ try {
45
+ fs.rmSync(envFilePath(deps.home));
46
+ }
47
+ catch {
48
+ // already gone
49
+ }
50
+ envRemoved = true;
51
+ lines.push("", "Removed the managed shell block and ~/.librarian/env.");
52
+ }
53
+ else {
54
+ lines.push("", "Left the shell block and ~/.librarian/env in place.");
55
+ }
56
+ }
57
+ return { removed, failed, envRemoved, output: lines.join("\n") };
58
+ }
59
+ /** True iff any harness still reports itself installed. */
60
+ async function anyInstalled() {
61
+ const detections = await Promise.all(allHarnesses.map((h) => h.detect()));
62
+ return detections.some((d) => d.installed);
63
+ }
64
+ function isYes(answer) {
65
+ return /^y(es)?$/i.test(answer.trim());
66
+ }
67
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface UpdateDeps {
2
+ home?: string | undefined;
3
+ }
4
+ export interface UpdateOutcome {
5
+ updated: {
6
+ id: string;
7
+ from?: string | undefined;
8
+ to?: string | undefined;
9
+ }[];
10
+ skipped: {
11
+ id: string;
12
+ reason: string;
13
+ }[];
14
+ failed: {
15
+ id: string;
16
+ reason: string;
17
+ }[];
18
+ output: string;
19
+ }
20
+ export declare function runUpdate(named: string[], deps: UpdateDeps): Promise<UpdateOutcome>;
21
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;IAC9E,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAiEzF"}
@@ -0,0 +1,75 @@
1
+ // `librarian update [harness…]` orchestration.
2
+ //
3
+ // For each target harness — the named ones, or every CURRENTLY-INSTALLED
4
+ // harness when none are named — run its native `update(cfg)` and report the
5
+ // version transition (old → new) where both are detectable. Update needs
6
+ // config (it re-applies the integration), so it errors clearly if config is
7
+ // unset. A "CLI not found" error is a SKIP, not a failure, mirroring install.
8
+ import { readConfig } from "../config.js";
9
+ import { allHarnesses } from "../harnesses/index.js";
10
+ import { messageOf, resolveNamed, toHarnessConfig } from "./shared.js";
11
+ export async function runUpdate(named, deps) {
12
+ const lines = [];
13
+ const cfg = readConfig(deps.home);
14
+ if (!cfg || !cfg.mcpUrl || !cfg.token) {
15
+ lines.push("No config set. Run `librarian config --mcp-url <url> --token <token>` first.");
16
+ return { updated: [], skipped: [], failed: [], output: lines.join("\n") };
17
+ }
18
+ const harnessCfg = toHarnessConfig(cfg);
19
+ // Targets: named (validated), else every currently-installed harness.
20
+ const { harnesses: namedHarnesses, unknown } = resolveNamed(named);
21
+ for (const id of unknown)
22
+ lines.push(`Skipping unknown harness: ${id}`);
23
+ let targets;
24
+ if (named.length > 0) {
25
+ targets = namedHarnesses;
26
+ }
27
+ else {
28
+ const detections = await Promise.all(allHarnesses.map((h) => h.detect()));
29
+ targets = allHarnesses.filter((_, i) => detections[i]?.installed);
30
+ if (targets.length === 0) {
31
+ lines.push("No harnesses are currently installed — nothing to update.");
32
+ return { updated: [], skipped: [], failed: [], output: lines.join("\n") };
33
+ }
34
+ }
35
+ const updated = [];
36
+ const skipped = [];
37
+ const failed = [];
38
+ for (const harness of targets) {
39
+ const before = (await harness.detect()).version;
40
+ try {
41
+ await harness.update(harnessCfg);
42
+ }
43
+ catch (error) {
44
+ const reason = messageOf(error);
45
+ if (/not found on path/i.test(reason) || /cli not found/i.test(reason)) {
46
+ skipped.push({ id: harness.id, reason });
47
+ continue;
48
+ }
49
+ failed.push({ id: harness.id, reason });
50
+ continue;
51
+ }
52
+ const after = (await harness.detect()).version;
53
+ updated.push({ id: harness.id, from: before, to: after });
54
+ }
55
+ lines.push("Update summary:");
56
+ for (const u of updated) {
57
+ const transition = u.from && u.to
58
+ ? u.from === u.to
59
+ ? `already at ${u.to}`
60
+ : `${u.from} → ${u.to}`
61
+ : u.to
62
+ ? `now ${u.to}`
63
+ : "updated";
64
+ lines.push(` ${u.id}: ${transition}`);
65
+ }
66
+ for (const s of skipped)
67
+ lines.push(` Skipped ${s.id}: ${s.reason}`);
68
+ for (const f of failed)
69
+ lines.push(` Failed ${f.id}: ${f.reason}`);
70
+ if (updated.length === 0 && skipped.length === 0 && failed.length === 0) {
71
+ lines.push(" (nothing updated)");
72
+ }
73
+ return { updated, skipped, failed, output: lines.join("\n") };
74
+ }
75
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type Shell } from "./env.js";
2
+ export interface LibrarianConfig {
3
+ /** The MCP endpoint URL the harnesses talk to. */
4
+ mcpUrl: string;
5
+ /** The bearer token. NEVER printed; redacted on display. */
6
+ token: string;
7
+ /** The server base URL; defaults to the MCP URL's origin. */
8
+ serverUrl: string;
9
+ }
10
+ /** A display-safe view of the config — token is redacted to a boolean. */
11
+ export interface RedactedConfig {
12
+ mcpUrl: string;
13
+ /** True iff a non-empty token is set. The value itself is never exposed. */
14
+ tokenSet: boolean;
15
+ serverUrl: string;
16
+ }
17
+ /** Derive the server base URL (origin) from the MCP URL; "" if unparseable. */
18
+ export declare function deriveServerUrl(mcpUrl: string): string;
19
+ /** Load the current config from `~/.librarian/env`, or null if unset. */
20
+ export declare function readConfig(home?: string): LibrarianConfig | null;
21
+ /** A display-safe view: the token is reduced to a boolean, never printed. */
22
+ export declare function redact(config: LibrarianConfig): RedactedConfig;
23
+ /** Render the redacted config as human-readable lines (no token value). */
24
+ export declare function formatConfig(config: RedactedConfig): string;
25
+ export interface SetConfigInput {
26
+ mcpUrl?: string | undefined;
27
+ token?: string | undefined;
28
+ }
29
+ /**
30
+ * Update config values and persist them to `~/.librarian/env`.
31
+ *
32
+ * Merges over whatever is already stored (so setting just the token
33
+ * keeps the URL). Re-applies the managed shell block so a fresh `config`
34
+ * on a new shell still wires up sourcing. Returns the new config.
35
+ */
36
+ export declare function setConfig(input: SetConfigInput, options?: {
37
+ home?: string | undefined;
38
+ shell?: Shell | undefined;
39
+ }): LibrarianConfig;
40
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAG9E,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAQhE;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAM9D;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAM3D;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;CAAO,GACrE,eAAe,CAQjB"}
package/dist/config.js ADDED
@@ -0,0 +1,65 @@
1
+ // Config core: MCP URL, agent token, and derived server URL.
2
+ //
3
+ // The persisted truth is `~/.librarian/env` (token + MCP URL). The
4
+ // server URL is *derived* by default — it's the origin of the MCP URL —
5
+ // but can be set explicitly. Reading config never exposes the token: the
6
+ // redacted view reports only whether it's *set*, never the value.
7
+ //
8
+ // `home` is injectable everywhere so tests run against a temp dir.
9
+ import { detectShell, readEnvFile, writeEnvFile } from "./env.js";
10
+ import { applyShellBlock } from "./env.js";
11
+ /** Derive the server base URL (origin) from the MCP URL; "" if unparseable. */
12
+ export function deriveServerUrl(mcpUrl) {
13
+ if (!mcpUrl)
14
+ return "";
15
+ try {
16
+ return new URL(mcpUrl).origin;
17
+ }
18
+ catch {
19
+ return "";
20
+ }
21
+ }
22
+ /** Load the current config from `~/.librarian/env`, or null if unset. */
23
+ export function readConfig(home) {
24
+ const env = readEnvFile(home);
25
+ if (!env)
26
+ return null;
27
+ return {
28
+ mcpUrl: env.mcpUrl,
29
+ token: env.token,
30
+ serverUrl: deriveServerUrl(env.mcpUrl),
31
+ };
32
+ }
33
+ /** A display-safe view: the token is reduced to a boolean, never printed. */
34
+ export function redact(config) {
35
+ return {
36
+ mcpUrl: config.mcpUrl,
37
+ tokenSet: config.token.length > 0,
38
+ serverUrl: config.serverUrl,
39
+ };
40
+ }
41
+ /** Render the redacted config as human-readable lines (no token value). */
42
+ export function formatConfig(config) {
43
+ return [
44
+ `MCP URL: ${config.mcpUrl || "(not set)"}`,
45
+ `Server URL: ${config.serverUrl || "(not set)"}`,
46
+ `Token: ${config.tokenSet ? "set (hidden)" : "(not set)"}`,
47
+ ].join("\n");
48
+ }
49
+ /**
50
+ * Update config values and persist them to `~/.librarian/env`.
51
+ *
52
+ * Merges over whatever is already stored (so setting just the token
53
+ * keeps the URL). Re-applies the managed shell block so a fresh `config`
54
+ * on a new shell still wires up sourcing. Returns the new config.
55
+ */
56
+ export function setConfig(input, options = {}) {
57
+ const current = readEnvFile(options.home);
58
+ const mcpUrl = input.mcpUrl ?? current?.mcpUrl ?? "";
59
+ const token = input.token ?? current?.token ?? "";
60
+ writeEnvFile({ mcpUrl, token }, options.home);
61
+ const shell = options.shell ?? detectShell();
62
+ applyShellBlock(shell, { mcpUrl, token }, options.home);
63
+ return { mcpUrl, token, serverUrl: deriveServerUrl(mcpUrl) };
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,mEAAmE;AACnE,wEAAwE;AACxE,yEAAyE;AACzE,kEAAkE;AAClE,EAAE;AACF,mEAAmE;AAEnE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAmB3C,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,MAAM,CAAC,MAAuB;IAC5C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO;QACL,eAAe,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE;QAC7C,eAAe,MAAM,CAAC,SAAS,IAAI,WAAW,EAAE;QAChD,eAAe,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE;KAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,KAAqB,EACrB,UAAoE,EAAE;IAEtE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;IAC7C,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** Outcome of a server-reachability probe. */
2
+ export interface ProbeResult {
3
+ ok: boolean;
4
+ /** A short human detail: the status code, or why it failed. */
5
+ detail: string;
6
+ }
7
+ /**
8
+ * Probe whether the configured server is reachable. INJECTABLE so tests never
9
+ * hit the network; OFFLINE-TOLERANT so a down server is a flagged problem, not
10
+ * a crash. The token is never sent here — this is an unauthenticated liveness
11
+ * check against public endpoints.
12
+ */
13
+ export type ServerProbe = (serverUrl: string) => Promise<ProbeResult>;
14
+ /** Override the server-reachability probe (tests inject a canned one). */
15
+ export declare function setServerProbe(next: ServerProbe): void;
16
+ /** Restore the default (network) server probe (tests). */
17
+ export declare function resetServerProbe(): void;
18
+ /**
19
+ * Run the diagnostic and render its report. `home` is injectable for tests.
20
+ * Always resolves (never rejects); the caller exits 0 regardless.
21
+ */
22
+ export declare function doctor(home?: string): Promise<string>;
23
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAeA,8CAA8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAwBtE,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAEtD;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC3D"}
package/dist/doctor.js ADDED
@@ -0,0 +1,81 @@
1
+ // `librarian doctor` — a read-only diagnostic. Exits 0 ALWAYS (it's a
2
+ // report, not a gate), but clearly flags each problem it finds:
3
+ // - is the agent token set? (from `readConfig`; shown only as set/not — the
4
+ // value is NEVER printed);
5
+ // - is the server reachable? (a GET against `<serverUrl>/healthz`, falling
6
+ // back to `/primer.md`; INJECTABLE + offline-tolerant);
7
+ // - which harness CLIs are on PATH? (`which` from exec.ts);
8
+ // - the machine id + hostname (the dashboard's row key).
9
+ import { readConfig } from "./config.js";
10
+ import { which } from "./exec.js";
11
+ import { HARNESS_CLI } from "./harnesses/cli.js";
12
+ import { allHarnesses } from "./harnesses/index.js";
13
+ import { hostname, machineId } from "./machine.js";
14
+ /** The probe paths we try, in order, against the server origin. */
15
+ const PROBE_PATHS = ["/healthz", "/primer.md"];
16
+ const PROBE_TIMEOUT_MS = 3000;
17
+ const defaultServerProbe = async (serverUrl) => {
18
+ if (!serverUrl)
19
+ return { ok: false, detail: "no server URL configured" };
20
+ let lastDetail = "unreachable";
21
+ for (const probePath of PROBE_PATHS) {
22
+ const controller = new AbortController();
23
+ const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);
24
+ try {
25
+ const url = `${serverUrl.replace(/\/+$/, "")}${probePath}`;
26
+ const res = await fetch(url, { method: "GET", redirect: "error", signal: controller.signal });
27
+ if (res.ok)
28
+ return { ok: true, detail: `HTTP ${res.status} ${probePath}` };
29
+ lastDetail = `HTTP ${res.status} ${probePath}`;
30
+ }
31
+ catch (error) {
32
+ lastDetail = error instanceof Error ? error.message : "unreachable";
33
+ }
34
+ finally {
35
+ clearTimeout(timer);
36
+ }
37
+ }
38
+ return { ok: false, detail: lastDetail };
39
+ };
40
+ let serverProbe = defaultServerProbe;
41
+ /** Override the server-reachability probe (tests inject a canned one). */
42
+ export function setServerProbe(next) {
43
+ serverProbe = next;
44
+ }
45
+ /** Restore the default (network) server probe (tests). */
46
+ export function resetServerProbe() {
47
+ serverProbe = defaultServerProbe;
48
+ }
49
+ /**
50
+ * Run the diagnostic and render its report. `home` is injectable for tests.
51
+ * Always resolves (never rejects); the caller exits 0 regardless.
52
+ */
53
+ export async function doctor(home) {
54
+ const cfg = readConfig(home);
55
+ const lines = ["librarian doctor", ""];
56
+ // 1) Token + URL config (token shown only as set/not — never the value).
57
+ const tokenSet = Boolean(cfg && cfg.token.length > 0);
58
+ lines.push(`Token: ${tokenSet ? "set" : "NOT SET — run `librarian config --token <token>`"}`);
59
+ lines.push(`MCP URL: ${cfg?.mcpUrl || "NOT SET — run `librarian config --mcp-url <url>`"}`);
60
+ lines.push(`Server URL: ${cfg?.serverUrl || "(not set)"}`);
61
+ // 2) Server reachability (injectable + offline-tolerant).
62
+ const probe = await serverProbe(cfg?.serverUrl ?? "");
63
+ lines.push(`Server: ${probe.ok ? `reachable (${probe.detail})` : `UNREACHABLE — ${probe.detail}`}`);
64
+ // 3) Harness CLIs on PATH.
65
+ lines.push("", "Harness CLIs on PATH:");
66
+ for (const harness of allHarnesses) {
67
+ const cli = HARNESS_CLI[harness.id];
68
+ if (cli === null) {
69
+ lines.push(` ${harness.displayName}: file-based (no CLI)`);
70
+ continue;
71
+ }
72
+ const found = await which(cli);
73
+ lines.push(` ${harness.displayName}: ${found ? `\`${cli}\` found` : `\`${cli}\` NOT on PATH`}`);
74
+ }
75
+ // 4) Machine identity.
76
+ lines.push("", `Machine id: ${machineId(home)}`, `Hostname: ${hostname()}`);
77
+ const problems = !tokenSet || !cfg?.mcpUrl || !probe.ok;
78
+ lines.push("", problems ? "Some checks need attention (see lines flagged above)." : "All checks passed.");
79
+ return lines.join("\n");
80
+ }
81
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /** The secrets the env file carries. */
2
+ export interface EnvValues {
3
+ mcpUrl: string;
4
+ token: string;
5
+ }
6
+ export type Shell = "bash" | "zsh" | "fish";
7
+ /**
8
+ * Detect the user's shell from `$SHELL`, defaulting to bash.
9
+ *
10
+ * `override` (e.g. from a `--shell` flag) wins when it names a supported
11
+ * shell. An unrecognised `$SHELL` falls back to bash — the POSIX block
12
+ * is the safe default.
13
+ */
14
+ export declare function detectShell(override?: string, env?: NodeJS.ProcessEnv): Shell;
15
+ /**
16
+ * Write `~/.librarian/env` with the two exports, chmod 600.
17
+ *
18
+ * The directory is created if missing; the file is (re)written wholesale
19
+ * so stale values can't linger. Never logs `values.token`.
20
+ */
21
+ export declare function writeEnvFile(values: EnvValues, home?: string): void;
22
+ /** Read the env file back into structured values, or null if absent. */
23
+ export declare function readEnvFile(home?: string): EnvValues | null;
24
+ /**
25
+ * Apply (or replace) the managed block in the shell rc.
26
+ *
27
+ * For bash/zsh this writes the POSIX source-block into `~/.bashrc` or
28
+ * `~/.zshrc`. For fish it writes `~/.config/fish/conf.d/librarian.fish`
29
+ * with `set -gx` reading the values directly (fish can't source POSIX).
30
+ *
31
+ * Idempotent: a second call with the rc already containing a block
32
+ * replaces it in place — never appends a duplicate.
33
+ *
34
+ * Returns the path that was written.
35
+ */
36
+ export declare function applyShellBlock(shell: Shell, values: EnvValues, home?: string): string;
37
+ /** Remove the managed block from the shell rc (or delete the fish conf). */
38
+ export declare function removeShellBlock(shell: Shell, home?: string): void;
39
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAsBA,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAW5C;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,KAAK,CAU1F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAanE;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAW3D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAclE"}