Get the FREE Ultimate OpenClaw Setup Guide →

ln-741-linter-configurator

Scanned
npx machina-cli add skill levnikolaevich/claude-code-skills/ln-741-linter-configurator --openclaw
Files (1)
SKILL.md
8.5 KB

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.

ln-741-linter-configurator

Type: L3 Worker Category: 7XX Project Bootstrap Parent: ln-740-quality-setup

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 (ln-742 does this)
  • Set up test infrastructure (ln-743 does this)
  • Modify source code

Supported Stacks

TechnologyLinterType CheckerFormatterConfig Files
TypeScriptESLint 9+ (flat config)TypeScript (tsc)Prettiereslint.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 configeslint.config.*, .eslintrc*
TypeScriptPrettier config.prettierrc*, prettier.config.*
.NETEditor config.editorconfig
.NETBuild propsDirectory.Build.props
PythonRuff configruff.toml, pyproject.toml
Pythonmypy configmypy.toml, mypy.ini, pyproject.toml [tool.mypy]

Decision Logic:

  1. If config exists and is complete: SKIP (inform user)
  2. If config exists but incomplete: ASK user to merge or replace
  3. If no config exists: CREATE from template

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

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
# OR without uv:
pip install ruff mypy

Phase 4: Generate Lint Script

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

  1. Copy lint_script_template.sh to scripts/lint.sh
  2. Uncomment the check lines matching the detected stack (Python/TypeScript/.NET)
  3. Set TOTAL variable to match the number of active checks
  4. Make file executable: chmod +x scripts/lint.sh
  5. 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: Optional Advanced Tools

Suggest but do not auto-install. Inform user and add as commented lines in scripts/lint.sh.

StackToolPurposeInstall
TypeScriptdependency-cruiserArchitecture boundary validationnpm install -D dependency-cruiser
TypeScriptknipUnused code/dependency detectionnpm install -D knip
Pythonvulture / deadcodeDead code detectionuv add --dev vulture
Pythonimport-linterCircular import preventionuv add --dev import-linter
PythondeptryUnused/missing dependency detectionuv add --dev deptry
.NETCSharpierOpinionated formatter (Prettier for C#)dotnet tool install csharpier

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.


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)
  • User informed of available lint/format commands and optional advanced tools

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
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 failsMissing jitinpm 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 installedpip install ruff or uv add ruff
dotnet format failsMissing SDKInstall .NET SDK

Version: 3.0.0 Last Updated: 2026-02-26

Source

git clone https://github.com/levnikolaevich/claude-code-skills/blob/master/ln-741-linter-configurator/SKILL.mdView on GitHub

Overview

It configures linting, formatting, and type-checking for TypeScript, Python, and .NET projects. It detects the project type, generates config files from templates, installs latest dependencies, and creates a unified lint script, then verifies all linters run without errors.

How This Skill Works

Phase 1 detects existing configurations. Phase 2 copies templates into the project and customizes placeholders. Phase 3 installs dependencies with latest versions and runs a verification pass to ensure all configured linters run cleanly.

When to Use It

  • Starting a new multi-language project and want unified linting across TS, Python, and .NET.
  • Adding linting to an existing repo with missing or outdated configs.
  • Migrating from piecemeal lint setups to a template-based configuration.
  • Setting up React TypeScript projects with React-specific lint tweaks.
  • Bootstrapping CI by generating lint scripts and config templates.

Quick Start

  1. Step 1: Run the configurator at the repo root to scan for existing lint configurations.
  2. Step 2: Let it generate missing configs from templates and customize placeholders as needed.
  3. Step 3: Install dependencies and run lint scripts to verify all linters pass (lint, lint:fix, format, format:check, typecheck).

Best Practices

  • Scan for existing configs before applying templates to avoid overwriting good setups.
  • Always install latest versions—no version pinning—to keep tools up to date.
  • Keep templates in sync with your project structure and language versions.
  • Update isort and mypy/tool configurations to reflect actual package paths.
  • Validate the lint script locally (lint, lint:fix, format, format:check, typecheck) before CI.

Example Use Cases

  • A monorepo with TS and Python apps uses this to align ESLint, Ruff, and mypy across packages.
  • A .NET microservice project gets Roslyn analyzers configured via templates.
  • A Django project uses Ruff and mypy with a centralized lint script.
  • A React + TypeScript app in a mono-repo uses React-specific lint tweaks activated by the templates.
  • A CI pipeline runs npm run lint and dotnet format after bootstrap.

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers