Skip to content

Sync и Status ​

Повседневная пара команд: status смотрит на расхождение с пресетом ничего не записывая, sync применяет безопасную часть этих изменений.

Проверка состояния ​

lintsync status показывает расхождение с пресетом, никогда ничего не записывая — read-only «сиблинг» команды sync --dry-run.

bash
lintsync status [options]
bash
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 сравнивает текущий проект с его пресетом и применяет безопасные изменения.

bash
lintsync sync [options]
bash
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:

bash
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 (у них нет понятия «конфликт» или пакетного запуска).