@lore-co/cli 0.2.25 → 0.2.27

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 (216) hide show
  1. package/README.md +69 -18
  2. package/dist/agents.d.ts +9 -0
  3. package/dist/agents.d.ts.map +1 -1
  4. package/dist/agents.js +19 -6
  5. package/dist/agents.js.map +1 -1
  6. package/dist/api.d.ts +2 -1
  7. package/dist/api.d.ts.map +1 -1
  8. package/dist/api.js +15 -2
  9. package/dist/api.js.map +1 -1
  10. package/dist/approach-guidance.d.ts +8 -1
  11. package/dist/approach-guidance.d.ts.map +1 -1
  12. package/dist/approach-guidance.js +13 -3
  13. package/dist/approach-guidance.js.map +1 -1
  14. package/dist/approach.d.ts.map +1 -1
  15. package/dist/approach.js +2 -2
  16. package/dist/approach.js.map +1 -1
  17. package/dist/ask.d.ts.map +1 -1
  18. package/dist/ask.js +2 -2
  19. package/dist/ask.js.map +1 -1
  20. package/dist/capture-scope.d.ts.map +1 -1
  21. package/dist/capture-scope.js +2 -1
  22. package/dist/capture-scope.js.map +1 -1
  23. package/dist/chat.d.ts.map +1 -1
  24. package/dist/chat.js +2 -2
  25. package/dist/chat.js.map +1 -1
  26. package/dist/cli.d.ts +66 -2
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +547 -91
  29. package/dist/cli.js.map +1 -1
  30. package/dist/codex-hook-approval.d.ts.map +1 -1
  31. package/dist/codex-hook-approval.js +9 -2
  32. package/dist/codex-hook-approval.js.map +1 -1
  33. package/dist/command-help.d.ts.map +1 -1
  34. package/dist/command-help.js +7 -3
  35. package/dist/command-help.js.map +1 -1
  36. package/dist/config-command.js +2 -2
  37. package/dist/config-command.js.map +1 -1
  38. package/dist/connect-project.d.ts.map +1 -1
  39. package/dist/connect-project.js +2 -1
  40. package/dist/connect-project.js.map +1 -1
  41. package/dist/console-keys.d.ts +11 -0
  42. package/dist/console-keys.d.ts.map +1 -0
  43. package/dist/console-keys.js +24 -0
  44. package/dist/console-keys.js.map +1 -0
  45. package/dist/cursor-mcp.d.ts.map +1 -1
  46. package/dist/cursor-mcp.js +4 -0
  47. package/dist/cursor-mcp.js.map +1 -1
  48. package/dist/demo-process.js +3 -3
  49. package/dist/demo-process.js.map +1 -1
  50. package/dist/devin-capture.d.ts.map +1 -1
  51. package/dist/devin-capture.js +2 -2
  52. package/dist/devin-capture.js.map +1 -1
  53. package/dist/devin-cli.d.ts.map +1 -1
  54. package/dist/devin-cli.js +23 -13
  55. package/dist/devin-cli.js.map +1 -1
  56. package/dist/devin-client.d.ts +3 -0
  57. package/dist/devin-client.d.ts.map +1 -1
  58. package/dist/devin-client.js +5 -0
  59. package/dist/devin-client.js.map +1 -1
  60. package/dist/devin.d.ts.map +1 -1
  61. package/dist/devin.js +29 -9
  62. package/dist/devin.js.map +1 -1
  63. package/dist/generated-assets.d.ts +8 -8
  64. package/dist/generated-assets.d.ts.map +1 -1
  65. package/dist/generated-assets.js +8 -8
  66. package/dist/generated-assets.js.map +1 -1
  67. package/dist/github.d.ts.map +1 -1
  68. package/dist/github.js +38 -7
  69. package/dist/github.js.map +1 -1
  70. package/dist/guard.d.ts +1 -1
  71. package/dist/guard.d.ts.map +1 -1
  72. package/dist/guard.js +42 -14
  73. package/dist/guard.js.map +1 -1
  74. package/dist/handoff.js +2 -2
  75. package/dist/handoff.js.map +1 -1
  76. package/dist/host.js +4 -4
  77. package/dist/host.js.map +1 -1
  78. package/dist/image-capture.d.ts.map +1 -1
  79. package/dist/image-capture.js +5 -4
  80. package/dist/image-capture.js.map +1 -1
  81. package/dist/learnings.d.ts.map +1 -1
  82. package/dist/learnings.js +3 -3
  83. package/dist/learnings.js.map +1 -1
  84. package/dist/live.d.ts +7 -0
  85. package/dist/live.d.ts.map +1 -1
  86. package/dist/live.js +11 -6
  87. package/dist/live.js.map +1 -1
  88. package/dist/lore-agent.d.ts +8 -1
  89. package/dist/lore-agent.d.ts.map +1 -1
  90. package/dist/lore-agent.js +33 -11
  91. package/dist/lore-agent.js.map +1 -1
  92. package/dist/mcp-config.d.ts +7 -0
  93. package/dist/mcp-config.d.ts.map +1 -1
  94. package/dist/mcp-config.js +19 -3
  95. package/dist/mcp-config.js.map +1 -1
  96. package/dist/npm-installation.d.ts +30 -0
  97. package/dist/npm-installation.d.ts.map +1 -0
  98. package/dist/npm-installation.js +46 -0
  99. package/dist/npm-installation.js.map +1 -0
  100. package/dist/owned-files.d.ts +14 -4
  101. package/dist/owned-files.d.ts.map +1 -1
  102. package/dist/owned-files.js +24 -9
  103. package/dist/owned-files.js.map +1 -1
  104. package/dist/platform.d.ts +26 -3
  105. package/dist/platform.d.ts.map +1 -1
  106. package/dist/platform.js +87 -20
  107. package/dist/platform.js.map +1 -1
  108. package/dist/pty.d.ts +2 -1
  109. package/dist/pty.d.ts.map +1 -1
  110. package/dist/pty.js +20 -7
  111. package/dist/pty.js.map +1 -1
  112. package/dist/recovery-cloud-receipt.d.ts.map +1 -1
  113. package/dist/recovery-cloud-receipt.js +2 -1
  114. package/dist/recovery-cloud-receipt.js.map +1 -1
  115. package/dist/recovery-cloud-workspace.d.ts.map +1 -1
  116. package/dist/recovery-cloud-workspace.js +2 -1
  117. package/dist/recovery-cloud-workspace.js.map +1 -1
  118. package/dist/recovery-cloud.d.ts.map +1 -1
  119. package/dist/recovery-cloud.js +8 -9
  120. package/dist/recovery-cloud.js.map +1 -1
  121. package/dist/recovery-copilot.d.ts.map +1 -1
  122. package/dist/recovery-copilot.js +3 -2
  123. package/dist/recovery-copilot.js.map +1 -1
  124. package/dist/recovery-desktop.d.ts.map +1 -1
  125. package/dist/recovery-desktop.js +3 -2
  126. package/dist/recovery-desktop.js.map +1 -1
  127. package/dist/recovery-hooks.js +2 -2
  128. package/dist/recovery-hooks.js.map +1 -1
  129. package/dist/recovery-hosts.d.ts.map +1 -1
  130. package/dist/recovery-hosts.js +53 -6
  131. package/dist/recovery-hosts.js.map +1 -1
  132. package/dist/recovery-polytoken.d.ts +2 -2
  133. package/dist/recovery-polytoken.d.ts.map +1 -1
  134. package/dist/recovery-polytoken.js +13 -8
  135. package/dist/recovery-polytoken.js.map +1 -1
  136. package/dist/recovery-remote.js +3 -3
  137. package/dist/recovery-remote.js.map +1 -1
  138. package/dist/recovery-state.d.ts +22 -1
  139. package/dist/recovery-state.d.ts.map +1 -1
  140. package/dist/recovery-state.js +167 -31
  141. package/dist/recovery-state.js.map +1 -1
  142. package/dist/recovery-transfer.d.ts.map +1 -1
  143. package/dist/recovery-transfer.js +8 -4
  144. package/dist/recovery-transfer.js.map +1 -1
  145. package/dist/recovery.d.ts.map +1 -1
  146. package/dist/recovery.js +30 -11
  147. package/dist/recovery.js.map +1 -1
  148. package/dist/reliability-store.d.ts +13 -0
  149. package/dist/reliability-store.d.ts.map +1 -1
  150. package/dist/reliability-store.js +110 -8
  151. package/dist/reliability-store.js.map +1 -1
  152. package/dist/remember.d.ts.map +1 -1
  153. package/dist/remember.js +2 -2
  154. package/dist/remember.js.map +1 -1
  155. package/dist/retained-context.d.ts.map +1 -1
  156. package/dist/retained-context.js +3 -2
  157. package/dist/retained-context.js.map +1 -1
  158. package/dist/retrieval-task.d.ts +30 -0
  159. package/dist/retrieval-task.d.ts.map +1 -1
  160. package/dist/retrieval-task.js +98 -2
  161. package/dist/retrieval-task.js.map +1 -1
  162. package/dist/review.d.ts +1 -1
  163. package/dist/review.d.ts.map +1 -1
  164. package/dist/review.js +5 -2
  165. package/dist/review.js.map +1 -1
  166. package/dist/runtime.d.ts +4 -1
  167. package/dist/runtime.d.ts.map +1 -1
  168. package/dist/runtime.js +138 -91
  169. package/dist/runtime.js.map +1 -1
  170. package/dist/self-host.d.ts +1 -1
  171. package/dist/self-host.d.ts.map +1 -1
  172. package/dist/self-host.js +105 -23
  173. package/dist/self-host.js.map +1 -1
  174. package/dist/share.d.ts.map +1 -1
  175. package/dist/share.js +2 -1
  176. package/dist/share.js.map +1 -1
  177. package/dist/signed-snapshot.d.ts +7 -0
  178. package/dist/signed-snapshot.d.ts.map +1 -1
  179. package/dist/signed-snapshot.js +27 -0
  180. package/dist/signed-snapshot.js.map +1 -1
  181. package/dist/skill-command.d.ts +5 -2
  182. package/dist/skill-command.d.ts.map +1 -1
  183. package/dist/skill-command.js +73 -10
  184. package/dist/skill-command.js.map +1 -1
  185. package/dist/skill-guidance.js +1 -1
  186. package/dist/skill-guidance.js.map +1 -1
  187. package/dist/skills.d.ts +2 -0
  188. package/dist/skills.d.ts.map +1 -1
  189. package/dist/skills.js +16 -11
  190. package/dist/skills.js.map +1 -1
  191. package/dist/status-health.d.ts +26 -0
  192. package/dist/status-health.d.ts.map +1 -0
  193. package/dist/status-health.js +49 -0
  194. package/dist/status-health.js.map +1 -0
  195. package/dist/telemetry.d.ts.map +1 -1
  196. package/dist/telemetry.js +2 -2
  197. package/dist/telemetry.js.map +1 -1
  198. package/dist/terminal-output.d.ts +76 -0
  199. package/dist/terminal-output.d.ts.map +1 -0
  200. package/dist/terminal-output.js +151 -0
  201. package/dist/terminal-output.js.map +1 -0
  202. package/dist/uninstall.d.ts.map +1 -1
  203. package/dist/uninstall.js +14 -32
  204. package/dist/uninstall.js.map +1 -1
  205. package/dist/update.d.ts +17 -1
  206. package/dist/update.d.ts.map +1 -1
  207. package/dist/update.js +150 -51
  208. package/dist/update.js.map +1 -1
  209. package/dist/windows-permissions.d.ts +6 -0
  210. package/dist/windows-permissions.d.ts.map +1 -1
  211. package/dist/windows-permissions.js +22 -2
  212. package/dist/windows-permissions.js.map +1 -1
  213. package/dist/windows-pty.d.ts.map +1 -1
  214. package/dist/windows-pty.js +4 -3
  215. package/dist/windows-pty.js.map +1 -1
  216. package/package.json +4 -4
@@ -0,0 +1,151 @@
1
+ import { homedir } from "node:os";
2
+ import { isAbsolute, relative, sep } from "node:path";
3
+ /**
4
+ * Set by `lore update` for the refresh it runs in the installed binary, whose
5
+ * stdout is a pipe: the parent's terminal decides how the child draws.
6
+ */
7
+ export const OUTPUT_STYLE_ENV = "LORE_OUTPUT_STYLE";
8
+ export const OUTPUT_COLUMNS_ENV = "LORE_OUTPUT_COLUMNS";
9
+ export const OUTPUT_VERBOSE_ENV = "LORE_OUTPUT_VERBOSE";
10
+ const MIN_WIDTH = 40;
11
+ const MAX_WIDTH = 100;
12
+ export const PLAIN_OUTPUT = { rich: false, width: Infinity, verbose: false, home: homedir() };
13
+ export function detectOutputStyle(options = {}) {
14
+ const environment = options.environment ?? process.env;
15
+ const stream = options.stream ?? process.stdout;
16
+ const forced = environment[OUTPUT_STYLE_ENV];
17
+ const terminal = forced === "rich" ? true : forced === "plain" ? false : stream.isTTY === true;
18
+ // https://no-color.org: present and not empty disables styling.
19
+ const noColor = (environment.NO_COLOR ?? "") !== "";
20
+ const rich = terminal && !noColor && environment.TERM !== "dumb";
21
+ // A parent Lore process passes its terminal's width with its style.
22
+ const columns = Number(environment[OUTPUT_COLUMNS_ENV]) || (terminal ? stream.columns || 80 : 0);
23
+ return {
24
+ rich,
25
+ width: columns > 0 ? Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, columns)) : Infinity,
26
+ verbose: options.verbose === true || environment[OUTPUT_VERBOSE_ENV] === "1",
27
+ home: options.home ?? homedir(),
28
+ };
29
+ }
30
+ /** The environment that makes a child Lore process draw like this one. */
31
+ export function outputStyleEnvironment(style) {
32
+ return {
33
+ [OUTPUT_STYLE_ENV]: style.rich ? "rich" : "plain",
34
+ ...(Number.isFinite(style.width) ? { [OUTPUT_COLUMNS_ENV]: String(style.width) } : {}),
35
+ ...(style.verbose ? { [OUTPUT_VERBOSE_ENV]: "1" } : {}),
36
+ };
37
+ }
38
+ const ESCAPE = /\u001b\[[0-9;]*m/gu;
39
+ // Joins the words of a command so wrapping never splits it.
40
+ const KEEP = " ";
41
+ const visibleLength = (text) => text.replace(ESCAPE, "").length;
42
+ /** `~/x` for a path inside the home folder; other paths unchanged. */
43
+ export function displayPath(path, home) {
44
+ const inside = relative(home, path);
45
+ if (inside === "")
46
+ return "~";
47
+ if (inside.startsWith("..") || isAbsolute(inside))
48
+ return path;
49
+ return `~${sep}${inside}`;
50
+ }
51
+ /** "A", "A and B", "A, B and C". */
52
+ export function listText(items) {
53
+ if (items.length <= 1)
54
+ return items.join("");
55
+ return `${items.slice(0, -1).join(", ")} and ${items.at(-1)}`;
56
+ }
57
+ /**
58
+ * Word-wrap `text` to `width`, starting with `prefix` and indenting the lines
59
+ * after it to the same column. Never breaks inside a word or a kept span.
60
+ */
61
+ export function wrap(text, width, prefix = "", indent = " ".repeat(visibleLength(prefix))) {
62
+ const words = text.split(" ").filter((word) => word !== "");
63
+ const lines = [];
64
+ let line = prefix;
65
+ let lineHasWord = false;
66
+ for (const word of words) {
67
+ if (lineHasWord && visibleLength(line) + 1 + visibleLength(word) > width) {
68
+ lines.push(line);
69
+ line = indent + word;
70
+ }
71
+ else {
72
+ line += (lineHasWord ? " " : "") + word;
73
+ }
74
+ lineHasWord = true;
75
+ }
76
+ lines.push(line);
77
+ return lines.map((value) => value.replaceAll(KEEP, " ").trimEnd());
78
+ }
79
+ /** Builds the lines of one command's output in a given style. */
80
+ export class Output {
81
+ style;
82
+ lines = [];
83
+ constructor(style) {
84
+ this.style = style;
85
+ }
86
+ paint(open, close, text) {
87
+ return this.style.rich && text !== "" ? `\u001b[${open}m${text}\u001b[${close}m` : text;
88
+ }
89
+ bold(text) { return this.paint("1", "22", text); }
90
+ dim(text) { return this.paint("2", "22", text); }
91
+ /** A command or other text the reader types: bold, and never wrapped apart. */
92
+ code(text) { return this.bold(text.replaceAll(" ", KEEP)); }
93
+ path(path) { return displayPath(path, this.style.home).replaceAll(" ", KEEP); }
94
+ /** " · " between short facts on one line. */
95
+ get separator() { return this.style.rich ? " · " : ", "; }
96
+ mark(kind) {
97
+ if (!this.style.rich)
98
+ return kind === "ok" ? "" : `${kind}: `;
99
+ return kind === "ok" ? `${this.paint("32", "39", "✓")} ` : kind === "warning" ? `${this.paint("33", "39", "!")} ` : `${this.paint("31", "39", "✗")} `;
100
+ }
101
+ /** An outcome line, flush left: "✓ Lore 0.2.27 is installed". */
102
+ outcome(kind, text) {
103
+ const mark = this.mark(kind);
104
+ // Plain warnings keep their "warning: " prefix; rich marks hang their text.
105
+ this.lines.push(...wrap(text, this.style.width, mark, this.style.rich ? " " : " ".repeat(visibleLength(mark))));
106
+ return this;
107
+ }
108
+ /** A secondary line under an outcome, indented and dim. */
109
+ note(text, indent = 2) {
110
+ const pad = " ".repeat(indent);
111
+ this.lines.push(...wrap(text, this.style.width, pad).map((line) => pad + this.dim(line.slice(indent))));
112
+ return this;
113
+ }
114
+ /** An indented line in normal weight. */
115
+ text(text, indent = 2) {
116
+ this.lines.push(...wrap(text, this.style.width, " ".repeat(indent)));
117
+ return this;
118
+ }
119
+ /** Two columns: a padded label and wrapped text that hangs under itself, after any mark. */
120
+ row(label, labelWidth, text, mark = "", indent = 2) {
121
+ const prefix = `${" ".repeat(indent)}${label.padEnd(labelWidth)} ${mark}`;
122
+ this.lines.push(...wrap(text, this.style.width, prefix));
123
+ return this;
124
+ }
125
+ /** A bold heading and its numbered steps; nothing when there are no steps. */
126
+ steps(heading, items) {
127
+ const unique = [...new Set(items)];
128
+ if (unique.length === 0)
129
+ return this;
130
+ this.blank().lines.push(this.bold(heading));
131
+ unique.forEach((item, index) => this.lines.push(...wrap(item, this.style.width, ` ${index + 1}. `)));
132
+ return this;
133
+ }
134
+ /** Lines printed exactly, for blocks the reader copies. */
135
+ verbatim(text) {
136
+ this.lines.push(...text.split("\n"));
137
+ return this;
138
+ }
139
+ blank() {
140
+ if (this.lines.length > 0 && this.lines.at(-1) !== "")
141
+ this.lines.push("");
142
+ return this;
143
+ }
144
+ get empty() { return this.lines.length === 0; }
145
+ toString() {
146
+ while (this.lines.at(-1) === "")
147
+ this.lines.pop();
148
+ return this.lines.length === 0 ? "" : `${this.lines.join("\n")}\n`;
149
+ }
150
+ }
151
+ //# sourceMappingURL=terminal-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-output.js","sourceRoot":"","sources":["../src/terminal-output.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,+kBAmB1B,CAAC;AAEF,UAAU,gBAAgB;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAqFD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BxG"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,+kBAmB1B,CAAC;AAEF,UAAU,gBAAgB;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAsED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BxG"}
package/dist/uninstall.js CHANGED
@@ -1,9 +1,9 @@
1
- import { spawn, isWindows, removeAfterExit, renameWindowsBinary } from "./platform.js";
1
+ import { isWindows, removeAfterExit, renameWindowsBinary } from "./platform.js";
2
+ import { assertNpmInstallationWritable, findGlobalNpmInstallation, npm, runningPackageDirectory } from "./npm-installation.js";
2
3
  import { constants } from "node:fs";
3
- import { access, readFile, realpath, stat, unlink } from "node:fs/promises";
4
- import { basename, dirname, resolve } from "node:path";
4
+ import { access, realpath, stat, unlink } from "node:fs/promises";
5
+ import { dirname } from "node:path";
5
6
  import { createInterface } from "node:readline/promises";
6
- import { fileURLToPath } from "node:url";
7
7
  import { IS_STANDALONE_BINARY } from "./version.js";
8
8
  export const UNINSTALL_HELP = `lore uninstall
9
9
  Disconnect this machine and remove the installed Lore CLI.
@@ -25,18 +25,8 @@ Examples:
25
25
  lore uninstall
26
26
  lore uninstall --yes
27
27
  `;
28
- async function npm(args) {
29
- return new Promise((done, reject) => {
30
- const child = spawn("npm", args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
31
- let output = "";
32
- const timer = setTimeout(() => { child.kill(); reject(new Error("npm timed out")); }, 60_000);
33
- child.stdout.on("data", chunk => { output += chunk; if (output.length > 1024 * 1024)
34
- child.kill(); });
35
- child.stderr.resume();
36
- child.once("error", error => { clearTimeout(timer); reject(error); });
37
- child.once("close", code => { clearTimeout(timer); code === 0 ? done(output.trim()) : reject(new Error("npm could not complete uninstall")); });
38
- });
39
- }
28
+ /** JSON quoting shows stray control characters, but keeps Windows separators single so the path can be copied. */
29
+ const quotedPath = (path) => JSON.stringify(path).replaceAll("\\\\", "\\");
40
30
  async function planUninstall(options) {
41
31
  if (options.isStandaloneBinary ?? IS_STANDALONE_BINARY) {
42
32
  const target = await realpath(options.execPath ?? process.execPath);
@@ -63,28 +53,20 @@ async function planUninstall(options) {
63
53
  },
64
54
  };
65
55
  }
66
- const target = await realpath(options.packageDirectory ?? fileURLToPath(new URL("..", import.meta.url)));
67
- const manifest = JSON.parse(await readFile(resolve(target, "package.json"), "utf8"));
68
- const modules = dirname(dirname(target));
56
+ const runNpm = options.runNpm ?? ((args) => npm(args, 60_000, "npm could not complete uninstall"));
57
+ const installation = await findGlobalNpmInstallation(options.packageDirectory ?? runningPackageDirectory(), runNpm);
69
58
  // Never remove a checkout, npx cache, project dependency, or another manager's store.
70
- if (manifest.name !== "@lore-co/cli" || basename(target) !== "cli" || basename(dirname(target)) !== "@lore-co" || basename(modules) !== "node_modules" || (!isWindows() && basename(dirname(modules)) !== "lib")) {
59
+ if (installation.kind === "other") {
71
60
  throw new Error("This is not a standalone or global npm installation. Run lore disconnect, then remove Lore with the package manager you used to install it.");
72
61
  }
73
- const prefix = isWindows() ? dirname(modules) : dirname(dirname(modules));
74
- const runNpm = options.runNpm ?? npm;
75
- const reportedRoot = (await runNpm(["root", "--global"])).trim();
76
- let reportedModules;
77
- try {
78
- reportedModules = await realpath(reportedRoot);
79
- }
80
- catch {
81
- throw new Error(`Could not verify the npm installation. Nothing was removed. npm's global directory could not be resolved: ${JSON.stringify(reportedRoot)}. Check "npm config get prefix" and retry with the npm configuration used to install Lore.`);
62
+ if (installation.kind === "unresolved") {
63
+ throw new Error(`Could not verify the npm installation. Nothing was removed. npm's global directory could not be resolved: ${quotedPath(installation.reportedRoot)}. Check "npm config get prefix" and retry with the npm configuration used to install Lore.`);
82
64
  }
83
- if (reportedModules !== modules) {
65
+ if (installation.kind === "mismatch") {
84
66
  throw new Error("Could not verify the npm installation. Nothing was removed.");
85
67
  }
86
- await access(dirname(target), constants.W_OK);
87
- await access(isWindows() ? prefix : resolve(prefix, "bin"), constants.W_OK);
68
+ const { target, prefix } = installation;
69
+ await assertNpmInstallationWritable(installation);
88
70
  return {
89
71
  kind: "npm", target,
90
72
  remove: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
package/dist/update.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { type OutputStyle } from "./terminal-output.js";
2
+ import { type RunNpm } from "./npm-installation.js";
1
3
  export type UpdateFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
2
4
  export interface UpdateCommandOptions {
3
5
  platform?: NodeJS.Platform;
@@ -8,7 +10,14 @@ export interface UpdateCommandOptions {
8
10
  execPath?: string;
9
11
  homeDirectory?: string;
10
12
  runVersion?: (path: string, timeoutMs: number) => Promise<string>;
13
+ /** Runs `internal refresh-integrations` with the installed CLI and returns its report. */
14
+ runRefresh?: (command: readonly string[], environment: NodeJS.ProcessEnv, timeoutMs: number) => Promise<string>;
15
+ /** The npm package directory this CLI runs from, when it is not a standalone binary. */
16
+ packageDirectory?: string;
17
+ runNpm?: RunNpm;
11
18
  writeOutput?: (message: string) => void;
19
+ /** How to draw the output; detected from stdout when omitted. */
20
+ style?: OutputStyle;
12
21
  }
13
22
  export declare function isReleaseTag(value: string): boolean;
14
23
  export declare function parseUpdateVersion(args: readonly string[]): string | undefined | null;
@@ -17,6 +26,13 @@ export declare function parseReleaseBaseUrl(repository: string, configuredBase?:
17
26
  export declare function buildReleaseAssetUrl(releaseBase: URL, tag: string, asset: string): URL;
18
27
  export declare function parseChecksumManifest(manifest: string, expectedAsset: string): string;
19
28
  export declare function resolveLatestReleaseTag(repository: string, fetcher?: UpdateFetch): Promise<string>;
20
- export declare function selectUpdateTarget(environment: NodeJS.ProcessEnv, isStandaloneBinary: boolean, execPath: string, homeDirectory: string, canWriteSystemBin?: () => Promise<boolean>, platform?: NodeJS.Platform): Promise<string>;
29
+ /**
30
+ * The standalone binary to replace, or null for a CLI installed with a
31
+ * package manager, which is updated through that package manager instead:
32
+ * installing a binary beside it would leave two copies, with the agent hooks
33
+ * on one and `lore` on PATH possibly the other. LORE_BIN_DIR installs a
34
+ * standalone binary on purpose.
35
+ */
36
+ export declare function selectUpdateTarget(environment: NodeJS.ProcessEnv, isStandaloneBinary: boolean, execPath: string, platform?: NodeJS.Platform): string | null;
21
37
  export declare function updateCommand(args: readonly string[], options?: UpdateCommandOptions): Promise<void>;
22
38
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAkDA,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,GAAG,SAAS,GAAG,IAAI,CAgB3B;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzE;AAmBD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,GAAG,CAoCL;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,GAAG,CAQL;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,MAAM,CAqBR;AAwDD,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,WAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAcD,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,CAAC,UAAU,EAC9B,kBAAkB,EAAE,OAAO,EAC3B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,iBAAiB,GAAE,MAAM,OAAO,CAAC,OAAO,CAOvC,EACD,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAAC,MAAM,CAAC,CAajB;AAuGD,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAqFf"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAqD,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EAAsH,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAmCxK,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,0FAA0F;IAC1F,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChH,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iEAAiE;IACjE,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,GAAG,SAAS,GAAG,IAAI,CAG3B;AAyBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzE;AAmBD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,GAAG,CAoCL;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,GAAG,CAQL;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,MAAM,CAqBR;AAwDD,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,WAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAcD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,CAAC,UAAU,EAC9B,kBAAkB,EAAE,OAAO,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,GAAG,IAAI,CAMf;AAkND,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiGf"}
package/dist/update.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { removeAfterExit, renameWindowsBinary } from "./platform.js";
2
2
  import { execFile } from "node:child_process";
3
3
  import { createHash, timingSafeEqual } from "node:crypto";
4
- import { constants } from "node:fs";
5
- import { access, chmod, mkdir, mkdtemp, readFile, rename, rm, writeFile, } from "node:fs/promises";
6
- import { homedir } from "node:os";
4
+ import { chmod, mkdir, mkdtemp, readFile, rename, rm, writeFile, } from "node:fs/promises";
7
5
  import { dirname, resolve } from "node:path";
8
6
  import { fileURLToPath } from "node:url";
9
7
  import { promisify } from "node:util";
10
8
  import { IS_STANDALONE_BINARY } from "./version.js";
9
+ import { Output, detectOutputStyle, outputStyleEnvironment } from "./terminal-output.js";
10
+ import { assertNpmInstallationWritable, findGlobalNpmInstallation, npm, runningPackageDirectory } from "./npm-installation.js";
11
11
  const DEFAULT_REPOSITORY = "treadiehq/lore-releases";
12
12
  const DOWNLOAD_TIMEOUT_MS = 15_000;
13
13
  const VERSION_CHECK_TIMEOUT_MS = 10_000;
@@ -20,10 +20,11 @@ const UPDATE_HELP = `lore update
20
20
  Install the latest Lore CLI binary, or a specific release.
21
21
 
22
22
  Usage:
23
- lore update [--version <tag>]
23
+ lore update [--version <tag>] [--verbose]
24
24
 
25
25
  Options:
26
- --version <tag> Release tag to install, for example v0.2.25
26
+ --version <tag> Release tag to install, for example v0.2.27
27
+ --verbose Also show where Lore is installed and each file refreshed
27
28
  -h, --help Show this help
28
29
 
29
30
  Environment:
@@ -31,18 +32,28 @@ Environment:
31
32
  LORE_RELEASE_BASE_URL HTTPS release mirror base
32
33
  LORE_BIN_DIR Directory for the standalone binary
33
34
 
35
+ A global npm installation is updated with npm.
36
+
34
37
  Examples:
35
38
  lore update
36
- lore update --version v0.2.25
39
+ lore update --version v0.2.27
37
40
  `;
38
41
  export function isReleaseTag(value) {
39
42
  return RELEASE_TAG_PATTERN.test(value);
40
43
  }
41
44
  export function parseUpdateVersion(args) {
45
+ const parsed = parseUpdateArguments(args);
46
+ return parsed === null ? null : parsed.version;
47
+ }
48
+ function parseUpdateArguments(args) {
42
49
  if (args.includes("--help") || args.includes("-h")) {
43
50
  process.stdout.write(UPDATE_HELP);
44
51
  return null;
45
52
  }
53
+ const verbose = args.includes("--verbose");
54
+ return { version: parseVersionArgument(args.filter((argument) => argument !== "--verbose")), verbose };
55
+ }
56
+ function parseVersionArgument(args) {
46
57
  if (args.length === 0) {
47
58
  return undefined;
48
59
  }
@@ -51,7 +62,7 @@ export function parseUpdateVersion(args) {
51
62
  if (version !== undefined && isReleaseTag(version)) {
52
63
  return version;
53
64
  }
54
- throw new Error("--version must be a release tag such as v0.2.25");
65
+ throw new Error("--version must be a release tag such as v0.2.27");
55
66
  }
56
67
  throw new Error("Unknown update options. Try: lore update --help");
57
68
  }
@@ -215,28 +226,19 @@ async function defaultRunVersion(path, timeoutMs) {
215
226
  });
216
227
  return result.stdout;
217
228
  }
218
- export async function selectUpdateTarget(environment, isStandaloneBinary, execPath, homeDirectory, canWriteSystemBin = async () => {
219
- try {
220
- await access("/usr/local/bin", constants.W_OK);
221
- return true;
222
- }
223
- catch {
224
- return false;
225
- }
226
- }, platform = process.platform) {
229
+ /**
230
+ * The standalone binary to replace, or null for a CLI installed with a
231
+ * package manager, which is updated through that package manager instead:
232
+ * installing a binary beside it would leave two copies, with the agent hooks
233
+ * on one and `lore` on PATH possibly the other. LORE_BIN_DIR installs a
234
+ * standalone binary on purpose.
235
+ */
236
+ export function selectUpdateTarget(environment, isStandaloneBinary, execPath, platform = process.platform) {
227
237
  const configuredDirectory = environment.LORE_BIN_DIR?.trim();
228
238
  if (configuredDirectory !== undefined && configuredDirectory !== "") {
229
239
  return resolve(configuredDirectory, platform === "win32" ? "lore.exe" : "lore");
230
240
  }
231
- if (isStandaloneBinary) {
232
- return execPath;
233
- }
234
- if (platform === "win32")
235
- return resolve(environment.LOCALAPPDATA || resolve(homeDirectory, "AppData/Local"), "Lore", "bin", "lore.exe");
236
- if (await canWriteSystemBin()) {
237
- return "/usr/local/bin/lore";
238
- }
239
- return resolve(homeDirectory, ".local", "bin", "lore");
241
+ return isStandaloneBinary ? execPath : null;
240
242
  }
241
243
  async function prepareStagingDirectory(target) {
242
244
  try {
@@ -307,52 +309,150 @@ async function replaceTarget(stagedBinary, target, platform) {
307
309
  throw new Error("Could not replace the Lore binary");
308
310
  }
309
311
  }
312
+ /** The first release whose binary has `lore internal refresh-integrations`. */
313
+ const REFRESH_COMMAND_VERSION = [0, 2, 26];
314
+ const REFRESH_TIMEOUT_MS = 120_000;
315
+ function hasRefreshCommand(version) {
316
+ const parts = /^(\d+)\.(\d+)\.(\d+)/u.exec(version)?.slice(1).map(Number) ?? [];
317
+ for (let index = 0; index < REFRESH_COMMAND_VERSION.length; index += 1) {
318
+ const part = parts[index] ?? 0;
319
+ if (part !== REFRESH_COMMAND_VERSION[index])
320
+ return part > REFRESH_COMMAND_VERSION[index];
321
+ }
322
+ return true;
323
+ }
324
+ async function defaultRunRefresh(command, environment, timeoutMs) {
325
+ try {
326
+ const result = await executeFile(command[0], [...command.slice(1), "internal", "refresh-integrations"], {
327
+ encoding: "utf8",
328
+ env: environment,
329
+ maxBuffer: 1024 * 1024,
330
+ timeout: timeoutMs,
331
+ windowsHide: true,
332
+ });
333
+ return result.stdout;
334
+ }
335
+ catch (error) {
336
+ // Surface the installed binary's own `Error: ...` line, not the exec wrapper's.
337
+ const stderr = error.stderr;
338
+ const detail = typeof stderr === "string"
339
+ ? stderr.trim().split(/\r?\n/u).find((line) => line.startsWith("Error: "))?.slice("Error: ".length)
340
+ : undefined;
341
+ throw new Error(detail ?? "the installed binary could not run the refresh");
342
+ }
343
+ }
310
344
  /**
311
- * Re-apply the Lore hook and MCP entries and the `lore` skill for the agents
312
- * in the stored connection so the new binary runs with current entries and no
313
- * reconnect. Skipped silently when nothing is connected.
345
+ * Re-apply the Lore hook and MCP entries, the skills, and the Lore agent for
346
+ * the stored connection so the new binary runs with current files and no
347
+ * reconnect. The refresh runs in the installed binary: this process bundles
348
+ * the previous version's files, so writing or comparing them here would leave
349
+ * stale files reported as current. Skipped silently when nothing is connected.
314
350
  */
315
- async function refreshStoredAgentEntries(homeDirectory, environment, version, writeOutput) {
316
- // Loaded on demand: cli.ts imports this module, and the refresh is only
351
+ async function refreshWithInstalledBinary(command, homeDirectory, environment, version, writeOutput, runRefresh, style) {
352
+ // Loaded on demand: cli.ts imports this module, and the check is only
317
353
  // needed once a binary has been replaced.
318
- const { getLorePaths, refreshAgentEntries } = await import("./cli.js");
319
- let refreshed;
354
+ const { getLorePaths, readConnectorConfig } = await import("./cli.js");
355
+ const connected = await readConnectorConfig(getLorePaths(homeDirectory, environment)).then((config) => config !== null, () => true);
356
+ if (!connected)
357
+ return;
358
+ if (!hasRefreshCommand(version)) {
359
+ const out = new Output(style);
360
+ writeOutput("\n" + out.steps("Next", [`Run ${out.code("lore connect")} once to refresh your agents for Lore ${version}.`]).toString());
361
+ return;
362
+ }
363
+ const childEnvironment = {
364
+ ...environment,
365
+ // The child's stdout is a pipe; it draws for this process's terminal instead.
366
+ ...outputStyleEnvironment(style),
367
+ ...(homeDirectory === undefined ? {} : { HOME: homeDirectory, USERPROFILE: homeDirectory }),
368
+ };
369
+ // A standalone parent may run with these set; they would turn the child into Bun itself.
370
+ delete childEnvironment.BUN_BE_BUN;
371
+ delete childEnvironment.BUN_OPTIONS;
372
+ let report;
320
373
  try {
321
- refreshed = await refreshAgentEntries(getLorePaths(homeDirectory, environment));
374
+ report = await runRefresh(command, childEnvironment, REFRESH_TIMEOUT_MS);
322
375
  }
323
376
  catch (error) {
324
377
  const detail = (error instanceof Error ? error.message : String(error)).replace(/\.$/u, "");
325
- throw new Error(`Lore ${version} is installed, but its agent entries could not be refreshed: ${detail}. Run lore connect to retry.`);
378
+ throw new Error(`Lore ${version} is installed, but its agent entries could not be refreshed: ${detail}. Run lore connect to refresh them.`);
326
379
  }
327
- if (refreshed === null) {
328
- return;
380
+ if (report !== "")
381
+ writeOutput(report.endsWith("\n") ? report : `${report}\n`);
382
+ }
383
+ const NPM_INSTALL_TIMEOUT_MS = 300_000;
384
+ /**
385
+ * Update a global npm installation in place with npm, then refresh with the
386
+ * package npm installed. Anything npm can't safely update for us, such as a
387
+ * pnpm install or a checkout, gets the command to run instead.
388
+ */
389
+ async function updateNpmInstallation(version, options, environment, writeOutput, style) {
390
+ const spec = `@lore-co/cli@${version === undefined ? "latest" : version.slice(1)}`;
391
+ const runNpm = options.runNpm ?? ((args) => npm(args, NPM_INSTALL_TIMEOUT_MS, `npm could not install ${spec}`));
392
+ const installation = await findGlobalNpmInstallation(options.packageDirectory ?? runningPackageDirectory(), runNpm)
393
+ .catch(() => ({ kind: "mismatch" }));
394
+ if (installation.kind === "other") {
395
+ throw new Error(`lore update can't update this installation. Update Lore with the package manager you installed it with, for example: pnpm add --global ${spec}`);
396
+ }
397
+ if (installation.kind !== "npm") {
398
+ throw new Error(`Could not verify the npm installation, so nothing was changed. Update Lore with: npm install -g ${spec}`);
399
+ }
400
+ try {
401
+ await assertNpmInstallationWritable(installation);
402
+ }
403
+ catch {
404
+ throw new Error(`Updating Lore needs permission to write to ${installation.prefix}, so nothing was changed. Update Lore with: npm install -g ${spec}`);
329
405
  }
330
- writeOutput(refreshed.changedFiles.length > 0
331
- ? `Refreshed Lore entries in ${refreshed.changedFiles.join(", ")}\n`
332
- : `Lore entries already current in ${refreshed.configFiles.join(", ")}\n`);
333
- if (refreshed.skillFiles.length > 0) {
334
- writeOutput(`Lore ${refreshed.skillFiles.length > 1 ? "skills" : "skill"} current at ${refreshed.skillFiles.join(", ")}\n`);
406
+ try {
407
+ await runNpm(["install", "--global", "--prefix", installation.prefix, "--ignore-scripts", spec]);
408
+ }
409
+ catch {
410
+ throw new Error(`npm could not install ${spec}. Run it yourself to see why: npm install -g ${spec}`);
411
+ }
412
+ let installed;
413
+ try {
414
+ installed = JSON.parse(await readFile(resolve(installation.target, "package.json"), "utf8")).version;
335
415
  }
336
- if (refreshed.agentFiles.length > 0) {
337
- writeOutput(`Lore agent current at ${refreshed.agentFiles.join(", ")}\n`);
416
+ catch {
417
+ installed = undefined;
338
418
  }
339
- for (const warning of refreshed.warnings) {
340
- writeOutput(`warning: ${warning}\n`);
419
+ if (typeof installed !== "string" || !isReleaseTag(`v${installed}`) || (version !== undefined && installed !== version.slice(1))) {
420
+ throw new Error(`npm finished, but ${spec} is not what is installed at ${installation.target}. Update Lore with: npm install -g ${spec}`);
341
421
  }
422
+ writeOutput(installedMessage(installed, installation.target, style));
423
+ await refreshWithInstalledBinary([process.execPath, resolve(installation.target, "dist", "cli.js")], options.homeDirectory, environment, installed, writeOutput, options.runRefresh ?? defaultRunRefresh, style);
424
+ }
425
+ /** The outcome line; --verbose adds where the binary or package lives. */
426
+ function installedMessage(version, location, style) {
427
+ const out = new Output(style).outcome("ok", `Lore ${version} is installed`);
428
+ if (style.verbose)
429
+ out.note(`at ${out.path(location)}`);
430
+ return out.toString();
342
431
  }
343
432
  export async function updateCommand(args, options = {}) {
344
- const version = parseUpdateVersion(args);
345
- if (version === null) {
433
+ const parsed = parseUpdateArguments(args);
434
+ if (parsed === null) {
346
435
  return;
347
436
  }
437
+ const version = parsed.version;
348
438
  const environment = options.environment ?? process.env;
439
+ const style = options.style ?? detectOutputStyle({
440
+ verbose: parsed.verbose,
441
+ environment,
442
+ ...(options.homeDirectory === undefined ? {} : { home: options.homeDirectory }),
443
+ });
349
444
  const platform = options.platform ?? process.platform;
350
445
  const repository = parseRepository(environment);
351
446
  const releaseBase = parseReleaseBaseUrl(repository, environment.LORE_RELEASE_BASE_URL);
352
447
  const asset = selectReleaseAsset(platform, options.arch ?? process.arch);
448
+ const writeOutput = options.writeOutput ?? ((message) => process.stdout.write(message));
449
+ const target = selectUpdateTarget(environment, options.isStandaloneBinary ?? IS_STANDALONE_BINARY, options.execPath ?? process.execPath, platform);
450
+ if (target === null) {
451
+ await updateNpmInstallation(version, options, environment, writeOutput, style);
452
+ return;
453
+ }
353
454
  const tag = version ??
354
455
  (await resolveLatestReleaseTag(repository, options.fetch ?? fetch));
355
- const target = await selectUpdateTarget(environment, options.isStandaloneBinary ?? IS_STANDALONE_BINARY, options.execPath ?? process.execPath, options.homeDirectory ?? homedir(), undefined, platform);
356
456
  const directory = await prepareStagingDirectory(target);
357
457
  const stagedBinary = resolve(directory, asset);
358
458
  try {
@@ -378,9 +478,8 @@ export async function updateCommand(args, options = {}) {
378
478
  throw new Error("The staged Lore binary version did not match the release tag");
379
479
  }
380
480
  await replaceTarget(stagedBinary, target, platform);
381
- const writeOutput = options.writeOutput ?? ((message) => process.stdout.write(message));
382
- writeOutput(`Updated Lore to ${expectedVersion} at ${target}\n`);
383
- await refreshStoredAgentEntries(options.homeDirectory, environment, expectedVersion, writeOutput);
481
+ writeOutput(installedMessage(expectedVersion, target, style));
482
+ await refreshWithInstalledBinary([target], options.homeDirectory, environment, expectedVersion, writeOutput, options.runRefresh ?? defaultRunRefresh, style);
384
483
  }
385
484
  finally {
386
485
  await rm(directory, { recursive: true, force: true }).catch(() => undefined);