From 9035ca32bc1d2ead325672146f5dc69415db1bd1 Mon Sep 17 00:00:00 2001 From: Abhi <43648792+abhipatel12@users.noreply.github.com> Date: Tue, 27 Jan 2026 23:56:04 -0500 Subject: [PATCH] feat(skills): final stable promotion cleanup (#17726) --- .gemini/settings.json | 5 - docs/get-started/configuration.md | 5 - packages/cli/src/config/config.test.ts | 2 +- packages/cli/src/config/config.ts | 5 +- packages/cli/src/config/settingsSchema.ts | 9 - .../skills-backward-compatibility.test.ts | 158 ------------------ .../src/services/BuiltinCommandLoader.test.ts | 6 +- schemas/settings.schema.json | 7 - 8 files changed, 7 insertions(+), 190 deletions(-) delete mode 100644 .gemini/settings.json delete mode 100644 packages/cli/src/config/skills-backward-compatibility.test.ts diff --git a/.gemini/settings.json b/.gemini/settings.json deleted file mode 100644 index aaac8204b6..0000000000 --- a/.gemini/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "experimental": { - "skills": true - } -} diff --git a/docs/get-started/configuration.md b/docs/get-started/configuration.md index 3a1e385cf7..22f130b1c1 100644 --- a/docs/get-started/configuration.md +++ b/docs/get-started/configuration.md @@ -869,11 +869,6 @@ their corresponding top-level category object in your `settings.json` file. - **Default:** `false` - **Requires restart:** Yes -- **`experimental.skills`** (boolean): - - **Description:** [Deprecated] Enable Agent Skills (experimental). - - **Default:** `false` - - **Requires restart:** Yes - - **`experimental.useOSC52Paste`** (boolean): - **Description:** Use OSC 52 sequence for pasting instead of clipboardy (useful for remote sessions). diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index 23688ec66a..5bba86fe8b 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -588,7 +588,7 @@ describe('parseArguments', () => { process.argv = ['node', 'script.js', 'skills', 'list']; // Skills command enabled by default or via experimental const settings = createTestMergedSettings({ - experimental: { skills: true }, + skills: { enabled: true }, }); const argv = await parseArguments(settings); expect(argv.isCommand).toBe(true); diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 1a622f7d0c..8d2c9e9789 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -304,7 +304,7 @@ export async function parseArguments( yargsInstance.command(extensionsCommand); } - if (settings.experimental?.skills || (settings.skills?.enabled ?? true)) { + if (settings.skills?.enabled ?? true) { yargsInstance.command(skillsCommand); } // Register hooks command if hooks are enabled @@ -755,8 +755,7 @@ export async function loadCliConfig( plan: settings.experimental?.plan, enableEventDrivenScheduler: settings.experimental?.enableEventDrivenScheduler, - skillsSupport: - settings.experimental?.skills || (settings.skills?.enabled ?? true), + skillsSupport: settings.skills?.enabled ?? true, disabledSkills: settings.skills?.disabled, experimentalJitContext: settings.experimental?.jitContext, noBrowser: !!process.env['NO_BROWSER'], diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 6d108602df..ff8ea13c55 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -1490,15 +1490,6 @@ const SETTINGS_SCHEMA = { description: 'Enable Just-In-Time (JIT) context loading.', showInDialog: false, }, - skills: { - type: 'boolean', - label: 'Agent Skills (Deprecated)', - category: 'Experimental', - requiresRestart: true, - default: false, - description: '[Deprecated] Enable Agent Skills (experimental).', - showInDialog: false, - }, useOSC52Paste: { type: 'boolean', label: 'Use OSC 52 Paste', diff --git a/packages/cli/src/config/skills-backward-compatibility.test.ts b/packages/cli/src/config/skills-backward-compatibility.test.ts deleted file mode 100644 index 57a2d1e4d0..0000000000 --- a/packages/cli/src/config/skills-backward-compatibility.test.ts +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @license - * Copyright 2025 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { loadCliConfig, parseArguments } from './config.js'; -import * as trustedFolders from './trustedFolders.js'; -import { loadServerHierarchicalMemory } from '@google/gemini-cli-core'; -import { type Settings, createTestMergedSettings } from './settings.js'; - -vi.mock('./trustedFolders.js'); -vi.mock('@google/gemini-cli-core', async (importOriginal) => { - const actual = - await importOriginal(); - return { - ...actual, - loadServerHierarchicalMemory: vi.fn(), - getPty: vi.fn().mockResolvedValue({ name: 'test-pty' }), - getVersion: vi.fn().mockResolvedValue('0.0.0-test'), - }; -}); - -describe('Agent Skills Backward Compatibility', () => { - const originalArgv = process.argv; - - beforeEach(() => { - vi.resetAllMocks(); - vi.mocked(trustedFolders.isWorkspaceTrusted).mockReturnValue({ - isTrusted: true, - } as unknown as trustedFolders.TrustResult); - }); - - afterEach(() => { - process.argv = originalArgv; - }); - - describe('loadCliConfig', () => { - it('should default skillsSupport to true when no settings are present', async () => { - vi.mocked(loadServerHierarchicalMemory).mockResolvedValue({ - memoryContent: '', - fileCount: 0, - filePaths: [], - }); - - process.argv = ['node', 'gemini']; - const settings = createTestMergedSettings({}); - const config = await loadCliConfig( - settings, - 'test-session', - await parseArguments(settings), - ); - expect( - ( - config as unknown as { isSkillsSupportEnabled: () => boolean } - ).isSkillsSupportEnabled(), - ).toBe(true); - }); - - it('should prioritize skills.enabled=false from settings', async () => { - vi.mocked(loadServerHierarchicalMemory).mockResolvedValue({ - memoryContent: '', - fileCount: 0, - filePaths: [], - }); - - const settings = createTestMergedSettings({ - skills: { enabled: false }, - } as unknown as Settings); - - process.argv = ['node', 'gemini']; - const config = await loadCliConfig( - settings, - 'test-session', - await parseArguments(settings), - ); - expect( - ( - config as unknown as { isSkillsSupportEnabled: () => boolean } - ).isSkillsSupportEnabled(), - ).toBe(false); - }); - - it('should support legacy experimental.skills=true from settings', async () => { - vi.mocked(loadServerHierarchicalMemory).mockResolvedValue({ - memoryContent: '', - fileCount: 0, - filePaths: [], - }); - - const settings = createTestMergedSettings({ - experimental: { skills: true }, - } as unknown as Settings); - - process.argv = ['node', 'gemini']; - const config = await loadCliConfig( - settings, - 'test-session', - await parseArguments(settings), - ); - expect( - ( - config as unknown as { isSkillsSupportEnabled: () => boolean } - ).isSkillsSupportEnabled(), - ).toBe(true); - }); - - it('should prioritize legacy experimental.skills=true over new skills.enabled=false', async () => { - vi.mocked(loadServerHierarchicalMemory).mockResolvedValue({ - memoryContent: '', - fileCount: 0, - filePaths: [], - }); - - const settings = createTestMergedSettings({ - skills: { enabled: false }, - experimental: { skills: true }, - } as unknown as Settings); - - process.argv = ['node', 'gemini']; - const config = await loadCliConfig( - settings, - 'test-session', - await parseArguments(settings), - ); - expect( - ( - config as unknown as { isSkillsSupportEnabled: () => boolean } - ).isSkillsSupportEnabled(), - ).toBe(true); - }); - - it('should still be enabled by default if legacy experimental.skills is false (since new default is true)', async () => { - vi.mocked(loadServerHierarchicalMemory).mockResolvedValue({ - memoryContent: '', - fileCount: 0, - filePaths: [], - }); - - const settings = createTestMergedSettings({ - experimental: { skills: false }, - } as unknown as Settings); - - process.argv = ['node', 'gemini']; - const config = await loadCliConfig( - settings, - 'test-session', - await parseArguments(settings), - ); - expect( - ( - config as unknown as { isSkillsSupportEnabled: () => boolean } - ).isSkillsSupportEnabled(), - ).toBe(true); - }); - }); -}); diff --git a/packages/cli/src/services/BuiltinCommandLoader.test.ts b/packages/cli/src/services/BuiltinCommandLoader.test.ts index 44ddaeb039..2740d9ed3e 100644 --- a/packages/cli/src/services/BuiltinCommandLoader.test.ts +++ b/packages/cli/src/services/BuiltinCommandLoader.test.ts @@ -119,11 +119,12 @@ describe('BuiltinCommandLoader', () => { getEnableHooks: () => false, getEnableHooksUI: () => false, getExtensionsEnabled: vi.fn().mockReturnValue(true), - isSkillsSupportEnabled: vi.fn().mockReturnValue(false), + isSkillsSupportEnabled: vi.fn().mockReturnValue(true), isAgentsEnabled: vi.fn().mockReturnValue(false), getMcpEnabled: vi.fn().mockReturnValue(true), getSkillManager: vi.fn().mockReturnValue({ getAllSkills: vi.fn().mockReturnValue([]), + isAdminEnabled: vi.fn().mockReturnValue(true), }), } as unknown as Config; @@ -260,11 +261,12 @@ describe('BuiltinCommandLoader profile', () => { getEnableHooks: () => false, getEnableHooksUI: () => false, getExtensionsEnabled: vi.fn().mockReturnValue(true), - isSkillsSupportEnabled: vi.fn().mockReturnValue(false), + isSkillsSupportEnabled: vi.fn().mockReturnValue(true), isAgentsEnabled: vi.fn().mockReturnValue(false), getMcpEnabled: vi.fn().mockReturnValue(true), getSkillManager: vi.fn().mockReturnValue({ getAllSkills: vi.fn().mockReturnValue([]), + isAdminEnabled: vi.fn().mockReturnValue(true), }), } as unknown as Config; }); diff --git a/schemas/settings.schema.json b/schemas/settings.schema.json index e6ef72115a..8006662d7e 100644 --- a/schemas/settings.schema.json +++ b/schemas/settings.schema.json @@ -1446,13 +1446,6 @@ "default": false, "type": "boolean" }, - "skills": { - "title": "Agent Skills (Deprecated)", - "description": "[Deprecated] Enable Agent Skills (experimental).", - "markdownDescription": "[Deprecated] Enable Agent Skills (experimental).\n\n- Category: `Experimental`\n- Requires restart: `yes`\n- Default: `false`", - "default": false, - "type": "boolean" - }, "useOSC52Paste": { "title": "Use OSC 52 Paste", "description": "Use OSC 52 sequence for pasting instead of clipboardy (useful for remote sessions).",