{"owner":"ejbills","repo":"DockDoor","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# DockDoor\n\nmacOS dock enhancement app — window previews on dock hover, Alt+Tab window switcher, Cmd+Tab overlay. Menu bar only (`LSUIElement: true`). Swift 5.10 / SwiftUI / AppKit. GPL-3.0.\n\n## Build\n\nOpen `DockDoor.xcodeproj` in Xcode and build (Cmd+R). No CLI build commands — this is an Xcode-managed project, not SPM.\n\n## Adding Files to the Project\n\nEvery new `.swift` file must be registered in `DockDoor.xcodeproj/project.pbxproj`:\n\n1. Generate two UUIDs: `for i in 1 2; do uuidgen | tr -d '-'; done`\n2. Add a `PBXFileReference` entry\n3. Add a `PBXBuildFile` entry referencing it\n4. Add the file ref to the correct `PBXGroup`\n5. Add the build file to `PBXSourcesBuildPhase`\n\n## Adding Settings\n\nAll user preferences are declared in `consts.swift` under `extension Defaults.Keys`.\n\n**Every new setting must be indexed in the search system:**\n\n1. Add a `.settingsSearchTarget(\"tab.settingName\")` modifier to the control in the view:\n   ```swift\n   Toggle(isOn: $mySetting) {\n       Text(\"My Setting\")\n   }\n   .settingsSearchTarget(\"general.mySetting\")\n   ```\n\n2. Add a catalog entry in `Views/Settings/Search/SettingsSearchCatalog.swift`:\n   ```swift\n   SettingsSearchItem(\n       id: \"general.mySetting\",          // must match the search target\n       title: String(localized: \"My Setting\"), // exact string from the view\n       description: String(localized: \"Optional description text\"),\n       keywords: [\"internal\", \"search\", \"tokens\"],\n       tab: \"General\",                   // matches sidebar tab tag\n       section: String(localized: \"Section Header\"),\n       icon: \"sf.symbol.name\"\n   )\n   ```\n\n3. If adding a new settings tab, also update `SettingsSearchEngine.swift` — add to `tabDisplayOrder` and `tabDisplayNames`.\n\n### Rules\n\n- `title` and `description` use `String(localized:)` with the **exact same literal** as the view — reuses existing translations\n- `keywords` are internal English tokens only (not translated, not displayed)\n- The `id` must match between the catalog entry and `.settingsSearchTarget()` call\n\n## Localization\n\n- Use `String(localized:comment:)` for user-facing strings\n- Do not edit `Localizable.xcstrings` directly — managed via Crowdin\n- macOS 13.0 minimum — use single-parameter `onChange { newValue in }` form\n\n## Code Style\n\n- No verbose comments — only comment non-obvious logic\n- No doc comments unless the API is public and non-obvious\n- UI state belongs in coordinators, not views\n- Window operations go through `WindowUtil` static methods\n- Reusable settings UI goes in `Views/Settings/Shared Components/`\n\n## Key Files\n\n| File | Purpose |\n|------|---------|\n| `consts.swift` | All user preference keys |\n| `WindowUtil.swift` | Window discovery/manipulation (Accessibility APIs) |\n| `DockObserver.swift` | Dock hover detection and event routing |\n| `SharedPreviewWindowCoordinator.swift` | Preview panel lifecycle |\n| `Views/Settings/Search/SettingsSearchCatalog.swift` | Settings search index |\n"},"files":{"AGENTS.md":"# DockDoor\n\nmacOS dock enhancement app — window previews on dock hover, Alt+Tab window switcher, Cmd+Tab overlay. Menu bar only (`LSUIElement: true`). Swift 5.10 / SwiftUI / AppKit. GPL-3.0.\n\n## Build\n\nOpen `DockDoor.xcodeproj` in Xcode and build (Cmd+R). No CLI build commands — this is an Xcode-managed project, not SPM.\n\n## Adding Files to the Project\n\nEvery new `.swift` file must be registered in `DockDoor.xcodeproj/project.pbxproj`:\n\n1. Generate two UUIDs: `for i in 1 2; do uuidgen | tr -d '-'; done`\n2. Add a `PBXFileReference` entry\n3. Add a `PBXBuildFile` entry referencing it\n4. Add the file ref to the correct `PBXGroup`\n5. Add the build file to `PBXSourcesBuildPhase`\n\n## Adding Settings\n\nAll user preferences are declared in `consts.swift` under `extension Defaults.Keys`.\n\n**Every new setting must be indexed in the search system:**\n\n1. Add a `.settingsSearchTarget(\"tab.settingName\")` modifier to the control in the view:\n   ```swift\n   Toggle(isOn: $mySetting) {\n       Text(\"My Setting\")\n   }\n   .settingsSearchTarget(\"general.mySetting\")\n   ```\n\n2. Add a catalog entry in `Views/Settings/Search/SettingsSearchCatalog.swift`:\n   ```swift\n   SettingsSearchItem(\n       id: \"general.mySetting\",          // must match the search target\n       title: String(localized: \"My Setting\"), // exact string from the view\n       description: String(localized: \"Optional description text\"),\n       keywords: [\"internal\", \"search\", \"tokens\"],\n       tab: \"General\",                   // matches sidebar tab tag\n       section: String(localized: \"Section Header\"),\n       icon: \"sf.symbol.name\"\n   )\n   ```\n\n3. If adding a new settings tab, also update `SettingsSearchEngine.swift` — add to `tabDisplayOrder` and `tabDisplayNames`.\n\n### Rules\n\n- `title` and `description` use `String(localized:)` with the **exact same literal** as the view — reuses existing translations\n- `keywords` are internal English tokens only (not translated, not displayed)\n- The `id` must match between the catalog entry and `.settingsSearchTarget()` call\n\n## Localization\n\n- Use `String(localized:comment:)` for user-facing strings\n- Do not edit `Localizable.xcstrings` directly — managed via Crowdin\n- macOS 13.0 minimum — use single-parameter `onChange { newValue in }` form\n\n## Code Style\n\n- No verbose comments — only comment non-obvious logic\n- No doc comments unless the API is public and non-obvious\n- UI state belongs in coordinators, not views\n- Window operations go through `WindowUtil` static methods\n- Reusable settings UI goes in `Views/Settings/Shared Components/`\n\n## Key Files\n\n| File | Purpose |\n|------|---------|\n| `consts.swift` | All user preference keys |\n| `WindowUtil.swift` | Window discovery/manipulation (Accessibility APIs) |\n| `DockObserver.swift` | Dock hover detection and event routing |\n| `SharedPreviewWindowCoordinator.swift` | Preview panel lifecycle |\n| `Views/Settings/Search/SettingsSearchCatalog.swift` | Settings search index |\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# DockDoor\n\nmacOS dock enhancement app — window previews on dock hover, Alt+Tab window switcher, Cmd+Tab overlay. Menu bar only (`LSUIElement: true`). Swift 5.10 / SwiftUI / AppKit. GPL-3.0.\n\n## Build\n\nOpen `DockDoor.xcodeproj` in Xcode and build (Cmd+R). No CLI build commands — this is an Xcode-managed project, not SPM.\n\n## Adding Files to the Project\n\nEvery new `.swift` file must be registered in `DockDoor.xcodeproj/project.pbxproj`:\n\n1. Generate two UUIDs: `for i in 1 2; do uuidgen | tr -d '-'; done`\n2. Add a `PBXFileReference` entry\n3. Add a `PBXBuildFile` entry referencing it\n4. Add the file ref to the correct `PBXGroup`\n5. Add the build file to `PBXSourcesBuildPhase`\n\n## Adding Settings\n\nAll user preferences are declared in `consts.swift` under `extension Defaults.Keys`.\n\n**Every new setting must be indexed in the search system:**\n\n1. Add a `.settingsSearchTarget(\"tab.settingName\")` modifier to the control in the view:\n   ```swift\n   Toggle(isOn: $mySetting) {\n       Text(\"My Setting\")\n   }\n   .settingsSearchTarget(\"general.mySetting\")\n   ```\n\n2. Add a catalog entry in `Views/Settings/Search/SettingsSearchCatalog.swift`:\n   ```swift\n   SettingsSearchItem(\n       id: \"general.mySetting\",          // must match the search target\n       title: String(localized: \"My Setting\"), // exact string from the view\n       description: String(localized: \"Optional description text\"),\n       keywords: [\"internal\", \"search\", \"tokens\"],\n       tab: \"General\",                   // matches sidebar tab tag\n       section: String(localized: \"Section Header\"),\n       icon: \"sf.symbol.name\"\n   )\n   ```\n\n3. If adding a new settings tab, also update `SettingsSearchEngine.swift` — add to `tabDisplayOrder` and `tabDisplayNames`.\n\n### Rules\n\n- `title` and `description` use `String(localized:)` with the **exact same literal** as the view — reuses existing translations\n- `keywords` are internal English tokens only (not translated, not displayed)\n- The `id` must match between the catalog entry and `.settingsSearchTarget()` call\n\n## Localization\n\n- Use `String(localized:comment:)` for user-facing strings\n- Do not edit `Localizable.xcstrings` directly — managed via Crowdin\n- macOS 13.0 minimum — use single-parameter `onChange { newValue in }` form\n\n## Code Style\n\n- No verbose comments — only comment non-obvious logic\n- No doc comments unless the API is public and non-obvious\n- UI state belongs in coordinators, not views\n- Window operations go through `WindowUtil` static methods\n- Reusable settings UI goes in `Views/Settings/Shared Components/`\n\n## Key Files\n\n| File | Purpose |\n|------|---------|\n| `consts.swift` | All user preference keys |\n| `WindowUtil.swift` | Window discovery/manipulation (Accessibility APIs) |\n| `DockObserver.swift` | Dock hover detection and event routing |\n| `SharedPreviewWindowCoordinator.swift` | Preview panel lifecycle |\n| `Views/Settings/Search/SettingsSearchCatalog.swift` | Settings search index |\n","category":"root","tokens":738}]}