Default path:
~/.spurwechsel/config.yaml
Override path:
SPURWECHSEL_CONFIG_PATH
Loader entry point: spurwechsel/State/ProjectConfigStore.swift.
Spurwechsel manages a sibling AGENTS.md next to config.yaml.
- default:
~/.spurwechsel/AGENTS.md - with override: sibling of
SPURWECHSEL_CONFIG_PATH
AGENTS.md contains concise instructions for AI agents on what they may configure in config.yaml.
File is app-owned and rewritten when missing or stale (for example after app updates or config saves).
versioncodeServersectionsprojectsagentsshortcutsterminaltheme
Raw file models live in spurwechsel/Models/ConfigFileModels.swift.
Resolved runtime models live in spurwechsel/Models/ConfigModels.swift.
- Read YAML.
- Decode into
UserConfigFile. - Normalize paths and explicit values.
- Resolve defaults and validate each domain.
- Return
ConfigLoadResultwith diagnostics.
Resolver lives in spurwechsel/State/ConfigResolver.swift.
Each project record stores:
path- optional
name - optional
sections(list of section ids)
Important detail: config stores repo roots only. Worktrees are discovered from git state, not persisted as separate records.
If project has no valid section assignments, UI places it into fallback section other.
Each section record stores:
id(required)- optional
name
projects[].sections must reference existing section ids. Section id other is reserved for fallback grouping and cannot be configured directly.
Each agent record stores:
namecommand- optional
default
If no valid agents remain after filtering, app falls back to built-ins:
opencodeclaudecodex
Each shortcut stores:
commandkeymodifiers
command accepts any command ID from command registry (toggle-command-bar, create-agent, toggle-voice-input, open-vscode-view, etc).
Resolver enforces one binding per command and removes signature collisions.
Terminal config stores:
swapCommandAndControlWhenFocused
When enabled, Spurwechsel swaps command and control only for focused terminal input, including agent terminals. App shortcuts still win first, so configured bindings like ⌘K keep triggering app commands instead of sending swapped input into terminal.
Embedded terminals also import a curated subset of Ghostty user config from default Ghostty paths (if present), with later files overriding earlier ones and config-file includes resolved in Ghostty order. Supported imported keys:
font-familyfont-sizefont-thickenfont-thicken-strengthcursor-stylecursor-style-blinkcursor-opacityselection-clear-on-copyselection-clear-on-typingselection-word-charsmouse-hide-while-typingmouse-scroll-multipliercopy-on-selectscrollback-limit
Non-curated keys are ignored for Spurwechsel’s embedded terminal runtime.
Theme config may override any subset of light or dark palette tokens. Missing values inherit from defaults.
Invalid config does not crash app. It produces banner-visible diagnostics and continues with fallback values.
Common causes:
- bad YAML
- missing required project or agent fields
- invalid shortcut command or modifier
- invalid
codeServer.port - invalid theme token values