Verifies the JobyKit wrapper contract for this app.
Checks every component registered in the host's DesignManifest:
- Every entry points at a real Phoenix function component
(
:manifest_drift). - Every wrapper carries
data-component="Module.function"on its root element (:missing_data_component). - Every wrapper declares
attr :rest, :global(:missing_rest_global).
Plus two sweeps across the host's source tree:
- any function that carries
data-component=...but is not registered in the manifest (:unregistered_wrapper) — i.e. wrappers invisible to/design.jsonand to agents. - any raw
<button>/<input>/<textarea>/<select>in.heexor~Hblocks outside a wrapper definition (:raw_html_primitive). Silence per-line with<%!-- jobykit:allow-raw-html --%>(heex) or# jobykit:allow-raw-htmlon the preceding.exline.
Usage
mix joby_kit.lint
mix joby_kit.lint --format json
mix joby_kit.lint --manifest MyAppWeb.DesignManifest
mix joby_kit.lint --paths "lib/**/components/**/*.ex"
mix joby_kit.lint --strict # warnings count as failuresOptions
--manifest— manifest module to lint. Defaults to<App>Web.DesignManifestderived frommix.exs.--paths— glob pattern(s) to scan for unregistered wrappers and raw HTML primitives. Repeatable. Defaults tolib/**/*.exandlib/**/*.heex.--format—text(default) orjson.--strict— exit non-zero on warnings as well as errors.
Exit codes
0— clean.1— at least one error (or any violation under--strict).