SnagBadgerA little help for every snag.

no-private-imports#

Call another module through its supported entries. Importing private implementation couples callers to details that the owning module must be free to change.

// Valid external interface
import '@snagbadger/capture';
// Invalid cross-module implementation access
import '../../capture/src/internal/recording.js';
// Valid within the owning module
import './internal/recording.js';

The error identifies the owning module and its supported entries. Static imports, type imports, named/star re-exports, literal dynamic imports, import types, and TypeScript import-equals declarations are checked. Resolution uses the importing file's nearest tsconfig (including paths/extends) and TypeScript's actual resolver; workspace names map to the source entries in tooling/architecture/policy.mts. Relative unresolved paths into private trees are rejected too. There is no fixer or suggestion: replacing a private import with a public one can change behavior.

Computed dynamic paths cannot be resolved by this rule. The repository graph check owns such edges and the broader supported-entry, loading, and dependency policy. This rule is intentionally not a general unresolved-import checker.

Maintaining rules#

Use the pinned @typescript-eslint/utils RuleCreator for typed metadata, AST listeners, and message IDs. Add the rule to tooling/eslint/index.mts, enable it as an error in eslint.config.mjs, and provide documentation here. First check whether an enabled upstream rule already covers the behavior reliably.

Add valid and invalid regression cases to a *.test.mts suite using the official @typescript-eslint/rule-tester. Resolver cases must create real isolated files and tsconfig aliases, not mock path matching. Assert diagnostic IDs and output: null for rules without safe fixes; any future fix needs explicit output tests. The Node test runner executes these tooling tests without changing the module or browser harness. Run pnpm test:rules, then pnpm verify. Prototypes use exactly the same configuration and severity as other source.

Authoring references: custom rules and RuleTester.