use coreEvents.emitFeedback in extension enablement (#11985)

This commit is contained in:
Jacob MacDonald
2025-10-24 14:47:13 -07:00
committed by GitHub
parent 810d940e57
commit c20b88cee2
2 changed files with 23 additions and 13 deletions

View File

@@ -10,7 +10,11 @@ import * as os from 'node:os';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { ExtensionEnablementManager, Override } from './extensionEnablement.js';
import { GEMINI_DIR, type GeminiCLIExtension } from '@google/gemini-cli-core';
import {
coreEvents,
GEMINI_DIR,
type GeminiCLIExtension,
} from '@google/gemini-cli-core';
vi.mock('os', async (importOriginal) => {
const mockedOs = await importOriginal<typeof os>();
@@ -272,20 +276,20 @@ describe('ExtensionEnablementManager', () => {
});
describe('validateExtensionOverrides', () => {
let consoleErrorSpy: ReturnType<typeof vi.spyOn>;
let coreEventsEmitSpy: ReturnType<typeof vi.spyOn>;
beforeEach(() => {
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
coreEventsEmitSpy = vi.spyOn(coreEvents, 'emitFeedback');
});
afterEach(() => {
consoleErrorSpy.mockRestore();
coreEventsEmitSpy.mockRestore();
});
it('should not log an error if enabledExtensionNamesOverride is empty', () => {
const manager = new ExtensionEnablementManager([]);
manager.validateExtensionOverrides([]);
expect(consoleErrorSpy).not.toHaveBeenCalled();
expect(coreEventsEmitSpy).not.toHaveBeenCalled();
});
it('should not log an error if all enabledExtensionNamesOverride are valid', () => {
@@ -295,7 +299,7 @@ describe('ExtensionEnablementManager', () => {
{ name: 'ext-two' },
] as GeminiCLIExtension[];
manager.validateExtensionOverrides(extensions);
expect(consoleErrorSpy).not.toHaveBeenCalled();
expect(coreEventsEmitSpy).not.toHaveBeenCalled();
});
it('should log an error for each invalid extension name in enabledExtensionNamesOverride', () => {
@@ -309,11 +313,13 @@ describe('ExtensionEnablementManager', () => {
{ name: 'ext-two' },
] as GeminiCLIExtension[];
manager.validateExtensionOverrides(extensions);
expect(consoleErrorSpy).toHaveBeenCalledTimes(2);
expect(consoleErrorSpy).toHaveBeenCalledWith(
expect(coreEventsEmitSpy).toHaveBeenCalledTimes(2);
expect(coreEventsEmitSpy).toHaveBeenCalledWith(
'error',
'Extension not found: ext-invalid',
);
expect(consoleErrorSpy).toHaveBeenCalledWith(
expect(coreEventsEmitSpy).toHaveBeenCalledWith(
'error',
'Extension not found: ext-another-invalid',
);
});
@@ -321,7 +327,7 @@ describe('ExtensionEnablementManager', () => {
it('should not log an error if "none" is in enabledExtensionNamesOverride', () => {
const manager = new ExtensionEnablementManager(['none']);
manager.validateExtensionOverrides([]);
expect(consoleErrorSpy).not.toHaveBeenCalled();
expect(coreEventsEmitSpy).not.toHaveBeenCalled();
});
});
});

View File

@@ -6,7 +6,7 @@
import fs from 'node:fs';
import path from 'node:path';
import type { GeminiCLIExtension } from '@google/gemini-cli-core';
import { coreEvents, type GeminiCLIExtension } from '@google/gemini-cli-core';
import { ExtensionStorage } from './storage.js';
export interface ExtensionEnablementConfig {
@@ -129,7 +129,7 @@ export class ExtensionEnablementManager {
if (
!extensions.some((ext) => ext.name.toLowerCase() === name.toLowerCase())
) {
console.error(`Extension not found: ${name}`);
coreEvents.emitFeedback('error', `Extension not found: ${name}`);
}
}
}
@@ -188,7 +188,11 @@ export class ExtensionEnablementManager {
) {
return {};
}
console.error('Error reading extension enablement config:', error);
coreEvents.emitFeedback(
'error',
'Failed to read extension enablement config.',
error,
);
return {};
}
}