skif-cli 0.2.0

Command-line interface for skif, a dependency and package-manager linter for JS/TS monorepos.
Documentation
---
source: crates/skif-cli/tests/cli.rs
expression: json.stdout
---
{
  "version": 1,
  "skif": "0.2.0",
  "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`."
    },
    {
      "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": "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 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 declared in one package are on different versions."
    },
    {
      "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."
    },
    {
      "id": "unresolved-imports",
      "category": "js",
      "default": "error",
      "fixable": "none",
      "summary": "An import specifier does not resolve to a file or a package."
    },
    {
      "id": "unlisted-binaries",
      "category": "js",
      "default": "warning",
      "fixable": "none",
      "summary": "A script 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": "unsafe",
      "summary": "A project file is not reachable from any entry file."
    },
    {
      "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."
    }
  ]
}