@kenkaiiii/gg-editor 0.4.1 → 0.5.0

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,15 +1,17 @@
1
1
  export interface DoctorRunOptions {
2
- /** Print the welcome banner instead of the plain doctor banner. */
2
+ /** Welcome banner instead of the plain doctor banner. */
3
3
  onboarding?: boolean;
4
- /** Show the full inventory and exit (no install prompts). */
4
+ /** Show the full inventory and exit (no interactive screen). */
5
5
  all?: boolean;
6
- /** Skip every prompt — print the report and exit. Useful in CI. */
6
+ /** Skip every prompt — print the report once and exit. CI-friendly. */
7
7
  nonInteractive?: boolean;
8
8
  }
9
9
  /**
10
- * Top-level entry. Renders the orange banner, then either
11
- * - prints the inventory (`all` or `nonInteractive`), OR
12
- * - walks the user through fixable items one at a time.
10
+ * Top-level entry called by cli.ts.
11
+ *
12
+ * - `--all` prints the static inventory, no screen.
13
+ * - non-TTY / `nonInteractive` → same.
14
+ * - everything else → mounts the interactive screen.
13
15
  */
14
16
  export declare function runDoctorInteractive(opts?: DoctorRunOptions): Promise<void>;
15
17
  //# sourceMappingURL=doctor-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-runner.d.ts","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF"}
1
+ {"version":3,"file":"doctor-runner.d.ts","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"AA6BA,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,208 +1,302 @@
1
1
  /**
2
- * Interactive doctor runner.
2
+ * Interactive doctor screen.
3
3
  *
4
- * Used by `ggeditor doctor` and the first-run onboarding flow. Walks
5
- * through actionable items one at a time:
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.
6
8
  *
7
- * - If the item carries an `installable` hint → ask "Install X? [Y/n]".
8
- * Yes spawn the package manager, stream output live, re-run the
9
- * doctor, move on. No → print the manual `fix` text, move on.
10
- * - If the item only has a `fix` string (manual setup, env var, etc.)
11
- * → print it and move on.
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
12
14
  *
13
- * The banner matches `runStatus`'s look ("GG Editor Doctor", orange-
14
- * bold, two-space indent, dim subline) so the three CLI commands
15
- * (auth/login/doctor) feel like one product.
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.
18
+ *
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.
16
22
  */
17
23
  import { spawn } from "node:child_process";
18
- import { createInterface } from "node:readline/promises";
19
24
  import chalk from "chalk";
20
25
  import { renderCliBanner } from "./cli-banner.js";
21
26
  import { runDoctor } from "./doctor.js";
22
27
  import { renderDoctorReport } from "./doctor-render.js";
23
28
  import { getPackageVersion } from "./version.js";
24
- const EDITOR_ACCENT = "#ec4899";
25
- const pink = chalk.hex(EDITOR_ACCENT);
26
29
  /**
27
- * Top-level entry. Renders the orange banner, then either
28
- * - prints the inventory (`all` or `nonInteractive`), OR
29
- * - walks the user through fixable items one at a time.
30
+ * Top-level entry called by cli.ts.
31
+ *
32
+ * - `--all` prints the static inventory, no screen.
33
+ * - non-TTY / `nonInteractive` → same.
34
+ * - everything else → mounts the interactive screen.
30
35
  */
31
36
  export async function runDoctorInteractive(opts = {}) {
32
- printBanner(opts.onboarding === true);
33
- // Non-interactive paths: just print and exit.
34
37
  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
+ }));
35
45
  const report = runDoctor();
36
46
  process.stdout.write(renderDoctorReport(report, { all: opts.all, onboarding: opts.onboarding }));
37
47
  return;
38
48
  }
39
- await walkActionableItems();
40
- }
41
- // ── Internals ──────────────────────────────────────────────
42
- function printBanner(onboarding) {
43
- process.stdout.write(renderCliBanner({
44
- version: getPackageVersion(),
45
- screen: onboarding ? "Welcome" : "Doctor",
46
- subtitle: onboarding
47
- ? "One-time environment check. Re-run any time."
48
- : "Environment check. Re-run any time.",
49
- }));
49
+ await mountInteractiveScreen(opts.onboarding === true);
50
50
  }
51
- /**
52
- * Walk through actionable items in priority order. After each step we
53
- * re-run the doctor so that successful installs unblock follow-on
54
- * checks (e.g. installing ffmpeg flips both ffmpeg + ffprobe to OK).
55
- */
56
- async function walkActionableItems() {
57
- const rl = createInterface({ input: process.stdin, output: process.stdout });
58
- // Track items the user has explicitly skipped this session so we
59
- // don't re-ask about them after every successful install.
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) {
60
+ const stdout = process.stdout;
61
+ 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);
60
66
  const skipped = new Set();
61
- try {
62
- for (let step = 0; step < 20; step++) {
63
- const report = runDoctor();
64
- const next = pickNextActionable(report, skipped);
65
- const total = countActionable(report);
66
- const done = countDone(report);
67
- if (!next) {
68
- // Either everything's clean or we've skipped everything we can.
69
- const cleanEverything = total === done;
70
- if (cleanEverything) {
71
- process.stdout.write(" " +
72
- chalk.green("✓ Nothing to fix. You're all good.") +
73
- chalk.dim(" Run `ggeditor` to start.\n\n"));
67
+ 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 };
77
+ draw();
78
+ footerNoteTimer = setTimeout(() => {
79
+ footerNote = null;
80
+ draw();
81
+ }, 2500);
82
+ };
83
+ const reload = () => {
84
+ 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));
98
+ };
99
+ draw();
100
+ stdin.setRawMode(true);
101
+ stdin.resume();
102
+ stdin.setEncoding("utf8");
103
+ return new Promise((resolve) => {
104
+ const cleanup = () => {
105
+ if (footerNoteTimer)
106
+ clearTimeout(footerNoteTimer);
107
+ stdin.removeListener("data", onData);
108
+ stdin.setRawMode(false);
109
+ 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"));
118
+ }
119
+ else {
120
+ process.stdout.write(chalk.dim(`Doctor closed. ${ok}/${totalActionable} ready. Re-run \`ggeditor doctor\` any time.\n`));
121
+ }
122
+ resolve();
123
+ };
124
+ const onData = (chunk) => {
125
+ // Quit
126
+ if (chunk === "\x03" /* Ctrl+C */ || chunk === "q" || chunk === "\x1b") {
127
+ cleanup();
128
+ return;
129
+ }
130
+ // ↑
131
+ if (chunk === "\x1b[A" || chunk === "k") {
132
+ if (selectedIdx > 0) {
133
+ selectedIdx--;
134
+ draw();
74
135
  }
75
- else {
76
- process.stdout.write(" " +
77
- chalk.dim(`Skipped the rest. ${done}/${total} ready. Re-run \`ggeditor doctor\` any time.\n\n`));
136
+ return;
137
+ }
138
+ //
139
+ if (chunk === "\x1b[B" || chunk === "j") {
140
+ if (selectedIdx < actionable.length - 1) {
141
+ selectedIdx++;
142
+ draw();
78
143
  }
79
144
  return;
80
145
  }
81
- const proceed = await handleItem(next, rl);
82
- // Always mark the current item as 'seen' so the loop advances.
83
- // It's only re-surfaced if a successful install would have flipped
84
- // its state to ok (in which case it wouldn't appear anyway).
85
- if (proceed !== "installed")
86
- skipped.add(next.id);
87
- if (proceed === "quit") {
88
- process.stdout.write(chalk.dim(" Done. Re-run `ggeditor doctor` any time.\n\n"));
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
+ }
89
154
  return;
90
155
  }
91
- }
92
- // Safety bound — should never hit this.
93
- process.stdout.write(chalk.dim(" Reached step limit. Re-run `ggeditor doctor` to continue.\n\n"));
94
- }
95
- finally {
96
- rl.close();
97
- }
156
+ // r — re-probe everything (e.g. after the user installed something
157
+ // outside the doctor)
158
+ if (chunk === "r") {
159
+ reload();
160
+ setFooterNote("Re-probed", "ok");
161
+ return;
162
+ }
163
+ // Enter — install or show fix instructions
164
+ if (chunk === "\r" || chunk === "\n") {
165
+ const cur = actionable[selectedIdx];
166
+ if (!cur)
167
+ return;
168
+ if (cur.status === "ok") {
169
+ setFooterNote("Already done", "ok");
170
+ return;
171
+ }
172
+ 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) => {
183
+ 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");
194
+ }
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();
210
+ });
211
+ return;
212
+ }
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;
216
+ }
217
+ };
218
+ stdin.on("data", onData);
219
+ });
98
220
  }
99
- async function handleItem(item, rl) {
100
- // Header: severity + label + detail.
101
- const tag = item.severity === "required" || item.severity === "block"
102
- ? chalk.red("required")
103
- : item.status === "warn"
104
- ? chalk.yellow("needs attention")
105
- : chalk.yellow("optional");
106
- process.stdout.write(` ${tag} · ${chalk.bold(item.label)} ${chalk.dim(" " + item.detail)}\n`);
107
- process.stdout.write(" " + chalk.dim(item.unlocks) + "\n\n");
108
- if (item.installable) {
109
- return await offerInstall(item, item.installable, rl);
110
- }
111
- // No structured installer print the manual fix and pause.
112
- if (item.fix) {
113
- process.stdout.write(chalk.dim(" Fix:\n"));
114
- for (const line of item.fix.split("\n")) {
115
- process.stdout.write(" " + chalk.cyan(line) + "\n");
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);
116
246
  }
117
- process.stdout.write("\n");
118
247
  }
119
- // ALWAYS pause so the user actually reads each item, even when there's
120
- // no installer to confirm. "y" continues, "n" stops the walkthrough,
121
- // "s" skips this item permanently for the session.
122
- const ans = await askContinue(rl);
123
- if (ans === "quit")
124
- return "quit";
125
- if (ans === "skip")
126
- return "skip";
127
- return "next";
248
+ return lines.join("\n") + "\n";
128
249
  }
129
- async function askContinue(rl) {
130
- const raw = (await rl.question(chalk.dim(" [Enter] continue · [s] skip · [q] quit ")))
131
- .trim()
132
- .toLowerCase();
133
- if (raw === "q" || raw === "quit" || raw === "exit")
134
- return "quit";
135
- if (raw === "s" || raw === "skip")
136
- return "skip";
137
- return "next";
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("[○]");
138
260
  }
139
- async function offerInstall(item, hint, rl) {
140
- const cmdline = `${hint.command} ${hint.args.join(" ")}`;
141
- process.stdout.write(` ${chalk.bold(hint.label)}\n`);
142
- process.stdout.write(` ${pink(cmdline)}\n`);
143
- if (hint.needsSudo) {
144
- process.stdout.write(chalk.dim(" (will prompt for your sudo password)\n"));
145
- }
146
- process.stdout.write("\n");
147
- const yes = await askYN(rl, " Install now?", "y");
148
- if (!yes) {
149
- if (item.fix) {
150
- process.stdout.write(chalk.dim(" Skipping. To install later:\n"));
151
- for (const line of item.fix.split("\n")) {
152
- process.stdout.write(" " + chalk.cyan(line) + "\n");
153
- }
154
- process.stdout.write("\n");
155
- }
156
- return "skip";
157
- }
158
- const exitCode = await spawnInstall(hint);
159
- if (exitCode === 0) {
160
- process.stdout.write(chalk.green(" ✓ Installed.\n\n"));
161
- // Don't add to `skipped`: a successful install should make the
162
- // re-probe pass, removing the item from the priority list naturally.
163
- return "installed";
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)"));
164
269
  }
165
- process.stdout.write(chalk.red(` ✗ Install failed (exit ${exitCode}).`) + chalk.dim(" You can fix it manually:\n"));
166
- if (item.fix) {
167
- for (const line of item.fix.split("\n")) {
168
- process.stdout.write(" " + chalk.cyan(line) + "\n");
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));
169
275
  }
170
276
  }
171
- process.stdout.write("\n");
172
- return "skip";
277
+ return lines.join("\n") + "\n";
173
278
  }
174
- function spawnInstall(hint) {
175
- return new Promise((resolve) => {
176
- const child = spawn(hint.command, hint.args, {
177
- stdio: "inherit", // user sees + interacts with the manager directly
178
- });
179
- child.on("close", (code) => resolve(code ?? 1));
180
- child.on("error", () => resolve(1));
181
- });
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";
182
297
  }
183
- async function askYN(rl, prompt, defaultAns) {
184
- const suffix = defaultAns === "y" ? chalk.dim(" [Y/n] ") : chalk.dim(" [y/N] ");
185
- const raw = (await rl.question(prompt + suffix)).trim().toLowerCase();
186
- if (raw === "")
187
- return defaultAns === "y";
188
- if (raw === "y" || raw === "yes")
189
- return true;
190
- if (raw === "n" || raw === "no")
191
- return false;
192
- // Anything else: re-ask once, then fall through to default.
193
- const retry = (await rl.question(chalk.dim(' Please answer "y" or "n": '))).trim().toLowerCase();
194
- if (retry === "y" || retry === "yes")
195
- return true;
196
- if (retry === "n" || retry === "no")
197
- return false;
198
- return defaultAns === "y";
199
- }
200
- /**
201
- * Pick the next actionable item (block > required > optional-warn >
202
- * optional-missing) that the user hasn't already skipped this session.
203
- * Info-severity items are never returned.
204
- */
205
- function pickNextActionable(report, skipped) {
298
+ function pickFirstActionableIdx(items, skipped) {
299
+ // Priority: required-missing/warn optional-warn optional-missing 0.
206
300
  const tiers = [
207
301
  { severity: "block", statuses: ["missing", "warn"] },
208
302
  { severity: "required", statuses: ["missing", "warn"] },
@@ -210,16 +304,17 @@ function pickNextActionable(report, skipped) {
210
304
  { severity: "optional", statuses: ["missing"] },
211
305
  ];
212
306
  for (const tier of tiers) {
213
- const hit = report.checks.find((c) => c.severity === tier.severity && tier.statuses.includes(c.status) && !skipped.has(c.id));
214
- if (hit)
215
- return hit;
307
+ const idx = items.findIndex((c) => c.severity === tier.severity && tier.statuses.includes(c.status) && !skipped.has(c.id));
308
+ if (idx >= 0)
309
+ return idx;
216
310
  }
217
- return undefined;
311
+ return 0;
218
312
  }
219
- function countActionable(report) {
220
- return report.checks.filter((c) => c.severity !== "info").length;
221
- }
222
- function countDone(report) {
223
- return report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
313
+ function spawnInstall(command, args) {
314
+ return new Promise((resolve) => {
315
+ const child = spawn(command, args, { stdio: "inherit" });
316
+ child.on("close", (code) => resolve(code ?? 1));
317
+ child.on("error", () => resolve(1));
318
+ });
224
319
  }
225
320
  //# 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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"}
@@ -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";
6
7
  media: "media";
7
8
  cut: "cut";
8
9
  edit: "edit";
9
10
  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.4.1",
3
+ "version": "0.5.0",
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",
@@ -28,8 +28,8 @@
28
28
  "ws": "^8.18.0",
29
29
  "zod": "^4.3.6",
30
30
  "@kenkaiiii/gg-agent": "4.3.84",
31
- "@kenkaiiii/gg-ai": "4.3.84",
32
- "@kenkaiiii/ggcoder": "4.3.84"
31
+ "@kenkaiiii/ggcoder": "4.3.84",
32
+ "@kenkaiiii/gg-ai": "4.3.84"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^25.6.0",