LintSync
Держите конфиги ESLint, Prettier и Stylelint в синхроне с общим пресетом — в одном проекте или сразу во многих — не теряя локальные правки.
Возможности
- Точечные правки, а не переписывание файла целиком — LintSync записывает правила пресета прямо в существующие конфиги (не нужен пакет для
extends); ваши комментарии, стиль кавычек и форматирование вне затронутых ключей сохраняются. - Владение по ключам — небольшой
.lintsync/manifest.jsonотслеживает, какие ключи последний раз применил пресет, поэтому обычное обновление пресета и правило, изменённое вручную, никогда не путаются между собой. - Разрешение конфликтов, а не молчаливая перезапись — ключ, отличающийся и от манифеста, и от текущего пресета — это конфликт: LintSync открывает интерактивный TUI для его разрешения (или безопасно падает в CI) и никогда не пишет файл наполовину.
- Четыре встроенных пресета —
vue-app,react-app,npm-libи общийbase, каждый со своим набором правил ESLint/Prettier/Stylelint и списком зависимостей для установки. Пресеты живут внутри самого LintSync, поэтомуnpm update -g lintsync— это и есть способ получить обновления пресетов, отдельный пакет с конфигом публиковать не нужно. - Сборка и сохранение собственного пресета — интерактивный конструктор берёт живой список опций Prettier и около 80 правил Stylelint прямо из официальных конфигов
-recommended/-standard, и сохраняет результат локально для повторного использования в любом проекте на машине. - Пакетный режим по многим проектам — реестр известных проектов с тегами и фильтрацией позволяет
sync/statusпройтись по всем сразу через--all, с одним общим кодом возврата для CI. - JSON/JSONC, YAML и JS/TS конфиги — включая современный flat config ESLint (
export default [...]) и CommonJSmodule.exports. - Миграция старых конфигов —
migrate eslint --to flatи аналоги для Prettier/Stylelint переносят конфиг в новый формат или расположение, никогда не удаляя исходник и не перезаписывая существующую цель.
Как это работает
Пресет — это встроенный (или сохранённый локально пользовательский) набор правил для каждого инструмента, плюс нужные зависимости и список ключей, которые он считает своими (managedKeys). lintsync init устанавливает эти зависимости, записывает конфиг каждого инструмента из пресета и сохраняет запись в манифесте — этот файл нужно коммитить.
Манифест — не источник истины, а запись «что последний раз применил пресет». Каждый запуск sync/status заново читает реальный конфиг и сравнивает его и с манифестом, и с текущим пресетом:
- Файл совпадает с манифестом (ключ не трогали) → тихо обновляется до текущего значения пресета.
- Файл уже совпадает с пресетом → делать нечего.
- Файл отличается и от того, и от другого → конфликт. Ничего не записывается, пока он не разрешён.
get/set/unset редактируют поле конфига напрямую и намеренно не трогают манифест — ручная правка это ровно то, что должно всплыть конфликтом на следующем sync, а не молча потеряться.