Documentation menu
Rules
All 33 rules, with the severity each one has at every strictness preset. Every finding prints its rule id, so you always know what to change.
little-owl config --rulesThat prints the same table for your project, resolved against your own configuration. Change any severity to off, info, warning or error under rules in your config file.
Architecture
Dependencies pointing the wrong way, loops, and boundaries that were supposed to hold.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
architecture/circular-dependencyFiles that import each other, directly or through a chain. Found with Tarjan's algorithm. Type-only imports are excluded, and so is a Python package whose __init__.py re-exports its own submodules — that loop is idiomatic and resolves lazily. | error | error | error |
architecture/layer-violationA lower layer importing a higher one — for example data importing UI. | error | error | error |
architecture/layer-skipA layer reaching past its neighbour, such as UI importing the database directly. Only when layerPolicy is 'adjacent'. | info | warning | error |
architecture/cross-feature-importOne feature reaching into another feature's internals. Requires a feature root, configured or inferred. | info | warning | error |
architecture/forbidden-dependencyAn import matching a pair you listed in architecture.forbidden. | error | error | error |
architecture/deep-import-chainAn entry point whose transitive import chain is longer than maxImportDepth. | off | info | info |
next/server-import-in-clientA 'use client' module importing a package that only runs on the server, such as node:fs, pg or nodemailer. Calling a server action is not reported — that is the pattern working as designed. | error | error | error |
Complexity
Size and branching, measured from a syntax tree rather than a line count.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
complexity/large-fileA file past the configured line budget. | warning | warning | warning |
complexity/large-functionA function longer than maxFunctionLines. Components are excluded. | warning | warning | warning |
complexity/large-componentA React component past its own budget, which is separate because components are legitimately longer. | warning | warning | warning |
complexity/high-complexityA function with more independent branches than maxComplexity. | warning | warning | warning |
complexity/deep-nestingControl flow nested past maxNesting inside a single function. | off | info | warning |
complexity/too-many-paramsA long list of positional parameters, which is easy to call wrongly. | off | info | warning |
go/large-packageA Go package that has grown far past the file budget. | info | info | info |
Maintainability
Copies that drift apart, imports that go nowhere, and effects that run too often.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
maintainability/duplicate-blockIdentical blocks of code appearing in more than one place. Overlapping matches are merged, so a thirty-line copy-paste is one finding rather than two dozen. | off | info | warning |
maintainability/unresolved-importAn import matching neither a project file nor a declared package. Asset imports such as CSS and images are not reported. | info | info | info |
react/effect-dependency-riskuseEffect called with no dependency array, so it re-runs after every render. | info | info | warning |
Structural patterns
Shapes that appear when code is changed without seeing the whole project. These describe structure only — never who wrote it.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
patterns/duplicate-helperThe same helper name defined and exported in more than one file. | warning | warning | warning |
patterns/parallel-implementationsTwo modules implementing the same set of names, reported once rather than once per name. A facade that selects between them is not reported. | info | warning | warning |
patterns/thin-wrapperA module whose only job is forwarding a call to another module. | off | info | warning |
patterns/abstraction-growthA directory that has filled up with small modules each used exactly once. | off | info | warning |
Type safety
The escape hatches, counted per file rather than flagged individually.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
type-safety/explicit-anyA file leaning on `any` often enough to lose type coverage. | info | warning | warning |
type-safety/suppression@ts-ignore, which stays silent even after the underlying error is gone. @ts-expect-error is not reported. | warning | warning | warning |
type-safety/unsafe-assertionAssertions through any or unknown, which are never verified at runtime. | off | info | warning |
type-safety/js-in-ts-projectPlain JavaScript files inside a project set up for TypeScript. | off | info | warning |
Dependencies
Hygiene, not security. For vulnerabilities, run your package manager's audit.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
dependencies/major-version-changeA dependency whose major version moved in this change. | warning | warning | warning |
dependencies/new-dependencyDependencies added by this change. | off | info | warning |
dependencies/unused-dependencyA declared runtime dependency nothing imports. Type definitions, linters and build tooling are excluded. | off | info | info |
dependencies/duplicate-dependencyA package declared in both dependencies and devDependencies, so which version wins depends on the package manager. | warning | warning | warning |
Python
Line-based checks. Not a replacement for Ruff.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
python/bare-except`except:` blocks that swallow every exception, including KeyboardInterrupt. | warning | warning | warning |
python/mutable-defaultMutable default arguments, evaluated once and shared between calls. | warning | warning | warning |
python/global-stateFunctions rebinding module-level state with `global`. | info | info | info |
Go
Line-based checks. Not a replacement for golangci-lint.
| Rule | Relaxed | Balanced | Strict |
|---|---|---|---|
go/ignored-errorA return value discarded with `_`, which in Go is usually a dropped error. | warning | warning | warning |