Skip to content

Commit 80dbffa

Browse files
RXminuSumpoxabeatrixDanTup
authored
feat: Add experimental commit message generator (#2306)
## Description Adds a CTA in the Git SCM input to generate a commit message with Cody https://github.com/sourcegraph/cody/assets/9516420/96d18bff-9300-4220-8382-5d2d2a682749 ## Test Plan Staged only: 1. Make changes to a branch 2. Stage only some changes 3. Generate commit message, check that it matches staged changes All: 1. Make changes to a branch 2. Do not stage any changes 3. Generate commit message, check that it matches all changes --------- Co-authored-by: Tom Ross <tom@umpox.com> Co-authored-by: Beatrix <68532117+abeatrix@users.noreply.github.com> Co-authored-by: Danny Tuppeny <danny@tuppeny.com>
1 parent 250ed52 commit 80dbffa

14 files changed

+491
-5
lines changed

lib/shared/src/configuration.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export interface Configuration {
4646
/**
4747
* Experimental
4848
*/
49+
experimentalCommitMessage: boolean
4950
experimentalGuardrails: boolean
5051
experimentalSymfContext: boolean
5152
experimentalTracing: boolean

pnpm-lock.yaml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vscode/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ This is a log of all notable changes to Cody for VS Code. [Unreleased] changes a
66

77
### Added
88

9+
- Cody can now generate commit messages from your changes. Triggered through the input field in the VS Code "Source Control" sidebar. [pull/2306](https://github.com/sourcegraph/cody/pull/2306)
10+
911
### Fixed
1012

1113
### Changed

vscode/package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,12 @@
848848
"markdownDescription": "Enable OpenTelemetry tracing",
849849
"default": false
850850
},
851+
"cody.experimental.commitMessage": {
852+
"order": 99,
853+
"type": "boolean",
854+
"default": true,
855+
"markdownDescription": "Adds a button to the SCM input field to generate a relevant commit message for the current changes."
856+
},
851857
"cody.debug.enable": {
852858
"order": 99,
853859
"type": "boolean",
@@ -1074,6 +1080,7 @@
10741080
"lru-cache": "^10.0.0",
10751081
"mkdirp": "^3.0.1",
10761082
"os-browserify": "^0.3.0",
1083+
"parse-diff": "^0.11.1",
10771084
"socks-proxy-agent": "^8.0.1",
10781085
"unzipper": "^0.10.14",
10791086
"uuid": "^9.0.0",

vscode/src/chat/ContextProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export type Config = Pick<
3838
| 'useContext'
3939
| 'codeActions'
4040
| 'experimentalGuardrails'
41+
| 'experimentalCommitMessage'
4142
| 'commandCodeLenses'
4243
| 'experimentalSimpleChatContext'
4344
| 'experimentalSymfContext'

vscode/src/configuration.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ describe('getConfiguration', () => {
4141
return true
4242
case 'cody.experimental.guardrails':
4343
return true
44+
case 'cody.experimental.commitMessage':
45+
return true
4446
case 'cody.codeActions.enabled':
4547
return true
4648
case 'cody.commandHints.enabled':
@@ -123,6 +125,7 @@ describe('getConfiguration', () => {
123125
experimentalSymfContext: true,
124126
experimentalTracing: true,
125127
editorTitleCommandIcon: true,
128+
experimentalCommitMessage: true,
126129
experimentalGuardrails: true,
127130
codeActions: true,
128131
commandHints: true,

vscode/src/configuration.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export function getConfiguration(
118118
internalUnstable: getHiddenSetting('internal.unstable', isTesting),
119119

120120
autocompleteExperimentalGraphContext,
121+
experimentalCommitMessage: getHiddenSetting('experimental.commitMessage', true),
121122
experimentalSimpleChatContext: getHiddenSetting('experimental.simpleChatContext', true),
122123
experimentalSymfContext: getHiddenSetting('experimental.symfContext', true),
123124

vscode/src/extension.common.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ExtensionApi } from './extension-api'
1616
import type { LocalEmbeddingsConfig, LocalEmbeddingsController } from './local-context/local-embeddings'
1717
import type { SymfRunner } from './local-context/symf'
1818
import { start } from './main'
19+
import type { CommitMessageProvider } from './scm/CommitMessageProvider'
1920
import type { OpenTelemetryService } from './services/open-telemetry/OpenTelemetryService.node'
2021
import { captureException, type SentryService } from './services/sentry/sentry'
2122
import type { CommandsProvider } from './commands/services/provider'
@@ -38,6 +39,7 @@ export interface PlatformContext {
3839
createOpenTelemetryService?: (
3940
config: Pick<ConfigurationWithAccessToken, 'serverEndpoint' | 'experimentalTracing'>
4041
) => OpenTelemetryService
42+
createCommitMessageProvider?: Constructor<typeof CommitMessageProvider>
4143
onConfigurationChange?: (configuration: Configuration) => void
4244
}
4345

vscode/src/extension.node.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
import { SymfRunner } from './local-context/symf'
1414
import { OpenTelemetryService } from './services/open-telemetry/OpenTelemetryService.node'
1515
import { NodeSentryService } from './services/sentry/sentry.node'
16+
import { CommitMessageProvider } from './scm/CommitMessageProvider'
1617
import { CommandsProvider } from './commands/services/provider'
1718
/**
1819
* Activation entrypoint for the VS Code extension when running VS Code as a desktop app
@@ -39,6 +40,7 @@ export function activate(context: vscode.ExtensionContext): Promise<ExtensionApi
3940
createBfgRetriever: () => new BfgRetriever(context),
4041
createSentryService: (...args) => new NodeSentryService(...args),
4142
createOpenTelemetryService: (...args) => new OpenTelemetryService(...args),
43+
createCommitMessageProvider: (...args) => new CommitMessageProvider(...args),
4244

4345
onConfigurationChange: setCustomAgent,
4446
})

vscode/src/main.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ import type { PlatformContext } from './extension.common'
3535
import { configureExternalServices } from './external-services'
3636
import { logDebug, logError } from './log'
3737
import { showSetupNotification } from './notifications/setup-notification'
38-
import { gitAPIinit } from './repository/repositoryHelpers'
38+
import type { CommitMessageProvider } from './scm/CommitMessageProvider'
39+
import { gitAPIinit, gitAPI as getGitAPI } from './repository/repositoryHelpers'
3940
import { SearchViewProvider } from './search/SearchViewProvider'
4041
import { AuthProvider } from './services/AuthProvider'
4142
import { showFeedbackSupportQuickPick } from './services/FeedbackOptions'
@@ -122,9 +123,9 @@ const register = async (
122123
disposables.push(manageDisplayPathEnvInfoForExtension())
123124

124125
// Set codyignore list on git extension startup
125-
const gitAPI = await gitAPIinit()
126-
if (gitAPI) {
127-
disposables.push(gitAPI)
126+
const gitApiDisposable = await gitAPIinit()
127+
if (gitApiDisposable) {
128+
disposables.push(gitApiDisposable)
128129
}
129130

130131
const isExtensionModeDevOrTest =
@@ -219,6 +220,14 @@ const register = async (
219220
guardrails
220221
)
221222

223+
const gitApi = getGitAPI()
224+
let commitMessageProvider: CommitMessageProvider | null = null
225+
if (gitApi && platform.createCommitMessageProvider) {
226+
commitMessageProvider = platform.createCommitMessageProvider({ chatClient, editor, gitApi })
227+
commitMessageProvider.onConfigurationChange(initialConfig)
228+
disposables.push(commitMessageProvider)
229+
}
230+
222231
const ghostHintDecorator = new GhostHintDecorator(authProvider)
223232
const editorManager = new EditManager({
224233
chat: chatClient,
@@ -243,6 +252,7 @@ const register = async (
243252
externalServicesOnDidConfigurationChange(newConfig)
244253
promises.push(configureEventsInfra(newConfig, isExtensionModeDevOrTest))
245254
platform.onConfigurationChange?.(newConfig)
255+
commitMessageProvider?.onConfigurationChange(newConfig)
246256
symfRunner?.setSourcegraphAuth(newConfig.serverEndpoint, newConfig.accessToken)
247257
enterpriseContextFactory.clientConfigurationDidChange()
248258
promises.push(

0 commit comments

Comments
 (0)