The app is a single-process SwiftUI macOS application with:
- A UI layer built with SwiftUI (using
NavigationSplitViewfor macOS-style sidebar and content structure).[web:39][web:57] - Domain models representing capabilities (skills, plugins, connectors, MCP servers), projects, and agents.
- Stores/services that own shared state: registry of capabilities, projects store, marketplace service, installer service, and project discovery service.
- A persistence layer that stores these models in JSON or SQLite using Codable.[web:49][web:53]
- Integration stubs for backend/Claude Code configuration export.
- Language: Swift (latest stable).
- UI: SwiftUI, using
NavigationSplitViewfor three-column layout.[web:39][web:50][web:57] - Persistence: Codable-based JSON storage (local files) for v1; future-proofed to swap to SQLite.
- Network:
URLSessionfor HTTP calls (marketplace catalog, repo downloads). - Unzipping: Apple’s
ArchiveAPIs or a minimal third-party zip library. - Keychain: use Security framework for secure token storage.
Skillid: UUIDname: Stringsummary: Stringtags: [String]location: URL(directory containing SKILL.md)skillFile: URL(path to SKILL.md)pluginID: UUID?(owner plugin if any)
Pluginid: UUIDname: Stringsummary: Stringversion: String?tags: [String]rootDirectory: URL(plugin root)skillIDs: [UUID]mcpServerIDs: [UUID]
MCPServerid: UUIDlabel: StringserverURL: URLdescription: StringauthType: String?(e.g., token, oauth)isGlobal: Bool
Connectorid: UUIDname: StringserviceType: StringbackingMCPServerID: UUID?isGlobal: Bool
Agent(v1 mostly Claude Code)id: UUIDname: Stringtype: AgentType(.code,.chatfuture)defaultCapabilities: [CapabilityRef]
Projectid: UUIDname: StringrootPath: URLlastScannedAt: Date?overrides: [CapabilityRef: CapabilityScopeOverride]
Auxiliary:
CapabilityKind:.skill,.plugin,.connector,.mcpServerCapabilityRef:{ kind: CapabilityKind, id: UUID }CapabilityScopeOverride:.inherit,.enabled,.disabled
To parse Claude plugin manifests (.claude-plugin/plugin.json), define:
PluginManifest(Codable):name: Stringdescription: Stringversion: String?tags: [String]?skills: [SkillEntry]?whereSkillEntry { name: String; path: String }.[web:38][web:48][web:52]
Optionally add other sections for agents, commands, hooks, mcpServers as the schema evolves.[web:38][web:52][web:54]
- Responsibilities:
- Holds in-memory maps for
skills,plugins,connectors,mcpServers,agents. - Holds global enabled/disabled state:
[CapabilityRef: Bool]. - Provides functions:
isGloballyEnabled(_ ref: CapabilityRef) -> BoolsetGlobal(_ ref: CapabilityRef, enabled: Bool)- lookups from
CapabilityRef→ concrete entity.
- Holds in-memory maps for
- Implementation:
@Observable(orObservableObject) class injected into environment for SwiftUI binding.
- Responsibilities:
- Manages
projects: [UUID: Project]. - Keeps
selectedProjectID. - API:
addOrUpdate(_ project: Project)setOverride(projectID, CapabilityRef, CapabilityScopeOverride)effectiveState(for projectID, CapabilityRef, global: Bool) -> Bool.
- Manages
- Responsibilities:
- Automatic and manual discovery of projects.
- Maintain list of “discovered” candidates separate from “managed” projects.
- Logic:
- Configurable scan roots (
[URL]) from user settings. - For each root:
- Enumerate child directories (shallow).
- Detect markers:
skills/*/SKILL.mdor.claude/skills/*/SKILL.md..claude-plugin/plugin.json..mcp.json.agents/folders.[web:48][web:52]
- Use “directory bubbling” from detected marker path up to repo root (nearest
.gitor top-level folder).
- Cache last scan times and markers per path.
- Configurable scan roots (
- Responsibilities:
- Fetch marketplace catalog(s) from configured endpoints.
- Expose
[MarketplaceItem]and loading/error state.
- Implementation:
- Simple Codable decode from JSON into
MarketplaceItem. - Items include at minimum
id,name,summary,tags,repoURL.
- Simple Codable decode from JSON into
- Responsibilities:
- Given a repo URL, download, unpack, and register plugin/skills/MCP servers.
- Steps:
- Compute ZIP download URL (e.g. GitHub
archive/refs/heads/main.zip). - Download to temporary file via
URLSession. - Unzip to
Application Support/<BundleID>/Packages/<random-or-slug>directory. - Search recursively for
.claude-plugin/plugin.json.[web:48][web:52] - Decode
PluginManifestusingJSONDecoder.[web:49][web:53] - Construct
Plugin+Skill+MCPServerentities and store them inRegistryStore.
- Compute ZIP download URL (e.g. GitHub
- Error handling:
- Provide user feedback (toast/alert) on failure to download, unzip, or parse manifest.
- Use a
PersistenceServicethat:- Serializes
RegistryStoreandProjectsStoremodels to JSON in Application Support. - Loads on app startup and writes on changes (with debounce).
- Serializes
- Files:
registry.json– includes skills/plugins/connectors/MCP/agents metadata and global state (but not secrets).projects.json– includes project records and overrides.
- Secrets (tokens) are stored separately in Keychain, referenced by identifiers from
ConnectororMCPServer.
- Use
NavigationSplitViewwith:- Sidebar:
SidebarItemenum with.projects,.global,.marketplace,.mcpServers. - Content:
Viewdepending on selected sidebar item:.projects→ProjectsListView.global→GlobalCapabilitiesListView.marketplace→MarketplaceView.mcpServers→MCPServersListView
- Detail:
CapabilityDetailViewfor selected capability.[web:39][web:50][web:57]
- Sidebar:
- Shows a flat list of all capabilities (skills, plugins, connectors, MCP).
- Each row:
- Name + type/tag.
- Global toggle bound to
RegistryStore.
- Selection drives detail view.
- ProjectsListView:
- Left column: list of projects with name and path.
- On selection: shows
ProjectDetailView.
- ProjectDetailView:
- Tabs for Skills / Plugins / Connectors / MCP.
- Each tab reuses list row components but:
- Displays effective state (computed from global + override).
- Shows indicator “Inherited” vs “Overridden”.
- Toggle writes to project overrides.
- Shows marketplace items (with filter by type/tags).
- “Install” button:
- Calls
PluginInstaller.install(fromGitHubRepo:). - On success, updates registry.
- Calls
- “Install from GitHub…”:
- Presents modal to paste a repo URL.
- Reuses same installer.
- MCPServersListView:
- List of MCP servers.
- Each row: label, URL, toggle global usage, connection status.
- Detail: edit fields, “Test connection” button.
- ConnectorsView:
- List of connectors with backing MCP servers and statuses.
- Specific per-project connector toggles can be shown in ProjectDetailView under Connectors tab.
- Scan roots: user-configured; default includes
~/Projectsand~/Developer. - Enumerate folders: shallow folder listing for each root; use heuristics to skip obviously irrelevant folders.
- Detect markers:
- Files:
SKILL.mdunder known pattern directories,.claude-plugin/plugin.json,.mcp.json.[web:48][web:52] - Folders:
agents/indicating presence of agents for a plugin.[web:52][web:54]
- Files:
- Determine project root:
- If marker path is
.../my-project/.claude-plugin/plugin.json, project root is.../my-project. - If marker path is
.../my-monorepo/packages/frontend/.claude/skills/..., walk up until.gitor top-level.
- If marker path is
- Record discovered project:
- Generate
Projectrecord with path, lastScannedAt, and list of markers found. - Show in “Discovered” section until user accepts it as a managed project.
- Generate
-
Define an internal type:
struct AgentSessionConfig: Codable { var agentID: UUID var projectID: UUID var skills: [SkillConfig] var tools: [ToolConfig] // connectors + MCP tools var systemPrompt: String } • To build for Claude Code: • Gather all enabled skills for project + agent, and concatenate SKILL.md instructions into systemPrompt or store as an array. • Convert enabled connectors and MCP servers into ToolConfig objects suitable for the downstream Claude client.web:38web:52web:54 • This object can later be used by a chat/editor integration layer.
- Security & privacy • All filesystem scanning is local; no paths or contents are sent externally. • SKILL.md / manifest contents are only parsed locally for UI display and configuration. • Tokens and secrets are stored in Keychain, not in JSON or logs. • UI clearly shows which connectors/MCP servers are active for each project and allows single-click revocation.
- Future extensions • Multi-agent UI: • Allow plugins to define agents via agents/ dirs and manifest entries.web:52web:54 • Let users choose different agents per project. • Richer marketplace: • Multiple catalogs, search, ratings. • IDE integration: • Export configuration into files consumed by other tools, or provide CLI.