| name | mozlint |
| description | You MUST use this skill when working with Firefox's linting infrastructure (mozlint), adding new linters, modifying existing linters, running linters, or dealing with linting issues. |
Overview
Firefox's linting infrastructure (mozlint) provides a unified way to run various linters across the codebase. It integrates multiple linters including ESLint, Stylelint, ruff, clippy, clang-format, and many others.
Workflow
- Run
./mach lint without arguments to lint all modified files in your working directory
- Run
./mach lint --fix to automatically fix issues where possible
- Run
./mach lint <path> to lint specific files or directories
- Run
./mach lint --list to see all available linters
- Run
./mach lint --linter <name> to run a specific linter (e.g., ./mach lint --linter eslint)
- Use
./mach lint --outgoing to lint only outgoing changes (useful before pushing)
- Use
./mach lint --rev <rev> to lint changes in a specific revision
- Use
./mach lint --warnings to also show warnings, not just errors
Python linters
Python-based linters are the right choice when the linter primarily calls external programs (e.g., eslint, ruff, clang-format) or needs complex Python library integrations. They use types like external, string, regex, structured_log, or global, with a payload of the form module:function.
Adding New Linters
See docs/code-quality/lint/create.rst for the full guide on creating a new linter.
- Linter configurations are in
tools/lint/ directory
- Each linter has a YAML configuration file (e.g.,
tools/lint/eslint.yml, tools/lint/ruff.yml). Adding the YAML file is what registers the linter with mozlint.
- Python-based linters are typically in
tools/lint/python/
- To add a new linter:
- Create a YAML configuration in
tools/lint/
- If it's a custom linter, implement the Python module in
tools/lint/python/
- Add tests in
tools/lint/test/
- To run the full mozlint test suite (slow):
./mach python-test --subsuite mozlint --run-slow
- To run a single mozlint test:
./mach python-test --subsuite mozlint <test_name>
Common Linters
- eslint: JavaScript and JSX linting
- stylelint: CSS and related files linting
- ruff: Python linting and formatting
- clippy: Rust linting
- clang-format: C/C++ code formatting
- prettier: JavaScript/JSON/YAML formatting
- shellcheck: Shell script linting
- yamllint: YAML file linting
- rstcheck: reStructuredText linting
- license: License header checking
Configuration Files
- ESLint:
eslint.config.mjs
- Stylelint:
.stylelintrc.js, .stylelintignore
- Ruff:
pyproject.toml
- Prettier:
.prettierrc.js, .prettierignore
- List of third party code:
tools/rewriting/ThirdPartyPaths.txt
Tips
- Use
./mach lint --verbose for more detailed output when debugging linter issues
- Check
docs/code-quality/lint/ for documentation on specific linters
- Some linters may require additional setup (e.g., node modules for ESLint)
- Run
./mach bootstrap if linters are missing dependencies
- To exclude files from linting, use the appropriate ignore file or add exclusions in the linter's YAML config