From ed7b59b8b4eede0a6d8c46a1d9267dff59f29172 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Tue, 7 Apr 2026 12:43:57 +1000 Subject: [PATCH] feat: add AI-generated branch names configuration and integration in Copilot CLI --- package.json | 8 ++++++++ package.nls.json | 1 + src/extension/chatSessions/vscode-node/chatSessions.ts | 5 ++++- .../chatSessions/vscode-node/copilotCLIChatSessions.ts | 4 ++-- src/platform/configuration/common/configurationService.ts | 1 + 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 71c8fb63fb..384af5ee9f 100644 --- a/package.json +++ b/package.json @@ -4540,6 +4540,14 @@ "advanced" ] }, + "github.copilot.chat.cli.aiGenerateBranchNames.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "%github.copilot.config.cli.aiGenerateBranchNames.enabled%", + "tags": [ + "advanced" + ] + }, "github.copilot.chat.cli.forkSessions.enabled": { "type": "boolean", "default": false, diff --git a/package.nls.json b/package.nls.json index fca78b7144..a388f9a71b 100644 --- a/package.nls.json +++ b/package.nls.json @@ -404,6 +404,7 @@ "github.copilot.config.cli.branchSupport.enabled": "Enable branch support for Copilot CLI.", "github.copilot.config.cli.forkSessions.enabled": "Enable forking sessions in Copilot CLI.", "github.copilot.config.cli.planExitMode.enabled": "Enable Plan Mode exit handling in Copilot CLI.", + "github.copilot.config.cli.aiGenerateBranchNames.enabled": "Enable AI-generated branch names in Copilot CLI.", "github.copilot.config.cli.isolationOption.enabled": "Enable the isolation mode option for Copilot CLI. When enabled, users can choose between Worktree and Workspace modes.", "github.copilot.config.cli.autoCommit.enabled": "Enable automatic commit for Copilot CLI. When enabled, changes made by Copilot CLI will be automatically committed to the repository at the end of each turn.", "github.copilot.config.cli.sessionController.enabled": "Enable the new session controller API for Copilot CLI. Requires VS Code reload.", diff --git a/src/extension/chatSessions/vscode-node/chatSessions.ts b/src/extension/chatSessions/vscode-node/chatSessions.ts index 3d4b879edb..a047b9d9ed 100644 --- a/src/extension/chatSessions/vscode-node/chatSessions.ts +++ b/src/extension/chatSessions/vscode-node/chatSessions.ts @@ -190,7 +190,10 @@ export class ChatSessionsContrib extends Disposable implements IExtensionContrib const gitService = copilotcliAgentInstaService.invokeFunction(accessor => accessor.get(IGitService)); const sessionTracker = copilotcliAgentInstaService.invokeFunction(accessor => accessor.get(ICopilotCLISessionTracker)); const terminalIntegration = copilotcliAgentInstaService.invokeFunction(accessor => accessor.get(ICopilotCLITerminalIntegration)); - const branchNameGenerator = copilotcliAgentInstaService.createInstance(GitBranchNameGenerator); + const aiGeneratedBranchNames = instantiationService.invokeFunction(accessor => + accessor.get(IConfigurationService).getConfig(ConfigKey.Advanced.CLIAIGenerateBranchNames) + ); + const branchNameGenerator = aiGeneratedBranchNames ? copilotcliAgentInstaService.createInstance(GitBranchNameGenerator) : undefined; const copilotcliChatSessionParticipant = this._register(copilotcliAgentInstaService.createInstance( CopilotCLIChatSessionParticipant, diff --git a/src/extension/chatSessions/vscode-node/copilotCLIChatSessions.ts b/src/extension/chatSessions/vscode-node/copilotCLIChatSessions.ts index 8982dc62bc..3021d92f6f 100644 --- a/src/extension/chatSessions/vscode-node/copilotCLIChatSessions.ts +++ b/src/extension/chatSessions/vscode-node/copilotCLIChatSessions.ts @@ -892,7 +892,7 @@ export class CopilotCLIChatSessionParticipant extends Disposable { private readonly contentProvider: CopilotCLIChatSessionContentProvider, private readonly promptResolver: CopilotCLIPromptResolver, private readonly cloudSessionProvider: CopilotCloudSessionsProvider | undefined, - private readonly branchNameGenerator: GitBranchNameGenerator, + private readonly branchNameGenerator: GitBranchNameGenerator | undefined, @IGitService private readonly gitService: IGitService, @ICopilotCLIModels private readonly copilotCLIModels: ICopilotCLIModels, @ICopilotCLIAgents private readonly copilotCLIAgents: ICopilotCLIAgents, @@ -1043,7 +1043,7 @@ export class CopilotCLIChatSessionParticipant extends Disposable { history: [requestTurn], yieldRequested: false, }; - const branchNamePromise = isNewSession && request.prompt ? this.branchNameGenerator.generateBranchName(fakeContext, token) : Promise.resolve(undefined); + const branchNamePromise = (isNewSession && request.prompt && this.branchNameGenerator) ? this.branchNameGenerator.generateBranchName(fakeContext, token) : Promise.resolve(undefined); const [model, agent] = await Promise.all([ this.getModelId(request, token), this.getAgent(id, request, token), diff --git a/src/platform/configuration/common/configurationService.ts b/src/platform/configuration/common/configurationService.ts index 1d4cfdaf7f..ef5be7ccc6 100644 --- a/src/platform/configuration/common/configurationService.ts +++ b/src/platform/configuration/common/configurationService.ts @@ -610,6 +610,7 @@ export namespace ConfigKey { export const UseResponsesApiTruncation = defineAndMigrateSetting('chat.advanced.useResponsesApiTruncation', 'chat.useResponsesApiTruncation', false); export const OmitBaseAgentInstructions = defineAndMigrateSetting('chat.advanced.omitBaseAgentInstructions', 'chat.omitBaseAgentInstructions', false); export const CLIPlanExitModeEnabled = defineSetting('chat.cli.planExitMode.enabled', ConfigType.Simple, false); + export const CLIAIGenerateBranchNames = defineSetting('chat.cli.aiGenerateBranchNames.enabled', ConfigType.Simple, false); export const CLIForkSessionsEnabled = defineSetting('chat.cli.forkSessions.enabled', ConfigType.Simple, false); export const CLIMCPServerEnabled = defineAndMigrateSetting('chat.advanced.cli.mcp.enabled', 'chat.cli.mcp.enabled', true); export const CLIBranchSupport = defineSetting('chat.cli.branchSupport.enabled', ConfigType.Simple, false);