Repository: google-gemini/gemini-cli (TypeScript)

Issue:
Notify users when a new version of the Gemini CLI Companion extension is available
### What would you like to be added?

A notification that alerts users when a new version of the Gemini CLI Companion extension is available and provides a clear call to action to update.

This notification should include:
- A message that a new version of the Gemini CLI has been released
- The current version and the new version numbers
- A button or link to a command that updates the CLI to the latest version
- An option to dismiss the notification

### Why is this needed?

By providing a clear and non-intrusive notification, we can encourage users to keep their CLI up-to-date, ensuring a better and more consistent user experience.

### Additional context

_No response_



Fix (patch):
diff --git a/packages/vscode-ide-companion/src/extension.ts b/packages/vscode-ide-companion/src/extension.ts
index 36fc4029d10..66020cb94f3 100644
--- a/packages/vscode-ide-companion/src/extension.ts
+++ b/packages/vscode-ide-companion/src/extension.ts
@@ -6,9 +6,11 @@
 
 import * as vscode from 'vscode';
 import { IDEServer } from './ide-server.js';
+import semver from 'semver';
 import { DiffContentProvider, DiffManager } from './diff-manager.js';
 import { createLogger } from './utils/logger.js';
 
+const CLI_IDE_COMPANION_IDENTIFIER = 'Google.gemini-cli-vscode-ide-companion';
 const INFO_MESSAGE_SHOWN_KEY = 'geminiCliInfoMessageShown';
 export const DIFF_SCHEME = 'gemini-diff';
 
@@ -17,11 +19,79 @@ let logger: vscode.OutputChannel;
 
 let log: (message: string) => void = () => {};
 
+async function checkForUpdates(
+  context: vscode.ExtensionContext,
+  log: (message: string) => void,
+) {
+  try {
+    const currentVersion = context.extension.packageJSON.version;
+
+    // Fetch extension details from the VSCode Marketplace.
+    const response = await fetch(
+      'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery',
+      {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+          Accept: 'application/json;api-version=7.1-preview.1',
+        },
+        body: JSON.stringify({
+          filters: [
+            {
+              criteria: [
+                {
+                  filterType: 7, // Corresponds to ExtensionName
+                  value: CLI_IDE_COMPANION_IDENTIFIER,
+                },
+              ],
+            },
+          ],
+          // See: https://learn.microsoft.com/en-us/azure/devops/extend/gallery/apis/hyper-linking?view=azure-devops
+          // 946 = IncludeVersions | IncludeFiles | IncludeCategoryAndTags |
+          //       IncludeShortDescription | IncludePublisher | IncludeStatistics
+          flags: 946,
+        }),
+      },
+    );
+
+    if (!response.ok) {
+      log(
+        `Failed to fetch latest version info from marketplace: ${response.statusText}`,
+      );
+      return;
+    }
+
+    const data = await response.json();
+    const extension = data?.results?.[0]?.extensions?.[0];
+    // The versions are sorted by date, so the first one is the latest.
+    const latestVersion = extension?.versions?.[0]?.version;
+
+    if (latestVersion && semver.gt(latestVersion, currentVersion)) {
+      const selection = await vscode.window.showInformationMessage(
+        `A new version (${latestVersion}) of the Gemini CLI Companion extension is available.`,
+        'Update to latest version',
+      );
+      if (selection === 'Update to latest version') {
+        // The install command will update the extension if a newer version is found.
+        await vscode.commands.executeCommand(
+          'workbench.extensions.installExtension',
+          CLI_IDE_COMPANION_IDENTIFIER,
+        );
+      }
+    }
+  } catch (error) {
+    const message = error instanceof Error ? error.message : String(error);
+    log(`Error checking for extension updates: ${message}`);
+  }
+}
+
 export async function activate(context: vscode.ExtensionContext) {
   logger = vscode.window.createOutputChannel('Gemini CLI IDE Companion');
   log = createLogger(context, logger);
   log('Extension activated');
 
+  checkForUpdates(context, log);
+
   const diffContentProvider = new DiffContentProvider();
   const diffManager = new DiffManager(log, diffContentProvider);