@kenkaiiii/gg-editor 0.2.0 → 0.4.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.
@@ -0,0 +1,151 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { renderDoctorReport } from "./doctor-render.js";
3
+ /**
4
+ * Strip ANSI escape sequences so assertions don't depend on chalk's
5
+ * runtime behavior (it auto-disables colors when stdout isn't a TTY).
6
+ * The pattern matches CSI sequences like \x1b[31m, \x1b[0m, etc.
7
+ */
8
+ // eslint-disable-next-line no-control-regex
9
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
10
+ const strip = (s) => s.replace(ANSI_RE, "");
11
+ function check(id, severity, status, fix) {
12
+ return {
13
+ id,
14
+ label: id,
15
+ severity,
16
+ status,
17
+ detail: status === "ok" ? "found" : "missing",
18
+ unlocks: `What ${id} unlocks.`,
19
+ fix,
20
+ };
21
+ }
22
+ function report(checks) {
23
+ return {
24
+ checks,
25
+ ready: checks.every((c) => c.severity !== "required" || c.status === "ok"),
26
+ markerPath: "/tmp/.gg/onboarded-ggeditor",
27
+ onboarded: false,
28
+ };
29
+ }
30
+ describe("renderDoctorReport — focused mode (default)", () => {
31
+ it("shows 'Nothing to fix' when every actionable check passes", () => {
32
+ const r = report([
33
+ check("ffmpeg", "required", "ok"),
34
+ check("auth", "required", "ok"),
35
+ check("openai", "optional", "ok"),
36
+ check("info-only", "info", "missing"), // info doesn't count
37
+ ]);
38
+ const out = strip(renderDoctorReport(r));
39
+ expect(out).toContain("Nothing to fix");
40
+ expect(out).toContain("ggeditor");
41
+ // Should NOT show any individual check details when everything's ok.
42
+ expect(out).not.toContain("Why it matters");
43
+ expect(out).not.toContain("Fix");
44
+ });
45
+ it("surfaces a missing required item before any optional one", () => {
46
+ const r = report([
47
+ check("openai", "optional", "missing", "set OPENAI_API_KEY"),
48
+ check("ffmpeg", "required", "missing", "brew install ffmpeg"),
49
+ ]);
50
+ const out = strip(renderDoctorReport(r));
51
+ // Required headings should mention 'required'.
52
+ expect(out).toContain("required");
53
+ // The missing required item should be the focal point — its
54
+ // label appears as the heading-bold thing.
55
+ expect(out).toContain("ffmpeg");
56
+ expect(out).toContain("brew install ffmpeg");
57
+ // The optional item should NOT be rendered as the focal point.
58
+ expect(out).not.toContain("set OPENAI_API_KEY");
59
+ });
60
+ it("falls back to optional items only when no required is missing", () => {
61
+ const r = report([
62
+ check("ffmpeg", "required", "ok"),
63
+ check("ffprobe", "required", "ok"),
64
+ check("openai", "optional", "missing", "set OPENAI_API_KEY"),
65
+ ]);
66
+ const out = strip(renderDoctorReport(r));
67
+ expect(out).toContain("optional");
68
+ expect(out).toContain("openai");
69
+ expect(out).toContain("set OPENAI_API_KEY");
70
+ });
71
+ it("never picks an info-severity item as the focal point", () => {
72
+ const r = report([
73
+ check("ffmpeg", "required", "ok"),
74
+ check("auth", "required", "ok"),
75
+ check("anthropic-key", "info", "missing", "should not surface"),
76
+ ]);
77
+ const out = strip(renderDoctorReport(r));
78
+ expect(out).toContain("Nothing to fix");
79
+ expect(out).not.toContain("should not surface");
80
+ });
81
+ it("prefers warn over plain missing within the optional tier", () => {
82
+ const r = report([
83
+ check("ffmpeg", "required", "ok"),
84
+ check("openai", "optional", "missing", "set OPENAI_API_KEY"),
85
+ check("whisperx", "optional", "warn", "set HF_TOKEN"),
86
+ ]);
87
+ const out = strip(renderDoctorReport(r));
88
+ // The warn item should be the focal point.
89
+ expect(out).toContain("set HF_TOKEN");
90
+ expect(out).not.toContain("set OPENAI_API_KEY");
91
+ });
92
+ it("renders a progress bar showing how many items are ready", () => {
93
+ const r = report([
94
+ check("ffmpeg", "required", "ok"),
95
+ check("ffprobe", "required", "ok"),
96
+ check("auth", "required", "missing", "ggeditor login"),
97
+ check("openai", "optional", "missing", "set OPENAI_API_KEY"),
98
+ ]);
99
+ const out = strip(renderDoctorReport(r));
100
+ // 2 of 4 actionable items pass.
101
+ expect(out).toContain("2 of 4 ready");
102
+ });
103
+ it("does not output multiple checks at once in focused mode", () => {
104
+ const r = report([
105
+ check("ffmpeg", "required", "missing", "brew install ffmpeg"),
106
+ check("ffprobe", "required", "missing", "brew install ffmpeg"),
107
+ check("auth", "required", "missing", "ggeditor login"),
108
+ ]);
109
+ const out = strip(renderDoctorReport(r));
110
+ // Exactly ONE 'Why it matters' block — one focal item at a time.
111
+ const matters = out.match(/Why it matters/g) ?? [];
112
+ expect(matters.length).toBe(1);
113
+ });
114
+ });
115
+ describe("renderDoctorReport — all mode (--all)", () => {
116
+ it("lists every actionable check grouped by severity", () => {
117
+ const r = report([
118
+ check("ffmpeg", "required", "ok"),
119
+ check("ffprobe", "required", "missing", "brew install ffmpeg"),
120
+ check("openai", "optional", "missing", "set OPENAI_API_KEY"),
121
+ check("anthropic-key", "info", "missing"),
122
+ ]);
123
+ const out = strip(renderDoctorReport(r, { all: true }));
124
+ expect(out).toContain("Required");
125
+ expect(out).toContain("Optional");
126
+ expect(out).toContain("Info");
127
+ expect(out).toContain("ffmpeg");
128
+ expect(out).toContain("ffprobe");
129
+ expect(out).toContain("openai");
130
+ expect(out).toContain("anthropic-key");
131
+ });
132
+ it("ends with 'Nothing to fix' summary when everything is ok", () => {
133
+ const r = report([
134
+ check("ffmpeg", "required", "ok"),
135
+ check("auth", "required", "ok"),
136
+ check("openai", "optional", "ok"),
137
+ ]);
138
+ const out = strip(renderDoctorReport(r, { all: true }));
139
+ expect(out).toContain("Nothing to fix");
140
+ });
141
+ it("ends with a 'Next: <label>' summary when there's something to fix", () => {
142
+ const r = report([
143
+ check("ffmpeg", "required", "ok"),
144
+ check("auth", "required", "missing", "ggeditor login"),
145
+ ]);
146
+ const out = strip(renderDoctorReport(r, { all: true }));
147
+ expect(out).toContain("Next:");
148
+ expect(out).toContain("auth");
149
+ });
150
+ });
151
+ //# sourceMappingURL=doctor-render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-render.test.js","sourceRoot":"","sources":["../../src/core/doctor-render.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface DoctorRunOptions {
2
+ /** Print the welcome banner instead of the plain doctor banner. */
3
+ onboarding?: boolean;
4
+ /** Show the full inventory and exit (no install prompts). */
5
+ all?: boolean;
6
+ /** Skip every prompt — print the report and exit. Useful in CI. */
7
+ nonInteractive?: boolean;
8
+ }
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.
13
+ */
14
+ export declare function runDoctorInteractive(opts?: DoctorRunOptions): Promise<void>;
15
+ //# sourceMappingURL=doctor-runner.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Interactive doctor runner.
3
+ *
4
+ * Used by `ggeditor doctor` and the first-run onboarding flow. Walks
5
+ * through actionable items one at a time:
6
+ *
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.
12
+ *
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.
16
+ */
17
+ import { spawn } from "node:child_process";
18
+ import { createInterface } from "node:readline/promises";
19
+ import chalk from "chalk";
20
+ import { renderCliBanner } from "./cli-banner.js";
21
+ import { runDoctor } from "./doctor.js";
22
+ import { renderDoctorReport } from "./doctor-render.js";
23
+ import { getPackageVersion } from "./version.js";
24
+ const EDITOR_ACCENT = "#ec4899";
25
+ const pink = chalk.hex(EDITOR_ACCENT);
26
+ /**
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
+ */
31
+ export async function runDoctorInteractive(opts = {}) {
32
+ printBanner(opts.onboarding === true);
33
+ // Non-interactive paths: just print and exit.
34
+ if (opts.all || opts.nonInteractive || !process.stdin.isTTY) {
35
+ const report = runDoctor();
36
+ process.stdout.write(renderDoctorReport(report, { all: opts.all, onboarding: opts.onboarding }));
37
+ return;
38
+ }
39
+ await walkActionableItems(opts.onboarding === true);
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
+ }));
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(onboarding) {
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.
60
+ 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"));
74
+ }
75
+ else {
76
+ process.stdout.write(" " +
77
+ chalk.dim(`Skipped the rest. ${done}/${total} ready. Re-run \`ggeditor doctor\` any time.\n\n`));
78
+ }
79
+ return;
80
+ }
81
+ const proceed = await handleItem(next, rl, onboarding);
82
+ if (proceed === "skip")
83
+ skipped.add(next.id);
84
+ if (proceed === "quit") {
85
+ process.stdout.write(chalk.dim(" Done. Re-run `ggeditor doctor` any time.\n\n"));
86
+ return;
87
+ }
88
+ }
89
+ // Safety bound — should never hit this.
90
+ process.stdout.write(chalk.dim(" Reached step limit. Re-run `ggeditor doctor` to continue.\n\n"));
91
+ }
92
+ finally {
93
+ rl.close();
94
+ }
95
+ }
96
+ async function handleItem(item, rl, onboarding) {
97
+ // Header: severity + label + detail.
98
+ const tag = item.severity === "required" || item.severity === "block"
99
+ ? chalk.red("required")
100
+ : item.status === "warn"
101
+ ? chalk.yellow("needs attention")
102
+ : chalk.yellow("optional");
103
+ process.stdout.write(` ${tag} · ${chalk.bold(item.label)} ${chalk.dim("— " + item.detail)}\n`);
104
+ process.stdout.write(" " + chalk.dim(item.unlocks) + "\n\n");
105
+ if (item.installable) {
106
+ return await offerInstall(item, item.installable, rl);
107
+ }
108
+ // No structured installer — print the manual fix and move on.
109
+ if (item.fix) {
110
+ process.stdout.write(chalk.dim(" Fix:\n"));
111
+ for (const line of item.fix.split("\n")) {
112
+ process.stdout.write(" " + chalk.cyan(line) + "\n");
113
+ }
114
+ process.stdout.write("\n");
115
+ }
116
+ // For required items without a structured installer (e.g. auth →
117
+ // `ggeditor login`) we ask whether to keep going. For optional ones
118
+ // we just move on.
119
+ if (item.severity === "required" || item.severity === "block") {
120
+ const ans = await askYN(rl, " Continue to the next item?", "y");
121
+ return ans ? "next" : "quit";
122
+ }
123
+ // Onboarding mode: pause briefly so the user reads the fix.
124
+ if (onboarding) {
125
+ const ans = await askYN(rl, " Continue?", "y");
126
+ return ans ? "next" : "quit";
127
+ }
128
+ return "next";
129
+ }
130
+ async function offerInstall(item, hint, rl) {
131
+ const cmdline = `${hint.command} ${hint.args.join(" ")}`;
132
+ process.stdout.write(` ${chalk.bold(hint.label)}\n`);
133
+ process.stdout.write(` ${pink(cmdline)}\n`);
134
+ if (hint.needsSudo) {
135
+ process.stdout.write(chalk.dim(" (will prompt for your sudo password)\n"));
136
+ }
137
+ process.stdout.write("\n");
138
+ const yes = await askYN(rl, " Install now?", "y");
139
+ if (!yes) {
140
+ if (item.fix) {
141
+ process.stdout.write(chalk.dim(" Skipping. To install later:\n"));
142
+ for (const line of item.fix.split("\n")) {
143
+ process.stdout.write(" " + chalk.cyan(line) + "\n");
144
+ }
145
+ process.stdout.write("\n");
146
+ }
147
+ return "skip";
148
+ }
149
+ const exitCode = await spawnInstall(hint);
150
+ if (exitCode === 0) {
151
+ process.stdout.write(chalk.green(" ✓ Installed.\n\n"));
152
+ return "next";
153
+ }
154
+ process.stdout.write(chalk.red(` ✗ Install failed (exit ${exitCode}).`) + chalk.dim(" You can fix it manually:\n"));
155
+ if (item.fix) {
156
+ for (const line of item.fix.split("\n")) {
157
+ process.stdout.write(" " + chalk.cyan(line) + "\n");
158
+ }
159
+ }
160
+ process.stdout.write("\n");
161
+ return "skip";
162
+ }
163
+ function spawnInstall(hint) {
164
+ return new Promise((resolve) => {
165
+ const child = spawn(hint.command, hint.args, {
166
+ stdio: "inherit", // user sees + interacts with the manager directly
167
+ });
168
+ child.on("close", (code) => resolve(code ?? 1));
169
+ child.on("error", () => resolve(1));
170
+ });
171
+ }
172
+ async function askYN(rl, prompt, defaultAns) {
173
+ const suffix = defaultAns === "y" ? chalk.dim(" [Y/n] ") : chalk.dim(" [y/N] ");
174
+ const raw = (await rl.question(prompt + suffix)).trim().toLowerCase();
175
+ if (raw === "")
176
+ return defaultAns === "y";
177
+ if (raw === "y" || raw === "yes")
178
+ return true;
179
+ if (raw === "n" || raw === "no")
180
+ return false;
181
+ // Anything else: re-ask once, then fall through to default.
182
+ const retry = (await rl.question(chalk.dim(' Please answer "y" or "n": '))).trim().toLowerCase();
183
+ if (retry === "y" || retry === "yes")
184
+ return true;
185
+ if (retry === "n" || retry === "no")
186
+ return false;
187
+ return defaultAns === "y";
188
+ }
189
+ /**
190
+ * Pick the next actionable item (block > required > optional-warn >
191
+ * optional-missing) that the user hasn't already skipped this session.
192
+ * Info-severity items are never returned.
193
+ */
194
+ function pickNextActionable(report, skipped) {
195
+ const tiers = [
196
+ { severity: "block", statuses: ["missing", "warn"] },
197
+ { severity: "required", statuses: ["missing", "warn"] },
198
+ { severity: "optional", statuses: ["warn"] },
199
+ { severity: "optional", statuses: ["missing"] },
200
+ ];
201
+ for (const tier of tiers) {
202
+ const hit = report.checks.find((c) => c.severity === tier.severity && tier.statuses.includes(c.status) && !skipped.has(c.id));
203
+ if (hit)
204
+ return hit;
205
+ }
206
+ return undefined;
207
+ }
208
+ function countActionable(report) {
209
+ return report.checks.filter((c) => c.severity !== "info").length;
210
+ }
211
+ function countDone(report) {
212
+ return report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
213
+ }
214
+ //# sourceMappingURL=doctor-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-runner.js","sourceRoot":"","sources":["../../src/core/doctor-runner.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,31 @@
22
22
  */
23
23
  export type CheckSeverity = "block" | "required" | "optional" | "info";
24
24
  export type CheckStatus = "ok" | "missing" | "warn";
25
+ /**
26
+ * Structured install hint. When present, the doctor's interactive flow
27
+ * can offer to spawn this command after a Y/N confirmation — no copy-
28
+ * paste, no shell injection (we never run a string through `sh -c`).
29
+ *
30
+ * Only attached to checks where the install is a single packaged step
31
+ * (Homebrew formula, winget id, apt package). Items that need manual
32
+ * sign-up (API keys), license acceptance (Resolve installer), or
33
+ * multi-step setup (whisperx + HF_TOKEN) carry a `fix` string instead.
34
+ */
35
+ export interface InstallableHint {
36
+ /** Human label shown in the prompt: "Install ffmpeg via Homebrew". */
37
+ label: string;
38
+ /** Executable on PATH. */
39
+ command: string;
40
+ /** Argument vector — NEVER a shell string. */
41
+ args: string[];
42
+ /**
43
+ * What managed manager this uses. Used by the renderer to decide
44
+ * whether to show "requires sudo" copy.
45
+ */
46
+ manager: "homebrew" | "winget" | "apt" | "pip" | "npm";
47
+ /** True when the command requires elevated privileges (sudo / admin). */
48
+ needsSudo?: boolean;
49
+ }
25
50
  export interface DoctorCheck {
26
51
  /** Stable id (also the check key). */
27
52
  id: string;
@@ -41,6 +66,12 @@ export interface DoctorCheck {
41
66
  * Platform-appropriate (macOS / linux / win32).
42
67
  */
43
68
  fix?: string;
69
+ /**
70
+ * Optional structured install command for items where a single
71
+ * package-manager invocation does the job. The CLI offers Y/N
72
+ * confirmation and spawns it directly.
73
+ */
74
+ installable?: InstallableHint;
44
75
  }
45
76
  export interface DoctorReport {
46
77
  checks: DoctorCheck[];
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEvE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,yDAAyD;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEpE;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,OAAO,CAM7D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAqBhE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEvE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACvD,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,yDAAyD;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEpE;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,OAAO,CAM7D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAqBhE"}
@@ -75,6 +75,12 @@ function checkFfmpegProbe() {
75
75
  unlocks: "Most tools (transcoding, captions, color grading, silence/filler cuts, transitions, " +
76
76
  "audio mixing, GIF/thumbnail generation). ~70% of the toolkit.",
77
77
  fix: ok ? undefined : ffmpegInstallHint(),
78
+ installable: ok
79
+ ? undefined
80
+ : buildInstallable({
81
+ pkg: { darwin: "ffmpeg", linux: "ffmpeg", win32: "Gyan.FFmpeg" },
82
+ label: "Install ffmpeg",
83
+ }),
78
84
  };
79
85
  }
80
86
  function checkFfprobeProbe() {
@@ -87,6 +93,13 @@ function checkFfprobeProbe() {
87
93
  detail: ok ? versionLine("ffprobe") : "not on PATH",
88
94
  unlocks: "probe_media (fps / duration / codec detection — runs on every input file).",
89
95
  fix: ok ? undefined : ffmpegInstallHint(),
96
+ // ffprobe ships in the same Homebrew/winget/apt package as ffmpeg.
97
+ installable: ok
98
+ ? undefined
99
+ : buildInstallable({
100
+ pkg: { darwin: "ffmpeg", linux: "ffmpeg", win32: "Gyan.FFmpeg" },
101
+ label: "Install ffmpeg (includes ffprobe)",
102
+ }),
90
103
  };
91
104
  }
92
105
  function checkOpenAIKey() {
@@ -154,6 +167,10 @@ function checkPython() {
154
167
  : platform() === "linux"
155
168
  ? "sudo apt install python3 # debian/ubuntu — your distro's package manager otherwise"
156
169
  : "winget install Python.Python.3 # or python.org installer",
170
+ installable: buildInstallable({
171
+ pkg: { darwin: "python@3.12", linux: "python3", win32: "Python.Python.3" },
172
+ label: "Install Python 3",
173
+ }),
157
174
  };
158
175
  }
159
176
  function checkResolve() {
@@ -234,6 +251,12 @@ function checkWhisperCpp() {
234
251
  fix: platform() === "darwin"
235
252
  ? "brew install whisper-cpp # then download a model from https://huggingface.co/ggerganov/whisper.cpp"
236
253
  : "Build from source: https://github.com/ggml-org/whisper.cpp",
254
+ // Only Homebrew packages whisper.cpp cleanly. Linux / Windows users
255
+ // need to build from source — we leave them with the `fix` string.
256
+ installable: buildInstallable({
257
+ pkg: { darwin: "whisper-cpp" },
258
+ label: "Install whisper.cpp (you'll still need to download a model)",
259
+ }),
237
260
  };
238
261
  }
239
262
  function checkWhisperX() {
@@ -274,6 +297,23 @@ function checkWhisperX() {
274
297
  fix: "pip install whisperx\n" +
275
298
  "export HF_TOKEN=hf_... # https://huggingface.co/settings/tokens\n" +
276
299
  "Then accept https://huggingface.co/pyannote/speaker-diarization-3.1 model terms.",
300
+ // pip install handles the package; HF_TOKEN + license acceptance
301
+ // remain manual (handled via the `fix` text on the post-install run).
302
+ installable: hasManager("pip3")
303
+ ? {
304
+ label: "Install whisperx (you'll still need HF_TOKEN + accept model terms)",
305
+ command: "pip3",
306
+ args: ["install", "--user", "whisperx"],
307
+ manager: "pip",
308
+ }
309
+ : hasManager("pip")
310
+ ? {
311
+ label: "Install whisperx (you'll still need HF_TOKEN + accept model terms)",
312
+ command: "pip",
313
+ args: ["install", "--user", "whisperx"],
314
+ manager: "pip",
315
+ }
316
+ : undefined,
277
317
  };
278
318
  }
279
319
  function checkAuthFile(home) {
@@ -319,6 +359,63 @@ function ffmpegInstallHint() {
319
359
  return "Install ffmpeg from https://ffmpeg.org/download.html";
320
360
  }
321
361
  }
362
+ /**
363
+ * True when `cmd --version` (or `--help` for managers that don't have
364
+ * a version flag) exits 0. Cached for the lifetime of the process so we
365
+ * don't re-spawn the same probe across multiple checks.
366
+ */
367
+ const _managerCache = new Map();
368
+ function hasManager(cmd) {
369
+ const cached = _managerCache.get(cmd);
370
+ if (cached !== undefined)
371
+ return cached;
372
+ const r = spawnSync(cmd, ["--version"], { encoding: "utf8" });
373
+ const ok = r.status === 0;
374
+ _managerCache.set(cmd, ok);
375
+ return ok;
376
+ }
377
+ /**
378
+ * Build an InstallableHint for a package whose name matches across the
379
+ * common managers we support. Returns undefined when no supported
380
+ * manager is available on this platform — in which case the check just
381
+ * surfaces a `fix` string instead.
382
+ */
383
+ function buildInstallable(opts) {
384
+ const p = platform();
385
+ if (p === "darwin" && opts.pkg.darwin && hasManager("brew")) {
386
+ return {
387
+ label: opts.label,
388
+ command: "brew",
389
+ args: ["install", opts.pkg.darwin],
390
+ manager: "homebrew",
391
+ };
392
+ }
393
+ if (p === "linux" && opts.pkg.linux && hasManager("apt")) {
394
+ return {
395
+ label: opts.label,
396
+ command: "sudo",
397
+ args: ["apt", "install", "-y", opts.pkg.linux],
398
+ manager: "apt",
399
+ needsSudo: true,
400
+ };
401
+ }
402
+ if (p === "win32" && opts.pkg.win32 && hasManager("winget")) {
403
+ return {
404
+ label: opts.label,
405
+ command: "winget",
406
+ args: [
407
+ "install",
408
+ "--id",
409
+ opts.pkg.win32,
410
+ "-e",
411
+ "--accept-source-agreements",
412
+ "--accept-package-agreements",
413
+ ],
414
+ manager: "winget",
415
+ };
416
+ }
417
+ return undefined;
418
+ }
322
419
  function isResolveInstalled() {
323
420
  if (platform() === "darwin") {
324
421
  return existsSync("/Applications/DaVinci Resolve/DaVinci Resolve.app");
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}