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.
- 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
- 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.
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 XcodeThen 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.
xcodebuild -scheme Chops -configuration Debug buildChops/
├── 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)
SwiftUI + SwiftData, native macOS with zero web views.
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
- 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.
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.
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)
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.
- 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
- Frontmatter (
.md) — editChops/Utilities/FrontmatterParser.swift - Cursor
.mdcfiles — editChops/Utilities/MDCParser.swift - Dispatch logic — edit
Chops/Services/SkillParser.swift(decides which parser to use)
Views are in Chops/Views/, organized by column (Sidebar, Detail) and shared components. The main layout is in Chops/App/ContentView.swift.
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)
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/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.
MIT — see LICENSE.
