Claude-code-skills ln-741-linter-configurator

Configures ESLint, Prettier, Ruff, mypy, and .NET analyzers. Use when setting up linting and formatting for a project.

install
source · Clone the upstream repo
git clone https://github.com/levnikolaevich/claude-code-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/levnikolaevich/claude-code-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills-catalog/ln-741-linter-configurator" ~/.claude/skills/levnikolaevich-claude-code-skills-ln-741-linter-configurator && rm -rf "$T"
manifest: skills-catalog/ln-741-linter-configurator/SKILL.md
source content

Paths: File paths (

shared/
,
references/
,
../ln-*
) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If
shared/
is missing, fetch files via WebFetch from
https://raw.githubusercontent.com/levnikolaevich/claude-code-skills/master/skills/{path}
.

ln-741-linter-configurator

Type: L3 Worker Category: 7XX Project Bootstrap

Configures code linting, formatting, and type checking tools for TypeScript, Python, and .NET projects.


Purpose & Scope

Does:

  • Detects which linter stack to configure based on project type
  • Checks for existing linter configurations
  • Generates appropriate config files from templates
  • Installs required dependencies (always latest versions, no pinning)
  • Generates unified lint script (
    scripts/lint.sh
    )
  • Verifies all linters run without errors

Does NOT:

  • Configure pre-commit hooks (separate worker)
  • Set up test infrastructure (separate worker)
  • Modify source code

Supported Stacks

TechnologyLinterType CheckerFormatterConfig Files
TypeScriptESLint 9+ (flat config)TypeScript (tsc)Prettier
eslint.config.ts
,
.prettierrc
.NETRoslyn AnalyzersRoslyndotnet format
.editorconfig
,
Directory.Build.props
PythonRuffmypyRuff (built-in)
ruff.toml
,
mypy.toml
(or
pyproject.toml
)

Phase 1: Check Existing Configuration

Before generating configs, check what already exists.

Files to Check:

StackConfig FilesGlob Pattern
TypeScriptESLint config
eslint.config.*
,
.eslintrc*
TypeScriptPrettier config
.prettierrc*
,
prettier.config.*
.NETEditor config
.editorconfig
.NETBuild props
Directory.Build.props
PythonRuff config
ruff.toml
,
pyproject.toml
Pythonmypy config
mypy.toml
,
mypy.ini
,
pyproject.toml [tool.mypy]

Decision Logic:

  1. If no config exists: CREATE from template
  2. If config exists but incomplete (fewer rules/tools than template): EXTEND to match template
  3. If config matches template: SKIP (inform user)

Completeness Check (Python):

AspectCheckTemplate Standard
Ruff rulesCount
select
entries
23+ categories (see
ruff_template.toml
)
Ruff per-file-ignoresTests section exists
tests/**/*.py
with S101,S105,S106,T201
Ruff advancedmccabe, flake8-bugbear, isortAll present
MyPy
strict = true
Enabled
Advanced toolsimport-linter, deptry, vulture in dev depsAll installed
Lint script
scripts/lint.sh
with 7 checks
All 7 active
.editorconfigFile existsPresent

Phase 2: Generate Configuration

Use templates from references/ folder. Customize placeholders based on project.

TypeScript:

  1. Copy
    eslint_template.ts
    to project root as
    eslint.config.ts
  2. Copy
    prettier_template.json
    as
    .prettierrc
  3. Add scripts to
    package.json
    :
    • "lint": "eslint ."
    • "lint:fix": "eslint . --fix"
    • "format": "prettier --write ."
    • "format:check": "prettier --check ."
    • "typecheck": "tsc --noEmit"
    • "lint:all": "npm run typecheck && npm run lint && npm run format:check"
  4. For React projects: uncomment React sections in template

.NET:

  1. Copy
    editorconfig_template.ini
    as
    .editorconfig
  2. Copy
    directory_build_props_template.xml
    as
    Directory.Build.props
  3. Ensure analyzers are included (SDK 5+ includes them by default)

Python:

  1. Copy
    ruff_template.toml
    as
    ruff.toml
    • OR merge into existing
      pyproject.toml
      under
      [tool.ruff]
  2. Copy
    mypy_template.toml
    as
    mypy.toml
    • OR merge into existing
      pyproject.toml
      under
      [tool.mypy]
  3. Update
    known-first-party
    in isort config to match project package name
  4. Update
    files
    in mypy config to match project source directories
  5. Generate advanced tool configs in
    pyproject.toml
    :
    • [tool.importlinter]
      from
      importlinter_template.toml
      -- adapt
      root_packages
      and contracts to project layer structure
    • [tool.vulture]
      from
      vulture_template.toml
      -- adapt
      paths
      to project source directory
    • [tool.deptry]
      from
      deptry_template.toml
      -- adapt
      extend_exclude
  6. Generate
    .editorconfig
    from
    editorconfig_template.ini
    -- adapt
    max_line_length
    to match ruff
    line-length

Phase 3: Install Dependencies

Install required packages. Always install latest versions — no version pinning.

TypeScript:

npm install -D eslint @eslint/js typescript-eslint eslint-config-prettier prettier eslint-plugin-unicorn jiti

For React projects, also install:

npm install -D eslint-plugin-react eslint-plugin-react-hooks

Note on jiti: Required for

eslint.config.ts
on Node.js < 22.10. On Node.js 22.10+ TypeScript configs are supported natively.

.NET:

  • Analyzers included in SDK 5+ — no separate install needed

Python:

uv add --dev ruff mypy import-linter deptry vulture pip-audit
# OR without uv:
pip install ruff mypy import-linter deptry vulture pip-audit

Phase 4: Generate Lint Script

Generate

scripts/lint.sh
from
lint_script_template.sh
with ALL checks for the detected stack.

  1. Copy
    lint_script_template.sh
    to
    scripts/lint.sh
  2. Uncomment ALL check lines matching detected stack -- both basic AND advanced tools:
StackChecksTOTAL
Pythonruff check, ruff format, mypy, lint-imports, deptry, vulture, pip-audit7
TypeScripttypecheck, eslint, prettier, knip, depcruise5
.NETdotnet build, dotnet format2
  1. Set
    TOTAL
    to match active checks count
  2. Uncomment matching auto-fix commands in
    --fix
    block
  3. Make executable:
    chmod +x scripts/lint.sh
  4. For TypeScript: ensure
    "lint:all"
    script exists in
    package.json

Phase 5: Verify Setup

After configuration, verify everything works.

TypeScript:

npx tsc --noEmit
npx eslint .
npx prettier --check .

.NET:

dotnet format --verify-no-changes

Python:

ruff check .
ruff format --check .
mypy

Unified verification:

bash scripts/lint.sh

Expected: Exit code 0 for all checks.

On Failure: Check error output, adjust config, re-verify.


Phase 6: Fix Lint Errors

After generating all configs and installing tools, run

bash scripts/lint.sh --all
to see all violations.

  1. Run
    bash scripts/lint.sh --fix
    to auto-fix what ruff can
  2. Fix remaining errors manually (file by file)
  3. For C901 (complexity) on functions that cannot be refactored now: add
    # noqa: C901
  4. For deptry false positives: add
    [tool.deptry.per_rule_ignores]
    entries
  5. Repeat until
    bash scripts/lint.sh
    passes with 0 failures

Critical Rules

RULE 1: Always include

eslint-config-prettier
(last in config) when using ESLint + Prettier together.

RULE 2: Use ESLint flat config format (

eslint.config.ts
), NOT legacy
.eslintrc
.

RULE 3: Ruff replaces Black, isort, flake8, and many other Python tools. Do NOT install them separately.

RULE 4: Never disable strict TypeScript rules without documented reason.

RULE 5: Always run mypy alongside Ruff for Python projects. Ruff handles style/bugs, mypy handles type safety.

RULE 6: Use

recommendedTypeChecked
as ESLint default, not just
recommended
. Downgrade individual rules if needed.

RULE 7: Never pin dependency versions in install commands -- always install latest.

RULE 8: Advanced static analysis tools (import-linter, deptry, vulture, pip-audit) are MANDATORY for Python projects, not optional.


Monitor (2.1.98+): When lint/typecheck verification commands expected >30s, use

Monitor
. Fallback:
Bash(run_in_background=true)
.

Definition of Done

  • Appropriate config files created for detected stack
  • Dependencies installed (latest versions)
  • scripts/lint.sh
    generated with correct checks for stack
  • Lint command runs without errors on project source
  • Format command runs without errors
  • Type checker runs without errors (mypy for Python, tsc for TypeScript)
  • No ESLint/Prettier conflicts (eslint-config-prettier installed)
  • Advanced tools installed and configured (import-linter, deptry, vulture, pip-audit)
  • scripts/lint.sh
    runs ALL checks (7 for Python) with exit code 0
  • .editorconfig
    created with settings matching ruff config
  • User informed of available lint/format commands

Reference Files

FilePurpose
eslint_template.tsESLint flat config template (TypeScript)
prettier_template.jsonPrettier config template
ruff_template.tomlPython Ruff config template
mypy_template.tomlPython mypy config template
lint_script_template.shUnified lint script template
editorconfig_template.ini.NET editorconfig template
directory_build_props_template.xml.NET analyzers template
importlinter_template.tomlPython import-linter config template
vulture_template.tomlPython vulture config template
deptry_template.tomlPython deptry config template
linter_guide.mdDetailed configuration guide

Error Handling

ErrorCauseResolution
ESLint/Prettier conflictMissing eslint-config-prettierInstall and add as last config
ESLint projectService errorConfig file not in tsconfigAdd to
allowDefaultProject
list
ESLint
.ts
config fails
Missing jiti
npm install -D jiti
TypeScript parse errorsParser version mismatchAlign typescript-eslint with TS version
mypy missing stubsThird-party library without typesAdd
[[mypy.overrides]]
with
ignore_missing_imports
mypy strict too strictHundreds of errors on first runStart with relaxed config, enable strict gradually
Ruff not foundNot installed
pip install ruff
or
uv add ruff
dotnet format failsMissing SDKInstall .NET SDK

Version: 4.0.0 Last Updated: 2026-03-18