Tool: git — ทำงานกับ repository แบบ guarded โดยไม่เปิดทางให้ลบ source หรือ force-push

git คือ MCP tool ที่เพิ่มเข้ามาสำหรับงาน repository โดยเฉพาะ เดิม ChatGPT ยังใช้ bash เรียก Git ได้ แต่การให้ Git mutation ผ่าน shell ทำให้ขอบเขตตรวจยากกว่า tool ที่รู้ว่า operation นี้กำลังแตะ repository อยู่แล้ว git จึงแยก read-only inspection ออกจาก mutation และวาง guardrail ไว้ใกล้คำสั่ง Git โดยตรง
รองรับ 5 action
| Action | ใช้ทำอะไร | เงื่อนไข |
|---|---|---|
status |
ดู branch และไฟล์ที่เปลี่ยน | read-only; ห้ามส่ง paths, message หรือ branch เพิ่ม |
diff |
ดู diff ของ working tree หรือ staged tree | เลือก staged=true ได้ และปิด external diff/textconv; ระบุ path ได้ |
add |
stage ไฟล์หรือโฟลเดอร์ที่ระบุ | ต้องส่ง paths แบบ explicit; . และรายการว่างถูกปฏิเสธ |
commit |
commit สิ่งที่ stage ไว้แล้ว | ต้องมี message, ไม่รับ path และไม่ stage ให้อัตโนมัติ |
push |
push branch ปัจจุบันไป remote | ใช้ remote ที่มีอยู่แล้ว, รองรับ SSH/HTTPS, ไม่ force และไม่รับ refspec |
ตัวอย่างลำดับที่ตรวจสอบได้:
git(action="status", repo="~/Desktop/my-project")
git(action="diff", repo="~/Desktop/my-project")
git(action="add", repo="~/Desktop/my-project", paths=["src/app.py", "tests/test_app.py"])
git(action="diff", repo="~/Desktop/my-project", staged=true)
git(action="commit", repo="~/Desktop/my-project", message="Fix login validation")
git(action="push", repo="~/Desktop/my-project")
การ commit/push ควรเกิดขึ้นเมื่อผู้ใช้สั่ง operation นั้นชัดเจนเท่านั้น ถ้าต้องการเพียงตรวจผล ให้หยุดที่ status หรือ diff
Repository ต้องอยู่ใน approved workspace
ก่อนเรียก Git ระบบจะ resolve path จริงของ repository ด้วย git rev-parse แล้วตรวจทั้งสองอย่าง:
- work tree root ต้องอยู่ภายใน
V2_WORKSPACE .gitdirectory ต้องอยู่ภายใน workspace เดียวกันด้วย
จึงไม่รับ repo ที่อยู่นอก workspace, repo ที่ resolve ผ่าน symlink ออกไปข้างนอก หรือ Git worktree ที่ metadata ไปอยู่ในตำแหน่งอื่น ระบบยังตรวจ path ของ add ด้วย realpath: path ต้องอยู่ใน repo, ห้ามอ้าง .git เป็น source path และห้ามส่ง . เพื่อขอ stage ทั้ง repo แบบ implicit
Mutation แยกเป็นขั้น ไม่ทำเกินคำขอ
addstage เฉพาะ path ที่ส่งมา ไม่เติมไฟล์อื่นเองcommitcommit เฉพาะ staged changes ที่มีอยู่แล้ว ไม่รับ path เพื่อกันการ stage แอบแฝง- commit message ต้องไม่ว่างและยาวไม่เกิน 4,000 ตัวอักษร
pushอ่าน push URL ของ remote ที่มีอยู่แล้วเท่านั้น ไม่สร้าง remote ใหม่ ไม่รับ local/custom transport และไม่ force-push- หากอยู่บน detached HEAD ต้องส่ง
branchที่ถูกต้องเอง มิฉะนั้นระบบจะหยุดพร้อม error
ผลลัพธ์ถูก cap ที่ 10,000 ตัวอักษรเหมือน tool อื่น หากยาวกว่านั้นจะบันทึกฉบับเต็มใน Endeavor_Hands/work/ พร้อม marker และ diagnostic ให้เปิดอ่านต่อ
Git metadata เปลี่ยนได้เท่าที่จำเป็น
การทำ add, commit หรือ push ต้องให้ Git แก้ index, refs และ lock ภายใน .git ได้ แต่ source file ไม่ควรถูกลบจากช่องทางนี้ ระบบจึงให้ unlink/rename override เฉพาะ .git directory ของ repo ที่ผ่านการตรวจแล้ว ส่วนกฎ deny file-write-unlink ของ workspace และการปิดการลบไฟล์ปกติยังคงอยู่
ถ้ามี .git/index.lock ค้างอยู่ ระบบไม่ลบทิ้งเอง:
- lock ต้องเก่ากว่าเวลาขั้นต่ำและไม่มี process ใดถือ writer อยู่
- lock ที่ไม่ว่างต้องให้ Git parse เป็น complete index ได้ก่อน
- เมื่อผ่านเงื่อนไข ระบบจะ
os.replace()ไปเป็น backup ชื่อindex.lock.stale-<timestamp>เพื่อเก็บหลักฐาน - ถ้าตรวจ owner ไม่ได้, lock ยังใหม่, หรือ index เสีย ระบบจะหยุดและคืน error ให้เจ้าของ repo ตรวจเอง
นี่ทำให้ recovery แก้ปัญหา lock ที่ค้างจริงได้ แต่ไม่เอา metadata ที่อาจกำลังถูกเขียนหรือไฟล์สุ่มที่เสียไปซ่อนทับ
Hooks, signing และ credential
guarded add, commit และ push ปิด repository hooks; commit ปิด commit signing ด้วย เพื่อไม่ให้โค้ดจาก repository ถูกเรียกเป็น side effect ระหว่าง operation ที่ ChatGPT ขอ
สำหรับ HTTPS push ระบบไม่เปิด Git credential helper แบบ shell กว้างๆ แต่เรียก trusted git-credential-osxkeychain โดยตรง ดึง username/password ไว้ใน memory แล้วส่งเป็น one-shot authorization header ให้ Git พร้อมปิด helper chain ค่า credential ไม่ถูกคืนในผลลัพธ์หรือ activity preview ส่วน SSH ใช้ transport ที่ตรวจรูปแบบแล้วและอ่านเฉพาะ config/key path ที่จำเป็น
Git ไม่ใช่ทางลัดข้าม file safety
git ไม่ทำให้ ChatGPT มีสิทธิ์แก้ไฟล์ทุกที่: repo ยังต้องอยู่ใน workspace และกฎของ edit/write_file ยังใช้กับการแก้เนื้อหาไฟล์ตามปกติ การ stage หรือ commit ไม่ได้แปลว่าอนุญาตให้ลบ source, อ่าน credential หรือ force-push ได้
ถ้าต้องแก้ source ให้ใช้ read_file → edit/write_file → bash รัน test → git diff ตรวจ → ค่อย git add/commit/push เมื่อผู้ใช้สั่งครบขั้น
ความคิดเห็น
กำลังโหลดความคิดเห็น...