Pass whole extensions rather than just context files (#10910)

Co-authored-by: Jake Macdonald <jakemac@google.com>
This commit is contained in:
Zack Birkenbuel
2025-10-20 16:15:23 -07:00
committed by GitHub
parent 995ae717cc
commit cc7e1472f9
35 changed files with 487 additions and 1193 deletions
@@ -8,6 +8,7 @@ import { type CommandModule } from 'yargs';
import { disableExtension } from '../../config/extension.js';
import { SettingScope } from '../../config/settings.js';
import { getErrorMessage } from '../../utils/errors.js';
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
import { debugLogger } from '@google/gemini-cli-core';
interface DisableArgs {
@@ -16,11 +17,20 @@ interface DisableArgs {
}
export function handleDisable(args: DisableArgs) {
const extensionEnablementManager = new ExtensionEnablementManager();
try {
if (args.scope?.toLowerCase() === 'workspace') {
disableExtension(args.name, SettingScope.Workspace);
disableExtension(
args.name,
SettingScope.Workspace,
extensionEnablementManager,
);
} else {
disableExtension(args.name, SettingScope.User);
disableExtension(
args.name,
SettingScope.User,
extensionEnablementManager,
);
}
debugLogger.log(
`Extension "${args.name}" successfully disabled for scope "${args.scope}".`,
@@ -41,7 +51,7 @@ export const disableCommand: CommandModule = {
type: 'string',
})
.option('scope', {
describe: 'The scope to disable the extenison in.',
describe: 'The scope to disable the extension in.',
type: 'string',
default: SettingScope.User,
})
@@ -8,6 +8,7 @@ import { type CommandModule } from 'yargs';
import { FatalConfigError, getErrorMessage } from '@google/gemini-cli-core';
import { enableExtension } from '../../config/extension.js';
import { SettingScope } from '../../config/settings.js';
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
interface EnableArgs {
name: string;
@@ -15,11 +16,16 @@ interface EnableArgs {
}
export function handleEnable(args: EnableArgs) {
const extensionEnablementManager = new ExtensionEnablementManager();
try {
if (args.scope?.toLowerCase() === 'workspace') {
enableExtension(args.name, SettingScope.Workspace);
enableExtension(
args.name,
SettingScope.Workspace,
extensionEnablementManager,
);
} else {
enableExtension(args.name, SettingScope.User);
enableExtension(args.name, SettingScope.User, extensionEnablementManager);
}
if (args.scope) {
console.log(
@@ -46,7 +52,7 @@ export const enableCommand: CommandModule = {
})
.option('scope', {
describe:
'The scope to enable the extenison in. If not set, will be enabled in all scopes.',
'The scope to enable the extension in. If not set, will be enabled in all scopes.',
type: 'string',
})
.check((argv) => {
@@ -7,7 +7,6 @@
import type { CommandModule } from 'yargs';
import {
loadExtensions,
annotateActiveExtensions,
requestConsentNonInteractive,
} from '../../config/extension.js';
import {
@@ -37,12 +36,7 @@ export async function handleUpdate(args: UpdateArgs) {
// ones.
args.name ? [args.name] : [],
);
const allExtensions = loadExtensions(extensionEnablementManager);
const extensions = annotateActiveExtensions(
allExtensions,
workingDir,
extensionEnablementManager,
);
const extensions = loadExtensions(extensionEnablementManager);
if (args.name) {
try {
const extension = extensions.find(
@@ -58,7 +52,10 @@ export async function handleUpdate(args: UpdateArgs) {
);
return;
}
const updateState = await checkForExtensionUpdate(extension);
const updateState = await checkForExtensionUpdate(
extension,
extensionEnablementManager,
);
if (updateState !== ExtensionUpdateState.UPDATE_AVAILABLE) {
debugLogger.log(`Extension "${args.name}" is already up to date.`);
return;
@@ -66,6 +63,7 @@ export async function handleUpdate(args: UpdateArgs) {
// TODO(chrstnb): we should list extensions if the requested extension is not installed.
const updatedExtensionInfo = (await updateExtension(
extension,
extensionEnablementManager,
workingDir,
requestConsentNonInteractive,
updateState,
@@ -90,6 +88,7 @@ export async function handleUpdate(args: UpdateArgs) {
const extensionState = new Map();
await checkForAllExtensionUpdates(
extensions,
extensionEnablementManager,
(action) => {
if (action.type === 'SET_STATE') {
extensionState.set(action.payload.name, {
@@ -104,6 +103,7 @@ export async function handleUpdate(args: UpdateArgs) {
requestConsentNonInteractive,
extensions,
extensionState,
extensionEnablementManager,
() => {},
);
updateInfos = updateInfos.filter(
+2 -2
View File
@@ -31,7 +31,7 @@ async function getMcpServersFromConfig(): Promise<
}
mcpServers[key] = {
...server,
extensionName: extension.name,
extension,
};
});
}
@@ -115,7 +115,7 @@ export async function listMcpServers(): Promise<void> {
let serverInfo =
serverName +
(server.extensionName ? ` (from ${server.extensionName})` : '') +
(server.extension?.name ? ` (from ${server.extension.name})` : '') +
': ';
if (server.httpUrl) {
serverInfo += `${server.httpUrl} (http)`;