{"id":"d5901310-340d-44ea-a7c4-35be4c88c244","shortId":"cRrbK6","kind":"skill","title":"cc-skill-project-guidelines-example","tagline":"Project Guidelines Skill (Example)","description":"# Project Guidelines Skill (Example)\n\nThis is an example of a project-specific skill. Use this as a template for your own projects.\n\nBased on a real production application: [Zenith](https://zenith.chat) - AI-powered customer discovery platform.\n\n---\n\n## When to Use\nReference this skill when working on the specific project it's designed for. Project skills contain:\n- Architecture overview\n- File structure\n- Code patterns\n- Testing requirements\n- Deployment workflow\n\n---\n\n## Architecture Overview\n\n**Tech Stack:**\n- **Frontend**: Next.js 15 (App Router), TypeScript, React\n- **Backend**: FastAPI (Python), Pydantic models\n- **Database**: Supabase (PostgreSQL)\n- **AI**: Claude API with tool calling and structured output\n- **Deployment**: Google Cloud Run\n- **Testing**: Playwright (E2E), pytest (backend), React Testing Library\n\n**Services:**\n```\n┌─────────────────────────────────────────────────────────────┐\n│                         Frontend                            │\n│  Next.js 15 + TypeScript + TailwindCSS                     │\n│  Deployed: Vercel / Cloud Run                              │\n└─────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────┐\n│                         Backend                             │\n│  FastAPI + Python 3.11 + Pydantic                          │\n│  Deployed: Cloud Run                                       │\n└─────────────────────────────────────────────────────────────┘\n                              │\n              ┌───────────────┼───────────────┐\n              ▼               ▼               ▼\n        ┌──────────┐   ┌──────────┐   ┌──────────┐\n        │ Supabase │   │  Claude  │   │  Redis   │\n        │ Database │   │   API    │   │  Cache   │\n        └──────────┘   └──────────┘   └──────────┘\n```\n\n---\n\n## File Structure\n\n```\nproject/\n├── frontend/\n│   └── src/\n│       ├── app/              # Next.js app router pages\n│       │   ├── api/          # API routes\n│       │   ├── (auth)/       # Auth-protected routes\n│       │   └── workspace/    # Main app workspace\n│       ├── components/       # React components\n│       │   ├── ui/           # Base UI components\n│       │   ├── forms/        # Form components\n│       │   └── layouts/      # Layout components\n│       ├── hooks/            # Custom React hooks\n│       ├── lib/              # Utilities\n│       ├── types/            # TypeScript definitions\n│       └── config/           # Configuration\n│\n├── backend/\n│   ├── routers/              # FastAPI route handlers\n│   ├── models.py             # Pydantic models\n│   ├── main.py               # FastAPI app entry\n│   ├── auth_system.py        # Authentication\n│   ├── database.py           # Database operations\n│   ├── services/             # Business logic\n│   └── tests/                # pytest tests\n│\n├── deploy/                   # Deployment configs\n├── docs/                     # Documentation\n└── scripts/                  # Utility scripts\n```\n\n---\n\n## Code Patterns\n\n### API Response Format (FastAPI)\n\n```python\nfrom pydantic import BaseModel\nfrom typing import Generic, TypeVar, Optional\n\nT = TypeVar('T')\n\nclass ApiResponse(BaseModel, Generic[T]):\n    success: bool\n    data: Optional[T] = None\n    error: Optional[str] = None\n\n    @classmethod\n    def ok(cls, data: T) -> \"ApiResponse[T]\":\n        return cls(success=True, data=data)\n\n    @classmethod\n    def fail(cls, error: str) -> \"ApiResponse[T]\":\n        return cls(success=False, error=error)\n```\n\n### Frontend API Calls (TypeScript)\n\n```typescript\ninterface ApiResponse<T> {\n  success: boolean\n  data?: T\n  error?: string\n}\n\nasync function fetchApi<T>(\n  endpoint: string,\n  options?: RequestInit\n): Promise<ApiResponse<T>> {\n  try {\n    const response = await fetch(`/api${endpoint}`, {\n      ...options,\n      headers: {\n        'Content-Type': 'application/json',\n        ...options?.headers,\n      },\n    })\n\n    if (!response.ok) {\n      return { success: false, error: `HTTP ${response.status}` }\n    }\n\n    return await response.json()\n  } catch (error) {\n    return { success: false, error: String(error) }\n  }\n}\n```\n\n### Claude AI Integration (Structured Output)\n\n```python\nfrom anthropic import Anthropic\nfrom pydantic import BaseModel\n\nclass AnalysisResult(BaseModel):\n    summary: str\n    key_points: list[str]\n    confidence: float\n\nasync def analyze_with_claude(content: str) -> AnalysisResult:\n    client = Anthropic()\n\n    response = client.messages.create(\n        model=\"claude-sonnet-4-5-20250514\",\n        max_tokens=1024,\n        messages=[{\"role\": \"user\", \"content\": content}],\n        tools=[{\n            \"name\": \"provide_analysis\",\n            \"description\": \"Provide structured analysis\",\n            \"input_schema\": AnalysisResult.model_json_schema()\n        }],\n        tool_choice={\"type\": \"tool\", \"name\": \"provide_analysis\"}\n    )\n\n    # Extract tool use result\n    tool_use = next(\n        block for block in response.content\n        if block.type == \"tool_use\"\n    )\n\n    return AnalysisResult(**tool_use.input)\n```\n\n### Custom Hooks (React)\n\n```typescript\nimport { useState, useCallback } from 'react'\n\ninterface UseApiState<T> {\n  data: T | null\n  loading: boolean\n  error: string | null\n}\n\nexport function useApi<T>(\n  fetchFn: () => Promise<ApiResponse<T>>\n) {\n  const [state, setState] = useState<UseApiState<T>>({\n    data: null,\n    loading: false,\n    error: null,\n  })\n\n  const execute = useCallback(async () => {\n    setState(prev => ({ ...prev, loading: true, error: null }))\n\n    const result = await fetchFn()\n\n    if (result.success) {\n      setState({ data: result.data!, loading: false, error: null })\n    } else {\n      setState({ data: null, loading: false, error: result.error! })\n    }\n  }, [fetchFn])\n\n  return { ...state, execute }\n}\n```\n\n---\n\n## Testing Requirements\n\n### Backend (pytest)\n\n```bash\n# Run all tests\npoetry run pytest tests/\n\n# Run with coverage\npoetry run pytest tests/ --cov=. --cov-report=html\n\n# Run specific test file\npoetry run pytest tests/test_auth.py -v\n```\n\n**Test structure:**\n```python\nimport pytest\nfrom httpx import AsyncClient\nfrom main import app\n\n@pytest.fixture\nasync def client():\n    async with AsyncClient(app=app, base_url=\"http://test\") as ac:\n        yield ac\n\n@pytest.mark.asyncio\nasync def test_health_check(client: AsyncClient):\n    response = await client.get(\"/health\")\n    assert response.status_code == 200\n    assert response.json()[\"status\"] == \"healthy\"\n```\n\n### Frontend (React Testing Library)\n\n```bash\n# Run tests\nnpm run test\n\n# Run with coverage\nnpm run test -- --coverage\n\n# Run E2E tests\nnpm run test:e2e\n```\n\n**Test structure:**\n```typescript\nimport { render, screen, fireEvent } from '@testing-library/react'\nimport { WorkspacePanel } from './WorkspacePanel'\n\ndescribe('WorkspacePanel', () => {\n  it('renders workspace correctly', () => {\n    render(<WorkspacePanel />)\n    expect(screen.getByRole('main')).toBeInTheDocument()\n  })\n\n  it('handles session creation', async () => {\n    render(<WorkspacePanel />)\n    fireEvent.click(screen.getByText('New Session'))\n    expect(await screen.findByText('Session created')).toBeInTheDocument()\n  })\n})\n```\n\n---\n\n## Deployment Workflow\n\n### Pre-Deployment Checklist\n\n- [ ] All tests passing locally\n- [ ] `npm run build` succeeds (frontend)\n- [ ] `poetry run pytest` passes (backend)\n- [ ] No hardcoded secrets\n- [ ] Environment variables documented\n- [ ] Database migrations ready\n\n### Deployment Commands\n\n```bash\n# Build and deploy frontend\ncd frontend && npm run build\ngcloud run deploy frontend --source .\n\n# Build and deploy backend\ncd backend\ngcloud run deploy backend --source .\n```\n\n### Environment Variables\n\n```bash\n# Frontend (.env.local)\nNEXT_PUBLIC_API_URL=https://api.example.com\nNEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...\n\n# Backend (.env)\nDATABASE_URL=postgresql://...\nANTHROPIC_API_KEY=sk-ant-...\nSUPABASE_URL=https://xxx.supabase.co\nSUPABASE_KEY=eyJ...\n```\n\n---\n\n## Critical Rules\n\n1. **No emojis** in code, comments, or documentation\n2. **Immutability** - never mutate objects or arrays\n3. **TDD** - write tests before implementation\n4. **80% coverage** minimum\n5. **Many small files** - 200-400 lines typical, 800 max\n6. **No console.log** in production code\n7. **Proper error handling** with try/catch\n8. **Input validation** with Pydantic/Zod\n\n---\n\n## Related Skills\n\n- `coding-standards.md` - General coding best practices\n- `backend-patterns.md` - API and database patterns\n- `frontend-patterns.md` - React and Next.js patterns\n- `tdd-workflow/` - Test-driven development methodology\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["skill","project","guidelines","example","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents"],"capabilities":["skill","source-sickn33","skill-cc-skill-project-guidelines-example","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/cc-skill-project-guidelines-example","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34882 github stars · SKILL.md body (9,003 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T12:50:44.241Z","embedding":null,"createdAt":"2026-04-18T21:34:06.385Z","updatedAt":"2026-04-24T12:50:44.241Z","lastSeenAt":"2026-04-24T12:50:44.241Z","tsv":"'-20250514':380 '-400':775 '-5':379 '/api':308 '/health':573 '/react':617 '/workspacepanel':621 '1':745 '1024':383 '15':83,120 '2':753 '200':577,774 '3':760 '3.11':130 '4':378,766 '5':770 '6':780 '7':786 '8':792 '80':767 '800':778 'ac':559,561 'ai':43,96,338 'ai-pow':42 'analysi':392,396,408 'analysisresult':352,369,426 'analysisresult.model':399 'analyz':364 'anon':724 'ant':736 'anthrop':344,346,371,731 'api':98,139,151,152,220,282,713,732,805 'api.example.com':715 'apirespons':239,259,273,287,302,452 'app':84,146,148,161,197,545,553,554 'applic':39 'application/json':315 'architectur':67,77 'array':759 'ask':855 'assert':574,578 'async':294,362,467,547,550,563,637 'asynccli':541,552,569 'auth':154,156 'auth-protect':155 'auth_system.py':199 'authent':200 'await':306,327,477,571,644 'backend':88,113,127,187,502,668,698,700,704,727 'backend-patterns.md':804 'base':34,167,555 'basemodel':228,240,350,353 'bash':504,586,680,708 'best':802 'block':416,418 'block.type':422 'bool':244 'boolean':289,443 'boundari':863 'build':661,681,689,695 'busi':205 'cach':140 'call':101,283 'catch':329 'cc':2 'cc-skill-project-guidelines-exampl':1 'cd':685,699 'check':567 'checklist':654 'choic':403 'clarif':857 'class':238,351 'classmethod':253,267 'claud':97,136,337,366,376 'claude-sonnet':375 'clear':830 'client':370,549,568 'client.get':572 'client.messages.create':373 'cloud':107,125,133 'cls':256,262,270,276 'code':71,218,576,749,785,801 'coding-standards.md':799 'command':679 'comment':750 'compon':163,165,169,172,175 'confid':360 'config':185,212 'configur':186 'console.log':782 'const':304,453,464,475 'contain':66 'content':313,367,387,388 'content-typ':312 'correct':627 'cov':519,521 'cov-report':520 'coverag':514,594,598,768 'creat':647 'creation':636 'criteria':866 'critic':743 'custom':45,177,428 'data':245,257,265,266,290,439,458,482,490 'databas':93,138,202,675,729,807 'database.py':201 'def':254,268,363,548,564 'definit':184 'deploy':75,105,123,132,210,211,649,653,678,683,692,697,703 'describ':622,834 'descript':393 'design':62 'develop':820 'discoveri':46 'doc':213 'document':214,674,752 'driven':819 'e2e':111,600,605 'els':488 'emoji':747 'endpoint':297,309 'entri':198 'env':728 'env.local':710 'environ':672,706,846 'environment-specif':845 'error':249,271,279,280,292,323,330,334,336,444,462,473,486,494,788 'exampl':6,10,14,18 'execut':465,499 'expect':629,643 'expert':851 'export':447 'extract':409 'eyj':726,742 'fail':269 'fals':278,322,333,461,485,493 'fastapi':89,128,189,196,223 'fetch':307 'fetchapi':296 'fetchfn':450,478,496 'file':69,141,527,773 'fireev':612 'fireevent.click':639 'float':361 'form':170,171 'format':222 'frontend':81,118,144,281,582,663,684,686,693,709 'frontend-patterns.md':809 'function':295,448 'gcloud':690,701 'general':800 'generic':232,241 'googl':106 'guidelin':5,8,12 'handl':634,789 'handler':191 'hardcod':670 'header':311,317 'health':566 'healthi':581 'hook':176,179,429 'html':523 'http':324 'httpx':539 'immut':754 'implement':765 'import':227,231,345,349,432,536,540,544,609,618 'input':397,793,860 'integr':339 'interfac':286,437 'json':400 'key':356,725,733,741 'layout':173,174 'lib':180 'librari':116,585,616 'limit':822 'line':776 'list':358 'load':442,460,471,484,492 'local':658 'logic':206 'main':160,543,631 'main.py':195 'mani':771 'match':831 'max':381,779 'messag':384 'methodolog':821 'migrat':676 'minimum':769 'miss':868 'model':92,194,374 'models.py':192 'mutat':756 'name':390,406 'never':755 'new':641 'next':415,711,716,721 'next.js':82,119,147,812 'none':248,252 'npm':589,595,602,659,687 'null':441,446,459,463,474,487,491 'object':757 'ok':255 'oper':203 'option':234,246,250,299,310,316 'output':104,341,840 'overview':68,78 'page':150 'pass':657,667 'pattern':72,219,808,813 'permiss':861 'platform':47 'playwright':110 'poetri':508,515,528,664 'point':357 'postgresql':95 'power':44 'practic':803 'pre':652 'pre-deploy':651 'prev':469,470 'product':38,784 'project':4,7,11,22,33,59,64,143 'project-specif':21 'promis':301,451 'proper':787 'protect':157 'provid':391,394,407 'public':712,717,722 'pydant':91,131,193,226,348 'pydantic/zod':796 'pytest':112,208,503,510,517,530,537,666 'pytest.fixture':546 'pytest.mark.asyncio':562 'python':90,129,224,342,535 'react':87,114,164,178,430,436,583,810 'readi':677 'real':37 'redi':137 'refer':51 'relat':797 'render':610,625,628,638 'report':522 'requestinit':300 'requir':74,501,859 'respons':221,305,372,570 'response.content':420 'response.json':328,579 'response.ok':319 'response.status':325,575 'result':412,476 'result.data':483 'result.error':495 'result.success':480 'return':261,275,320,326,331,425,497 'review':852 'role':385 'rout':153,158,190 'router':85,149,188 'rule':744 'run':108,126,134,505,509,512,516,524,529,587,590,592,596,599,603,660,665,688,691,702 'safeti':862 'schema':398,401 'scope':833 'screen':611 'screen.findbytext':645 'screen.getbyrole':630 'screen.getbytext':640 'script':215,217 'secret':671 'servic':117,204 'session':635,642,646 'setstat':455,468,481,489 'sk':735 'sk-ant':734 'skill':3,9,13,24,53,65,798,825 'skill-cc-skill-project-guidelines-example' 'small':772 'sonnet':377 'sourc':694,705 'source-sickn33' 'specif':23,58,525,847 'src':145 'stack':80 'state':454,498 'status':580 'stop':853 'str':251,272,355,359,368 'string':293,298,335,445 'structur':70,103,142,340,395,534,607 'substitut':843 'succeed':662 'success':243,263,277,288,321,332,865 'summari':354 'supabas':94,135,718,723,737,740 'tailwindcss':122 'task':829 'tdd':761,815 'tdd-workflow':814 'tech':79 'templat':29 'test':73,109,115,207,209,500,507,511,518,526,533,557,565,584,588,591,597,601,604,606,615,656,763,818,849 'test-driven':817 'testing-librari':614 'tests/test_auth.py':531 'tobeinthedocu':632,648 'token':382 'tool':100,389,402,405,410,413,423 'tool_use.input':427 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':838 'tri':303 'true':264,472 'try/catch':791 'type':182,230,314,404 'typescript':86,121,183,284,285,431,608 'typevar':233,236 'typic':777 'ui':166,168 'url':556,714,719,730,738 'use':25,50,411,414,424,823 'useapi':449 'useapist':438,457 'usecallback':434,466 'user':386 'usest':433,456 'util':181,216 'v':532 'valid':794,848 'variabl':673,707 'vercel':124 'work':55 'workflow':76,650,816 'workspac':159,162,626 'workspacepanel':619,623 'write':762 'xxx.supabase.co':720,739 'yield':560 'zenith':40 'zenith.chat':41","prices":[{"id":"20422e0f-39ff-4f91-bf0c-c14254fb3ded","listingId":"d5901310-340d-44ea-a7c4-35be4c88c244","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:34:06.385Z"}],"sources":[{"listingId":"d5901310-340d-44ea-a7c4-35be4c88c244","source":"github","sourceId":"sickn33/antigravity-awesome-skills/cc-skill-project-guidelines-example","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/cc-skill-project-guidelines-example","isPrimary":false,"firstSeenAt":"2026-04-18T21:34:06.385Z","lastSeenAt":"2026-04-24T12:50:44.241Z"}],"details":{"listingId":"d5901310-340d-44ea-a7c4-35be4c88c244","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"cc-skill-project-guidelines-example","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34882,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"f77f340464c15b814ef0aedde1edd3b1c8e50e21","skill_md_path":"skills/cc-skill-project-guidelines-example/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/cc-skill-project-guidelines-example"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"cc-skill-project-guidelines-example","description":"Project Guidelines Skill (Example)"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/cc-skill-project-guidelines-example"},"updatedAt":"2026-04-24T12:50:44.241Z"}}