Skip to content

LintSync

v0.1.0CLI ToolNode.js

A CLI that keeps ESLint, Prettier, and Stylelint configs in sync with a shared preset — across one project or many — without losing local overrides.

LintSync
Get started →
npm install -g lintsync
01 — Purpose

When you'd reach for this

A shared ESLint/Prettier/Stylelint setup is easy to write once and hard to keep in sync — one project gets a manual tweak, the next repo copies an outdated version, and a few months later no two projects agree on the same rules anymore. lintsync writes preset rules directly into your existing config files, tracks which keys it owns, and asks before overwriting anything you changed by hand.

A rule changes in the shared preset, and every repo needs to catch up by hand

lintsync sync compares each project's actual config against the preset and writes only the keys that are safe to update — the ones you haven't touched yourself.

A rule you tuned by hand risks getting silently overwritten by the next update

A key that differs from both the manifest and the current preset is a conflict, not a silent overwrite — sync stops and asks (interactively, in a real terminal) or fails safely (in CI), instead of guessing which value should win.

Nobody remembers what a project's ESLint config looked like before the last manual edit

lintsync get/set/unset edit one field directly, and deliberately leave the manifest untouched — a manual edit is exactly the kind of change that should surface as a conflict on the next sync, not disappear silently.

An old `.eslintrc.json` needs to become a modern flat config across a dozen legacy projects

migrate converts a legacy config to a new format or location without deleting the source or guessing at anything it can't move safely — ESLint's rules carry over automatically, everything else is flagged for manual review.

Checking config drift across fifteen repos means opening fifteen terminals

A registry of known projects lets status/sync --all run against every one of them at once, filterable by tag, with one aggregate exit code CI can act on.

A shared ESLint config as its own npm package is one more thing to version and publish

Presets live inside lintsync itself — built in, or built once interactively and saved locally — so there's no separate config package to publish, version, or keep in sync with lintsync's own releases.

02 — Features

At a glance

Init from a preset

Init from a preset

lintsync init --preset=vue-app installs dependencies, generates ESLint/Prettier/Stylelint config files, and wires up lint/lint:fix/format npm scripts — in one command. Without --preset in a real terminal, an interactive menu opens: a built-in preset, individual tools with generic defaults, or building a new preset from scratch.

Sync and conflict resolution

Sync and conflict resolution

lintsync sync applies safe changes quietly and opens an interactive TUI for conflicts — paged one at a time, with a live preview of the result for each of three choices: accept the preset, keep the local value, or edit manually.

Point edits to a config field

Point edits to a config field

get/set/unset read and write a single field by path, like eslint.rules["@typescript-eslint/no-unused-vars"] — a point edit, not a full-file rewrite, with everything else in the file left exactly as it was.

Migrating legacy configs

Migrating legacy configs

migrate eslint --to flat and its Prettier/Stylelint equivalents move a config to a new format or location, never deleting the source or overwriting an existing target — anything that can't be moved safely is flagged for manual review instead.

A constructor for your own presets

A constructor for your own presets

An interactive wizard inside init builds a preset from live data: Prettier's options straight from its own getSupportInfo(), and roughly 80 Stylelint rules sourced from the official -recommended/-standard configs. The finished preset is saved locally and available in every project on the machine.

Batch mode across a project registry

Batch mode across a project registry

lintsync projects add/sync --all/status --all keep a tagged list of known projects and run a check across all of them at once — with a distinct exit code for when projects disagree on the result.