docs(changelog): update for v0.42.0-preview.1

This commit is contained in:
gemini-cli-robot
2026-05-05 22:51:06 +00:00
committed by github-actions[bot]
parent e039fcdf2a
commit 65893ee03f
54 changed files with 215 additions and 292 deletions
+2 -3
View File
@@ -141,9 +141,8 @@ async function run() {
// --- Heavy Child Process ---
// Now we can safely import everything.
const { main } = await import('./src/gemini.js');
const { FatalError, writeToStderr } = await import(
'@google/gemini-cli-core'
);
const { FatalError, writeToStderr } =
await import('@google/gemini-cli-core');
const { runExitCleanup } = await import('./src/utils/cleanup.js');
main().catch(async (error: unknown) => {
+2 -3
View File
@@ -566,9 +566,8 @@ describe('Session', () => {
});
it('should send sessionUpdate when approval mode changes', async () => {
const { coreEvents, CoreEvent, ApprovalMode } = await import(
'@google/gemini-cli-core'
);
const { coreEvents, CoreEvent, ApprovalMode } =
await import('@google/gemini-cli-core');
coreEvents.emit(CoreEvent.ApprovalModeChanged, {
sessionId: 'session-1',
@@ -20,9 +20,8 @@ import { ExtensionManager } from '../../config/extension-manager.js';
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const { mockCoreDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { mockCoreDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
const actual =
await importOriginal<typeof import('@google/gemini-cli-core')>();
const mocked = mockCoreDebugLogger(actual, { stripAnsi: true });
@@ -11,9 +11,8 @@ import { ExtensionManager } from '../../config/extension-manager.js';
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const { mockCoreDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { mockCoreDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
const actual =
await importOriginal<typeof import('@google/gemini-cli-core')>();
const mocked = mockCoreDebugLogger(actual, { stripAnsi: false });
+2 -3
View File
@@ -16,9 +16,8 @@ import { getLogFilePath } from './constants.js';
import { logsCommand, readLastLines } from './logs.js';
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const { mockCoreDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { mockCoreDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return mockCoreDebugLogger(
await importOriginal<typeof import('@google/gemini-cli-core')>(),
{
+2 -3
View File
@@ -16,9 +16,8 @@ const mockReadServerProcessInfo = vi.hoisted(() => vi.fn());
const mockResolveGemmaConfig = vi.hoisted(() => vi.fn());
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const { mockCoreDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { mockCoreDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return mockCoreDebugLogger(
await importOriginal<typeof import('@google/gemini-cli-core')>(),
{
@@ -14,9 +14,8 @@ import {
} from '../../config/settings.js';
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
const { createMockDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { createMockDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return createMockDebugLogger({ stripAnsi: true });
});
@@ -13,9 +13,8 @@ import {
} from '../../config/settings.js';
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
const { createMockDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { createMockDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return createMockDebugLogger({ stripAnsi: true });
});
@@ -20,9 +20,8 @@ vi.mock('../../config/extensions/consent.js', () => ({
}));
const { debugLogger, emitConsoleLog } = await vi.hoisted(async () => {
const { createMockDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { createMockDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return createMockDebugLogger({ stripAnsi: true });
});
@@ -16,9 +16,8 @@ vi.mock('../../utils/skillUtils.js', () => ({
}));
const { debugLogger } = await vi.hoisted(async () => {
const { createMockDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { createMockDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return createMockDebugLogger({ stripAnsi: false });
});
@@ -20,9 +20,8 @@ import { loadCliConfig } from '../../config/config.js';
import chalk from 'chalk';
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const { mockCoreDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { mockCoreDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return mockCoreDebugLogger(
await importOriginal<typeof import('@google/gemini-cli-core')>(),
{
@@ -13,9 +13,8 @@ vi.mock('../../utils/skillUtils.js', () => ({
}));
const { debugLogger, emitConsoleLog } = await vi.hoisted(async () => {
const { createMockDebugLogger } = await import(
'../../test-utils/mockDebugLogger.js'
);
const { createMockDebugLogger } =
await import('../../test-utils/mockDebugLogger.js');
return createMockDebugLogger({ stripAnsi: true });
});
@@ -300,9 +300,8 @@ System using model: \${MODEL_NAME}
});
expect(extension.skills![0].body).toContain('Value is: first');
const { updateSetting, ExtensionSettingScope } = await import(
'./extensions/extensionSettings.js'
);
const { updateSetting, ExtensionSettingScope } =
await import('./extensions/extensionSettings.js');
const extensionConfig =
await extensionManager.loadExtensionConfig(extensionPath);
+2 -2
View File
@@ -334,8 +334,8 @@ Would you like to attempt to install via "git clone" instead?`,
const previousSkills = previous?.skills ?? [];
const isMigrating = Boolean(
previous &&
previous.installMetadata &&
previous.installMetadata.source !== installMetadata.source,
previous.installMetadata &&
previous.installMetadata.source !== installMetadata.source,
);
await maybeRequestConsentOrFail(
+2 -3
View File
@@ -938,9 +938,8 @@ describe('gemini.tsx main function kitty protocol', () => {
});
it.skip('should log error when cleanupExpiredSessions fails', async () => {
const { cleanupExpiredSessions } = await import(
'./utils/sessionCleanup.js'
);
const { cleanupExpiredSessions } =
await import('./utils/sessionCleanup.js');
vi.mocked(cleanupExpiredSessions).mockRejectedValue(
new Error('Cleanup failed'),
);
+2 -3
View File
@@ -552,9 +552,8 @@ export async function main() {
adminControlsListner.setConfig(config);
if (config.isInteractive() && settings.merged.general.devtools) {
const { setupInitialActivityLogger } = await import(
'./utils/devtoolsService.js'
);
const { setupInitialActivityLogger } =
await import('./utils/devtoolsService.js');
setupInitialActivityLogger(config);
}
+8 -12
View File
@@ -201,9 +201,8 @@ describe('gemini.tsx main function cleanup', () => {
});
it.skip('should log error when cleanupExpiredSessions fails', async () => {
const { loadCliConfig, parseArguments } = await import(
'./config/config.js'
);
const { loadCliConfig, parseArguments } =
await import('./config/config.js');
const { loadSettings } = await import('./config/settings.js');
cleanupMockState.shouldThrow = true;
cleanupMockState.called = false;
@@ -272,9 +271,8 @@ describe('gemini.tsx main function cleanup', () => {
});
it('should register SessionEnd hook exactly once in non-interactive mode', async () => {
const { loadCliConfig, parseArguments } = await import(
'./config/config.js'
);
const { loadCliConfig, parseArguments } =
await import('./config/config.js');
const { registerCleanup } = await import('./utils/cleanup.js');
const mockHookSystem = {
@@ -310,9 +308,8 @@ describe('gemini.tsx main function cleanup', () => {
it('should not register ConsolePatcher cleanup in ACP mode', async () => {
const { registerCleanup } = await import('./utils/cleanup.js');
const { ConsolePatcher } = await import('./ui/utils/ConsolePatcher.js');
const { loadCliConfig, parseArguments } = await import(
'./config/config.js'
);
const { loadCliConfig, parseArguments } =
await import('./config/config.js');
const { loadSettings } = await import('./config/settings.js');
vi.mocked(parseArguments).mockResolvedValue({
@@ -364,9 +361,8 @@ describe('gemini.tsx main function cleanup', () => {
it('should register ConsolePatcher cleanup in non-ACP mode', async () => {
const { registerCleanup } = await import('./utils/cleanup.js');
const { ConsolePatcher } = await import('./ui/utils/ConsolePatcher.js');
const { loadCliConfig, parseArguments } = await import(
'./config/config.js'
);
const { loadCliConfig, parseArguments } =
await import('./config/config.js');
const { loadSettings } = await import('./config/settings.js');
vi.mocked(parseArguments).mockResolvedValue({
+10 -15
View File
@@ -215,9 +215,8 @@ describe('runNonInteractive', () => {
computeMergedSettings: vi.fn(),
} as unknown as LoadedSettings;
const { handleAtCommand } = await import(
'./ui/hooks/atCommandProcessor.js'
);
const { handleAtCommand } =
await import('./ui/hooks/atCommandProcessor.js');
vi.mocked(handleAtCommand).mockImplementation(async ({ query }) => ({
processedQuery: [{ text: query }],
}));
@@ -636,9 +635,8 @@ describe('runNonInteractive', () => {
it('should preprocess @include commands before sending to the model', async () => {
// 1. Mock the imported atCommandProcessor
const { handleAtCommand } = await import(
'./ui/hooks/atCommandProcessor.js'
);
const { handleAtCommand } =
await import('./ui/hooks/atCommandProcessor.js');
const mockHandleAtCommand = vi.mocked(handleAtCommand);
// 2. Define the raw input and the expected processed output
@@ -991,9 +989,8 @@ describe('runNonInteractive', () => {
});
it('should handle slash commands', async () => {
const nonInteractiveCliCommands = await import(
'./nonInteractiveCliCommands.js'
);
const nonInteractiveCliCommands =
await import('./nonInteractiveCliCommands.js');
const handleSlashCommandSpy = vi.spyOn(
nonInteractiveCliCommands,
'handleSlashCommand',
@@ -1271,13 +1268,11 @@ describe('runNonInteractive', () => {
it('should instantiate CommandService with correct loaders for slash commands', async () => {
// This test indirectly checks that handleSlashCommand is using the right loaders.
const { FileCommandLoader } = await import(
'./services/FileCommandLoader.js'
);
const { FileCommandLoader } =
await import('./services/FileCommandLoader.js');
const { McpPromptLoader } = await import('./services/McpPromptLoader.js');
const { BuiltinCommandLoader } = await import(
'./services/BuiltinCommandLoader.js'
);
const { BuiltinCommandLoader } =
await import('./services/BuiltinCommandLoader.js');
mockGetCommands.mockReturnValue([]); // No commands found, so it will fall through
const events: ServerGeminiStreamEvent[] = [
{ type: GeminiEventType.Content, value: 'Acknowledged' },
+2 -3
View File
@@ -84,9 +84,8 @@ export async function runNonInteractive(
});
if (process.env['GEMINI_CLI_ACTIVITY_LOG_TARGET']) {
const { setupInitialActivityLogger } = await import(
'./utils/devtoolsService.js'
);
const { setupInitialActivityLogger } =
await import('./utils/devtoolsService.js');
setupInitialActivityLogger(config);
}
@@ -221,9 +221,8 @@ describe('runNonInteractive', () => {
computeMergedSettings: vi.fn(),
} as unknown as LoadedSettings;
const { handleAtCommand } = await import(
'./ui/hooks/atCommandProcessor.js'
);
const { handleAtCommand } =
await import('./ui/hooks/atCommandProcessor.js');
vi.mocked(handleAtCommand).mockImplementation(async ({ query }) => ({
processedQuery: [{ text: query }],
}));
@@ -690,9 +689,8 @@ describe('runNonInteractive', () => {
it('should preprocess @include commands before sending to the model', async () => {
// 1. Mock the imported atCommandProcessor
const { handleAtCommand } = await import(
'./ui/hooks/atCommandProcessor.js'
);
const { handleAtCommand } =
await import('./ui/hooks/atCommandProcessor.js');
const mockHandleAtCommand = vi.mocked(handleAtCommand);
// 2. Define the raw input and the expected processed output
@@ -1118,9 +1116,8 @@ describe('runNonInteractive', () => {
});
it('should handle slash commands', async () => {
const nonInteractiveCliCommands = await import(
'./nonInteractiveCliCommands.js'
);
const nonInteractiveCliCommands =
await import('./nonInteractiveCliCommands.js');
const handleSlashCommandSpy = vi.spyOn(
nonInteractiveCliCommands,
'handleSlashCommand',
@@ -1440,13 +1437,11 @@ describe('runNonInteractive', () => {
it('should instantiate CommandService with correct loaders for slash commands', async () => {
// This test indirectly checks that handleSlashCommand is using the right loaders.
const { FileCommandLoader } = await import(
'./services/FileCommandLoader.js'
);
const { FileCommandLoader } =
await import('./services/FileCommandLoader.js');
const { McpPromptLoader } = await import('./services/McpPromptLoader.js');
const { BuiltinCommandLoader } = await import(
'./services/BuiltinCommandLoader.js'
);
const { BuiltinCommandLoader } =
await import('./services/BuiltinCommandLoader.js');
mockGetCommands.mockReturnValue([]); // No commands found, so it will fall through
const events: ServerGeminiStreamEvent[] = [
{ type: GeminiEventType.Content, value: 'Acknowledged' },
@@ -84,9 +84,8 @@ export async function runNonInteractive({
});
if (process.env['GEMINI_CLI_ACTIVITY_LOG_TARGET']) {
const { setupInitialActivityLogger } = await import(
'./utils/devtoolsService.js'
);
const { setupInitialActivityLogger } =
await import('./utils/devtoolsService.js');
setupInitialActivityLogger(config);
}
+2 -3
View File
@@ -91,9 +91,8 @@ vi.mock('../ui/contexts/StreamingContext.js', async (importOriginal) => {
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
const original =
await importOriginal<typeof import('@google/gemini-cli-core')>();
const { MockShellExecutionService: MockService } = await import(
'./MockShellExecutionService.js'
);
const { MockShellExecutionService: MockService } =
await import('./MockShellExecutionService.js');
// Register the real execution logic so MockShellExecutionService can fall back to it
MockService.setOriginalImplementation(original.ShellExecutionService.execute);
+10 -15
View File
@@ -3134,9 +3134,8 @@ describe('AppContainer State Management', () => {
describe('Submission Handling', () => {
it('resets expansion state on submission when not in alternate buffer', async () => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
const { checkPermissions } =
await import('./hooks/atCommandProcessor.js');
vi.mocked(checkPermissions).mockResolvedValue([]);
const { unmount } = await act(async () =>
@@ -3164,9 +3163,8 @@ describe('AppContainer State Management', () => {
});
it('resets expansion state on submission when in alternate buffer without clearing terminal', async () => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
const { checkPermissions } =
await import('./hooks/atCommandProcessor.js');
vi.mocked(checkPermissions).mockResolvedValue([]);
vi.spyOn(mockConfig, 'getUseTerminalBuffer').mockReturnValue(false);
@@ -3448,9 +3446,8 @@ describe('AppContainer State Management', () => {
describe('Permission Handling', () => {
it('shows permission dialog when checkPermissions returns paths', async () => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
const { checkPermissions } =
await import('./hooks/atCommandProcessor.js');
vi.mocked(checkPermissions).mockResolvedValue(['/test/file.txt']);
const { unmount } = await act(async () => renderAppContainer());
@@ -3471,9 +3468,8 @@ describe('AppContainer State Management', () => {
it.each([true, false])(
'handles permissions when allowed is %s',
async (allowed) => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
const { checkPermissions } =
await import('./hooks/atCommandProcessor.js');
vi.mocked(checkPermissions).mockResolvedValue(['/test/file.txt']);
const addReadOnlyPathSpy = vi.spyOn(
mockConfig.getWorkspaceContext(),
@@ -3579,9 +3575,8 @@ describe('AppContainer State Management', () => {
describe('Compression Queuing', () => {
beforeEach(async () => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
const { checkPermissions } =
await import('./hooks/atCommandProcessor.js');
vi.mocked(checkPermissions).mockResolvedValue([]);
vi.spyOn(mockConfig, 'isModelSteeringEnabled').mockReturnValue(true);
+5 -6
View File
@@ -1644,9 +1644,9 @@ Logging in with Google... Restarting Gemini CLI to continue.
}, []);
const shouldShowIdePrompt = Boolean(
currentIDE &&
!config.getIdeMode() &&
!settings.merged.ide.hasSeenNudge &&
!idePromptAnswered,
!config.getIdeMode() &&
!settings.merged.ide.hasSeenNudge &&
!idePromptAnswered,
);
const [showErrorDetails, setShowErrorDetails] = useState<boolean>(false);
@@ -1927,9 +1927,8 @@ Logging in with Google... Restarting Gemini CLI to continue.
if (keyMatchers[Command.SHOW_ERROR_DETAILS](key)) {
if (settings.merged.general.devtools) {
void (async () => {
const { toggleDevToolsPanel } = await import(
'../utils/devtoolsService.js'
);
const { toggleDevToolsPanel } =
await import('../utils/devtoolsService.js');
await toggleDevToolsPanel(
config,
showErrorDetails,
@@ -78,9 +78,8 @@ describe('authCommand', () => {
const logoutCommand = authCommand.subCommands?.[1];
expect(logoutCommand?.name).toBe('signout');
const { clearCachedCredentialFile } = await import(
'@google/gemini-cli-core'
);
const { clearCachedCredentialFile } =
await import('@google/gemini-cli-core');
await logoutCommand!.action!(mockContext, '');
@@ -1139,9 +1139,8 @@ describe('extensionsCommand', () => {
const prompts = (await import('prompts')).default;
vi.mocked(prompts).mockResolvedValue({ overwrite: true });
const { getScopedEnvContents } = await import(
'../../config/extensions/extensionSettings.js'
);
const { getScopedEnvContents } =
await import('../../config/extensions/extensionSettings.js');
vi.mocked(getScopedEnvContents).mockResolvedValue({});
});
@@ -635,9 +635,8 @@ describe('MainContent', () => {
});
it('renders a ToolConfirmationQueue without an extra line when preceded by hidden tools', async () => {
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } = await import(
'@google/gemini-cli-core'
);
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } =
await import('@google/gemini-cli-core');
const hiddenToolCalls = [
{
callId: 'tool-hidden',
@@ -713,9 +712,8 @@ describe('MainContent', () => {
});
it('renders a spurious line when a tool group has only hidden tools and borderBottom true', async () => {
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } = await import(
'@google/gemini-cli-core'
);
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } =
await import('@google/gemini-cli-core');
const uiState = {
...defaultMockUiState,
history: [{ id: 1, type: 'user', text: 'Apply plan' }],
@@ -11,8 +11,10 @@ import { MaxSizedBox, type MaxSizedBoxProps } from './MaxSizedBox.js';
// outputs that will get truncated further MaxSizedBox anyway.
const MAXIMUM_RESULT_DISPLAY_CHARACTERS = 20000;
export interface SlicingMaxSizedBoxProps<T>
extends Omit<MaxSizedBoxProps, 'children'> {
export interface SlicingMaxSizedBoxProps<T> extends Omit<
MaxSizedBoxProps,
'children'
> {
data: T;
maxLines?: number;
isAlternateBuffer?: boolean;
+4 -4
View File
@@ -153,15 +153,15 @@ const inScreen = (): boolean =>
const isSSH = (): boolean =>
Boolean(
process.env['SSH_TTY'] ||
process.env['SSH_CONNECTION'] ||
process.env['SSH_CLIENT'],
process.env['SSH_CONNECTION'] ||
process.env['SSH_CLIENT'],
);
const isWSL = (): boolean =>
Boolean(
process.env['WSL_DISTRO_NAME'] ||
process.env['WSLENV'] ||
process.env['WSL_INTEROP'],
process.env['WSLENV'] ||
process.env['WSL_INTEROP'],
);
const isWindowsTerminal = (): boolean =>
+10 -15
View File
@@ -220,9 +220,8 @@ describe('rewindFileOps', () => {
});
it('reverts exact match', async () => {
const { getFileDiffFromResultDisplay } = await import(
'@google/gemini-cli-core'
);
const { getFileDiffFromResultDisplay } =
await import('@google/gemini-cli-core');
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
filePath: '/abs/path/test.ts',
fileName: 'test.ts',
@@ -270,9 +269,8 @@ describe('rewindFileOps', () => {
});
it('deletes new file on revert', async () => {
const { getFileDiffFromResultDisplay } = await import(
'@google/gemini-cli-core'
);
const { getFileDiffFromResultDisplay } =
await import('@google/gemini-cli-core');
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
filePath: '/abs/path/new.ts',
fileName: 'new.ts',
@@ -317,9 +315,8 @@ describe('rewindFileOps', () => {
});
it('handles smart revert (patching) successfully', async () => {
const { getFileDiffFromResultDisplay } = await import(
'@google/gemini-cli-core'
);
const { getFileDiffFromResultDisplay } =
await import('@google/gemini-cli-core');
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
filePath: '/abs/path/test.ts',
fileName: 'test.ts',
@@ -369,9 +366,8 @@ describe('rewindFileOps', () => {
});
it('emits warning on smart revert failure', async () => {
const { getFileDiffFromResultDisplay } = await import(
'@google/gemini-cli-core'
);
const { getFileDiffFromResultDisplay } =
await import('@google/gemini-cli-core');
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
filePath: '/abs/path/test.ts',
fileName: 'test.ts',
@@ -421,9 +417,8 @@ describe('rewindFileOps', () => {
});
it('emits error if fs.readFile fails with a generic error', async () => {
const { getFileDiffFromResultDisplay } = await import(
'@google/gemini-cli-core'
);
const { getFileDiffFromResultDisplay } =
await import('@google/gemini-cli-core');
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
filePath: '/abs/path/test.ts',
fileName: 'test.ts',
+4 -2
View File
@@ -17,8 +17,10 @@ export type AgentActionStatus = 'success' | 'no-op' | 'error';
/**
* Metadata representing the result of an agent settings operation.
*/
export interface AgentActionResult
extends Omit<FeatureActionResult, 'featureName'> {
export interface AgentActionResult extends Omit<
FeatureActionResult,
'featureName'
> {
agentName: string;
}
+2 -3
View File
@@ -207,9 +207,8 @@ export async function toggleDevToolsPanel(
}
try {
const { openBrowserSecurely, shouldLaunchBrowser } = await import(
'@google/gemini-cli-core'
);
const { openBrowserSecurely, shouldLaunchBrowser } =
await import('@google/gemini-cli-core');
const url = await startDevToolsServer(config);
if (shouldLaunchBrowser()) {
try {
+4 -2
View File
@@ -20,8 +20,10 @@ export type SkillActionStatus = 'success' | 'no-op' | 'error';
/**
* Metadata representing the result of a skill settings operation.
*/
export interface SkillActionResult
extends Omit<FeatureActionResult, 'featureName'> {
export interface SkillActionResult extends Omit<
FeatureActionResult,
'featureName'
> {
skillName: string;
}
@@ -194,9 +194,8 @@ describe('getUserStartupWarnings', () => {
describe('folder trust check', () => {
it('should throw FatalUntrustedWorkspaceError when untrusted in headless mode', async () => {
const { isHeadlessMode, FatalUntrustedWorkspaceError } = await import(
'@google/gemini-cli-core'
);
const { isHeadlessMode, FatalUntrustedWorkspaceError } =
await import('@google/gemini-cli-core');
vi.mocked(isFolderTrustEnabled).mockReturnValue(true);
vi.mocked(isWorkspaceTrusted).mockImplementation(() => {
throw new FatalUntrustedWorkspaceError(