Your AI agent skills, finally organized.
Download · Website · @Shpigford
One macOS app to discover, organize, and edit coding agent skills across Claude Code, Cursor, Codex, Windsurf, and Amp. Stop digging through dotfiles.
Features
- Multi-tool support — Claude Code, Cursor, Codex, Windsurf, Copilot, Aider, Amp
- Built-in editor — Monospaced editor with Cmd+S save, frontmatter parsing
- Collections — Organize skills without modifying source files
- Real-time file watching — FSEvents-based, instant updates on disk changes
- Full-text search — Search across name, description, and content
- Create new skills — Generates correct boilerplate per tool
- Remote skill servers — Connect to servers like OpenClaw to discover, browse, and install skills
Prerequisites
- macOS 15 (Sequoia) or later
- Xcode with command-line tools (
xcode-select --install) - Homebrew (brew.sh)
- xcodegen —
brew install xcodegen
Sparkle (auto-update framework) is the only external dependency and is pulled automatically by Xcode via Swift Package Manager. No manual setup needed.
Quick Start
git clone https://github.com/Shpigford/chops.git cd chops brew install xcodegen # skip if already installed xcodegen generate # generates Chops.xcodeproj from project.yml open Chops.xcodeproj # opens in Xcode
Then hit Cmd+R to build and run.
Note: The Xcode project is generated from
project.yml. If you changeproject.yml, re-runxcodegen generate. Don't edit the.xcodeprojdirectly.
CLI build (no Xcode GUI)
xcodebuild -scheme Chops -configuration Debug build
Project Structure
Chops/
├── App/
│ ├── ChopsApp.swift # @main entry — SwiftData ModelContainer + Sparkle
│ ├── AppState.swift # @Observable singleton — filters, selection, search
│ └── ContentView.swift # Three-column NavigationSplitView, kicks off scanning
├── Models/
│ ├── Skill.swift # @Model — a discovered skill file
│ ├── Collection.swift # @Model — user-created skill groupings
│ └── ToolSource.swift # Enum of supported tools, their paths and icons
├── Services/
│ ├── SkillScanner.swift # Probes tool directories, upserts skills into SwiftData
│ ├── SkillParser.swift # Dispatches to FrontmatterParser or MDCParser
│ ├── FileWatcher.swift # FSEvents listener, triggers re-scan on changes
│ └── SearchService.swift # In-memory full-text search
├── Utilities/
│ ├── FrontmatterParser.swift # Extracts YAML frontmatter from .md files
│ └── MDCParser.swift # Parses Cursor .mdc files
├── Views/
│ ├── Sidebar/ # Tool filters, collection list
│ ├── Detail/ # Skill editor, metadata display
│ ├── Settings/ # Preferences & update UI
│ └── Shared/ # Reusable components (ToolBadge, NewSkillSheet)
├── Resources/ # Asset catalog (tool icons, colors)
└── Chops.entitlements # Disables sandbox (intentional)
project.yml # xcodegen config — source of truth for Xcode project settings
scripts/ # Release pipeline (release.sh)
site/ # Marketing website (Astro 6)
Architecture
SwiftUI + SwiftData, native macOS with zero web views.
App lifecycle
ChopsAppinitializes a SwiftDataModelContainer(persistsSkillandSkillCollection)- Sparkle updater starts in the background
AppStateis created and injected into the SwiftUI environmentContentViewrenders and callsstartScanning()SkillScannerprobes all tool directories and upserts discovered skillsFileWatcherattaches FSEvents listeners — on any change, the scanner re-runs automatically
Key design decisions
- No sandbox. The app needs unrestricted filesystem access to read dotfiles across
~/. This is intentional and required for core functionality. The entitlements file explicitly disables the app sandbox. - Dedup via symlinks. Skills are uniquely identified by their resolved symlink path. If the same file is symlinked into multiple tool directories, it shows up as one skill with multiple tool badges.
- No test suite. Validate changes manually — build, run, trigger the feature you changed, observe the result.
State management
AppState is an @Observable class that holds all UI state: selected tool filter, selected skill, search text, sidebar filter mode. It's injected via @Environment and accessible from any view.
UI layout
Three-column NavigationSplitView:
- Sidebar — tool filters and collections
- List — filtered/searched skill list
- Detail — skill editor (wraps
NSTextViewfor native text editing with Cmd+S save)
Supported Tools
Chops scans these directories for skills:
| Tool | Global Paths |
|---|---|
| Claude Code | ~/.claude/skills/, ~/.agents/skills |
| Cursor | ~/.cursor/skills/, ~/.cursor/rules |
| Windsurf | ~/.codeium/windsurf/memories/, ~/.windsurf/rules |
| Codex | ~/.codex |
| Amp | ~/.config/amp |
Copilot and Aider are also supported but only detect project-level skills (no global paths). Custom paths can be added for any tool.
Tool definitions live in Chops/Models/ToolSource.swift — each enum case knows its display name, icon, color, and filesystem paths.
Common Dev Tasks
Add support for a new tool
- Add a new case to the
ToolSourceenum inChops/Models/ToolSource.swift - Fill in
displayName,iconName,color, andglobalPaths - Optionally add a logo to the asset catalog and return it from
logoAssetName - Update
SkillScannerif the new tool uses a non-standard file layout
Modify skill parsing
- Frontmatter (
.md) — editChops/Utilities/FrontmatterParser.swift - Cursor
.mdcfiles — editChops/Utilities/MDCParser.swift - Dispatch logic — edit
Chops/Services/SkillParser.swift(decides which parser to use)
Change the UI
Views are in Chops/Views/, organized by column (Sidebar, Detail) and shared components. The main layout is in Chops/App/ContentView.swift.
Testing
No automated test suite. Validate manually:
- Build and run the app (Cmd+R)
- Trigger the exact feature you changed
- Observe the result — check for correct behavior and error messages
- Test edge cases (empty states, missing directories, malformed files)
Website
The marketing site lives in site/ and is built with Astro.
cd site npm install # first time only npm run dev # local dev server npm run build # production build → site/dist/
AI Agent Setup
This repo includes a Claude Code skill at .claude/skills/setup.md that gives AI coding agents full context on the project — architecture, key files, and common tasks. If you're using Claude Code, it'll pick this up automatically.
License
MIT — see LICENSE.
