# crossoverjie/skilldeck architecture

> Architecture diagram of the GitHub repository crossoverjie/skilldeck, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/crossoverjie/skilldeck
- Repository: https://github.com/crossoverjie/skilldeck

## Overview

SkillDeck is a macOS desktop app for managing skills across AI coding agents. Users browse a registry or select GitHub/local content, install skills, and assign them to agents; the app parses SKILL.md, stores canonical skill directories on disk, and exposes installations through symlinks. The dashboard also supports editing, update checks, and automatic refresh when CLI-side files change. The README documents these capabilities and the MVVM flow; sampled source confirms key orchestration and parsing responsibilities, but not every service call.

Main entry points: [`Sources/SkillDeck/Services/SkillManager.swift`](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SkillManager.swift) (Skill orchestrator), [`Sources/SkillDeck/Views`](https://github.com/crossoverjie/skilldeck/tree/main/Sources/SkillDeck/Views) (App views), [`Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift`](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift) (Git installer), [`Sources/SkillDeck/App/SkillDeckApp.swift`](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/App/SkillDeckApp.swift) (App entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Desktop interface"]
  node_app["App entry<br/>[SkillDeckApp.swift]"]
  node_views["App views"]
  node_dashboard["Dashboard state"]
  node_detail["Skill detail"]
  node_editor["Skill editor"]
  node_markdown["Markdown renderer"]
end

subgraph group_discovery["Discovery and import"]
  node_registry["Registry browser"]
  node_clawhub["ClawHub browser"]
  node_installer["Git installer"]
  node_localimport["Local import"]
end

subgraph group_management["Skill management"]
  node_manager["Skill orchestrator<br/>[SkillManager.swift]"]
  node_model["Skill model<br/>[Skill.swift]"]
  node_parser["SKILL.md parser"]
  node_metadata["Skill metadata"]
  node_git["Git operations<br/>[GitService.swift]"]
  node_symlinks["Agent assignments"]
  node_lock["Lock file"]
  node_filesystem[("Skill filesystem")]
end

subgraph group_platform["App services"]
  node_watcher["File watcher"]
  node_updates["Update checker"]
  node_translation["Translation"]
  node_settings["App settings<br/>[SettingsView.swift]"]
  node_proxy["Proxy networking"]
  node_localization["Localization<br/>[L10n.swift]"]
end

node_user(("User"))
node_agents(("AI agents"))

node_user -->|"launches"| node_app
node_app -->|"presents"| node_views
node_views -->|"reads state"| node_dashboard
node_views -->|"browses"| node_registry
node_views -->|"starts install"| node_installer
node_views -->|"imports folder"| node_localimport
node_views -->|"shows detail"| node_detail
node_views -->|"edits skill"| node_editor
node_views -.->|"browses catalog"| node_clawhub
node_registry -->|"starts install"| node_installer
node_registry -->|"fetches content"| node_manager
node_installer -->|"clones repository"| node_git
node_installer -->|"installs skill"| node_manager
node_localimport -.->|"imports skill"| node_manager
node_manager -->|"parses files"| node_parser
node_parser -->|"decodes YAML"| node_metadata
node_git -->|"parses discovered"| node_parser
node_manager -->|"clones updates"| node_git
node_manager -->|"assigns agents"| node_symlinks
node_manager -->|"updates lock"| node_lock
node_manager -->|"reads and writes"| node_filesystem
node_symlinks -->|"links skills"| node_agents
node_manager -->|"monitors changes"| node_watcher
node_watcher -.->|"refreshes state"| node_manager
node_manager -->|"checks updates"| node_updates
node_detail -->|"renders content"| node_markdown
node_markdown -->|"translates text"| node_manager
node_manager -.->|"requests translation"| node_translation
node_user -->|"configures app"| node_settings
node_settings -->|"configures proxy"| node_proxy
node_app -->|"sets language"| node_localization
node_dashboard -->|"loads skills"| node_manager

click node_app "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/App/SkillDeckApp.swift"
click node_views "https://github.com/crossoverjie/skilldeck/tree/main/Sources/SkillDeck/Views"
click node_dashboard "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/DashboardViewModel.swift"
click node_detail "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillDetailViewModel.swift"
click node_editor "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillEditorViewModel.swift"
click node_markdown "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Views/Components/MarkdownContentView.swift"
click node_registry "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/RegistryBrowserViewModel.swift"
click node_clawhub "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/ClawHubBrowserViewModel.swift"
click node_installer "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift"
click node_localimport "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/LocalImportViewModel.swift"
click node_manager "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SkillManager.swift"
click node_model "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Models/Skill.swift"
click node_parser "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SkillMDParser.swift"
click node_metadata "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Models/SkillMetadata.swift"
click node_git "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/GitService.swift"
click node_symlinks "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SymlinkManager.swift"
click node_lock "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/LockFileManager.swift"
click node_watcher "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/FileSystemWatcher.swift"
click node_updates "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/UpdateChecker.swift"
click node_translation "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/TranslationService.swift"
click node_settings "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Views/SettingsView.swift"
click node_proxy "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/NetworkSessionProvider.swift"
click node_localization "https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Utilities/Localization/L10n.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_views,node_dashboard,node_detail,node_editor,node_markdown,node_user toneBlue
class node_registry,node_clawhub,node_installer,node_localimport toneAmber
class node_manager,node_model,node_parser,node_metadata,node_git,node_symlinks,node_lock,node_filesystem toneMint
class node_watcher,node_updates,node_translation,node_settings,node_proxy,node_localization toneRose
class node_agents toneIndigo
```

## Components

### Desktop interface

- [App entry](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/App/SkillDeckApp.swift): `Sources/SkillDeck/App/SkillDeckApp.swift`
- [App views](https://github.com/crossoverjie/skilldeck/tree/main/Sources/SkillDeck/Views): `Sources/SkillDeck/Views`
- [Dashboard state](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/DashboardViewModel.swift): `Sources/SkillDeck/ViewModels/DashboardViewModel.swift`
- [Skill detail](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillDetailViewModel.swift): `Sources/SkillDeck/ViewModels/SkillDetailViewModel.swift`
- [Skill editor](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillEditorViewModel.swift): `Sources/SkillDeck/ViewModels/SkillEditorViewModel.swift`
- [Markdown renderer](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Views/Components/MarkdownContentView.swift): `Sources/SkillDeck/Views/Components/MarkdownContentView.swift`

### Discovery and import

- [Registry browser](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/RegistryBrowserViewModel.swift): `Sources/SkillDeck/ViewModels/RegistryBrowserViewModel.swift`
- [ClawHub browser](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/ClawHubBrowserViewModel.swift): `Sources/SkillDeck/ViewModels/ClawHubBrowserViewModel.swift`
- [Git installer](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift): `Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift`
- [Local import](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/ViewModels/LocalImportViewModel.swift): `Sources/SkillDeck/ViewModels/LocalImportViewModel.swift`

### Skill management

- [Skill orchestrator](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SkillManager.swift): `Sources/SkillDeck/Services/SkillManager.swift`
- [Skill model](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Models/Skill.swift): `Sources/SkillDeck/Models/Skill.swift`
- [SKILL.md parser](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SkillMDParser.swift): `Sources/SkillDeck/Services/SkillMDParser.swift`
- [Skill metadata](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Models/SkillMetadata.swift): `Sources/SkillDeck/Models/SkillMetadata.swift`
- [Git operations](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/GitService.swift): `Sources/SkillDeck/Services/GitService.swift`
- [Agent assignments](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/SymlinkManager.swift): `Sources/SkillDeck/Services/SymlinkManager.swift`
- [Lock file](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/LockFileManager.swift): `Sources/SkillDeck/Services/LockFileManager.swift`
- **Skill filesystem**

### App services

- [File watcher](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/FileSystemWatcher.swift): `Sources/SkillDeck/Services/FileSystemWatcher.swift`
- [Update checker](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/UpdateChecker.swift): `Sources/SkillDeck/Services/UpdateChecker.swift`
- [Translation](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/TranslationService.swift): `Sources/SkillDeck/Services/TranslationService.swift`
- [App settings](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Views/SettingsView.swift): `Sources/SkillDeck/Views/SettingsView.swift`
- [Proxy networking](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Services/NetworkSessionProvider.swift): `Sources/SkillDeck/Services/NetworkSessionProvider.swift`
- [Localization](https://github.com/crossoverjie/skilldeck/blob/main/Sources/SkillDeck/Utilities/Localization/L10n.swift): `Sources/SkillDeck/Utilities/Localization/L10n.swift`

### Other components

- **User**
- **AI agents**

## Connections

- User → App entry: launches (evidence: `README.md`)
- App entry → App views: presents (evidence: `Sources/SkillDeck/App/SkillDeckApp.swift`)
- App views → Dashboard state: reads state (evidence: `Sources/SkillDeck/Views/Dashboard/DashboardView.swift`)
- App views → Registry browser: browses (evidence: `Sources/SkillDeck/Views/Registry/RegistrySkillDetailView.swift`)
- App views → Git installer: starts install (evidence: `Sources/SkillDeck/Views/Install/SkillInstallView.swift`)
- App views → Local import: imports folder (evidence: `Sources/SkillDeck/Views/Sidebar/SidebarView.swift`)
- App views → Skill detail: shows detail (evidence: `Sources/SkillDeck/Views/Detail/SkillDetailView.swift`)
- App views → Skill editor: edits skill (evidence: `Sources/SkillDeck/Views/Detail/SkillDetailView.swift`)
- App views → ClawHub browser: browses catalog (evidence: `README.md`)
- Registry browser → Git installer: starts install (evidence: `Sources/SkillDeck/ViewModels/RegistryBrowserViewModel.swift`)
- Registry browser → Skill orchestrator: fetches content (evidence: `Sources/SkillDeck/ViewModels/RegistryBrowserViewModel.swift`)
- Git installer → Git operations: clones repository (evidence: `Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift`)
- Git installer → Skill orchestrator: installs skill (evidence: `Sources/SkillDeck/ViewModels/SkillInstallViewModel.swift`)
- Local import → Skill orchestrator: imports skill (evidence: `README.md`)
- Skill orchestrator → SKILL.md parser: parses files (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- SKILL.md parser → Skill metadata: decodes YAML (evidence: `Sources/SkillDeck/Services/SkillMDParser.swift`)
- Git operations → SKILL.md parser: parses discovered (evidence: `Sources/SkillDeck/Services/GitService.swift`)
- Skill orchestrator → Git operations: clones updates (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- Skill orchestrator → Agent assignments: assigns agents (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- Skill orchestrator → Lock file: updates lock (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- Skill orchestrator → Skill filesystem: reads and writes (evidence: `README.md`)
- Agent assignments → AI agents: links skills (evidence: `Sources/SkillDeck/Services/SymlinkManager.swift`)
- Skill orchestrator → File watcher: monitors changes (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- File watcher → Skill orchestrator: refreshes state (evidence: `README.md`)
- Skill orchestrator → Update checker: checks updates (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- Skill detail → Markdown renderer: renders content (evidence: `Sources/SkillDeck/Views/Detail/SkillDetailView.swift`)
- Markdown renderer → Skill orchestrator: translates text (evidence: `Sources/SkillDeck/Views/Components/MarkdownContentView.swift`)
- Skill orchestrator → Translation: requests translation (evidence: `Sources/SkillDeck/Services/SkillManager.swift`)
- User → App settings: configures app (evidence: `README.md`)
- App settings → Proxy networking: configures proxy
- App entry → Localization: sets language (evidence: `Sources/SkillDeck/App/SkillDeckApp.swift`)
- Dashboard state → Skill orchestrator: loads skills (evidence: `Sources/SkillDeck/Views/Dashboard/DashboardView.swift`)
