Кастомные навыки — Практика
Прямая речь: “Всё на этой странице практики построено так, чтобы вы могли повторять за мной строка за строкой. Когда видите блок с командой или промптом — можете скопировать его прямо в терминал или сессию Claude, если я явно не скажу, что это просто справочный материал. По ходу дела сверяйте свой результат с моим на экране, чтобы ловить ошибки сразу, а не копить их.”
Длительность: ~25 минут Результат: Три кастомных навыка (ревьюер K8s, аудитор Dockerfile, объяснитель файлов) плюс тест-драйв встроенного
/simplifyна вашем коде с тёмной темой. Пререквизиты: Пройдены Блоки 0-5 (система памяти настроена)
Шаг 1: Создаём навык K8s Review (~5 мин)
Это наш первый кастомный навык — read-only ревьюер, который проверяет манифесты Kubernetes на соответствие лучшим практикам. Он может читать ваш код, но не может ничего изменять.
Создайте директорию и файл навыка:
mkdir -p ~/ai-coderrank/.claude/skills/review-k8s
Создайте .claude/skills/review-k8s/SKILL.md со следующим содержимым:
---
name: review-k8s
description: Reviews Kubernetes manifests for best practices, security, and operational readiness
allowed-tools:
- Read
- Glob
- Grep
---
You are a senior SRE reviewing Kubernetes manifests before they go to production. Be thorough but practical — flag real issues, not theoretical nitpicks.
## Instructions
1. Use Glob to find all YAML files in the `k8s/` directory
2. Read each manifest file
3. Check every resource against the following criteria
## Checklist
### Resource Management
- [ ] CPU and memory requests are set
- [ ] CPU and memory limits are set
- [ ] Requests are lower than or equal to limits
- [ ] Resource values are reasonable (not 10 CPU cores for a web server)
### Security
- [ ] `runAsNonRoot: true` is set in the security context
- [ ] `readOnlyRootFilesystem: true` where applicable
- [ ] Capabilities are dropped (`drop: ["ALL"]`)
- [ ] No privileged containers
- [ ] No host networking or host PID
### Health & Reliability
- [ ] Liveness probe is configured
- [ ] Readiness probe is configured
- [ ] Startup probe for slow-starting containers
- [ ] Pod disruption budget exists for critical services
- [ ] Replica count is greater than 1 for production services
### Image Hygiene
- [ ] No `latest` tag — images are pinned to a specific version
- [ ] Image pull policy is appropriate (IfNotPresent for tagged, Always for mutable)
- [ ] Images come from an expected registry
### Labels & Metadata
- [ ] Standard Kubernetes labels are present (app.kubernetes.io/name, etc.)
- [ ] Labels are consistent across related resources (Deployment, Service, etc.)
- [ ] Namespace is explicitly set (not relying on `default`)
### Networking
- [ ] Services use appropriate type (ClusterIP for internal, LoadBalancer/Ingress for external)
- [ ] Port names follow convention (http, https, grpc, metrics)
- [ ] Network policies exist if the cluster uses them
## Output Format
For each file reviewed, produce:
### `<filename>`
**Overall**: PASS / WARN / FAIL
| Issue | Severity | Details | Suggested Fix |
|-------|----------|---------|---------------|
| ... | Critical/Warning/Info | What's wrong | How to fix it |
End with a **Summary** section: total files reviewed, critical issues, warnings, and a recommended priority order for fixes.
Обратите внимание на секцию
allowed-tools. Этот навык может только Read, Glob и Grep. Он не может редактировать файлы, выполнять команды или вносить какие-либо изменения. Это ревьюер, а не фиксер — он говорит вам, что не так, и позволяет вам самим решить, что делать.
Шаг 2: Создаём навык Docker Audit (~5 мин)
Тот же паттерн — read-only навык, который проверяет Dockerfile на типичные проблемы.
mkdir -p ~/ai-coderrank/.claude/skills/check-docker
Создайте .claude/skills/check-docker/SKILL.md:
---
name: check-docker
description: Audits Dockerfiles for security, performance, and build optimization
allowed-tools:
- Read
- Glob
- Grep
---
You are a Docker build optimization expert reviewing a Dockerfile before it ships.
## Instructions
1. Read the `Dockerfile` in the project root
2. Check for a `.dockerignore` file — read it if it exists
3. Evaluate the Dockerfile against every criterion below
4. Check that `.dockerignore` excludes common unnecessary files
## Dockerfile Checklist
### Build Stages
- [ ] Uses multi-stage builds (separate build and runtime stages)
- [ ] Build dependencies don't leak into the final image
- [ ] Final stage uses a minimal base image (alpine, distroless, or slim)
- [ ] Base image is pinned to a specific version (not just `node:20`, but `node:20.11-alpine`)
### Layer Optimization
- [ ] Package manager install + cleanup happen in the same RUN instruction
- [ ] `COPY package*.json` (or equivalent) happens BEFORE `COPY . .` for layer caching
- [ ] Dependencies are installed before application code is copied
- [ ] Unnecessary files are not copied into the image
### Security
- [ ] Final image runs as non-root user (`USER node` or custom user)
- [ ] No secrets, API keys, or credentials in the Dockerfile or build args
- [ ] `apt-get update && apt-get install` are combined and cleaned up
- [ ] No `sudo` or `chmod 777` in the Dockerfile
### Runtime
- [ ] `EXPOSE` matches the actual port the application listens on
- [ ] `HEALTHCHECK` instruction is present (or documented why it's omitted)
- [ ] Entrypoint uses exec form (`["node", "server.js"]`) not shell form
- [ ] Signal handling is correct (PID 1 problem addressed)
### .dockerignore
- [ ] `.dockerignore` exists
- [ ] Excludes: `node_modules/`, `.git/`, `*.md`, `.env*`, `.vscode/`, `coverage/`
- [ ] Excludes K8s and ArgoCD config (not needed in the image)
## Output Format
### Dockerfile Audit Report
**Image**: `<base image detected>`
**Stages**: `<number of stages>`
**Final image size estimate**: `<estimate based on base image + dependencies>`
| Category | Status | Finding | Recommendation |
|----------|--------|---------|----------------|
| Build Stages | PASS/WARN/FAIL | ... | ... |
| Layer Caching | PASS/WARN/FAIL | ... | ... |
| Security | PASS/WARN/FAIL | ... | ... |
| Runtime | PASS/WARN/FAIL | ... | ... |
| .dockerignore | PASS/WARN/FAIL | ... | ... |
**Top 3 Changes That Would Help Most:**
1. ...
2. ...
3. ...
Шаг 3: Тестируем /review-k8s на проекте (~3 мин)
Пора увидеть ваш первый кастомный навык в действии. Запустите Claude Code в проекте ai-coderrank:
cd ~/ai-coderrank
claude
Теперь запустите навык:
/review-k8s
Claude:
- Обнаружит все YAML-файлы в
k8s/ - Прочитает каждый из них
- Оценит их по вашему чеклисту
- Выдаст структурированный отчёт с результатами и оценками серьёзности
Обратите внимание на то, что он найдёт. Типичные проблемы в манифестах ai-coderrank:
- Отсутствующие ресурсные лимиты
- Нет security context
- Отсутствующие health check probes
- Теги образов
latest
Ключевой инсайт: Вы только что запустили комплексный ревью K8s одной командой. Джуниор-инженер, который никогда не писал манифест Kubernetes, может запустить это и получить фидбек уровня сеньора. В этом сила навыков.
Шаг 4: Тестируем /check-docker на Dockerfile (~3 мин)
Продолжайте в той же сессии Claude Code:
/check-docker
Понаблюдайте, как Claude систематически проверяет Dockerfile. Он должен выдать отчёт, покрывающий:
- Используются ли multi-stage builds
- Эффективность кэширования слоёв
- Безопасность (non-root пользователь, отсутствие секретов)
- Состояние
.dockerignore
Сравните вывод с тем, что вы бы проверили вручную. Нашёл ли он что-то, что вы могли бы пропустить?
Шаг 5: Создаём параметризованный навык с $ARGUMENTS (~5 мин)
Теперь давайте создадим гибкий навык, принимающий входные данные — объяснитель, который работает с любым файлом, на который вы его направите.
mkdir -p ~/ai-coderrank/.claude/skills/explain
Создайте .claude/skills/explain/SKILL.md:
---
name: explain
description: Explains any file in plain, jargon-free English
allowed-tools:
- Read
- Glob
- Grep
---
Read the file at `$ARGUMENTS`.
If the path doesn't exist, use Glob to search for likely matches and ask the user to confirm.
## Your Task
Explain this file as if you're talking to a smart developer who just joined the team and has never seen this codebase before.
## Structure Your Explanation As:
### What This File Does
One sentence. No jargon. What problem does it solve?
### How It Works — Step by Step
Walk through the file's logic from top to bottom. For each significant section:
- What it does
- Why it does it that way (if non-obvious)
- What would break if you removed it
### Key Patterns to Know
- Design patterns used (and why)
- Non-obvious conventions
- Anything a new developer might find surprising
### Connections
- What files import or depend on this file?
- What does this file import or depend on?
- If you changed this file, what else might need updating?
### Watch Out For
- Common mistakes when editing this file
- Edge cases it handles (or doesn't)
- Performance considerations
Keep the language conversational. Use analogies where they help. If something is genuinely complex, say so — but explain it anyway.
Теперь протестируйте в сессии Claude Code:
/explain src/app/page.tsx
/explain k8s/deployment.yaml
/explain Dockerfile
Каждый вызов подставляет путь, который вы указали, вместо $ARGUMENTS. Один навык, разные цели. Обратите внимание, как объяснения адаптируются под тип файла — React-компонент объясняется иначе, чем K8s-манифест.
Шаг 6: Запускаем /simplify на изменениях тёмной темы (~3 мин)
Помните тёмную тему, которую вы реализовали в Блоке 4? Давайте посмотрим, сможет ли /simplify её подчистить.
В вашей сессии Claude Code:
/simplify
/simplify — это встроенный навык, который:
- Смотрит на ваши последние изменения кода
- Находит возможности для переиспользования (не реализуете ли вы заново то, что уже есть в кодовой базе?)
- Замечает улучшения качества кода
- Находит оптимизации производительности
- Автоматически применяет исправления
Посмотрите, что он найдёт в вашей реализации тёмной темы. Типичные вещи, которые /simplify ловит:
- Дублирующиеся значения цветов, которые стоит вынести в CSS-переменные или расширения темы Tailwind
- Условная логика классов, которую можно чище написать через
clsxилиcn() - Компоненты, которые могут использовать общий базовый стиль
- Логика переключения темы, которую можно упростить с помощью кастомного хука
Просмотрите каждое предложенное изменение. Примите те, с которыми согласны.
Когда использовать
/simplify: После завершения любой фичи. Пишите код, чтобы он работал, затем/simplify, чтобы он стал чистым. Это как код-ревьюер, которого волнует только качество — без эго, без споров о стиле, просто “вот как этот код можно сделать лучше”.
Шаг 7: Разбираемся с ограничениями allowed-tools (~1 мин)
Давайте чётко обозначим разницу.
Ограниченный навык (наш review-k8s):
allowed-tools:
- Read
- Glob
- Grep
- Может читать файлы, искать по паттернам, выводить список файлов
- НЕ МОЖЕТ редактировать файлы, записывать файлы или выполнять bash-команды
- Идеально для: ревью, аудитов, объяснений, отчётов
Неограниченный навык (без allowed-tools в frontmatter):
---
name: fix-k8s-issues
description: Fixes common K8s manifest issues automatically
---
- Может использовать ВСЕ инструменты — читать, записывать, редактировать, выполнять команды
- Может вносить изменения прямо в ваши файлы
- Идеально для: автоматических исправлений, генерации кода, рефакторинга
Решение простое: Если навык должен только наблюдать и отчитываться — ограничивайте его. Если ему нужно вносить изменения — оставляйте без ограничений. Если сомневаетесь — начните с ограниченного варианта. Расширить всегда можно позже.
Попробуйте запустить /review-k8s, а затем попросите Claude “исправить проблему №1 из отчёта” в той же сессии. Навык завершится, и Claude (теперь в обычном режиме, а не в режиме навыка) сможет внести исправление с полным доступом ко всем инструментам.
Чекпоинт
Ваша директория .claude/skills/ сейчас должна выглядеть так:
.claude/
skills/
review-k8s/
SKILL.md <- K8s ревьюер лучших практик (ограниченный)
check-docker/
SKILL.md <- Аудитор Dockerfile (ограниченный)
explain/
SKILL.md <- Объяснитель файлов с $ARGUMENTS (ограниченный)
Вы также использовали встроенный навык /simplify на реальном коде. Эти четыре команды теперь живут в вашем проекте — любой коллега, который стянет репозиторий, получит их бесплатно.
Бонусные задания
Задание 1: Создайте навык /generate-test
Создайте неограниченный навык, который принимает путь к файлу через $ARGUMENTS, читает файл и генерирует тестовый файл, следуя конвенциям тестирования из вашего .claude/rules/testing.md (Блок 5). Он должен создать тестовый файл в правильном месте и использовать правильный фреймворк.
Задание 2: Создайте персональный навык
Создайте навык в ~/.claude/skills/ (не в проекте), который делает что-то полезное лично для вас. Идеи:
/tldr— пересказывает любой файл в 3 пунктах/review-pr— ревьюит diff текущей ветки относительно main/standup— генерирует апдейт для стендапа из ваших последних коммитов
Задание 3: Цепочка навыков
Запустите /review-k8s, затем используйте результаты, чтобы вручную попросить Claude исправить критические проблемы. Сравните “до” и “после”, запустив /review-k8s ещё раз. Второй отчёт должен показать улучшения.
Далее: В Блоке 7 мы выводим Claude Code за пределы кодовой базы — в реальную инфраструктуру: сборки Docker, кластеры Kubernetes и SSH на живые серверы. Claude не просто пишет код — он управляет системами.
Готовы проверить себя?
Пройти квиз →