name: polylith-check
description: Validate a Polylith workspace with poly check — the canonical CI gate. Verifies brick imports against project pyproject.tomls, third-party library declarations vs. the lock file, and (under --strict) cross-project version consistency. Exits 1 on failure. Use when the user wants to lint, validate, verify, or CI-gate a Polylith workspace.
Check Skill
Quick command
uv run poly check
Command prefix: If you do not know the package manager, list lock files with ls uv.lock poetry.lock pdm.lock 2>/dev/null (a pyproject.toml is always present, so it tells you nothing on its own). Use uv run poly (uv), poetry poly (poetry), pdm run poly (pdm), hatch run poly (hatch), or poly (activated venv). Examples below use uv run.
⚠ Run
poly syncfirst if bricks have been added/removed since the last commit, otherwise sync-related findings will dominate the report. Loadpolylith-syncif needed. ⚠ Exit code 1 = failure — this is the right command to wrap in CI.
Typical CI usage
uv run poly sync --quiet # Make sure brick lists are current (--quiet avoids the interactive prompt)
uv run poly check # Validate; build fails if non-zero
# (Optional) scope test runs to bricks whose implementation changed.
# `poly diff --bricks --short` emits a comma-separated list, which becomes a
# pytest `-k` expression (`log,message` → `pytest -k "log or message"`).
changes="$(uv run poly diff --bricks --short)"
[ -n "$changes" ] && uv run pytest -k "${changes//,/ or }"
Use
poly diff(implementation diff) for "run tests for what changed". Usepoly test diff --shortif you specifically want to scope on test-code changes — loadpolylith-testingfor that variant. Both feed the samepytest -krecipe.
What it verifies
- Every brick imported by another brick is listed in the consuming project's
[tool.polylith.bricks]. - Every third-party library imported by a project's bricks is declared in that project's
dependenciesand present in the lock file.
Command reference
| Option | Default | Description |
|---|---|---|
--strict |
false |
Stricter name/version matching across projects (catches version drift). |
--verbose |
false |
Print extra context, including lock-file lookups. |
--quiet |
false |
Suppress output. Exit code unchanged. |
--alias |
— | Comma-separated import_name=package_name aliases. |
--directory |
cwd | Limit the check to projects whose path matches this directory. |
Examples
# Standard CI gate
uv run poly check
# One project only
uv run poly check --directory projects/user_api
Common failure modes & Auto-Fixes
- Missing Brick Error: If the error says a brick imports another brick that isn't in
[tool.polylith.bricks]→ runpoly sync(loadpolylith-sync). - Missing Dependency Error: If the error says a brick imports a third-party library not listed in the project's
dependencies→ loadpolylith-dependency-managementand add the library to the project'spyproject.toml. - Version Drift Error: Under
--strict, if versions of the same library diverge between projects → inspectpyproject.tomlor loadpolylith-libsto find the drift, then align versions (or rely on a single root lock file).