Skip to content
Development
Skill

/lint

Runs linter+typechecker with auto-detected toolchain (ruff/mypy, eslint/tsc, phpstan, golangci-lint, clippy). Triggers: lint, typecheck, static analysis.

From plugin
ai-toolkit
161111 skills44 agents
Install
$ npx -y skills add softspark/ai-toolkit --skill lint --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/lint

Context preview

The summary Claude sees to decide when to auto-load this skill.

Runs linter+typechecker with auto-detected toolchain (ruff/mypy, eslint/tsc, phpstan, golangci-lint, clippy). Triggers: lint, typecheck, static analysis.

SKILL.md

lint.SKILL.md
name: lint
description: "Runs linter+typechecker with auto-detected toolchain (ruff/mypy, eslint/tsc, phpstan, golangci-lint, clippy). Triggers: lint, typecheck, static analysis."
effort: low
disable-model-invocation: true
argument-hint: "[path]"
allowed-tools: Bash, Read

Lint Runner

$ARGUMENTS

Run linting and type checking based on detected project type.

Project context

  • Project files: !`ls pyproject.toml package.json composer.json pubspec.yaml go.mod 2>/dev/null`

Auto-Detection

Run the bundled script to detect available linters:

python3 ${CLAUDE_SKILL_DIR}/scripts/detect-linters.py .

Usage

/lint [path]

Commands by Project Type

| Project Type | Lint Command | Type Check | |--------------|--------------|------------| | **Python** | `ruff check .` | `mypy .` | | **TypeScript/Node** | `npx eslint .` | `npx tsc --noEmit` | | **PHP** | `./vendor/bin/phpstan analyse` | - | | **Go** | `golangci-lint run` | - | | **Rust** | `cargo clippy` | - | | **Flutter/Dart** | `dart analyze` | - |

Python Projects

# Linting
ruff check .

# Type checking
mypy .

# Auto-fix
ruff check --fix .
ruff format .

TypeScript/Node Projects

# Linting
npx eslint .

# Type checking
npx tsc --noEmit

# Auto-fix
npx eslint --fix .

PHP Projects

# Static analysis
./vendor/bin/phpstan analyse

# Code style
./vendor/bin/phpcs
./vendor/bin/phpcbf  # auto-fix

Docker Execution (if applicable)

# Generic pattern - replace {container} with your app container
docker exec {container} make lint
docker exec {container} make typecheck

Quality Gates

  • Linting: 0 errors
  • Type checking: 0 errors (for new code)

Common Issues

| Error | Fix | |-------|-----| | Missing type hints | Add type annotations | | Unused imports | Remove or use `# noqa: F401` | | Line too long | Break line or disable for that line | | Import order | Let linter fix with `--fix` |

Rules

  • **MUST** auto-detect the linter from project config (`pyproject.toml`, `package.json`, `.eslintrc.*`, `composer.json`, `go.mod`, `Cargo.toml`, `pubspec.yaml`) — do not assume
  • **MUST** show the diff before applying any `--fix` run; the user owns the decision to accept auto-fixes
  • **NEVER** suppress lint errors with blanket `# noqa` or `eslint-disable-next-line` without naming the specific rule and a reason
  • **NEVER** run the formatter (ruff format, prettier, dprint) inside a lint pass unless the project has that wired explicitly — formatting and linting are separate concerns
  • **CRITICAL**: report the error count **before and after** any auto-fix — delta visibility is what makes the run trustworthy
  • **MANDATORY**: respect the project's lint config (`.ruff.toml`, `eslint.config.js`, `phpstan.neon`) — overriding project rules on the fly produces arguments during code review

Gotchas

  • `ruff check .` and `ruff format .` are **separate** commands in modern ruff (>0.1.0). Running only `ruff check` misses formatting drift; some repos expect both as part of "lint".
  • `mypy` without `--strict` has a permissive default: missing annotations count as `Any`, so the type checker silently accepts untyped functions. Check whether the project pins `strict = true` in `pyproject.toml` before declaring "0 type errors".
  • `eslint` follows `eslint.config.js` (flat config, ESLint 9+) OR `.eslintrc.*` (legacy). Mixing produces mysterious "no rules applied" errors. Check ESLint version first (`npx eslint --version`).
  • `phpstan` levels (0-10) silently affect which rules apply. A repo at level 5 has different expectations than level 9; report the level alongside the error count.
  • `golangci-lint` composes many linters; disabling one at the project level may still show its warnings if invoked with `--enable-all` flag. Check `.golangci.yml` before treating a warning as a new regression.
  • Dart analyze reports on **all** files including generated `*.g.dart`. Some projects expect generated files to be excluded via `analysis_options.yaml`; without it, lint noise dominates real issues.

When NOT to Use

  • To **fix** the errors — use `/fix` after this skill surfaces them
  • To run tests — use `/test`
  • For code review of logic and design — use `/review`
  • For security-specific static analysis (SAST) — use `/cve-scan` or `/security-patterns`
  • For project-specific rule authoring — edit the linter's config directly
Read more
Ships withai-toolkit

Professional-grade AI coding toolkit with multi-platform support. Machine-enforced safety, 109 skills, 44 agents, expanded lifecycle hooks, persona presets, experimental opt-in plugin packs, and benchmark tooling — works with Claude Code, Claude Chat/Cowork,

Get the whole plugin