วิธีสร้าง Claude Code Agent ที่แก้ไขบั๊กด้วยตัวเองแบบวนซ้ำ (พร้อมขั้นตอนการตั้งค่าแบบละเอียด)

@zodchiii
อังกฤษ4 สัปดาห์ที่ผ่านมา · 17 มิ.ย. 2569
143K
141
18
14
332

TL;DR

คู่มือนี้มอบขั้นตอนการตั้งค่าที่สมบูรณ์สำหรับการสร้าง Claude Code agent ที่แก้ไขตัวเองได้ โดยใช้คำสั่งและ hooks แบบกำหนดเอง ด้วยการใช้โปรโตคอลการจำแนกข้อผิดพลาด Agent จะสามารถวินิจฉัยและซ่อมแซมความล้มเหลวของโค้ดได้ด้วยตนเอง

Claude เขียนโค้ด เกิดข้อผิดพลาดในการทดสอบ แล้วมันก็ส่งข้อผิดพลาดกลับมาให้คุณจัดการเอง

เอเจนต์ที่ซ่อมแซมตัวเองไม่ได้ทำแบบนั้น มันอ่านความล้มเหลวของมันเอง แก้ไขสาเหตุ แล้วรันใหม่จนกว่าทุกอย่างจะผ่าน

ตั้งค่าครั้งเดียว แล้วคุณจะเลิกเป็นคนดีบักฟรีให้กับเอเจนต์ของคุณ

นี่คือการตั้งค่าที่คุณต้องทำทั้งหมด 👇

ก่อนที่เราจะลงรายละเอียด ฉันแชร์บันทึกประจำวันเกี่ยวกับ AI และการเขียนโค้ดแบบ Vibe Coding ไว้ในช่อง Telegram ของฉัน: https://t.me/zodchixquant🧠

darkzodchi - inline image

ทำไมการรันครั้งเดียวถึงไม่พอ

โดยค่าเริ่มต้น Claude จะรันงานเพียงครั้งเดียว เมื่อเทสต์ล้มเหลว มันจะรายงานข้อผิดพลาดและรอต่อไป คุณต้องอ่านข้อผิดพลาดนั้น วางกลับเข้าไป แล้วบอกให้มันลองใหม่ คุณกำลังทำหน้าที่ดีบัก ในขณะที่มันแค่พิมพ์ตาม

เอเจนต์ที่ซ่อมแซมตัวเองจะพลิกบทบาทนั้น มันอ่านความล้มเหลวของตัวเอง คิดหาว่าข้อผิดพลาดเป็นประเภทไหน แก้ไขสาเหตุนั้น แล้วรันใหม่ เหมือนกับวิธีคิดของดีบักเกอร์ คุณจะเข้ามาเกี่ยวข้องก็ต่อเมื่อมันผ่าน หรือเมื่อมันติดขัดจริงๆ เท่านั้น

ไฟล์ที่ 1: คำสั่ง fix

นี่คือลูปที่คุณจะรันจริงๆ วางในไฟล์ .claude/commands/fix.md:

yaml
1---
2description: รันงานและซ่อมแซมตัวเองจนกว่าเทสต์ทั้งหมดจะผ่าน
3argument-hint: <task>
4allowed-tools: Read, Write, Edit, Glob, Grep, Bash
5model: sonnet
6---
7
8Task: $ARGUMENTS
9
10Loop:
111. Implement the task.
122. Run the test suite: `npm test` (or pytest, cargo test).
133. If all tests pass: stop and show me the result.
144. If a test fails: classify the error type, name the root cause,
15 fix that cause, then go back to step 2.
165. Cap at 5 attempts. Announce the attempt number each round.
17
18The classify-then-fix order is the whole point. Diagnosis before
19edit, every round. Never weaken a test to pass, fix the code.

คุณพิมพ์ /fix เพิ่ม pagination ให้กับ endpoint ผู้ใช้ แล้วเอเจนต์จะเขียนโค้ด ทดสอบ และซ่อมแซมตัวเองไปเรื่อยๆ จนกว่าเทสต์ทั้งหมดจะผ่าน

ไฟล์ที่ 2: ฮุคตรวจสอบอัตโนมัติ

คำสั่งนี้ทำงานเมื่อคุณเรียกใช้ ฮุคจะทำให้การตรวจสอบตัวเองเกิดขึ้นอัตโนมัติทุกครั้งที่มีการแก้ไข

เพิ่มในไฟล์ .claude/settings.json:

json
1{
2 "hooks": {
3 "PostToolUse": [
4 {
5 "matcher": "Write|Edit",
6 "hooks": [
7 { "type": "command", "command": "npm test --silent 2>&1 | tail -5 || echo 'TESTS FAILING, fix before continuing'" }
8 ]
9 }
10 ]
11 }
12}

ตอนนี้ทุกครั้งที่ Claude แก้ไขไฟล์ การทดสอบจะทำงานและผลลัพธ์จะกลับมาอยู่ในมุมมองของมันทันที

ข้อผิดพลาดจะแสดงขึ้นมาทันที ทำให้เอเจนต์แก้ไขมันในโฟลว์เดียวกัน โดยไม่ต้องข้ามไปทำอย่างอื่นแล้วเพิ่มการเปลี่ยนแปลงซ้อนทับบนโค้ดที่เสีย

ไฟล์ที่ 3: สอนให้มันอ่านข้อผิดพลาด

นี่คือไฟล์ที่แยกดีบักเกอร์ตัวจริงออกจากนักเดาสุ่ม เอเจนต์ส่วนใหญ่เห็น "test failed" แล้วก็เริ่มแก้ไขแบบสุ่ม

เอเจนต์ที่ดีจะอ่านประเภทของข้อผิดพลาดก่อน เพราะแต่ละประเภทชี้ไปที่สาเหตุที่แตกต่างกัน ใส่นี้ใน CLAUDE.md:

markdown
1## How to read a failure before fixing it
2
3Always name the error type first. Each one means something different:
4
5- Assertion failure (expected X, got Y): the logic is wrong.
6 Trace back from the assertion to where the value was built.
7 Fix the calculation, not the test's expectation.
8
9- Type error / undefined is not a function: a shape mismatch.
10 Something is null, or the wrong type reached this line.
11 Find where that value originates, guard or correct it there.
12
13- Timeout / hang: an await is missing, or a promise never resolves.
14 Look for async calls without await, or a condition that never flips.
15
16- Import / module not found: a path or dependency problem, not logic.
17 Fix the path or install, do not touch the code that uses it.
18
19- Flaky (passes sometimes): shared state or timing, never random.
20 Look for order-dependent tests or unmocked time/network.
21
22Rule: state the type and the one-sentence root cause out loud
23before editing. If you can't name the cause, you're guessing. Stop.

ข้อผิดพลาดแบบ Type error และ Assertion failure ต้องการการแก้ไขที่ตรงกันข้าม: อย่างหนึ่งคือปัญหาด้านโครงสร้างข้อมูลที่ต้นทาง อีกอย่างคือตรรกะที่ผิด ณ จุดนั้น จำแนกก่อน แล้วเอเจนต์จะแก้ไขสิ่งที่ถูกต้อง

ถ้าข้ามขั้นตอนนี้ มันจะแก้ไขแบบสุ่มจนกว่าสีแดงจะหายไป ซึ่งนั่นคือวิธีที่คุณจะได้ชุดเทสต์ที่ผ่านแต่ยังมีบั๊กซ่อนอยู่

สิ่งที่คุณเห็นจริงๆ

คุณพิมพ์บรรทัดเดียว:

text
1/fix ตัวจัดรูปแบบวันที่คืนค่าเขตเวลาไม่ถูกต้อง

จากนั้นมันก็ทำงานเอง:

text
1ครั้งที่ 1
2 รันเทสต์ → ล้มเหลว
3 ประเภท: assertion (คาดว่า 5 แต่ได้ 11)
4 สาเหตุ: หน้าเพจไม่ได้ถูกนำไปใช้กับคิวรี
5 แก้ไข LIMIT clause
6
7ครั้งที่ 2
8 รันเทสต์ → ล้มเหลว
9 ประเภท: type error (offset ไม่ได้กำหนด)
10 สาเหตุ: หน้าที่ 1 ไม่ได้ส่ง offset ตั้งค่าเริ่มต้นผิด
11 เพิ่ม offset = (page-1)*size
12
13ครั้งที่ 3
14 รันเทสต์ → ผ่านทั้งหมด (7/7)
15
16แก้ไขเสร็จใน 3 ครั้ง ต้องการตรวจสอบ diff ไหม?

คุณไม่ต้องวางข้อผิดพลาดกลับไป มันอ่านความล้มเหลวของตัวเอง ระบุสาเหตุแต่ละอย่าง และแก้ไขจนกว่าชุดเทสต์จะผ่าน

ข้อผิดพลาดที่พบบ่อย

แก้ไขก่อนวินิจฉัย ข้อผิดพลาดที่ใหญ่ที่สุด เอเจนต์ที่แก้ไขก่อนระบุประเภทของข้อผิดพลาดกำลังเดาสุ่ม และการเดาสุ่มจะทำให้สีแดงกลายเป็นสีเขียวด้วยโชค ไม่ใช่ด้วยการแก้ไข กฎการจำแนกก่อนคือแนวป้องกันทั้งหมด

ปฏิบัติต่อข้อผิดพลาดทุกประเภทเหมือนกัน ข้อผิดพลาดแบบ Timeout และ Assertion failure ไม่มีอะไรเหมือนกัน แต่เอเจนต์ที่ไม่มีคู่มือประเภทข้อผิดพลาดจะปฏิบัติต่อทั้งสองอย่างว่า "มีอะไรผิดพลาด" และแก้ไขบรรทัดที่ใกล้ที่สุด ครึ่งหนึ่งของการแก้ไขของคุณจะไปอยู่ผิดไฟล์

แก้ที่อาการ การห่อการเรียกที่เกิดข้อผิดพลาดด้วย try/catch ทำให้เทสต์ผ่านแต่ปล่อยบั๊กไว้ โปรโตคอลห้ามการปิดเสียงข้อผิดพลาดด้วยเหตุผลนี้

ปล่อยให้มันทำให้เทสต์อ่อนแอลง เอเจนต์ที่ได้รับอนุญาตให้แก้ไขเทสต์จะลบเทสต์ที่ล้มเหลวในที่สุดเพื่อให้ถึงสถานะผ่าน ชุดเทสต์ที่ผ่านแต่ไม่ได้พิสูจน์อะไรเลยคือผลลัพธ์ที่แย่ที่สุด ดังนั้นกฎนี้จึงไม่สามารถต่อรองได้

การตั้งค่าใช้เวลา 5 นาที

2 นาที: สร้างไฟล์ .claude/commands/fix.md

1 นาที: เพิ่ม PostToolUse hook ลงใน settings.json

1 นาที: เพิ่มโปรโตคอลดีบักตัวเองลงใน CLAUDE.md

1 นาที: รัน /fix บนบั๊กที่รู้จัก แล้วดูมันทำงานแก้สาเหตุทีละครั้ง

คุณจะเลิกเป็นมนุษย์ที่คอยส่งต่อข้อผิดพลาด เอเจนต์อ่านสีแดงของมันเองและแก้ไขจนกว่าจะเป็นสีเขียวมันไม่ได้ฉลาดขึ้น แค่มันหยุดส่งปัญหากลับมาให้คุณ

ขอบคุณที่อ่าน!

ฉันแชร์บันทึกประจำวันเกี่ยวกับ AI การเงิน และการเขียนโค้ดแบบ Vibe Coding ไว้ในช่อง Telegram ของฉัน: https://t.me/zodchixquant

darkzodchi - inline image
บันทึกในคลิกเดียว

อ่านบทความไวรัลเชิงลึกด้วย AI ใน YouMind

บันทึกแหล่งที่มา ถามคำถามที่ตรงประเด็น สรุปข้อโต้แย้ง และเปลี่ยนบทความไวรัลให้เป็นโน้ตที่นำกลับมาใช้ได้ใน AI เวิร์กสเปซเดียว

สำรวจ YouMind
สำหรับครีเอเตอร์

เปลี่ยน Markdown ของคุณให้เป็นบทความ 𝕏 ที่สะอาดตา

เวลาคุณเผยแพร่งานเขียนยาวของตัวเอง การจัดรูปแบบรูปภาพ ตาราง และบล็อกโค้ดให้เข้ากับ 𝕏 นั้นน่าปวดหัว YouMind เปลี่ยนร่าง Markdown ทั้งฉบับให้เป็นบทความ 𝕏 ที่สะอาดตาและพร้อมโพสต์ทันที

ลอง Markdown เป็น 𝕏

แพตเทิร์นให้ถอดรหัสเพิ่มเติม

บทความไวรัลล่าสุด

สำรวจบทความไวรัลเพิ่มเติม