From 563a1e1b211f7fc8db66740c7b6151a6d6e64137 Mon Sep 17 00:00:00 2001 From: Nils Reeh Date: Tue, 14 Apr 2026 18:49:08 +0200 Subject: [PATCH] fix(ci): cache dist alongside tsbuildinfo and use workflow-logger in catch blocks - Include dist/ and packages/*/dist/ in the TypeScript incremental cache so that when tsbuildinfo indicates no changes, the compiled output files are still present. Without this, tsc with incremental:true skips emission when tsbuildinfo exists but dist/ is absent (fresh checkout + cache restore), causing downstream packages like @gsd/pi-tui to fail resolving @gsd/native subpath exports. - Also hash source files in the cache key so dist is invalidated on code changes. - Replace process.stderr.write with logWarning("bootstrap", ...) in catch blocks to satisfy the workflow-logger coverage test (#3348). - Update extension-bootstrap-isolation tests to match the new logWarning pattern. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 12 ++++++++--- .../gsd/bootstrap/register-extension.ts | 6 ++++-- src/resources/extensions/gsd/index.ts | 6 ++++-- .../extension-bootstrap-isolation.test.ts | 20 +++++++++++-------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3529e5c1..07535b33a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -155,7 +155,9 @@ jobs: path: | *.tsbuildinfo packages/*/*.tsbuildinfo - key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json') }} + dist + packages/*/dist + key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json', 'src/**/*.ts', 'packages/*/src/**/*.ts') }} restore-keys: | tsbuild-${{ runner.os }}- @@ -222,7 +224,9 @@ jobs: path: | *.tsbuildinfo packages/*/*.tsbuildinfo - key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json') }} + dist + packages/*/dist + key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json', 'src/**/*.ts', 'packages/*/src/**/*.ts') }} restore-keys: | tsbuild-${{ runner.os }}- @@ -259,7 +263,9 @@ jobs: path: | *.tsbuildinfo packages/*/*.tsbuildinfo - key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json') }} + dist + packages/*/dist + key: tsbuild-${{ runner.os }}-${{ hashFiles('package-lock.json', 'tsconfig*.json', 'packages/*/tsconfig.json', 'src/**/*.ts', 'packages/*/src/**/*.ts') }} restore-keys: | tsbuild-${{ runner.os }}- diff --git a/src/resources/extensions/gsd/bootstrap/register-extension.ts b/src/resources/extensions/gsd/bootstrap/register-extension.ts index 1ed3031cd..bdcc436ab 100644 --- a/src/resources/extensions/gsd/bootstrap/register-extension.ts +++ b/src/resources/extensions/gsd/bootstrap/register-extension.ts @@ -11,6 +11,7 @@ import { registerQueryTools } from "./query-tools.js"; import { registerHooks } from "./register-hooks.js"; import { registerShortcuts } from "./register-shortcuts.js"; import { writeCrashLog } from "./crash-log.js"; +import { logWarning } from "../workflow-logger.js"; export { writeCrashLog } from "./crash-log.js"; @@ -86,8 +87,9 @@ export function registerGsdExtension(pi: ExtensionAPI): void { try { register(); } catch (err) { - process.stderr.write( - `[gsd] Failed to register ${name}: ${err instanceof Error ? err.message : String(err)}\n`, + logWarning( + "bootstrap", + `Failed to register ${name}: ${err instanceof Error ? err.message : String(err)}`, ); } } diff --git a/src/resources/extensions/gsd/index.ts b/src/resources/extensions/gsd/index.ts index a50fd6c24..88bc6ee15 100644 --- a/src/resources/extensions/gsd/index.ts +++ b/src/resources/extensions/gsd/index.ts @@ -28,8 +28,10 @@ export default async function registerExtension(pi: ExtensionAPI) { const { registerGsdExtension } = await import("./bootstrap/register-extension.js"); registerGsdExtension(pi); } catch (err) { - process.stderr.write( - `[gsd] Extension setup partially failed — /gsd commands are available but shortcuts/tools may be missing: ${err instanceof Error ? err.message : String(err)}\n`, + const { logWarning } = await import("./workflow-logger.js"); + logWarning( + "bootstrap", + `Extension setup partially failed — /gsd commands are available but shortcuts/tools may be missing: ${err instanceof Error ? err.message : String(err)}`, ); } } diff --git a/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts b/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts index 24c2193e0..f48f91dcd 100644 --- a/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +++ b/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts @@ -58,14 +58,14 @@ describe("index.ts bootstrap isolation", () => { ); }); - test("writes to stderr on bootstrap failure", () => { + test("logs warning on bootstrap failure via workflow-logger", () => { assert.ok( - indexSrc.includes("process.stderr.write"), - "must write to stderr when bootstrap fails", + indexSrc.includes("logWarning"), + "must use logWarning when bootstrap fails", ); assert.ok( - indexSrc.includes("[gsd] Extension setup partially failed"), - "stderr message must indicate partial failure with /gsd still available", + indexSrc.includes("Extension setup partially failed"), + "warning message must indicate partial failure with /gsd still available", ); }); }); @@ -141,10 +141,14 @@ describe("register-extension.ts defensive registration", () => { ); }); - test("writes to stderr when a non-critical registration fails", () => { + test("logs warning when a non-critical registration fails", () => { assert.ok( - registerExtSrc.includes("[gsd] Failed to register"), - "must write descriptive error to stderr for individual registration failures", + registerExtSrc.includes("Failed to register"), + "must log descriptive warning for individual registration failures", + ); + assert.ok( + registerExtSrc.includes("logWarning"), + "must use logWarning from workflow-logger", ); }); });