Back to skills
SkillHub ClubShip Full StackFull Stack

project-guidelines-example

Project-specific skill template and example guidelines.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
0
Hot score
74
Updated
March 20, 2026
Overall rating
C0.0
Composite score
0.0
Best-practice grade
B81.2

Install command

npx @skill-hub/cli install anton-dovnar-cursor-project-guidelines-example

Repository

anton-dovnar/cursor

Skill path: skills/project-guidelines-example

Project-specific skill template and example guidelines.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: anton-dovnar.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install project-guidelines-example into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/anton-dovnar/cursor before adding project-guidelines-example to shared team environments
  • Use project-guidelines-example for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: project-guidelines-example
description: Project-specific skill template and example guidelines.
---

# Project Guidelines Skill (Example)

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

---

## 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:**
- **Client**: Nuxt, TypeScript, Vue
- **Backend**: Django (Python), Django Rest Framework
- **Database**: PostgreSQL
- **Testing**: Playwright (E2E), pytest (server)

**Services:**
```
┌─────────────────────────────────────────────────────────────┐
│                         Frontend                            │
│  Nuxt + TypeScript + TailwindCSS                            │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                         Backend                             │
│  Django + Python                                            │
└─────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┼───────────────┐
              ▼                               ▼
        ┌──────────┐                     ┌──────────┐
        │ Postgres │                     │  Redis   │
        │ Database │                     │  Cache   │
        └──────────┘                     └──────────┘
```

---

## File Structure

```
project/
├── client/
│   └── src/
│       ├── pages/                     # Nuxt pages (routing)
│       │   ├── auth/                  # Public auth pages (login, register)
│       │   └── workspace/             # Main app workspace pages
│       │
│       ├── server/                    # Nuxt server engine
│       │   └── api/                   # API routes (server/api/*)
│       │       ├── auth/              # Auth endpoints
│       │       └── workspace/         # Workspace endpoints
│       │
│       ├── middleware/                # Route middleware
│       │   ├── auth.global.ts
│       │   └── workspace.ts
│       │
│       ├── components/                # Auto‑imported Vue components
│       │   ├── ui/
│       │   ├── forms/
│       │   └── layouts/
│       │
│       ├── layouts/                   # Nuxt layouts
│       │   ├── default.vue
│       │   └── workspace.vue
│       │
│       ├── composables/               # Nuxt composables (hooks)
│       │   ├── useAuth.ts
│       │   ├── useWorkspace.ts
│       │   └── useApi.ts
│       │
│       ├── utils/                     # General utilities
│       │   ├── validation.ts
│       │   ├── formatters.ts
│       │   └── constants.ts
│       │
│       ├── types/                     # TypeScript definitions
│       │   ├── auth.d.ts
│       │   ├── workspace.d.ts
│       │   └── api.d.ts
│       │
│       ├── config/                    # App configuration
│       │   ├── env.ts
│       │   ├── api.ts
│       │   └── constants.ts
│       │
│       ├── plugins/                   # Nuxt plugins
│       │   ├── axios.ts
│       │   └── auth.client.ts
│       │
│       ├── assets/                    # Styles, images, fonts
│       │   ├── css/
│       │   └── images/
│       │
│       ├── public/                    # Static files
│       │   └── favicon.ico
│       │
│       └── app.vue                    # Root component
│
server/
├── config/                   # Django project package
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
│
├── app/                      # Main Django app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── views.py
│   ├── urls.py
│   ├── services/
│   │   └── __init__.py
│   ├── auth_system/
│   │   ├── __init__.py
│   │   ├── backends.py
│   │   └── utils.py
│   ├── database/
│   │   ├── __init__.py
│   │   └── queries.py
│   └── tests/
│       ├── __init__.py
│       └── test_basic.py
│
├── deploy/                   # Deployment configs
├── docs/                     # Documentation
└── scripts/                  # Utility scripts
```

---

## Code Patterns

### API Response Format (FastAPI)

```python
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)
```

### API Client (Python)

```python
from typing import TypeVar, Optional, Generic
import httpx
from pydantic import BaseModel

T = TypeVar('T')

class ApiResponse(BaseModel, Generic[T]):
    success: bool
    data: Optional[T] = None
    error: Optional[str] = None

class ApiClient:
    def __init__(self, base_url: str):
        self.base_url = base_url
        self.client = httpx.AsyncClient()

    async def fetch(
        self,
        endpoint: str,
        method: str = 'GET',
        **kwargs
    ) -> ApiResponse[T]:
        try:
            url = f'{self.base_url}{endpoint}'
            headers = {
                'Content-Type': 'application/json',
                **kwargs.pop('headers', {})
            }

            response = await self.client.request(
                method=method,
                url=url,
                headers=headers,
                **kwargs
            )

            response.raise_for_status()
            data = response.json()
            return ApiResponse(success=True, data=data)
        except httpx.HTTPStatusError as e:
            return ApiResponse(
                success=False,
                error=f'HTTP {e.response.status_code}'
            )
        except Exception as e:
            return ApiResponse(success=False, error=str(e))

    async def close(self):
        await self.client.aclose()
```

### Claude AI Integration (Structured Output)

```python
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)
```

### API State Manager (Python)

```python
from typing import TypeVar, Optional, Callable, Awaitable
from dataclasses import dataclass, replace
from enum import Enum

T = TypeVar('T')

class ApiState(Enum):
    IDLE = 'idle'
    LOADING = 'loading'
    SUCCESS = 'success'
    ERROR = 'error'

@dataclass(frozen=True)
class ApiStateManager:
    data: Optional[T] = None
    state: ApiState = ApiState.IDLE
    error: Optional[str] = None

    def set_loading(self) -> 'ApiStateManager':
        return replace(self, state=ApiState.LOADING, error=None)

    def set_success(self, data: T) -> 'ApiStateManager':
        return replace(
            self,
            data=data,
            state=ApiState.SUCCESS,
            error=None
        )

    def set_error(self, error: str) -> 'ApiStateManager':
        return replace(
            self,
            data=None,
            state=ApiState.ERROR,
            error=error
        )

class ApiExecutor:
    def __init__(self, fetch_fn: Callable[[], Awaitable[ApiResponse[T]]]):
        self.fetch_fn = fetch_fn
        self.state = ApiStateManager()

    async def execute(self) -> ApiStateManager:
        self.state = self.state.set_loading()

        result = await self.fetch_fn()

        if result.success:
            self.state = self.state.set_success(result.data)
        else:
            self.state = self.state.set_error(result.error or 'Unknown error')

        return self.state
```

---

## Testing Requirements

### Backend (pytest)

```bash
# Run all tests
uv run pytest tests/

# Run with coverage
uv run pytest tests/ --cov=. --cov-report=html

# Run specific test file
uv run pytest tests/test_auth.py -v
```

**Test structure:**
```python
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"
```

### Service Layer Tests (Python)

```bash
# Run tests
uv run pytest tests/

# Run with coverage
uv run pytest tests/ --cov=. --cov-report=html

# Run E2E tests
uv run pytest tests/e2e/
```

**Test structure:**
```python
import pytest
from unittest.mock import AsyncMock, patch
from app.services.workspace_service import WorkspaceService

@pytest.fixture
def workspace_service():
    return WorkspaceService()

def test_workspace_service_initialization(workspace_service):
    assert workspace_service is not None

@pytest.mark.asyncio
async def test_creates_session_successfully(workspace_service):
    with patch('app.services.workspace_service.create_session') as mock_create:
        mock_create.return_value = {'id': 'session-123', 'status': 'created'}

        result = await workspace_service.create_session('user-123')

        assert result['status'] == 'created'
        mock_create.assert_called_once_with('user-123')
```

---

## Deployment Workflow

### Pre-Deployment Checklist

- [ ] All tests passing locally
- [ ] `bun build` succeeds (client)
- [ ] `uv run pytest` passes (server)
- [ ] No hardcoded secrets
- [ ] Environment variables documented
- [ ] Database migrations ready

---

## Critical Rules

1. **No emojis** in code, comments, or documentation
2. **Immutability** - never mutate objects or arrays
3. **TDD** - write tests before implementation
4. **80% coverage** minimum
5. **Many small files** - 200-400 lines typical, 800 max
6. **No print** in production code
7. **Proper error handling** with try/catch
8. **Input validation** with Pydantic/Zod

---

## Related Skills

- `coding-standards.md` - General coding best practices
- `server-patterns.md` - API and database patterns
- `client-patterns.md` - React and Next.js patterns
- `tdd-workflow/` - Test-driven development methodology
project-guidelines-example | SkillHub