{"id":48085243,"url":"https://github.com/Shpigford/chops","last_synced_at":"2026-04-05T00:01:32.259Z","repository":{"id":345343214,"uuid":"1185528404","full_name":"Shpigford/chops","owner":"Shpigford","description":"Your AI agent skills, finally organized. A macOS app to browse, edit, and manage skills across Claude Code, Cursor, Codex, Windsurf, and Amp.","archived":false,"fork":false,"pushed_at":"2026-03-31T21:27:22.000Z","size":3906,"stargazers_count":1138,"open_issues_count":8,"forks_count":60,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-02T10:28:42.343Z","etag":null,"topics":["agents","ai","macos","skills","swiftui"],"latest_commit_sha":null,"homepage":"https://chops.md","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Shpigford.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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},"funding":{"github":["Shpigford"]}},"created_at":"2026-03-18T17:17:12.000Z","updated_at":"2026-04-02T10:14:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Shpigford/chops","commit_stats":null,"previous_names":["shpigford/chops"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/Shpigford/chops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shpigford%2Fchops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shpigford%2Fchops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shpigford%2Fchops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shpigford%2Fchops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Shpigford","download_url":"https://codeload.github.com/Shpigford/chops/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shpigford%2Fchops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31419549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["agents","ai","macos","skills","swiftui"],"created_at":"2026-04-04T15:14:13.317Z","updated_at":"2026-04-05T00:01:32.242Z","avatar_url":"https://github.com/Shpigford.png","language":"Swift","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"site/public/favicon.png\" width=\"128\" height=\"128\" alt=\"Chops icon\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eChops\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003eYour AI skills and agents, finally organized.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Shpigford/chops/releases/latest/download/Chops.dmg\"\u003eDownload\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://chops.md\"\u003eWebsite\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://x.com/Shpigford\"\u003e@Shpigford\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"site/public/screenshot.png\" width=\"720\" alt=\"Chops screenshot\" /\u003e\n\u003c/p\u003e\n\nOne macOS app to discover, organize, and edit coding agent skills and agents across Claude Code, Cursor, Codex, Windsurf, and Amp. Stop digging through dotfiles.\n\n## Features\n\n- **Multi-tool support** — Claude Code, Cursor, Codex, Windsurf, Copilot, Aider, Amp\n- **Skills + Agents** — Discovers both skills and agents from each tool's directories\n- **Built-in editor** — Monospaced editor with Cmd+S save, frontmatter parsing\n- **Collections** — Organize skills and agents without modifying source files\n- **Real-time file watching** — FSEvents-based, instant updates on disk changes\n- **Full-text search** — Search across name, description, and content\n- **Create new skills \u0026 agents** — Generates correct boilerplate per tool\n- **Remote servers** — Connect to servers running [OpenClaw](https://openclaw.ai), [Hermes](https://github.com/NousResearch/hermes-agent), or other layouts to discover, browse, and install skills\n\n## Prerequisites\n\n- **macOS 15** (Sequoia) or later\n- **Xcode** with command-line tools (`xcode-select --install`)\n- **Homebrew** ([brew.sh](https://brew.sh))\n- **xcodegen** — `brew install xcodegen`\n\nSparkle (auto-update framework) is the only external dependency and is pulled automatically by Xcode via Swift Package Manager. No manual setup needed.\n\n## Quick Start\n\n```bash\ngit clone https://github.com/Shpigford/chops.git\ncd chops\nbrew install xcodegen    # skip if already installed\nxcodegen generate        # generates Chops.xcodeproj from project.yml\nopen Chops.xcodeproj     # opens in Xcode\n```\n\nThen hit **Cmd+R** to build and run.\n\n\u003e **Note:** The Xcode project is generated from `project.yml`. If you change `project.yml`, re-run `xcodegen generate`. Don't edit the `.xcodeproj` directly.\n\n### CLI build (no Xcode GUI)\n\n```bash\nxcodebuild -scheme Chops -configuration Debug build\n```\n\n## Project Structure\n\n```\nChops/\n├── App/\n│   ├── ChopsApp.swift        # @main entry — SwiftData ModelContainer + Sparkle\n│   ├── AppState.swift         # @Observable singleton — filters, selection, search\n│   └── ContentView.swift      # Three-column NavigationSplitView, kicks off scanning\n├── Models/\n│   ├── Skill.swift            # @Model — a discovered skill or agent file\n│   ├── Collection.swift       # @Model — user-created skill groupings\n│   └── ToolSource.swift       # Enum of supported tools, their paths and icons\n├── Services/\n│   ├── SkillScanner.swift     # Probes tool directories, upserts skills into SwiftData\n│   ├── SkillParser.swift      # Dispatches to FrontmatterParser or MDCParser\n│   ├── FileWatcher.swift      # FSEvents listener, triggers re-scan on changes\n│   └── SearchService.swift    # In-memory full-text search\n├── Utilities/\n│   ├── FrontmatterParser.swift  # Extracts YAML frontmatter from .md files\n│   └── MDCParser.swift          # Parses Cursor .mdc files\n├── Views/\n│   ├── Sidebar/               # Tool filters, skills/agents lists, collections\n│   ├── Detail/                # Skill editor, metadata display\n│   ├── Settings/              # Preferences \u0026 update UI\n│   └── Shared/                # Reusable components (ToolBadge, NewSkillSheet)\n├── Resources/                 # Asset catalog (tool icons, colors)\n└── Chops.entitlements         # Disables sandbox (intentional)\n\nproject.yml          # xcodegen config — source of truth for Xcode project settings\nscripts/             # Release pipeline (release.sh)\nsite/                # Marketing website (Astro 6)\n```\n\n## Architecture\n\n**SwiftUI + SwiftData**, native macOS with zero web views.\n\n### App lifecycle\n\n1. `ChopsApp` initializes a SwiftData `ModelContainer` (persists `Skill` and `SkillCollection`)\n2. Sparkle updater starts in the background\n3. `AppState` is created and injected into the SwiftUI environment\n4. `ContentView` renders and calls `startScanning()`\n5. `SkillScanner` probes all tool directories and upserts discovered skills\n6. `FileWatcher` attaches FSEvents listeners — on any change, the scanner re-runs automatically\n\n### Key design decisions\n\n- **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.\n- **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.\n- **No test suite.** Validate changes manually — build, run, trigger the feature you changed, observe the result.\n\n### State management\n\n`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.\n\n### UI layout\n\nThree-column `NavigationSplitView`:\n- **Sidebar** — tool filters and collections\n- **List** — filtered/searched skill list\n- **Detail** — skill editor (wraps `NSTextView` for native text editing with Cmd+S save)\n\n## Supported Tools\n\nChops scans these directories for skills and agents:\n\n| Tool | Skills | Agents |\n|------|--------|--------|\n| Claude Code | `~/.claude/skills/` | `~/.claude/agents/` |\n| Cursor | `~/.cursor/skills/`, `~/.cursor/rules` | `~/.cursor/agents/` |\n| Windsurf | `~/.codeium/windsurf/memories/`, `~/.windsurf/rules` | — |\n| Codex | `~/.codex/skills/` | `~/.codex/agents/` |\n| Amp | `~/.config/amp/skills/` | — |\n| Global | `~/.agents/skills/` | — |\n\nCopilot and Aider are also supported but only detect project-level skills and agents (no global paths). Custom scan paths can be added for any tool.\n\nTool definitions live in `Chops/Models/ToolSource.swift` — each enum case knows its display name, icon, color, and filesystem paths.\n\n## Common Dev Tasks\n\n### Add support for a new tool\n\n1. Add a new case to the `ToolSource` enum in `Chops/Models/ToolSource.swift`\n2. Fill in `displayName`, `iconName`, `color`, and `globalPaths`\n3. Optionally add a logo to the asset catalog and return it from `logoAssetName`\n4. Update `SkillScanner` if the new tool uses a non-standard file layout\n\n### Modify skill parsing\n\n- **Frontmatter (`.md`)** — edit `Chops/Utilities/FrontmatterParser.swift`\n- **Cursor `.mdc` files** — edit `Chops/Utilities/MDCParser.swift`\n- **Dispatch logic** — edit `Chops/Services/SkillParser.swift` (decides which parser to use)\n\n### Change the UI\n\nViews are in `Chops/Views/`, organized by column (Sidebar, Detail) and shared components. The main layout is in `Chops/App/ContentView.swift`.\n\n## Testing\n\nNo automated test suite. Validate manually:\n\n1. Build and run the app (Cmd+R)\n2. Trigger the exact feature you changed\n3. Observe the result — check for correct behavior and error messages\n4. Test edge cases (empty states, missing directories, malformed files)\n\n## Website\n\nThe marketing site lives in `site/` and is built with [Astro](https://astro.build/).\n\n```bash\ncd site\nnpm install      # first time only\nnpm run dev      # local dev server\nnpm run build    # production build → site/dist/\n```\n\n## AI Agent Setup\n\nThis 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.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","funding_links":["https://github.com/sponsors/Shpigford"],"categories":["Companion Apps \u0026 GUIs","Code \u0026 Developer Tools","Swift"],"sub_categories":["Quick Setup with cc-safe-setup"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FShpigford%2Fchops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FShpigford%2Fchops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FShpigford%2Fchops/lists"}