Whether it's a formatter (is_formatter: true) or a linter
Current latest stable version for pinning
What package manager installs it (pip, npm, apk, gem, cargo, or raw Dockerfile)
Supported platforms (linux/amd64, linux/arm64)
Ignore file support (e.g., .eslintignore)
Step 2 — Create/Update the Descriptor
Check if a descriptor exists in megalinter/descriptors/ for this language. If not, create a new <lang>.megalinter-descriptor.yml.
If the linter covers several descriptors (like eslint, prettier or biome), define it once in megalinter/descriptors/shared/<linter_name>.megalinter-linter.yml (a complete standalone linter definition) and add a thin extends: <linter_name> entry in each descriptor with only the per-descriptor overrides (test_folder, examples, file_extensions…) — see .claude/rules/descriptors.md → "Shared Linter Definitions".
Add the linter entry with as many properties as possible. Even though the JSON schema only requires linter_name, linter_url, and examples, aim for maximum completeness. Fill in ALL of these when applicable:
Identity (required):
linter_name — CLI executable name, lowercase
linter_url — tool website
examples — CLI usage (with and without config file)
Documentation (strongly recommended):
linter_text — rich markdown description: features, what it checks, when to use it
linter_repo — GitHub repository URL
linter_rules_url — URL listing all rules
linter_rules_configuration_url — how to configure
linter_rules_inline_disable_url — how to suppress rules inline
linter_rules_ignore_config_url — how to ignore files
cli_lint_mode — default mode: file, list_of_files, or project
supported_cli_lint_modes — every mode the linter can run in (subset of file / list_of_files / project; defaults to ["file"], must include cli_lint_mode). Success/failure tests run once per declared mode, so only list modes the tool actually supports
cli_lint_fix_remove_args — args to remove in fix mode
cli_version_arg_name — if not --version
cli_help_arg_name — if not --help
ignore_file_name, cli_lint_ignore_arg_name — ignore file support
Excluded directories forwarding — when project is a supported lint mode, MegaLinter must forward EXCLUDED_DIRECTORIES to the tool or it will scan node_modules/build caches raw. Pick exactly ONE mechanism (see .claude/rules/descriptors.md → "Project Lint Mode: Forwarding Excluded Directories" for full semantics and known traps):
native CLI flag → cli_lint_mode_project_exclude_arg_name (+ _arg_value{{DIR}}/{{WORKSPACE}} template, _separator if a repeated flag overrides, _seed_values if the flag replaces the tool's built-in defaults, _config_key if it replaces a list in the tool's config file)
flag taking an ignore file → cli_lint_mode_project_exclude_ignore_file_arg_name (+ _seed_files, _pass_existing)
generated/merged config needed → manage_excluded_directories_config() override in the linter class
tool that can only read an ignore file it discovers itself inside the repository → no forwarding: MegaLinter never writes in the analyzed sources, document the limitation in linter_text
Research the official docs first: exact flag, value syntax (path/glob/regex, anchoring), repeatability, and whether it replaces config/built-in defaults — a wrong choice silently drops exclusions or clobbers user configuration.
Poison fixture — after declaring forwarding, add a deliberately failing file in .automation/test/<test_folder>/good/.wireit/ so test_success_project_lint_mode guards the forwarding against regressions (only if all project-capable linters sharing the folder have forwarding)
Error parsing (important for accurate counts):
cli_lint_errors_count — regex_count, regex_number, regex_sum, total_lines, or sarif
cli_lint_errors_regex — regex matching error lines in output
SARIF support (if available):
can_output_sarif: true
cli_sarif_args — with {{SARIF_OUTPUT_FILE}} placeholder
Behavior flags:
is_formatter: true — if it's a formatter
activation_rules — if it depends on env vars (e.g., style preference)
active_only_if_file_found — only activate if certain config files exist