From 68c44ee2c2da1b39b2833d0a44cd7badd3df630f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 4 Sep 2026 18:49:27 +0200 Subject: [PATCH] Separate the configuration migration settings again (#334546) separate settings for chat customization migrations --- .../customizationMigrationCategories.ts | 6 ++-- .../chat/browser/chat.shared.contribution.ts | 16 ++++++++-- .../contrib/chat/common/constants.ts | 4 ++- .../aiCustomizationManagementEditor.test.ts | 31 ++++++++++++------- ...aiCustomizationManagementEditor.fixture.ts | 4 ++- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigrationCategories.ts b/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigrationCategories.ts index 3e2f8e120a23..b1e929afe7f0 100644 --- a/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigrationCategories.ts +++ b/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigrationCategories.ts @@ -96,7 +96,7 @@ const promptFilesMigrationCategory: ICustomizationMigrationCategory = { id: CustomizationMigrationCategoryId.PromptFiles, migrationType: CustomizationMigrationType.PromptFiles, sourceTypes: [PromptsType.prompt], - enablementSetting: ChatConfiguration.ChatCustomizationsMigrationEnabled, + enablementSetting: ChatConfiguration.ChatCustomizationsPromptMigrationEnabled, shortcutLabel: localize('promptMigrationShortcutLabel', "Migrate Prompts"), shortcutTooltip: localize('promptMigrationShortcutTooltip', "Convert deprecated prompt files to skills"), cardLabel: localize('promptMigrationCardLabel', "Migrate Prompt Files"), @@ -234,7 +234,7 @@ const userDataMigrationCategory: ICustomizationMigrationCategory = { id: CustomizationMigrationCategoryId.UserData, migrationType: CustomizationMigrationType.UserData, sourceTypes: [PromptsType.agent, PromptsType.instructions], - enablementSetting: ChatConfiguration.ChatCustomizationsMigrationEnabled, + enablementSetting: ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled, shortcutLabel: localize('userDataMigrationShortcutLabel', "Migrate User Data"), shortcutTooltip: localize('userDataMigrationShortcutTooltip', "Move user data agents and instructions to the active harness"), cardLabel: localize('userDataMigrationCardLabel', "Migrate User Data Customizations"), @@ -409,7 +409,7 @@ const configuredLocationsMigrationCategory: ICustomizationMigrationCategory = { id: CustomizationMigrationCategoryId.ConfiguredLocations, migrationType: CustomizationMigrationType.ConfiguredLocations, sourceTypes: [PromptsType.agent, PromptsType.instructions, PromptsType.skill], - enablementSetting: ChatConfiguration.ChatCustomizationsMigrationEnabled, + enablementSetting: ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled, configurationSettingIds: CONFIGURED_LOCATION_SETTING_IDS, shortcutLabel: localize('configuredLocationsMigrationShortcutLabel', "Migrate Location Settings"), shortcutTooltip: localize('configuredLocationsMigrationShortcutTooltip', "Move customizations from locations unsupported by the active harness"), diff --git a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts index b0448d8c2aea..a4188451e658 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.ts @@ -2509,12 +2509,24 @@ configurationRegistry.registerConfiguration({ description: nls.localize('chat.customizations.structuredPreview.enabled', "Controls whether the Chat Customizations editor shows a structured preview for markdown customization files (agents, skills, instructions, prompts). When disabled, the editor always opens the raw markdown in the embedded code editor."), default: false, }, - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: { + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: { type: 'boolean', tags: ['experimental'], - description: nls.localize('chat.customizations.migration.enabled', "Controls whether the Chat Customizations editor offers to migrate customizations into formats and locations supported by the active agent-host harness. When disabled, migration cards and sidebar shortcuts are hidden."), + description: nls.localize('chat.customizations.promptMigration.enabled', "Controls whether the Chat Customizations editor offers to convert prompt files into skills for agent-host harnesses, which ignore prompt files. When disabled, the migration card and sidebar shortcut are hidden."), default: true, }, + [ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled]: { + type: 'boolean', + tags: ['experimental'], + description: nls.localize('chat.customizations.userDataMigration.enabled', "Controls whether the Chat Customizations editor offers to move agents and instructions stored in user data to the active agent-host harness, which ignores the user data location. When disabled, the migration card and sidebar shortcut are hidden."), + default: false, + }, + [ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled]: { + type: 'boolean', + tags: ['experimental'], + description: nls.localize('chat.customizations.locationsMigration.enabled', "Controls whether the Chat Customizations editor offers to move agents, instructions, and skills from configured locations that are not supported by the active agent-host harness. When disabled, the migration card and sidebar shortcut are hidden."), + default: false, + }, [ChatConfiguration.ChatCustomizationsMigrationHint]: { type: 'string', enum: [CustomizationMigrationHintMode.Never, CustomizationMigrationHintMode.Once, CustomizationMigrationHintMode.Always], diff --git a/src/vs/workbench/contrib/chat/common/constants.ts b/src/vs/workbench/contrib/chat/common/constants.ts index 52f478581f39..2261a639012e 100644 --- a/src/vs/workbench/contrib/chat/common/constants.ts +++ b/src/vs/workbench/contrib/chat/common/constants.ts @@ -106,7 +106,9 @@ export enum ChatConfiguration { TitleBarOpenInAgentsWindowEnabled = 'chat.titleBar.openInAgentsWindow.enabled', ChatCustomizationsStructuredPreviewEnabled = 'chat.customizations.structuredPreview.enabled', - ChatCustomizationsMigrationEnabled = 'chat.customizations.migration.enabled', + ChatCustomizationsPromptMigrationEnabled = 'chat.customizations.promptMigration.enabled', + ChatCustomizationsUserDataMigrationEnabled = 'chat.customizations.userDataMigration.enabled', + ChatCustomizationsLocationsMigrationEnabled = 'chat.customizations.locationsMigration.enabled', ChatCustomizationsMigrationHint = 'chat.customizations.migrationHint', AutopilotAdvancedEnabled = 'chat.autopilot.advanced.enabled', DefaultPermissionLevel = 'chat.permissions.default', diff --git a/src/vs/workbench/contrib/chat/test/browser/aiCustomization/aiCustomizationManagementEditor.test.ts b/src/vs/workbench/contrib/chat/test/browser/aiCustomization/aiCustomizationManagementEditor.test.ts index c957ec6efe8f..ae095d4f901e 100644 --- a/src/vs/workbench/contrib/chat/test/browser/aiCustomization/aiCustomizationManagementEditor.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/aiCustomization/aiCustomizationManagementEditor.test.ts @@ -334,10 +334,12 @@ suite('aiCustomizationManagementEditor', () => { editor.editorPreviewDisposables.dispose(); }); - test('gates all migration categories on the migration setting', () => { + test('gates each migration category on its own experimental setting', () => { const welcomePageCalls: ICustomizationMigrationCategorySummary[][] = []; const configurationService = createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: false, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: false, + [ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled]: false, + [ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled]: false, }) as IConfigurationService & { setValue(key: string, value: unknown): void }; const editor = createTestEditor(undefined, configurationService); editor.customizationsByMigrationCategory = new Map([ @@ -365,12 +367,18 @@ suite('aiCustomizationManagementEditor', () => { }; editor.refreshCustomizationMigrationUi(); + configurationService.setValue(ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled, true); + editor.refreshCustomizationMigrationUi(); + configurationService.setValue(ChatConfiguration.ChatCustomizationsPromptMigrationEnabled, true); + editor.refreshCustomizationMigrationUi(); + configurationService.setValue(ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled, true); configurationService.setValue('chat.agentFilesLocations', { '/workspace/custom-agents': true }); - configurationService.setValue(ChatConfiguration.ChatCustomizationsMigrationEnabled, true); editor.refreshCustomizationMigrationUi(); assert.deepStrictEqual(welcomePageCalls.map(categories => categories.map(category => category.id)), [ [], + [CustomizationMigrationCategoryId.UserData], + [CustomizationMigrationCategoryId.PromptFiles, CustomizationMigrationCategoryId.UserData], [CustomizationMigrationCategoryId.PromptFiles, CustomizationMigrationCategoryId.UserData, CustomizationMigrationCategoryId.ConfiguredLocations], ]); editor.editorPreviewDisposables.dispose(); @@ -378,7 +386,7 @@ suite('aiCustomizationManagementEditor', () => { test('tracks migration selection by URI and storage', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const sharedUri = URI.file('/home/user/shared.prompt.md'); const workspacePrompt: MigratableConfiguration = { @@ -498,7 +506,7 @@ suite('aiCustomizationManagementEditor', () => { const agentSettingId = 'chat.agentFilesLocations'; const instructionsSettingId = 'chat.instructionsFilesLocations'; const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled]: true, [agentSettingId]: { '/custom/agents': true }, [instructionsSettingId]: { '/custom/instructions': true }, })); @@ -600,7 +608,8 @@ suite('aiCustomizationManagementEditor', () => { test('migration banners include destination consequences when applicable', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const userDataCustomizations = [ { @@ -686,7 +695,7 @@ suite('aiCustomizationManagementEditor', () => { test('opens a migration candidate through the shared Button widget', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const promptFile: MigratableConfiguration = { uri: URI.file('/workspace/.github/prompts/review.prompt.md'), @@ -737,7 +746,7 @@ suite('aiCustomizationManagementEditor', () => { test('virtualized migration rows keep checkbox selection and keyboard traversal aligned', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const promptFiles = Array.from({ length: 6 }, (_, index): MigratableConfiguration => ({ uri: URI.file(`/workspace/.github/prompts/workspace-${index}.prompt.md`), @@ -782,7 +791,7 @@ suite('aiCustomizationManagementEditor', () => { test('group migration selection retains keyboard focus', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const promptFiles = [ { @@ -868,7 +877,7 @@ suite('aiCustomizationManagementEditor', () => { test('customization migration groups render as flat source sections', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const promptFiles = [ { @@ -934,7 +943,7 @@ suite('aiCustomizationManagementEditor', () => { test('unchecking every item in a migration group unchecks the group checkbox', () => { const editor = createTestEditor(undefined, createConfigurationServiceStub({ - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, })); const promptFiles = [ { diff --git a/src/vs/workbench/test/browser/componentFixtures/sessions/aiCustomizationManagementEditor.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/sessions/aiCustomizationManagementEditor.fixture.ts index c6e0da5a0147..aaac044d5199 100644 --- a/src/vs/workbench/test/browser/componentFixtures/sessions/aiCustomizationManagementEditor.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/sessions/aiCustomizationManagementEditor.fixture.ts @@ -781,7 +781,9 @@ async function renderEditor(ctx: ComponentFixtureContext, options: IRenderEditor // screenshot fixtures that depend on agent-host harnesses. reg.defineInstance(IConfigurationService, new TestConfigurationService({ [ChatConfiguration.ChatCustomizationsStructuredPreviewEnabled]: true, - [ChatConfiguration.ChatCustomizationsMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsPromptMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsUserDataMigrationEnabled]: true, + [ChatConfiguration.ChatCustomizationsLocationsMigrationEnabled]: true, ...options.configuration, })); reg.define(IListService, ListService);