@kenkaiiii/gg-editor 0.6.0 → 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 +1 @@
1
- {"version":3,"file":"doctor-runner.d.ts","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF"}
1
+ {"version":3,"file":"doctor-runner.d.ts","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"AA6DA,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrF"}
@@ -1,33 +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";
24
30
  import { createInterface } from "node:readline/promises";
25
31
  import chalk from "chalk";
26
32
  import { setStoredApiKey } from "./auth/api-keys.js";
27
- import { renderCliBanner } from "./cli-banner.js";
28
33
  import { runDoctor } from "./doctor.js";
29
34
  import { renderDoctorReport } from "./doctor-render.js";
30
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 = " ";
31
60
  /**
32
61
  * Top-level entry called by cli.ts.
33
62
  *
@@ -37,330 +66,246 @@ import { getPackageVersion } from "./version.js";
37
66
  */
38
67
  export async function runDoctorInteractive(opts = {}) {
39
68
  if (opts.all || opts.nonInteractive || !process.stdin.isTTY) {
40
- process.stdout.write(renderCliBanner({
41
- version: getPackageVersion(),
42
- screen: opts.onboarding ? "Welcome" : "Doctor",
43
- subtitle: opts.onboarding
44
- ? "One-time environment check. Re-run any time."
45
- : "Environment check. Re-run any time.",
46
- }));
47
69
  const report = runDoctor();
70
+ process.stdout.write(staticBanner(opts.onboarding === true));
48
71
  process.stdout.write(renderDoctorReport(report, { all: opts.all, onboarding: opts.onboarding }));
49
72
  return;
50
73
  }
51
- 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";
52
108
  }
53
- // ── ANSI screen primitives ─────────────────────────────────
54
- const ENTER_ALT = "\x1b[?1049h"; // switch to alternate screen buffer
55
- const EXIT_ALT = "\x1b[?1049l"; // back to main buffer
56
- const HIDE_CURSOR = "\x1b[?25l";
57
- const SHOW_CURSOR = "\x1b[?25h";
58
- const HOME = "\x1b[H"; // cursor top-left
59
- const CLEAR_BELOW = "\x1b[J"; // clear from cursor to end of screen
60
- // ── Interactive screen ─────────────────────────────────────
61
- async function mountInteractiveScreen(onboarding) {
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");
157
+ }
158
+ // ── Interactive selector ──────────────────────────────────
159
+ async function mountSelector(onboarding) {
62
160
  const stdout = process.stdout;
63
161
  const stdin = process.stdin;
64
- // Enter alternate buffer so we don't bury existing scrollback. On exit
65
- // we restore it cleanly. `runLogin` does its own variant — we use
66
- // alt-screen here because the doctor list can be tall.
67
- stdout.write(ENTER_ALT + HIDE_CURSOR);
68
- const skipped = new Set();
69
162
  let report = runDoctor();
70
- let actionable = report.checks.filter((c) => c.severity !== "info");
71
- let selectedIdx = pickFirstActionableIdx(actionable, skipped);
72
- let banner = renderBanner(report, onboarding);
73
- let footerNote = null;
74
- let footerNoteTimer = null;
75
- const setFooterNote = (text, color) => {
76
- if (footerNoteTimer)
77
- clearTimeout(footerNoteTimer);
78
- 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;
79
176
  draw();
80
- footerNoteTimer = setTimeout(() => {
81
- footerNote = null;
177
+ noteTimer = setTimeout(() => {
178
+ note = undefined;
82
179
  draw();
83
180
  }, 2500);
84
181
  };
85
182
  const reload = () => {
86
183
  report = runDoctor();
87
- actionable = report.checks.filter((c) => c.severity !== "info");
88
- banner = renderBanner(report, onboarding);
89
- if (selectedIdx >= actionable.length)
90
- selectedIdx = Math.max(0, actionable.length - 1);
91
- };
92
- const draw = () => {
93
- stdout.write(HOME + CLEAR_BELOW);
94
- stdout.write(banner);
95
- stdout.write(renderItemList(actionable, selectedIdx, skipped));
96
- stdout.write("\n");
97
- stdout.write(renderDetail(actionable[selectedIdx], stdout.columns ?? 80));
98
- stdout.write("\n");
99
- 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);
100
187
  };
101
188
  draw();
102
189
  stdin.setRawMode(true);
103
190
  stdin.resume();
104
- stdin.setEncoding("utf8");
105
191
  return new Promise((resolve) => {
106
192
  const cleanup = () => {
107
- if (footerNoteTimer)
108
- clearTimeout(footerNoteTimer);
193
+ if (noteTimer)
194
+ clearTimeout(noteTimer);
109
195
  stdin.removeListener("data", onData);
110
196
  stdin.setRawMode(false);
111
197
  stdin.pause();
112
- stdout.write(SHOW_CURSOR + EXIT_ALT);
113
- // After leaving alt-screen, print a one-line summary in the main
114
- // buffer so the user has something in scrollback.
115
- const totalActionable = actionable.length;
116
- const ok = actionable.filter((c) => c.status === "ok").length;
117
- if (ok === totalActionable) {
118
- process.stdout.write(chalk.green(" Nothing to fix. You're all good.") +
119
- 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"));
120
205
  }
121
206
  else {
122
- 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`));
123
208
  }
124
209
  resolve();
125
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
+ };
126
246
  const onData = (chunk) => {
127
- // Quit
128
- 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") {
129
250
  cleanup();
130
251
  return;
131
252
  }
132
253
  // ↑
133
- if (chunk === "\x1b[A" || chunk === "k") {
134
- if (selectedIdx > 0) {
135
- selectedIdx--;
136
- draw();
137
- }
254
+ if (key === "\x1b[A" && selectedIdx > 0) {
255
+ selectedIdx--;
256
+ draw();
138
257
  return;
139
258
  }
140
259
  // ↓
141
- if (chunk === "\x1b[B" || chunk === "j") {
142
- if (selectedIdx < actionable.length - 1) {
143
- selectedIdx++;
144
- draw();
145
- }
146
- return;
147
- }
148
- // s — skip current item this session (does NOT advance — user can
149
- // navigate with arrows. Skipped items stay in the list, just greyed).
150
- if (chunk === "s") {
151
- const cur = actionable[selectedIdx];
152
- if (cur && cur.status !== "ok") {
153
- skipped.add(cur.id);
154
- setFooterNote(`Skipped ${cur.label}`, "info");
155
- }
260
+ if (key === "\x1b[B" && selectedIdx < items.length - 1) {
261
+ selectedIdx++;
262
+ draw();
156
263
  return;
157
264
  }
158
- // r re-probe everything (e.g. after the user installed something
159
- // outside the doctor)
160
- if (chunk === "r") {
265
+ // r refresh
266
+ if (key === "r") {
161
267
  reload();
162
- setFooterNote("Re-probed", "ok");
268
+ flashNote("Refreshed");
163
269
  return;
164
270
  }
165
- // Enter install / prompt / no-op
166
- if (chunk === "\r" || chunk === "\n") {
167
- const cur = actionable[selectedIdx];
271
+ // Enter install / prompt / nothing
272
+ if (key === "\r" || key === "\n") {
273
+ const cur = items[selectedIdx];
168
274
  if (!cur)
169
275
  return;
170
276
  if (cur.status === "ok") {
171
- setFooterNote("Already done", "ok");
277
+ flashNote("Already done");
172
278
  return;
173
279
  }
174
280
  if (cur.installable) {
281
+ const inst = cur.installable;
175
282
  void runWithSubshell(async () => {
176
- const inst = cur.installable;
177
- process.stdout.write(chalk.dim(`\n Running: `) +
283
+ process.stdout.write(chalk.hex(TEXT_DIM)("Running: ") +
178
284
  chalk.cyan(`${inst.command} ${inst.args.join(" ")}`) +
179
285
  "\n\n");
180
286
  const code = await spawnInstall(inst.command, inst.args);
181
287
  if (code === 0) {
182
- process.stdout.write(chalk.green("\n Installed.\n"));
288
+ process.stdout.write(chalk.green("\n\u2713 Installed.\n"));
183
289
  return { ok: true };
184
290
  }
185
- process.stdout.write(chalk.red(`\n Install failed (exit ${code}).\n`));
186
- if (cur.fix) {
187
- for (const line of cur.fix.split("\n")) {
188
- process.stdout.write(" " + chalk.cyan(line) + "\n");
189
- }
190
- }
291
+ process.stdout.write(chalk.red(`\n\u2717 Install failed (exit ${code}).\n`));
191
292
  return { ok: false };
192
- }).then((result) => {
193
- if (result.ok)
194
- setFooterNote(`Installed ${cur.label}`, "ok");
195
293
  });
196
294
  return;
197
295
  }
198
296
  if (cur.prompt) {
199
- void runWithSubshell(async () => promptForSecret(cur.prompt)).then((result) => {
200
- if (result.ok)
201
- setFooterNote(`Saved ${cur.label}`, "ok");
202
- else
203
- setFooterNote("Cancelled", "info");
204
- });
297
+ const p = cur.prompt;
298
+ void runWithSubshell(async () => promptForSecret(p));
205
299
  return;
206
300
  }
207
- setFooterNote("No automatic fix — see Fix line above", "warn");
208
- return;
301
+ flashNote("No automatic fix");
209
302
  }
210
303
  };
211
- /**
212
- * Tear down alt-screen + raw-mode, run an async block with normal
213
- * stdio (so spawn / readline behave normally), then re-mount the
214
- * screen and re-attach the keypress listener. The async block
215
- * returns { ok } so the caller can flash the right footer note.
216
- */
217
- async function runWithSubshell(block) {
218
- stdout.write(SHOW_CURSOR + EXIT_ALT);
219
- stdin.setRawMode(false);
220
- stdin.pause();
221
- stdin.removeListener("data", onData);
222
- let result;
223
- try {
224
- result = await block();
225
- }
226
- catch (e) {
227
- process.stdout.write(chalk.red(`\n Error: ${e.message}\n`));
228
- result = { ok: false };
229
- }
230
- // Brief pause so the user sees the outcome before the screen
231
- // re-mounts and clears it. 600ms is enough to glance at ✓/✗.
232
- await new Promise((r) => setTimeout(r, 600));
233
- stdout.write(ENTER_ALT + HIDE_CURSOR);
234
- stdin.setRawMode(true);
235
- stdin.resume();
236
- stdin.on("data", onData);
237
- reload();
238
- const cur = actionable[selectedIdx];
239
- if (cur) {
240
- const newIdx = actionable.findIndex((c) => c.id === cur.id);
241
- selectedIdx = newIdx >= 0 ? newIdx : pickFirstActionableIdx(actionable, skipped);
242
- }
243
- draw();
244
- return result;
245
- }
246
304
  stdin.on("data", onData);
247
305
  });
248
306
  }
249
- // ── Render helpers ─────────────────────────────────────────
250
- function renderBanner(report, onboarding) {
251
- const total = report.checks.filter((c) => c.severity !== "info").length;
252
- const done = report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
253
- return renderCliBanner({
254
- version: getPackageVersion(),
255
- screen: onboarding ? "Welcome" : "Doctor",
256
- subtitle: `${done} of ${total} ready` + (onboarding ? " · first-run check" : ""),
257
- });
258
- }
259
- function renderItemList(items, selectedIdx, skipped) {
260
- const lines = [];
261
- for (let i = 0; i < items.length; i++) {
262
- const c = items[i];
263
- const isSelected = i === selectedIdx;
264
- const isSkipped = skipped.has(c.id);
265
- const checkbox = renderCheckbox(c, isSkipped);
266
- const label = c.label.padEnd(28);
267
- const detail = chalk.dim(c.detail);
268
- if (isSelected) {
269
- lines.push(" " + chalk.hex("#f97316")("❯ ") + checkbox + " " + chalk.bold(label) + " " + detail);
270
- }
271
- else {
272
- const baseColor = isSkipped ? chalk.hex("#475569") : chalk.reset;
273
- lines.push(" " + checkbox + " " + baseColor(label) + " " + detail);
274
- }
275
- }
276
- return lines.join("\n") + "\n";
277
- }
278
- function renderCheckbox(c, isSkipped) {
279
- if (c.status === "ok")
280
- return chalk.green("[✓]");
281
- if (c.status === "warn")
282
- return chalk.yellow("[!]");
283
- if (isSkipped)
284
- return chalk.dim("[—]");
285
- if (c.severity === "required" || c.severity === "block")
286
- return chalk.red("[✗]");
287
- return chalk.yellow("[○]");
288
- }
289
- /**
290
- * Render the detail block under the list. STRICTLY two lines:
291
- * - Why: <unlocks>
292
- * - Fix: <one-line action>
293
- *
294
- * No multi-line dumps; URLs / longer guidance live on the prompt's hint
295
- * (only shown during the actual prompt screen) or on the structured
296
- * installable's command. The static `--all` path renders the full
297
- * `fix` string; this interactive path is for the next single action.
298
- */
299
- function renderDetail(c, columns) {
300
- if (!c)
301
- return "";
302
- const lines = [];
303
- // Allow at least 60 chars even on a narrow / unknown-size terminal so
304
- // we never truncate the explanation into uselessness.
305
- const safeWidth = Math.max(60, columns) - 8;
306
- lines.push(" " + chalk.dim("Why: ") + truncate(c.unlocks, safeWidth));
307
- const action = nextAction(c);
308
- if (action) {
309
- lines.push(" " + chalk.dim("Fix: ") + action);
310
- }
311
- return lines.join("\n") + "\n";
312
- }
313
- /**
314
- * Single-line, ANSI-aware description of the next action for an item.
315
- * Returns undefined when status === ok.
316
- */
317
- function nextAction(c) {
318
- if (c.status === "ok")
319
- return undefined;
320
- if (c.installable) {
321
- const cmd = `${c.installable.command} ${c.installable.args.join(" ")}`;
322
- return chalk.cyan(cmd) + chalk.dim(" (press Enter)");
323
- }
324
- if (c.prompt) {
325
- return chalk.cyan(c.prompt.label) + chalk.dim(" (press Enter)");
326
- }
327
- // No structured action — fall back to the FIRST line of `fix` only.
328
- // We never render the multi-line tail here.
329
- if (c.fix) {
330
- const firstLine = c.fix.split("\n")[0].trim();
331
- return chalk.cyan(firstLine);
332
- }
333
- return undefined;
334
- }
335
- /**
336
- * Truncate a string to at most `max` columns. Adds an ellipsis when
337
- * truncated. Does NOT respect ANSI escapes — only call on plain text.
338
- */
339
- function truncate(s, max) {
340
- if (s.length <= max)
341
- return s;
342
- return s.slice(0, Math.max(0, max - 1)) + "\u2026";
343
- }
344
- function renderFooter(note) {
345
- const dim = chalk.dim;
346
- const primary = chalk.hex("#f97316");
347
- const keymap = " " +
348
- primary("↑↓") +
349
- dim(" navigate · ") +
350
- primary("Enter") +
351
- dim(" fix · ") +
352
- primary("s") +
353
- dim(" skip · ") +
354
- primary("r") +
355
- dim(" re-probe · ") +
356
- primary("q") +
357
- dim(" quit");
358
- if (!note)
359
- return keymap + "\n";
360
- const noteColor = note.color === "ok" ? chalk.green : note.color === "warn" ? chalk.yellow : chalk.cyan;
361
- return keymap + "\n " + noteColor(note.text) + "\n";
362
- }
363
- function pickFirstActionableIdx(items, skipped) {
307
+ // ── Helpers ───────────────────────────────────────────────
308
+ function pickFirstActionable(items) {
364
309
  // Priority: required-missing/warn → optional-warn → optional-missing → 0.
365
310
  const tiers = [
366
311
  { severity: "block", statuses: ["missing", "warn"] },
@@ -369,7 +314,7 @@ function pickFirstActionableIdx(items, skipped) {
369
314
  { severity: "optional", statuses: ["missing"] },
370
315
  ];
371
316
  for (const tier of tiers) {
372
- 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));
373
318
  if (idx >= 0)
374
319
  return idx;
375
320
  }
@@ -383,30 +328,24 @@ function spawnInstall(command, args) {
383
328
  });
384
329
  }
385
330
  /**
386
- * Prompt the user for a secret (API key / token), validate it, and
387
- * persist via setStoredApiKey. The user can hit Esc / blank-Enter to
388
- * cancel without writing anything.
331
+ * Prompt the user for a secret, validate it, persist via setStoredApiKey.
389
332
  *
390
- * Echoes the input as it's typed — these are API keys, not passwords
391
- * exposed to humans peering over the shoulder. Anyone with shell
392
- * access could just `cat ~/.gg/api-keys.json` anyway.
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.
393
336
  */
394
337
  async function promptForSecret(p) {
395
- const dim = chalk.dim;
396
- const primary = chalk.hex("#f97316");
397
- const accent = chalk.hex("#ec4899");
338
+ const dim = chalk.hex(TEXT_DIM);
339
+ const primary = chalk.hex(PRIMARY);
340
+ const accent = chalk.hex(ACCENT);
398
341
  process.stdout.write("\n " + primary.bold(p.label) + "\n");
399
- if (p.hint) {
342
+ if (p.hint)
400
343
  process.stdout.write(" " + dim(p.hint) + "\n");
401
- }
402
344
  process.stdout.write(" " + dim("(blank + Enter to cancel)") + "\n\n");
403
- const rl = createInterface({
404
- input: process.stdin,
405
- output: process.stdout,
406
- });
345
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
407
346
  try {
408
347
  for (let attempt = 0; attempt < 3; attempt++) {
409
- const value = (await rl.question(" " + accent(" "))).trim();
348
+ const value = (await rl.question(" " + accent("\u276f "))).trim();
410
349
  if (value.length === 0) {
411
350
  process.stdout.write(dim(" Cancelled.\n"));
412
351
  return { ok: false };
@@ -420,10 +359,10 @@ async function promptForSecret(p) {
420
359
  setStoredApiKey(p.store, value);
421
360
  }
422
361
  catch (e) {
423
- process.stdout.write(chalk.red(` Failed to save: ${e.message}\n`));
362
+ process.stdout.write(chalk.red(` \u2717 Failed to save: ${e.message}\n`));
424
363
  return { ok: false };
425
364
  }
426
- process.stdout.write(chalk.green(` Saved to ~/.gg/api-keys.json (chmod 600).\n`));
365
+ process.stdout.write(chalk.green(" \u2713 Saved to ~/.gg/api-keys.json (chmod 600).\n"));
427
366
  return { ok: true };
428
367
  }
429
368
  process.stdout.write(dim(" Too many invalid attempts. Cancelled.\n"));
@@ -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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"}
@@ -3,11 +3,11 @@ import type { AgentTool } from "@kenkaiiii/gg-agent";
3
3
  import type { VideoHost } from "../core/hosts/types.js";
4
4
  declare const OpenPageParams: z.ZodObject<{
5
5
  name: z.ZodEnum<{
6
- color: "color";
7
6
  media: "media";
8
7
  cut: "cut";
9
8
  edit: "edit";
10
9
  fusion: "fusion";
10
+ color: "color";
11
11
  fairlight: "fairlight";
12
12
  deliver: "deliver";
13
13
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/gg-editor",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "type": "module",
5
5
  "description": "CLI video editor agent. Drives DaVinci Resolve and Premiere Pro via API + hotkeys + GUI fallback.",
6
6
  "license": "MIT",
@@ -27,9 +27,9 @@
27
27
  "react": "^19.2.5",
28
28
  "ws": "^8.18.0",
29
29
  "zod": "^4.3.6",
30
- "@kenkaiiii/gg-ai": "4.3.85",
31
30
  "@kenkaiiii/gg-agent": "4.3.85",
32
- "@kenkaiiii/ggcoder": "4.3.85"
31
+ "@kenkaiiii/ggcoder": "4.3.85",
32
+ "@kenkaiiii/gg-ai": "4.3.85"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^25.6.0",