feat: allow control over displaying hidden/dotfiles and .gitignore matches (#179)

* feat: add chat setting to toggle hidden files (dotfiles)

* feat: add toggle to show/hide gitignored files in file browser

* refactor: don't reuse visibility setting for dotfiles toggle

* fix: honor hidden/gitignored toggles across runtimes

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
syntext
2026-01-20 15:20:17 +02:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent 6544b12e78
commit 2de0d9d3dd
19 changed files with 639 additions and 157 deletions
@@ -5,10 +5,12 @@ import { updateDesktopSettings } from '@/lib/persistence';
import { isDesktopRuntime, getDesktopSettings } from '@/lib/desktop';
import { useConfigStore } from '@/stores/useConfigStore';
import { getRegisteredRuntimeAPIs } from '@/contexts/runtimeAPIRegistry';
import { setFilesViewShowGitignored, useFilesViewShowGitignored } from '@/lib/filesViewShowGitignored';
export const GitSettings: React.FC = () => {
const settingsGitmojiEnabled = useConfigStore((state) => state.settingsGitmojiEnabled);
const setSettingsGitmojiEnabled = useConfigStore((state) => state.setSettingsGitmojiEnabled);
const showGitignored = useFilesViewShowGitignored();
const [isLoading, setIsLoading] = React.useState(true);
@@ -85,7 +87,7 @@ export const GitSettings: React.FC = () => {
}
return (
<div className="space-y-4">
<div className="space-y-6">
<div className="space-y-1">
<div className="flex items-center gap-2">
<h3 className="typography-ui-header font-semibold text-foreground">Commit Messages</h3>
@@ -116,6 +118,29 @@ export const GitSettings: React.FC = () => {
</p>
</div>
</div>
<div className="space-y-1">
<h3 className="typography-ui-header font-semibold text-foreground">Files Overview</h3>
<p className="typography-meta text-muted-foreground">
Show gitignored files in the Files browser pane only.
</p>
</div>
<div className="space-y-3">
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
className="h-3.5 w-3.5 accent-primary"
checked={showGitignored}
onChange={(event) => setFilesViewShowGitignored(event.target.checked)}
/>
<span className="typography-ui-label text-foreground">Display gitignored files</span>
</label>
<p className="typography-meta text-muted-foreground pl-5.5">
Toggles gitignored files in the Files tree and search results.
</p>
</div>
</div>
</div>
);
};
@@ -81,7 +81,7 @@ const VisualSectionContent: React.FC = () => {
// Chat section: Default Tool Output, Diff layout, Show reasoning traces, Queue mode
const ChatSectionContent: React.FC = () => {
return <OpenChamberVisualSettings visibleSettings={['toolOutput', 'diffLayout', 'reasoning', 'queueMode']} />;
return <OpenChamberVisualSettings visibleSettings={['toolOutput', 'diffLayout', 'dotfiles', 'reasoning', 'queueMode']} />;
};
// Sessions section: Default model & agent, Session retention, Memory limits
@@ -10,6 +10,10 @@ import { ButtonSmall } from '@/components/ui/button-small';
import { NumberInput } from '@/components/ui/number-input';
import { isVSCodeRuntime } from '@/lib/desktop';
import { useDeviceInfo } from '@/lib/device';
import {
setDirectoryShowHidden,
useDirectoryShowHidden,
} from '@/lib/directoryShowHidden';
interface Option<T extends string> {
id: T;
@@ -69,7 +73,7 @@ const DIFF_VIEW_MODE_OPTIONS: Option<'single' | 'stacked'>[] = [
},
];
export type VisibleSetting = 'theme' | 'fontSize' | 'spacing' | 'cornerRadius' | 'inputBarOffset' | 'toolOutput' | 'diffLayout' | 'reasoning' | 'queueMode';
export type VisibleSetting = 'theme' | 'fontSize' | 'spacing' | 'cornerRadius' | 'inputBarOffset' | 'toolOutput' | 'diffLayout' | 'dotfiles' | 'reasoning' | 'queueMode';
interface OpenChamberVisualSettingsProps {
/** Which settings to show. If undefined, shows all. */
@@ -78,6 +82,7 @@ interface OpenChamberVisualSettingsProps {
export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps> = ({ visibleSettings }) => {
const { isMobile } = useDeviceInfo();
const directoryShowHidden = useDirectoryShowHidden();
const showReasoningTraces = useUIStore(state => state.showReasoningTraces);
const setShowReasoningTraces = useUIStore(state => state.setShowReasoningTraces);
const toolCallExpansion = useUIStore(state => state.toolCallExpansion);
@@ -474,6 +479,38 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
{DIFF_VIEW_MODE_OPTIONS.find((option) => option.id === diffViewMode)?.description}
</p>
</div>
</div>
)}
{shouldShow('dotfiles') && !isVSCodeRuntime() && (
<div className="space-y-3">
<div className="space-y-1">
<h3 className="typography-ui-header font-semibold text-foreground">
Hidden files (Chat)
</h3>
<p className="typography-meta text-muted-foreground/80">
Show or hide dotfiles in file lists and directory pickers.
</p>
</div>
<div className="flex flex-col gap-2">
<div className="flex gap-1 w-fit">
{[
{ id: 'hide', label: 'Hide', value: false },
{ id: 'show', label: 'Show', value: true },
].map((option) => (
<ButtonSmall
key={option.id}
variant={directoryShowHidden === option.value ? 'default' : 'outline'}
className={cn(directoryShowHidden === option.value ? undefined : 'text-foreground')}
onClick={() => setDirectoryShowHidden(option.value)}
>
{option.label}
</ButtonSmall>
))}
</div>
</div>
</div>
)}