К основному содержанию
хук

nextjs-code-quality-enforcer — хук для Claude Code: проверка Next.js

Хук на PostToolUse проверяет каждый записанный файл Next.js: структуру App Router, директивы Server/Client, импорты и типы. Срабатывает сразу после правки.

Установить в Claude Code · Через claude-code-templates Все способы и платформы ↓
npx claude-code-templates@latest --hook development-tools/nextjs-code-quality-enforcer
Открыть на GitHub

Что делает nextjs-code-quality-enforcer

Хук вешается на PostToolUse с матчером Write|Edit|MultiEdit. После успешной записи файла с расширением .js, .jsx, .ts или .tsx он читает путь из tool_input.file_path и прогоняет файл по набору проверок. Файлы в node_modules пропускаются.

Что именно ловит: страницы без export default function, layout без пропа children, интерактивные хуки и обработчики в Server Component без директивы use client, методы getServerSideProps и getStaticProps из Pages Router. Отдельно подсказывает про next/image вместо <img>, next/link вместо <a> для внутренних ссылок, metadata для SEO и утилиту вроде clsx для склейки классов. Замечания про React import и React.FC идут как советы, а не как ошибки.

Скрипт написан на bash и разбирает JSON через jq — без него хук не отработает. Таймаут 20 секунд. Если нашлись настоящие нарушения, хук печатает их в stderr и завершается с кодом 2, то есть блокирует продолжение. Поэтому стоит держать jq в PATH до того, как включать хук в рабочем проекте.

Установка идёт через npx claude-code-templates@latest --hook development-tools/nextjs-code-quality-enforcer, настройка попадает в .claude/settings.json.

Какие задачи решает

  • поймать страницу Next.js без default-экспорта до коммита
  • убрать хуки состояния из Server Component
  • перевести внутренние ссылки с <a> на next/link
  • найти методы Pages Router в проекте на App Router
  • подсказать next/image там, где стоит обычный <img>

Примеры запросов агенту

  • я дописал страницу в app/dashboard/page.tsx, проверь её хуком
  • почему хук ругается на useState в моём компоненте?
  • прогони проверку качества по только что изменённым файлам

Как установить nextjs-code-quality-enforcer

1Через claude-code-templates

npx claude-code-templates@latest --hook development-tools/nextjs-code-quality-enforcer

2Вручную: положить файлы

.claude/settings.json

Блок hooks: событие (PreToolUse, PostToolUse, Stop…) → команда. Личные — ~/.claude/settings.json

По шагам, с командами для каждой платформы: Хуки Claude Code: что это, где настраивать и как запретить опасную команду

Вопросы о nextjs-code-quality-enforcer

Как установить nextjs-code-quality-enforcer в Claude?

Выполните npx claude-code-templates@latest --hook development-tools/nextjs-code-quality-enforcer, затем проверьте, что запись появилась в .claude/settings.json.

Что делает nextjs-code-quality-enforcer?

После каждой записи или правки JS/TS-файла он проверяет код на соответствие соглашениям Next.js: структуру App Router, директивы Server и Client Component, импорты и типы. Найденные нарушения печатаются в stderr.

Что нужно для работы хука?

Скрипт на bash разбирает входной JSON через jq, поэтому утилита должна быть установлена и доступна в PATH. Таймаут команды — 20 секунд.

Исходный текст

nextjs-code-quality-enforcer.json · MIT
{
  "description": "Enforce Next.js best practices, proper file structure, component patterns, and TypeScript usage with automated code reviews and suggestions. Validates Next.js App Router conventions, Server/Client component patterns, proper imports, and TypeScript usage. Provides real-time feedback on code quality and adherence to Next.js best practices.",
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'input=$(cat); FILE_PATH=$(echo \"$input\" | jq -r \".tool_input.file_path // empty\"); SUCCESS=$(echo \"$input\" | jq -r \".tool_response.success // false\"); if [ \"$SUCCESS\" = \"true\" ] && [[ \"$FILE_PATH\" =~ \\.(js|jsx|ts|tsx)$ ]] && [[ ! \"$FILE_PATH\" =~ node_modules ]]; then echo \"🔍 Next.js Code Quality Enforcer: Reviewing $FILE_PATH...\"; ISSUES=0; if [ -f \"$FILE_PATH\" ]; then if [[ \"$FILE_PATH\" =~ app/.* ]]; then echo \"📁 App Router file detected: $FILE_PATH\"; if [[ \"$FILE_PATH\" =~ page\\.(js|jsx|ts|tsx)$ ]] && ! grep -q \"export default function\" \"$FILE_PATH\" 2>/dev/null && ! grep -q \"export default async function\" \"$FILE_PATH\" 2>/dev/null; then echo \"❌ Page component must export default function\" >&2; ((ISSUES++)); fi; if [[ \"$FILE_PATH\" =~ layout\\.(js|jsx|ts|tsx)$ ]] && ! grep -q \"children\" \"$FILE_PATH\" 2>/dev/null; then echo \"❌ Layout component should accept children prop\" >&2; ((ISSUES++)); fi; if [[ \"$FILE_PATH\" =~ page\\.(js|jsx|ts|tsx)$ ]] && ! grep -q \"Metadata\" \"$FILE_PATH\" 2>/dev/null && ! grep -q \"metadata\" \"$FILE_PATH\" 2>/dev/null; then echo \"⚠️ Consider adding metadata export for SEO\"; fi; if grep -q \"use client\" \"$FILE_PATH\" 2>/dev/null; then echo \"🖥️ Client Component detected\"; if ! grep -E \"(useState|useEffect|onClick|onChange|onSubmit)\" \"$FILE_PATH\" 2>/dev/null; then echo \"⚠️ Client component without interactivity - consider Server Component\"; fi; else echo \"🚀 Server Component (default)\"; if grep -E \"(useState|useEffect|onClick|onChange|onSubmit)\" \"$FILE_PATH\" 2>/dev/null; then echo \"❌ Interactive features in Server Component - add \\\"use client\\\" directive\" >&2; ((ISSUES++)); fi; fi; fi; if [[ \"$FILE_PATH\" =~ \\.(jsx|tsx)$ ]]; then if ! grep -q \"import.*React\" \"$FILE_PATH\" 2>/dev/null && grep -q \"<\" \"$FILE_PATH\" 2>/dev/null; then echo \"⚠️ JSX without React import (Next.js 17+ handles this automatically)\"; fi; if ! grep -q \"FC\\|FunctionComponent\" \"$FILE_PATH\" 2>/dev/null && grep -q \"props\" \"$FILE_PATH\" 2>/dev/null && [[ \"$FILE_PATH\" =~ \\.tsx$ ]]; then echo \"💡 Consider using React.FC or explicit prop types for TypeScript\"; fi; fi; if [[ \"$FILE_PATH\" =~ \\.js$ ]] && [ -f \"tsconfig.json\" ]; then echo \"📝 JavaScript file in TypeScript project: $FILE_PATH\"; echo \"💡 Consider migrating to TypeScript for better type safety\"; fi; if grep -q \"next/image\" \"$FILE_PATH\" 2>/dev/null; then echo \"✅ Using next/image for optimized images\"; elif grep -q \"<img\" \"$FILE_PATH\" 2>/dev/null; then echo \"🖼️ Regular <img> tag detected\"; echo \"💡 Consider using next/image for better performance\"; fi; if grep -q \"next/link\" \"$FILE_PATH\" 2>/dev/null; then echo \"✅ Using next/link for navigation\"; elif grep -q \"<a href=\" \"$FILE_PATH\" 2>/dev/null && ! grep -q \"http\" \"$FILE_PATH\" 2>/dev/null; then echo \"🔗 Regular <a> tag for internal links detected\"; echo \"💡 Use next/link for internal navigation\"; fi; if grep -q \"getServerSideProps\\|getStaticProps\" \"$FILE_PATH\" 2>/dev/null; then echo \"⚠️ Pages Router data fetching methods detected\"; echo \"💡 Consider migrating to App Router with Server Components\"; fi; if grep -q \"className=.*{\" \"$FILE_PATH\" 2>/dev/null; then echo \"🎨 Dynamic className detected\"; if ! grep -q \"clsx\\|classnames\\|cn(\" \"$FILE_PATH\" 2>/dev/null; then echo \"💡 Consider using clsx or similar utility for className concatenation\"; fi; fi; if [ $ISSUES -eq 0 ]; then echo \"✅ Code quality check passed for $FILE_PATH\"; else echo \"❌ Found $ISSUES code quality issues in $FILE_PATH\" >&2; exit 2; fi; else echo \"❌ File $FILE_PATH not found\"; fi; else echo \"ℹ️ Code quality check skipped (not a JavaScript/TypeScript file or failed operation)\"; fi'",
            "timeout": 20
          }
        ]
      }
    ]
  }
}

© davila7 · MIT · davila7/claude-code-templates

Похожие хуки

Всё по теме «Фронтенд и UI» →

Из того же набора205

Весь набор →
workflow-orchestrator Оркестрирует цепочки задач автоматизации с графом зависимостей, расписанием и параллельным выполнением в проекте. 2 341установок devops-troubleshooter Субагент исследует логи, сбои развёртывания и проблемы мониторинга. Подключайте его, когда нужно найти причину инцидента и подготовить исправление. 2 328установок dependency-checker Хук на PostToolUse: после правки файла зависимостей запускает аудит пакетов и показывает, что устарело или уязвимо. 2 314установок security-scanner Хук запускает проверку безопасности каждый раз, когда Claude правит или создаёт файл. Ищет уязвимости и захардкоженные секреты. 2 256установок add-changelog Команда обновляет файл CHANGELOG.md по стандарту Keep a Changelog. Она считывает недавние коммиты через git и помогает подготовить описание релиза. 2 025установок unused-code-cleaner Субагент ищет неиспользуемые импорты, функции и классы и удаляет их с проверкой после каждого шага. Пригодится после рефакторинга или перед выкладкой в прод. 1 990установок report-generator Субагент превращает разрозненные заметки и результаты исследований в структурированный отчёт в Markdown. Пригодится на финальном шаге работы, когда нужно свести факты воедино. 1 930установок fact-checker Субагент для Claude, который разбирает текст на проверяемые утверждения и оценивает надёжность источников. Пригодится, когда нужно перепроверить черновик, отчёт или чужую цитату. 1 919установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой