Lint engine for JobyKit-installed apps. Verifies wrapper-contract invariants by introspecting a manifest module and scanning the host's component source files.
Rules
:manifest_drift(error) — a manifest entry points at a function that is not actually a Phoenix function component. Caught first because every other check depends on the entry being live.:missing_data_component(error) — a registered wrapper does not carrydata-component="Module.function"in its source.:missing_rest_global(warning) — a registered wrapper does not declareattr :rest, :global, blocking pass-through of phx- and aria- attributes from callers.:unregistered_wrapper(warning) — a function carries adata-component="..."attribute but is not registered in the manifest, making it invisible to/design.jsonand to agents.:raw_html_primitive(warning) — a.heextemplate (or~Hblock in a.ex) contains a raw<button>,<input>,<textarea>, or<select>outside of a wrapper definition. The kit ships wrappers for all four; reaching past them drops the contract. Whole-file skipped when the file containsdata-component=(i.e., defines wrappers). Per-line opt-out via<%!-- jobykit:allow-raw-html --%>(or# jobykit:allow-raw-htmlon the preceding line for.exfiles).
Each violation is a map with :rule, :severity, :message,
:file, :line, :module, :function. The engine is pure data —
formatting and exit codes live in Mix.Tasks.JobyKit.Lint.
Summary
Types
Functions
Run the lint engine. Returns a list of violations in deterministic order (drift first, then per-entry checks in manifest declaration order, then unregistered wrappers sorted by data-component string).
Options
:manifest— required. The host's manifest module (use JobyKit.Manifest).:paths— list of glob patterns to scan for the unregistered- wrapper rule. Defaults to["lib/**/*.ex"]. Patterns are resolved relative tocwd.