From 8d14a4f23e886745fafdeb6ea776a9f0aabf3771 Mon Sep 17 00:00:00 2001 From: gsalucci Date: Thu, 27 Aug 2026 15:52:00 +0200 Subject: [PATCH 1/2] fix(doctor): engine presence is info, never warn or error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The resident gRPC daemon is an optimisation, not a requirement: draw-things-cli works fine cold (it just reloads 6GB of weights per call) and index.ts's waitForServer() warms it on the first generation anyway. A doctor that lists the engine under 'Qualcosa non va' makes a working install look broken every morning and pushes the user to chase a non-issue. All four reachable branches of checkServer — disabled, binaryMissing, notExecutable, stopped — now return level: 'info'. The fix hint stays in the report so the user can still copy the manual start command when they want to. --- extensions/imgen/doctor.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/extensions/imgen/doctor.ts b/extensions/imgen/doctor.ts index 9589151..4a9fa3b 100644 --- a/extensions/imgen/doctor.ts +++ b/extensions/imgen/doctor.ts @@ -572,9 +572,10 @@ async function checkTypst(fast: boolean): Promise { } /** - * The daemon. NOTE: nothing here is an `error`. `draw-things-cli` works perfectly well - * cold — it just reloads 6GB of weights on every single call, which turns a draft loop - * into a coffee break. So: warn, never block. + * The daemon. NOTE: nothing here is an `error` AND nothing here is a `warn`. The + * resident server is an optimisation, not a requirement: `draw-things-cli` works fine + * cold, and `index.ts`'s `waitForServer()` warms it on the first generation anyway. + * So: `info` at worst, so the doctor never lists the engine among "Qualcosa non va". */ async function checkServer(cfg: ImgenConfig, piConfigDir: string): Promise { const paths = serverPaths(cfg, piConfigDir); @@ -583,7 +584,7 @@ async function checkServer(cfg: ImgenConfig, piConfigDir: string): Promise Date: Thu, 27 Aug 2026 15:52:04 +0200 Subject: [PATCH 2/2] test(e2e): add jiti devDep, derive repo root from import.meta.url 'npm run test:e2e' was failing before it even started: the four tests import { createJiti } from 'jiti' but jiti was never declared in package.json, so Node threw ERR_MODULE_NOT_FOUND on the first import. Adding it to devDependencies fixes the loader. The same tests hard-coded the original developer's path ('/home/moze/Sorgenti/pi-imgen'), so even with jiti installed they would have failed on any other checkout. Replacing it with dirname(dirname(dirname(fileURLToPath(import.meta.url)))) lets the suite run from wherever the repo is cloned. --- package-lock.json | 11 +++++++++++ package.json | 3 ++- tests/e2e/contrast.mjs | 5 +++-- tests/e2e/oversized.mjs | 5 +++-- tests/e2e/render.mjs | 5 +++-- tests/e2e/strings.mjs | 5 +++-- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index a130470..b3ffcda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ }, "devDependencies": { "@types/node": "^20.14.0", + "jiti": "^2.4.0", "typescript": "^5.6.0" }, "engines": { @@ -3515,6 +3516,16 @@ "node": ">= 4" } }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", diff --git a/package.json b/package.json index 589b47e..70ecfec 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ }, "devDependencies": { "typescript": "^5.6.0", - "@types/node": "^20.14.0" + "@types/node": "^20.14.0", + "jiti": "^2.4.0" } } diff --git a/tests/e2e/contrast.mjs b/tests/e2e/contrast.mjs index a0c5f78..17a92d7 100644 --- a/tests/e2e/contrast.mjs +++ b/tests/e2e/contrast.mjs @@ -1,7 +1,8 @@ import { createJiti } from "jiti"; -import { join } from "node:path"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; const jiti = createJiti(import.meta.url, { interopDefault: true }); -const R = "/home/moze/Sorgenti/pi-imgen"; +const R = dirname(dirname(dirname(fileURLToPath(import.meta.url)))); const c = await jiti.import(join(R, "extensions/imgen/render/contrast.ts")); const region = c.TEXT_REGIONS["hero-bottom"]; diff --git a/tests/e2e/oversized.mjs b/tests/e2e/oversized.mjs index 5cdeac9..3e1e83b 100644 --- a/tests/e2e/oversized.mjs +++ b/tests/e2e/oversized.mjs @@ -10,10 +10,11 @@ * `print.dpi` has no upper clamp, so a user on 600dpi puts every A3 region over the cap. */ import { createJiti } from "jiti"; -import { join } from "node:path"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; const jiti = createJiti(import.meta.url, { interopDefault: true }); -const R = "/home/moze/Sorgenti/pi-imgen"; +const R = dirname(dirname(dirname(fileURLToPath(import.meta.url)))); const c = await jiti.import(join(R, "extensions/imgen/render/contrast.ts")); const a = await c.analyseRegion(join(R, "tests/art-fine-busy.png"), { left: 0, top: 0, width: 1, height: 1 }); diff --git a/tests/e2e/render.mjs b/tests/e2e/render.mjs index a2b5b22..a675df8 100644 --- a/tests/e2e/render.mjs +++ b/tests/e2e/render.mjs @@ -1,10 +1,11 @@ import { createJiti } from "jiti"; import { mkdtempSync, copyFileSync, existsSync, readFileSync } from "node:fs"; import { tmpdir } from "node:os"; -import { join } from "node:path"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; const jiti = createJiti(import.meta.url, { interopDefault: true }); -const R = "/home/moze/Sorgenti/pi-imgen"; +const R = dirname(dirname(dirname(fileURLToPath(import.meta.url)))); const typst = await jiti.import(join(R, "extensions/imgen/render/typst.ts")); const cfgMod = await jiti.import(join(R, "extensions/imgen/config.ts")); diff --git a/tests/e2e/strings.mjs b/tests/e2e/strings.mjs index 95911d1..a2fdb40 100644 --- a/tests/e2e/strings.mjs +++ b/tests/e2e/strings.mjs @@ -7,10 +7,11 @@ * time — a cycle or a hoisting mistake would surface as `undefined`, not a type error. */ import { createJiti } from "jiti"; -import { join } from "node:path"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; const jiti = createJiti(import.meta.url, { interopDefault: true }); -const R = "/home/moze/Sorgenti/pi-imgen"; +const R = dirname(dirname(dirname(fileURLToPath(import.meta.url)))); const s = await jiti.import(join(R, "extensions/imgen/ui/strings.ts")); let bad = 0; -- 2.54.0