From 47af68766924c8d2426cc5f54dd666c887ff5027 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 15 Apr 2026 08:53:28 +0000 Subject: [PATCH 1/5] fix: resolve CI build and test errors - Improve directory cleanup in build-schemas.ts with more robust retry logic - Add missing vitest.config.ts to plugin-hono-server package Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/b438a7ad-7484-4318-8da2-d6d61a73f8d4 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- .../plugin-hono-server/vitest.config.ts | 10 ++++++ packages/spec/scripts/build-schemas.ts | 34 +++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 packages/plugins/plugin-hono-server/vitest.config.ts diff --git a/packages/plugins/plugin-hono-server/vitest.config.ts b/packages/plugins/plugin-hono-server/vitest.config.ts new file mode 100644 index 000000000..782c6a40a --- /dev/null +++ b/packages/plugins/plugin-hono-server/vitest.config.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, +}); diff --git a/packages/spec/scripts/build-schemas.ts b/packages/spec/scripts/build-schemas.ts index 2308d41ec..3c6caee65 100644 --- a/packages/spec/scripts/build-schemas.ts +++ b/packages/spec/scripts/build-schemas.ts @@ -80,10 +80,38 @@ function writeFileWithRetry(filePath: string, content: string, retries = MAX_RET // Clean output directory ensures no stale files remain if (fs.existsSync(OUT_DIR)) { console.log(`Cleaning output directory: ${OUT_DIR}`); - fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: MAX_RETRIES, retryDelay: RETRY_DELAY_BASE_MS }); - + + // Use a more robust cleanup with multiple retries and longer delays + // to handle filesystem race conditions in CI environments + let cleanupSuccess = false; + for (let attempt = 0; attempt < MAX_RETRIES * 2; attempt++) { + try { + // Try removing with native Node.js rmSync + if (fs.existsSync(OUT_DIR)) { + fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }); + } + + // Verify the directory is actually gone + if (!fs.existsSync(OUT_DIR)) { + cleanupSuccess = true; + break; + } + + // If still exists, wait before retrying + sleepSync(100 * (attempt + 1)); + } catch (error) { + // If this is the last attempt, log but continue (we'll try to work with what's there) + if (attempt === (MAX_RETRIES * 2 - 1)) { + console.warn(`Warning: Failed to fully clean directory after ${attempt + 1} attempts:`, error); + // Try to continue anyway - ensureDir will create missing parts + break; + } + // Wait before retry with exponential backoff + sleepSync(100 * (attempt + 1)); + } + } + // Wait a bit to ensure file system has synced - // This prevents ENOENT errors on some file systems, particularly in CI environments sleepSync(FS_SYNC_DELAY_MS); } From d6b82a60af41eb9b058e71b9651eb342de91d784 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 15 Apr 2026 09:11:20 +0000 Subject: [PATCH 2/5] fix: add path aliases to vitest config for plugin-hono-server Resolves module resolution issues in tests by adding aliases for @objectstack/core and @objectstack/spec to vitest.config.ts Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/plugins/plugin-hono-server/vitest.config.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/plugins/plugin-hono-server/vitest.config.ts b/packages/plugins/plugin-hono-server/vitest.config.ts index 782c6a40a..5591024cb 100644 --- a/packages/plugins/plugin-hono-server/vitest.config.ts +++ b/packages/plugins/plugin-hono-server/vitest.config.ts @@ -1,10 +1,17 @@ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. import { defineConfig } from 'vitest/config'; +import path from 'path'; export default defineConfig({ test: { globals: true, environment: 'node', }, + resolve: { + alias: { + '@objectstack/core': path.resolve(__dirname, '../../core/src'), + '@objectstack/spec': path.resolve(__dirname, '../../spec/src'), + }, + }, }); From d8a828b5ee2da4eaa322de806b5632c3de99eb4f Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 15 Apr 2026 09:11:47 +0000 Subject: [PATCH 3/5] fix: add missing vitest.config.ts for driver-memory and service-ai These packages were missing vitest configuration files, causing test failures in CI. Added configs with proper path aliases for @objectstack/core and @objectstack/spec. Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/plugins/driver-memory/vitest.config.ts | 17 +++++++++++++++++ packages/services/service-ai/vitest.config.ts | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 packages/plugins/driver-memory/vitest.config.ts create mode 100644 packages/services/service-ai/vitest.config.ts diff --git a/packages/plugins/driver-memory/vitest.config.ts b/packages/plugins/driver-memory/vitest.config.ts new file mode 100644 index 000000000..5591024cb --- /dev/null +++ b/packages/plugins/driver-memory/vitest.config.ts @@ -0,0 +1,17 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +import { defineConfig } from 'vitest/config'; +import path from 'path'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, + resolve: { + alias: { + '@objectstack/core': path.resolve(__dirname, '../../core/src'), + '@objectstack/spec': path.resolve(__dirname, '../../spec/src'), + }, + }, +}); diff --git a/packages/services/service-ai/vitest.config.ts b/packages/services/service-ai/vitest.config.ts new file mode 100644 index 000000000..d2b3fb57b --- /dev/null +++ b/packages/services/service-ai/vitest.config.ts @@ -0,0 +1,17 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +import { defineConfig } from 'vitest/config'; +import path from 'path'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, + resolve: { + alias: { + '@objectstack/core': path.resolve(__dirname, '../../../core/src'), + '@objectstack/spec': path.resolve(__dirname, '../../../spec/src'), + }, + }, +}); From 5bad4e2d9da9c4aae9a8172689a8ab63020eb12d Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 15 Apr 2026 09:34:24 +0000 Subject: [PATCH 4/5] fix: resolve test failures and vitest config issues - Add missing 'use' method to mock in hono-plugin.test.ts to fix "rawApp.use is not a function" error - Update vitest configs to use index.ts paths and add subpath aliases (@objectstack/spec/api, /contracts, /data, etc.) - Remove unused cleanupSuccess variable in build-schemas.ts - Use RETRY_DELAY_BASE_MS constant consistently for exponential backoff delays Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/1d9e019e-bf4c-40a2-9034-f3c8d51a7cc0 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/plugins/driver-memory/vitest.config.ts | 7 +++++-- .../plugins/plugin-hono-server/src/hono-plugin.test.ts | 1 + packages/plugins/plugin-hono-server/vitest.config.ts | 7 +++++-- packages/services/service-ai/vitest.config.ts | 7 +++++-- packages/spec/scripts/build-schemas.ts | 10 ++++------ 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/plugins/driver-memory/vitest.config.ts b/packages/plugins/driver-memory/vitest.config.ts index 5591024cb..34eb172d1 100644 --- a/packages/plugins/driver-memory/vitest.config.ts +++ b/packages/plugins/driver-memory/vitest.config.ts @@ -10,8 +10,11 @@ export default defineConfig({ }, resolve: { alias: { - '@objectstack/core': path.resolve(__dirname, '../../core/src'), - '@objectstack/spec': path.resolve(__dirname, '../../spec/src'), + '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), + '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), + '@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'), + '@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'), + '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, }, }); diff --git a/packages/plugins/plugin-hono-server/src/hono-plugin.test.ts b/packages/plugins/plugin-hono-server/src/hono-plugin.test.ts index 8c2b2d69f..23e4354fe 100644 --- a/packages/plugins/plugin-hono-server/src/hono-plugin.test.ts +++ b/packages/plugins/plugin-hono-server/src/hono-plugin.test.ts @@ -27,6 +27,7 @@ vi.mock('./adapter', () => ({ close: vi.fn(), getRawApp: vi.fn().mockReturnValue({ get: vi.fn(), + use: vi.fn(), }) }; }) diff --git a/packages/plugins/plugin-hono-server/vitest.config.ts b/packages/plugins/plugin-hono-server/vitest.config.ts index 5591024cb..0e2727807 100644 --- a/packages/plugins/plugin-hono-server/vitest.config.ts +++ b/packages/plugins/plugin-hono-server/vitest.config.ts @@ -10,8 +10,11 @@ export default defineConfig({ }, resolve: { alias: { - '@objectstack/core': path.resolve(__dirname, '../../core/src'), - '@objectstack/spec': path.resolve(__dirname, '../../spec/src'), + '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), + '@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'), + '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), + '@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'), + '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, }, }); diff --git a/packages/services/service-ai/vitest.config.ts b/packages/services/service-ai/vitest.config.ts index d2b3fb57b..be60d0e0f 100644 --- a/packages/services/service-ai/vitest.config.ts +++ b/packages/services/service-ai/vitest.config.ts @@ -10,8 +10,11 @@ export default defineConfig({ }, resolve: { alias: { - '@objectstack/core': path.resolve(__dirname, '../../../core/src'), - '@objectstack/spec': path.resolve(__dirname, '../../../spec/src'), + '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), + '@objectstack/spec/ai': path.resolve(__dirname, '../../spec/src/ai/index.ts'), + '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), + '@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'), + '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, }, }); diff --git a/packages/spec/scripts/build-schemas.ts b/packages/spec/scripts/build-schemas.ts index 3c6caee65..32934e380 100644 --- a/packages/spec/scripts/build-schemas.ts +++ b/packages/spec/scripts/build-schemas.ts @@ -83,22 +83,20 @@ if (fs.existsSync(OUT_DIR)) { // Use a more robust cleanup with multiple retries and longer delays // to handle filesystem race conditions in CI environments - let cleanupSuccess = false; for (let attempt = 0; attempt < MAX_RETRIES * 2; attempt++) { try { // Try removing with native Node.js rmSync if (fs.existsSync(OUT_DIR)) { - fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }); + fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: RETRY_DELAY_BASE_MS * 2 }); } // Verify the directory is actually gone if (!fs.existsSync(OUT_DIR)) { - cleanupSuccess = true; break; } - // If still exists, wait before retrying - sleepSync(100 * (attempt + 1)); + // If still exists, wait before retrying with exponential backoff + sleepSync(RETRY_DELAY_BASE_MS * (attempt + 1)); } catch (error) { // If this is the last attempt, log but continue (we'll try to work with what's there) if (attempt === (MAX_RETRIES * 2 - 1)) { @@ -107,7 +105,7 @@ if (fs.existsSync(OUT_DIR)) { break; } // Wait before retry with exponential backoff - sleepSync(100 * (attempt + 1)); + sleepSync(RETRY_DELAY_BASE_MS * (attempt + 1)); } } From 2695fb9b35707f9118e1443a840a9ef390b30474 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Wed, 15 Apr 2026 09:48:19 +0000 Subject: [PATCH 5/5] fix: add missing subpath aliases to vitest configs and fix plugin-auth test mocks - Add @objectstack/spec/api and @objectstack/spec/kernel aliases to driver-memory, service-ai, and plugin-hono-server vitest configs - Add missing get() method to rawApp mocks in plugin-auth tests - Ensures all packages that depend on @objectstack/core have complete alias definitions for transitive dependencies - Fixes ENOTDIR error: "not a directory, open '.../spec/src/index.ts/api'" - Fixes TypeError: "rawApp.get is not a function" in plugin-auth tests Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/dbd1f109-9696-4678-a767-f2f51a085159 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- packages/plugins/driver-memory/vitest.config.ts | 2 ++ packages/plugins/plugin-auth/src/auth-plugin.test.ts | 9 ++++++--- packages/plugins/plugin-hono-server/vitest.config.ts | 2 ++ packages/services/service-ai/vitest.config.ts | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/plugins/driver-memory/vitest.config.ts b/packages/plugins/driver-memory/vitest.config.ts index 34eb172d1..fcded82ed 100644 --- a/packages/plugins/driver-memory/vitest.config.ts +++ b/packages/plugins/driver-memory/vitest.config.ts @@ -11,8 +11,10 @@ export default defineConfig({ resolve: { alias: { '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), + '@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'), '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), '@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'), + '@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'), '@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'), '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, diff --git a/packages/plugins/plugin-auth/src/auth-plugin.test.ts b/packages/plugins/plugin-auth/src/auth-plugin.test.ts index cd9855fc0..63b42523d 100644 --- a/packages/plugins/plugin-auth/src/auth-plugin.test.ts +++ b/packages/plugins/plugin-auth/src/auth-plugin.test.ts @@ -137,6 +137,7 @@ describe('AuthPlugin', () => { it('should register routes with HTTP server on kernel:ready', async () => { const mockRawApp = { all: vi.fn(), + get: vi.fn(), }; const mockHttpServer = { @@ -173,6 +174,7 @@ describe('AuthPlugin', () => { it('should log via ctx.logger when better-auth returns a 500 response', async () => { const mockRawApp = { all: vi.fn(), + get: vi.fn(), }; const mockHttpServer = { @@ -270,7 +272,7 @@ describe('AuthPlugin', () => { }); it('should auto-detect baseUrl from http-server port when port differs', async () => { - const mockRawApp = { all: vi.fn() }; + const mockRawApp = { all: vi.fn(), get: vi.fn() }; const mockHttpServer = { post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(), patch: vi.fn(), use: vi.fn(), @@ -306,7 +308,7 @@ describe('AuthPlugin', () => { (mockContext.registerService as any).mockClear(); await localPlugin.init(mockContext); - const mockRawApp = { all: vi.fn() }; + const mockRawApp = { all: vi.fn(), get: vi.fn() }; const mockHttpServer = { post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(), patch: vi.fn(), use: vi.fn(), @@ -338,7 +340,7 @@ describe('AuthPlugin', () => { (mockContext.registerService as any).mockClear(); await localPlugin.init(mockContext); - const mockRawApp = { all: vi.fn() }; + const mockRawApp = { all: vi.fn(), get: vi.fn() }; const mockHttpServer = { post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(), patch: vi.fn(), use: vi.fn(), @@ -400,6 +402,7 @@ describe('AuthPlugin', () => { const mockRawApp = { all: vi.fn(), + get: vi.fn(), }; const mockHttpServer = { diff --git a/packages/plugins/plugin-hono-server/vitest.config.ts b/packages/plugins/plugin-hono-server/vitest.config.ts index 0e2727807..fcded82ed 100644 --- a/packages/plugins/plugin-hono-server/vitest.config.ts +++ b/packages/plugins/plugin-hono-server/vitest.config.ts @@ -13,6 +13,8 @@ export default defineConfig({ '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), '@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'), '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), + '@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'), + '@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'), '@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'), '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, diff --git a/packages/services/service-ai/vitest.config.ts b/packages/services/service-ai/vitest.config.ts index be60d0e0f..2b2203c2b 100644 --- a/packages/services/service-ai/vitest.config.ts +++ b/packages/services/service-ai/vitest.config.ts @@ -12,8 +12,11 @@ export default defineConfig({ alias: { '@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'), '@objectstack/spec/ai': path.resolve(__dirname, '../../spec/src/ai/index.ts'), + '@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'), '@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'), '@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'), + '@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'), + '@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'), '@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'), }, },