From 6e53d6dbf1461c0d86229beefa9bec2a275b8fc5 Mon Sep 17 00:00:00 2001 From: Allen Hutchison Date: Wed, 19 Nov 2025 16:01:30 -0800 Subject: [PATCH 1/2] feat: add version syncing scripts and hooks --- package.json | 4 ++- scripts/release.js | 3 ++- scripts/set-version.js | 60 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 scripts/set-version.js diff --git a/package.json b/package.json index 964ef5f4..96cd2220 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "lint": "eslint .", "lint:fix": "eslint . --fix", "release": "node scripts/release.js", - "release:dev": "npm install && npm run build && node scripts/release.js" + "release:dev": "npm install && npm run build && node scripts/release.js", + "set-version": "node scripts/set-version.js", + "version": "node scripts/set-version.js && git add workspace-server/package.json workspace-server/src/index.ts" }, "dependencies": { "@google-apps/chat": "^0.21.0", diff --git a/scripts/release.js b/scripts/release.js index 20ff56e9..bd14423e 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -82,7 +82,8 @@ const main = async () => { } }); - const version = process.env.GITHUB_REF_NAME || '0.0.1'; + const packageJson = require('../package.json'); + const version = process.env.GITHUB_REF_NAME || packageJson.version; // Generate the gemini-extension.json file const geminiExtensionJson = { diff --git a/scripts/set-version.js b/scripts/set-version.js new file mode 100644 index 00000000..76c1eeea --- /dev/null +++ b/scripts/set-version.js @@ -0,0 +1,60 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +const fs = require('node:fs'); +const path = require('node:path'); + +const rootDir = path.join(__dirname, '..'); +const packageJsonPath = path.join(rootDir, 'package.json'); +const workspaceServerPackageJsonPath = path.join(rootDir, 'workspace-server', 'package.json'); +const workspaceServerIndexPath = path.join(rootDir, 'workspace-server', 'src', 'index.ts'); + +const updateJsonFile = (filePath, version) => { + const content = JSON.parse(fs.readFileSync(filePath, 'utf8')); + content.version = version; + fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n'); + console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); +}; + +const updateTsFile = (filePath, version) => { + let content = fs.readFileSync(filePath, 'utf8'); + // Regex to find version: "x.y.z" and replace it + // Matches version: "..." or version: '...' + const regex = /(version:\s*["'])[^"']*(["'])/; + + if (regex.test(content)) { + content = content.replace(regex, `$1${version}$2`); + fs.writeFileSync(filePath, content); + console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); + } else { + console.error(`Could not find version string in ${path.relative(rootDir, filePath)}`); + process.exit(1); + } +}; + +const main = () => { + let version = process.argv[2]; + + if (version) { + // If version is provided as arg, update root package.json first + updateJsonFile(packageJsonPath, version); + } else { + // Otherwise read from root package.json + const packageJson = require(packageJsonPath); + version = packageJson.version; + console.log(`Using version from package.json: ${version}`); + } + + if (!version) { + console.error('No version specified and no version found in package.json'); + process.exit(1); + } + + updateJsonFile(workspaceServerPackageJsonPath, version); + updateTsFile(workspaceServerIndexPath, version); +}; + +main(); From 1ac10d71f164d1e3982ebaf2176a5ec2928b0824 Mon Sep 17 00:00:00 2001 From: Allen Hutchison Date: Thu, 20 Nov 2025 12:35:32 -0800 Subject: [PATCH 2/2] fix: add error handling and verification to set-version script --- scripts/set-version.js | 44 ++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/scripts/set-version.js b/scripts/set-version.js index 76c1eeea..b47dfca7 100644 --- a/scripts/set-version.js +++ b/scripts/set-version.js @@ -13,24 +13,38 @@ const workspaceServerPackageJsonPath = path.join(rootDir, 'workspace-server', 'p const workspaceServerIndexPath = path.join(rootDir, 'workspace-server', 'src', 'index.ts'); const updateJsonFile = (filePath, version) => { - const content = JSON.parse(fs.readFileSync(filePath, 'utf8')); - content.version = version; - fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n'); - console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); + try { + const content = JSON.parse(fs.readFileSync(filePath, 'utf8')); + content.version = version; + fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n'); + console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); + } catch (error) { + console.error(`Failed to update JSON file at ${path.relative(rootDir, filePath)}:`, error); + process.exit(1); + } }; const updateTsFile = (filePath, version) => { - let content = fs.readFileSync(filePath, 'utf8'); - // Regex to find version: "x.y.z" and replace it - // Matches version: "..." or version: '...' - const regex = /(version:\s*["'])[^"']*(["'])/; - - if (regex.test(content)) { - content = content.replace(regex, `$1${version}$2`); - fs.writeFileSync(filePath, content); - console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); - } else { - console.error(`Could not find version string in ${path.relative(rootDir, filePath)}`); + try { + const content = fs.readFileSync(filePath, 'utf8'); + // Regex to find version: "x.y.z" and replace it + // Matches version: "..." or version: '...' + const regex = /(version:\s*["'])[^"']*(["'])/; + + if (regex.test(content)) { + const newContent = content.replace(regex, `$1${version}$2`); + if (content !== newContent) { + fs.writeFileSync(filePath, newContent); + console.log(`Updated ${path.relative(rootDir, filePath)} to version ${version}`); + } else { + console.log(`Version in ${path.relative(rootDir, filePath)} is already ${version}`); + } + } else { + console.error(`Could not find version string in ${path.relative(rootDir, filePath)}`); + process.exit(1); + } + } catch (error) { + console.error(`Failed to update TS file at ${path.relative(rootDir, filePath)}:`, error); process.exit(1); } };