---
source: crates/skif-cli/tests/cli.rs
expression: redact_version(&json.stdout)
---
{
"version": 1,
"skif": "[VERSION]",
"rules": [
{
"id": "empty-dependencies",
"category": "manifest",
"default": "error",
"fixable": "safe",
"summary": "A dependency section (`dependencies`, `devDependencies`, `peerDependencies`, `optionalDependencies`) is an empty object."
},
{
"id": "root-package-private-field",
"category": "manifest",
"default": "error",
"fixable": "safe",
"summary": "The root `package.json` must set `\"private\": true` so it cannot be published by accident."
},
{
"id": "root-package-manager-field",
"category": "manifest",
"default": "error",
"fixable": "none",
"summary": "The root `package.json` must declare the package manager in `packageManager` or `devEngines.packageManager`."
},
{
"id": "root-package-dependencies",
"category": "manifest",
"default": "warning",
"fixable": "unsafe",
"summary": "The root package should only have `devDependencies`; runtime dependencies belong to the packages that use them."
},
{
"id": "types-in-dependencies",
"category": "manifest",
"default": "error",
"fixable": "unsafe",
"summary": "A private package lists `@types/*` packages in `dependencies`; type packages belong in `devDependencies`."
},
{
"id": "member-toolchain-fields",
"category": "manifest",
"default": "warning",
"fixable": "unsafe",
"summary": "Private member packages should not declare `packageManager` or `engines`; the root package owns the toolchain."
},
{
"id": "incompatible-peer-dependencies",
"category": "manifest",
"default": "warning",
"fixable": "none",
"summary": "The version a package installs in `devDependencies` does not satisfy the range it declares in `peerDependencies`."
},
{
"id": "unsorted-dependencies",
"category": "manifest",
"default": "error",
"fixable": "safe",
"summary": "The entries of a dependency section are not in alphabetical (byte) order."
},
{
"id": "unmatched-workspace-patterns",
"category": "workspace",
"default": "warning",
"fixable": "unsafe",
"summary": "A workspace pattern does not match any directory."
},
{
"id": "missing-package-manifest",
"category": "workspace",
"default": "warning",
"fixable": "unsafe",
"summary": "A directory matched by the workspace patterns has no `package.json`, or in a Bun workspace one without a `name`, which Bun does not install."
},
{
"id": "stray-lockfile",
"category": "workspace",
"default": "warning",
"fixable": "unsafe",
"summary": "A lockfile other than the root lockfile of the package manager: one in a workspace member, another manager's at the root, or one its manager ignores next to the one it reads (Bun's `bun.lockb` beside `bun.lock`, npm's `package-lock.json` beside `npm-shrinkwrap.json`)."
},
{
"id": "nested-workspace-root",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "A workspace member holds a `pnpm-workspace.yaml` of its own, so installs in that directory leave the workspace, or in a Bun workspace a `package.json` that declares `workspaces`, which Bun never installs; or a member is a Bazel convenience link (`bazel-<name>`) a workspace pattern follows."
},
{
"id": "local-path-dependency",
"category": "manifest",
"default": "error",
"fixable": "sometimes",
"summary": "A dependency points at a path on disk (`link:`, `file:`, `portal:` or a relative path) instead of a registry or workspace version."
},
{
"id": "package-json-format",
"category": "manifest",
"default": null,
"fixable": "sometimes",
"summary": "A `package.json` is not formatted as `[format]` describes: key order, sorted fields, `exports` conditions, shorthand `bugs` and `repository`, and the indent. The fix is unsafe when `sort-exports` reorders conditions other than `types` and `default`."
},
{
"id": "stale-patched-dependencies",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "A `patchedDependencies` entry no longer applies, names a missing file or lies outside the allowed paths, or a patch file is left over."
},
{
"id": "invalid-workspace-file",
"category": "workspace",
"default": "error",
"fixable": "none",
"summary": "A member `package.json`, a workspace pattern or `.yarnrc.yml` cannot be read, so part of the workspace is not linted."
},
{
"id": "stale-lerna-config",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "`lerna.json` sets `useWorkspaces` or lacks `version`, which Lerna 7 and later reject, or a script runs `lerna bootstrap`, `lerna add` or `lerna link`, which Lerna 9 removed."
},
{
"id": "lerna-packages-mismatch",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "The `packages` of `lerna.json`, which Lerna reads before the package manager's workspaces, select other packages than the workspace declaration."
},
{
"id": "version-mismatch",
"category": "policy",
"default": "error",
"fixable": "sometimes",
"summary": "A dependency instance differs from the version its version group requires (highest, lowest, pinned, local or snapped)."
},
{
"id": "banned-dependency",
"category": "policy",
"default": "error",
"fixable": "unsafe",
"summary": "A dependency is declared, or resolved by the lockfile, although a banned version group forbids it."
},
{
"id": "semver-range-mismatch",
"category": "policy",
"default": "error",
"fixable": "unsafe",
"summary": "A dependency uses a semver range other than the one its semver group requires."
},
{
"id": "policy-conflict",
"category": "policy",
"default": "warning",
"fixable": "sometimes",
"summary": "Two policies require incompatible outcomes for one dependency, or a group cannot be applied as configured."
},
{
"id": "invalid-local-version",
"category": "policy",
"default": "error",
"fixable": "none",
"summary": "A workspace package has a `version` that is not an exact semver version, so dependents cannot align with it."
},
{
"id": "catalog-not-used",
"category": "catalog",
"default": "warning",
"fixable": "sometimes",
"summary": "A dependency that has a catalog entry is declared with a version instead of `catalog:`."
},
{
"id": "catalog-mismatch",
"category": "catalog",
"default": "warning",
"fixable": "sometimes",
"summary": "A dependency is declared with a version while other packages take it from a catalog."
},
{
"id": "catalog-missing-entry",
"category": "catalog",
"default": "warning",
"fixable": "sometimes",
"summary": "A dependency that should come from a catalog has no catalog entry."
},
{
"id": "catalog-version-divergence",
"category": "catalog",
"default": "warning",
"fixable": "none",
"summary": "Packages take one dependency from catalogs that resolve to different versions."
},
{
"id": "unresolved-catalog-references",
"category": "catalog",
"default": "error",
"fixable": "none",
"summary": "A `catalog:` specifier names a catalog or an entry that does not exist."
},
{
"id": "unused-catalog-entries",
"category": "catalog",
"default": "warning",
"fixable": "unsafe",
"summary": "A catalog entry that no manifest references; reported only when `[catalog] report-unused-entries` is `true`."
},
{
"id": "workspace-protocol",
"category": "policy",
"default": "error",
"fixable": "none",
"summary": "A dependency on a workspace package does not use the `workspace:` protocol."
},
{
"id": "unsynced-dependency-family",
"category": "policy",
"default": "error",
"fixable": "none",
"summary": "Members of a dependency family are on different versions in one package, or as resolved by the lockfile."
},
{
"id": "toolchain-pin-drift",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "Node and package-manager versions pinned in version files, Dockerfiles, CI workflows and Bazel module files must match the root's."
},
{
"id": "foreign-package-manager-command",
"category": "workspace",
"default": "warning",
"fixable": "none",
"summary": "Dockerfiles, CI workflows and shell scripts must not run a package manager other than the workspace's."
},
{
"id": "unused-dependencies",
"category": "js",
"default": "error",
"fixable": "unsafe",
"summary": "A package in `dependencies` is never imported, required or run by a script; `optionalDependencies` are not checked."
},
{
"id": "unused-dev-dependencies",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "A package in `devDependencies` is never imported, required or run by a script."
},
{
"id": "unlisted-dependencies",
"category": "js",
"default": "error",
"fixable": "none",
"summary": "A file imports a package that neither its `package.json` nor any `package.json` above it lists. An import that only the tsconfig `paths` of another package map has the detail `ForeignTsconfigPaths`: it needs a mapping, not a dependency. A package a tool config names (a tsconfig `extends`, an ESLint or Oxlint plugin, a Prisma generator) is reported at the config with the detail `ConfigReference`."
},
{
"id": "unresolved-imports",
"category": "js",
"default": "error",
"fixable": "none",
"summary": "An import specifier does not resolve to a file or a package."
},
{
"id": "stale-mocks",
"category": "js",
"default": "error",
"fixable": "none",
"summary": "A test-runner mock names a relative or aliased module that does not exist."
},
{
"id": "unlisted-binaries",
"category": "js",
"default": "warning",
"fixable": "none",
"summary": "A script, or a command in a workflow, tool config or source file, runs a binary that no listed dependency provides."
},
{
"id": "unused-optional-peer-dependencies",
"category": "js",
"default": "warning",
"fixable": "none",
"summary": "An optional peer dependency is imported but not installed as a dependency or dev dependency."
},
{
"id": "unused-files",
"category": "js",
"default": "warning",
"fixable": "sometimes",
"summary": "A project file is not reachable from any entry file."
},
{
"id": "unused-subpath-imports",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "A `package.json` `imports` entry is not imported by any file of its package."
},
{
"id": "unused-subpath-exports",
"category": "js",
"default": null,
"fixable": "none",
"summary": "A `package.json` `exports` subpath is not imported by any workspace package."
},
{
"id": "unused-exports",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "An exported value is not imported by any other module."
},
{
"id": "unused-types",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "An exported type or interface is not imported by any other module."
},
{
"id": "unused-namespace-exports",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "An exported value of a module that is only read through a namespace import is never accessed."
},
{
"id": "unused-namespace-types",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "An exported type of a module that is only read through a namespace import is never accessed."
},
{
"id": "unused-enum-members",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "A member of an exported enum is never read."
},
{
"id": "unused-namespace-members",
"category": "js",
"default": "warning",
"fixable": "unsafe",
"summary": "An exported member of a TypeScript namespace is never read."
},
{
"id": "duplicate-exports",
"category": "js",
"default": "warning",
"fixable": "none",
"summary": "One binding is exported under several names."
},
{
"id": "circular-imports",
"category": "js",
"default": null,
"fixable": "none",
"summary": "Modules import each other in a cycle."
},
{
"id": "unparseable-files",
"category": "js",
"default": "warning",
"fixable": "none",
"summary": "A file reachable from an entry file has a syntax error the parser could not recover from."
},
{
"id": "stale-js-config",
"category": "js",
"default": "warning",
"fixable": "none",
"summary": "A `[js]` setting matched nothing or is redundant, a published entry file is missing, or many files are unused."
}
]
}