From 523fcd89a8abb8f15b38f4c18d34abab201911a6 Mon Sep 17 00:00:00 2001 From: Tibsfox Date: Sun, 5 Apr 2026 11:35:11 -0700 Subject: [PATCH] fix(headless): sync resources and use agent dir for query --- src/cli.ts | 4 ++++ src/headless-query.ts | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/cli.ts b/src/cli.ts index 28e7e12d6..b14d5b1f1 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -298,6 +298,10 @@ if (cliFlags.messages[0] === 'sessions') { // `gsd headless` — run auto-mode without TUI if (cliFlags.messages[0] === 'headless') { await ensureRtkBootstrap() + // Sync bundled resources before headless runs (#3471). Without this, + // headless-query loads from src/resources/ while auto/interactive load + // from ~/.gsd/agent/extensions/ — different extension copies diverge. + initResources(agentDir) const { runHeadless, parseHeadlessArgs } = await import('./headless.js') await runHeadless(parseHeadlessArgs(process.argv)) process.exit(0) diff --git a/src/headless-query.ts b/src/headless-query.ts index c9aa6ae2b..cc7c134c3 100644 --- a/src/headless-query.ts +++ b/src/headless-query.ts @@ -16,12 +16,22 @@ import { createJiti } from '@mariozechner/jiti' import { fileURLToPath } from 'node:url' +import { join } from 'node:path' +import { homedir } from 'node:os' import type { GSDState } from './resources/extensions/gsd/types.js' import { resolveBundledSourceResource } from './bundled-resource-path.js' const jiti = createJiti(fileURLToPath(import.meta.url), { interopDefault: true, debug: false }) +// Resolve extensions from the synced agent directory so headless-query +// loads the same extension copy as interactive/auto modes (#3471). +// Falls back to bundled source for source-tree dev workflows. +const agentExtensionsDir = join(process.env.GSD_AGENT_DIR || join(homedir(), '.gsd', 'agent'), 'extensions', 'gsd') +const { existsSync } = await import('node:fs') +const useAgentDir = existsSync(join(agentExtensionsDir, 'state.ts')) const gsdExtensionPath = (...segments: string[]) => - resolveBundledSourceResource(import.meta.url, 'extensions', 'gsd', ...segments) + useAgentDir + ? join(agentExtensionsDir, ...segments) + : resolveBundledSourceResource(import.meta.url, 'extensions', 'gsd', ...segments) async function loadExtensionModules() { const stateModule = await jiti.import(gsdExtensionPath('state.ts'), {}) as any