Install any skill in seconds. Free to start, no credit card required.
Get Started Free →실제 프로덕션 애플리케이션을 기반으로 한 프로젝트별 스킬 템플릿 예시.
.claude/skills/loulanyue-project-guidelines-example/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 62% | 0% |
这是一个项目特定技能的示例。将其用作您自己项目的模板。
基于一个真实的生产应用程序:Zenith - 由 AI 驱动的客户发现平台。
在为其设计的特定项目上工作时,请参考此技能。项目技能包含:
技术栈:
服务:
┌─────────────────────────────────────────────────────────────┐
│ 前端 │
│ Next.js 15 + TypeScript + TailwindCSS │
│ 部署平台:Vercel / Cloud Run │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 后端 │
│ FastAPI + Python 3.11 + Pydantic │
│ 部署平台:Cloud Run │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Supabase │ │ Claude │ │ Redis │
│ 数据库 │ │ API │ │ 缓存 │
└──────────┘ └──────────┘ └──────────┘project/
├── frontend/
│ └── src/
│ ├── app/ # Next.js 应用路由页面
│ │ ├── api/ # API 路由
│ │ ├── (auth)/ # 受身份验证保护的路由
│ │ └── workspace/ # 主应用工作区
│ ├── components/ # React 组件
│ │ ├── ui/ # 基础 UI 组件
│ │ ├── forms/ # 表单组件
│ │ └── layouts/ # 布局组件
│ ├── hooks/ # 自定义 React 钩子
│ ├── lib/ # 工具库
│ ├── types/ # TypeScript 类型定义
│ └── config/ # 配置文件
│
├── backend/
│ ├── routers/ # FastAPI 路由处理器
│ ├── models.py # Pydantic 模型
│ ├── main.py # FastAPI 应用入口
│ ├── auth_system.py # 身份验证模块
│ ├── database.py # 数据库操作
│ ├── services/ # 业务逻辑层
│ └── tests/ # pytest 测试
│
├── deploy/ # 部署配置
├── docs/ # 文档
└── scripts/ # 工具脚本pythonfrom pydantic import BaseModel from typing import Generic, TypeVar, Optional T = TypeVar('T') class ApiResponse(BaseModel, Generic[T]): success: bool data: Optional[T] = None error: Optional[str] = None @classmethod def ok(cls, data: T) -> "ApiResponse[T]": return cls(success=True, data=data) @classmethod def fail(cls, error: str) -> "ApiResponse[T]": return cls(success=False, error=error)
typescriptinterface ApiResponse<T> { success: boolean data?: T error?: string } async function fetchApi<T>( endpoint: string, options?: RequestInit ): Promise<ApiResponse<T>> { try { const response = await fetch(`/api${endpoint}`, { ...options, headers: { 'Content-Type': 'application/json', ...options?.headers, }, }) if (!response.ok) { return { success: false, error: `HTTP ${response.status}` } } return await response.json() } catch (error) { return { success: false, error: String(error) } } }
pythonfrom anthropic import Anthropic from pydantic import BaseModel class AnalysisResult(BaseModel): summary: str key_points: list[str] confidence: float async def analyze_with_claude(content: str) -> AnalysisResult: client = Anthropic() response = client.messages.create( model="claude-sonnet-4-5-20250514", max_tokens=1024, messages=[{"role": "user", "content": content}], tools=[{ "name": "provide_analysis", "description": "Provide structured analysis", "input_schema": AnalysisResult.model_json_schema() }], tool_choice={"type": "tool", "name": "provide_analysis"} ) # Extract tool use result tool_use = next( block for block in response.content if block.type == "tool_use" ) return AnalysisResult(**tool_use.input)
typescriptimport { useState, useCallback } from 'react' interface UseApiState<T> { data: T | null loading: boolean error: string | null } export function useApi<T>( fetchFn: () => Promise<ApiResponse<T>> ) { const [state, setState] = useState<UseApiState<T>>({ data: null, loading: false, error: null, }) const execute = useCallback(async () => { setState(prev => ({ ...prev, loading: true, error: null })) const result = await fetchFn() if (result.success) { setState({ data: result.data!, loading: false, error: null }) } else { setState({ data: null, loading: false, error: result.error! }) } }, [fetchFn]) return { ...state, execute } }
bash# Run all tests poetry run pytest tests/ # Run with coverage poetry run pytest tests/ --cov=. --cov-report=html # Run specific test file poetry run pytest tests/test_auth.py -v
测试结构:
pythonimport pytest from httpx import AsyncClient from main import app @pytest.fixture async def client(): async with AsyncClient(app=app, base_url="http://test") as ac: yield ac @pytest.mark.asyncio async def test_health_check(client: AsyncClient): response = await client.get("/health") assert response.status_code == 200 assert response.json()["status"] == "healthy"
bash# Run tests npm run test # Run with coverage npm run test -- --coverage # Run E2E tests npm run test:e2e
测试结构:
typescriptimport { render, screen, fireEvent } from '@testing-library/react' import { WorkspacePanel } from './WorkspacePanel' describe('WorkspacePanel', () => { it('renders workspace correctly', () => { render(<WorkspacePanel />) expect(screen.getByRole('main')).toBeInTheDocument() }) it('handles session creation', async () => { render(<WorkspacePanel />) fireEvent.click(screen.getByText('New Session')) expect(await screen.findByText('Session created')).toBeInTheDocument() }) })
npm run build 成功 (前端)poetry run pytest 通过 (后端)bash# Build and deploy frontend cd frontend && npm run build gcloud run deploy frontend --source . # Build and deploy backend cd backend gcloud run deploy backend --source .
bash# Frontend (.env.local) NEXT_PUBLIC_API_URL=https://api.example.com NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... # Backend (.env) DATABASE_URL=postgresql://... ANTHROPIC_API_KEY=sk-ant-... SUPABASE_URL=https://xxx.supabase.co SUPABASE_KEY=eyJ...
coding-standards.md - 通用编码最佳实践backend-patterns.md - API 和数据库模式frontend-patterns.md - React 和 Next.js 模式tdd-workflow/ - 测试驱动开发方法论| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | pass→pass | 13,430 | 8,337 | -38% | 1 | 1 | 0% | 2,600 | 3,916 | +51% | 0 | 0 | — |
case-04 | pass→fail | 12,406 | 7,071 | -43% | 1 | 1 | 0% | 2,537 | 3,823 | +51% | 0 | 0 | — |
case-05 | pass→pass | 9,850 | 7,327 | -26% | 1 | 1 | 0% | 2,099 | 3,888 | +85% | 0 | 0 | — |
case-01 | fail→pass | 19,147 | 11,191 | -42% | 1 | 1 | 0% | 3,802 | 4,748 | +25% | 0 | 0 | — |
case-02 | fail→pass | 12,469 | 9,111 | -27% | 1 | 1 | 0% | 2,704 | 4,499 | +66% | 0 | 0 | — |
case-03 | fail→pass | 14,435 | 7,480 | -48% | 1 | 1 | 0% | 2,979 | 3,936 | +32% | 0 | 0 | — |
case-06 | pass→pass | 13,413 | 9,778 | -27% | 1 | 1 | 0% | 2,531 | 4,526 | +79% | 0 | 0 | — |
case-07 | pass→pass | 12,996 | 10,010 | -23% | 1 | 1 | 0% | 2,725 | 4,652 | +71% | 0 | 0 | — |
case-08 | pass→pass | 12,997 | 6,675 | -49% | 1 | 1 | 0% | 2,785 | 3,705 | +33% | 0 | 0 | — |
case-09 | fail→pass | 7,364 | 2,737 | -63% | 1 | 1 | 0% | 1,324 | 2,867 | +117% | 0 | 0 | — |
case-10 | pass→pass | 2,928 | 2,131 | -27% | 1 | 1 | 0% | 463 | 2,696 | +482% | 0 | 0 | — |
case-11 | pass→pass | 10,447 | 3,931 | -62% | 1 | 1 | 0% | 1,917 | 3,039 | +59% | 0 | 0 | — |
case-12 | pass→pass | 11,294 | 3,200 | -72% | 1 | 1 | 0% | 2,155 | 2,980 | +38% | 0 | 0 | — |
case-13 | fail→pass | 9,622 | 2,415 | -75% | 1 | 1 | 0% | 1,686 | 2,736 | +62% | 0 | 0 | — |
case-14 | pass→pass | 12,275 | 11,974 | -2% | 1 | 1 | 0% | 2,121 | 4,418 | +108% | 0 | 0 | — |
case-15 | pass→pass | 11,716 | 9,629 | -18% | 1 | 1 | 0% | 2,226 | 4,343 | +95% | 0 | 0 | — |
case-17 | fail→pass | 13,571 | 2,671 | -80% | 1 | 1 | 0% | 2,074 | 2,793 | +35% | 0 | 0 | — |
case-18 | fail→pass | 7,851 | 2,324 | -70% | 1 | 1 | 0% | 1,399 | 2,787 | +99% | 0 | 0 | — |
case-19 | pass→pass | 6,610 | 6,026 | -9% | 1 | 1 | 0% | 1,092 | 3,430 | +214% | 0 | 0 | — |
case-20 | pass→pass | 15,282 | 7,949 | -48% | 1 | 1 | 0% | 2,869 | 3,866 | +35% | 0 | 0 | — |
case-21 | pass→pass | 12,984 | 10,235 | -21% | 1 | 1 | 0% | 2,564 | 4,444 | +73% | 0 | 0 | — |
case-22 | pass→pass | 12,483 | 10,133 | -19% | 1 | 1 | 0% | 2,654 | 4,702 | +77% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.