Перейти к содержимому
NEWЧат с 15 ИИ-моделями — попробуйте бесплатно / имейте совесть, когда будете делиться или копировать
>AISTUDY_

Модуль 2.6 · Урок 3

Урок 3: CLAUDE.md — специфика для Claude

Практика
2.6 / Урок 3 из 5

Чему вы научитесь

  • Отличие CLAUDE.md от AGENTS.md и когда использовать каждый
  • Оптимальный размер и структуру CLAUDE.md
  • Как работает иерархия CLAUDE.md файлов (корень, поддиректории, глобальный)
  • Стратегию итеративного улучшения на основе ошибок агента

CLAUDE.md vs AGENTS.md

ПараметрAGENTS.mdCLAUDE.md
СтандартLinux Foundation (универсальный)Anthropic (специфично для Claude)
ИнструментВсе CLI, IDEClaude Code, Claude Projects
Размер300-500 строк<300 строк (оптимально)
АудиторияВсе разработчики + AIТолько Claude Code пользователи
ФокусПолная документация проектаИнструкции именно для Claude
ИспользованиеХранилище знанийБыстрые инструкции для текущей задачи
Частота обновленияРедко (когда меняется проект)Часто (добавляем правила по итерациям)

Когда что использовать?

graph TD
    A["У тебя есть проект"] --> B{Есть много<br/>разработчиков?}

    B -->|ДА| C["AGENTS.md"]
    C --> C1["Один файл<br/>для всей команды"]
    C --> C2["Используется<br/>IDE, Copilot,<br/>другими инструментами"]

    B -->|НЕТ| D{Основной<br/>инструмент Claude?}

    D -->|ДА| E["CLAUDE.md"]
    E --> E1["До 300 строк<br/>Быстро читается"]
    E --> E2["Итеративно<br/>улучшается"]

    D -->|НЕТ| F["Можно оба<br/>или только<br/>AGENTS.md"]

    style C fill:#c8e6c9
    style E fill:#fff9c4
    style F fill:#ffccbc

Структура CLAUDE.md

Рекомендуемая структура (гибче, чем AGENTS.md):

# Project Description

# Technology Stack

# Code Style & Conventions

# Key Commands

# Important Rules

# Examples

Полный пример CLAUDE.md для React + TypeScript проекта

# CLAUDE.md

## Project Description

Real-time collaboration app for designers. Users can create projects,
share designs, comment in real-time, and manage versions.

## Technology Stack

- **Frontend:** React 18, TypeScript, Vite, Tailwind CSS
- **State management:** Zustand
- **API client:** axios with interceptors
- **Real-time:** Socket.io client
- **Testing:** Vitest, React Testing Library
- **Build:** Vite
- **Node:** 18+

## Code Style & Conventions

### General
- Language: TypeScript (strict mode)
- Framework: React 18+ with hooks
- Components: Functional components only
- Naming: Components are `PascalCase`, functions are `camelCase`

### Styling
- Framework: Tailwind CSS
- No inline styles
- No CSS files (pure Tailwind)
- Responsive: mobile-first

### File Organization

src/ ├── components/ # React components ├── hooks/ # Custom hooks ├── stores/ # Zustand stores ├── services/ # API calls & utilities ├── types/ # TypeScript types ├── styles/ # Global styles only └── tests/ # Tests mirror src structure


### Imports
- Use absolute imports: `import X from '@/components'`
- Order: React → third-party → local → styles
- Be specific: `import { Button }` not `import *`

### Error Handling
- Always wrap async operations in try-catch
- Return user-friendly error messages
- Log technical errors with context
- Handle network timeouts (30s max)

## Key Commands

```bash
# Development
npm run dev          # Start dev server

# Testing
npm test            # Run tests
npm test -- --ui   # UI mode

# Building
npm run build       # Production build
npm run preview     # Preview build locally

# Quality
npm run lint        # Check TypeScript & ESLint
npm run type-check  # Type checking

Important Rules

DO:

  • [+] Use TypeScript strictly (no any)
  • [+] Handle errors explicitly
  • [+] Test components with React Testing Library
  • [+] Use hooks for side effects (useEffect, useCallback)
  • [+] Keep components small and focused
  • [+] Use Zustand stores for global state
  • [+] Add types to all function parameters
  • [+] Document complex components

DON’T:

  • [-] Don’t use class components
  • [-] Don’t hardcode values (use env vars)
  • [-] Don’t use inline styles or CSS-in-JS
  • [-] Don’t skip error handling
  • [-] Don’t log sensitive data to console
  • [-] Don’t use setTimeout for logic (use hooks)
  • [-] Don’t mutate state directly
  • [-] Don’t import from index.ts (import specific files)
  • [-] Don’t commit .env or sensitive files

Examples

Good Component with Hook

import { useCallback, useEffect } from 'react';
import { useStore } from '@/stores';
import { Button } from '@/components/ui';

interface DesignPreviewProps {
  designId: string;
}

export function DesignPreview({ designId }: DesignPreviewProps) {
  const design = useStore(state => state.getDesign(designId));
  const updateDesign = useStore(state => state.updateDesign);
  const [isSaving, setIsSaving] = useState(false);

  const handleSave = useCallback(async () => {
    try {
      setIsSaving(true);
      await updateDesign(designId, design);
    } catch (error) {
      console.error('Failed to save design:', error);
      // Show error to user
    } finally {
      setIsSaving(false);
    }
  }, [designId, design, updateDesign]);

  if (!design) return <div>Loading...</div>;

  return (
    <div className="space-y-4">
      <img src={design.preview} alt={design.name} />
      <Button onClick={handleSave} disabled={isSaving}>
        {isSaving ? 'Saving...' : 'Save'}
      </Button>
    </div>
  );
}

Good Service Function

import axios from '@/lib/axios';

export async function fetchDesigns(projectId: string) {
  try {
    const response = await axios.get(`/api/projects/${projectId}/designs`);
    return response.data;
  } catch (error) {
    if (axios.isAxiosError(error)) {
      throw new Error(error.response?.data?.message || 'Failed to fetch designs');
    }
    throw error;
  }
}

## Иерархия CLAUDE.md файлов

Claude Code может читать несколько CLAUDE.md файлов в иерархии:

```mermaid
flowchart LR
  A["~/.claude/CLAUDE.md\n(глобальный)"] -->|"наследуется"| B["проект/CLAUDE.md\n(корневой)"]
  B -->|"наследуется"| C["папка/CLAUDE.md\n(локальный)"]
~/.claude/CLAUDE.md (глобальный)

project/
├── CLAUDE.md (корневой)
│   ↑
└── src/
    ├── components/
    │   └── CLAUDE.md (для компонентов)
    └── services/
        └── CLAUDE.md (для сервисов)

Как это работает?

  1. Claude читает глобальный ~/.claude/CLAUDE.md (если существует)
  2. Затем читает корневой /project/CLAUDE.md
  3. Затем читает локальный /project/src/components/CLAUDE.md (если работает в этой папке)

Более специфичные файлы переопределяют общие правила.

Практика: как итеративно улучшать CLAUDE.md

Сценарий: Claude делает ошибку

Итерация 1:

Запрос: "Создай новый API endpoint для получения пользователя"

Результат:
[-] TypeScript с `any` типами
[-] Без error handling

Действие: Добавьте в CLAUDE.md:

## Important Rules

### DON'T:
- [-] Don't use `any` types (use strict TypeScript)
- [-] Don't skip error handling (always use try-catch)

Итерация 2:

Запрос: "Добавь форму логина"

Результат:
[-] localStorage без проверки SSR

Действие: Добавьте правило:

## Important Rules

### DON'T:
- [-] Don't use localStorage directly (might break SSR)

Процесс улучшения

1. Claude делает ошибку
2. Понимаю проблему
3. Добавляю правило в CLAUDE.md
4. Пробую снова с тем же запросом
5. Проверяю результат
6. Если лучше → готово, если нет → уточняю правило

Ключевые выводы

  1. CLAUDE.md специфичен для Claude Code — это инструкции именно для Claude, не для других AI-инструментов.

  2. Размер <300 строк критичен — большие файлы теряют эффективность. Лучше небольшой, но актуальный.

  3. Иерархия файлов позволяет иметь глобальные правила и локальные переопределения.

  4. Итеративное улучшение — основной способ развития. После каждой ошибки Claude добавьте правило.

  5. Примеры важнее описаний — Claude учится на примерах кода быстрее.

  6. Начните с малого — даже 50 строк CLAUDE.md лучше его отсутствия.

Следующий урок

Урок 4: GEMINI.md и .cursorrules

Скачать урок

Есть идея или нашли ошибку?

// Обсуждение

Можно писать анонимно. Укажите email, чтобы получать уведомления об ответах.