All rules
Each rule below has its own page. The list comes from the rules table in packages/rules/README.md, and each page adds the rule’s metadata and docs from packages/rules. The checks guide shows how they run.
| Rule | Tool | Catches | Enable via |
|---|---|---|---|
| comment-discipline | ESLint | Top-level narrative, multiline comments, adjacent groups; keeps one-line whys beside code | configs.recommended |
| no-broken-relative-links | ESLint | Relative Markdown links to untracked paths | @house-rules/rules/markdown |
| design-no-raw-color | ESLint | Raw hex, rgb(), hsl(), etc. in CSS | design() factory |
| design-no-raw-color-literal | ESLint | Raw hex, rgb(), hsl(), etc. in JS/TS strings | design() factory |
| design-no-unknown-token | ESLint | var(--name) with no definition |
design() factory |
| design-scale-value | ESLint | CSS values off a fixed scale | design() factory |
| use-case-is-capability | ESLint | A use-case file that does not export exactly one implement(...) capability, exports a second contract, or exports another value |
configs.capability |
| no-hand-rolled-surface | ESLint | Tool.make, Rpc.make, or HttpApiEndpoint.<method> outside packages/capability/** |
configs.capability |
| no-cycles | Dependency Cruiser | Circular imports | layout({ scope }) |
| packages-do-not-import-apps | Dependency Cruiser | Packages importing apps | layout({ scope }) |
| apps-do-not-import-other-apps | Dependency Cruiser | Apps importing other apps | layout({ scope }) |
| packages-imported-by-name | Dependency Cruiser | Local imports of packages by path instead of name | layout({ scope }) |
| packages-public-entry-only | Dependency Cruiser | Imports of package internals | layout({ scope }) |
| delivery-does-not-import-server | Dependency Cruiser | Delivery layer importing server layer | layout({ scope }) |
| server-does-not-import-delivery | Dependency Cruiser | Server layer importing delivery layer | layout({ scope }) |
| use-cases-do-not-import-outer-layers | Dependency Cruiser | Use-cases importing delivery or server | layout({ scope }) |
| no-unresolved-deep-package-imports | Dependency Cruiser | Unresolved deep package imports | layout({ scope }) |
| production-does-not-import-tests | Dependency Cruiser | Production code importing tests | layout({ scope }) |
| tests-live-in-tests-dir | Dependency Cruiser | Test files outside tests/ folders | layout({ scope }) |
| tests-do-not-import-internals | Dependency Cruiser | Tests importing package internals | layout({ scope }) |
| no-unresolved-imports | Dependency Cruiser | Unresolved imports | layout({ scope }) |
| app-code-in-layers | Dependency Cruiser | App code outside layer folders | layout({ scope }) |
| use-cases-do-not-import-use-cases | Dependency Cruiser | Use-case importing another use-case | layout({ scope }) |
| no-ownerless-files | Dependency Cruiser | utils/, helpers/, misc/ files or folders |
layout({ scope }) |
| Strict compiler flags | TypeScript | 15 flags: strict, noUncheckedIndexedAccess, exactOptionalPropertyTypes, and more |
tsconfig/strict.json |
| Effect diagnostics | TypeScript | 31 diagnostics set to error | tsconfig/effect.json |
| noReExportAll | Biome | export * from |
@house-rules/rules/biome |
| noExcessiveLinesPerFile | Biome | Files over 300 lines (warn) | @house-rules/rules/biome |
| noNonNullAssertion | Biome | ! non-null assertions |
@house-rules/rules/biome |
| useFilenamingConvention | Biome | Files not kebab-case or export | @house-rules/rules/biome |
| Formatter | Biome | indentWidth 2, lineWidth 100, indentStyle space | @house-rules/rules/biome |
| Exact pins | Node | Every dependency must be an exact version, workspace:<exact>, or a Git spec with full commit SHA |
house-rules-pins bin |
| house-rules-migrations | Node | Cross-module foreign keys, migrations or SQL strings that touch another package’s tables, .sql files outside <package>/migrations/ (a package’s fixtures/ and tests/ excepted), use-cases that open a transaction |
house-rules-migrations bin |