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

ภาพประกอบ: 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 แล้วตรวจทั้งสองอย่าง:

  1. work tree root ต้องอยู่ภายใน V2_WORKSPACE
  2. .git directory ต้องอยู่ภายใน workspace เดียวกันด้วย

จึงไม่รับ repo ที่อยู่นอก workspace, repo ที่ resolve ผ่าน symlink ออกไปข้างนอก หรือ Git worktree ที่ metadata ไปอยู่ในตำแหน่งอื่น ระบบยังตรวจ path ของ add ด้วย realpath: path ต้องอยู่ใน repo, ห้ามอ้าง .git เป็น source path และห้ามส่ง . เพื่อขอ stage ทั้ง repo แบบ implicit

Mutation แยกเป็นขั้น ไม่ทำเกินคำขอ

  • add stage เฉพาะ path ที่ส่งมา ไม่เติมไฟล์อื่นเอง
  • commit commit เฉพาะ 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 เมื่อผู้ใช้สั่งครบขั้น

อ่านเพิ่มเติม

ความคิดเห็น

กำลังโหลดความคิดเห็น...