Sync и Status
Повседневная пара команд: status смотрит на расхождение с пресетом ничего не записывая, sync применяет безопасную часть этих изменений.
Проверка состояния
lintsync status показывает расхождение с пресетом, никогда ничего не записывая — read-only «сиблинг» команды sync --dry-run.
lintsync status [options]lintsync status
lintsync status --all --tag type:npm-packageВ отличие от sync, конфликт здесь — просто состояние проекта, а не провал команды: status завершается с кодом 0, пока команда смогла прочитать конфиг и найти пресет, даже если есть конфликт для просмотра. Ненулевой код возврата — только при настоящей ошибке выполнения (битый манифест, неизвестный пресет, нечитаемый файл).
Опции
--cwd <path>
Директория проекта. По умолчанию — текущая директория.
--tool <name>
Ограничить проверку одним инструментом (eslint, prettier или stylelint).
--all
Пройтись по всем проектам из реестра вместо одного --cwd — см. Проекты и пакетный режим.
--tag <tag>
Вместе с --all ограничивает пакетный запуск проектами с этим тегом. Без --all не имеет эффекта.
--registry <path>
Вместе с --all — использовать файл реестра проектов, отличный от дефолтного — см. Проекты и пакетный режим.
--json
Машиночитаемый вывод.
--quiet
Подавить вывод при успехе.
--verbose
Дополнительно печатать значение, записанное в манифесте, для каждого конфликта — не только локальное значение и значение пресета.
Применение изменений
lintsync sync сравнивает текущий проект с его пресетом и применяет безопасные изменения.
lintsync sync [options]lintsync sync # предпросмотр: показывает, что изменится, ничего не пишет без --yes
lintsync sync --yes # применить неконфликтующие изменения
lintsync sync --dry-run # явный предпросмотр, никогда не пишет, даже с --yes
lintsync sync --tool eslint # ограничиться одним инструментомПример вывода — реальный запуск с одним конфликтом, обычный (не quiet, не verbose) режим:
eslint (eslint.config.mjs) — preset npm-lib@0.1.0
✗ 1 conflict:
rules.no-console (local: "warn", preset: "error")
prettier (.prettierrc.json) — preset npm-lib@0.1.0
✓ up to date
Total: 2 tools, 1 conflict. Exit code: 1При запуске в реальном терминале без --dry-run/--yes/--json конфликт открывает интерактивный TUI вместо простого отчёта — см. Разрешение конфликта ниже. В CI (без TTY) или с --json конфликт просто фиксируется в отчёте и остаётся совершенно нетронутым.
Конфликт по одному ключу задерживает все ожидающие изменения для файла этого инструмента, пока он не разрешён — ничего не пишется наполовину. «Оставить локальное» или ручное значение из TUI — это решение на один запуск, а не постоянная фиксация: у манифеста нет поля «намеренно расходится навсегда», поэтому тот же конфликт может всплыть снова на следующем sync, если файл или пресет опять изменятся.
Опции
--tool <name>
Ограничить синхронизацию одним инструментом.
--dry-run
Только предпросмотр — никогда не пишет, даже вместе с --yes.
-y, --yes
Применить неконфликтующие изменения. Обязателен, чтобы реально что-то записать; без него (и без --dry-run) sync всё равно только показывает предпросмотр.
--all
Пройтись по всем проектам из реестра — см. Пакетный режим ниже.
--tag <tag>
Вместе с --all ограничивает пакетный запуск проектами с этим тегом.
--registry <path>
Вместе с --all — использовать файл реестра проектов, отличный от дефолтного.
--cwd <path>
Директория проекта. По умолчанию — текущая директория.
--json
Машиночитаемый вывод.
--quiet
Подавить вывод при успехе.
--verbose
Печатать каждый изменённый ключ отдельной строкой вместо одной строки-сводки через запятую, и дополнительно — значение из манифеста для каждого конфликта.
Пакетный режим
Передайте --all, чтобы прогнать sync по всем проектам из реестра (см. Проекты и пакетный режим) вместо одного --cwd:
lintsync sync --all # все зарегистрированные проекты
lintsync sync --all --tag type:site # только проекты с тегом type:site
lintsync sync --all --yesПакетные запуски всегда неинтерактивны — конфликт фиксируется в отчёте по каждому проекту, TUI никогда не открывается.
Разрешение конфликта (TUI)
В реальном терминале, без --dry-run/--yes/--json, конфликт sync открывает интерактивный резолвер вместо провала команды:
- Стрелки влево/вправо — листать между конфликтами, не требуя сначала разрешить текущий.
- Стрелки вверх/вниз — перемещать курсор между тремя вариантами: Accept preset (принять пресет), Keep local (оставить локальное), Edit manually (отредактировать вручную).
- Enter — зафиксировать выделенный вариант. Выбор Edit manually вместо этого открывает режим текстового ввода, предзаполненный текущим значением из файла.
- Внутри режима ручного ввода: набор текста редактирует буфер, Enter фиксирует значение (парсится как JSON, если это валидный JSON, иначе как обычная строка — то же правило, что использует
set), Escape отменяет и возвращает к списку вариантов, ничего не записывая, Backspace удаляет последний символ.
Строка live-предпросмотра всегда показывает, что дал бы выбранный (или набираемый) сейчас вариант. Резолвер показывает трёхстороннее сравнение для конфликта на текущей странице — значение локального файла, последнее применённое значение из манифеста и то, чего сейчас хочет пресет:
Conflict 1/2: rules.no-console
Local: "warn"
Manifest (was): "off"
Preset (would be): "error"
▸ Accept preset
Keep local
Edit manually
Preview: "error"Разрешение конфликтов на всех страницах применяет весь пакет изменений (и ваши решения, и уже запланированные неконфликтующие изменения для этого инструмента) одной записью — инструмент, который вы трогали здесь, оказывается полностью синхронизирован, а не наполовину.
Коды возврата
| Код | Значение |
|---|---|
0 | Успех — изменения не нужны, изменения применены, либо (для status) просто зафиксировано наблюдение |
1 | Неразрешённый конфликт (только sync) — также код возврата для обычной ошибки в аргументах командной строки (неизвестный флаг, отсутствующий обязательный аргумент) на любой команде, не только конфликта sync |
2 | Ошибка выполнения — файл/пресет не найден, неподдерживаемый формат, ошибка разбора, правку невозможно сделать безопасно |
3 | Только пакетный режим (--all): проекты разошлись по коду возврата |
Та же таблица применима к sync, status, init, get, set, unset и migrate — хотя на практике get/set/unset/migrate возвращают только 0 или 2 (у них нет понятия «конфликт» или пакетного запуска).