Changelog - 2026-10-21
One lint command, .configs split by job, and a library preset
Feature Breaking ChangeIn 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.jsonWhat changed
devz lint [--fix] [files].@venizia/dev-configsships adevzcommand. 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.ignoreskips 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'stsconfig.build.jsonandtsconfig.esm.json, an app's Vite config, and thetsconfig.app.json,tsconfig.node.jsonandtsconfig.test.jsona solutiontsconfig.jsonreferences.tsconfig.jsonis the only tsconfig left at the project root;.configs/vulcan.config.mtsstays too.- A
.ignoreper folder..configs/lints/.ignorelists the paths oxlint and ESLint skip;.configs/formatters/.ignorethe paths oxfmt skips. One gitignore-style pattern per line, relative to the project.ignorePatternsinside 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:exportspoints atsrc/index.ts,@venizia/ignisis a peer, and its scripts aretypecheck,lint,lint:fix,testandclean. Without--appor--lib, VULCAN asks in a terminal and refuses elsewhere.
Who is affected
| You have | Do 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.mjs | Move them to .configs/lints/ |
.configs/oxfmt.config.mts | Move it to .configs/formatters/ |
.configs/vite.config.ts | Move 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.json | Move them to .configs/builders/ and add one ../ to each relative path inside them |
tsconfig.app.json, tsconfig.node.json, tsconfig.test.json at the root | Move 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 line | Put them in .configs/lints/.ignore and .configs/formatters/.ignore |
An editor setting that points at a config, such as oxc.configPath | Point 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.shjson
{
"scripts": {
"lint": "devz lint",
"lint:fix": "devz lint --fix"
}
}The full layout and the command table are in Tooling Configuration.