diff --git a/.cursor/skills/python-patterns/SKILL.md b/.cursor/skills/python-patterns/SKILL.md new file mode 100644 index 000000000..2d5c8a4f4 --- /dev/null +++ b/.cursor/skills/python-patterns/SKILL.md @@ -0,0 +1,441 @@ +--- +name: python-patterns +description: Python development principles and decision-making. Framework selection, async patterns, type hints, project structure. Teaches thinking, not copying. +allowed-tools: Read, Write, Edit, Glob, Grep +--- + +# Python Patterns + +> Python development principles and decision-making for 2025. +> **Learn to THINK, not memorize patterns.** + +--- + +## ⚠️ How to Use This Skill + +This skill teaches **decision-making principles**, not fixed code to copy. + +- ASK user for framework preference when unclear +- Choose async vs sync based on CONTEXT +- Don't default to same framework every time + +--- + +## 1. Framework Selection (2025) + +### Decision Tree + +``` +What are you building? +│ +├── API-first / Microservices +│ └── FastAPI (async, modern, fast) +│ +├── Full-stack web / CMS / Admin +│ └── Django (batteries-included) +│ +├── Simple / Script / Learning +│ └── Flask (minimal, flexible) +│ +├── AI/ML API serving +│ └── FastAPI (Pydantic, async, uvicorn) +│ +└── Background workers + └── Celery + any framework +``` + +### Comparison Principles + +| Factor | FastAPI | Django | Flask | +|--------|---------|--------|-------| +| **Best for** | APIs, microservices | Full-stack, CMS | Simple, learning | +| **Async** | Native | Django 5.0+ | Via extensions | +| **Admin** | Manual | Built-in | Via extensions | +| **ORM** | Choose your own | Django ORM | Choose your own | +| **Learning curve** | Low | Medium | Low | + +### Selection Questions to Ask: +1. Is this API-only or full-stack? +2. Need admin interface? +3. Team familiar with async? +4. Existing infrastructure? + +--- + +## 2. Async vs Sync Decision + +### When to Use Async + +``` +async def is better when: +├── I/O-bound operations (database, HTTP, file) +├── Many concurrent connections +├── Real-time features +├── Microservices communication +└── FastAPI/Starlette/Django ASGI + +def (sync) is better when: +├── CPU-bound operations +├── Simple scripts +├── Legacy codebase +├── Team unfamiliar with async +└── Blocking libraries (no async version) +``` + +### The Golden Rule + +``` +I/O-bound → async (waiting for external) +CPU-bound → sync + multiprocessing (computing) + +Don't: +├── Mix sync and async carelessly +├── Use sync libraries in async code +└── Force async for CPU work +``` + +### Async Library Selection + +| Need | Async Library | +|------|---------------| +| HTTP client | httpx | +| PostgreSQL | asyncpg | +| Redis | aioredis / redis-py async | +| File I/O | aiofiles | +| Database ORM | SQLAlchemy 2.0 async, Tortoise | + +--- + +## 3. Type Hints Strategy + +### When to Type + +``` +Always type: +├── Function parameters +├── Return types +├── Class attributes +├── Public APIs + +Can skip: +├── Local variables (let inference work) +├── One-off scripts +├── Tests (usually) +``` + +### Common Type Patterns + +```python +# These are patterns, understand them: + +# Optional → might be None +from typing import Optional +def find_user(id: int) -> Optional[User]: ... + +# Union → one of multiple types +def process(data: str | dict) -> None: ... + +# Generic collections +def get_items() -> list[Item]: ... +def get_mapping() -> dict[str, int]: ... + +# Callable +from typing import Callable +def apply(fn: Callable[[int], str]) -> str: ... +``` + +### Pydantic for Validation + +``` +When to use Pydantic: +├── API request/response models +├── Configuration/settings +├── Data validation +├── Serialization + +Benefits: +├── Runtime validation +├── Auto-generated JSON schema +├── Works with FastAPI natively +└── Clear error messages +``` + +--- + +## 4. Project Structure Principles + +### Structure Selection + +``` +Small project / Script: +├── main.py +├── utils.py +└── requirements.txt + +Medium API: +├── app/ +│ ├── __init__.py +│ ├── main.py +│ ├── models/ +│ ├── routes/ +│ ├── services/ +│ └── schemas/ +├── tests/ +└── pyproject.toml + +Large application: +├── src/ +│ └── myapp/ +│ ├── core/ +│ ├── api/ +│ ├── services/ +│ ├── models/ +│ └── ... +├── tests/ +└── pyproject.toml +``` + +### FastAPI Structure Principles + +``` +Organize by feature or layer: + +By layer: +├── routes/ (API endpoints) +├── services/ (business logic) +├── models/ (database models) +├── schemas/ (Pydantic models) +└── dependencies/ (shared deps) + +By feature: +├── users/ +│ ├── routes.py +│ ├── service.py +│ └── schemas.py +└── products/ + └── ... +``` + +--- + +## 5. Django Principles (2025) + +### Django Async (Django 5.0+) + +``` +Django supports async: +├── Async views +├── Async middleware +├── Async ORM (limited) +└── ASGI deployment + +When to use async in Django: +├── External API calls +├── WebSocket (Channels) +├── High-concurrency views +└── Background task triggering +``` + +### Django Best Practices + +``` +Model design: +├── Fat models, thin views +├── Use managers for common queries +├── Abstract base classes for shared fields + +Views: +├── Class-based for complex CRUD +├── Function-based for simple endpoints +├── Use viewsets with DRF + +Queries: +├── select_related() for FKs +├── prefetch_related() for M2M +├── Avoid N+1 queries +└── Use .only() for specific fields +``` + +--- + +## 6. FastAPI Principles + +### async def vs def in FastAPI + +``` +Use async def when: +├── Using async database drivers +├── Making async HTTP calls +├── I/O-bound operations +└── Want to handle concurrency + +Use def when: +├── Blocking operations +├── Sync database drivers +├── CPU-bound work +└── FastAPI runs in threadpool automatically +``` + +### Dependency Injection + +``` +Use dependencies for: +├── Database sessions +├── Current user / Auth +├── Configuration +├── Shared resources + +Benefits: +├── Testability (mock dependencies) +├── Clean separation +├── Automatic cleanup (yield) +``` + +### Pydantic v2 Integration + +```python +# FastAPI + Pydantic are tightly integrated: + +# Request validation +@app.post("/users") +async def create(user: UserCreate) -> UserResponse: + # user is already validated + ... + +# Response serialization +# Return type becomes response schema +``` + +--- + +## 7. Background Tasks + +### Selection Guide + +| Solution | Best For | +|----------|----------| +| **BackgroundTasks** | Simple, in-process tasks | +| **Celery** | Distributed, complex workflows | +| **ARQ** | Async, Redis-based | +| **RQ** | Simple Redis queue | +| **Dramatiq** | Actor-based, simpler than Celery | + +### When to Use Each + +``` +FastAPI BackgroundTasks: +├── Quick operations +├── No persistence needed +├── Fire-and-forget +└── Same process + +Celery/ARQ: +├── Long-running tasks +├── Need retry logic +├── Distributed workers +├── Persistent queue +└── Complex workflows +``` + +--- + +## 8. Error Handling Principles + +### Exception Strategy + +``` +In FastAPI: +├── Create custom exception classes +├── Register exception handlers +├── Return consistent error format +└── Log without exposing internals + +Pattern: +├── Raise domain exceptions in services +├── Catch and transform in handlers +└── Client gets clean error response +``` + +### Error Response Philosophy + +``` +Include: +├── Error code (programmatic) +├── Message (human readable) +├── Details (field-level when applicable) +└── NOT stack traces (security) +``` + +--- + +## 9. Testing Principles + +### Testing Strategy + +| Type | Purpose | Tools | +|------|---------|-------| +| **Unit** | Business logic | pytest | +| **Integration** | API endpoints | pytest + httpx/TestClient | +| **E2E** | Full workflows | pytest + DB | + +### Async Testing + +```python +# Use pytest-asyncio for async tests + +import pytest +from httpx import AsyncClient + +@pytest.mark.asyncio +async def test_endpoint(): + async with AsyncClient(app=app, base_url="http://test") as client: + response = await client.get("/users") + assert response.status_code == 200 +``` + +### Fixtures Strategy + +``` +Common fixtures: +├── db_session → Database connection +├── client → Test client +├── authenticated_user → User with token +└── sample_data → Test data setup +``` + +--- + +## 10. Decision Checklist + +Before implementing: + +- [ ] **Asked user about framework preference?** +- [ ] **Chosen framework for THIS context?** (not just default) +- [ ] **Decided async vs sync?** +- [ ] **Planned type hint strategy?** +- [ ] **Defined project structure?** +- [ ] **Planned error handling?** +- [ ] **Considered background tasks?** + +--- + +## 11. Anti-Patterns to Avoid + +### ❌ DON'T: +- Default to Django for simple APIs (FastAPI may be better) +- Use sync libraries in async code +- Skip type hints for public APIs +- Put business logic in routes/views +- Ignore N+1 queries +- Mix async and sync carelessly + +### ✅ DO: +- Choose framework based on context +- Ask about async requirements +- Use Pydantic for validation +- Separate concerns (routes → services → repos) +- Test critical paths + +--- + +> **Remember**: Python patterns are about decision-making for YOUR specific context. Don't copy code—think about what serves your application best. \ No newline at end of file diff --git a/.cursor/skills/python-patterns/metadata.json b/.cursor/skills/python-patterns/metadata.json new file mode 100644 index 000000000..19bb92824 --- /dev/null +++ b/.cursor/skills/python-patterns/metadata.json @@ -0,0 +1,26 @@ +{ + "name": "python-patterns", + "description": "Python development principles and decision-making. Framework selection, async patterns, type hints, project structure. Teaches thinking, not copying.", + "category": "development", + "canonical_category": "development", + "repository": "majiayu000/claude-skill-registry-data", + "repository_url": "https://github.com/majiayu000/claude-skill-registry-data", + "author": "majiayu000", + "author_avatar": "https://github.com/majiayu000.png", + "file_path": "data/antigravity-python-patterns/SKILL.md", + "source": "github_curated_repos", + "stars": 2, + "quality_score": 64, + "best_practices_score": 60, + "skill_level": 3, + "skill_level_label": "resources", + "has_scripts": true, + "has_extra_files": false, + "downloads": 0, + "content_hash": "4dd862e5d25189c938320851ba3a0fcc6155f88b67f3822aaa4d0fac7e2d4659", + "indexed_at": "2026-03-01T03:09:48.327Z", + "synced_at": "2026-03-01T06:21:10.361Z", + "omni_registry_url": "https://omni-skill-registry.omniroute.online/#/skill/1d2fb797167c0af9a8694048782c1c3aab4b64b5b33cd055e1e7b702ede3eeb5", + "install_command": "mkdir -p .claude/skills/python-patterns && curl -sL \"https://raw.githubusercontent.com/majiayu000/claude-skill-registry-data/main/data/antigravity-python-patterns/SKILL.md\" > .claude/skills/python-patterns/SKILL.md", + "raw_url": "https://raw.githubusercontent.com/majiayu000/claude-skill-registry-data/main/data/antigravity-python-patterns/SKILL.md" + } \ No newline at end of file diff --git a/.cursor/skills/shadcn/SKILL.md b/.cursor/skills/shadcn/SKILL.md new file mode 100644 index 000000000..022142ad5 --- /dev/null +++ b/.cursor/skills/shadcn/SKILL.md @@ -0,0 +1,240 @@ +--- +name: shadcn +description: Manages shadcn components and projects — adding, searching, fixing, debugging, styling, and composing UI. Provides project context, component docs, and usage examples. Applies when working with shadcn/ui, component registries, presets, --preset codes, or any project with a components.json file. Also triggers for "shadcn init", "create an app with --preset", or "switch to --preset". +user-invocable: false +--- + +# shadcn/ui + +A framework for building ui, components and design systems. Components are added as source code to the user's project via the CLI. + +> **IMPORTANT:** Run all CLI commands using the project's package runner: `npx shadcn@latest`, `pnpm dlx shadcn@latest`, or `bunx --bun shadcn@latest` — based on the project's `packageManager`. Examples below use `npx shadcn@latest` but substitute the correct runner for the project. + +## Current Project Context + +```json +!`npx shadcn@latest info --json 2>/dev/null || echo '{"error": "No shadcn project found. Run shadcn init first."}'` +``` + +The JSON above contains the project config and installed components. Use `npx shadcn@latest docs ` to get documentation and example URLs for any component. + +## Principles + +1. **Use existing components first.** Use `npx shadcn@latest search` to check registries before writing custom UI. Check community registries too. +2. **Compose, don't reinvent.** Settings page = Tabs + Card + form controls. Dashboard = Sidebar + Card + Chart + Table. +3. **Use built-in variants before custom styles.** `variant="outline"`, `size="sm"`, etc. +4. **Use semantic colors.** `bg-primary`, `text-muted-foreground` — never raw values like `bg-blue-500`. + +## Critical Rules + +These rules are **always enforced**. Each links to a file with Incorrect/Correct code pairs. + +### Styling & Tailwind → [styling.md](./rules/styling.md) + +- **`className` for layout, not styling.** Never override component colors or typography. +- **No `space-x-*` or `space-y-*`.** Use `flex` with `gap-*`. For vertical stacks, `flex flex-col gap-*`. +- **Use `size-*` when width and height are equal.** `size-10` not `w-10 h-10`. +- **Use `truncate` shorthand.** Not `overflow-hidden text-ellipsis whitespace-nowrap`. +- **No manual `dark:` color overrides.** Use semantic tokens (`bg-background`, `text-muted-foreground`). +- **Use `cn()` for conditional classes.** Don't write manual template literal ternaries. +- **No manual `z-index` on overlay components.** Dialog, Sheet, Popover, etc. handle their own stacking. + +### Forms & Inputs → [forms.md](./rules/forms.md) + +- **Forms use `FieldGroup` + `Field`.** Never use raw `div` with `space-y-*` or `grid gap-*` for form layout. +- **`InputGroup` uses `InputGroupInput`/`InputGroupTextarea`.** Never raw `Input`/`Textarea` inside `InputGroup`. +- **Buttons inside inputs use `InputGroup` + `InputGroupAddon`.** +- **Option sets (2–7 choices) use `ToggleGroup`.** Don't loop `Button` with manual active state. +- **`FieldSet` + `FieldLegend` for grouping related checkboxes/radios.** Don't use a `div` with a heading. +- **Field validation uses `data-invalid` + `aria-invalid`.** `data-invalid` on `Field`, `aria-invalid` on the control. For disabled: `data-disabled` on `Field`, `disabled` on the control. + +### Component Structure → [composition.md](./rules/composition.md) + +- **Items always inside their Group.** `SelectItem` → `SelectGroup`. `DropdownMenuItem` → `DropdownMenuGroup`. `CommandItem` → `CommandGroup`. +- **Use `asChild` (radix) or `render` (base) for custom triggers.** Check `base` field from `npx shadcn@latest info`. → [base-vs-radix.md](./rules/base-vs-radix.md) +- **Dialog, Sheet, and Drawer always need a Title.** `DialogTitle`, `SheetTitle`, `DrawerTitle` required for accessibility. Use `className="sr-only"` if visually hidden. +- **Use full Card composition.** `CardHeader`/`CardTitle`/`CardDescription`/`CardContent`/`CardFooter`. Don't dump everything in `CardContent`. +- **Button has no `isPending`/`isLoading`.** Compose with `Spinner` + `data-icon` + `disabled`. +- **`TabsTrigger` must be inside `TabsList`.** Never render triggers directly in `Tabs`. +- **`Avatar` always needs `AvatarFallback`.** For when the image fails to load. + +### Use Components, Not Custom Markup → [composition.md](./rules/composition.md) + +- **Use existing components before custom markup.** Check if a component exists before writing a styled `div`. +- **Callouts use `Alert`.** Don't build custom styled divs. +- **Empty states use `Empty`.** Don't build custom empty state markup. +- **Toast via `sonner`.** Use `toast()` from `sonner`. +- **Use `Separator`** instead of `
` or `
`. +- **Use `Skeleton`** for loading placeholders. No custom `animate-pulse` divs. +- **Use `Badge`** instead of custom styled spans. + +### Icons → [icons.md](./rules/icons.md) + +- **Icons in `Button` use `data-icon`.** `data-icon="inline-start"` or `data-icon="inline-end"` on the icon. +- **No sizing classes on icons inside components.** Components handle icon sizing via CSS. No `size-4` or `w-4 h-4`. +- **Pass icons as objects, not string keys.** `icon={CheckIcon}`, not a string lookup. + +### CLI + +- **Never decode or fetch preset codes manually.** Pass them directly to `npx shadcn@latest init --preset `. + +## Key Patterns + +These are the most common patterns that differentiate correct shadcn/ui code. For edge cases, see the linked rule files above. + +```tsx +// Form layout: FieldGroup + Field, not div + Label. + + + Email + + + + +// Validation: data-invalid on Field, aria-invalid on the control. + + Email + + Invalid email. + + +// Icons in buttons: data-icon, no sizing classes. + + +// Spacing: gap-*, not space-y-*. +
// correct +
// wrong + +// Equal dimensions: size-*, not w-* h-*. + // correct + // wrong + +// Status colors: Badge variants or semantic tokens, not raw colors. ++20.1% // correct ++20.1% // wrong +``` + +## Component Selection + +| Need | Use | +| -------------------------- | --------------------------------------------------------------------------------------------------- | +| Button/action | `Button` with appropriate variant | +| Form inputs | `Input`, `Select`, `Combobox`, `Switch`, `Checkbox`, `RadioGroup`, `Textarea`, `InputOTP`, `Slider` | +| Toggle between 2–5 options | `ToggleGroup` + `ToggleGroupItem` | +| Data display | `Table`, `Card`, `Badge`, `Avatar` | +| Navigation | `Sidebar`, `NavigationMenu`, `Breadcrumb`, `Tabs`, `Pagination` | +| Overlays | `Dialog` (modal), `Sheet` (side panel), `Drawer` (bottom sheet), `AlertDialog` (confirmation) | +| Feedback | `sonner` (toast), `Alert`, `Progress`, `Skeleton`, `Spinner` | +| Command palette | `Command` inside `Dialog` | +| Charts | `Chart` (wraps Recharts) | +| Layout | `Card`, `Separator`, `Resizable`, `ScrollArea`, `Accordion`, `Collapsible` | +| Empty states | `Empty` | +| Menus | `DropdownMenu`, `ContextMenu`, `Menubar` | +| Tooltips/info | `Tooltip`, `HoverCard`, `Popover` | + +## Key Fields + +The injected project context contains these key fields: + +- **`aliases`** → use the actual alias prefix for imports (e.g. `@/`, `~/`), never hardcode. +- **`isRSC`** → when `true`, components using `useState`, `useEffect`, event handlers, or browser APIs need `"use client"` at the top of the file. Always reference this field when advising on the directive. +- **`tailwindVersion`** → `"v4"` uses `@theme inline` blocks; `"v3"` uses `tailwind.config.js`. +- **`tailwindCssFile`** → the global CSS file where custom CSS variables are defined. Always edit this file, never create a new one. +- **`style`** → component visual treatment (e.g. `nova`, `vega`). +- **`base`** → primitive library (`radix` or `base`). Affects component APIs and available props. +- **`iconLibrary`** → determines icon imports. Use `lucide-react` for `lucide`, `@tabler/icons-react` for `tabler`, etc. Never assume `lucide-react`. +- **`resolvedPaths`** → exact file-system destinations for components, utils, hooks, etc. +- **`framework`** → routing and file conventions (e.g. Next.js App Router vs Vite SPA). +- **`packageManager`** → use this for any non-shadcn dependency installs (e.g. `pnpm add date-fns` vs `npm install date-fns`). + +See [cli.md — `info` command](./cli.md) for the full field reference. + +## Component Docs, Examples, and Usage + +Run `npx shadcn@latest docs ` to get the URLs for a component's documentation, examples, and API reference. Fetch these URLs to get the actual content. + +```bash +npx shadcn@latest docs button dialog select +``` + +**When creating, fixing, debugging, or using a component, always run `npx shadcn@latest docs` and fetch the URLs first.** This ensures you're working with the correct API and usage patterns rather than guessing. + +## Workflow + +1. **Get project context** — already injected above. Run `npx shadcn@latest info` again if you need to refresh. +2. **Check installed components first** — before running `add`, always check the `components` list from project context or list the `resolvedPaths.ui` directory. Don't import components that haven't been added, and don't re-add ones already installed. +3. **Find components** — `npx shadcn@latest search`. +4. **Get docs and examples** — run `npx shadcn@latest docs ` to get URLs, then fetch them. Use `npx shadcn@latest view` to browse registry items you haven't installed. To preview changes to installed components, use `npx shadcn@latest add --diff`. +5. **Install or update** — `npx shadcn@latest add`. When updating existing components, use `--dry-run` and `--diff` to preview changes first (see [Updating Components](#updating-components) below). +6. **Fix imports in third-party components** — After adding components from community registries (e.g. `@bundui`, `@magicui`), check the added non-UI files for hardcoded import paths like `@/components/ui/...`. These won't match the project's actual aliases. Use `npx shadcn@latest info` to get the correct `ui` alias (e.g. `@workspace/ui/components`) and rewrite the imports accordingly. The CLI rewrites imports for its own UI files, but third-party registry components may use default paths that don't match the project. +7. **Review added components** — After adding a component or block from any registry, **always read the added files and verify they are correct**. Check for missing sub-components (e.g. `SelectItem` without `SelectGroup`), missing imports, incorrect composition, or violations of the [Critical Rules](#critical-rules). Also replace any icon imports with the project's `iconLibrary` from the project context (e.g. if the registry item uses `lucide-react` but the project uses `hugeicons`, swap the imports and icon names accordingly). Fix all issues before moving on. +8. **Registry must be explicit** — When the user asks to add a block or component, **do not guess the registry**. If no registry is specified (e.g. user says "add a login block" without specifying `@shadcn`, `@tailark`, etc.), ask which registry to use. Never default to a registry on behalf of the user. +9. **Switching presets** — Ask the user first: **reinstall**, **merge**, or **skip**? + - **Reinstall**: `npx shadcn@latest init --preset --force --reinstall`. Overwrites all components. + - **Merge**: `npx shadcn@latest init --preset --force --no-reinstall`, then run `npx shadcn@latest info` to list installed components, then for each installed component use `--dry-run` and `--diff` to [smart merge](#updating-components) it individually. + - **Skip**: `npx shadcn@latest init --preset --force --no-reinstall`. Only updates config and CSS, leaves components as-is. + +## Updating Components + +When the user asks to update a component from upstream while keeping their local changes, use `--dry-run` and `--diff` to intelligently merge. **NEVER fetch raw files from GitHub manually — always use the CLI.** + +1. Run `npx shadcn@latest add --dry-run` to see all files that would be affected. +2. For each file, run `npx shadcn@latest add --diff ` to see what changed upstream vs local. +3. Decide per file based on the diff: + - No local changes → safe to overwrite. + - Has local changes → read the local file, analyze the diff, and apply upstream updates while preserving local modifications. + - User says "just update everything" → use `--overwrite`, but confirm first. +4. **Never use `--overwrite` without the user's explicit approval.** + +## Quick Reference + +```bash +# Create a new project. +npx shadcn@latest init --name my-app --preset base-nova +npx shadcn@latest init --name my-app --preset a2r6bw --template vite + +# Create a monorepo project. +npx shadcn@latest init --name my-app --preset base-nova --monorepo +npx shadcn@latest init --name my-app --preset base-nova --template next --monorepo + +# Initialize existing project. +npx shadcn@latest init --preset base-nova +npx shadcn@latest init --defaults # shortcut: --template=next --preset=base-nova + +# Add components. +npx shadcn@latest add button card dialog +npx shadcn@latest add @magicui/shimmer-button +npx shadcn@latest add --all + +# Preview changes before adding/updating. +npx shadcn@latest add button --dry-run +npx shadcn@latest add button --diff button.tsx +npx shadcn@latest add @acme/form --view button.tsx + +# Search registries. +npx shadcn@latest search @shadcn -q "sidebar" +npx shadcn@latest search @tailark -q "stats" + +# Get component docs and example URLs. +npx shadcn@latest docs button dialog select + +# View registry item details (for items not yet installed). +npx shadcn@latest view @shadcn/button +``` + +**Named presets:** `base-nova`, `radix-nova` +**Templates:** `next`, `vite`, `start`, `react-router`, `astro` (all support `--monorepo`) and `laravel` (not supported for monorepo) +**Preset codes:** Base62 strings starting with `a` (e.g. `a2r6bw`), from [ui.shadcn.com](https://ui.shadcn.com). + +## Detailed References + +- [rules/forms.md](./rules/forms.md) — FieldGroup, Field, InputGroup, ToggleGroup, FieldSet, validation states +- [rules/composition.md](./rules/composition.md) — Groups, overlays, Card, Tabs, Avatar, Alert, Empty, Toast, Separator, Skeleton, Badge, Button loading +- [rules/icons.md](./rules/icons.md) — data-icon, icon sizing, passing icons as objects +- [rules/styling.md](./rules/styling.md) — Semantic colors, variants, className, spacing, size, truncate, dark mode, cn(), z-index +- [rules/base-vs-radix.md](./rules/base-vs-radix.md) — asChild vs render, Select, ToggleGroup, Slider, Accordion +- [cli.md](./cli.md) — Commands, flags, presets, templates +- [customization.md](./customization.md) — Theming, CSS variables, extending components diff --git a/.cursor/skills/shadcn/agents/openai.yml b/.cursor/skills/shadcn/agents/openai.yml new file mode 100644 index 000000000..ab636da86 --- /dev/null +++ b/.cursor/skills/shadcn/agents/openai.yml @@ -0,0 +1,5 @@ +interface: + display_name: "shadcn/ui" + short_description: "Manages shadcn/ui components — adding, searching, fixing, debugging, styling, and composing UI." + icon_small: "./assets/shadcn-small.png" + icon_large: "./assets/shadcn.png" diff --git a/.cursor/skills/shadcn/assets/shadcn-small.png b/.cursor/skills/shadcn/assets/shadcn-small.png new file mode 100644 index 000000000..547154b97 Binary files /dev/null and b/.cursor/skills/shadcn/assets/shadcn-small.png differ diff --git a/.cursor/skills/shadcn/assets/shadcn.png b/.cursor/skills/shadcn/assets/shadcn.png new file mode 100644 index 000000000..b7b6814ac Binary files /dev/null and b/.cursor/skills/shadcn/assets/shadcn.png differ diff --git a/.cursor/skills/shadcn/cli.md b/.cursor/skills/shadcn/cli.md new file mode 100644 index 000000000..32124036d --- /dev/null +++ b/.cursor/skills/shadcn/cli.md @@ -0,0 +1,255 @@ +# shadcn CLI Reference + +Configuration is read from `components.json`. + +> **IMPORTANT:** Always run commands using the project's package runner: `npx shadcn@latest`, `pnpm dlx shadcn@latest`, or `bunx --bun shadcn@latest`. Check `packageManager` from project context to choose the right one. Examples below use `npx shadcn@latest` but substitute the correct runner for the project. + +> **IMPORTANT:** Only use the flags documented below. Do not invent or guess flags — if a flag isn't listed here, it doesn't exist. The CLI auto-detects the package manager from the project's lockfile; there is no `--package-manager` flag. + +## Contents + +- Commands: init, add (dry-run, smart merge), search, view, docs, info, build +- Templates: next, vite, start, react-router, astro +- Presets: named, code, URL formats and fields +- Switching presets + +--- + +## Commands + +### `init` — Initialize or create a project + +```bash +npx shadcn@latest init [components...] [options] +``` + +Initializes shadcn/ui in an existing project or creates a new project (when `--name` is provided). Optionally installs components in the same step. + +| Flag | Short | Description | Default | +| ----------------------- | ----- | --------------------------------------------------------- | ------- | +| `--template