Багодельня

Больше фичей Claude Code

Пробуем почти все фичи Claude Code на одной боевой задаче: собираем skill и заворачиваем его в плагин.

Второй маршрут — для тех, кто уже поставил Claude Code и подключил Jira/Confluence и хочет пощупать его всерьёз или просто попробовать больше фичей. Пройдём почти все фичи руками — и не теории ради: каждая встроена в одну боевую задачу — собрать skill /generate-test, который пишет автотест одной командой, и упаковать его в плагин для команды.

Это пример, а не готовое решение

/generate-test здесь — шаблон, чтобы показать, как фичи складываются в один воркфлоу. Скорее всего, у тебя он заработает не так, как хочется: другой стек, своя архитектура тестов, свои источники требований. Боевой skill собирай сам — под свои требования и предпочтения, донастраивая каждый шаг. Этот маршрут — не инструкция «делай ровно так», а пример того, как это вообще делается.

Что попробуешь по дороге

  • ПамятьCLAUDE.md с архитектурой проекта.
  • Браузер — Playwright CLI: живая проверка дешевле, чем через MCP.
  • MCPAtlassian + Qase (TMS).
  • Settingssettings.json: даём агенту только разрешённые действия.
  • Subagents — параллельный сбор контекста.
  • Удешевление работы субагентов — субагентам ставим Haiku, экономим токены.
  • GitLab CLI (glab) — читать фронт- и бэк-репозитории.
  • Git worktree — несколько фич разом без конфликтов.
  • Контекст и откат/compact и /rewind, чтобы сессия не «тупела».
  • Skills — боевой /generate-test.
  • Loops/loop — чинить тесты по кругу до зелёного.
  • Hooks/hooks — автозапуск проверки качества кода и тестов.
  • Plugins — упаковать всё и раздать команде.

Шаги

Стартовая точка

Считаем, что путь новичка пройден: Claude Code установлен, Atlassian MCP подключён, агент видит задачи в Jira и страницы в Confluence. Если нет — сначала туда, тут мы только наращиваем.

Фундамент: каркас, эталонный тест и CLAUDE.md

Инициализируй пустое Playwright-репо — npm init playwright@latest: это ставит раннер @playwright/test, которым потом гоняются спеки (npx playwright test). Разложи трёхслойную архитектуру: pom/ (локаторы), steps/ (действия), assertions/ (проверки). Напиши один аккуратный тест руками — агент копирует стиль образца: дашь один грамотный тест, получишь десять таких же.

Не путай два инструмента: @playwright/test (этот шаг) — раннер, гоняет готовые спеки. @playwright/cli (следующий шаг) — «руки в браузере» для агента: открыть страницу, снять локаторы. Нужны оба, ставятся отдельно.

Далее в корне проекта нам нужен CLAUDE.mdпостоянная память проекта: где какой слой лежит, конвенции именования, и правила, которые агент не должен нарушать (грабли из прошлых прогонов). Без этого файла агент путает слои и может сломать архитектуру проекта.

Не пиши CLAUDE.md с нуля, если репо уже есть: запусти /init — агент соберёт черновик по существующей архитектуре (структура, стек, скрипты), а ты причешешь его руками и допишешь грабли.

Дай агенту глаза — Playwright

Дай агенту браузер — Playwright. Теперь он может открыть живую страницу, собрать реальные локаторы и data-testid, увидеть обязательные поля. По умолчанию бери Playwright CLI (@playwright/cli): водит браузер так же, как MCP, но заметно дешевле по токенам — в контекст падает только вывод команды, а не снапшот страницы на каждый шаг. MCP оставь для точечных интерактивных сценариев.

npm install -g @playwright/cli@latest

Живая проверка — не опционально. DOM почти всегда расходится с предположениями: скрытые обязательные поля, лейблы опций не совпадают с константами, кнопки без data-testid. Тест «вслепую» получается красивым, но падающим.

Подключи TMS — Qase MCP

Чтобы агент не плодил дубли и сверялся с уже существующими тест-кейсами, дай ему доступ к TMS (системе управления тестами) через MCP. Для примера — Qase: у него есть официальный рабочий MCP-сервер. Подойдёт MCP любой TMS, подключается так же.

claude mcp add qase --env QASE_API_TOKEN=<твой-токен> -- npx -y @qase/mcp-server

Где взять токен, вариант через .mcp.json и что агент умеет с TMS — в статье «Как подключить TMS-систему».

Настройки и разрешения: settings.json

По умолчанию агент спрашивает разрешение на каждое потенциально опасное действие. Чтобы не тыкать «да» сто раз, но и не раздавать всё подряд, настрой разрешения в settings.json. Файл бывает двух видов — отличаются тем, где лежат:

  • .claude/settings.json — в корне проекта, общий для команды (коммитится в репозиторий);
  • ~/.claude/settings.json — в твоей домашней папке (~), личный, только для тебя на этой машине.

Разумный дефолт для этого сетапа: разрешить безопасное без спроса (читать репо, запросы в MCP, прогон тестов), а разрушительное оставить за подтверждением (rm, git push, миграции БД).

Пример settings.json

.claude/settings.json
{
  "permissions": {
    "allow": [
      "Read(./**)",
      "Bash(npm test:*)",
      "Bash(npx playwright test:*)",
      "Bash(playwright-cli:*)",
      "Bash(git status:*)",
      "Bash(git diff:*)",
      "mcp__mcp-atlassian",
      "mcp__qase"
    ],
    "ask": [
      "Bash(git push:*)",
      "Bash(npm run migrate:*)"
    ],
    "deny": [
      "Bash(rm:*)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}

Правило — это Инструмент(шаблон): Bash(git push:*) ловит любую команду, начинающуюся с git push; * — джокер. Приоритет: denyaskallow (запрет всегда сильнее). Целый MCP-сервер открывается одной строкой mcp__<имя-сервера> — поэтому здесь без спроса разрешены инструменты, подключённые на прошлых шагах: playwright-cli, MCP Atlassian и Qase.

Особенно важно настроить разрешения до автономных штук вроде циклов /loop: там агент работает сам, без твоего «да» на каждый шаг. Один режим для «прочитать», другой — для «удалить» и «запушить».

Создай субагентов и раздай работу

Контекст для теста лежит в разных местах. Запусти субагентов — каждый со своим контекстом, параллельно:

  • Confluence → описание фичи и бизнес-правила;
  • фронт-репо (через glab) → форма, поля, data-testid;
  • бэк-репо (через glab) → API, контракты, валидации;
  • TMS → существующие тест-кейсы, чтобы не дублировать.

Все отдают результат оркестратору. Параллельно — быстрее, и каждый агент не засоряет общий контекст лишним.

Как создать. Каждый субагент — это Markdown-файл с YAML-фронтматтером. Два способа:

  • Команда /agents — интерактивный мастер прямо в Claude Code: задаёшь имя, описание, инструменты и модель, файл создаётся сам. Самый простой путь.
  • Вручную — положи .md-файл в одну из папок:
    • .claude/agents/ — в корне проекта, общий для команды (коммитится);
    • ~/.claude/agents/ — личный, на все твои проекты.

В фронтматтере обязательны name и description — по description оркестратор понимает, когда звать агента. Тело файла — это системный промпт субагента. Минимальный «сборщик контекста» из Confluence — файл .claude/agents/context-confluence.md:

---
name: context-confluence
description: Ищет описание фичи в Confluence. Use when нужно собрать требования по фиче.
---

Найди в Confluence страницу с описанием фичи, верни обязательные
поля, бизнес-правила и статусы. Лишнего не тащи — только выжимку.

Дальше просто попроси оркестратор: «собери контекст по фиче X — Confluence, фронт- и бэк-репо, TMS — параллельно». Он сам раздаст работу подходящим субагентам по их description.

Удешеви субагентов — модель и инструменты

Сбор контекста (читать, искать) — простая работа, мощная модель тут избыточна. У субагента во фронтматтере есть два опциональных поля, которые срезают расход:

  • model — поставь дешёвую и быструю, например haiku. Оркестратор остаётся на мощной модели (Opus), а четыре «сборщика» бегают на Haiku — это заметно экономит токены без потери качества на таких подзадачах.
  • tools — сузь доступ ровно до нужного (здесь — только MCP Atlassian). Так агент не лезет куда не просили и не тратит токены на лишние инструменты.

mcp__mcp-atlassian сработает, только если сервер подключён под этим именем. Имя в tools (и в settings.json) должно совпадать с тем, как ты назвал сервер при подключении — например, у официального это atlassian-mcp-server, а не mcp-atlassian. Проверь /mcp.

Тот же context-confluence, но уже «дешёвый»:

---
name: context-confluence
description: Ищет описание фичи в Confluence. Use when нужно собрать требования по фиче.
model: haiku
tools: mcp__mcp-atlassian
---

Найди в Confluence страницу с описанием фичи, верни обязательные
поля, бизнес-правила и статусы. Лишнего не тащи — только выжимку.

Сделай так для всех четырёх «сборщиков» — и параллельный сбор контекста обойдётся в разы дешевле, чем если бы всё тянула одна дорогая по стоимости модель.

Собери боевой skill — /generate-test

Всё, что собрано на прошлых шагах (память, браузер, MCP, субагенты), пора склеить в один повторяемый воркфлоу — skill. Это команда, которую агент запускает сам по описанию или ты — вручную через /generate-test.

Что такое skill. Это папка с файлом SKILL.md внутри. Имя папки = имя команды. Лежит в одном из двух мест:

  • .claude/skills/<имя>/ — в проекте, общий для команды (коммитится);
  • ~/.claude/skills/<имя>/ — личный, на все твои проекты.

Как создать. Сделай папку и положи в неё SKILL.md:

mkdir -p .claude/skills/generate-test

SKILL.md — это YAML-фронтматтер + инструкции в Markdown:

  • description — самое важное. Это единственное, что агент видит, решая, пора ли грузить skill. Пиши что делает и когда применять (с примерами фраз-триггеров).
  • allowed-tools (опц.) — ограничить, чем skill может пользоваться.
  • Тело файла — пошаговые инструкции: агент выполняет их, когда skill активирован.

Как подключить ранее созданных субагентов. Прямо в теле SKILL.md называешь субагентов по имени — оркестратор сам раздаст им работу по фазе сбора контекста. Никакого особого синтаксиса: skill — это инструкция оркестратору, а он уже знает про агентов из .claude/agents/.

---
name: generate-test
description: Генерирует Playwright e2e-тест по названию фичи. Use when пользователь просит «напиши тест на ...», «сделай е2е», «автотест на X».
allowed-tools: Read, Write, Edit, Bash, Task
---

# Generate Test

## Фаза 1. Сбор контекста — параллельно, субагентами
Запусти разом и дождись всех:
- **context-confluence** → описание фичи и бизнес-правила;
- **context-front** → поля формы и `data-testid` (через `glab`);
- **context-back** → API, контракты, валидации (через `glab`);
- **context-tms** → существующие кейсы в Qase, чтобы не дублировать.
Чего критично не хватает — спроси пользователя, не выдумывай.

## Фаза 2. Живая валидация (playwright-cli)
Открой страницу через playwright-cli, собери реальные локаторы
и обязательные поля, сверь лейблы опций с кодом.

## Фаза 3. Генерация (по слоям, стиль — из эталонного теста)
POM → steps → assertions → spec.

## Фаза 4. Запуск и починка
Прогони спек через `npx playwright test`, читай ошибку,
чини по CLAUDE.md. Зелёный прогон — переходи к Фазе 5.

## Фаза 5. Верификация (зелёный ≠ корректный)
Перечитай тест: проверяет ли он то, что описано в требованиях
(Фаза 1), а не просто «не падает». Сверь ассерты с бизнес-правилами,
убедись, что нет ложно-зелёного (пустой ожидаемый результат,
закомментированная проверка). Сомнительное — покажи пользователю.

Субагенты в Фазе 1 вызываются через инструмент Task — поэтому он есть в allowed-tools. Имена (context-confluence и т.д.) должны совпадать с полем name в файлах .claude/agents/.

Поправь пути и имена под свой проект — и /generate-test Авторизация запускает весь воркфлоу одной командой.

Готово — запусти и заверни в плагин

Skill работает. Запускать можно по-разному:

  • По названию фичи — агент сам найдёт описание в Confluence и соберёт контекст:
    /generate-test Авторизация
  • По ID готового тест-кейса в TMS — агент вытащит шаги и ожидаемый результат прямо из Qase через MCP и сгенерирует автотест по ним:
    /generate-test QASE-123
  • Без явной команды — по description агент подхватит skill, когда попросишь «напиши тест на …».

Агент сам пройдёт все фазы: соберёт контекст субагентами, сверится с живой страницей через Playwright, сгенерирует тест по слоям, прогонит его и проверит, что зелёный — по делу (Фаза 5).

Чтобы вариант с ID работал, в SKILL.md добавь ветку: «если на входе ID тест-кейса (например, QASE-123) — возьми его из Qase MCP как основу: шаги и ожидаемый результат бери оттуда, а живой страницей лишь сверяй локаторы».

Что должно получиться на выходе — спек поверх трёхслойной архитектуры (детали скрыты в pom/steps/assertions, как в эталонном тесте):

tests/auth.spec.ts
import { test } from '@playwright/test';
import { loginSteps } from '../steps/login.steps';
import { loginAssertions } from '../assertions/login.assertions';

test('успешный вход по валидным данным', async ({ page }) => {
  await loginSteps.open(page);
  await loginSteps.submit(page, 'user@company.com', 'correct-horse');
  await loginAssertions.onDashboard(page);
});

Тонкий, читаемый спек — вся механика в слоях. Именно поэтому в «Фундаменте» мы задавали стиль эталонным тестом: агент копирует его, а не изобретает свой.

Дальше упакуй /generate-test, конвенции из CLAUDE.md, субагентов (а если настроишь хуки — см. дополнительные шаги — то и их) в плагин и раздай команде через маркетплейс. Теперь не только у тебя — у всех QA одной командой генерится тест в общей архитектуре.

Готово ✅

Ты прошёл почти весь Claude Code на одной задаче: память, браузер, MCP, субагенты, удешевление, skills и плагины — и на выходе боевой /generate-test, упакованный для команды. Ниже — необязательные шаги, которые делают воркфлоу удобнее.

Дополнительные шаги

Базовый воркфлоу уже работает. Эти приёмы подключай по мере надобности.

Несколько фич разом — git worktree

Нужно генерить тесты на несколько фич сразу? Не держи их в одной сессии — дай каждому агенту git worktree: свою изолированную копию репозитория на отдельной ветке, без конфликтов с остальными.

Руками плодить папки не нужно — попроси самого агента: «заведи worktree под фичу auth и работай в нём». Под капотом это просто:

git worktree add ../repo-auth -b tests/auth   # агент делает сам

Дальше в каждом worktree — своя сессия Claude Code и свой /generate-test. Несколько фич = несколько сессий на изолированных ветках.

worktree — это оркестрация снаружи, а не часть skill. Не зашивай git worktree add в /generate-test: skill делает один тест в одной сессии, а параллельность дают несколько сессий — по одной на worktree. Внутрь skill worktree не нужен и не даст параллельности (соседнюю сессию он сам не запустит).

Когда параллельных агентов много, запускать сессии руками утомительно — тут помогает обёртка вроде cmux: сама создаёт worktree, ветку и сессию. Подробнее — в справочнике по worktree.

Автоматизируй рутину — хук

Чтобы не запускать линт руками после каждой генерации, повесь хук на событие: после того как агент изменил файл (Edit/Write), автоматически гнать по нему eslint --fix. Конфиг — в settings.json, рядом с разрешениями:

.claude/settings.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx eslint --fix"
          }
        ]
      }
    ]
  }
}

Как это работает: после каждого Edit/Write Claude Code отдаёт хуку JSON события на stdin; jq достаёт оттуда путь изменённого файла и передаёт его в eslint --fix. Агент правит код — хук молча причёсывает, ты видишь только результат.

Событий много (PreToolUse, PostToolUse, Stop, SessionStart и др.), и хук может не только запускать команды, но и блокировать действие. Полный список и форматы — в справочнике по хукам.

Чинить до зелёного — /loop

Сгенерированный тест редко зеленеет с первого раза. Вместо ручного «запусти — почини — снова» запусти /loop: агент сам повторяет цикл — прогоняет тест, читает ошибку, правит по CLAUDE.md и собранному контексту, и так пока не позеленеет (или пока не упрётся в то, что требует тебя).

/loop прогони сгенерированный тест и чини, пока не станет зелёным

Готовые рецепты лупов (с условием выхода и проверками) — в каталоге Loops!.

Держи сессию в порядке — /compact и /rewind

Сбор контекста и параллельная работа быстро раздувают контекст-окно — и агент начинает «тупеть» и терять детали. Два инструмента держат сессию в форме:

  • /compact — сжимает историю, не бросая сессию: суть остаётся, мусор уходит, окно дышит.
  • /rewind — откат к чекпоинту, если агент ушёл не туда. Неудачный прогон не надо разгребать руками — вернулся на шаг назад и переформулировал.

Не жди, пока агент начнёт путаться: чем чище контекст, тем точнее ответы.

Проверь себя

  1. 1. Зачем писать эталонный тест и CLAUDE.md до создания skill?

  2. 2. Зачем в этом маршруте git worktree?

  3. 3. Что делает хук в этом сетапе?

  4. 4. Как удешевить субагентов, которые просто собирают контекст?

  5. 5. Почему для браузера по умолчанию берут Playwright CLI, а не MCP?

  6. 6. Зачем в этом сетапе подключать TMS (например, Qase) через MCP?

  7. 7. В settings.json правило попало и в allow, и в deny. Что победит?

  8. 8. Что в файле субагента (.claude/agents/) обязательно и зачем нужен description?

  9. 9. Что важнее всего в SKILL.md и почему?

  10. 10. Как в skill /generate-test задействовать ранее созданных субагентов?

  11. 11. Почему «зелёный прогон» ещё не значит «тест готов»?

  12. 12. Что делает /loop с только что сгенерированным тестом?

  13. 13. Чем /compact отличается от /rewind?

  14. 14. Зачем заворачивать /generate-test, CLAUDE.md, субагентов и хуки в плагин?

On this page