From 45d212f02a74543d54b477123a67785f55cd47df Mon Sep 17 00:00:00 2001 From: Baziar Date: Wed, 23 Sep 2026 12:27:17 -0400 Subject: [PATCH 1/3] chore(agent-frameworks): admit qualified Google ADK adapters --- .../agent-framework-project-kits.test.ts | 26 ++- .../agent-framework-release-admission.test.ts | 14 +- .../agent-framework-selection.test.ts | 16 +- .../agent-framework-user-flow.test.ts | 28 +++- .../src/__tests__/handle-create-flags.test.ts | 150 ++++++++++++------ .../src/__tests__/kit-picker-choices.test.ts | 4 +- .../release-admissions.v2.json | 74 +++++++-- 7 files changed, 225 insertions(+), 87 deletions(-) diff --git a/packages/cli/src/__tests__/agent-framework-project-kits.test.ts b/packages/cli/src/__tests__/agent-framework-project-kits.test.ts index 902e3e4f..5fbd11da 100644 --- a/packages/cli/src/__tests__/agent-framework-project-kits.test.ts +++ b/packages/cli/src/__tests__/agent-framework-project-kits.test.ts @@ -15,7 +15,9 @@ import { readProjectMetadata } from '../utils/project-metadata.js'; import { listBundledAgentFrameworkReleaseAdmissions } from '../agent-frameworks/release-admission.js'; const roots: string[] = []; -const releaseAdmitted = listBundledAgentFrameworkReleaseAdmissions().length === 4; +const admittedAdapterIds = new Set( + listBundledAgentFrameworkReleaseAdmissions().map((admission) => admission.id) +); afterEach(async () => { await Promise.all(roots.splice(0).map((root) => fsExtra.remove(root))); @@ -55,14 +57,22 @@ describe('agent framework project kits', () => { expect(resolveAgentFrameworkProjectKit('agent.google-adk.python')?.adapterId).toBe( 'google-adk-python' ); - expect(isAdmittedAgentFrameworkProjectKit('agent.openai.python')).toBe(releaseAdmitted); - expect(isAdmittedAgentFrameworkProjectKit('agent.openai.typescript')).toBe(releaseAdmitted); - expect(isAdmittedAgentFrameworkProjectKit('agent.google-adk.python')).toBe(false); - expect(isAdmittedAgentFrameworkProjectKit('agent.google-adk.typescript')).toBe(false); + expect(isAdmittedAgentFrameworkProjectKit('agent.openai.python')).toBe( + admittedAdapterIds.has('openai-agents-python') + ); + expect(isAdmittedAgentFrameworkProjectKit('agent.openai.typescript')).toBe( + admittedAdapterIds.has('openai-agents-typescript') + ); + expect(isAdmittedAgentFrameworkProjectKit('agent.google-adk.python')).toBe( + admittedAdapterIds.has('google-adk-python') + ); + expect(isAdmittedAgentFrameworkProjectKit('agent.google-adk.typescript')).toBe( + admittedAdapterIds.has('google-adk-typescript') + ); expect( - kits - .filter((kit) => kit.frameworkId !== 'google-adk') - .every((kit) => isAdmittedAgentFrameworkProjectKit(kit) === releaseAdmitted) + kits.every( + (kit) => isAdmittedAgentFrameworkProjectKit(kit) === admittedAdapterIds.has(kit.adapterId) + ) ).toBe(true); }); diff --git a/packages/cli/src/__tests__/agent-framework-release-admission.test.ts b/packages/cli/src/__tests__/agent-framework-release-admission.test.ts index 601b3ae6..f78585e4 100644 --- a/packages/cli/src/__tests__/agent-framework-release-admission.test.ts +++ b/packages/cli/src/__tests__/agent-framework-release-admission.test.ts @@ -9,9 +9,11 @@ import { } from '../agent-frameworks/index.js'; describe('agent framework release admission', () => { - it('admits exactly the four Microsoft and OpenAI adapters promoted from the reviewed v2 matrix', () => { + it('admits all six adapters promoted from the reviewed v2 matrix', () => { const admissions = listBundledAgentFrameworkReleaseAdmissions(); expect(admissions.map((admission) => admission.id).sort()).toEqual([ + 'google-adk-python', + 'google-adk-typescript', 'microsoft-agent-framework-dotnet', 'microsoft-agent-framework-python', 'openai-agents-python', @@ -30,10 +32,6 @@ describe('agent framework release admission', () => { for (const adapter of BUILTIN_AGENT_FRAMEWORK_ADAPTERS) { const resolution = assessBundledAgentFrameworkRelease(adapter); - if (adapter.manifest.framework.id === 'google-adk') { - expect(resolution.status).toBe('blocked'); - continue; - } expect(resolution.status).toBe('admitted'); expect(resolution.blockers).toEqual([]); } @@ -96,7 +94,7 @@ describe('agent framework release admission', () => { ).not.toHaveProperty('releaseAdapter'); }); - it('keeps stable-labeled OpenAI adapters visible and admitted after promotion', () => { + it('keeps admitted adapters visible with their declared stability after promotion', () => { const registry = createBuiltinAgentFrameworkRegistry( {}, { trustReviewedReleaseAdmissions: true } @@ -106,7 +104,7 @@ describe('agent framework release admission', () => { status: registry.resolveAdapter(entry.manifest.adapter.id).status, stability: entry.manifest.adapter.stability, })); - expect(adapters.filter((adapter) => adapter.status === 'admitted')).toHaveLength(4); + expect(adapters.filter((adapter) => adapter.status === 'admitted')).toHaveLength(6); expect( adapters .filter((adapter) => adapter.id.startsWith('openai-agents-')) @@ -115,7 +113,7 @@ describe('agent framework release admission', () => { expect( adapters .filter((adapter) => adapter.id.startsWith('google-adk-')) - .every((adapter) => adapter.status === 'blocked' && adapter.stability === 'preview') + .every((adapter) => adapter.status === 'admitted' && adapter.stability === 'preview') ).toBe(true); expect( createBuiltinAgentFrameworkRegistry().resolveAdapter('openai-agents-python').status diff --git a/packages/cli/src/__tests__/agent-framework-selection.test.ts b/packages/cli/src/__tests__/agent-framework-selection.test.ts index d602e02b..bb77d21a 100644 --- a/packages/cli/src/__tests__/agent-framework-selection.test.ts +++ b/packages/cli/src/__tests__/agent-framework-selection.test.ts @@ -7,7 +7,9 @@ import { resolveAgentFrameworkSelection, } from '../agent-frameworks/index.js'; -const releaseAdmitted = listBundledAgentFrameworkReleaseAdmissions().length === 4; +const admittedAdapterIds = new Set( + listBundledAgentFrameworkReleaseAdmissions().map((admission) => admission.id) +); describe('agent framework selection', () => { it('refuses to guess Python when Microsoft and OpenAI are both published', () => { @@ -27,7 +29,7 @@ describe('agent framework selection', () => { ).toMatchObject({ adapterId: 'microsoft-agent-framework-python', frameworkId: 'microsoft-agent-framework', - admitted: releaseAdmitted, + admitted: admittedAdapterIds.has('microsoft-agent-framework-python'), }); }); @@ -76,7 +78,7 @@ describe('agent framework selection', () => { ).toMatchObject({ adapterId: 'openai-agents-python', frameworkId: 'openai-agents', - admitted: releaseAdmitted, + admitted: admittedAdapterIds.has('openai-agents-python'), }); expect( resolveAgentFrameworkSelection({ @@ -87,11 +89,11 @@ describe('agent framework selection', () => { ).toMatchObject({ adapterId: 'openai-agents-typescript', frameworkId: 'openai-agents', - admitted: releaseAdmitted, + admitted: admittedAdapterIds.has('openai-agents-typescript'), }); }); - it('selects Google ADK by framework id without guessing or admitting it', () => { + it('selects admitted Google ADK adapters by framework id without guessing', () => { const registry = createBuiltinAgentFrameworkRegistry( {}, { trustReviewedReleaseAdmissions: true } @@ -105,7 +107,7 @@ describe('agent framework selection', () => { ).toMatchObject({ adapterId: 'google-adk-python', frameworkId: 'google-adk', - admitted: false, + admitted: admittedAdapterIds.has('google-adk-python'), }); expect( resolveAgentFrameworkSelection({ @@ -116,7 +118,7 @@ describe('agent framework selection', () => { ).toMatchObject({ adapterId: 'google-adk-typescript', frameworkId: 'google-adk', - admitted: false, + admitted: admittedAdapterIds.has('google-adk-typescript'), }); }); }); diff --git a/packages/cli/src/__tests__/agent-framework-user-flow.test.ts b/packages/cli/src/__tests__/agent-framework-user-flow.test.ts index 008fc83d..72e41b38 100644 --- a/packages/cli/src/__tests__/agent-framework-user-flow.test.ts +++ b/packages/cli/src/__tests__/agent-framework-user-flow.test.ts @@ -16,7 +16,11 @@ import { buildWorkspaceModel, writeWorkspaceModel } from '../workspace-model.js' import { runWorkspaceIntelligenceChain } from '../workspace-intelligence-runner.js'; const roots: string[] = []; -const releaseAdmitted = listBundledAgentFrameworkReleaseAdmissions().length === 4; +const releaseAdmissions = listBundledAgentFrameworkReleaseAdmissions(); +const releaseAdmitted = releaseAdmissions.some( + (admission) => admission.id === 'microsoft-agent-framework-python' +); +const googleAdmitted = releaseAdmissions.some((admission) => admission.id === 'google-adk-python'); async function fixture( options: { secondProject?: boolean; extraProjects?: string[] } = {} @@ -115,7 +119,7 @@ describe.skipIf(releaseAdmitted)('agent framework user flow fail-closed', () => }); }); -describe('Google ADK user flow fail-closed', () => { +describe.skipIf(googleAdmitted)('Google ADK user flow fail-closed', () => { it('refuses prepare while Google adapters remain outside the reviewed admission inventory', async () => { const { workspacePath } = await fixture(); await expect( @@ -130,6 +134,26 @@ describe('Google ADK user flow fail-closed', () => { }); }); +describe.skipIf(!googleAdmitted)('Google ADK user flow', () => { + it('prepares a governed attachment from the reviewed admission', async () => { + const { workspacePath } = await fixture(); + await expect( + prepareAgentFrameworkAttachment({ + workspacePath, + project: 'api', + runtime: 'python', + framework: 'google-adk', + instanceName: 'primary', + }) + ).resolves.toMatchObject({ + status: 'planned', + frameworkId: 'google-adk', + adapterId: 'google-adk-python', + runtime: 'python', + }); + }); +}); + describe.skipIf(!releaseAdmitted)('agent framework user flow', () => { it('turns one attach request into a Goal, hash-bound plan, authorization, and owned files', async () => { const { workspacePath, projectPath } = await fixture(); diff --git a/packages/cli/src/__tests__/handle-create-flags.test.ts b/packages/cli/src/__tests__/handle-create-flags.test.ts index a50301d2..2eb21038 100644 --- a/packages/cli/src/__tests__/handle-create-flags.test.ts +++ b/packages/cli/src/__tests__/handle-create-flags.test.ts @@ -11,7 +11,11 @@ import * as frontendProject from '../frontend-project.js'; import * as officialProject from '../official-project.js'; import { listBundledAgentFrameworkReleaseAdmissions } from '../agent-frameworks/release-admission.js'; -const releaseAdmitted = listBundledAgentFrameworkReleaseAdmissions().length === 4; +const releaseAdmissions = listBundledAgentFrameworkReleaseAdmissions(); +const releaseAdmitted = releaseAdmissions.some( + (admission) => admission.id === 'openai-agents-python' +); +const googleAdmitted = releaseAdmissions.some((admission) => admission.id === 'google-adk-python'); describe('handleCreateOrFallback - wrapper flags handling', () => { let tmpDir: string; @@ -84,11 +88,9 @@ describe('handleCreateOrFallback - wrapper flags handling', () => { expect(runSpy).not.toHaveBeenCalled(); const output = stdoutSpy.mock.calls.map((call) => String(call[0])).join('\n'); expect(output).toContain('Usage: npx workspai create project'); + expect(output).toContain('agent.google-adk.python Google Agent Development Kit · Python'); expect(output).toContain( - 'agent.google-adk.python Google Agent Development Kit · Python (preview · awaiting release admission)' - ); - expect(output).toContain( - 'agent.google-adk.typescript Google Agent Development Kit · TypeScript (preview · awaiting release admission)' + 'agent.google-adk.typescript Google Agent Development Kit · TypeScript' ); expect(output).not.toContain('Usage: rapidkit create project'); }); @@ -153,52 +155,104 @@ describe('handleCreateOrFallback - wrapper flags handling', () => { 60_000 ); - it('refuses Google ADK kits until their adapters are release-admitted', async () => { - await create.createProject('agent-workspace', { - parentDirectory: tmpDir, - profile: 'minimal', - skipPythonEngine: true, - skipGit: true, - yes: true, - }); - const workspacePath = path.join(tmpDir, 'agent-workspace'); - process.chdir(workspacePath); - const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true); - const snapshotWorkspace = async () => - (await fsExtra.readdir(path.join(workspacePath, '.workspai'), { recursive: true })).sort(); - const beforeWorkspace = await snapshotWorkspace(); + it.skipIf(googleAdmitted)( + 'refuses Google ADK kits until their adapters are release-admitted', + async () => { + await create.createProject('agent-workspace', { + parentDirectory: tmpDir, + profile: 'minimal', + skipPythonEngine: true, + skipGit: true, + yes: true, + }); + const workspacePath = path.join(tmpDir, 'agent-workspace'); + process.chdir(workspacePath); + const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true); + const snapshotWorkspace = async () => + (await fsExtra.readdir(path.join(workspacePath, '.workspai'), { recursive: true })).sort(); + const beforeWorkspace = await snapshotWorkspace(); - const dryRun = await index.handleCreateOrFallback([ - 'create', - 'project', - 'agent.google-adk.python', - 'google-python-agent', - '--dry-run', - ]); - expect(dryRun).toBe(1); - expect(await fsExtra.pathExists(path.join(workspacePath, 'google-python-agent'))).toBe(false); - expect(await snapshotWorkspace()).toEqual(beforeWorkspace); - expect(stderrSpy.mock.calls.map((call) => String(call[0])).join('')).toMatch( - /not release-admitted/i - ); + const dryRun = await index.handleCreateOrFallback([ + 'create', + 'project', + 'agent.google-adk.python', + 'google-python-agent', + '--dry-run', + ]); + expect(dryRun).toBe(1); + expect(await fsExtra.pathExists(path.join(workspacePath, 'google-python-agent'))).toBe(false); + expect(await snapshotWorkspace()).toEqual(beforeWorkspace); + expect(stderrSpy.mock.calls.map((call) => String(call[0])).join('')).toMatch( + /not release-admitted/i + ); - stderrSpy.mockClear(); - const code = await index.handleCreateOrFallback([ - 'create', - 'project', - 'agent.google-adk.python', - 'google-python-agent', - '--skip-git', - '--yes', - ]); + stderrSpy.mockClear(); + const code = await index.handleCreateOrFallback([ + 'create', + 'project', + 'agent.google-adk.python', + 'google-python-agent', + '--skip-git', + '--yes', + ]); - expect(code).toBe(1); - expect(await fsExtra.pathExists(path.join(workspacePath, 'google-python-agent'))).toBe(false); - expect(await snapshotWorkspace()).toEqual(beforeWorkspace); - expect(stderrSpy.mock.calls.map((call) => String(call[0])).join('')).toMatch( - /not release-admitted/i - ); - }, 60_000); + expect(code).toBe(1); + expect(await fsExtra.pathExists(path.join(workspacePath, 'google-python-agent'))).toBe(false); + expect(await snapshotWorkspace()).toEqual(beforeWorkspace); + expect(stderrSpy.mock.calls.map((call) => String(call[0])).join('')).toMatch( + /not release-admitted/i + ); + }, + 60_000 + ); + + it.skipIf(!googleAdmitted)( + 'creates admitted Google ADK Python and TypeScript projects', + async () => { + await create.createProject('agent-workspace', { + parentDirectory: tmpDir, + profile: 'minimal', + skipPythonEngine: true, + skipGit: true, + yes: true, + }); + const workspacePath = path.join(tmpDir, 'agent-workspace'); + process.chdir(workspacePath); + + expect( + await index.handleCreateOrFallback([ + 'create', + 'project', + 'agent.google-adk.python', + 'google-python-agent', + '--skip-git', + '--yes', + ]) + ).toBe(0); + expect( + await fsExtra.pathExists( + path.join(workspacePath, 'google-python-agent', 'agents', 'primary', 'main.py') + ) + ).toBe(true); + + expect( + await index.handleCreateOrFallback([ + 'create', + 'project', + 'agent.google-adk.typescript', + 'google-typescript-agent', + '--skip-git', + '--yes', + ]) + ).toBe(0); + expect( + await fsExtra.pathExists( + path.join(workspacePath, 'google-typescript-agent', 'agents', 'primary', 'src', 'main.ts') + ) + ).toBe(true); + }, + 60_000 + ); it.skipIf(!releaseAdmitted)( 'creates a governed agent project through the admitted scaffold lifecycle', diff --git a/packages/cli/src/__tests__/kit-picker-choices.test.ts b/packages/cli/src/__tests__/kit-picker-choices.test.ts index 87c09097..f069869a 100644 --- a/packages/cli/src/__tests__/kit-picker-choices.test.ts +++ b/packages/cli/src/__tests__/kit-picker-choices.test.ts @@ -126,12 +126,12 @@ describe('kit picker choices', () => { expect( buildKitPickerChoices('agent').find((choice) => choice.value === 'agent.google-adk.python') ?.hint - ).toBe('python · preview · awaiting release admission'); + ).toBe('python · release-admitted baseline'); expect( buildKitPickerChoices('agent').find( (choice) => choice.value === 'agent.google-adk.typescript' )?.hint - ).toBe('node · preview · awaiting release admission'); + ).toBe('node · release-admitted baseline'); expect(buildKitPickerChoices('gateway')).toHaveLength(2); expect(buildKitPickerChoices('gateway').map((choice) => choice.value)).toEqual([ 'gateway.openrouter.python', diff --git a/packages/cli/src/agent-frameworks/release-admissions.v2.json b/packages/cli/src/agent-frameworks/release-admissions.v2.json index 5877e1db..8ce70e5b 100644 --- a/packages/cli/src/agent-frameworks/release-admissions.v2.json +++ b/packages/cli/src/agent-frameworks/release-admissions.v2.json @@ -1,11 +1,11 @@ { "schemaVersion": "workspai.agent-framework-release-admissions.v2", - "reviewedAt": "2026-09-20T02:13:30.000Z", + "reviewedAt": "2026-09-23T16:11:23.057Z", "source": { "repository": "chistiq/workspai", - "commit": "2b25305c6806cd9f39fbda66b646ed9304af167f", - "workflowRunId": 35483229302, - "workflowUrl": "https://github.com/chistiq/workspai/actions/runs/35483229302", + "commit": "e382ee7f05e092e71ba605daec442265c6f0657c", + "workflowRunId": 35885971480, + "workflowUrl": "https://github.com/chistiq/workspai/actions/runs/35885971480", "conclusion": "success" }, "adapters": [ @@ -14,52 +14,102 @@ "version": "0.1.0", "manifestSha256": "e4dfa55256ec2ed7f43927d109b09b541a13217f8a4df964f678fd036bcef060", "implementationSha256ByPlatform": { - "linux": "828d1fce4903fdfb3f57c219a299ca10dcd88f819be1d4216b3f64e144decff7", "darwin": "828d1fce4903fdfb3f57c219a299ca10dcd88f819be1d4216b3f64e144decff7", + "linux": "828d1fce4903fdfb3f57c219a299ca10dcd88f819be1d4216b3f64e144decff7", "win32": "c6d803516c5c4f8836a474c6e5f6e29d8894e21d1a915d816c713fa522b57e1f" }, "frameworkVersion": "1.18.0", "runtime": "python", - "platforms": ["linux", "darwin", "win32"] + "platforms": [ + "darwin", + "linux", + "win32" + ] }, { "id": "microsoft-agent-framework-dotnet", "version": "0.1.0", "manifestSha256": "1efa079735d51cc3cbbd2d2fe55815850d8aa39f87de4bac4589d9fbfaf2e8e9", "implementationSha256ByPlatform": { - "linux": "1217f28fdcdacacb2af6bfb9b62053bb4e30fb5a78c41df8e4cb27e03c1aefae", "darwin": "1217f28fdcdacacb2af6bfb9b62053bb4e30fb5a78c41df8e4cb27e03c1aefae", + "linux": "1217f28fdcdacacb2af6bfb9b62053bb4e30fb5a78c41df8e4cb27e03c1aefae", "win32": "1217f28fdcdacacb2af6bfb9b62053bb4e30fb5a78c41df8e4cb27e03c1aefae" }, "frameworkVersion": "1.21.0", "runtime": "dotnet", - "platforms": ["linux", "darwin", "win32"] + "platforms": [ + "darwin", + "linux", + "win32" + ] }, { "id": "openai-agents-python", "version": "0.1.0", "manifestSha256": "f76c9973e07b1a3c7807efc489374cdede84038692d0012e03b530db4bcbba55", "implementationSha256ByPlatform": { - "linux": "cb707b5264728afba17f81639a6551ca4252316773560fe9cde66436c4318b44", "darwin": "cb707b5264728afba17f81639a6551ca4252316773560fe9cde66436c4318b44", + "linux": "cb707b5264728afba17f81639a6551ca4252316773560fe9cde66436c4318b44", "win32": "ecf4451ed364532f17a0a1677753a4c55f9a16e2f924d9033e270c926a552811" }, "frameworkVersion": "0.22.2", "runtime": "python", - "platforms": ["linux", "darwin", "win32"] + "platforms": [ + "darwin", + "linux", + "win32" + ] }, { "id": "openai-agents-typescript", "version": "0.1.0", "manifestSha256": "35b4e04cda42e227ea8d352e3c87ec1ed7c5f53b39aafb734e895d456a32c38f", "implementationSha256ByPlatform": { - "linux": "36f76afbf7f9aa06535cb9261a0600dfc61f41658d7a7c9f755d416ae748ba61", "darwin": "36f76afbf7f9aa06535cb9261a0600dfc61f41658d7a7c9f755d416ae748ba61", + "linux": "36f76afbf7f9aa06535cb9261a0600dfc61f41658d7a7c9f755d416ae748ba61", "win32": "36f76afbf7f9aa06535cb9261a0600dfc61f41658d7a7c9f755d416ae748ba61" }, "frameworkVersion": "0.18.0", "runtime": "node", - "platforms": ["linux", "darwin", "win32"] + "platforms": [ + "darwin", + "linux", + "win32" + ] + }, + { + "id": "google-adk-python", + "version": "0.1.0", + "manifestSha256": "228ea38c9bd16604420c54701c5c6784979a86aeb965a2254894dadd1fb91059", + "implementationSha256ByPlatform": { + "darwin": "fa66e924feaaebc3eaab6767ca3c59a3efe2b3a8c3e9c4bd3c1b561bcc177b8f", + "linux": "fa66e924feaaebc3eaab6767ca3c59a3efe2b3a8c3e9c4bd3c1b561bcc177b8f", + "win32": "06fcdaeab5ddf223c48f77b2f14f6462605778e64c5ac53ddbfb8a8df3029979" + }, + "frameworkVersion": "2.9.2", + "runtime": "python", + "platforms": [ + "darwin", + "linux", + "win32" + ] + }, + { + "id": "google-adk-typescript", + "version": "0.1.0", + "manifestSha256": "be9927f4a04a28632b7396b7fa445c1e3b0da4057179e2665c229ab07332a57d", + "implementationSha256ByPlatform": { + "darwin": "ca7a6d7eae2f14fc9ff071b0972f62c80fc9076c2ed5d5ea240267d59a2cdd3a", + "linux": "ca7a6d7eae2f14fc9ff071b0972f62c80fc9076c2ed5d5ea240267d59a2cdd3a", + "win32": "ca7a6d7eae2f14fc9ff071b0972f62c80fc9076c2ed5d5ea240267d59a2cdd3a" + }, + "frameworkVersion": "2.1.0", + "runtime": "node", + "platforms": [ + "darwin", + "linux", + "win32" + ] } ] } From 2f7e6902ae42584a561ce14718d9a0823d3ff444 Mon Sep 17 00:00:00 2001 From: Baziar Date: Wed, 23 Sep 2026 12:51:38 -0400 Subject: [PATCH 2/3] fix(test): allow cold gateway installs on slow registries --- .../src/__tests__/model-gateway-generated-projects.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/__tests__/model-gateway-generated-projects.test.ts b/packages/cli/src/__tests__/model-gateway-generated-projects.test.ts index 5d77a3de..c6600169 100644 --- a/packages/cli/src/__tests__/model-gateway-generated-projects.test.ts +++ b/packages/cli/src/__tests__/model-gateway-generated-projects.test.ts @@ -16,6 +16,7 @@ import { getDefaultPythonCommand } from '../utils/platform-capabilities.js'; import { buildCleanGitEnv } from '../utils/git-worktree.js'; const roots: string[] = []; +const NPM_INSTALL_TIMEOUT_MS = 240_000; afterEach(async () => { for (const root of roots.splice(0)) { @@ -119,7 +120,7 @@ describe('generated OpenRouter gateway projects', () => { kit, }); const npm = npmCommand(); - run(npm.command, [...npm.prefix, 'install'], root, 120_000, cacheRoot); + run(npm.command, [...npm.prefix, 'install'], root, NPM_INSTALL_TIMEOUT_MS, cacheRoot); run(npm.command, [...npm.prefix, 'run', 'typecheck'], root, 120_000, cacheRoot); run(npm.command, [...npm.prefix, 'run', 'build'], root, 120_000, cacheRoot); const testOutput = run(npm.command, [...npm.prefix, 'test'], root, 120_000, cacheRoot); @@ -135,7 +136,7 @@ describe('generated OpenRouter gateway projects', () => { ); expect(startFailure).toMatch(/OPENROUTER_API_KEY|OPENROUTER_MODEL/); expect(startFailure.toLowerCase()).not.toContain('sk-or-live'); - }, 300_000); + }, 420_000); it('installs and verifies the Python starter without a live API key', async () => { const kit = listModelGatewayProjectKits().find( From 88c46e9e121b56e84baedb8cd4dad696481dffe0 Mon Sep 17 00:00:00 2001 From: Baziar Date: Wed, 23 Sep 2026 13:47:09 -0400 Subject: [PATCH 3/3] test(cli): align package smoke with Google ADK admission --- packages/cli/scripts/enterprise-package-smoke.mjs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/cli/scripts/enterprise-package-smoke.mjs b/packages/cli/scripts/enterprise-package-smoke.mjs index ac1689f4..d9439497 100644 --- a/packages/cli/scripts/enterprise-package-smoke.mjs +++ b/packages/cli/scripts/enterprise-package-smoke.mjs @@ -358,6 +358,8 @@ function assertCliContracts() { .map((adapter) => adapter.id) .sort(); const expectedAdapterIds = [ + 'google-adk-python', + 'google-adk-typescript', 'microsoft-agent-framework-dotnet', 'microsoft-agent-framework-python', 'openai-agents-python', @@ -393,10 +395,11 @@ function assertCliContracts() { fail(`published CLI is missing implemented Google ADK adapter ${googleId}`); } if (google.stability !== 'preview') { - fail(`${googleId} must remain preview until same-SHA qualification (observed: ${google.stability ?? 'missing'})`); - } - if (google.status === 'admitted') { - fail(`${googleId} must not be release-admitted without reviewed Linux/macOS/Windows evidence`); + fail( + `${googleId} must retain its preview stability label after release admission (observed: ${ + google.stability ?? 'missing' + })` + ); } }