# packages/testing n8n's **test platform** — the infrastructure that decides what to test, runs it, and measures it. Each package is one concern; they compose rather than overlap. ## Packages | Package | Name | Purpose | Entry point | Consumed by | |---|---|---|---|---| | **rules-engine** | `@n8n/rules-engine` | Generic, typed rules engine for static-analysis tools (register → run → report). The shared substrate. | library | janitor, code-health | | **test-impact** | `@n8n/test-impact` | Test Impact Analysis: build the coverage→impact map, select impacted specs, distribute them across shards. Framework-agnostic. | library | janitor (CLI), playwright | | **janitor** | `@n8n/playwright-janitor` | Static analysis + architecture enforcement for the Playwright suite; also hosts the impact/orchestrate CLI used by CI. | `janitor` CLI | playwright, CI | | **code-health** | `@n8n/code-health` | Static analysis for monorepo dependency hygiene. | `code-health` CLI | CI | | **containers** | `n8n-containers` | Composable Docker stack for tests (sqlite / postgres / queue / multi-main / observability / kafka …). | `stack:*` scripts | playwright, local dev | | **playwright** | `n8n-playwright` | The E2E harness — page objects, composables, fixtures, and the shard distributor that drives CI. | `test:*` scripts | CI, local dev | | **performance** | `@n8n/performance` | Microbenchmarks for critical code paths (`bench`, baseline, compare). | `bench:*` scripts | CI (nightly), local | ## How they fit together ```mermaid graph TD rules[rules-engine
rules substrate] --> janitor[janitor
PW lint + impact CLI] rules --> codehealth[code-health
monorepo deps] impact[test-impact
select + distribute] --> janitor impact --> playwright[playwright
E2E harness] janitor --> playwright containers[containers
Docker stacks] --> playwright performance[performance
benchmarks] classDef substrate fill:#eef,stroke:#88a; class rules,impact substrate; ``` - **Static-analysis lane:** `rules-engine` (substrate) → `janitor` (Playwright architecture) and `code-health` (monorepo deps). - **Selection lane:** `test-impact` (coverage map → select → distribute) feeds the janitor CLI and the playwright shard distributor. - **Execution lane:** `playwright` runs E2E against `containers`-provided stacks. - **Performance lane:** `performance` is standalone (benchmarks). ## Where to look (quick nav for humans + agents) | I want to… | Go to | |---|---| | change which E2E specs a PR runs (impact map, selection, sharding) | `test-impact/` (+ `janitor` CLI `select` / `distribute`) | | add/modify an architecture-lint rule for tests | `janitor/src/rules/` (engine: `rules-engine/`) | | write or fix an E2E test, page object, or fixture | `playwright/` (see its `AGENTS.md`) | | spin a DB/queue/multi-main stack for a test | `containers/` (`stack:*`) | | add a microbenchmark | `performance/` | | enforce a monorepo dependency rule | `code-health/` | Per-package detail lives in each package's own `README.md` (and `playwright/AGENTS.md`).