{"id":50523047,"url":"https://github.com/tddworks/SkillsManager","last_synced_at":"2026-06-20T00:00:52.260Z","repository":{"id":332492266,"uuid":"1130142090","full_name":"tddworks/SkillsManager","owner":"tddworks","description":"A macOS application for discovering, browsing, and installing skills for AI coding assistants. Manage skills for Claude Code and Codex from GitHub repositories or your local filesystem.","archived":false,"fork":false,"pushed_at":"2026-05-26T13:03:45.000Z","size":5088,"stargazers_count":128,"open_issues_count":2,"forks_count":18,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T15:09:08.871Z","etag":null,"topics":["claude-code","codex","skills"],"latest_commit_sha":null,"homepage":"https://tddworks.github.io/SkillsManager/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tddworks.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-08T05:02:13.000Z","updated_at":"2026-05-26T13:03:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tddworks/SkillsManager","commit_stats":null,"previous_names":["tddworks/skillsmanager"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/tddworks/SkillsManager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tddworks%2FSkillsManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tddworks%2FSkillsManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tddworks%2FSkillsManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tddworks%2FSkillsManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tddworks","download_url":"https://codeload.github.com/tddworks/SkillsManager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tddworks%2FSkillsManager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34552295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","codex","skills"],"created_at":"2026-06-03T06:00:31.029Z","updated_at":"2026-06-20T00:00:52.254Z","avatar_url":"https://github.com/tddworks.png","language":"Swift","funding_links":[],"categories":["AI"],"sub_categories":[],"readme":"# Skills Manager\n\n[![Build](https://github.com/tddworks/SkillsManager/actions/workflows/build.yml/badge.svg)](https://github.com/tddworks/SkillsManager/actions/workflows/build.yml)\n[![Tests](https://github.com/tddworks/SkillsManager/actions/workflows/tests.yml/badge.svg)](https://github.com/tddworks/SkillsManager/actions/workflows/tests.yml)\n[![codecov](https://codecov.io/gh/tddworks/SkillsManager/graph/badge.svg)](https://codecov.io/gh/tddworks/SkillsManager)\n[![Swift 6.2](https://img.shields.io/badge/Swift-6.2-orange.svg)](https://swift.org)\n[![Platform](https://img.shields.io/badge/Platform-macOS%2015-blue.svg)](https://developer.apple.com)\n\nA macOS application for discovering, browsing, installing, and tagging skills for AI coding assistants. Manage skills for Claude Code and Codex from GitHub repositories or your local filesystem.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/skillmanager.png\" alt=\"Skills Manager\" width=\"700\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eBrowse, install, and tag skills for Claude Code and Codex\u003c/em\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Browse Remote Skills** - Discover skills from GitHub repositories like [anthropics/skills](https://github.com/anthropics/skills)\n- **Local Directory Support** - Add skills from any local directory via `file://` URLs\n- **View Installed Skills** - Filter by provider (Claude Code, Codex, or all)\n- **Multi-Repository Support** - Add and manage multiple GitHub skill catalogs\n- **Install to Multiple Providers** - Install skills to Claude Code and/or Codex\n- **Global Custom Tags** - Create tags to organize skills across all catalogs\n- **Tag-Based Filtering** - Filter skills by SKILL.md tags or your custom tags\n- **Markdown Rendering** - View skill documentation with full markdown support\n- **Split-Pane Editor** - Edit local skills with live markdown preview\n- **Uninstall / Unlink** - Unlink from a provider or fully uninstall\n- **Search** - Find skills by name, description, or tags\n- **Grid / List View** - Toggle between card grid and compact list views\n\n## Providers\n\n| Provider | Skills Path | Description |\n|----------|-------------|-------------|\n| Claude Code | `~/.claude/skills` | Anthropic's AI coding assistant |\n| Codex | `~/.codex/skills/public` | OpenAI's code generation tool |\n\n## Requirements\n\n- macOS 15+\n- Swift 6.0+\n\n## Installation\n\n### Download (Recommended)\n\nDownload the latest release from [GitHub Releases](https://github.com/tddworks/SkillsManager/releases/latest).\n\n### Build from Source\n\n```bash\ngit clone https://github.com/tddworks/SkillsManager.git\ncd SkillsManager\nswift build -c release\n```\n\n## Usage\n\nLaunch the app to browse available skills. The three-column layout shows:\n\n- **Sidebar** - Navigate between installed skills, provider filters, and remote catalogs\n- **Main Content** - Browse skills in grid or list view with tag-based filtering\n- **Detail Panel** - View skill info, manage tags, install/uninstall\n\n### Adding Catalogs\n\n1. Click \"+ Add Catalog\" in the sidebar footer\n2. Choose GitHub Repository or Local Directory\n3. Enter a URL (e.g., `https://github.com/anthropics/skills`) or browse for a folder\n4. Click \"Add Catalog\"\n\n### Tagging Skills\n\n1. Select a skill to open the detail panel\n2. In the Tags section, click \"+ add\" to create a new tag\n3. Tags are global labels - once created, they appear in the filter bar across all views\n4. Purple tags come from SKILL.md frontmatter; cyan tags are your custom tags\n\n## Development\n\n### Command Line (Swift Package Manager)\n\n```bash\n# Build the project\nswift build\n\n# Run all tests\nswift test\n\n# Run the app\nswift run SkillsManager\n```\n\n### Xcode (with SwiftUI Previews)\n\nThe project uses [Tuist](https://tuist.io) to generate Xcode projects with SwiftUI preview support.\n\n```bash\n# Install Tuist (if not installed)\nbrew install tuist\n\n# Generate Xcode project\ntuist generate\n\n# Open in Xcode\nopen SkillsManager.xcworkspace\n\n# Run tests via Tuist\ntuist test\n```\n\n## Architecture\n\n\u003e **Full documentation:** [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)\n\nSkills Manager uses a **layered architecture** with rich domain models and SwiftUI Atomic Design:\n\n```\nSkillLibrary (@Observable, coordinator)\n├── localCatalog: SkillsCatalog     ← Installed skills (claude + codex)\n├── remoteCatalogs: [SkillsCatalog] ← GitHub repos or local directories\n│   └── skills: [Skill]             ← Each catalog OWNS its skills\n└── skillTags: SkillTags            ← Global tag management aggregate\n```\n\n| Layer | Location | Purpose |\n|-------|----------|---------|\n| **Domain** | `Sources/Domain/` | Rich models (Skill, SkillsCatalog, SkillTags), protocols |\n| **Infrastructure** | `Sources/Infrastructure/` | Repositories, parsers, persistence |\n| **App** | `Sources/App/` | SwiftUI views (Atomic Design), coordinator, design tokens |\n\n### Key Design Decisions\n\n- **Rich Domain Models** - Behavior encapsulated in models (not anemic data)\n- **Domain Aggregates** - SkillTags is an @Observable aggregate managing the tags feature\n- **Tell-Don't-Ask** - Objects manage their own state; callers tell objects what to do\n- **Protocol-Based DI** - `@Mockable` protocols for testability\n- **Chicago School TDD** - Test state changes, not interactions\n- **No ViewModel Layer** - Views consume domain models directly\n- **SwiftUI Atomic Design** - Atoms, Molecules, Organisms, Pages\n- **Design Tokens** - DS enum mirrors prototype CSS for consistent dark theme\n\n## Project Structure\n\n```\nSkillsManager/\n├── Sources/\n│   ├── Domain/\n│   │   ├── Models/          # Skill, SkillsCatalog, SkillTags, Provider, SkillEditor\n│   │   └── Protocols/       # SkillRepository, UserTagRepository, SkillInstaller (@Mockable)\n│   ├── Infrastructure/\n│   │   ├── Repositories/    # MergedSkillRepository\n│   │   ├── Local/           # LocalSkillRepository, LocalDirectorySkillRepository\n│   │   ├── Git/             # ClonedRepoSkillRepository\n│   │   ├── Parser/          # SkillParser (YAML frontmatter)\n│   │   ├── Installer/       # FileSystemSkillInstaller\n│   │   └── UserDefaultsUserTagRepository.swift\n│   └── App/\n│       ├── SkillLibrary.swift   # @Observable coordinator\n│       ├── Theme/               # DesignTokens (DS enum)\n│       └── Views/\n│           ├── ContentView.swift     # 3-column root layout\n│           ├── Sidebar/              # SidebarView, SkillCardView, SkillRowView\n│           ├── Detail/               # SkillDetailView, SkillEditorView, MarkdownView\n│           ├── Atoms/                # TagChip, EditableTagsView, FlowLayout, etc.\n│           ├── Molecules/            # CategoryTabsBar, StatsBar, ProviderLinkCard\n│           └── Sheets/               # AddCatalogSheet, InstallSheet, UninstallSheet\n├── Tests/\n│   ├── DomainTests/         # SkillTests, SkillTagsTests, SkillEditorTests\n│   ├── AppTests/            # SkillLibraryTests, SkillLibraryUserTagTests\n│   └── InfrastructureTests/ # Parser, repository, installer tests\n├── Project.swift            # Tuist configuration\n└── Package.swift            # SPM configuration\n```\n\n## Release \u0026 Auto-Updates\n\nThe project includes CI/CD workflows and Sparkle integration for automatic updates.\n\n### Setup Sparkle Keys\n\nGenerate EdDSA keys for signing updates:\n\n```bash\n# Build first to get Sparkle tools\nswift build\n\n# Generate key pair\n./scripts/sparkle-setup.sh\n```\n\n### Required GitHub Secrets\n\n| Secret | Purpose |\n|--------|---------|\n| `APPLE_CERTIFICATE_P12` | Base64-encoded Developer ID certificate |\n| `APPLE_CERTIFICATE_PASSWORD` | Certificate password |\n| `APP_STORE_CONNECT_API_KEY_P8` | Base64-encoded App Store Connect API key |\n| `APP_STORE_CONNECT_KEY_ID` | API key ID |\n| `APP_STORE_CONNECT_ISSUER_ID` | Team issuer ID |\n| `SPARKLE_EDDSA_PRIVATE_KEY` | EdDSA private key for signing updates |\n| `CODECOV_TOKEN` | (Optional) Codecov upload token |\n\n### Creating a Release\n\nReleases are triggered by:\n- Pushing a version tag: `git tag v1.0.0 \u0026\u0026 git push --tags`\n- Manual workflow dispatch with version input\n\nThe release workflow will:\n1. Build universal binary (arm64 + x86_64)\n2. Sign with Developer ID\n3. Notarize with Apple\n4. Create DMG and ZIP artifacts\n5. Publish GitHub Release\n6. Update Sparkle appcast for auto-updates\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftddworks%2FSkillsManager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftddworks%2FSkillsManager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftddworks%2FSkillsManager/lists"}