Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Project-specific skill template covering architecture, patterns, testing, and deployment guidance.
.claude/skills/affaan-m-project-guidelines-example/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 82% | 0% |
這是專案特定技能的範例。使用此作為你自己專案的範本。
基於真實生產應用程式:Zenith - AI 驅動的客戶探索平台。
在處理專案特定設計時參考此技能。專案技能包含:
技術堆疊:
服務:
┌─────────────────────────────────────────────────────────────┐
│ 前端 │
│ Next.js 15 + TypeScript + TailwindCSS │
│ 部署:Vercel / Cloud Run │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 後端 │
│ FastAPI + Python 3.11 + Pydantic │
│ 部署:Cloud Run │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Supabase │ │ Claude │ │ Redis │
│ Database │ │ API │ │ Cache │
└──────────┘ └──────────┘ └──────────┘project/
├── frontend/
│ └── src/
│ ├── app/ # Next.js app router 頁面
│ │ ├── api/ # API 路由
│ │ ├── (auth)/ # 需認證路由
│ │ └── workspace/ # 主應用程式工作區
│ ├── components/ # React 元件
│ │ ├── ui/ # 基礎 UI 元件
│ │ ├── forms/ # 表單元件
│ │ └── layouts/ # 版面配置元件
│ ├── hooks/ # 自訂 React hooks
│ ├── lib/ # 工具
│ ├── types/ # TypeScript 定義
│ └── config/ # 設定
│
├── backend/
│ ├── routers/ # FastAPI 路由處理器
│ ├── models.py # Pydantic 模型
│ ├── main.py # FastAPI app 進入點
│ ├── 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-5", 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"} ) # 提取工具使用結果 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# 執行所有測試 poetry run pytest tests/ # 執行帶覆蓋率的測試 poetry run pytest tests/ --cov=. --cov-report=html # 執行特定測試檔案 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# 執行測試 npm run test # 執行帶覆蓋率的測試 npm run test -- --coverage # 執行 E2E 測試 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# 建置和部署前端 cd frontend && npm run build gcloud run deploy frontend --source . # 建置和部署後端 cd backend gcloud run deploy backend --source .
bash# 前端(.env.local) NEXT_PUBLIC_API_URL=https://api.example.com NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... # 後端(.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-01 | fail→pass | 9,870 | 9,127 | -8% | 1 | 1 | 0% | 2,052 | 4,386 | +114% | 0 | 0 | — |
case-02 | fail→pass | 13,771 | 8,407 | -39% | 1 | 1 | 0% | 2,724 | 4,276 | +57% | 0 | 0 | — |
case-03 | fail→pass | 15,579 | 10,087 | -35% | 1 | 1 | 0% | 3,004 | 4,303 | +43% | 0 | 0 | — |
case-04 | fail→pass | 9,529 | 6,067 | -36% | 1 | 1 | 0% | 1,562 | 3,462 | +122% | 0 | 0 | — |
case-05 | fail→pass | 10,798 | 5,065 | -53% | 1 | 1 | 0% | 1,826 | 3,321 | +82% | 0 | 0 | — |
case-06 | fail→pass | 8,176 | 2,877 | -65% | 1 | 1 | 0% | 1,451 | 2,827 | +95% | 0 | 0 | — |
case-07 | pass→pass | 4,398 | 1,442 | -67% | 1 | 1 | 0% | 732 | 2,590 | +254% | 0 | 0 | — |
case-08 | fail→pass | 5,921 | 1,944 | -67% | 1 | 1 | 0% | 963 | 2,712 | +182% | 0 | 0 | — |
case-09 | fail→pass | 8,842 | 2,011 | -77% | 1 | 1 | 0% | 1,659 | 2,699 | +63% | 0 | 0 | — |
case-10 | fail→pass | 4,098 | 1,730 | -58% | 1 | 1 | 0% | 553 | 2,640 | +377% | 0 | 0 | — |
case-11 | fail→pass | 15,239 | 6,076 | -60% | 1 | 1 | 0% | 2,704 | 3,523 | +30% | 0 | 0 | — |
case-12 | fail→pass | 7,034 | 1,845 | -74% | 1 | 1 | 0% | 1,200 | 2,649 | +121% | 0 | 0 | — |
case-13 | fail→pass | 10,565 | 4,076 | -61% | 1 | 1 | 0% | 1,904 | 2,993 | +57% | 0 | 0 | — |
case-14 | fail→pass | 8,004 | 2,253 | -72% | 1 | 1 | 0% | 1,408 | 2,700 | +92% | 0 | 0 | — |
case-15 | pass→pass | 3,715 | 1,954 | -47% | 1 | 1 | 0% | 617 | 2,646 | +329% | 0 | 0 | — |
case-16 | fail→pass | 4,910 | 2,002 | -59% | 1 | 1 | 0% | 810 | 2,680 | +231% | 0 | 0 | — |
case-17 | fail→pass | 8,108 | 1,933 | -76% | 1 | 1 | 0% | 1,301 | 2,732 | +110% | 0 | 0 | — |
case-18 | pass→pass | 4,473 | 1,990 | -56% | 1 | 1 | 0% | 718 | 2,696 | +275% | 0 | 0 | — |
case-19 | fail→pass | 4,608 | 1,667 | -64% | 1 | 1 | 0% | 720 | 2,614 | +263% | 0 | 0 | — |
case-20 | pass→pass | 4,508 | 3,004 | -33% | 1 | 1 | 0% | 709 | 2,834 | +300% | 0 | 0 | — |
case-21 | pass→pass | 2,211 | 1,927 | -13% | 1 | 1 | 0% | 386 | 2,664 | +590% | 0 | 0 | — |
case-22 | pass→pass | 1,708 | 1,622 | -5% | 1 | 1 | 0% | 232 | 2,612 | +1026% | 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 +73 percentage points is the difference between those two pass rates over the 22 comparable cases.
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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/12/2026 | +55% |
Other measured skills in the registry, with their headline benchmark lift.