CC Workshop is a Tauri 2 desktop application for managing Claude Code Skills, MCP Servers, and CLAUDE.md configuration files. It provides a unified GUI to organize, import, export, and deploy these resources across projects.
- Platform: macOS only (minimum macOS 12.0)
- Identifier:
io.github.o0000-code.ensemble - Data directory:
~/.cc-workshop/(data.json, settings.json, skills/, mcps/, claude-md/)
Tauri 2 dual-process model: a Rust backend (core logic + filesystem) communicates with a React frontend (UI + state) via Tauri IPC commands.
CC Workshop2/
├── src/ # React frontend
│ ├── components/ # UI components (10 groups: common, layout, skills, mcps, ...)
│ ├── pages/ # Page components (12 pages)
│ ├── stores/ # Zustand state management (12 stores)
│ ├── types/ # TypeScript type definitions
│ └── utils/ # Helpers (tauri.ts, constants.ts, parseDescription.ts, text.ts)
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── commands/ # Tauri IPC commands (13 modules: skills, mcps, claude_md, ...)
│ │ ├── utils/ # Parser + path utilities
│ │ ├── types.rs # Shared data types (serde-serializable)
│ │ ├── lib.rs # Tauri app builder + command registration
│ │ └── main.rs # Entry point
│ └── Cargo.toml
├── docs/ # Project documentation
└── package.json
- Frontend calls Rust via
safeInvoke<T>(command, args)fromsrc/utils/tauri.ts safeInvokewraps@tauri-apps/api/coreinvokewith Tauri environment detection- Backend commands are annotated with
#[tauri::command]and registered inlib.rs
| Layer | Technology |
|---|---|
| Frontend | React 18 + TypeScript 5.9 |
| Styling | Tailwind CSS 4 (@tailwindcss/vite plugin) |
| State | Zustand 5 |
| Routing | react-router-dom 7 |
| Backend | Tauri 2.9 + Rust (edition 2021) |
| Build | Vite 6 (frontend) + Cargo (backend) |
| Icons | lucide-react |
- Node.js 20+ (
nvm use 20) - Rust stable (latest, via
rustup) - Tauri CLI:
cargo install tauri-cli
npm install # Frontend dependencies
cd src-tauri && cargo fetch # Rust dependenciesnpm run tauri dev # Start full app (frontend + backend, hot-reload)
npm run dev # Frontend-only dev server (port 1420)npm run tauri build # Build distributable macOS app
npm run build # Frontend-only build (tsc + vite build)npx tsc --noEmit && cd src-tauri && cargo test- Framework: Vitest + @testing-library/react + jsdom
- Run:
npm run test - Coverage:
npm run test:coverage - Full suite:
npm run test:all
- Run:
cd src-tauri && cargo test - Lint:
cd src-tauri && cargo clippy -- -D warnings - Format check:
cd src-tauri && cargo fmt --check
- After frontend changes:
npx tsc --noEmit && npm run test - After Rust changes:
cd src-tauri && cargo test && cargo clippy -- -D warnings - After both:
npx tsc --noEmit && npm run test && cd src-tauri && cargo test && cargo clippy -- -D warnings
- Path alias:
@/maps tosrc/(configured in tsconfig.json + vite.config.ts) - Components: Functional components + React Hooks only
- Styling: Tailwind CSS 4 utility classes (no CSS modules)
- Commits: Conventional Commits format (
type(scope): description) - Detailed docs: Maintained in
docs/directory
- For team or PR-based work, prefer independent branches; use Linear Issue's
gitBranchNamewhen available - Run post-change verification (see Testing section) before committing
- Create Linear Issue for new discoveries (label:
needs-triage)
- Format:
Fixes PER-{N}: {short description} - Reference the Linear Issue ID in the PR body
- Use Linear MCP to dynamically discover team and project information
- All issues MUST be assigned to the "CC Workshop" project (create it if it doesn't exist)
- All issues MUST include an "CC Workshop" label for proper routing (create it if it doesn't exist)
- Do NOT hardcode any Linear IDs — always resolve them dynamically via MCP tools
- Frontend types in
src/types/must stay in sync with Rust types insrc-tauri/src/types.rs - When modifying IPC command signatures, update both the Rust
#[tauri::command]handler and the correspondingsafeInvokecall on the frontend - Rust changes may require
cargo buildto verify compilation before running tests
- NEVER modify
tauri.conf.jsonsigning identity, version, or bundle configuration - NEVER modify
Cargo.lockdirectly (it is managed by Cargo) - NEVER force-push to
mainor delete protected branches - NEVER commit secrets, API keys, or credentials
- NEVER modify this
AGENTS.mdwithout explicit human approval