@kenkaiiii/gg-editor 0.5.1 → 0.6.1

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.
@@ -1,31 +1,62 @@
1
1
  /**
2
2
  * Interactive doctor screen.
3
3
  *
4
- * Modelled on the Task Pane and the login selector: full-screen clear on
5
- * entry, redraw-in-place on every keypress, a single vertical list with
6
- * status glyphs, footer keymap. No printing-down-the-page, no walls of
7
- * text, no scrollback pollution.
4
+ * Modelled directly on `@kenkaiiii/ggcoder/ui/login.tsx`'s
5
+ * `renderLoginSelector` so the look matches:
8
6
  *
9
- * ↑↓ navigate
10
- * Enter install / fix the selected item
11
- * s skip (just dismiss the install prompt and refocus)
12
- * r re-probe everything
13
- * q/Esc quit
7
+ * ▄▀▀▀ ▄▀▀▀ GG Editor v0.6.0 · By Ken Kai
8
+ * ▀█ ▀█ Doctor
9
+ * ▀▄▄▀ ▀▄▄▀ Environment check
14
10
  *
15
- * When the user hits Enter and the item carries an InstallableHint we
16
- * leave the screen, run the package manager with stdio inherited, then
17
- * re-mount the screen with a refreshed report.
11
+ * ffmpeg — v8.0.1
12
+ * ffprobe — v8.0.1
13
+ * OpenAI API key — not set
14
+ * ✓ Python 3 — v3.14.3
15
+ * …
18
16
  *
19
- * Items without a structured installer (env vars, OAuth login, opening
20
- * Resolve) just show the manual fix below the list — no wizard, no
21
- * forced advance.
17
+ * ↑↓ navigate · Enter fix · r refresh · Esc quit
18
+ *
19
+ * Mechanics:
20
+ * - `\x1b[s` saves the cursor on entry; `\x1b[u\x1b[J` restores +
21
+ * clears below for each redraw. No alt-screen buffer (we don't need
22
+ * it; the doctor is short and re-runnable).
23
+ * - On exit we restore + clear so terminal scrollback is preserved.
24
+ * - Enter on an installable runs the package manager directly via
25
+ * `spawn` (stdio inherited so the user sees output / answers
26
+ * prompts). Enter on a `prompt` opens an inline secret capture.
27
+ * - q / Esc / Ctrl+C → quit cleanly.
22
28
  */
23
29
  import { spawn } from "node:child_process";
30
+ import { createInterface } from "node:readline/promises";
24
31
  import chalk from "chalk";
25
- import { renderCliBanner } from "./cli-banner.js";
32
+ import { setStoredApiKey } from "./auth/api-keys.js";
26
33
  import { runDoctor } from "./doctor.js";
27
34
  import { renderDoctorReport } from "./doctor-render.js";
28
35
  import { getPackageVersion } from "./version.js";
36
+ const LOGO_LINES = [
37
+ " \u2584\u2580\u2580\u2580 \u2584\u2580\u2580\u2580",
38
+ " \u2588 \u2580\u2588 \u2588 \u2580\u2588",
39
+ " \u2580\u2584\u2584\u2580 \u2580\u2584\u2584\u2580",
40
+ ];
41
+ const GRADIENT = [
42
+ "#fbbf24",
43
+ "#f59e0b",
44
+ "#f97316",
45
+ "#ea580c",
46
+ "#dc2626",
47
+ "#e11d48",
48
+ "#db2777",
49
+ "#e11d48",
50
+ "#dc2626",
51
+ "#ea580c",
52
+ "#f97316",
53
+ "#f59e0b",
54
+ ];
55
+ const PRIMARY = "#f97316";
56
+ const ACCENT = "#ec4899";
57
+ const TEXT = "#e2e8f0";
58
+ const TEXT_DIM = "#64748b";
59
+ const GAP = " ";
29
60
  /**
30
61
  * Top-level entry called by cli.ts.
31
62
  *
@@ -35,267 +66,246 @@ import { getPackageVersion } from "./version.js";
35
66
  */
36
67
  export async function runDoctorInteractive(opts = {}) {
37
68
  if (opts.all || opts.nonInteractive || !process.stdin.isTTY) {
38
- process.stdout.write(renderCliBanner({
39
- version: getPackageVersion(),
40
- screen: opts.onboarding ? "Welcome" : "Doctor",
41
- subtitle: opts.onboarding
42
- ? "One-time environment check. Re-run any time."
43
- : "Environment check. Re-run any time.",
44
- }));
45
69
  const report = runDoctor();
70
+ process.stdout.write(staticBanner(opts.onboarding === true));
46
71
  process.stdout.write(renderDoctorReport(report, { all: opts.all, onboarding: opts.onboarding }));
47
72
  return;
48
73
  }
49
- await mountInteractiveScreen(opts.onboarding === true);
74
+ await mountSelector(opts.onboarding === true);
75
+ }
76
+ // ── Renderers ─────────────────────────────────────────────
77
+ function gradientLine(text) {
78
+ let result = "";
79
+ let colorIdx = 0;
80
+ for (const ch of text) {
81
+ if (ch === " ") {
82
+ result += ch;
83
+ }
84
+ else {
85
+ const color = GRADIENT[Math.min(colorIdx, GRADIENT.length - 1)];
86
+ result += chalk.hex(color)(ch);
87
+ colorIdx++;
88
+ }
89
+ }
90
+ return result;
91
+ }
92
+ function bannerLines(onboarding) {
93
+ const screen = onboarding ? "Welcome" : "Doctor";
94
+ const subtitle = onboarding ? "First-run environment check" : "Environment check — Enter to fix";
95
+ return [
96
+ gradientLine(LOGO_LINES[0]) +
97
+ GAP +
98
+ chalk.hex(PRIMARY).bold("GG Editor") +
99
+ chalk.hex(TEXT_DIM)(` v${getPackageVersion()}`) +
100
+ chalk.hex(TEXT_DIM)(" \u00b7 By ") +
101
+ chalk.hex(TEXT).bold("Ken Kai"),
102
+ gradientLine(LOGO_LINES[1]) + GAP + chalk.hex(ACCENT)(screen),
103
+ gradientLine(LOGO_LINES[2]) + GAP + chalk.hex(TEXT_DIM)(subtitle),
104
+ ];
105
+ }
106
+ function staticBanner(onboarding) {
107
+ return bannerLines(onboarding).join("\n") + "\n\n";
108
+ }
109
+ function statusGlyph(c) {
110
+ if (c.status === "ok")
111
+ return chalk.green("\u2713");
112
+ if (c.status === "warn")
113
+ return chalk.yellow("!");
114
+ if (c.severity === "required" || c.severity === "block")
115
+ return chalk.red("\u2717");
116
+ return chalk.yellow("\u25cb");
117
+ }
118
+ /**
119
+ * One line per item, modelled on login.tsx's provider rows.
120
+ *
121
+ * ❯ ✓ ffmpeg — v8.0.1
122
+ * ○ OpenAI API key — not set
123
+ *
124
+ * The `detail` is the right-side em-dash text (terse — see doctor.ts
125
+ * for the trimmed strings: "v8.0.1", "set", "not set", etc).
126
+ */
127
+ function renderItemLine(c, selected, status) {
128
+ const marker = selected ? chalk.hex(PRIMARY)("\u276f ") : " ";
129
+ const labelColor = status === "ok"
130
+ ? selected
131
+ ? chalk.hex(PRIMARY)
132
+ : chalk.hex(TEXT)
133
+ : selected
134
+ ? chalk.hex(PRIMARY).bold
135
+ : chalk.hex(TEXT);
136
+ const label = labelColor(c.label.padEnd(22));
137
+ return `${marker}${statusGlyph(c)} ${label}${chalk.hex(TEXT_DIM)(` \u2014 ${c.detail}`)}`;
138
+ }
139
+ function renderScreen(items, selectedIdx, onboarding, note) {
140
+ const lines = [...bannerLines(onboarding), ""];
141
+ for (let i = 0; i < items.length; i++) {
142
+ const c = items[i];
143
+ const status = c.status === "ok" ? "ok" : c.status === "warn" ? "warn" : "miss";
144
+ lines.push(renderItemLine(c, i === selectedIdx, status));
145
+ }
146
+ lines.push("");
147
+ if (note)
148
+ lines.push(" " + chalk.hex(ACCENT)(note));
149
+ lines.push(chalk.hex(TEXT_DIM)(" \u2191\u2193 navigate \u00b7 ") +
150
+ chalk.hex(PRIMARY)("Enter") +
151
+ chalk.hex(TEXT_DIM)(" fix \u00b7 ") +
152
+ chalk.hex(PRIMARY)("r") +
153
+ chalk.hex(TEXT_DIM)(" refresh \u00b7 ") +
154
+ chalk.hex(PRIMARY)("Esc") +
155
+ chalk.hex(TEXT_DIM)(" quit"));
156
+ return lines.join("\n");
50
157
  }
51
- // ── ANSI screen primitives ─────────────────────────────────
52
- const ENTER_ALT = "\x1b[?1049h"; // switch to alternate screen buffer
53
- const EXIT_ALT = "\x1b[?1049l"; // back to main buffer
54
- const HIDE_CURSOR = "\x1b[?25l";
55
- const SHOW_CURSOR = "\x1b[?25h";
56
- const HOME = "\x1b[H"; // cursor → top-left
57
- const CLEAR_BELOW = "\x1b[J"; // clear from cursor to end of screen
58
- // ── Interactive screen ─────────────────────────────────────
59
- async function mountInteractiveScreen(onboarding) {
158
+ // ── Interactive selector ──────────────────────────────────
159
+ async function mountSelector(onboarding) {
60
160
  const stdout = process.stdout;
61
161
  const stdin = process.stdin;
62
- // Enter alternate buffer so we don't bury existing scrollback. On exit
63
- // we restore it cleanly. `runLogin` does its own variant — we use
64
- // alt-screen here because the doctor list can be tall.
65
- stdout.write(ENTER_ALT + HIDE_CURSOR);
66
- const skipped = new Set();
67
162
  let report = runDoctor();
68
- let actionable = report.checks.filter((c) => c.severity !== "info");
69
- let selectedIdx = pickFirstActionableIdx(actionable, skipped);
70
- let banner = renderBanner(report, onboarding);
71
- let footerNote = null;
72
- let footerNoteTimer = null;
73
- const setFooterNote = (text, color) => {
74
- if (footerNoteTimer)
75
- clearTimeout(footerNoteTimer);
76
- footerNote = { text, color };
163
+ let items = report.checks.filter((c) => c.severity !== "info");
164
+ let selectedIdx = pickFirstActionable(items);
165
+ let note;
166
+ let noteTimer = null;
167
+ // Save cursor + draw, exactly like renderLoginSelector.
168
+ stdout.write("\n\x1b[s");
169
+ const draw = () => {
170
+ stdout.write("\x1b[u\x1b[J" + renderScreen(items, selectedIdx, onboarding, note) + "\n");
171
+ };
172
+ const flashNote = (text) => {
173
+ if (noteTimer)
174
+ clearTimeout(noteTimer);
175
+ note = text;
77
176
  draw();
78
- footerNoteTimer = setTimeout(() => {
79
- footerNote = null;
177
+ noteTimer = setTimeout(() => {
178
+ note = undefined;
80
179
  draw();
81
180
  }, 2500);
82
181
  };
83
182
  const reload = () => {
84
183
  report = runDoctor();
85
- actionable = report.checks.filter((c) => c.severity !== "info");
86
- banner = renderBanner(report, onboarding);
87
- if (selectedIdx >= actionable.length)
88
- selectedIdx = Math.max(0, actionable.length - 1);
89
- };
90
- const draw = () => {
91
- stdout.write(HOME + CLEAR_BELOW);
92
- stdout.write(banner);
93
- stdout.write(renderItemList(actionable, selectedIdx, skipped));
94
- stdout.write("\n");
95
- stdout.write(renderDetail(actionable[selectedIdx]));
96
- stdout.write("\n");
97
- stdout.write(renderFooter(footerNote));
184
+ items = report.checks.filter((c) => c.severity !== "info");
185
+ if (selectedIdx >= items.length)
186
+ selectedIdx = Math.max(0, items.length - 1);
98
187
  };
99
188
  draw();
100
189
  stdin.setRawMode(true);
101
190
  stdin.resume();
102
- stdin.setEncoding("utf8");
103
191
  return new Promise((resolve) => {
104
192
  const cleanup = () => {
105
- if (footerNoteTimer)
106
- clearTimeout(footerNoteTimer);
193
+ if (noteTimer)
194
+ clearTimeout(noteTimer);
107
195
  stdin.removeListener("data", onData);
108
196
  stdin.setRawMode(false);
109
197
  stdin.pause();
110
- stdout.write(SHOW_CURSOR + EXIT_ALT);
111
- // After leaving alt-screen, print a one-line summary in the main
112
- // buffer so the user has something in scrollback.
113
- const totalActionable = actionable.length;
114
- const ok = actionable.filter((c) => c.status === "ok").length;
115
- if (ok === totalActionable) {
116
- process.stdout.write(chalk.green(" Nothing to fix. You're all good.") +
117
- chalk.dim(" Run `ggeditor` to start.\n"));
198
+ // Wipe the selector display + leave a one-line summary in scrollback.
199
+ stdout.write("\x1b[u\x1b[J");
200
+ const total = items.length;
201
+ const ok = items.filter((c) => c.status === "ok").length;
202
+ if (ok === total) {
203
+ stdout.write(chalk.green("\u2713 Nothing to fix. You're all good.") +
204
+ chalk.hex(TEXT_DIM)(" Run `ggeditor` to start.\n"));
118
205
  }
119
206
  else {
120
- process.stdout.write(chalk.dim(`Doctor closed. ${ok}/${totalActionable} ready. Re-run \`ggeditor doctor\` any time.\n`));
207
+ stdout.write(chalk.hex(TEXT_DIM)(`Doctor closed. ${ok}/${total} ready. Re-run \`ggeditor doctor\` any time.\n`));
121
208
  }
122
209
  resolve();
123
210
  };
211
+ /**
212
+ * Tear down the selector, run an async block with normal stdio, then
213
+ * re-mount. Used for both install commands and secret prompts.
214
+ */
215
+ const runWithSubshell = async (block) => {
216
+ stdin.removeListener("data", onData);
217
+ stdin.setRawMode(false);
218
+ stdin.pause();
219
+ stdout.write("\x1b[u\x1b[J"); // wipe the selector
220
+ let result;
221
+ try {
222
+ result = await block();
223
+ }
224
+ catch (e) {
225
+ process.stdout.write(chalk.red(`\n Error: ${e.message}\n`));
226
+ result = { ok: false };
227
+ }
228
+ // Brief pause so the user sees the outcome.
229
+ await new Promise((r) => setTimeout(r, 600));
230
+ // Re-save cursor + redraw.
231
+ stdout.write("\n\x1b[s");
232
+ stdin.setRawMode(true);
233
+ stdin.resume();
234
+ stdin.on("data", onData);
235
+ reload();
236
+ const cur = items[selectedIdx];
237
+ if (cur) {
238
+ const newIdx = items.findIndex((c) => c.id === cur.id);
239
+ selectedIdx = newIdx >= 0 ? newIdx : pickFirstActionable(items);
240
+ }
241
+ if (result.ok)
242
+ flashNote(`Saved`);
243
+ else
244
+ draw();
245
+ };
124
246
  const onData = (chunk) => {
125
- // Quit
126
- if (chunk === "\x03" /* Ctrl+C */ || chunk === "q" || chunk === "\x1b") {
247
+ const key = chunk.toString();
248
+ // Esc / Ctrl+C / q quit
249
+ if (key === "\x1b" || key === "\x03" || key === "q") {
127
250
  cleanup();
128
251
  return;
129
252
  }
130
253
  // ↑
131
- if (chunk === "\x1b[A" || chunk === "k") {
132
- if (selectedIdx > 0) {
133
- selectedIdx--;
134
- draw();
135
- }
254
+ if (key === "\x1b[A" && selectedIdx > 0) {
255
+ selectedIdx--;
256
+ draw();
136
257
  return;
137
258
  }
138
259
  // ↓
139
- if (chunk === "\x1b[B" || chunk === "j") {
140
- if (selectedIdx < actionable.length - 1) {
141
- selectedIdx++;
142
- draw();
143
- }
260
+ if (key === "\x1b[B" && selectedIdx < items.length - 1) {
261
+ selectedIdx++;
262
+ draw();
144
263
  return;
145
264
  }
146
- // s skip current item this session (does NOT advance — user can
147
- // navigate with arrows. Skipped items stay in the list, just greyed).
148
- if (chunk === "s") {
149
- const cur = actionable[selectedIdx];
150
- if (cur && cur.status !== "ok") {
151
- skipped.add(cur.id);
152
- setFooterNote(`Skipped ${cur.label}`, "info");
153
- }
154
- return;
155
- }
156
- // r — re-probe everything (e.g. after the user installed something
157
- // outside the doctor)
158
- if (chunk === "r") {
265
+ // r refresh
266
+ if (key === "r") {
159
267
  reload();
160
- setFooterNote("Re-probed", "ok");
268
+ flashNote("Refreshed");
161
269
  return;
162
270
  }
163
- // Enter install or show fix instructions
164
- if (chunk === "\r" || chunk === "\n") {
165
- const cur = actionable[selectedIdx];
271
+ // Enter install / prompt / nothing
272
+ if (key === "\r" || key === "\n") {
273
+ const cur = items[selectedIdx];
166
274
  if (!cur)
167
275
  return;
168
276
  if (cur.status === "ok") {
169
- setFooterNote("Already done", "ok");
277
+ flashNote("Already done");
170
278
  return;
171
279
  }
172
280
  if (cur.installable) {
173
- // Tear down the screen, run the manager with full stdio so the
174
- // user sees + interacts with it directly, then re-mount.
175
- stdout.write(SHOW_CURSOR + EXIT_ALT);
176
- stdin.setRawMode(false);
177
- stdin.pause();
178
- stdin.removeListener("data", onData);
179
- process.stdout.write(chalk.dim(`\n Running: `) +
180
- chalk.cyan(`${cur.installable.command} ${cur.installable.args.join(" ")}`) +
181
- "\n\n");
182
- spawnInstall(cur.installable.command, cur.installable.args).then((code) => {
281
+ const inst = cur.installable;
282
+ void runWithSubshell(async () => {
283
+ process.stdout.write(chalk.hex(TEXT_DIM)("Running: ") +
284
+ chalk.cyan(`${inst.command} ${inst.args.join(" ")}`) +
285
+ "\n\n");
286
+ const code = await spawnInstall(inst.command, inst.args);
183
287
  if (code === 0) {
184
- process.stdout.write(chalk.green("\n Installed. Re-probing…\n"));
185
- }
186
- else {
187
- process.stdout.write(chalk.red(`\n ✗ Install failed (exit ${code}). You can fix it manually:\n`));
188
- if (cur.fix) {
189
- for (const line of cur.fix.split("\n")) {
190
- process.stdout.write(" " + chalk.cyan(line) + "\n");
191
- }
192
- }
193
- process.stdout.write("\n");
288
+ process.stdout.write(chalk.green("\n\u2713 Installed.\n"));
289
+ return { ok: true };
194
290
  }
195
- // Re-mount the screen.
196
- stdout.write(ENTER_ALT + HIDE_CURSOR);
197
- stdin.setRawMode(true);
198
- stdin.resume();
199
- stdin.on("data", onData);
200
- reload();
201
- // Reposition selection to the same id if it still exists.
202
- const newIdx = actionable.findIndex((c) => c.id === cur.id);
203
- if (newIdx >= 0)
204
- selectedIdx = newIdx;
205
- else
206
- selectedIdx = pickFirstActionableIdx(actionable, skipped);
207
- if (code === 0)
208
- setFooterNote(`Installed ${cur.label}`, "ok");
209
- draw();
291
+ process.stdout.write(chalk.red(`\n\u2717 Install failed (exit ${code}).\n`));
292
+ return { ok: false };
210
293
  });
211
294
  return;
212
295
  }
213
- // No installer — flash a hint that the fix is shown below.
214
- setFooterNote("See fix instructions below — run them in another terminal", "warn");
215
- return;
296
+ if (cur.prompt) {
297
+ const p = cur.prompt;
298
+ void runWithSubshell(async () => promptForSecret(p));
299
+ return;
300
+ }
301
+ flashNote("No automatic fix");
216
302
  }
217
303
  };
218
304
  stdin.on("data", onData);
219
305
  });
220
306
  }
221
- // ── Render helpers ─────────────────────────────────────────
222
- function renderBanner(report, onboarding) {
223
- const total = report.checks.filter((c) => c.severity !== "info").length;
224
- const done = report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
225
- return renderCliBanner({
226
- version: getPackageVersion(),
227
- screen: onboarding ? "Welcome" : "Doctor",
228
- subtitle: `${done} of ${total} ready` + (onboarding ? " · first-run check" : ""),
229
- });
230
- }
231
- function renderItemList(items, selectedIdx, skipped) {
232
- const lines = [];
233
- for (let i = 0; i < items.length; i++) {
234
- const c = items[i];
235
- const isSelected = i === selectedIdx;
236
- const isSkipped = skipped.has(c.id);
237
- const checkbox = renderCheckbox(c, isSkipped);
238
- const label = c.label.padEnd(28);
239
- const detail = chalk.dim(c.detail);
240
- if (isSelected) {
241
- lines.push(" " + chalk.hex("#f97316")("❯ ") + checkbox + " " + chalk.bold(label) + " " + detail);
242
- }
243
- else {
244
- const baseColor = isSkipped ? chalk.hex("#475569") : chalk.reset;
245
- lines.push(" " + checkbox + " " + baseColor(label) + " " + detail);
246
- }
247
- }
248
- return lines.join("\n") + "\n";
249
- }
250
- function renderCheckbox(c, isSkipped) {
251
- if (c.status === "ok")
252
- return chalk.green("[✓]");
253
- if (c.status === "warn")
254
- return chalk.yellow("[!]");
255
- if (isSkipped)
256
- return chalk.dim("[—]");
257
- if (c.severity === "required" || c.severity === "block")
258
- return chalk.red("[✗]");
259
- return chalk.yellow("[○]");
260
- }
261
- function renderDetail(c) {
262
- if (!c)
263
- return "";
264
- const lines = [];
265
- lines.push(" " + chalk.dim("Why: ") + c.unlocks);
266
- if (c.status !== "ok" && c.installable) {
267
- const cmdline = `${c.installable.command} ${c.installable.args.join(" ")}`;
268
- lines.push(" " + chalk.dim("Fix: ") + chalk.cyan(cmdline) + chalk.dim(" (press Enter)"));
269
- }
270
- else if (c.status !== "ok" && c.fix) {
271
- const firstLine = c.fix.split("\n")[0];
272
- lines.push(" " + chalk.dim("Fix: ") + chalk.cyan(firstLine));
273
- for (const line of c.fix.split("\n").slice(1)) {
274
- lines.push(" " + chalk.cyan(line));
275
- }
276
- }
277
- return lines.join("\n") + "\n";
278
- }
279
- function renderFooter(note) {
280
- const dim = chalk.dim;
281
- const primary = chalk.hex("#f97316");
282
- const keymap = " " +
283
- primary("↑↓") +
284
- dim(" navigate · ") +
285
- primary("Enter") +
286
- dim(" fix · ") +
287
- primary("s") +
288
- dim(" skip · ") +
289
- primary("r") +
290
- dim(" re-probe · ") +
291
- primary("q") +
292
- dim(" quit");
293
- if (!note)
294
- return keymap + "\n";
295
- const noteColor = note.color === "ok" ? chalk.green : note.color === "warn" ? chalk.yellow : chalk.cyan;
296
- return keymap + "\n " + noteColor(note.text) + "\n";
297
- }
298
- function pickFirstActionableIdx(items, skipped) {
307
+ // ── Helpers ───────────────────────────────────────────────
308
+ function pickFirstActionable(items) {
299
309
  // Priority: required-missing/warn → optional-warn → optional-missing → 0.
300
310
  const tiers = [
301
311
  { severity: "block", statuses: ["missing", "warn"] },
@@ -304,7 +314,7 @@ function pickFirstActionableIdx(items, skipped) {
304
314
  { severity: "optional", statuses: ["missing"] },
305
315
  ];
306
316
  for (const tier of tiers) {
307
- const idx = items.findIndex((c) => c.severity === tier.severity && tier.statuses.includes(c.status) && !skipped.has(c.id));
317
+ const idx = items.findIndex((c) => c.severity === tier.severity && tier.statuses.includes(c.status));
308
318
  if (idx >= 0)
309
319
  return idx;
310
320
  }
@@ -317,4 +327,49 @@ function spawnInstall(command, args) {
317
327
  child.on("error", () => resolve(1));
318
328
  });
319
329
  }
330
+ /**
331
+ * Prompt the user for a secret, validate it, persist via setStoredApiKey.
332
+ *
333
+ * Echoes input as it's typed — these are API keys, and node has no
334
+ * built-in masked-input primitive without dragging in a dep. Anyone
335
+ * with shell access could `cat ~/.gg/api-keys.json` anyway.
336
+ */
337
+ async function promptForSecret(p) {
338
+ const dim = chalk.hex(TEXT_DIM);
339
+ const primary = chalk.hex(PRIMARY);
340
+ const accent = chalk.hex(ACCENT);
341
+ process.stdout.write("\n " + primary.bold(p.label) + "\n");
342
+ if (p.hint)
343
+ process.stdout.write(" " + dim(p.hint) + "\n");
344
+ process.stdout.write(" " + dim("(blank + Enter to cancel)") + "\n\n");
345
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
346
+ try {
347
+ for (let attempt = 0; attempt < 3; attempt++) {
348
+ const value = (await rl.question(" " + accent("\u276f "))).trim();
349
+ if (value.length === 0) {
350
+ process.stdout.write(dim(" Cancelled.\n"));
351
+ return { ok: false };
352
+ }
353
+ const err = p.validate?.(value);
354
+ if (err) {
355
+ process.stdout.write(chalk.yellow(` ! ${err}\n`));
356
+ continue;
357
+ }
358
+ try {
359
+ setStoredApiKey(p.store, value);
360
+ }
361
+ catch (e) {
362
+ process.stdout.write(chalk.red(` \u2717 Failed to save: ${e.message}\n`));
363
+ return { ok: false };
364
+ }
365
+ process.stdout.write(chalk.green(" \u2713 Saved to ~/.gg/api-keys.json (chmod 600).\n"));
366
+ return { ok: true };
367
+ }
368
+ process.stdout.write(dim(" Too many invalid attempts. Cancelled.\n"));
369
+ return { ok: false };
370
+ }
371
+ finally {
372
+ rl.close();
373
+ }
374
+ }
320
375
  //# sourceMappingURL=doctor-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-runner.js","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor-runner.js","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"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"}