Run Linters
Execute linters after code changes are complete to ensure code quality and consistency.
When to Use
- After completing a set of code changes (not after each small edit)
- Before creating a commit or PR
- When asked to verify code quality
Step 1: Run Linters
Execute the linters command which auto-detects active linters in the current repository and runs them with proper configurations:
linters
Step 2: Analyze Results
- If no issues: Report success and proceed
- If issues found: Continue to Step 3
Step 3: Fix Issues
For each issue reported:
- Read the affected file
- Understand the linting error
- Fix the issue in the source code using Edit tool
- Re-run
lintersto verify the fix
Repeat until all issues are resolved.
Important Rules
- Do NOT run after every small change - wait until a logical set of changes is complete
- Fix all issues before reporting completion
- NEVER modify linter configuration files to suppress or ignore issues
- NEVER add inline disable comments (e.g.,
// eslint-disable,# noqa,// nolint) to bypass issues - Always fix the actual code, not the linter rules
- If an issue seems impossible to fix properly, ask the user for guidance
Forbidden Files - NEVER Modify
The following configuration files must NEVER be edited to work around linting issues:
JavaScript/TypeScript:
.eslintrc,.eslintrc.js,.eslintrc.json,.eslintrc.yml.prettierrc,.prettierrc.js,.prettierrc.jsoneslint.config.js,eslint.config.mjstsconfig.json(for strict mode or type checking options)
Python:
.flake8,setup.cfg(flake8 section)pyproject.toml(tool.flake8, tool.pylint, tool.ruff sections).pylintrc,pylintrcruff.toml,.ruff.tomlmypy.ini,.mypy.ini
Ruby:
.rubocop.yml,.rubocop_todo.yml
Go:
.golangci.yml,.golangci.yaml
Rust:
clippy.toml,.clippy.tomlrustfmt.toml,.rustfmt.toml
Markdown:
.markdownlint.json,.markdownlint.yaml,.markdownlint.yml.markdownlintrc
General:
.editorconfig- Any file that defines linting rules or ignores
Forbidden Patterns - NEVER Use
Do NOT add these patterns to bypass linting:
# JavaScript/TypeScript
/* eslint-disable */
// eslint-disable-line
// eslint-disable-next-line
/* prettier-ignore */
// @ts-ignore
// @ts-nocheck
# Python
# noqa
# type: ignore
# pylint: disable
# ruff: noqa
# Go
//nolint
//nolint:all
# Ruby
# rubocop:disable
# Rust
#[allow(...)]
#![allow(...)]
If you encounter an issue that seems unfixable, explain the problem to the user and ask how they want to proceed.
Shell Script Linting Rules (SL0001, SL0002)
When fixing shell script lint errors (e.g., from shellcheck or custom shell linters), apply these rules:
SL0001: Variables must use braces
Always wrap shell variables in ${} braces. This prevents ambiguity and word-splitting bugs.
# Bad
echo "$HOME/.local/bin:$PATH"
if [ "$CURRENT_BRANCH" != "$MASTER_BRANCH" ]; then
# Good
echo "${HOME}/.local/bin:${PATH}"
if [ "${CURRENT_BRANCH}" != "${MASTER_BRANCH}" ]; then
SL0002: Use == instead of = for string comparison
In [ and [[ test expressions, use == for string equality, not =.
# Bad
if [ "${CONFIGURATION}" = "Debug" ]; then
# Good
if [ "${CONFIGURATION}" == "Debug" ]; then
General Shell Script Fixes
- Quote all variable expansions —
"${VAR}"not$VAR - Use
[[over[when possible — safer, supports&&,||, pattern matching - Use
$(command)over backticks —`command`is deprecated