diff --git a/src/resources/extensions/gsd/auto.ts b/src/resources/extensions/gsd/auto.ts index 05f8ff921..1b8d4fd47 100644 --- a/src/resources/extensions/gsd/auto.ts +++ b/src/resources/extensions/gsd/auto.ts @@ -126,6 +126,7 @@ import { import { setLogBasePath, logWarning, logError } from "./workflow-logger.js"; import { homedir } from "node:os"; import { join } from "node:path"; +import { pathToFileURL } from "node:url"; import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs"; import { atomicWriteSync } from "./atomic-write.js"; import { @@ -1341,7 +1342,7 @@ export async function startAuto( const agentDir = process.env.GSD_CODING_AGENT_DIR || join(process.env.GSD_HOME || homedir(), ".gsd", "agent"); const pkgRoot = process.env.GSD_PKG_ROOT; const resourceLoaderPath = pkgRoot - ? join(pkgRoot, "dist", "resource-loader.js") + ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href : new URL("../../../resource-loader.js", import.meta.url).href; const { initResources } = await import(resourceLoaderPath); initResources(agentDir); diff --git a/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts b/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts index e8a5bfe85..0908d12d6 100644 --- a/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +++ b/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts @@ -22,16 +22,17 @@ describe("resource-loader import path", () => { ); }); - test("uses createRequire to resolve resource-loader from package root", () => { - // The fix uses createRequire to find gsd-pi/package.json, then imports - // dist/resource-loader.js from there — works in both source and deployed. + test("uses GSD_PKG_ROOT to resolve resource-loader from package root", () => { + // The fix uses GSD_PKG_ROOT (set by loader.ts) to construct an absolute + // file URL to dist/resource-loader.js — works in both source and deployed, + // and on Windows where raw paths fail with ERR_UNSUPPORTED_ESM_URL_SCHEME. assert.ok( - autoSrc.includes('createRequire(import.meta.url)'), - "auto.ts should use createRequire to resolve resource-loader", + autoSrc.includes('process.env.GSD_PKG_ROOT'), + "auto.ts should use GSD_PKG_ROOT to resolve resource-loader", ); assert.ok( - autoSrc.includes('resolve("gsd-pi/package.json")'), - "auto.ts should resolve gsd-pi package root via package.json", + autoSrc.includes('pathToFileURL'), + "auto.ts should convert path to file URL for cross-platform import()", ); }); }); diff --git a/src/tests/auto-resume-resource-loader.test.ts b/src/tests/auto-resume-resource-loader.test.ts index a90340386..9926e87c2 100644 --- a/src/tests/auto-resume-resource-loader.test.ts +++ b/src/tests/auto-resume-resource-loader.test.ts @@ -33,10 +33,11 @@ test("auto.ts resume uses GSD_PKG_ROOT for resource-loader import, not bare rela "auto.ts resource-loader import must use the computed resourceLoaderPath variable, not a hardcoded relative path", ); - // The resourceLoaderPath must be constructed from GSD_PKG_ROOT + // The resourceLoaderPath must be constructed from GSD_PKG_ROOT via pathToFileURL + // (raw filesystem paths break on Windows with ERR_UNSUPPORTED_ESM_URL_SCHEME) assert.ok( - autoSrc.includes('join(pkgRoot, "dist", "resource-loader.js")'), - "auto.ts must construct resourceLoaderPath from pkgRoot + dist/resource-loader.js", + autoSrc.includes("pathToFileURL(join(pkgRoot,"), + "auto.ts must convert the constructed path to a file URL for cross-platform import()", ); });