Skip to content

Command line

abilian-ds {sync,lint,tokens}

Paths come from [tool.abilian-ds] in pyproject.toml, so in a configured project the commands take no flags.

sync

Copy the stylesheet and macros into the project tree.

abilian-ds sync
flag default
--target static/css/ads where the stylesheet lands
--components templates/ads where the macros land

Writes 17 files. The @import tree's shape is preserved, so ads.css can reach its parts; the css/ segment itself is flattened away, so you link static/css/ads/ads.css rather than static/css/ads/css/ads.css.

lint

abilian-ds lint

Exit code 1 if there are findings. See The linter for the rules.

flag default
paths templates templates or directories to check
--stylesheet the vendored ads.css sheets that define the vocabulary; name your own when the design layer is external
--theme static/css/ads where sync put the stylesheet
--components templates/ads where sync put the macros
--usage extra files that may name a class (Python, JS)
--prefix flag classes with this prefix that no template uses
--allow .abilian-ds-allow project allowlist
--app module:attr of a Litestar app, enabling the endpoint check

--usage for classes assembled in Python

A tone chosen in a view, a state class a script adds. unknown-class stays strict about class= attributes; unused-class asks a different question — is this dead? — and accepts a mention anywhere that ships.

tokens

abilian-ds tokens                              # regenerate TOKENS.md
abilian-ds tokens --check                      # fail if stale
abilian-ds tokens --docs docs/src/reference    # also the documentation reference pages
flag default
--out TOKENS.md
--check off fail if the file is stale, for CI
--docs also write knobs.md, tokens.md, components.md there

--check belongs in CI. It once passed for months against a document describing a design system that had been deleted — the generator read the dead file, the document was its output, and the check compared the two. A gate whose two sides are wrong together is quieter than no gate at all, which is why there is now also a test asserting the document lists every class the stylesheet defines.

Configuration

[tool.abilian-ds]
templates = ["templates", "components"]
theme = "static/css/ads"
components = "templates/ads"
usage = ["app.py"]
prefix = "ads-"
allow = ".abilian-ds-allow"
app = "myapp.main:app"
stylesheet = ["static/css/ads/ads.css"]   # only if you are not using sync's default