| name | implement |
| description | Implement a feature, bug fix, or code change in MegaLinter. Use whenever the user asks to add a feature, fix a bug, or make a code change - with or without a prior /design phase. |
| disable-model-invocation | true |
| allowed-tools | Read Glob Grep Write Edit Bash WebSearch WebFetch |
| argument-hint | [feature or change to implement] |
| model | sonnet |
You are a developer working on the MegaLinter project.
Implement the requested changes. If a prior /design conversation exists, follow that specification. Otherwise, derive the implementation plan from the user's request and the existing codebase — explore with Glob/Grep before writing code.
Read .claude/rules/ for the conventions of the area you're touching:
descriptors.md — YAML descriptor schema and property coverage
python-style.md — Python conventions
documentation.md — mkdocs-material markdown rules
generated-files.md — what NOT to edit
testing.md — test structure and fixtures
Process
- Understand what to implement. If
/design produced a spec, follow it. Otherwise grep for relevant code and form a clear plan before writing.
- Pick the right specialist (prefer delegation when the work fits):
- Authoring/editing descriptors → use the
descriptor-expert agent.
- Brand-new linter → follow
/add-linter.
- Linter version bump → follow
/update-linter-version.
- New flavor →
/add-flavor. New reporter → /add-reporter.
- CVE / vulnerability →
/fix-security-issue.
- Descriptor changes:
- Python changes (
megalinter/):
- PEP 8 + type hints where possible.
- No docstrings on classes/methods.
- Imports at the top only — no inline / conditional /
try/except ImportError.
- Config:
megalinter.config.get(request_id, "VAR", default) — never os.environ.
- Logging:
logging module — never print().
- Custom linter classes extend
megalinter.Linter and stay minimal. Override only what YAML can't express.
- Reporters extend
megalinter.reporters.Reporter with manage_activation() and produce_report().
- No defensive error handling for internal paths; validate only at system boundaries.
- Test fixtures: for any change affecting detection or error parsing, add/update files in
.automation/test/<test_folder>/. Good file lints clean; bad file triggers cli_lint_errors_regex.
- Never edit generated files:
linters/*/Dockerfile, flavors/*/Dockerfile, flavors/*/action.yml, flavors/*/flavor.json.
megalinter/tests/test_megalinter/linters/*_test.py files with the automatically @generated by .automation/build.py header.
docs/descriptors/*.
- Schemas under
megalinter/descriptors/schemas/.
- Change the source (descriptor YAML or
.automation/build.py) instead.
- Build: after descriptor or build-logic changes, run
make megalinter-build. Delegate to the build-runner agent if it gets complex. Never run make megalinter-build-with-doc — docs are owned by auto-update workflows; running it in a PR causes merge conflicts.
- Dependencies: after editing
pyproject.toml, run uv lock. Prefer descriptor install: blocks for linter-specific runtime deps over editing the core Dockerfile.
- CHANGELOG: add a one-line user-facing entry under
## [beta] (master) in repo-root CHANGELOG.md. Skip for:
- Routine linter version bumps (auto-upgrade workflow owns those).
- CVE-ignore entries.
- Internal-only refactors/tests/build plumbing.
- Documentation: improve descriptor metadata (
linter_text, linter_rules_url, ide, examples) so the auto-generated docs/descriptors/* pages improve. mkdocs-material: blank line after every heading, blank line before/after every list.
Continue iterating until the change is complete. Do not stop to ask whether to continue mid-task.
Important
- Do not add abstractions, fallbacks, feature flags, or backwards-compatibility shims the change doesn't need.
- Do not leave half-finished implementations or
// removed placeholder comments.
- Default to no comments — add one only when the WHY is non-obvious.
- Linters are NOT installed locally. Final validation must happen inside Docker — that's the
/test skill's job.
$ARGUMENTS