rl-lint
node integrations/ci/bin/rl-lint.mjs [paths] (default .; it skips node_modules, dist, .next and similar). It is heuristic and line-based and follows the extraction rules (EXTRACTION_SPEC.md v1). Warnings do not fail the run unless you pass --strict or --max-warnings; RL001 is an error.
| Rule | Finds | Spec section |
|---|---|---|
| RL001 (error) | a committed rl_sec_ key (never printed in full) | |
| RL101 | translate="false" and class="no-translate": markers the extractor ignores | 2 |
| RL102 | words inside <noscript> or <template> | 2 |
| RL103 | words in SVG <text> | 2 |
| RL104 | <img> without alt | 7 |
| RL105 | words in attributes that are not extracted (data-tooltip, aria-description, <option label>, meta keywords, ...) | 7 |
| RL106 | a word split by an inline element (Hel<span>lo</span>) | 3 |
| RL107 | text assigned at runtime from a literal (textContent =, alert()), which build-time prerender cannot see | |
| RL108 | a sentence built with + or ${} | 5 |
| RL109 | several unnumbered %s or %d | 5 |
| RL110 | words in CSS content: | |
| RL111 | <html> without lang |
The extractor honours translate="no" and the class notranslate; RL101 flags the look-alike markers it does not honour (see Strings and keys).
Silencing and formats#
Silence one finding with rl-lint-disable-next-line RL105 in a comment on the line above (or rl-lint-disable-line), or a whole rule with --ignore RL104. Formats: --format text|github|json. In CI: node integrations/ci/bin/rl-lint.mjs . --format github.
Hooks#
lint/git-pre-commit.sh (a plain git hook for staged files), lint/pre-commit-config.example.yaml (a local hook for pre-commit.com) and lint/pre-commit-hooks.yaml (a definition for a future hook repository). The hook checks the working-tree copy of staged files.
Known limits#
No real HTML or JavaScript parsing, so templates with unusual syntax can produce false positives.