diff --git a/src/resources/extensions/gsd/auto.ts b/src/resources/extensions/gsd/auto.ts index 79b7fdc37..92ea79435 100644 --- a/src/resources/extensions/gsd/auto.ts +++ b/src/resources/extensions/gsd/auto.ts @@ -125,8 +125,9 @@ import { } from "./metrics.js"; import { setLogBasePath, logWarning, logError } from "./workflow-logger.js"; import { homedir } from "node:os"; -import { join } from "node:path"; +import { join, dirname } from "node:path"; import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs"; +import { createRequire } from "node:module"; import { atomicWriteSync } from "./atomic-write.js"; import { autoCommitCurrentBranch, @@ -1334,7 +1335,12 @@ export async function startAuto( // Re-sync managed resources on resume so long-lived auto sessions pick up // bundled extension updates before resume-time verification/state logic runs. const agentDir = process.env.GSD_CODING_AGENT_DIR || join(process.env.GSD_HOME || homedir(), ".gsd", "agent"); - const { initResources } = await import("../../../" + "resource-loader.js"); + // Resolve resource-loader from the gsd-pi package root — the relative + // "../../../resource-loader.js" path only works from the source tree but + // breaks when extensions are deployed to ~/.gsd/agent/extensions/gsd/. + const _req = createRequire(import.meta.url); + const pkgRoot = dirname(_req.resolve("gsd-pi/package.json")); + const { initResources } = await import(join(pkgRoot, "dist", "resource-loader.js")); initResources(agentDir); // Open the project DB before rebuild/derive so resume uses DB-backed // state instead of falling back to stale markdown parsing (#2940).