{"owner":"ejbills","repo":"DockDoor","hasSkills":true,"totalSkillsCount":4,"totalTokensCount":1800,"categories":["root-instruction","mcp-config","marketplace","plugin-manifest"],"hasMcp":true,"mcpConfig":{"mcpServers":{"DockDoor":{"command":"npx","args":["-y","@modelcontextprotocol/server-DockDoor"]}}},"found":["AGENTS.md",".cursor/mcp.json",".claude-plugin/marketplace.json",".claude-plugin/plugin.json"],"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## Before Doing Anything on GitHub\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) before you open, edit or comment on a pull request, and follow it, including its \"If you are an AI agent\" section. PRs that ignore it are closed without discussion. The rules that agents break most often:\n\n- Start every PR and issue body from its template in `.github/`. `gh pr create --body`, `gh pr create --fill` and `gh issue create --body` skip the templates.\n- Fill in the AI disclosure. Don't tick checkboxes or write \"Describe your changes\" for your human.\n- One issue per PR, with no unrelated changes.\n\nThese rules are for contributors. The maintainer (@ejbills) is exempt.\n\n## Build\n\nRequires Xcode 27 or later on macOS 27 or later. Open `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",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/plugin.json)"},"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## Before Doing Anything on GitHub\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) before you open, edit or comment on a pull request, and follow it, including its \"If you are an AI agent\" section. PRs that ignore it are closed without discussion. The rules that agents break most often:\n\n- Start every PR and issue body from its template in `.github/`. `gh pr create --body`, `gh pr create --fill` and `gh issue create --body` skip the templates.\n- Fill in the AI disclosure. Don't tick checkboxes or write \"Describe your changes\" for your human.\n- One issue per PR, with no unrelated changes.\n\nThese rules are for contributors. The maintainer (@ejbills) is exempt.\n\n## Build\n\nRequires Xcode 27 or later on macOS 27 or later. Open `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",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/plugin.json)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","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## Before Doing Anything on GitHub\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) before you open, edit or comment on a pull request, and follow it, including its \"If you are an AI agent\" section. PRs that ignore it are closed without discussion. The rules that agents break most often:\n\n- Start every PR and issue body from its template in `.github/`. `gh pr create --body`, `gh pr create --fill` and `gh issue create --body` skip the templates.\n- Fill in the AI disclosure. Don't tick checkboxes or write \"Describe your changes\" for your human.\n- One issue per PR, with no unrelated changes.\n\nThese rules are for contributors. The maintainer (@ejbills) is exempt.\n\n## Build\n\nRequires Xcode 27 or later on macOS 27 or later. Open `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","isInternal":false,"tokens":900,"sizeBytes":3676},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/marketplace.json","title":"Claude Plugin Marketplace Catalog","category":"marketplace","format":"json","content":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/marketplace.json)","tokens":300,"sizeBytes":195},{"name":"plugin.json","path":".claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/plugin.json","title":"claude-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/plugin.json)","tokens":300,"sizeBytes":181},{"name":"mcp.json","path":".cursor/mcp.json","rawUrl":"https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.cursor/mcp.json","title":"Model Context Protocol (MCP) Configuration","category":"mcp-config","format":"json","content":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.cursor/mcp.json)","tokens":300,"sizeBytes":174}],"systemPromptSnippet":"<yakaai_skills repo=\"ejbills/DockDoor\">\n<!-- File: AGENTS.md (Tokens: ~900 | Category: root-instruction) -->\n# 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## Before Doing Anything on GitHub\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) before you open, edit or comment on a pull request, and follow it, including its \"If you are an AI agent\" section. PRs that ignore it are closed without discussion. The rules that agents break most often:\n\n- Start every PR and issue body from its template in `.github/`. `gh pr create --body`, `gh pr create --fill` and `gh issue create --body` skip the templates.\n- Fill in the AI disclosure. Don't tick checkboxes or write \"Describe your changes\" for your human.\n- One issue per PR, with no unrelated changes.\n\nThese rules are for contributors. The maintainer (@ejbills) is exempt.\n\n## Build\n\nRequires Xcode 27 or later on macOS 27 or later. Open `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\n<!-- File: .claude-plugin/marketplace.json (Tokens: ~300 | Category: marketplace) -->\n# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/marketplace.json)\n\n<!-- File: .claude-plugin/plugin.json (Tokens: ~300 | Category: plugin-manifest) -->\n# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.claude-plugin/plugin.json)\n\n<!-- File: .cursor/mcp.json (Tokens: ~300 | Category: mcp-config) -->\n# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/ejbills/DockDoor/HEAD/.cursor/mcp.json)\n</yakaai_skills>"}