@kenkaiiii/gg-editor 0.2.0 → 0.3.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.
- package/dist/cli.js +10 -9
- package/dist/cli.js.map +1 -1
- package/dist/core/doctor-render.d.ts +6 -6
- package/dist/core/doctor-render.d.ts.map +1 -1
- package/dist/core/doctor-render.js +120 -66
- package/dist/core/doctor-render.js.map +1 -1
- package/dist/core/doctor-render.test.d.ts +2 -0
- package/dist/core/doctor-render.test.d.ts.map +1 -0
- package/dist/core/doctor-render.test.js +151 -0
- package/dist/core/doctor-render.test.js.map +1 -0
- package/dist/core/doctor-runner.d.ts +15 -0
- package/dist/core/doctor-runner.d.ts.map +1 -0
- package/dist/core/doctor-runner.js +212 -0
- package/dist/core/doctor-runner.js.map +1 -0
- package/dist/core/doctor.d.ts +31 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +97 -0
- package/dist/core/doctor.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -4,8 +4,8 @@ import { dirname } from "node:path";
|
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import { getDefaultModel } from "@kenkaiiii/ggcoder/models";
|
|
6
6
|
import { AuthStorage, NotLoggedInError, runLogin, runLogout, runStatus, } from "./core/auth/index.js";
|
|
7
|
-
import { isOnboarded, onboardedMarkerPath
|
|
8
|
-
import {
|
|
7
|
+
import { isOnboarded, onboardedMarkerPath } from "./core/doctor.js";
|
|
8
|
+
import { runDoctorInteractive } from "./core/doctor-runner.js";
|
|
9
9
|
import { discoverSkills } from "./core/skills-loader.js";
|
|
10
10
|
import { discoverStyles } from "./core/styles-loader.js";
|
|
11
11
|
import { SKILLS } from "./skills.js";
|
|
@@ -43,7 +43,7 @@ USAGE
|
|
|
43
43
|
ggeditor login Authenticate
|
|
44
44
|
ggeditor logout Clear credentials
|
|
45
45
|
ggeditor auth Show stored credentials
|
|
46
|
-
ggeditor doctor
|
|
46
|
+
ggeditor doctor Walk through environment fixes (--all to view inventory)
|
|
47
47
|
|
|
48
48
|
Auth lives in ~/.gg/auth.json — the SAME file ggcoder uses, so logging into
|
|
49
49
|
either CLI works for both.
|
|
@@ -90,8 +90,9 @@ async function main() {
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
if (sub === "doctor") {
|
|
93
|
-
const
|
|
94
|
-
|
|
93
|
+
const all = args.includes("--all") || args.includes("-a");
|
|
94
|
+
const yes = args.includes("--yes") || args.includes("-y");
|
|
95
|
+
await runDoctorInteractive({ all, nonInteractive: yes });
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
97
98
|
const isContinue = sub === "continue";
|
|
@@ -102,11 +103,11 @@ async function main() {
|
|
|
102
103
|
if (!process.stdin.isTTY) {
|
|
103
104
|
fail("ggeditor requires an interactive terminal");
|
|
104
105
|
}
|
|
105
|
-
// First-run onboarding — only when
|
|
106
|
-
//
|
|
106
|
+
// First-run onboarding — only when the marker doesn't exist. Walks
|
|
107
|
+
// the user through every actionable item, offering Y/N confirms for
|
|
108
|
+
// anything we know how to install via a package manager.
|
|
107
109
|
if (!isOnboarded()) {
|
|
108
|
-
|
|
109
|
-
process.stdout.write(renderDoctorReport(report, { onboarding: true }));
|
|
110
|
+
await runDoctorInteractive({ onboarding: true });
|
|
110
111
|
markOnboarded();
|
|
111
112
|
}
|
|
112
113
|
const auth = new AuthStorage();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,SAAS,GAEV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,SAAS,GAEV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,mFAAmF;AACnF,MAAM,cAAc,GAA4B;IAC9C,WAAW;IACX,QAAQ;IACR,KAAK;IACL,UAAU;IACV,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC;AAEF,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAQ,cAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;CAYtB,CAAC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAiB;IAC3C,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrC,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,oBAAoB,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,KAAK,UAAU,CAAC;IACtC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,GAAG,wBAAwB,CAAC,CAAC;IACxD,CAAC;IAED,yEAAyE;IAEzE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACpD,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,yDAAyD;IACzD,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,MAAM,oBAAoB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC;YACpC,KAAK,CAAC,GAAG,CACP,oFAAoF,CACrF,CACJ,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,wBAAyB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC;IAEnE,uDAAuD;IACvD,IAAI,aAAa,GAAc,EAAE,CAAC;IAClC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,MAAM,cAAc,EAAE,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC;gBAChD,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CACpD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI;YAAE,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED,iEAAiE;IACjE,MAAM,KAAK,GAAG,eAAe,CAAC,QAAoB,CAAC,CAAC,EAAE,CAAC;IAEvD,oEAAoE;IACpE,6BAA6B;IAC7B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAChD,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAChE,cAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC3B,CAAC;IAEhB,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,uEAAuE;IACvE,wEAAwE;IACxE,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5E,MAAM,YAAY,GAChB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,KAAK;QAClB,QAAQ,KAAK,UAAU;QACrB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,eAAe,CAAC;QACpB,QAAQ,EAAE,QAAoB;QAC9B,KAAK;QACL,MAAM,EAAE,KAAK;QACb,SAAS;QACT,KAAK;QACL,YAAY,EAAE,MAAM;QACpB,gBAAgB;QAChB,IAAI;QACJ,aAAa;QACb,iBAAiB;QACjB,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,eAAe,EAAE,IAAI,CAAC,WAAW;QACjC,aAAa,EAAE,IAAI,CAAC,WAAW;QAC/B,UAAU,EAAE,IAAI,CAAC,iBAAiB;QAClC,GAAG;QACH,OAAO,EAAE,OAAO;QAChB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,CAAW,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { DoctorReport } from "./doctor.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* `ggeditor doctor` command and the first-run onboarding flow.
|
|
5
|
-
*/
|
|
6
|
-
export declare function renderDoctorReport(report: DoctorReport, opts?: {
|
|
2
|
+
export interface RenderOptions {
|
|
3
|
+
/** Show the welcome banner instead of the plain header. */
|
|
7
4
|
onboarding?: boolean;
|
|
8
|
-
|
|
5
|
+
/** Show every check, not just the next thing to fix. */
|
|
6
|
+
all?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderDoctorReport(report: DoctorReport, opts?: RenderOptions): string;
|
|
9
9
|
//# sourceMappingURL=doctor-render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-render.d.ts","sourceRoot":"","sources":["../../src/core/doctor-render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor-render.d.ts","sourceRoot":"","sources":["../../src/core/doctor-render.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAEzF"}
|
|
@@ -1,91 +1,145 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pretty-printer for DoctorReport.
|
|
3
|
-
*
|
|
2
|
+
* Pretty-printer for DoctorReport.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
*
|
|
6
|
+
* 1. focused (default) — show ONE thing to fix at a time, highest
|
|
7
|
+
* priority first. After the user fixes it and re-runs, the next
|
|
8
|
+
* one surfaces. When everything's clear: "Nothing to fix."
|
|
9
|
+
* This is the daily-driver mode and what onboarding uses.
|
|
10
|
+
*
|
|
11
|
+
* 2. all — full inventory, grouped by severity. Useful when the user
|
|
12
|
+
* wants to see what's optional / unlocks what. Triggered by
|
|
13
|
+
* `ggeditor doctor --all`.
|
|
14
|
+
*
|
|
15
|
+
* Priority order for the focused mode:
|
|
16
|
+
* required-missing > optional-warn > optional-missing > done
|
|
17
|
+
* Within a tier we keep the source order from runDoctor() so the most
|
|
18
|
+
* impactful tools (ffmpeg, then auth) come first.
|
|
4
19
|
*/
|
|
5
20
|
import chalk from "chalk";
|
|
6
|
-
const SEVERITY_LABEL = {
|
|
7
|
-
block: "BLOCK",
|
|
8
|
-
required: "REQUIRED",
|
|
9
|
-
optional: "OPTIONAL",
|
|
10
|
-
info: "INFO",
|
|
11
|
-
};
|
|
12
|
-
function statusGlyph(c) {
|
|
13
|
-
if (c.status === "ok")
|
|
14
|
-
return chalk.green("✓");
|
|
15
|
-
if (c.status === "warn")
|
|
16
|
-
return chalk.yellow("!");
|
|
17
|
-
// missing — color by severity
|
|
18
|
-
if (c.severity === "required" || c.severity === "block")
|
|
19
|
-
return chalk.red("✗");
|
|
20
|
-
if (c.severity === "optional")
|
|
21
|
-
return chalk.yellow("○");
|
|
22
|
-
return chalk.dim("·");
|
|
23
|
-
}
|
|
24
|
-
/** Render a single check as a 3-4 line block. */
|
|
25
|
-
function renderCheck(c) {
|
|
26
|
-
const lines = [];
|
|
27
|
-
const badge = chalk.dim(`[${SEVERITY_LABEL[c.severity]}]`);
|
|
28
|
-
const header = `${statusGlyph(c)} ${chalk.bold(c.label)} ${badge} ${chalk.dim(c.detail)}`;
|
|
29
|
-
lines.push(header);
|
|
30
|
-
lines.push(chalk.dim(" Unlocks: ") + c.unlocks);
|
|
31
|
-
if (c.fix) {
|
|
32
|
-
const fixed = c.fix
|
|
33
|
-
.split("\n")
|
|
34
|
-
.map((l) => " " + chalk.cyan(l))
|
|
35
|
-
.join("\n");
|
|
36
|
-
lines.push(chalk.dim(" Fix:"));
|
|
37
|
-
lines.push(fixed);
|
|
38
|
-
}
|
|
39
|
-
return lines.join("\n");
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Produce the full doctor output. Used by both the explicit
|
|
43
|
-
* `ggeditor doctor` command and the first-run onboarding flow.
|
|
44
|
-
*/
|
|
45
21
|
export function renderDoctorReport(report, opts = {}) {
|
|
22
|
+
return opts.all ? renderAll(report, opts) : renderFocused(report, opts);
|
|
23
|
+
}
|
|
24
|
+
// ── Focused mode (default) ──────────────────────────────────
|
|
25
|
+
function renderFocused(report, opts) {
|
|
46
26
|
const out = [];
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
27
|
+
const next = pickNextToFix(report);
|
|
28
|
+
const done = countDone(report);
|
|
29
|
+
const total = countActionable(report);
|
|
30
|
+
if (!next) {
|
|
31
|
+
// Nothing left to fix.
|
|
32
|
+
out.push(" " +
|
|
33
|
+
chalk.green("✓ Nothing to fix. You're all good.") +
|
|
34
|
+
chalk.dim(" Run `ggeditor` to start."));
|
|
35
|
+
out.push(" " + progressBar(done, total));
|
|
36
|
+
out.push(chalk.dim(" Re-run with `ggeditor doctor --all` to see the full inventory."));
|
|
51
37
|
out.push("");
|
|
38
|
+
return out.join("\n");
|
|
52
39
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
40
|
+
// One focused item.
|
|
41
|
+
out.push(" " + chalk.dim(progressBar(done, total)));
|
|
42
|
+
out.push("");
|
|
43
|
+
out.push(" " + severityHeading(next));
|
|
44
|
+
out.push(" " + chalk.bold(next.label) + chalk.dim(" — " + next.detail));
|
|
45
|
+
out.push("");
|
|
46
|
+
out.push(" " + chalk.dim("Why it matters"));
|
|
47
|
+
out.push(" " + next.unlocks);
|
|
48
|
+
if (next.fix) {
|
|
56
49
|
out.push("");
|
|
50
|
+
out.push(" " + chalk.dim("Fix"));
|
|
51
|
+
for (const line of next.fix.split("\n")) {
|
|
52
|
+
out.push(" " + chalk.cyan(line));
|
|
53
|
+
}
|
|
57
54
|
}
|
|
58
|
-
|
|
55
|
+
out.push("");
|
|
56
|
+
out.push(chalk.dim(" Re-run `ggeditor doctor` after fixing to see the next item."));
|
|
57
|
+
if (!opts.all) {
|
|
58
|
+
out.push(chalk.dim(" Or `ggeditor doctor --all` to see the full inventory."));
|
|
59
|
+
}
|
|
60
|
+
out.push("");
|
|
61
|
+
return out.join("\n");
|
|
62
|
+
}
|
|
63
|
+
// ── All mode (--all) ────────────────────────────────────────
|
|
64
|
+
function renderAll(report, _opts) {
|
|
65
|
+
const out = [];
|
|
59
66
|
const groups = [
|
|
60
|
-
{ title:
|
|
61
|
-
{ title:
|
|
62
|
-
{ title:
|
|
67
|
+
{ title: "Required", severities: ["block", "required"] },
|
|
68
|
+
{ title: "Optional", severities: ["optional"] },
|
|
69
|
+
{ title: "Info", severities: ["info"] },
|
|
63
70
|
];
|
|
64
71
|
for (const group of groups) {
|
|
65
72
|
const items = report.checks.filter((c) => group.severities.includes(c.severity));
|
|
66
73
|
if (items.length === 0)
|
|
67
74
|
continue;
|
|
68
|
-
out.push(group.title);
|
|
69
|
-
out.push("");
|
|
75
|
+
out.push(" " + chalk.dim(group.title));
|
|
70
76
|
for (const c of items)
|
|
71
|
-
out.push(
|
|
77
|
+
out.push(renderInventoryLine(c));
|
|
72
78
|
out.push("");
|
|
73
79
|
}
|
|
74
|
-
// Summary
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
// Summary
|
|
81
|
+
const next = pickNextToFix(report);
|
|
82
|
+
if (!next) {
|
|
83
|
+
out.push(" " +
|
|
84
|
+
chalk.green("✓ Nothing to fix. You're all good.") +
|
|
85
|
+
chalk.dim(" Run `ggeditor` to start."));
|
|
79
86
|
}
|
|
80
87
|
else {
|
|
81
|
-
out.push(chalk.
|
|
82
|
-
chalk.bold(`${missingRequired.length} required item${missingRequired.length === 1 ? "" : "s"} missing.`) +
|
|
83
|
-
" You can still launch ggeditor, but most tools will error until they're installed.");
|
|
84
|
-
}
|
|
85
|
-
if (missingOptional.length > 0) {
|
|
86
|
-
out.push(chalk.dim(` ${missingOptional.length} optional item${missingOptional.length === 1 ? "" : "s"} would unlock more features (see above).`));
|
|
88
|
+
out.push(" " + chalk.dim("Next: ") + chalk.bold(next.label) + chalk.dim(" — see `ggeditor doctor`"));
|
|
87
89
|
}
|
|
88
90
|
out.push("");
|
|
89
91
|
return out.join("\n");
|
|
90
92
|
}
|
|
93
|
+
function renderInventoryLine(c) {
|
|
94
|
+
const glyph = c.status === "ok"
|
|
95
|
+
? chalk.green("✓")
|
|
96
|
+
: c.status === "warn"
|
|
97
|
+
? chalk.yellow("!")
|
|
98
|
+
: c.severity === "required" || c.severity === "block"
|
|
99
|
+
? chalk.red("✗")
|
|
100
|
+
: chalk.yellow("○");
|
|
101
|
+
return ` ${glyph} ${c.label.padEnd(28)} ${chalk.dim(c.detail)}`;
|
|
102
|
+
}
|
|
103
|
+
// ── Helpers ────────────────────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Pick the next thing to fix in priority order. `info` checks are
|
|
106
|
+
* never returned (they're informational, not actionable).
|
|
107
|
+
*/
|
|
108
|
+
function pickNextToFix(report) {
|
|
109
|
+
const tiers = [
|
|
110
|
+
{ severity: "block", statuses: ["missing", "warn"] },
|
|
111
|
+
{ severity: "required", statuses: ["missing", "warn"] },
|
|
112
|
+
{ severity: "optional", statuses: ["warn"] }, // warn before plain missing
|
|
113
|
+
{ severity: "optional", statuses: ["missing"] },
|
|
114
|
+
];
|
|
115
|
+
for (const tier of tiers) {
|
|
116
|
+
const hit = report.checks.find((c) => c.severity === tier.severity && tier.statuses.includes(c.status));
|
|
117
|
+
if (hit)
|
|
118
|
+
return hit;
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/** Pretty heading above the focused item. */
|
|
123
|
+
function severityHeading(c) {
|
|
124
|
+
if (c.severity === "required" || c.severity === "block") {
|
|
125
|
+
return chalk.red.bold("Next up — required");
|
|
126
|
+
}
|
|
127
|
+
if (c.status === "warn")
|
|
128
|
+
return chalk.yellow.bold("Next up — needs attention");
|
|
129
|
+
return chalk.yellow.bold("Next up — optional");
|
|
130
|
+
}
|
|
131
|
+
/** Count actionable items (everything except `info`). */
|
|
132
|
+
function countActionable(report) {
|
|
133
|
+
return report.checks.filter((c) => c.severity !== "info").length;
|
|
134
|
+
}
|
|
135
|
+
function countDone(report) {
|
|
136
|
+
return report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
|
|
137
|
+
}
|
|
138
|
+
/** "[██████░░░] 6 of 9" — at-a-glance progress. */
|
|
139
|
+
function progressBar(done, total) {
|
|
140
|
+
const width = 12;
|
|
141
|
+
const filled = total === 0 ? 0 : Math.round((done / total) * width);
|
|
142
|
+
const bar = chalk.green("█".repeat(filled)) + chalk.dim("░".repeat(width - filled));
|
|
143
|
+
return `${bar} ${done} of ${total} ready`;
|
|
144
|
+
}
|
|
91
145
|
//# sourceMappingURL=doctor-render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-render.js","sourceRoot":"","sources":["../../src/core/doctor-render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"doctor-render.js","sourceRoot":"","sources":["../../src/core/doctor-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,OAAsB,EAAE;IAC/E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,+DAA+D;AAE/D,SAAS,aAAa,CAAC,MAAoB,EAAE,IAAmB;IAC9D,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,uBAAuB;QACvB,GAAG,CAAC,IAAI,CACN,IAAI;YACF,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC;YACjD,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CACzC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC,CAAC;QACxF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,oBAAoB;IACpB,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,+DAA+D;AAE/D,SAAS,SAAS,CAAC,MAAoB,EAAE,KAAoB;IAC3D,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAoE;QAC9E,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;QACxD,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE;QAC/C,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE;KACxC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,UAAU;IACV,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,IAAI,CACN,IAAI;YACF,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC;YACjD,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CACzC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CACN,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAC9F,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAc;IACzC,MAAM,KAAK,GACT,CAAC,CAAC,MAAM,KAAK,IAAI;QACf,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAClB,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM;YACnB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YACnB,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;gBACnD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAChB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,8DAA8D;AAE9D;;;GAGG;AACH,SAAS,aAAa,CAAC,MAAoB;IACzC,MAAM,KAAK,GAAoF;QAC7F,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;QACpD,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;QACvD,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,4BAA4B;QAC1E,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;KAChD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CACxE,CAAC;QACF,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,6CAA6C;AAC7C,SAAS,eAAe,CAAC,CAAc;IACrC,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AACjD,CAAC;AAED,yDAAyD;AACzD,SAAS,eAAe,CAAC,MAAoB;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;AACnE,CAAC;AAED,SAAS,SAAS,CAAC,MAAoB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED,mDAAmD;AACnD,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACpF,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-render.test.d.ts","sourceRoot":"","sources":["../../src/core/doctor-render.test.ts"],"names":[],"mappings":""}
|
|
@@ -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,212 @@
|
|
|
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 { runDoctor } from "./doctor.js";
|
|
21
|
+
import { renderDoctorReport } from "./doctor-render.js";
|
|
22
|
+
const EDITOR_PRIMARY = "#f97316"; // matches login.ts / runStatus
|
|
23
|
+
const EDITOR_ACCENT = "#ec4899";
|
|
24
|
+
const orange = chalk.hex(EDITOR_PRIMARY);
|
|
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
|
+
const title = onboarding ? "Welcome to GG Editor" : "GG Editor — Doctor";
|
|
44
|
+
process.stdout.write(orange.bold(`\n ${title}\n`));
|
|
45
|
+
process.stdout.write(chalk.dim(onboarding
|
|
46
|
+
? " One-time environment check. Re-run any time with `ggeditor doctor`.\n\n"
|
|
47
|
+
: " Environment check. Re-run any time.\n\n"));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Walk through actionable items in priority order. After each step we
|
|
51
|
+
* re-run the doctor so that successful installs unblock follow-on
|
|
52
|
+
* checks (e.g. installing ffmpeg flips both ffmpeg + ffprobe to OK).
|
|
53
|
+
*/
|
|
54
|
+
async function walkActionableItems(onboarding) {
|
|
55
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
56
|
+
// Track items the user has explicitly skipped this session so we
|
|
57
|
+
// don't re-ask about them after every successful install.
|
|
58
|
+
const skipped = new Set();
|
|
59
|
+
try {
|
|
60
|
+
for (let step = 0; step < 20; step++) {
|
|
61
|
+
const report = runDoctor();
|
|
62
|
+
const next = pickNextActionable(report, skipped);
|
|
63
|
+
const total = countActionable(report);
|
|
64
|
+
const done = countDone(report);
|
|
65
|
+
if (!next) {
|
|
66
|
+
// Either everything's clean or we've skipped everything we can.
|
|
67
|
+
const cleanEverything = total === done;
|
|
68
|
+
if (cleanEverything) {
|
|
69
|
+
process.stdout.write(" " +
|
|
70
|
+
chalk.green("✓ Nothing to fix. You're all good.") +
|
|
71
|
+
chalk.dim(" Run `ggeditor` to start.\n\n"));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
process.stdout.write(" " +
|
|
75
|
+
chalk.dim(`Skipped the rest. ${done}/${total} ready. Re-run \`ggeditor doctor\` any time.\n\n`));
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const proceed = await handleItem(next, rl, onboarding);
|
|
80
|
+
if (proceed === "skip")
|
|
81
|
+
skipped.add(next.id);
|
|
82
|
+
if (proceed === "quit") {
|
|
83
|
+
process.stdout.write(chalk.dim(" Done. Re-run `ggeditor doctor` any time.\n\n"));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Safety bound — should never hit this.
|
|
88
|
+
process.stdout.write(chalk.dim(" Reached step limit. Re-run `ggeditor doctor` to continue.\n\n"));
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
rl.close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function handleItem(item, rl, onboarding) {
|
|
95
|
+
// Header: severity + label + detail.
|
|
96
|
+
const tag = item.severity === "required" || item.severity === "block"
|
|
97
|
+
? chalk.red("required")
|
|
98
|
+
: item.status === "warn"
|
|
99
|
+
? chalk.yellow("needs attention")
|
|
100
|
+
: chalk.yellow("optional");
|
|
101
|
+
process.stdout.write(` ${tag} · ${chalk.bold(item.label)} ${chalk.dim("— " + item.detail)}\n`);
|
|
102
|
+
process.stdout.write(" " + chalk.dim(item.unlocks) + "\n\n");
|
|
103
|
+
if (item.installable) {
|
|
104
|
+
return await offerInstall(item, item.installable, rl);
|
|
105
|
+
}
|
|
106
|
+
// No structured installer — print the manual fix and move on.
|
|
107
|
+
if (item.fix) {
|
|
108
|
+
process.stdout.write(chalk.dim(" Fix:\n"));
|
|
109
|
+
for (const line of item.fix.split("\n")) {
|
|
110
|
+
process.stdout.write(" " + chalk.cyan(line) + "\n");
|
|
111
|
+
}
|
|
112
|
+
process.stdout.write("\n");
|
|
113
|
+
}
|
|
114
|
+
// For required items without a structured installer (e.g. auth →
|
|
115
|
+
// `ggeditor login`) we ask whether to keep going. For optional ones
|
|
116
|
+
// we just move on.
|
|
117
|
+
if (item.severity === "required" || item.severity === "block") {
|
|
118
|
+
const ans = await askYN(rl, " Continue to the next item?", "y");
|
|
119
|
+
return ans ? "next" : "quit";
|
|
120
|
+
}
|
|
121
|
+
// Onboarding mode: pause briefly so the user reads the fix.
|
|
122
|
+
if (onboarding) {
|
|
123
|
+
const ans = await askYN(rl, " Continue?", "y");
|
|
124
|
+
return ans ? "next" : "quit";
|
|
125
|
+
}
|
|
126
|
+
return "next";
|
|
127
|
+
}
|
|
128
|
+
async function offerInstall(item, hint, rl) {
|
|
129
|
+
const cmdline = `${hint.command} ${hint.args.join(" ")}`;
|
|
130
|
+
process.stdout.write(` ${chalk.bold(hint.label)}\n`);
|
|
131
|
+
process.stdout.write(` ${pink(cmdline)}\n`);
|
|
132
|
+
if (hint.needsSudo) {
|
|
133
|
+
process.stdout.write(chalk.dim(" (will prompt for your sudo password)\n"));
|
|
134
|
+
}
|
|
135
|
+
process.stdout.write("\n");
|
|
136
|
+
const yes = await askYN(rl, " Install now?", "y");
|
|
137
|
+
if (!yes) {
|
|
138
|
+
if (item.fix) {
|
|
139
|
+
process.stdout.write(chalk.dim(" Skipping. To install later:\n"));
|
|
140
|
+
for (const line of item.fix.split("\n")) {
|
|
141
|
+
process.stdout.write(" " + chalk.cyan(line) + "\n");
|
|
142
|
+
}
|
|
143
|
+
process.stdout.write("\n");
|
|
144
|
+
}
|
|
145
|
+
return "skip";
|
|
146
|
+
}
|
|
147
|
+
const exitCode = await spawnInstall(hint);
|
|
148
|
+
if (exitCode === 0) {
|
|
149
|
+
process.stdout.write(chalk.green(" ✓ Installed.\n\n"));
|
|
150
|
+
return "next";
|
|
151
|
+
}
|
|
152
|
+
process.stdout.write(chalk.red(` ✗ Install failed (exit ${exitCode}).`) + chalk.dim(" You can fix it manually:\n"));
|
|
153
|
+
if (item.fix) {
|
|
154
|
+
for (const line of item.fix.split("\n")) {
|
|
155
|
+
process.stdout.write(" " + chalk.cyan(line) + "\n");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
process.stdout.write("\n");
|
|
159
|
+
return "skip";
|
|
160
|
+
}
|
|
161
|
+
function spawnInstall(hint) {
|
|
162
|
+
return new Promise((resolve) => {
|
|
163
|
+
const child = spawn(hint.command, hint.args, {
|
|
164
|
+
stdio: "inherit", // user sees + interacts with the manager directly
|
|
165
|
+
});
|
|
166
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
167
|
+
child.on("error", () => resolve(1));
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
async function askYN(rl, prompt, defaultAns) {
|
|
171
|
+
const suffix = defaultAns === "y" ? chalk.dim(" [Y/n] ") : chalk.dim(" [y/N] ");
|
|
172
|
+
const raw = (await rl.question(prompt + suffix)).trim().toLowerCase();
|
|
173
|
+
if (raw === "")
|
|
174
|
+
return defaultAns === "y";
|
|
175
|
+
if (raw === "y" || raw === "yes")
|
|
176
|
+
return true;
|
|
177
|
+
if (raw === "n" || raw === "no")
|
|
178
|
+
return false;
|
|
179
|
+
// Anything else: re-ask once, then fall through to default.
|
|
180
|
+
const retry = (await rl.question(chalk.dim(' Please answer "y" or "n": '))).trim().toLowerCase();
|
|
181
|
+
if (retry === "y" || retry === "yes")
|
|
182
|
+
return true;
|
|
183
|
+
if (retry === "n" || retry === "no")
|
|
184
|
+
return false;
|
|
185
|
+
return defaultAns === "y";
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Pick the next actionable item (block > required > optional-warn >
|
|
189
|
+
* optional-missing) that the user hasn't already skipped this session.
|
|
190
|
+
* Info-severity items are never returned.
|
|
191
|
+
*/
|
|
192
|
+
function pickNextActionable(report, skipped) {
|
|
193
|
+
const tiers = [
|
|
194
|
+
{ severity: "block", statuses: ["missing", "warn"] },
|
|
195
|
+
{ severity: "required", statuses: ["missing", "warn"] },
|
|
196
|
+
{ severity: "optional", statuses: ["warn"] },
|
|
197
|
+
{ severity: "optional", statuses: ["missing"] },
|
|
198
|
+
];
|
|
199
|
+
for (const tier of tiers) {
|
|
200
|
+
const hit = report.checks.find((c) => c.severity === tier.severity && tier.statuses.includes(c.status) && !skipped.has(c.id));
|
|
201
|
+
if (hit)
|
|
202
|
+
return hit;
|
|
203
|
+
}
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
function countActionable(report) {
|
|
207
|
+
return report.checks.filter((c) => c.severity !== "info").length;
|
|
208
|
+
}
|
|
209
|
+
function countDone(report) {
|
|
210
|
+
return report.checks.filter((c) => c.severity !== "info" && c.status === "ok").length;
|
|
211
|
+
}
|
|
212
|
+
//# 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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"}
|
package/dist/core/doctor.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/core/doctor.js
CHANGED
|
@@ -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");
|
package/dist/core/doctor.js.map
CHANGED
|
@@ -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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,8 +7,10 @@ export type { LazyHost, LazyHostOptions } from "./core/hosts/lazy.js";
|
|
|
7
7
|
export { checkFfmpeg, checkFfprobe, probeMedia, runFfmpeg } from "./core/media/ffmpeg.js";
|
|
8
8
|
export type { FfmpegResult, MediaProbe } from "./core/media/ffmpeg.js";
|
|
9
9
|
export { isOnboarded, onboardedMarkerPath, runDoctor } from "./core/doctor.js";
|
|
10
|
-
export type { CheckSeverity, CheckStatus, DoctorCheck, DoctorReport } from "./core/doctor.js";
|
|
10
|
+
export type { CheckSeverity, CheckStatus, DoctorCheck, DoctorReport, InstallableHint, } from "./core/doctor.js";
|
|
11
11
|
export { renderDoctorReport } from "./core/doctor-render.js";
|
|
12
|
+
export { runDoctorInteractive } from "./core/doctor-runner.js";
|
|
13
|
+
export type { DoctorRunOptions } from "./core/doctor-runner.js";
|
|
12
14
|
export { buildEditorSystemPrompt, buildEditorStaticBody, buildEditorHostBlock, spliceHostBlock, } from "./system-prompt.js";
|
|
13
15
|
export type { StaticPromptOptions } from "./system-prompt.js";
|
|
14
16
|
export { AuthStorage, AUTH_FILE, NotLoggedInError, generatePKCE, loginAnthropic, loginOpenAI, refreshAnthropicToken, refreshOpenAIToken, runLogin, runLogout, runStatus, } from "./core/auth/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,YAAY,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ export { checkFfmpeg, checkFfprobe, probeMedia, runFfmpeg } from "./core/media/f
|
|
|
8
8
|
// Doctor / first-run onboarding
|
|
9
9
|
export { isOnboarded, onboardedMarkerPath, runDoctor } from "./core/doctor.js";
|
|
10
10
|
export { renderDoctorReport } from "./core/doctor-render.js";
|
|
11
|
+
export { runDoctorInteractive } from "./core/doctor-runner.js";
|
|
11
12
|
// System prompt
|
|
12
13
|
export { buildEditorSystemPrompt, buildEditorStaticBody, buildEditorHostBlock, spliceHostBlock, } from "./system-prompt.js";
|
|
13
14
|
// Auth (shared with ggcoder via ~/.gg/auth.json)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,QAAQ;AACR,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG1F,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,QAAQ;AACR,OAAO,EACL,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG1F,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQ/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,gBAAgB;AAChB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,iDAAiD;AACjD,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,SAAS,GACV,MAAM,sBAAsB,CAAC"}
|