Skip to content

Changelog - 2026-10-21 ​

One lint command, .configs split by job, and a library preset ​

Feature Breaking Change

In one line. Lint with devz lint, keep each tool's settings in its own .configs/ folder, and create a shared library with vulcan add --preset ignis --lib <name>.

my-app/
├── .configs/
│   ├── lints/        oxlint.config.mts  eslint.config.mjs  .ignore
│   ├── formatters/   oxfmt.config.mts   .ignore
│   └── builders/     vite.config.mts  (or tsconfig.build.json, tsconfig.esm.json)
├── package.json      "lint": "devz lint", "lint:fix": "devz lint --fix"
└── tsconfig.json

What changed ​

  • devz lint [--fix] [files]. @venizia/dev-configs ships a devz command. It runs oxlint, ESLint, then oxfmt, and stops at the first tool that fails. With file paths it handles only those files, which is what a pre-commit hook passes. Files the tools do not handle (.md, .json) are dropped, and a listed file that a .ignore skips passes quietly.
  • .configs/ is split by job. The oxlint and ESLint configs move to .configs/lints/, the oxfmt config to .configs/formatters/. Every other tsconfig and the bundler config move to .configs/builders/: a library's tsconfig.build.json and tsconfig.esm.json, an app's Vite config, and the tsconfig.app.json, tsconfig.node.json and tsconfig.test.json a solution tsconfig.json references. tsconfig.json is the only tsconfig left at the project root; .configs/vulcan.config.mts stays too.
  • A .ignore per folder. .configs/lints/.ignore lists the paths oxlint and ESLint skip; .configs/formatters/.ignore the paths oxfmt skips. One gitignore-style pattern per line, relative to the project. ignorePatterns inside a .configs/ file never worked: oxlint and oxfmt resolve it against the config's own folder and refuse ...
  • The IGNIS preset has two kinds. vulcan add --preset ignis --app <name> creates an API, as before. vulcan add --preset ignis --lib <name> creates a shared library: exports points at src/index.ts, @venizia/ignis is a peer, and its scripts are typecheck, lint, lint:fix, test and clean. Without --app or --lib, VULCAN asks in a terminal and refuses elsewhere.

Who is affected ​

You haveDo this
"lint": "sh scripts/lint.sh"Change the scripts to "lint": "devz lint" and "lint:fix": "devz lint --fix", then delete scripts/lint.sh
.configs/oxlint.config.mts, .configs/eslint.config.mjsMove them to .configs/lints/
.configs/oxfmt.config.mtsMove it to .configs/formatters/
.configs/vite.config.tsMove it to .configs/builders/, add one ../ to every path the config builds from import.meta.url, and pass --config .configs/builders/vite.config.ts to vite
.configs/tsconfig.build.json, .configs/tsconfig.esm.jsonMove them to .configs/builders/ and add one ../ to each relative path inside them
tsconfig.app.json, tsconfig.node.json, tsconfig.test.json at the rootMove them to .configs/builders/, prefix their paths with ../../ (include, paths, tsBuildInfoFile, exclude), and point the references of tsconfig.json at ./.configs/builders/...
Paths to skip, in a config or on a lint command linePut them in .configs/lints/.ignore and .configs/formatters/.ignore
An editor setting that points at a config, such as oxc.configPathPoint it at the new path

vulcan doctor reports a config still left directly in .configs/ and names the folder it belongs in.

Migration ​

bash
mkdir -p .configs/lints .configs/formatters
git mv .configs/oxlint.config.mts .configs/eslint.config.mjs .configs/lints/
git mv .configs/oxfmt.config.mts .configs/formatters/
git rm scripts/lint.sh
json
{
  "scripts": {
    "lint": "devz lint",
    "lint:fix": "devz lint --fix"
  }
}

The full layout and the command table are in Tooling Configuration.