Продвинутое

Кастомные правила и пресеты

Свои чеки на defineCheck и их поставка пресетами и пакетами правил.
import { defineCheck } from '@ranklint/checks'

customChecks: [
  defineCheck({
    id: 'myteam:no-lorem',          // коллизия со встроенным id — ошибка с подсказкой
    category: 'meta',
    severity: 'warn',
    scope: 'page',                  // 'page' | 'site'
    docs: 'https://wiki.myteam.dev/seo/no-lorem',
    optionsSchema: z.object({...}), // опционально — валидация опций
    async run(ctx) {
      // ctx: page, pages, document (linkedom DOM), config, site, fetcher
      return [{ checkId: 'myteam:no-lorem', severity: 'warn', message: '...', url: ctx.page!.url }]
    },
  }),
]

Кастомные правила равноправны: настраиваются через rules, отключаются 'off' и useRanklintIgnore. Контракт CheckContext стабилен в рамках мажорной версии. Пресеты — через extends (npm-пакет или локальный файл); @ranklint/preset-default фиксирует встроенные правила на дефолтных severity — «живой» снапшот от установленной версии checks.

Пакеты правил. Пресет в extends (npm-пакет или локальный файл) может нести customChecks вместе с rules — так команда поставляет свой набор: extends: ['@myteam/ranklint-rules']. Слои мержатся; сам конфиг побеждает.