project-guidelines-example

Example project-specific skill template based on a real production application.

INSTALLATION
npx skills add https://github.com/affaan-m/everything-claude-code --skill project-guidelines-example
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

Project Guidelines Skill (Example)

This is an example of a project-specific skill. Use this as a template for your own projects.

Based on a real production application: Zenith - AI-powered customer discovery platform.

When to Use

Reference this skill when working on the specific project it's designed for. Project skills contain:

  • Architecture overview
  • File structure
  • Code patterns
  • Testing requirements
  • Deployment workflow

Architecture Overview

Tech Stack:

  • Frontend: Next.js 15 (App Router), TypeScript, React
  • Backend: FastAPI (Python), Pydantic models
  • Database: Supabase (PostgreSQL)
  • AI: Claude API with tool calling and structured output
  • Deployment: Google Cloud Run
  • Testing: Playwright (E2E), pytest (backend), React Testing Library

Services:

┌─────────────────────────────────────────────────────────────┐

│                         Frontend                            │

│  Next.js 15 + TypeScript + TailwindCSS                     │

│  Deployed: Vercel / Cloud Run                              │

└─────────────────────────────────────────────────────────────┘

                              │

                              ▼

┌─────────────────────────────────────────────────────────────┐

│                         Backend                             │

│  FastAPI + Python 3.11 + Pydantic                          │

│  Deployed: Cloud Run                                       │

└─────────────────────────────────────────────────────────────┘

                              │

              ┌───────────────┼───────────────┐

              ▼               ▼               ▼

        ┌──────────┐   ┌──────────┐   ┌──────────┐

        │ Supabase │   │  Claude  │   │  Redis   │

        │ Database │   │   API    │   │  Cache   │

        └──────────┘   └──────────┘   └──────────┘

File Structure

project/

├── frontend/

│   └── src/

│       ├── app/              # Next.js app router pages

│       │   ├── api/          # API routes

│       │   ├── (auth)/       # Auth-protected routes

│       │   └── workspace/    # Main app workspace

│       ├── components/       # React components

│       │   ├── ui/           # Base UI components

│       │   ├── forms/        # Form components

│       │   └── layouts/      # Layout components

│       ├── hooks/            # Custom React hooks

│       ├── lib/              # Utilities

│       ├── types/            # TypeScript definitions

│       └── config/           # Configuration

│

├── backend/

│   ├── routers/              # FastAPI route handlers

│   ├── models.py             # Pydantic models

│   ├── main.py               # FastAPI app entry

│   ├── auth_system.py        # Authentication

│   ├── database.py           # Database operations

│   ├── services/             # Business logic

│   └── tests/                # pytest tests

│

├── deploy/                   # Deployment configs

├── docs/                     # Documentation

└── scripts/                  # Utility scripts

Code Patterns

API Response Format (FastAPI)

from 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)

Frontend API Calls (TypeScript)

interface 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) }

  }

}

Claude AI Integration (Structured Output)

from 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)

Custom Hooks (React)

import { 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 }

}

Testing Requirements

Backend (pytest)

# 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

Test structure:

import 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"

Frontend (React Testing Library)

# Run tests

npm run test

# Run with coverage

npm run test -- --coverage

# Run E2E tests

npm run test:e2e

Test structure:

import { 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()

  })

})

Deployment Workflow

Pre-Deployment Checklist

  • All tests passing locally
  • npm run build succeeds (frontend)
  • poetry run pytest passes (backend)
  • No hardcoded secrets
  • Environment variables documented
  • Database migrations ready

Deployment Commands

# Build and deploy frontend

cd frontend &#x26;&#x26; npm run build

gcloud run deploy frontend --source .

# Build and deploy backend

cd backend

gcloud run deploy backend --source .

Environment Variables

# 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...

Critical Rules

  • No emojis in code, comments, or documentation
  • Immutability - never mutate objects or arrays
  • TDD - write tests before implementation
  • 80% coverage minimum
  • Many small files - 200-400 lines typical, 800 max
  • No console.log in production code
  • Proper error handling with try/catch
  • Input validation with Pydantic/Zod

Related Skills

  • coding-standards.md - General coding best practices
  • backend-patterns.md - API and database patterns
  • frontend-patterns.md - React and Next.js patterns
  • tdd-workflow/ - Test-driven development methodology
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card