From 6613e129de7ab58a09b7cd4a13127195b24da8ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Medrano=20Llamas?= <45878745+rmedranollamas@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:54:12 +0200 Subject: [PATCH 1/4] fix(ci): append trailing slash to registry url in npmrc (#28038) --- .github/actions/setup-npmrc/action.yml | 2 +- .npmrc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-npmrc/action.yml b/.github/actions/setup-npmrc/action.yml index 137451740f..203247bf8a 100644 --- a/.github/actions/setup-npmrc/action.yml +++ b/.github/actions/setup-npmrc/action.yml @@ -19,6 +19,6 @@ runs: run: |- echo ""@google-gemini:registry=https://npm.pkg.github.com"" > ~/.npmrc echo ""//npm.pkg.github.com/:_authToken=${INPUTS_GITHUB_TOKEN}"" >> ~/.npmrc - echo ""@google:registry=https://wombat-dressing-room.appspot.com"" >> ~/.npmrc + echo ""@google:registry=https://wombat-dressing-room.appspot.com/"" >> ~/.npmrc env: INPUTS_GITHUB_TOKEN: '${{ inputs.github-token }}' diff --git a/.npmrc b/.npmrc index 4865e53881..eddcfa6110 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -@google:registry=https://wombat-dressing-room.appspot.com \ No newline at end of file +@google:registry=https://wombat-dressing-room.appspot.com/ \ No newline at end of file From c22137ea0a7c9e588b79870fa1a40cba5b62099a Mon Sep 17 00:00:00 2001 From: Vedant Mahajan Date: Fri, 19 Jun 2026 23:31:01 +0530 Subject: [PATCH 2/4] feat: add eval:inventory CLI command and reporting logic (#28009) --- package.json | 1 + scripts/eval-inventory-cli.ts | 46 +++++++ scripts/tests/eval-inventory.test.ts | 185 +++++++++++++++++++++++++++ scripts/tests/test-setup.ts | 11 +- scripts/utils/eval-inventory.ts | 173 +++++++++++++++++++++++++ 5 files changed, 412 insertions(+), 4 deletions(-) create mode 100644 scripts/eval-inventory-cli.ts create mode 100644 scripts/tests/eval-inventory.test.ts create mode 100644 scripts/utils/eval-inventory.ts diff --git a/package.json b/package.json index 55cd8610eb..91177fe091 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "schema:settings": "tsx ./scripts/generate-settings-schema.ts", "docs:settings": "tsx ./scripts/generate-settings-doc.ts", "docs:keybindings": "tsx ./scripts/generate-keybindings-doc.ts", + "eval:inventory": "tsx ./scripts/eval-inventory-cli.ts", "build": "node scripts/build.js", "build-and-start": "npm run build && npm run start --", "build:vscode": "node scripts/build_vscode_companion.js", diff --git a/scripts/eval-inventory-cli.ts b/scripts/eval-inventory-cli.ts new file mode 100644 index 0000000000..d7be338aa5 --- /dev/null +++ b/scripts/eval-inventory-cli.ts @@ -0,0 +1,46 @@ +#!/usr/bin/env tsx + +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview CLI entry point for the eval inventory command. + * + * Scans all eval source files, runs the static analyzer on each, + * and prints a human-readable inventory report grouped by policy, + * file, and suite. + * + * Usage: + * npm run eval:inventory + * npm run eval:inventory -- --root /path/to/repo + */ + +import { + collectInventory, + formatInventoryReport, +} from './utils/eval-inventory.js'; + +async function main() { + const rootFlagIndex = process.argv.indexOf('--root'); + const repoRoot = + rootFlagIndex !== -1 && process.argv[rootFlagIndex + 1] + ? process.argv[rootFlagIndex + 1] + : process.cwd(); + + const result = await collectInventory(repoRoot); + + if (result.totalFiles === 0) { + console.error('No eval files found under evals/.'); + process.exit(1); + } + + console.log(formatInventoryReport(result)); +} + +main().catch((error) => { + console.error('Fatal error:', error); + process.exit(1); +}); diff --git a/scripts/tests/eval-inventory.test.ts b/scripts/tests/eval-inventory.test.ts new file mode 100644 index 0000000000..e832c84d38 --- /dev/null +++ b/scripts/tests/eval-inventory.test.ts @@ -0,0 +1,185 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { + collectInventory, + formatInventoryReport, + type InventoryResult, +} from '../utils/eval-inventory.js'; +import type { EvalCaseRecord } from '../utils/eval-analysis.js'; + +function makeCaseRecord( + overrides: Partial = {}, +): EvalCaseRecord { + return { + filePath: '/repo/evals/test.eval.ts', + relativePath: 'evals/test.eval.ts', + helperName: 'evalTest', + baseHelperName: 'evalTest', + policy: 'USUALLY_PASSES', + name: 'test case', + hasFiles: false, + hasPrompt: true, + location: { line: 1, column: 1 }, + ...overrides, + }; +} + +describe('eval-inventory', () => { + describe('collectInventory', () => { + it('discovers eval files from the real evals directory', async () => { + const repoRoot = path.resolve(import.meta.dirname, '../../'); + const result = await collectInventory(repoRoot); + + expect(result.totalFiles).toBeGreaterThanOrEqual(36); + expect(result.totalCases).toBeGreaterThanOrEqual(90); + expect(result.files.length).toBe(result.totalFiles); + expect(result.cases.length).toBe(result.totalCases); + + for (const evalCase of result.cases) { + expect(evalCase.name).toBeTruthy(); + expect(evalCase.relativePath).toBeTruthy(); + expect(evalCase.relativePath).toMatch(/^evals\//); + } + }); + + it('returns zero counts for a directory with no eval files', async () => { + const result = await collectInventory(import.meta.dirname); + + expect(result.totalFiles).toBe(0); + expect(result.totalCases).toBe(0); + expect(result.files).toEqual([]); + expect(result.cases).toEqual([]); + }); + }); + + describe('formatInventoryReport', () => { + it('includes summary line with correct counts', () => { + const result: InventoryResult = { + totalFiles: 2, + totalCases: 3, + files: [], + cases: [ + makeCaseRecord({ policy: 'ALWAYS_PASSES', name: 'case-1' }), + makeCaseRecord({ policy: 'USUALLY_PASSES', name: 'case-2' }), + makeCaseRecord({ policy: 'USUALLY_PASSES', name: 'case-3' }), + ], + diagnostics: [], + }; + + const report = formatInventoryReport(result); + + expect(report).toContain('2 files · 3 cases · 0 diagnostics'); + }); + + it('groups cases by policy', () => { + const result: InventoryResult = { + totalFiles: 1, + totalCases: 2, + files: [], + cases: [ + makeCaseRecord({ + policy: 'ALWAYS_PASSES', + name: 'stable test', + }), + makeCaseRecord({ + policy: 'USUALLY_PASSES', + name: 'flaky test', + }), + ], + diagnostics: [], + }; + + const report = formatInventoryReport(result); + + expect(report).toContain('By Policy'); + expect(report).toContain('ALWAYS_PASSES (1 cases)'); + expect(report).toContain('USUALLY_PASSES (1 cases)'); + expect(report).toContain('• stable test'); + expect(report).toContain('• flaky test'); + }); + + it('groups cases by suite name', () => { + const result: InventoryResult = { + totalFiles: 1, + totalCases: 2, + files: [], + cases: [ + makeCaseRecord({ suiteName: 'default', name: 'suite-test' }), + makeCaseRecord({ name: 'no-suite-test' }), + ], + diagnostics: [], + }; + + const report = formatInventoryReport(result); + + expect(report).toContain('By Suite'); + expect(report).toContain('default (1 cases)'); + expect(report).toContain('(no suite) (1 cases)'); + }); + + it('shows diagnostics section when diagnostics exist', () => { + const result: InventoryResult = { + totalFiles: 1, + totalCases: 0, + files: [], + cases: [], + diagnostics: [ + { + severity: 'warning', + message: 'Could not resolve policy', + filePath: '/repo/evals/bad.eval.ts', + location: { line: 5, column: 3 }, + }, + ], + }; + + const report = formatInventoryReport(result); + + expect(report).toContain('Diagnostics'); + expect(report).toContain('1 diagnostics'); + expect(report).toContain( + '⚠ /repo/evals/bad.eval.ts:5:3 — Could not resolve policy', + ); + }); + + it('omits diagnostics section when there are none', () => { + const result: InventoryResult = { + totalFiles: 1, + totalCases: 1, + files: [], + cases: [makeCaseRecord()], + diagnostics: [], + }; + + const report = formatInventoryReport(result); + + expect(report).not.toContain('Diagnostics'); + expect(report).not.toContain('⚠'); + }); + + it('includes helper name in case listing', () => { + const result: InventoryResult = { + totalFiles: 1, + totalCases: 1, + files: [], + cases: [ + makeCaseRecord({ + helperName: 'customHelper', + name: 'custom test', + }), + ], + diagnostics: [], + }; + + const report = formatInventoryReport(result); + + expect(report).toContain('• custom test [customHelper]'); + }); + }); +}); diff --git a/scripts/tests/test-setup.ts b/scripts/tests/test-setup.ts index d4c4b4655f..bcc0be0dc9 100644 --- a/scripts/tests/test-setup.ts +++ b/scripts/tests/test-setup.ts @@ -6,7 +6,10 @@ import { vi } from 'vitest'; -vi.mock('fs', () => ({ - ...vi.importActual('fs'), - appendFileSync: vi.fn(), -})); +vi.mock('fs', async () => { + const actual = await vi.importActual('fs'); + return { + ...actual, + appendFileSync: vi.fn(), + }; +}); diff --git a/scripts/utils/eval-inventory.ts b/scripts/utils/eval-inventory.ts new file mode 100644 index 0000000000..294d563167 --- /dev/null +++ b/scripts/utils/eval-inventory.ts @@ -0,0 +1,173 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import { glob } from 'glob'; + +import { + analyzeEvalSource, + type EvalCaseRecord, + type EvalFileAnalysis, + type EvalAnalysisDiagnostic, + type EvalPolicy, +} from './eval-analysis.js'; + +export interface InventoryResult { + totalFiles: number; + totalCases: number; + files: EvalFileAnalysis[]; + cases: readonly EvalCaseRecord[]; + diagnostics: readonly EvalAnalysisDiagnostic[]; +} + +/** + * Discovers all eval files under the given repo root and runs + * the static analyzer on each, returning the aggregated results. + */ +export async function collectInventory( + repoRoot: string, +): Promise { + const evalsDir = path.join(repoRoot, 'evals'); + const pattern = '**/*.eval.{ts,tsx}'; + + const evalFiles = await glob(pattern, { + cwd: evalsDir, + absolute: true, + nodir: true, + }); + + evalFiles.sort(); + + const files: EvalFileAnalysis[] = []; + const allCases: EvalCaseRecord[] = []; + const allDiagnostics: EvalAnalysisDiagnostic[] = []; + + for (const filePath of evalFiles) { + const sourceText = await fs.promises.readFile(filePath, 'utf-8'); + const analysis = analyzeEvalSource(sourceText, { filePath, repoRoot }); + files.push(analysis); + allCases.push(...analysis.cases); + allDiagnostics.push(...analysis.diagnostics); + } + + return { + totalFiles: files.length, + totalCases: allCases.length, + files, + cases: allCases, + diagnostics: allDiagnostics, + }; +} + +/** + * Formats an InventoryResult into a human-readable report string. + */ +export function formatInventoryReport(result: InventoryResult): string { + const lines: string[] = []; + + lines.push('Eval Inventory'); + lines.push('══════════════'); + lines.push(''); + lines.push( + `${result.totalFiles} files · ${result.totalCases} cases · ${result.diagnostics.length} diagnostics`, + ); + lines.push(''); + + // --- By Policy --- + lines.push('By Policy'); + lines.push('─────────'); + + const byPolicy = groupBy(result.cases, (c) => c.policy); + const policyOrder: EvalPolicy[] = [ + 'ALWAYS_PASSES', + 'USUALLY_PASSES', + 'USUALLY_FAILS', + 'unknown', + ]; + + for (const policy of policyOrder) { + const cases = byPolicy.get(policy); + if (!cases || cases.length === 0) { + continue; + } + + lines.push(`${policy} (${cases.length} cases)`); + + const byFile = groupBy(cases, (c) => c.relativePath); + for (const [filePath, fileCases] of byFile) { + lines.push(` ${filePath}`); + for (const evalCase of fileCases) { + lines.push(` • ${evalCase.name} [${evalCase.helperName}]`); + } + } + lines.push(''); + } + + // --- By Suite --- + lines.push('By Suite'); + lines.push('────────'); + + const bySuite = groupBy(result.cases, (c) => c.suiteName ?? '(no suite)'); + const suiteNames = [...bySuite.keys()].sort((a, b) => { + if (a === b) return 0; + if (a === '(no suite)') return 1; + if (b === '(no suite)') return -1; + return a.localeCompare(b, 'en'); + }); + + for (const suite of suiteNames) { + const cases = bySuite.get(suite)!; + lines.push(`${suite} (${cases.length} cases)`); + + for (const evalCase of cases) { + lines.push( + ` • ${evalCase.name} [${evalCase.relativePath}] (${evalCase.policy})`, + ); + } + lines.push(''); + } + + // --- Diagnostics --- + if (result.diagnostics.length > 0) { + const filePaths = new Map(); + for (const f of result.files) { + filePaths.set(f.filePath, f.relativePath); + } + + lines.push('Diagnostics'); + lines.push('───────────'); + for (const diagnostic of result.diagnostics) { + const displayPath = + diagnostic.filePath === '' + ? diagnostic.filePath + : (filePaths.get(diagnostic.filePath) ?? diagnostic.filePath); + lines.push( + `⚠ ${displayPath}:${diagnostic.location.line}:${diagnostic.location.column} — ${diagnostic.message}`, + ); + } + lines.push(''); + } + + return lines.join('\n'); +} + +function groupBy( + items: readonly T[], + keyFn: (item: T) => string, +): Map { + const groups = new Map(); + for (const item of items) { + const key = keyFn(item); + const group = groups.get(key); + if (group) { + group.push(item); + } else { + groups.set(key, [item]); + } + } + return groups; +} From be7ba2c22adf095880b81da26f1afcc48520eebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Medrano=20Llamas?= <45878745+rmedranollamas@users.noreply.github.com> Date: Sun, 21 Jun 2026 23:27:18 +0200 Subject: [PATCH 3/4] fix: resolve workspace publish failures and scheduler event loop starvation (#28063) --- .github/actions/publish-release/action.yml | 3 +++ integration-tests/parallel-tools.responses | 2 ++ integration-tests/parallel-tools.test.ts | 28 +++++++++++++--------- packages/core/src/scheduler/scheduler.ts | 2 +- packages/test-utils/src/test-rig.ts | 6 +++++ 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.github/actions/publish-release/action.yml b/.github/actions/publish-release/action.yml index 2eab207280..f13867ab61 100644 --- a/.github/actions/publish-release/action.yml +++ b/.github/actions/publish-release/action.yml @@ -167,6 +167,7 @@ runs: shell: 'bash' run: | npm publish \ + --ignore-scripts \ --dry-run="${INPUTS_DRY_RUN}" \ --workspace="${INPUTS_CORE_PACKAGE_NAME}" \ --tag staging-tmp @@ -215,6 +216,7 @@ runs: shell: 'bash' run: | npm publish \ + --ignore-scripts \ --dry-run="${INPUTS_DRY_RUN}" \ --workspace="${INPUTS_CLI_PACKAGE_NAME}" \ --tag staging-tmp @@ -242,6 +244,7 @@ runs: # Tag staging for initial release run: | npm publish \ + --ignore-scripts \ --dry-run="${INPUTS_DRY_RUN}" \ --workspace="${INPUTS_A2A_PACKAGE_NAME}" \ --tag staging-tmp diff --git a/integration-tests/parallel-tools.responses b/integration-tests/parallel-tools.responses index d7beedc8b2..41c3780991 100644 --- a/integration-tests/parallel-tools.responses +++ b/integration-tests/parallel-tools.responses @@ -1 +1,3 @@ +{"method":"generateContent","response":{"candidates":[{"content":{"parts":[{"text":"{\n \"reasoning\": \"Simple task.\",\n \"model_choice\": \"flash\"\n}"}]},"finishReason":"STOP","index":0}]}} {"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"read_file","args":{"file_path":"file1.txt"}}},{"functionCall":{"name":"read_file","args":{"file_path":"file2.txt"}}},{"functionCall":{"name":"write_file","args":{"file_path":"output.txt","content":"wave2"}}},{"functionCall":{"name":"read_file","args":{"file_path":"file3.txt"}}},{"functionCall":{"name":"read_file","args":{"file_path":"file4.txt"}}}, {"text":"All waves completed successfully."}]},"finishReason":"STOP","index":0}]}]} +{"method":"generateContent","response":{"candidates":[{"content":{"parts":[{"text":"All waves completed successfully."}]},"finishReason":"STOP","index":0}]}} \ No newline at end of file diff --git a/integration-tests/parallel-tools.test.ts b/integration-tests/parallel-tools.test.ts index 760f98cd7a..9cd6068db3 100644 --- a/integration-tests/parallel-tools.test.ts +++ b/integration-tests/parallel-tools.test.ts @@ -23,6 +23,7 @@ describe('Parallel Tool Execution Integration', () => { it('should execute [read, read, write, read, read] in correct waves with user approval', async () => { rig.setup('parallel-wave-execution', { fakeResponsesPath: join(import.meta.dirname, 'parallel-tools.responses'), + fakeResponsesNonStrict: true, settings: { tools: { core: ['read_file', 'write_file'], @@ -40,19 +41,24 @@ describe('Parallel Tool Execution Integration', () => { const run = await rig.runInteractive({ approvalMode: 'default' }); - // 1. Trigger the wave - await run.type('ok'); - await run.type('\r'); + try { + // 1. Trigger the wave + await run.type('ok'); + await run.type('\r'); - // 3. Wait for the write_file prompt. - await run.expectText('Allow', 5000); + // 3. Wait for the write_file prompt. + await run.expectText('Allow', 10000); - // 4. Press Enter to approve the write_file. - await run.type('y'); - await run.type('\r'); + // 4. Press Enter to approve the write_file. + await run.type('y'); + await run.type('\r'); - // 5. Wait for the final model response - await run.expectText('All waves completed successfully.', 5000); + // 5. Wait for the final model response + await run.expectText('All waves completed successfully.', 10000); + } catch (err) { + fs.writeFileSync('pty_output_failure.txt', run.output); + throw err; + } // Verify all tool calls were made and succeeded in the logs await rig.expectToolCallSuccess(['write_file']); @@ -73,5 +79,5 @@ describe('Parallel Tool Execution Integration', () => { expect(fs.readFileSync(join(rig.testDir!, 'output.txt'), 'utf8')).toBe( 'wave2', ); - }); + }, 30000); }); diff --git a/packages/core/src/scheduler/scheduler.ts b/packages/core/src/scheduler/scheduler.ts index 5a4f986951..76529c14d3 100644 --- a/packages/core/src/scheduler/scheduler.ts +++ b/packages/core/src/scheduler/scheduler.ts @@ -540,7 +540,7 @@ export class Scheduler { if (isWaitingForExternal && this.state.isActive) { // Yield to the event loop to allow external events (tool completion, user input) to progress. - await new Promise((resolve) => queueMicrotask(() => resolve(true))); + await new Promise((resolve) => setTimeout(resolve, 10)); return true; } diff --git a/packages/test-utils/src/test-rig.ts b/packages/test-utils/src/test-rig.ts index 10a0ffd569..7c8ec5fc38 100644 --- a/packages/test-utils/src/test-rig.ts +++ b/packages/test-utils/src/test-rig.ts @@ -365,6 +365,8 @@ export class TestRig { _lastRunStderr?: string; // Path to the copied fake responses file for this test. fakeResponsesPath?: string; + // Whether to run fake responses in non-strict mode. + fakeResponsesNonStrict?: boolean; // Original fake responses file path for rewriting goldens in record mode. originalFakeResponsesPath?: string; private _interactiveRuns: InteractiveRun[] = []; @@ -377,6 +379,7 @@ export class TestRig { settings?: Record; state?: Record; fakeResponsesPath?: string; + fakeResponsesNonStrict?: boolean; } = {}, ) { this.testName = testName; @@ -398,6 +401,7 @@ export class TestRig { if (options.fakeResponsesPath) { this.fakeResponsesPath = join(this.testDir, 'fake-responses.json'); this.originalFakeResponsesPath = options.fakeResponsesPath; + this.fakeResponsesNonStrict = options.fakeResponsesNonStrict; if (process.env['REGENERATE_MODEL_GOLDENS'] !== 'true') { fs.copyFileSync(options.fakeResponsesPath, this.fakeResponsesPath); } @@ -558,6 +562,8 @@ export class TestRig { if (this.fakeResponsesPath) { if (process.env['REGENERATE_MODEL_GOLDENS'] === 'true') { initialArgs.push('--record-responses', this.fakeResponsesPath); + } else if (this.fakeResponsesNonStrict) { + initialArgs.push('--fake-responses-non-strict', this.fakeResponsesPath); } else { initialArgs.push('--fake-responses', this.fakeResponsesPath); } From d3ef6aca40c5dd75802dbf111d7cf9edbbd6cdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Medrano=20Llamas?= <45878745+rmedranollamas@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:16:46 +0200 Subject: [PATCH 4/4] fix(ci): use wombat dressing room fallback in nightly release to prevent ENEEDAUTH (#28104) --- .github/actions/setup-npmrc/action.yml | 2 +- .github/workflows/release-nightly.yml | 4 ++-- .npmrc | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/setup-npmrc/action.yml b/.github/actions/setup-npmrc/action.yml index 203247bf8a..137451740f 100644 --- a/.github/actions/setup-npmrc/action.yml +++ b/.github/actions/setup-npmrc/action.yml @@ -19,6 +19,6 @@ runs: run: |- echo ""@google-gemini:registry=https://npm.pkg.github.com"" > ~/.npmrc echo ""//npm.pkg.github.com/:_authToken=${INPUTS_GITHUB_TOKEN}"" >> ~/.npmrc - echo ""@google:registry=https://wombat-dressing-room.appspot.com/"" >> ~/.npmrc + echo ""@google:registry=https://wombat-dressing-room.appspot.com"" >> ~/.npmrc env: INPUTS_GITHUB_TOKEN: '${{ inputs.github-token }}' diff --git a/.github/workflows/release-nightly.yml b/.github/workflows/release-nightly.yml index 0310927cf0..226f9eb29c 100644 --- a/.github/workflows/release-nightly.yml +++ b/.github/workflows/release-nightly.yml @@ -145,8 +145,8 @@ jobs: skip-branch-cleanup: true force-skip-tests: "${{ github.event_name != 'schedule' && github.event.inputs.force_skip_tests == 'true' }}" gemini_api_key: '${{ secrets.GEMINI_API_KEY }}' - npm-registry-publish-url: "${{ vars.NPM_REGISTRY_PUBLISH_URL || 'https://registry.npmjs.org/' }}" - npm-registry-url: "${{ vars.NPM_REGISTRY_URL || 'https://registry.npmjs.org/' }}" + npm-registry-publish-url: "${{ vars.NPM_REGISTRY_PUBLISH_URL || 'https://wombat-dressing-room.appspot.com' }}" + npm-registry-url: "${{ vars.NPM_REGISTRY_URL || 'https://wombat-dressing-room.appspot.com' }}" npm-registry-scope: "${{ vars.NPM_REGISTRY_SCOPE || '@google' }}" cli-package-name: "${{ vars.CLI_PACKAGE_NAME || '@google/gemini-cli' }}" core-package-name: "${{ vars.CORE_PACKAGE_NAME || '@google/gemini-cli-core' }}" diff --git a/.npmrc b/.npmrc index eddcfa6110..4865e53881 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -@google:registry=https://wombat-dressing-room.appspot.com/ \ No newline at end of file +@google:registry=https://wombat-dressing-room.appspot.com \ No newline at end of file