Skip to content

Commit 7c99811

Browse files
committed
Add workspace-scoped ignore patterns configuration with UI integration
1 parent 9027820 commit 7c99811

9 files changed

Lines changed: 125 additions & 1 deletion

File tree

packages/vscode/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@
616616
},
617617
"codeWebChat.ignorePatterns": {
618618
"type": "array",
619+
"scope": "resource",
619620
"items": {
620621
"type": "string"
621622
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import * as vscode from 'vscode'
2+
import * as path from 'path'
3+
4+
export const handle_open_ignore_patterns_settings = async (): Promise<void> => {
5+
const workspaceFolders = vscode.workspace.workspaceFolders
6+
if (!workspaceFolders || workspaceFolders.length === 0) {
7+
return
8+
}
9+
10+
let selectedFolder: vscode.WorkspaceFolder | undefined
11+
12+
if (workspaceFolders.length > 1) {
13+
const items = workspaceFolders.map((f) => ({ label: f.name, folder: f }))
14+
selectedFolder = await new Promise<vscode.WorkspaceFolder | undefined>(
15+
(resolve) => {
16+
const quick_pick = vscode.window.createQuickPick<(typeof items)[0]>()
17+
quick_pick.items = items
18+
quick_pick.title = 'Workspaces'
19+
quick_pick.placeholder =
20+
'Select workspace folder to configure ignore patterns'
21+
const close_button: vscode.QuickInputButton = {
22+
iconPath: new vscode.ThemeIcon('close'),
23+
tooltip: 'Close'
24+
}
25+
quick_pick.buttons = [close_button]
26+
let is_accepted = false
27+
const disposables: vscode.Disposable[] = []
28+
const cleanup = () => {
29+
disposables.forEach((d) => d.dispose())
30+
quick_pick.dispose()
31+
}
32+
disposables.push(
33+
quick_pick.onDidAccept(() => {
34+
is_accepted = true
35+
const selected = quick_pick.selectedItems[0]
36+
resolve(selected?.folder)
37+
quick_pick.hide()
38+
}),
39+
quick_pick.onDidTriggerButton((button) => {
40+
if (button === close_button) {
41+
quick_pick.hide()
42+
}
43+
}),
44+
quick_pick.onDidHide(() => {
45+
if (!is_accepted) {
46+
resolve(undefined)
47+
}
48+
cleanup()
49+
})
50+
)
51+
quick_pick.show()
52+
}
53+
)
54+
} else {
55+
selectedFolder = workspaceFolders[0]
56+
}
57+
58+
if (!selectedFolder) {
59+
return
60+
}
61+
62+
// Ensure key exists
63+
const config = vscode.workspace.getConfiguration(
64+
'codeWebChat',
65+
selectedFolder.uri
66+
)
67+
const inspect = config.inspect('ignorePatterns')
68+
69+
if (inspect?.workspaceFolderValue === undefined) {
70+
await config.update(
71+
'ignorePatterns',
72+
[],
73+
vscode.ConfigurationTarget.WorkspaceFolder
74+
)
75+
}
76+
77+
// Open the file
78+
const settingsPath = path.join(
79+
selectedFolder.uri.fsPath,
80+
'.vscode',
81+
'settings.json'
82+
)
83+
const settingsUri = vscode.Uri.file(settingsPath)
84+
85+
try {
86+
const doc = await vscode.workspace.openTextDocument(settingsUri)
87+
await vscode.window.showTextDocument(doc)
88+
} catch (e) {
89+
vscode.window.showErrorMessage(
90+
`Could not open settings file at ${settingsPath}`
91+
)
92+
}
93+
}

packages/vscode/src/views/settings/backend/message-handlers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ export * from './handle-get-are-automatic-checkpoints-disabled'
3737
export * from './handle-update-are-automatic-checkpoints-disabled'
3838
export * from './handle-get-checkpoint-lifespan'
3939
export * from './handle-upsert-configuration'
40+
export * from './handle-open-ignore-patterns-settings'

packages/vscode/src/views/settings/backend/settings-provider.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ import {
4242
handle_update_edit_context_system_instructions,
4343
handle_update_edit_format_instructions,
4444
handle_update_gemini_user_id,
45-
handle_upsert_configuration
45+
handle_upsert_configuration,
46+
handle_open_ignore_patterns_settings
4647
} from './message-handlers'
4748

4849
export class SettingsProvider {
@@ -218,6 +219,8 @@ export class SettingsProvider {
218219
)
219220
} else if (message.command == 'OPEN_EDITOR_SETTINGS') {
220221
await vscode.commands.executeCommand('workbench.action.openSettings')
222+
} else if (message.command == 'OPEN_IGNORE_PATTERNS_SETTINGS') {
223+
await handle_open_ignore_patterns_settings()
221224
} else if (message.command == 'UPSERT_CONFIGURATION') {
222225
await handle_upsert_configuration(this, message)
223226
}

packages/vscode/src/views/settings/frontend/Home/Home.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ type Props = {
103103
value: 'ignore-open-editors' | 'uncheck-all'
104104
) => void
105105
on_open_editor_settings: () => void
106+
on_open_ignore_patterns_settings: () => void
106107
on_add_provider: () => void
107108
on_delete_provider: (provider_name: string) => void
108109
on_edit_provider: (provider_name: string) => void
@@ -305,6 +306,9 @@ export const Home: React.FC<Props> = (props) => {
305306
checkpoint_lifespan={props.checkpoint_lifespan}
306307
on_checkpoint_lifespan_change={props.on_checkpoint_lifespan_change}
307308
on_open_editor_settings={props.on_open_editor_settings}
309+
on_open_ignore_patterns_settings={
310+
props.on_open_ignore_patterns_settings
311+
}
308312
on_stuck_change={general_on_stuck_change}
309313
/>
310314
<PresetsSection

packages/vscode/src/views/settings/frontend/Home/sections/GeneralSection.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Props = {
3232
instructions: EditFormatInstructions
3333
) => void
3434
on_open_editor_settings: () => void
35+
on_open_ignore_patterns_settings: () => void
3536
on_stuck_change: (is_stuck: boolean) => void
3637
}
3738

@@ -98,6 +99,15 @@ export const GeneralSection = forwardRef<HTMLDivElement, Props>(
9899
</TextButton>
99100
}
100101
/>
102+
<Item
103+
title="Ignore patterns"
104+
description="Glob patterns that you don't want to place in .gitignore files."
105+
slot={
106+
<TextButton on_click={props.on_open_ignore_patterns_settings}>
107+
Open settings file
108+
</TextButton>
109+
}
110+
/>
101111
<Item
102112
title="Context Size Warning Threshold"
103113
description="Set the token count threshold for showing a warning about large context sizes."

packages/vscode/src/views/settings/frontend/Settings.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ export const Settings = () => {
112112
}
113113
on_gemini_user_id_change={settings_hook.handle_gemini_user_id_change}
114114
on_open_editor_settings={settings_hook.handle_open_editor_settings}
115+
on_open_ignore_patterns_settings={
116+
settings_hook.handle_open_ignore_patterns_settings
117+
}
115118
on_reorder_providers={settings_hook.handle_reorder_providers}
116119
on_add_provider={settings_hook.handle_add_provider}
117120
on_delete_provider={settings_hook.handle_delete_provider}

packages/vscode/src/views/settings/frontend/hooks/use-settings.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ export const use_settings = (vscode: any) => {
242242
const handle_open_editor_settings = () =>
243243
post_message(vscode, { command: 'OPEN_EDITOR_SETTINGS' })
244244

245+
const handle_open_ignore_patterns_settings = () =>
246+
post_message(vscode, { command: 'OPEN_IGNORE_PATTERNS_SETTINGS' })
247+
245248
const handle_context_size_warning_threshold_change = (threshold: number) =>
246249
post_message(vscode, {
247250
command: 'UPDATE_CONTEXT_SIZE_WARNING_THRESHOLD',
@@ -317,6 +320,7 @@ export const use_settings = (vscode: any) => {
317320
handle_commit_message_auto_accept_after_change,
318321
handle_edit_context_system_instructions_change,
319322
handle_open_editor_settings,
323+
handle_open_ignore_patterns_settings,
320324
handle_context_size_warning_threshold_change,
321325
handle_edit_format_instructions_change,
322326
handle_automatic_checkpoints_toggle,

packages/vscode/src/views/settings/types/messages.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ export interface OpenEditorSettingsMessage {
171171
command: 'OPEN_EDITOR_SETTINGS'
172172
}
173173

174+
export interface OpenIgnorePatternsSettingsMessage {
175+
command: 'OPEN_IGNORE_PATTERNS_SETTINGS'
176+
}
177+
174178
export interface GetContextSizeWarningThresholdMessage {
175179
command: 'GET_CONTEXT_SIZE_WARNING_THRESHOLD'
176180
}
@@ -265,6 +269,7 @@ export type FrontendMessage =
265269
| UpdateClearChecksInWorkspaceBehaviorMessage
266270
| UpsertConfigurationMessage
267271
| OpenEditorSettingsMessage
272+
| OpenIgnorePatternsSettingsMessage
268273

269274
// === FROM BACKEND TO FRONTEND ===
270275
export interface ModelProvidersMessage {

0 commit comments

Comments
 (0)