ข้ามไปยังเนื้อหาหลัก
ลด 50% ทุกแพลน เวลาจำกัด เริ่มต้นที่ $2.48/mo
14 min left
เครื่องมือนักพัฒนาและ DevOps

วิธีตั้งค่า Linter สำหรับโค้ดที่สร้างโดย AI

S โดย Sherwin 14 นาทีในการอ่าน
ESLint output showing AI-specific lint violations in a TypeScript file

เอเจนต์ AI สามารถสร้างโค้ดที่คอมไพล์ผ่านได้

แต่นั่นยังไม่ใช่มาตรฐานที่คุณต้องการ มาตรฐานคือโค้ดที่ไม่ import สิ่งที่ไม่เคยถูกใช้ ไม่ any-cast เพื่อเลี่ยงออกจากระบบ type ไม่เพิกเฉยต่อค่า error ที่ส่งกลับมา และไม่ฮาร์ดโค้ดข้อมูลรับรองที่ gosec ควรจับได้ก่อนถึงขั้นรีวิว

โมเดล AI เทรนจากคำตอบเก่าๆ บน Stack Overflow และส่งออกแพตเทิร์นที่มันเรียนรู้มาจากตรงนั้น รวมถึง API ที่เลิกใช้แล้ว การไม่ใส่ type annotation และฟังก์ชันที่ถูกต้องในทางเทคนิคแต่ใหญ่เกินกว่าจะรีวิวได้อย่างปลอดภัย คุณจำเป็นต้องมี linter อยู่ในลูป ไม่ใช่ในฐานะคำแนะนำ แต่ในฐานะด่าน

คู่มือนี้ครอบคลุมการตั้งค่าสำหรับสามอีโคซิสเต็ม (Python ด้วย Ruff, TypeScript/JavaScript ด้วย ESLint v10 flat config และ Go ด้วย golangci-lint) พร้อมกฎที่ปรับจูนมาเฉพาะเจาะจงสำหรับแพตเทิร์นความผิดพลาดที่ AI สร้างขึ้น จากนั้นจะครอบคลุมวิธีทำให้ด่านนี้เลี่ยงผ่านได้ยากขึ้นมาก เพื่อให้เอเจนต์ไม่สามารถข้าม hook ในเครื่องด้วย --no-verify ได้ง่ายๆ โดยไม่มีอีกชั้นหนึ่งคอยจับ

การตั้งค่าแบ่งเป็นชั้นๆ คือ การ lint ระดับ IDE จับปัญหาในบรรทัดขณะที่เอเจนต์กำลังเขียน, pre-commit hook จับทุกอย่างที่ไปถึงขั้นพยายาม commit และ CI จับทุกอย่างที่ผ่านในเครื่องมาได้ แต่ละชั้นเป็นอิสระต่อกัน และคุณสามารถเลือกส่วนของภาษาที่ตรงกับสแตกของคุณได้ ชั้นบังคับใช้ทำงานเหมือนกันไม่ว่าคุณจะ lint ภาษาไหน

TL;DR (สรุปย่อ)

  • Ruff (Python), ESLint v10 (TS/JS) และ golangci-lint (Go) แต่ละตัวมีกฎเฉพาะที่จับความผิดพลาดที่พบบ่อยที่สุดของ AI
  • คอนฟิกด้านล่างมีคำอธิบายกำกับ ทุกกฎมีอยู่ด้วยเหตุผลของมัน
  • Lefthook จัดการด่าน pre-commit; afterFileEdit hook ของ Cursor รัน lint ในบรรทัด
  • ชั้นบังคับใช้สี่ชั้นทำให้เอเจนต์ AI ข้ามด่านด้วย --no-verify ได้ยากขึ้นมาก
  • CI คือแนวรับสุดท้าย เอเจนต์ไม่สามารถส่ง --no-verify ไปยัง GitHub Actions ได้

วิธีคอนฟิก Ruff สำหรับโค้ด Python ที่สร้างโดย AI

Terminal output from Ruff flagging unused imports and a missing return type annotation in AI-generated Python code

Ruff คือ linter Python ที่เหมาะสำหรับโค้ดเบสที่ใช้ AI ช่วยเขียน มันเร็วพอที่จะรันทุกครั้งที่บันทึกไฟล์โดยไม่ทำให้อะไรช้าลง มันครอบคลุมทั้ง style และข้อผิดพลาดเชิงตรรกะจริง และมันมาพร้อมพฤติกรรมการจัดรูปแบบ (แทนที่ Black) ในไบนารีเดียวกัน กฎด้านล่างมุ่งเป้าไปที่แพตเทิร์นความผิดพลาดเฉพาะที่โมเดล AI สร้างขึ้นบ่อยที่สุดใน Python

การติดตั้ง Ruff

pip install ruff

# or via uv (faster for new projects):
uv add --dev ruff

เท่านั้นเอง ไม่มีอีโคซิสเต็มของปลั๊กอิน ไม่มีการต่อรอง peer dependency

คอนฟิก pyproject.toml

[tool.ruff]
line-length = 88
target-version = "py311"

[tool.ruff.lint]
select = [
  "E",   # pycodestyle — style consistency
  "F",   # pyflakes — catches unused imports (the most common AI artifact)
  "I",   # isort — import ordering (AI frequently reorders imports incorrectly)
  "N",   # pep8-naming — naming conventions
  "UP",  # pyupgrade — flags deprecated APIs (AI trains on old Stack Overflow answers)
  "S",   # flake8-bandit — security rules: subprocess.shell=True, eval(), hardcoded creds
  "ANN", # type annotation enforcement (AI frequently omits return type annotations)
]
ignore = []  # intentional: do not add sweeping ignores in AI-assisted codebases

[tool.ruff.lint.per-file-ignores]
"tests/**" = ["S101"]  # allow assert in tests

กฎ F คุ้มค่าทันที โค้ด AI สร้างคำสั่ง import สำหรับแพ็กเกจที่สุดท้ายแล้วไม่ได้ใช้ และ F401 (unused import) จับได้ทุกตัว กฎ UP จับการเรียกใช้แพตเทิร์น API ที่เลิกใช้แล้วซึ่ง AI เรียนรู้มาจากคำตอบ Python ก่อนเวอร์ชัน 3.10; เพียงแค่ UP006 และ UP007 ก็ flag แพตเทิร์น type-checking ที่ไม่จำเป็นได้นับสิบ กฎ S (Bandit) จับความผิดพลาดด้านความปลอดภัย: สตริงฮาร์ดโค้ดที่ดูเหมือนข้อมูลรับรอง (S105/S106), การ inject ผ่าน shell ด้วย subprocess(shell=True) (S603/S607), การเลือกใช้การเข้ารหัสที่อ่อนแอ (S324)

การใส่ ignore = [] เป็นการตั้งใจ ทุกข้อยกเว้นที่คุณเพิ่มลงในรายการนี้คือกลุ่มความผิดพลาดของ AI ที่คุณตัดสินใจอนุญาตให้เกิดขึ้น

การรัน Ruff

ruff check .           # lint only — see what's wrong
ruff check --fix .     # auto-fix safe violations (imports, formatting)
ruff format .          # format the codebase (replaces Black)

--fix ใช้การแก้ไขที่ปลอดภัยของ Ruff ตามค่าเริ่มต้น เช่น การลบ import ที่ไม่ได้ใช้ หรือการจัดรูปแบบและแก้ไข lint แบบตรงไปตรงมา Ruff ยังมีการแก้ไขแบบไม่ปลอดภัยอยู่ด้วย แต่ต้องเลือกเปิดใช้อย่างชัดเจนและควรตรวจสอบอย่างระมัดระวังมากขึ้น ตรวจสอบทุกอย่างที่ Ruff แก้ไขให้อย่างปลอดภัยไม่ได้ด้วยตัวเอง

วิธีคอนฟิก ESLint v10 สำหรับโค้ด TypeScript และ JavaScript ที่สร้างโดย AI

ESLint v10 flat config reporting no-explicit-any and max-lines-per-function violations in an AI-generated TypeScript file

ESLint v10 ยกเลิกรูปแบบคอนฟิกเดิม .eslintrc.* ไปแล้ว ตอนนี้ทุกอย่างเป็น flat config ใน eslint.config.mjs หากคุณเจอบทช่วยสอนที่ใช้ .eslintrc.json หรือ .eslintrc.js แสดงว่ามันมุ่งเป้าไปที่ ESLint v8 หรือ v9 ซึ่งไวยากรณ์ต่างกัน ใช้แบบที่อยู่ด้านล่าง

กฎ @typescript-eslint ในคอนฟิกนี้มุ่งเป้าไปที่รูปแบบความผิดพลาดเฉพาะที่เกิดขึ้นซ้ำๆ ใน TypeScript ที่สร้างโดย AI: การใช้ any เป็นทางหนีทีไล่, ฟังก์ชันก้อนใหญ่ที่รีวิวได้ยาก และค่าฮาร์ดโค้ดที่ควรเป็นค่าคงที่

การติดตั้ง ESLint v10 พร้อมการรองรับ TypeScript

npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

# or with pnpm:
pnpm add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

ESLint v10.5.0 เป็นเวอร์ชันปัจจุบัน ณ เดือนมิถุนายน 2026 แพ็กเกจ @typescript-eslint ควรเข้ากันได้กับเวอร์ชัน TypeScript ของคุณ ตรวจสอบ README ของมันเพื่อดูตารางความเข้ากันได้

คอนฟิก eslint.config.mjs

import tseslint from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';

export default [
  {
    files: ['**/*.ts', '**/*.tsx'],
    languageOptions: {
      parser: tsParser,
      parserOptions: { project: './tsconfig.json' },
    },
    plugins: { '@typescript-eslint': tseslint },
    rules: {
      // AI defaults to `any` to bypass the type system — this blocks it
      '@typescript-eslint/no-explicit-any': 'error',

      // AI generates variables it declares but never uses
      '@typescript-eslint/no-unused-vars': 'error',

      // AI writes functions that work but are too long to review safely
      'max-lines-per-function': ['error', { max: 50 }],

      // AI overloads function signatures; this forces decomposition
      'max-params': ['error', 2],

      // AI hardcodes values that should be named constants
      'no-magic-numbers': ['error', { ignore: [0, 1, -1] }],

      // AI writes files that are too large to reason about in a single review
      'max-lines': ['error', { max: 250 }],

      // AI leaves console.log debugging in production code
      'no-console': 'warn',
    },
  },
];

กฎ max-lines-per-function: 50 คือสิ่งที่เข้มข้นที่สุดในคอนฟิกนี้ คุณจะชนมันตลอดเวลาในการรันครั้งแรกในโค้ดเบสที่ใช้ AI ช่วยเขียน นั่นแหละคือจุดประสงค์ คุณควรจะชนมัน ฟังก์ชันที่เกิน 50 บรรทัดเป็นสิ่งแรกที่กลายเป็นสิ่งที่ทำความเข้าใจไม่ได้เมื่อคุณกำลังรีวิวผลลัพธ์ของ AI ในปริมาณมาก

กฎ max-params: 2 บังคับให้แตกย่อย โมเดล AI เรียนรู้จากโค้ดเบสที่ฟังก์ชันรับห้าอาร์กิวเมนต์เป็นเรื่องปกติ; กฎนี้ผลักกลับโดยกำหนดให้เอเจนต์ใช้ options object ซึ่งเป็นการออกแบบที่ดีกว่าและอ่านง่ายกว่า

การรัน ESLint

npx eslint .                       # lint
npx eslint . --fix                 # auto-fix safe issues
npx eslint . --max-warnings 0      # CI mode — treats warnings as errors

ใช้ --max-warnings 0 ในขั้นตอน CI ของคุณ มันยกระดับ warning ของ no-console จาก "บันทึกไว้ในทางเทคนิค" ให้กลายเป็น "บล็อกจริง"

เสริม: กฎที่เข้มงวดขึ้นสำหรับไฟล์ที่สร้างโดย AI

หากทีมของคุณใช้รูปแบบการตั้งชื่อไฟล์เพื่อทำเครื่องหมายโค้ดที่สร้างโดย AI (*.ai.ts, *-generated.ts หรือคล้ายกัน) คุณสามารถใช้กฎที่เข้มงวดขึ้นกับไฟล์เหล่านั้นโดยเฉพาะได้:

// Add to eslint.config.mjs after the main config object
{
  files: ['**/*.ai.ts', '**/*.ai.tsx', '**/*-generated.ts'],
  rules: {
    'max-lines': ['error', { max: 100 }],  // tighter file ceiling
    'complexity': ['error', 5],             // McCabe complexity limit
  },
}

วิธีคอนฟิก golangci-lint สำหรับโค้ด Go ที่สร้างโดย AI

golangci-lint คือตัวรัน multi-linter มาตรฐานสำหรับ Go มันมาพร้อม gosec, errcheck, staticcheck และ linter อื่นๆ อีก 40+ ตัวที่คอนฟิกได้จากไฟล์ YAML เพียงไฟล์เดียว สำหรับโค้ด Go ที่สร้างโดย AI กฎที่สำคัญคือการตรวจสอบค่า error ที่ส่งกลับและการตรวจจับแพตเทิร์นด้านความปลอดภัย: สองหมวดความผิดพลาดที่โมเดล AI พลาดบ่อยที่สุดใน Go

การติดตั้ง golangci-lint

# Official binary installer:
curl -sSfL https://golangci-lint.run/install.sh | sh -s -- -b "$(go env GOPATH)/bin" v2.12.2

# or via Homebrew:
brew install golangci-lint

คอนฟิก .golangci.yml

version: "2"

linters:
  enable:
    - gosec        # security: flags hardcoded creds (G101), file path injection (G304), weak crypto (G401)
    - unused       # flags unused vars and functions — a common AI artifact in Go
    - errcheck     # AI frequently ignores error returns — this blocks it
    - govet        # catches subtle correctness bugs AI introduces
    - staticcheck  # comprehensive static analysis
    - revive       # style: catches non-idiomatic Go patterns AI writes
    - misspell     # AI occasionally misspells in comments and string literals

  settings:
    gosec:
      severity: medium
      confidence: medium
    errcheck:
      check-type-assertions: true  # check `val, ok := x.(Type)` patterns
      check-blank: true            # catch `_ = someErr` error suppression

run:
  timeout: 3m
  issues-exit-code: 1

แพตเทิร์นการจัดการ error ของ Go ชัดเจนโดยการออกแบบ: ทุกฟังก์ชันที่อาจล้มเหลวจะส่งค่า error กลับมา โมเดล AI เข้าใจเรื่องนี้แต่ให้น้ำหนักน้อยเกินไป; พวกมันจะละเว้นการตรวจสอบ error ในเส้นทางโค้ดที่ไม่สำคัญ errcheck ทำให้การละเว้นนั้นกลายเป็นความล้มเหลวด้าน lint

gosec คือ linter ด้านความปลอดภัย สำหรับโค้ด AI มันจับแพตเทิร์นที่ AI หยิบมาจากบทช่วยสอน Go ก่อนปี 2020: การสร้างเลขสุ่มที่ไม่ปลอดภัย (G404), ฟังก์ชันแฮชที่ไม่ปลอดภัย (G401), ปัญหาสิทธิ์ไฟล์ (G306) เหล่านี้คือความผิดพลาดที่คุณจับไม่ได้ในการรีวิวโค้ดเพราะมันดูเป็นไวยากรณ์ปกติ

การรัน golangci-lint

golangci-lint run ./...            # lint all packages
golangci-lint run --fix ./...      # auto-fix where possible

วิธีเชื่อม Linter เข้ากับ Pre-commit Hook

pre-commit hook รัน lint ก่อนทุก git commit และบล็อก commit หาก lint ล้มเหลว นี่หมายความว่าเอเจนต์ AI ไม่สามารถ commit โค้ดที่ไม่ผ่านกฎที่คุณคอนฟิกไว้ได้ มันต้องแก้ไขการละเมิดเสียก่อน

Lefthook เป็นตัวเลือกที่แนะนำ มันใช้ได้ข้ามแพลตฟอร์ม รวดเร็ว และมีรูปแบบคอนฟิกที่ทำงานร่วมกับการบังคับใช้กับเอเจนต์ AI ได้โดยเฉพาะ (กล่าวถึงในส่วนถัดไป)

Lefthook

npm install --save-dev lefthook
npx lefthook install

lefthook.yml:

pre-commit:
  parallel: true
  commands:
    lint-python:
      glob: "*.py"
      run: ruff check {staged_files} --fix
    lint-js-ts:
      glob: "*.{js,ts,tsx}"
      run: npx eslint {staged_files} --fix
    lint-go:
      glob: "*.go"
      run: golangci-lint run {staged_files}
  fail_text: |
    Lint failed. For AI Agents: fix all lint violations before committing.
    Do not use --no-verify to bypass this gate.

ข้อความ fail_text จะถูกอ่านโดยเอเจนต์ AI เมื่อ commit ล้มเหลว แพตเทิร์นนี้มีบันทึกไว้ใน บทความของ Liam Bigelow เรื่องการบังคับใช้ lint ด้วย Lefthook สำหรับ Claude Codeเพียงแค่นี้จะไม่สามารถหยุดเอเจนต์ที่ตั้งใจจริงได้ แต่มันให้คำสั่งถัดไปที่ถูกต้องแก่มัน ("แก้การละเมิด lint") แทนที่จะปล่อยให้มันคาดเดาวิธีเลี่ยงเอาเอง

ทางเลือก: pre-commit (สำหรับการตั้งค่าที่ใช้ Python อย่างเดียว)

หากคุณอยู่บนสแตกที่ใช้ Python อย่างเดียวและชอบใช้เฟรมเวิร์ก pre-commit:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.15.17
    hooks:
      - id: ruff-check
        args: [--fix]
      - id: ruff-format

Cursor: การ Lint ในบรรทัดผ่าน afterFileEdit Hook

หากคุณใช้ Cursor คุณสามารถสั่งให้รัน lint ทันทีเมื่อ AI แก้ไขไฟล์ ก่อนที่มันจะพยายาม commit ด้วยซ้ำ สร้าง .cursor/hooks.json ที่ root ของโปรเจกต์คุณ:

{
  "hooks": {
    "afterFileEdit": [
      {
        "match": "*.py",
        "run": "ruff check {file} --fix"
      },
      {
        "match": "*.{ts,tsx,js}",
        "run": "npx eslint {file} --fix"
      },
      {
        "match": "*.go",
        "run": "golangci-lint run {file}"
      }
    ]
  }
}

สิ่งนี้จะทำงานทุกครั้งที่ AI ของ Cursor แก้ไขไฟล์ เอเจนต์จะได้รับฟีดแบ็กจาก lint ในบรรทัด ก่อนที่มันจะถือว่างานเสร็จสิ้น ดังนั้นการละเมิดส่วนใหญ่จึงถูกแก้ไขก่อนที่จะไปถึงด่าน pre-commit

วิธีทำให้ด่านนี้ถูกเอเจนต์ AI เลี่ยงผ่านได้ยากขึ้น

Diagram of four enforcement layers (CLAUDE.md policy, Claude Code deny rule, PreToolUse hook, and CI backstop) blocking an AI agent from skipping the lint gate with --no-verify

ชั้นบังคับใช้สี่ชั้นทำให้เอเจนต์ AI ข้ามด่าน pre-commit ด้วย --no-verify ได้ยากขึ้นมาก แต่ละชั้นมุ่งเป้าไปที่พื้นผิวการโจมตีที่ต่างกัน: นโยบายใน CLAUDE.md, กฎ deny ของ Claude Code, hook แบบ PreToolUse และแนวรับ CI มองว่ามันเป็นการตั้งค่าแบบหลายชั้น ไม่ใช่การรับประกันสี่ชิ้นที่เป็นอิสระต่อกัน

บางครั้งเอเจนต์ AI ส่ง --no-verify ไปยัง git commit เพื่อข้าม pre-commit hook เมื่อ lint ล้มเหลวและเอเจนต์ตัดสินใจว่าความล้มเหลวนั้น "ไม่เกี่ยวข้องกับการเปลี่ยนแปลงของมัน" การตัดสินใจนั้นไม่ได้ผิดเสมอไป แต่คุณไม่ควรปล่อยให้เอเจนต์ตัดสินใจเองฝ่ายเดียว จุดประสงค์ทั้งหมดของด่าน lint คือมนุษย์เป็นผู้กำหนดนโยบาย; งานของเอเจนต์คือทำให้เป็นไปตามนั้น ไม่ใช่หาทางอ้อมมัน

นี่คือแต่ละชั้นและพื้นผิวการโจมตีที่มันครอบคลุม

ชั้นที่ 1: บันทึกนโยบายไว้ใน CLAUDE.md

## Linting Policy

NEVER use `git commit --no-verify`. All commits must pass pre-commit hooks.
Pre-commit hooks run lint. Fix lint violations before committing. Do not treat
lint failures as unrelated to your changes — they may not be, and you don't get
to decide that.

Claude Code อ่าน CLAUDE.md ตอนเริ่มเซสชัน นี่ไม่ใช่การบังคับใช้; เอเจนต์ยังสามารถพยายามเลี่ยงได้ แต่มันตัดเส้นทาง "ฉันไม่รู้" ออกไป และกำหนดนโยบายที่ชัดเจนซึ่งเอเจนต์ต้องเลือกที่จะละเมิดอย่างจงใจ ซึ่งมันมีโอกาสทำน้อยกว่าการคาดเดาทางเลี่ยงจากความเงียบ

ชั้นที่ 2: กฎ Deny ของ Claude Code

เพิ่มลงใน .claude/settings.json:

{
  "permissions": {
    "deny": [
      "Bash(git commit --no-verify*)"
    ]
  }
}

สิ่งนี้บล็อกการเรียกใช้อย่างชัดเจน ข้อจำกัดหนึ่งคือ: กฎ deny ใช้การจับคู่แบบ prefix ดังนั้นมันจึงจับได้เฉพาะ --no-verify ที่อยู่ทันทีหลัง commit เอเจนต์ที่สร้างสรรค์มากพออาจจัดโครงสร้างการเรียกให้ต่างออกไปได้ อย่าพึ่งพาสิ่งนี้เพียงอย่างเดียว

ชั้นที่ 3: PreToolUse Hook

ติดตั้งแพ็กเกจ block-no-verify:

npm install --save-dev block-no-verify

จากนั้นคอนฟิกมันเป็น PreToolUse hook ในการตั้งค่าของ Claude Code มันจะทำงานก่อนทุกการเรียกใช้เครื่องมือและตรวจสอบอาร์กิวเมนต์เพื่อหา --no-verify ใน git subcommand ทั้งหก ไม่ใช่แค่ commit มันจะออกด้วยค่าที่ไม่ใช่ศูนย์เพื่อบล็อกการเรียกก่อนที่มันจะถูกประมวลผล

คู่มือที่ pydevtools.com พูดตรงๆ ว่า: "ชั้น hook คือชั้นเดียวที่บังคับใช้กฎได้อย่างน่าเชื่อถือ" ใช้สิ่งนี้ร่วมกับชั้นอื่นๆ; อย่าถือว่า hook ในเครื่องตัวใดเป็นการรับประกันทั้งหมด

ชั้นที่ 4: แนวรับ CI

CI รันบนเซิร์ฟเวอร์ ที่ซึ่งเอเจนต์ไม่มี shell ให้ส่ง flag เข้าไปได้:

# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Lint Python
        run: |
          pip install ruff
          ruff check . --output-format github

      - name: Lint JS/TS
        run: npx eslint . --max-warnings 0

      - name: Lint Go
        uses: golangci/golangci-lint-action@v9
        with:
          version: v2.12.2

เอเจนต์ AI ไม่สามารถส่ง --no-verify ไปยัง CI ได้ GitHub Actions รันอย่างเป็นอิสระจากสิ่งที่เอเจนต์ทำในเครื่อง หาก commit ผ่านเข้าไปได้โดยมี lint ที่ล้มเหลว CI จะจับได้ก่อนที่มันจะ merge

นี่คือแนวรับสุดท้าย

โบนัส: ESLint MCP Server

หากคุณใช้ Claude Code มีชั้นเชิงรุกที่ลดความถี่ที่คุณต้องชนด่านลงได้

ESLint MCP server (@eslint/mcp) ผสานรวม ESLint เข้ากับลูปเครื่องมือของเอเจนต์โดยตรง เอเจนต์สามารถสอบถาม ESLint ระหว่างทำงานได้ ก่อนที่มันจะพยายาม commit ติดตั้งแบบ global:

npm install -g @eslint/mcp@latest

เพิ่มลงใน .claude/settings.json:

{
  "mcpServers": {
    "eslint": {
      "command": "npx",
      "args": ["@eslint/mcp@latest"]
    }
  }
}

เมื่อคอนฟิกสิ่งนี้แล้ว เอเจนต์สามารถสอบถาม ESLint ระหว่างทำงานได้ เอเจนต์จะได้รับฟีดแบ็กจาก lint ในบรรทัด และการละเมิดบางส่วนสามารถถูกแก้ไขก่อนที่จะไปถึง hook สิ่งนี้ไม่ได้แทนที่ด่าน แต่ลดสัญญาณรบกวนที่ด่าน

คำถามที่พบบ่อย

ฉันจำเป็นต้องคอนฟิก linter ทั้งสามตัวไหมถ้าฉันทำงานในภาษาเดียว?

ไม่จำเป็น ตั้งค่า linter สำหรับภาษาหลักของคุณและชั้นบังคับใช้ก็พอ หากสแตกของคุณใช้ TypeScript อย่างเดียว ให้คอนฟิก ESLint และข้าม Ruff กับ golangci-lint ไป ส่วนการป้องกันการเลี่ยงผ่านของเอเจนต์ใช้ได้ไม่ว่าคุณจะ lint ภาษาไหน

คอนฟิกเหล่านี้จะทำให้โค้ดเบสที่มีอยู่ของฉันพังในการรันครั้งแรกไหม?

เกือบจะแน่นอน และตั้งใจให้เป็นเช่นนั้น รัน ruff check --fix . หรือ npx eslint . --fix เพื่อแก้ไขการละเมิดที่ปลอดภัยโดยอัตโนมัติก่อน สิ่งที่เหลืออยู่หลังการแก้ไขอัตโนมัติคือรายการที่ต้องรีวิวด้วยตัวเอง: การ cast แบบ no-explicit-any, ฟังก์ชันที่เกิน 50 บรรทัด, การจัดการ error ที่ขาดหายไป ค่อยๆ จัดการสิ่งเหล่านั้นไปทีละขั้น อย่าเพิ่มกฎ ignore เพื่อหลีกเลี่ยงการจัดการกับมัน

Biome เป็นตัวแทนของ ESLint ได้แล้วในตอนนี้ไหม?

Biome v2.5.0 (ปล่อยออกมาเดือนมิถุนายน 2026) สูสีกันในเรื่องการจัดรูปแบบและกฎ lint พื้นฐาน มันเร็วกว่า ESLint และไม่มีภาระการคอนฟิกเลยถ้าคุณติดตั้งผ่าน bun x ultracite@latest init สำหรับทีมที่ต้องการเครื่องมือเดียวและไม่ต้องการความลึกของกฎ @typescript-eslint ทั้งหมด Biome เป็นทางเลือกที่สมเหตุสมผล แต่สำหรับกฎเฉพาะ AI ในคู่มือนี้ (max-params, no-magic-numbers, max-lines-per-function ที่มีเกณฑ์มุ่งเป้า AI) ESLint กับ @typescript-eslint ยังครอบคลุมมากกว่า คุณสามารถรันทั้งคู่ได้: Biome สำหรับการจัดรูปแบบและ lint พื้นฐาน, ESLint สำหรับกฎเฉพาะ AI

จะทำอย่างไรถ้าเอเจนต์ AI ของฉันสร้างการละเมิด lint แบบเดิมซ้ำๆ?

เอเจนต์กำลังหาทางอ้อมกฎแทนที่จะแก้ปัญหาที่ต้นเหตุ สำหรับ no-explicit-any นี่หมายถึงการเพิ่ม type assertion แทนที่จะนิยาม type จริง สำหรับ max-lines-per-function มันหมายถึงการแยกฟังก์ชันช่วยที่ไม่ได้ทำอะไรมีประโยชน์ออกมาแต่ทำให้จำนวนบรรทัดลดลงต่ำกว่าเกณฑ์ ทั้งสองวิธีแก้ไม่ผ่านการรีวิวโค้ด กฎ lint จับอาการได้; ต้นเหตุคือ prompt ของเอเจนต์ ปรับ prompt ให้ระบุข้อจำกัดด้าน type หรือการแตกย่อยที่คาดหวัง; เอเจนต์จะทำตามคำแนะนำโครงสร้างที่ชัดเจนได้น่าเชื่อถือกว่ากฎที่เป็นนัย หากคุณกำลังรันการตั้งค่าเอเจนต์ที่ซับซ้อนกว่านั้น การจำกัดขอบเขตงานให้กับ subagent เฉพาะที่มีข้อจำกัดฝังอยู่ในคำสั่งของมันมักจะยึดได้ดีกว่า prompt เดียวกว้างๆ

ESLint MCP server แทนที่ด่าน pre-commit ได้ไหม?

ไม่ มันลดความถี่ที่เอเจนต์สร้างโค้ดที่ไม่ผ่านด่าน ด่านยังคงรันทุก commit การตรวจสอบในบรรทัดของ MCP server และการบังคับใช้ของ pre-commit hook เสริมซึ่งกันและกัน ดังนั้นอย่าเอาตัวใดออก

แชร์

บทความเพิ่มเติมจากบล็อก

อ่านต่อ

OpenTofu vs Terraform hero graphic: side-by-side code panels under each tool's logo illustrating the choice between the two infrastructure-as-code CLIs
เครื่องมือนักพัฒนาและ DevOps

อธิบาย OpenTofu: การแยกโค้ดจาก Terraform การย้ายระบบ และควรเปลี่ยนหรือไม่

OpenTofu คือซอฟต์แวร์โอเพนซอร์สที่แยกออกมาจาก Terraform ภายใต้ Linux Foundation นี่คือสิ่งที่มันเปลี่ยนแปลง การย้ายระบบเป็นอย่างไรจริงๆ และควรเปลี่ยนในปี 2026 หรือไม่

Sajjad 15 นาทีในการอ่าน
Four Portainer alternatives, Dockge, Arcane, Dockhand, and Komodo, shown as labeled Docker management UI panels
เครื่องมือนักพัฒนาและ DevOps

ทางเลือกแทน Portainer: คู่มือเลือกใช้ Dockge, Arcane, Dockhand และ Komodo ตามกรณีใช้งาน

เปรียบเทียบสี่ทางเลือกแทน Portainer ได้แก่ Dockge, Arcane, Dockhand และ Komodo ทั้งฟีเจอร์ ไลเซนส์ และการใช้งาน เพื่อหาตัวที่เหมาะกับคุณ

Bill 13 นาทีในการอ่าน
Self-hosted visual regression testing running in a CI pipeline with BackstopJS and Docker
เครื่องมือนักพัฒนาและ DevOps

วิธีวาง Visual Regression Testing แบบ self-host ไว้ในไปป์ไลน์ CI ของคุณ

ตั้งค่า visual regression testing แบบ self-host บน CI ด้วย BackstopJS, Docker, รันเนอร์ GitLab/Gitea, การแก้ปัญหา /dev/shm และการเลือกขนาด VPS

Sajjad 13 นาทีในการอ่าน

พร้อมติดตั้งหรือยัง? เริ่มต้น $2.48/เดือน

คลาวด์อิสระ ตั้งแต่ปี 2008 AMD EPYC, NVMe, 40 Gbps คืนเงินภายใน 14 วัน