Skip to content

chore(deps): update ghcr.io/oxsecurity/megalinter-python docker tag to v10 - #46

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/ghcr.io-oxsecurity-megalinter-python-10.x
Open

chore(deps): update ghcr.io/oxsecurity/megalinter-python docker tag to v10#46
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/ghcr.io-oxsecurity-megalinter-python-10.x

Conversation

@renovate

@renovate renovate Bot commented Aug 8, 2026

Copy link
Copy Markdown

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Update Change
ghcr.io/oxsecurity/megalinter-python (source) major v9.0.1v10.0.0

Release Notes

oxsecurity/megalinter (ghcr.io/oxsecurity/megalinter-python)

v10.0.0

Compare Source

  • Breaking changes

    • Removed 14 deprecated or long-disabled linters, and the API, MAKEFILE and PUPPET descriptors, which had no other linter left. MegaLinter does not provide Makefile and Puppet linting anymore. See the new Removed linters page for the full list and suggested replacements. (#​8606)
    • REPOSITORY_GITLEAKS has been removed: migrate to REPOSITORY_BETTERLEAKS, which reads your existing .gitleaks.toml and .gitleaksignore files unchanged. (#​8606)
    • Existing .mega-linter.yml files keep working: configuration variables of removed linters are simply ignored (a single notice lists any found in your configuration) and remain valid in the JSON schema. (#​8606)
    • API Reporter payload v2 replaces the v1 payload: metric series are renamed (linter_run_* becomes megalinter_linter_run_*, plus new run-level megalinter_run_* series), and the old docs/grafana dashboards are superseded. Re-provision the new dashboards with npx mega-linter-runner --upload-dashboards grafana — see the migration notes. Legacy NOTIF_API_* variables remain supported as aliases. (#​8661)
    • Linters now time out after 5 minutes by default (LINTER_TIMEOUT_SECONDS: 300): a linter exceeding it is killed and reported as an error (exit code 124) instead of running (or hanging) unbounded. If some of your linters legitimately run longer, raise the limit globally with LINTER_TIMEOUT_SECONDS, per linter with <LINTER_KEY>_TIMEOUT_SECONDS, or restore the previous unbounded behavior with value 0. (#​8665)
  • Core

    • Coding agents integration: MegaLinter can now be driven by Claude Code, Cursor CLI, GitHub Copilot CLI, Codex and many other coding agents — see the new Coding Agents documentation page (#​8614)

      • Install the MegaLinter agent skills with npx skills add oxsecurity/megalinter
      • Then ask your agent to set up MegaLinter (megalinter-setup), watch CI or local runs (megalinter-check) or fix lint errors (megalinter-fix)
      • Before the first local run, the skills now make sure the user is aware that MegaLinter is Docker-based and needs a good computer configuration and internet connection (the image download can weigh several GB), and suggest watching CI results instead when that is a problem
      • Local runs launched by the skills now cap PARALLEL_PROCESS_NUMBER to 4 on local computers (CI runs keep one parallel linter process per CPU core), so linting does not saturate the machine
      • Local runs launched by the skills now always activate the JSON reporter (not generated by default) to read results reliably, and fall back to the report folder configuration then the console output instead of waiting for report files that a repository configuration may have disabled
    • Excluded directories are now forwarded to project-mode linters, massively speeding up local runs, fixes #​8645

      • Linters that scan the whole workspace by themselves (REPOSITORY_TRIVY, REPOSITORY_CHECKOV, REPOSITORY_GRYPE, REPOSITORY_TRUFFLEHOG, REPOSITORY_SEMGREP and 50+ others) used to crawl everything, including build caches and node_modules: a seconds-long CI lint could take hours on a local checkout
      • MegaLinter now automatically passes the excluded directories (defaults, EXCLUDED_DIRECTORIES, ADDITIONAL_EXCLUDED_DIRECTORIES, and directories detected in FILTER_REGEX_EXCLUDE) to each of these linters, through its native exclusion flags or a generated ignore/config file
      • Every forwarded exclusion is logged in the linter's console section, and the ">300 gitignored files" performance warning now names the heaviest directories it found
      • Opt out globally with FORWARD_EXCLUDED_DIRECTORIES: false, or per linter with <LINTER_KEY>_FORWARD_EXCLUDED_DIRECTORIES: false
    • Default excluded directories now also include common build/cache folders: .wireit, .turbo, .nx, .yarn/cache, .pnpm-store, .parcel-cache, .angular, and the Salesforce CLI .sf / .sfdx state folders (#​8646)

    • New per-linter timeout: a linter still running after 5 minutes (LINTER_TIMEOUT_SECONDS: 300 by default) is killed along with all its child processes and reported as an error (exit code 124) with an actionable message, while the other linters keep running. Raise the limit globally with LINTER_TIMEOUT_SECONDS, per linter with <LINTER_KEY>_TIMEOUT_SECONDS, or disable it with value 0 (#​8665)

    • New prerun analysis mode (mega-linter-runner --prerun, or MEGALINTER_PRERUN=true environment variable): MegaLinter identifies active linters and collects files, then stops before running any linter and suggests configuration improvements, in the console and in megalinter-reports/prerun-report.json (#​8653)

      • Suggested exclusions: top-level directories containing only gitignored files (safe: linting scope is unchanged, and project-mode linters stop scanning them), and well-known generated/vendored folder names (site, dist, vendor...) still containing lintable files (to confirm by the user)
      • A lighter matching flavor is also suggested when available
      • The megalinter-check agent skill uses it on the first local run to tune .mega-linter.yml with the user before the real lint
      • Fixed a performance issue where detecting .gitignored files enumerated every individual file inside large ignored folders (node_modules, build output...) instead of stopping at the folder boundary, which could make the file collection step (including prerun) take several minutes on big repositories
    • Much lighter Docker images: the main image download shrinks by 9%, flavors by 9% to 22%, and standalone megalinter-only-* images are 35% to 65% smaller (#​8621)

      • If your PRE_COMMANDS compile native code: the compilation toolchain is no longer shipped in the images, install it back with apk add --no-cache gcc make musl-dev

      • Main and flavor images, compressed download size on ghcr.io, linux/amd64 (before = v9.6.0, so deltas also include the linters removed in this version):

        Image Before After Delta
        megalinter (main) 4.55 GB 4.13 GB -9%
        megalinter-c_cpp 1.61 GB 1.35 GB -16%
        megalinter-ci_light 724 MB 657 MB -9%
        megalinter-cupcake 2.52 GB 2.24 GB -11%
        megalinter-documentation 1.47 GB 1.21 GB -18%
        megalinter-dotnet 2.23 GB 1.86 GB -17%
        megalinter-dotnetweb 2.25 GB 1.88 GB -17%
        megalinter-formatters 936 MB 849 MB -9%
        megalinter-go 1.55 GB 1.35 GB -13%
        megalinter-java 1.59 GB 1.32 GB -17%
        megalinter-javascript 1.49 GB 1.23 GB -18%
        megalinter-php 1.51 GB 1.26 GB -17%
        megalinter-python 1.61 GB 1.26 GB -22%
        megalinter-ruby 1.49 GB 1.22 GB -18%
        megalinter-rust 1.99 GB 1.80 GB -10%
        megalinter-salesforce 2.09 GB 1.87 GB -10%
        megalinter-security 1.30 GB 1.17 GB -10%
        megalinter-swift 1.51 GB 1.24 GB -18%
        megalinter-terraform 1.59 GB 1.30 GB -18%
      • Standalone single-linter images, uncompressed size on linux/amd64 (before = previous beta):

        Image Before After Delta
        megalinter-only-groovy_npm_groovy_lint 1.07 GB 695 MB -35%
        megalinter-only-r_lintr 996 MB 405 MB -59%
        megalinter-only-spell_proselint 813 MB 284 MB -65%
        megalinter-only-css_stylelint 780 MB 360 MB -54%
        megalinter-only-spell_cspell 755 MB 357 MB -53%
        megalinter-only-ruby_rubocop 702 MB 301 MB -57%
        megalinter-only-perl_perlcritic 696 MB 293 MB -58%
        megalinter-only-spell_vale 683 MB 286 MB -58%
        megalinter-only-yaml_yamllint 668 MB 271 MB -59%
        megalinter-only-bash_shellcheck 660 MB 263 MB -60%
        megalinter-only-lua_luacheck 652 MB 252 MB -61%
        megalinter-only-xml_xmllint 645 MB 246 MB -62%
    • Faster startup on every run (~5 seconds saved) (#​8624)

      • Linter versions now come from a manifest built into the Docker image, instead of calling every linter's --version
      • LLM Advisor libraries are only loaded when LLM_ADVISOR_ENABLED is true
      • Set the new VERSION_GET_AT_RUNTIME: true variable if your PRE_COMMANDS install different linter versions and you want the really installed versions reported
    • Faster linting when fixes are applied (APPLY_FIXES): the check-only linters of a language now run in parallel as soon as its fixer linters are done, instead of all linters of the language running one after another (#​8624)

    • Faster standalone images and file-list runs: megalinter-only-* images only parse the descriptor of their single linter, and the repository-wide .gitignore enumeration is skipped when an explicit list of files is passed (e.g. mega-linter-runner [files...] on a large repository) (#​8614)

    • Runtime speed-ups combined, measured on the MegaLinter repository itself and on real-world repositories upgraded to this version (average of the last successful CI runs before / first CI runs after the upgrade):

      Measure Before After Delta
      MegaLinter repository: full run (all linters, fixes applied) 4m26s 3m18s -26%
      MegaLinter startup (import megalinter) ~7s ~0.9s -87%
      sfdx-hardis CI MegaLinter job (v9.6.0 → beta, javascript flavor) 6m02s 3m17s -45%
      vscode-sfdx-hardis CI MegaLinter job (late-July → current beta) 3m10s 2m34s -19%
    • Better secrets masking in logs, now powered by the betterleaks ruleset: redaction coverage nearly doubles (218 to 408 patterns), with no more network call at startup (#​8606)

    • FILTER_REGEX_INCLUDE and FILTER_REGEX_EXCLUDE (global, per-descriptor and per-linter) can now be defined as a list of regexes combined with a logical OR, so filter regexes can be appended across EXTENDS configs via CONFIG_PROPERTIES_TO_APPEND; single-string values remain fully supported, fixes #​8361

    • New ENABLE_DISABLE_LINTERS_PRIORITY variable to let DISABLE_LINTERS override ENABLE_LINTERS when a linter is in both lists (e.g. to trim an inherited ENABLE_LINTERS list via EXTENDS), fixes #​8296

    • New MEGALINTER_FLAVOR and MEGALINTER_VERSION properties in .mega-linter.yml, to pin the flavor and version of the MegaLinter Docker image once in the repository and have them reused by mega-linter-runner and the agent skills (#​8614)

    • Display a distinct ☑️ status icon (instead of ⚠️) for linters that found errors without blocking the run because the error count stayed under <LINTER>_DISABLE_ERRORS_IF_LESS_THAN, and show the configured maximum in the console and Pull Request summary tables (#​8496)

    • A <LINTER>_CLI_LINT_MODE override targeting a lint mode the linter does not support is now rejected with an explicit error instead of failing at lint time, fixes #​7120

  • New linters

  • Removed linters

    • API_SPECTRAL: crashing with no upstream fix (#​8606)
    • JSON_ESLINT_PLUGIN_JSONC: blocked by eslint-plugin-jsonc#328, use JSON_PRETTIER or JSON_JSONLINT instead (#​8606)
    • LUA_SELENE: blocked by selene#662, use LUA_LUACHECK instead (#​8606)
    • MAKEFILE_CHECKMAKE: disabled for security issues (#​8606)
    • MARKDOWN_REMARK_LINT: blocked by remark-lint#322, use MARKDOWN_MARKDOWNLINT instead (#​8606)
    • PUPPET_PUPPET_LINT: blocked by puppet-lint#251 (#​8606)
    • REPOSITORY_GITLEAKS: superseded by betterleaks, use REPOSITORY_BETTERLEAKS instead (#​8606)
    • REPOSITORY_KICS: disabled after the Checkmarx supply chain compromise, use REPOSITORY_CHECKOV instead (#​8606)
    • SALESFORCE_LIGHTNING_FLOW_SCANNER: upstream repository archived, use SALESFORCE_CODE_ANALYZER_FLOW instead (#​8606)
    • SALESFORCE_SFDX_SCANNER_APEX, SALESFORCE_SFDX_SCANNER_AURA, SALESFORCE_SFDX_SCANNER_LWC: deprecated by Salesforce and incompatible with Node.js 22+, use the matching SALESFORCE_CODE_ANALYZER_* linters instead (#​8606)
    • SQL_TSQLLINT: upstream unmaintained since 2024-09 and shipping unpatched .NET CVEs (#​8606)
    • TERRAFORM_TERRASCAN: upstream repository archived by Tenable and shipping unpatched CVEs, use REPOSITORY_CHECKOV instead (#​8606)
  • Linters enhancements

    • REPOSITORY_CHECKOV now skips its secrets framework (--skip-framework secrets) when a dedicated secret scanner (betterleaks, kingfisher, secretlint or trufflehog) is active in the same run: the duplicated secrets scan added minutes to every run and could stall for hours on bind-mounted workspaces. Define --framework or --skip-framework in REPOSITORY_CHECKOV_ARGUMENTS (or in your checkov config file) to keep checkov's own secrets scan (#​8665)
  • Fixes

    • Stop FutureWarning: Possible nested set warnings appearing in the console at startup: a secret-masking regex used a POSIX character class ([[:alnum:]]) unsupported by Python. Such classes are now translated, which also makes the affected masking rule (Airtable personal access tokens) actually match (#​8684)
    • Restore multi-arch megalinter-only-* Docker images: they were mistakenly published for a single architecture, linux/amd64 + linux/arm64 are back (#​8247)
    • Fix linters relying on other linters' file lists (e.g. SPELL_CSPELL) linting zero files when run through their standalone megalinter-only-* Docker image (#​8614)
    • Fix LINTER_RULES_PATH not being used to resolve config files for linters using active_only_if_file_found (e.g. REPOSITORY_LS_LINT, SPELL_PROSELINT, SPELL_VALE), fixes #​8416
    • Honor EXCLUDED_DIRECTORIES and ADDITIONAL_EXCLUDED_DIRECTORIES in changed-files mode (VALIDATE_ALL_CODEBASE: false), the same way they are honored during full-codebase validation (#​8360)
    • Make remote configuration loading (MEGALINTER_CONFIG and EXTENDS files fetched over HTTP) resilient to transient network failures with a request timeout and retries (#​8349)
    • Bound the gitignored-files detection (git ls-files) with a 120 seconds timeout: on workspaces with pathologically slow file access (e.g. bind-mounted from Windows into a WSL2-backed container engine) this internal git call could hang the whole run before any linter started; it now degrades to an actionable warning and the run continues (#​8665)
    • Allow CSS_STYLELINT_COMMAND_REMOVE_ARGUMENTS to remove --config-basedir, and stop raising an error when an argument listed in <LINTER>_COMMAND_REMOVE_ARGUMENTS is not in the command line, fixes #​8552
    • Treat zero matching SARIF findings as a valid result without logging the entire report, fixes #​8295
    • Remove invalid SARIF fixes with empty artifactChanges arrays before report aggregation, fixes #​8474
    • Fix SARIF_TO_HUMAN producing empty linter logs when the SARIF-to-text conversion crashed; raw SARIF is now shown as a fallback (#​8294)
    • Keep REPOSITORY_CHECKOV's transient GitHub-configuration scan files (branch_protection_rules.json and similar) out of the linted repository — they are now written inside the report folder, so they no longer appear in other linters' results (#​8406)
    • Fix a REPOSITORY_SECRETLINT crash (ENOENT) when it scanned report files being written at the same time by other linters (#​8624)
    • COPYPASTE_JSCPD now runs on linux/amd64 only: jscpd v5 provides no ARM64 binary compatible with MegaLinter images, so it always failed with Unsupported platform linux/arm64 on ARM (#​8610)
  • Reporters

    • Observability: MegaLinter results can now feed Grafana, Datadog, Elastic and New Relic, with ready-to-use, linked dashboards (fleet overview → repository detail → linter detail, with health score and errors evolution by repository, linter and language) — see the new Observability documentation section (#​8661)
      • The API Reporter payload v2 adds run-level KPIs (quality gate status, a 0-100 repository health score, blocking/non-blocking error counts, auto-fixed errors, run duration) and per-linter top rules and top files breakdowns (parsed from SARIF output, disable with API_REPORTER_DETAILS: false)
      • New API_REPORTER_PROVIDER variable: comma-separated list of target providers (grafana by default, datadog, elastic, newrelic) with per-provider auth variables (API_REPORTER_DATADOG_*, API_REPORTER_ELASTIC_*, API_REPORTER_NEWRELIC_*)
      • Dashboards are provisioned automatically with npx mega-linter-runner --upload-dashboards <provider> (idempotent create-or-update), also proposed during --install and --upgrade
    • New API_REPORTER_PAYLOAD_FORMAT variable (auto, loki or default) to force the payload format sent by the API Reporter, instead of only deducing it from the endpoint URL (#​8661)
    • Observability dashboards reviewed and improved against each provider's official guidance — refresh yours with npx mega-linter-runner --upload-dashboards <provider> (#​8667)
      • Correct KPIs: Grafana "latest run" stats no longer double-count when several branches or MegaLinter versions report in the window, and stale series (deleted branches, pre-upgrade versions) no longer linger; the quality gate pass rate is now a true pass rate over the selected period on Grafana, Datadog and New Relic; "errors auto-fixed" and "time saved" now show period totals consistently on all providers
      • Working navigation: Grafana drill-down links now keep the selected branch, and New Relic facet links to the Repository detail and Why this rating? pages now actually work (they were silently ignored)
      • "Why this rating?" explanations now render correctly on Datadog, Elastic and New Relic (they showed literal \n text), and Elastic and New Relic gain the missing "Linters dragging the score down" and "Time saved by auto-fixes" elements
      • Readable with sparse CI data: 1-week default windows on Datadog widgets, 1-day buckets on New Relic charts, run-marker annotations and sparklines on Grafana/Datadog tiles, sorted tables, and semantic colors everywhere (blocking=red, non-blocking=yellow, health A-E bands)
      • New content: A-E rating breakdown and quality-gate failure rate (New Relic), files analyzed and health score by MegaLinter version (Datadog), files analyzed and MegaLinter versions in use (Elastic), org-level filter variable (Grafana)
      • Fix the New Relic provider tagging every metric datapoint with runId, which burned metric cardinality for no query value
    • Refreshed OX Security banner displayed at the bottom of pull request comments and job summaries, using the current OX Security visual identity (#​8692)
  • Doc

    • Home page: mention Coding Agents compliance in the welcome phrase, display the supported coding agent icons next to the CI/CD integrations, and add a "Coding Agents compatible" badge (#​8625)
    • Home page banner refreshed: highlights v10, compliance with AI coding agents, and up-to-date download (16 million+) and usage (6,000+ public repos) figures (#​8692)
    • Quick Start: setting up MegaLinter with a coding agent (npx skills add oxsecurity/megalinter then "setup megalinter") is now the first suggested option (#​8625)
    • Coding Agents page: add Gemini CLI, Windsurf, Cline, Roo Code, Kilo Code, Amp, Goose, OpenHands and Qwen Code to the compatible coding agents (#​8625)
    • megalinter-setup skill: after install or upgrade, suggest either running MegaLinter locally or creating a pull request and then watching its CI results with megalinter-check (#​8625)
    • megalinter-setup skill: upgrade mode now systematically migrates CI Docker image references from Docker Hub to ghcr.io (images are only published on GitHub Container Registry since v9.5.0), with precise rules on what to rewrite and what to leave untouched (#​8694)
    • megalinter, megalinter-setup and megalinter-check skills: local runs are flagged as resource-consuming and running in CI is now the recommended option — when both are possible, the skills ask the user to choose (CI first) instead of silently starting a local run (#​8658)
    • megalinter-check skill: the first local run now starts with a --prerun analysis, so the user can validate the suggested .mega-linter.yml performance tuning before the real lint (#​8653)
    • megalinter-check skill and watcher/runner sub-agents: the console tips MegaLinter prints (performance warnings, flavor suggestions, [Activation] notices, deprecations) are now extracted from the persisted log file and returned to the calling agent in a tips field, instead of being lost when reading only the JSON report (#​8665)
    • Custom Flavors: new Licensing section — a custom flavor is still MegaLinter, so your flavor repository and the image it publishes are covered by AGPL-3.0. Add an AGPL-3.0 LICENSE file to your flavor repository and keep the link to the MegaLinter source in its README, fixes #​8681
    • Fix outdated links in docs/descriptors/repository_kingfisher.md (#​8364)
  • mega-linter-runner

    • New --upload-dashboards <provider> option: provision or refresh the MegaLinter observability dashboards in Grafana, Datadog, Elastic (Kibana) or New Relic, using the provider auth environment variables (documentation) (#​8661)
      • Also proposed as a prompt during interactive --install and --upgrade, or with --setup-dashboards <provider> in non-interactive mode
    • Non-interactive installation: --install can now run without prompts (#​8614)
      • Use --no-prompt with the new --setup-* options (--setup-ci, --setup-copy-paste, --setup-spelling-mistakes, --setup-default-branch, --setup-validate-all-code-base, --setup-ox) and the existing --flavor, --release and --fix flags
      • Pre-existing configuration/workflow files are backed up as <file>.megalinter-setup.bak before being overwritten, so customizations can be merged back
    • New --linter <LINTER_KEY> option to run a single linter using its standalone megalinter-only-<linter_key> Docker image, with an optional list of files to lint (#​8614)
      • Reports are isolated in megalinter-reports/<linter_key>, so several standalone runs can execute in parallel
    • Flavor and version resolution now reads MEGALINTER_FLAVOR and MEGALINTER_VERSION from .mega-linter.yml when --flavor/--release are not passed on the command line, and the install generator writes both properties in the generated configuration (#​8614)
    • --fix now respects an APPLY_FIXES value (other than none) defined in .mega-linter.yml instead of overriding it with all (#​8614)
    • --upgrade also bumps a pinned MEGALINTER_VERSION property of .mega-linter.yml to the current major version (#​8614)
    • --upgrade now migrates v9 references to v10: GitHub Action (oxsecurity/megalinter@v9, flavors) and Docker image (ghcr.io/oxsecurity/megalinter:v9, flavors) references are rewritten to v10, and --install defaults to v10
    • New --prerun option: analysis-only run that outputs configuration suggestions to improve performances (see the prerun mode in Core section). Combine with --json to print the prerun report on stdout (#​8653)
    • New --timeout <seconds> option (-t): bound the whole run; on expiration the runner prints the container's last log lines, stops and removes the container (no orphan left behind, even on Windows where killing the CLI process does not stop the container), and exits with code 124 (#​8665)
    • Skip docker pull when the requested version is a pinned release tag (vX.Y.Z, immutable) and the image is already available locally, removing a useless registry round-trip (#​8614)
    • Print a hint before mounting the workspace when it contains well-known heavy folders (build caches, package stores), pointing at SKIP_CLI_LINT_MODES=project to keep local runs fast (#​8646)
    • --custom-flavor-setup: the generated README now has a License section stating the flavor is covered by AGPL-3.0, with a link to the MegaLinter source repository (#​8682)
    • --custom-flavor-setup now generates a MegaLinter-clean repository, so a new custom flavor repo starts green instead of failing its own first MegaLinter run, fixes #​8680
      • The generated workflows and README now pass actionlint, zizmor, editorconfig-checker and markdownlint
      • Actions used by the generated workflows are hash-pinned, and a .github/zizmor.yml is generated to waive the one deliberate exception: the flavor builder tracks @main so your image is always built by the builder matching the MegaLinter release you target
      • Fixed the generated builder header comment, which advertised the image at ghcr.io/<owner>/<repo>:<tag> instead of ghcr.io/<owner>/<repo>/megalinter-custom-flavor:<tag>
      • Fixed the generated PAT setup instructions, which named the repository the template was originally written against
      • Custom Flavors documentation now covers linting your flavor repository, including the REPOSITORY_CHECKOV_ARGUMENTS: "--skip-check CKV_GHA_7" needed by the builder's workflow_dispatch inputs
  • Dev

    • ApiReporter refactoring: provider delivery is now implemented by ApiProvider classes (megalinter/api_providers/: Grafana, Datadog, Elastic, New Relic), and dashboards are generated by DashboardBuilder classes (.automation/dashboard_builders/) from a shared metrics contract into docs/dashboards/build_dashboards.py --check fails when dashboards and contract drift apart, and the internal sync-dashboards Claude skill maintains them (#​8661)
    • Add megalinter/removed_linters.py as the single source of truth for every linter and descriptor removed since v6, used both at runtime and by the build system, and generate the Removed linters documentation page from it (#​8606)
    • Add supported_cli_lint_modes descriptor property to declare which CLI lint modes (file, list_of_files, project) each linter supports, and generate success/failure tests for every supported mode (#​7150)
      • ACTION_ZIZMOR, BASH_SHFMT and GO_REVIVE now declare their real modes instead of falling back to the file-only default
    • Project-mode excluded-directories forwarding internals: (#​8646)
      • New cli_lint_mode_project_exclude_* descriptor properties (native exclusion flag templates, ignore-file arguments, generated workspace ignore files) consumed by generic Linter base-class code: forwarding is pure descriptor data on 41 linters
      • 13 Python subclass workarounds for tools needing config-merge logic (trufflehog, betterleaks, jscpd, yamllint, rubocop, swiftlint, ls-lint, clj-kondo, eslint, gherkin-lint, luacheck, stylua, phpstan/php-cs-fixer/cljstyle)
      • Poison .wireit/ test fixtures make the project-lint-mode success tests fail if forwarding regresses
    • New descriptor property install.apk_build for apk packages needed only while pip/gem packages compile native extensions: they join a virtual apk package removed from the final image layers (#​8621)
      • Used by SPELL_PROSELINT (build-base, re2-dev, py3-pybind11-dev needed to build google-re2), which was keeping a full C++ toolchain in every flavor image
    • Details of the Docker image slimming: (#​8621)
      • LLM Advisor provider SDKs move to an llm pip extra excluded from standalone megalinter-only-* images (~200 MB per standalone image)
      • The compilation toolchain (gcc, make, musl-dev, libffi-dev) and per-descriptor build toolchains (LUA luarocks, PERL cpm, R packages) are installed as apk virtual packages removed after the install steps (~110-150 MB per image)
      • GROOVY_NPM_GROOVY_LINT reuses the shared OpenJDK 21 instead of shipping its own OpenJDK 17 (~300 MB)
      • Python linter venvs share identical wheels through the uv cache in hardlink mode
      • Extended node_modules pruning, and standalone images drop the ~45 MB __pycache__ layer
      • Removed a stray cpplint Python venv that was mistakenly declared in the CSS_STYLELINT descriptor
    • Keep the Docker Pulls badge in docs/index.md in sync by having docker_stats.py also update the hardcoded badge total in .automation/build.py (#​8258)
    • Mark the repository's internal Claude Code skills (.claude/skills/) as internal so npx skills add oxsecurity/megalinter only offers the four MegaLinter agent skills from the skills/ folder (#​8627)
    • Vendor the official Grafana, Elastic and Datadog agent skills (Apache-2.0, with licenses and source attribution) into .claude/skills/ (grafana-dashboarding, grafana-promql, kibana-dashboards, datadog-dashboards) to guide observability dashboard maintenance alongside the sync-dashboards skill — New Relic publishes no official agent skill (only an MCP server) (#​8667)
    • Fix the /build contribution skill being accidentally gitignored by the build/ packaging pattern, so it is now actually versioned (#​8627)
  • CI

    • Speed up PR jobs by handing the built Docker image over to consumer jobs through ghcr.io (megalinter-dev per-commit tags, pruned daily) instead of a workflow artifact + docker load (#​8624)

      • For branches of the main repository only: forked PRs keep the artifact-based handoff, since their GITHUB_TOKEN cannot push packages
    • Build only the per-linter Docker images impacted by the changed files of a PR (descriptor edits, per-linter Dockerfiles, single-linter test fixtures); any change to shared code or unrecognized files keeps building the full matrix (#​8624)

    • Remove duplicate self-lint and mega-linter-runner test runs on PR branches: the push trigger is now restricted to main-line branches, the pull_request trigger already covers PR commits (~15 duplicated job-minutes saved per PR commit) (#​8624)

    • Speed up the test suite by skipping the file CLI lint mode tests for linters that also support list_of_files, since list_of_files exercises the same code path more cheaply (#​8624)

    • CI jobs before/after, measured on the deploy-DEV workflow (average of 3 successful runs each, before = early July 2026, after = 2026-08-05):

      CI job / step Before After Delta
      Docker image handoff to a consumer job 4m51s 2m39s -45%
      "Run against all code base" — whole job 11m16s 7m16s -36%
      "Run against all code base" — lint step 5m08s 3m18s -36%
      "Run Test Cases" (pytest suite) — whole job 15m30s 14m00s -10%
      "mega-linter-runner tests" — whole job 14m20s 8m17s -42%
      • The pytest suite gain is partly offset by the many new per-lint-mode and project-mode-exclusion tests added in this version
    • TAP reporter golden-file tests move from the 120+ generated per-linter test classes (where most of them skipped) to a dedicated tap_reporter_test class running on a curated sample of linters (bash, css, protobuf, cloudformation); stale Super-Linter-era expected files (some of them unreachable by the test suite) have been removed (#​8624)

    • Make test_api_output resilient to remote server outages: probe several public echo endpoints, run the test with the ones that are up, retry with another server when a post fails, and skip the test when none of them is reachable, as a remote outage is not a MegaLinter issue (#​8538)

    • Fix per-linter Docker images being published single-arch: the BETA and RELEASE linter workflows split each linter into independent per-platform jobs that all pushed the same tag, so the last push won and overwrote the other architecture. They now push each platform by digest and a dedicated merge job assembles a proper multi-arch manifest list per linter (#​8247)

  • Linter versions upgrades (50)

v9.6.0

Compare Source

  • Breaking changes

    • Linters can no longer be run via a sibling Docker image at runtime. The cli_docker_image, cli_docker_image_version and cli_docker_args descriptor properties (and the matching <LINTER>_DOCKER_IMAGE_VERSION variable) have been removed, and MegaLinter no longer mounts /var/run/docker.sock (in mega-linter-runner, the GitHub Action action.yml files, and the Docker daemon previously bundled in flavor images). This closes the host-privilege escalation surface that the mounted Docker socket exposed. The only linter that used this mechanism was SWIFT_SWIFTLINT, now installed natively (see below). (#​8216)
    • SWIFT_SWIFTLINT is now installed from the static swiftlint-static binary instead of running the ghcr.io/realm/swiftlint container. It runs natively on the Alpine image with no Docker socket required. SourceKit-dependent rules are disabled in this build and reported to the console when encountered; pure-syntax style rules are unaffected. (#​8216)
    • @eslint/eslintrc shim removed from JavaScript/TypeScript/JSX/TSX Docker images (was only needed for legacy FlatCompat); MegaLinter's bundled test fixtures use native flat config. (#​7869)
    • ESLint linters now force migration off .eslintrc.*: JAVASCRIPT_ES, TYPESCRIPT_ES, JSX_ESLINT, TSX_ESLINT activate when they find any eslint.config.* or any deprecated .eslintrc.* / package.json#eslintConfig. In the legacy case the linter does not call ESLint at all — it emits a single hard failure with a migration message so the build stays red until the config is migrated to flat config. See the ESLint flat-config migration guide. To opt out, set DISABLE_LINTERS or DISABLE to exclude the affected linter/descriptor. (#​7869)
    • JSON_ESLINT_PLUGIN_JSONC removed: upstream bug ota-meshi/eslint-plugin-jsonc#328 blocks ESLint v10 compatibility and will not be fixed. Use JSON_JSONLINT, JSON_PRETTIER, or JSON_V8R for JSON validation instead. (#​7869)
  • Core

    • New linter descriptor property common_linter_errors: declare known non-lint failure patterns (config issue, remote service down, missing credentials…) and the guidance message shown to users, directly in YAML — no custom Python class needed. (#​7907)
    • Skipped-linters summary now explains why a linter was skipped by an activation rule, including the variable to set to activate it (e.g. MARKDOWN_RUMDL: MARKDOWN_DEFAULT_STYLE=markdownlint (set MARKDOWN_DEFAULT_STYLE=rumdl to activate)), fixing #​8017.
  • New linters

    • Add betterleaks linter for repository secrets scanning — successor to gitleaks with higher recall (98.6% vs 70.4%), lower false-positive rates, and 4–5× faster scanning via BPE-based detection and CEL filter expressions (#​8186)
  • Disabled linters

    • SALESFORCE_SFDX_SCANNER_APEX, SALESFORCE_SFDX_SCANNER_AURA and SALESFORCE_SFDX_SCANNER_LWC — disabled because sfdx-scanner 4.12.0 crashes on Node.js 22+ (TypeError: Cannot read properties of undefined (reading 'prototype'), caused by the removal of SlowBuffer.prototype), which is shipped with Alpine 3.24. These linters were already deprecated; use the SALESFORCE_CODE_ANALYZER_APEX / SALESFORCE_CODE_ANALYZER_AURA / SALESFORCE_CODE_ANALYZER_LWC variants instead (#​8080).
  • Deprecated linters

    • REPOSITORY_GITLEAKS — deprecated in favour of REPOSITORY_BETTERLEAKS (same author, fully compatible config, significantly better detection). Will be removed in the next major release. Disable it by adding REPOSITORY_GITLEAKS to DISABLE_LINTERS in your .mega-linter.yml. (#​8186)
  • Removed linters

    • JSON_ESLINT_PLUGIN_JSONC — permanently broken by upstream bug (see Breaking changes) (#​7869)
  • Linters enhancements

    • REPOSITORY_CHECKOV: in pull-request mode, scan only the files modified in the PR instead of the whole repository (#​7119)
  • Fixes

    • REPOSITORY_BETTERLEAKS: default scan now runs in filesystem (dir) mode instead of auto-switching to git-history (git) mode when a git repository is detected. betterleaks does not read the global git safe.directory config, so git mode failed with fatal: detected dubious ownership in repository in CI environments (e.g. GitHub Actions /github/workspace). Git-history mode is still used for the opt-in REPOSITORY_BETTERLEAKS_PR_COMMITS_SCAN feature. (#​8186)
    • REPOSITORY_BETTERLEAKS: added --verbose so detected findings (file, line and rule) are reported instead of only the leaks found: N summary, matching gitleaks behavior. Secret values stay redacted via --redact. (#​8186)
    • REPOSITORY_OSV_SCANNER: exit code 128 ("No package sources found") is now treated as a clean pass instead of a failure — osv-scanner returns this code when the repo contains no lockfiles/manifests/SBOMs, which is not a vulnerability finding (#​7917).
    • Fix intermittent ansible-lint load-failure[not-found] error on github_conf/branch_protection_rules.json caused by a race condition with checkov running in parallel. Checkov's transient GitHub-conf directory is now written to a hidden path (.megalinter_github_conf) that project-mode linters skip, eliminating the conflict (#​8092).
    • Complete the Alpine 3.24 upgrade across the whole image and fix how alpine version is detected. Docker images now build on the python:3.14-alpine3.24 base image (#​8080).
    • Avoid DeprecationWarning / future breakage on Python 3.14 by no longer passing count and flags as positional arguments to re.sub (#​8211).
    • Exclude REPORT_OUTPUT_FOLDER from linting when configured as an absolute path inside the workspace (e.g. /tmp/lint/megalinter-reports), fixing #​7845.
    • Fix command injection in Roslynator linter (DOTNET_ROSLYNATOR) where a crafted .csproj filename could break out of dotnet restore arguments and execute arbitrary shell commands. The command is now invoked via argv list instead of a shell string. Reported by Francesco Sabiu. (#​7857)
    • Fix IndexError when building the single-linter Docker image for a linter whose activation depends on a file (e.g. SPELL_VALE requires .vale.ini): python -m megalinter.run --linterversion now bypasses activation filtering since the per-linter image is built for that linter unconditionally.
    • Fix make bootstrap appearing to hang because exported Make color variables re-evaluated tput during recursive make invocations. (#​8090)
    • Allow MegaLinter containers to run in an opt-in non-root mode matching the host UID:GID on POSIX systems, avoiding root-owned generated files on the host (#​1975).
    • Restore missing examples in the Dart descriptor that were dropped from the generated documentation (#​7913).
  • Reporters

    • Update Bitbucket pipeline generator template to trigger builds on pull requests from any branch, by @​yermulnik in #​7421
  • Doc

    • Add pnpm installation and usage documentation for JavaScript and TypeScript linters (#​8177)
    • Update Docker pull counters in README badges and flavors-stats.json with latest ghcr.io stats
    • Bump peter-evans/create-pull-request to v8 in the documented workflow examples (#​8089)
  • mega-linter-runner

    • Add --user-map / --no-user-map to control whether the MegaLinter container runs in non-root mode. On POSIX systems --user-map uses the current host UID:GID; on other hosts it falls back to 1000:1000. (#​8120)
    • Add --no-prompt flag to mega-linter-runner --upgrade for non-interactive upgrades (#​8093)
    • Mark mega-linter-runner/index.js as executable in git (#​8091)
  • Dev

    • Add specialized Claude Code sub-agents (pr-monitor, security-analyst, version-bumper) and assign cost-effective models to mechanical tasks, to speed up and reduce the token cost of contributor workflows (#​7906).
    • Add the /fix-issue Claude Code skill for end-to-end GitHub issue fixes (gather context, implement on a branch, open a PR, watch CI) (#​7848).
    • Stop generating per-linter Dockerfiles for linters marked disabled: true in their descriptor. The matching images were already excluded from the build matrix (linters_matrix.json) and nev

Note

PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@pipekit-ci

Copy link
Copy Markdown
Collaborator

MegaLinter analysis: Error

Descriptor Linter Files Fixed Errors Max errors Warnings Elapsed time
✅ JSON jsonlint 3 0 0 0.1s
✅ JSON prettier 1 0 0 0.27s
✅ MARKDOWN markdownlint 9 0 0 0.51s
✅ MARKDOWN markdown-table-formatter 9 0 0 0.33s
✅ PYTHON isort 7 0 0 0.38s
✅ PYTHON nbqa 2 0 0 5.86s
❌ PYTHON ruff 9 2 0 0.07s
❌ REPOSITORY betterleaks yes 1 no 0.13s
✅ REPOSITORY git_diff yes no no 0.05s
✅ REPOSITORY grype yes no no 70.83s
✅ REPOSITORY osv-scanner yes no no 0.16s
✅ REPOSITORY secretlint yes no no 1.16s
✅ REPOSITORY syft yes no no 1.8s
✅ REPOSITORY trivy-sbom yes no no 0.22s
❌ REPOSITORY trufflehog yes 1 no 5.27s
✅ SPELL cspell 32 0 0 4.26s
✅ YAML prettier 7 0 0 0.71s

Detailed Issues

❌ REPOSITORY / betterleaks - 1 error

Linter output file not found

❌ PYTHON / ruff - 2 errors

Linter output file not found

❌ REPOSITORY / trufflehog - 1 error

Linter output file not found

Notices

⚠️ Your configuration references items that have been removed from MegaLinter and are ignored: GIT, MARKDOWN_MARKDOWN_LINK_CHECK, REPOSITORY_GITLEAKS, REPOSITORY_KICS. See Removed linters to find their replacements.

See detailed reports in MegaLinter artifacts

Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)

  • Documentation: Custom Flavors
  • Command: npx mega-linter-runner@10.0.0 --custom-flavor-setup --custom-flavor-linters PYTHON_ISORT,PYTHON_NBQA_MYPY,PYTHON_RUFF,JSON_JSONLINT,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,REPOSITORY_GIT_DIFF,REPOSITORY_BETTERLEAKS,REPOSITORY_GRYPE,REPOSITORY_OSV_SCANNER,REPOSITORY_SECRETLINT,REPOSITORY_SYFT,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,SPELL_CSPELL,YAML_PRETTIER

MegaLinter is provided by OX Security
Show us your support by starring ⭐ the repository

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant