Separate the configuration migration settings again (#334546)

separate settings for chat customization migrations
This commit is contained in:
Martin Aeschlimann
2026-09-04 16:49:27 +00:00
committed by GitHub
parent 13f40bd750
commit 68c44ee2c2
5 changed files with 43 additions and 18 deletions
@@ -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"),
@@ -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],
@@ -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',
@@ -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 = [
{
@@ -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);