diff --git a/packages/pi-coding-agent/src/core/settings-manager.ts b/packages/pi-coding-agent/src/core/settings-manager.ts index c7c73de30..8000e2a61 100644 --- a/packages/pi-coding-agent/src/core/settings-manager.ts +++ b/packages/pi-coding-agent/src/core/settings-manager.ts @@ -134,6 +134,7 @@ export interface Settings { thinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels editorPaddingX?: number; // Horizontal padding for input editor (default: 0) autocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5) + respectGitignoreInPicker?: boolean; // When false, @ file picker shows gitignored files (default: true) showHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME markdown?: MarkdownSettings; memory?: MemorySettings; @@ -1024,6 +1025,16 @@ export class SettingsManager { this.save(); } + getRespectGitignoreInPicker(): boolean { + return this.settings.respectGitignoreInPicker ?? true; + } + + setRespectGitignoreInPicker(value: boolean): void { + this.globalSettings.respectGitignoreInPicker = value; + this.markModified("respectGitignoreInPicker"); + this.save(); + } + getCodeBlockIndent(): string { return this.settings.markdown?.codeBlockIndent ?? " "; } diff --git a/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts b/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts index daacd9c52..425154982 100644 --- a/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +++ b/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts @@ -42,6 +42,7 @@ export interface SettingsConfig { showHardwareCursor: boolean; editorPaddingX: number; autocompleteMaxVisible: number; + respectGitignoreInPicker: boolean; quietStartup: boolean; clearOnShrink: boolean; } @@ -65,6 +66,7 @@ export interface SettingsCallbacks { onShowHardwareCursorChange: (enabled: boolean) => void; onEditorPaddingXChange: (padding: number) => void; onAutocompleteMaxVisibleChange: (maxVisible: number) => void; + onRespectGitignoreInPickerChange: (enabled: boolean) => void; onQuietStartupChange: (enabled: boolean) => void; onClearOnShrinkChange: (enabled: boolean) => void; onCancel: () => void; @@ -343,6 +345,16 @@ export class SettingsSelectorComponent extends Container { values: ["true", "false"], }); + // Respect .gitignore in file picker toggle (insert after clear-on-shrink) + const clearOnShrinkIndex = items.findIndex((item) => item.id === "clear-on-shrink"); + items.splice(clearOnShrinkIndex + 1, 0, { + id: "respect-gitignore-in-picker", + label: "Respect .gitignore in file picker", + description: "When false, @ file picker shows gitignored files too", + currentValue: config.respectGitignoreInPicker ? "true" : "false", + values: ["true", "false"], + }); + // Add borders this.addChild(new DynamicBorder()); @@ -405,6 +417,9 @@ export class SettingsSelectorComponent extends Container { case "clear-on-shrink": callbacks.onClearOnShrinkChange(newValue === "true"); break; + case "respect-gitignore-in-picker": + callbacks.onRespectGitignoreInPickerChange(newValue === "true"); + break; } }, callbacks.onCancel, diff --git a/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts b/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts index fbff35330..42831298e 100644 --- a/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts @@ -350,6 +350,7 @@ export class InteractiveMode { this.autocompleteProvider = new CombinedAutocompleteProvider( [...slashCommands, ...templateCommands, ...extensionCommands, ...skillCommandList], process.cwd(), + { respectGitignore: this.settingsManager.getRespectGitignoreInPicker() }, ); this.defaultEditor.setAutocompleteProvider(this.autocompleteProvider); if (this.editor !== this.defaultEditor) { @@ -3314,6 +3315,7 @@ export class InteractiveMode { showHardwareCursor: this.settingsManager.getShowHardwareCursor(), editorPaddingX: this.settingsManager.getEditorPaddingX(), autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(), + respectGitignoreInPicker: this.settingsManager.getRespectGitignoreInPicker(), quietStartup: this.settingsManager.getQuietStartup(), clearOnShrink: this.settingsManager.getClearOnShrink(), }, @@ -3415,6 +3417,10 @@ export class InteractiveMode { this.settingsManager.setClearOnShrink(enabled); this.ui.setClearOnShrink(enabled); }, + onRespectGitignoreInPickerChange: (enabled) => { + this.settingsManager.setRespectGitignoreInPicker(enabled); + this.autocompleteProvider?.setRespectGitignore(enabled); + }, onCancel: () => { done(); this.ui.requestRender(); diff --git a/packages/pi-tui/src/autocomplete.ts b/packages/pi-tui/src/autocomplete.ts index 84d3f2dce..0fcbdc57e 100644 --- a/packages/pi-tui/src/autocomplete.ts +++ b/packages/pi-tui/src/autocomplete.ts @@ -130,13 +130,20 @@ export interface AutocompleteProvider { export class CombinedAutocompleteProvider implements AutocompleteProvider { private commands: (SlashCommand | AutocompleteItem)[]; private basePath: string; + private respectGitignore: boolean; constructor( commands: (SlashCommand | AutocompleteItem)[] = [], basePath: string = process.cwd(), + options?: { respectGitignore?: boolean }, ) { this.commands = commands; this.basePath = basePath; + this.respectGitignore = options?.respectGitignore ?? true; + } + + setRespectGitignore(value: boolean): void { + this.respectGitignore = value; } getSuggestions( @@ -562,7 +569,7 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider { query: searchQuery, path: searchPath, hidden: true, - gitignore: true, + gitignore: this.respectGitignore, maxResults: FUZZY_FILE_MAX_RESULTS, });