From a5fd5d0b9fcafcc2eb1cc92e8e6405716dbb103f Mon Sep 17 00:00:00 2001 From: Gen Zhang Date: Wed, 4 Mar 2026 22:18:54 +0000 Subject: [PATCH] feat(release): ship esbuild bundle in npm package (#19171) Co-authored-by: Yuna Seol --- .github/actions/publish-release/action.yml | 7 +++ scripts/prepare-npm-release.js | 67 ++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 scripts/prepare-npm-release.js diff --git a/.github/actions/publish-release/action.yml b/.github/actions/publish-release/action.yml index 8f062205cb..70a413f13a 100644 --- a/.github/actions/publish-release/action.yml +++ b/.github/actions/publish-release/action.yml @@ -192,6 +192,13 @@ runs: INPUTS_CLI_PACKAGE_NAME: '${{ inputs.cli-package-name }}' INPUTS_A2A_PACKAGE_NAME: '${{ inputs.a2a-package-name }}' + - name: '📦 Prepare bundled CLI for npm release' + if: "inputs.npm-registry-url != 'https://npm.pkg.github.com/'" + working-directory: '${{ inputs.working-directory }}' + shell: 'bash' + run: | + node ${{ github.workspace }}/scripts/prepare-npm-release.js + - name: 'Get CLI Token' uses: './.github/actions/npm-auth-token' id: 'cli-token' diff --git a/scripts/prepare-npm-release.js b/scripts/prepare-npm-release.js new file mode 100644 index 0000000000..6775b23dfb --- /dev/null +++ b/scripts/prepare-npm-release.js @@ -0,0 +1,67 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import fs from 'node:fs'; +import path from 'node:path'; + +const rootDir = process.cwd(); + +function readJson(filePath) { + return JSON.parse(fs.readFileSync(path.resolve(rootDir, filePath), 'utf-8')); +} + +function writeJson(filePath, data) { + fs.writeFileSync( + path.resolve(rootDir, filePath), + JSON.stringify(data, null, 2), + ); +} + +// Copy bundle directory into packages/cli +const sourceBundleDir = path.resolve(rootDir, 'bundle'); +const destBundleDir = path.resolve(rootDir, 'packages/cli/bundle'); + +if (fs.existsSync(sourceBundleDir)) { + fs.rmSync(destBundleDir, { recursive: true, force: true }); + fs.cpSync(sourceBundleDir, destBundleDir, { recursive: true }); + console.log('Copied bundle/ directory to packages/cli/'); +} else { + console.error( + 'Error: bundle/ directory not found at project root. Please run `npm run bundle` first.', + ); + process.exit(1); +} + +// Inherit optionalDependencies from root package.json, excluding dev-only packages. +const rootPkg = readJson('package.json'); +const optionalDependencies = { ...(rootPkg.optionalDependencies || {}) }; +delete optionalDependencies['gemini-cli-devtools']; + +// Update @google/gemini-cli package.json for bundled npm release +const cliPkgPath = 'packages/cli/package.json'; +const cliPkg = readJson(cliPkgPath); + +cliPkg.files = ['bundle/']; +cliPkg.bin = { + gemini: 'bundle/gemini.js', +}; + +delete cliPkg.dependencies; +delete cliPkg.devDependencies; +delete cliPkg.scripts; +delete cliPkg.main; +delete cliPkg.config; + +cliPkg.optionalDependencies = optionalDependencies; + +writeJson(cliPkgPath, cliPkg); + +console.log('Updated packages/cli/package.json for bundled npm release.'); +console.log( + 'optionalDependencies:', + JSON.stringify(optionalDependencies, null, 2), +); +console.log('Successfully prepared packages for npm release.');