ค้นหาโค้ดด้วยกราฟโค้ด
คู่มือนี้แสดงวิธีนำรีโปเข้าสู่กราฟโค้ด แล้วใช้มันตอบคำถามที่คุณมีอยู่จริงก่อนรีแฟกเตอร์: อะไรบ้างที่พึ่งพาสิ่งนี้
กราฟโค้ดคือฐานข้อมูลของสัญลักษณ์และเส้นเชื่อม ที่สร้างจากการแยกวิเคราะห์เช็กเอาต์ที่คุณลงทะเบียนไว้ด้วย tree-sitter เครื่องมือของมันถูกออกแบบสำหรับเอเจนต์ — คุณเข้าถึงได้โดยการขอให้เอเจนต์ทำ
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”กราฟจัดทำดัชนีภาษา Dart, JavaScript, TypeScript, TSX, PHP, Python, Rust, Zig, C, C++, Go, Java, Ruby, C#, Swift, Kotlin, R, Assembly, MATLAB และ Ada ไฟล์ในภาษาอื่นจะไม่ถูกแยกวิเคราะห์ จึงไม่ปรากฏใน search_code, code_symbol, code_callers, code_callees หรือ code_impact
ยังมีอีกสองอย่างที่กำหนดว่าอะไรจะถูกจัดทำดัชนี:
- ใน git work tree การแจกแจงไฟล์จะยึดตาม
git ls-files --cached --others --exclude-standardดังนั้น.gitignoreทุกไฟล์ ไฟล์ ignore ที่ซ้อนอยู่.git/info/excludeและไฟล์ excludes ส่วนกลางจึงมีผลทั้งหมด นั่นคือสิ่งที่กันnode_modulesและผลลัพธ์จากการบิลด์ออกจากกราฟ - Dart ที่ถูกสร้างขึ้นจะถูกตัดทิ้งไม่ว่าจะกรณีใด ไฟล์ที่ถูกสร้างขึ้นมักถูกคอมมิตไว้ ดังนั้น git เพียงอย่างเดียวจะไม่ตัดมันออก และมันจะถูกแตะใหม่ทุกครั้งที่รัน codegen
จัดทำดัชนีรีโป
หัวข้อที่มีชื่อว่า “จัดทำดัชนีรีโป”การลงทะเบียนเช็กเอาต์จะยิงเหตุการณ์ RepoAdded ซึ่งเริ่มไปป์ไลน์ index_code ให้มันโดยอัตโนมัติ ดู เพิ่มรีโปในเวิร์กสเปซ
หากต้องการจัดทำดัชนีใหม่ด้วยตัวเอง:
- เปิด การตั้งค่า → เวิร์กสเปซ → รีโพสิทอรี
- คลิกปุ่ม จัดทำดัชนีโค้ด ในแถวของรีโป
- ระหว่างที่มันทำงาน ปุ่มจะแสดงจำนวนไฟล์ที่ทำเสร็จเทียบกับทั้งหมด พร้อมตัวควบคุมยกเลิก เมื่อเสร็จแล้วมันจะกลายเป็นเครื่องหมายถูกพร้อมจำนวนสัญลักษณ์
กราฟถูกแบ่งพาร์ทิชันตามเวิร์กสเปซ รีโป และเช็กเอาต์: เช็กเอาต์ที่ลิงก์ไว้เป็นหนึ่งพาร์ทิชัน และ worktree ของแต่ละสเปซได้พาร์ทิชันของตัวเอง (คีย์ด้วย id ของรีโปแบบแยกโดด)
มีตัวจำกัดสองตัวที่ควรรู้ไว้ เพราะมันอธิบายการรอที่ดูเหมือนค้างได้:
- ตัวเฝ้าดูไฟล์รับเพียงหนึ่งรอบการจัดทำดัชนีต่อครั้งบนโฮสต์ — เช็กเอาต์ที่สองต้องรอ ไปป์ไลน์
index_codeถูกจำกัดแยกไว้ที่หนึ่งรอบต่อเวิร์กสเปซ ดังนั้นสองรีโปในเวิร์กสเปซเดียวกันจึงเข้าคิว ส่วนต่างเวิร์กสเปซจัดทำดัชนีขนานกันได้ ตัวจัดทำดัชนีเองจะจัดสองรอบของเช็กเอาต์เดียวกันให้เป็นลำดับ เพื่อให้การเริ่มไปป์ไลน์กับการกวาดของตัวเฝ้าดูแยกวิเคราะห์มันซ้ำไม่ได้ - worktree ที่เป็นของสเปซที่ไม่ได้ใช้งาน (ไม่มีข้อความในสัปดาห์ล่าสุด) จะไม่ถูกเฝ้าดูและไม่ถูกจัดทำดัชนี ส่วนเช็กเอาต์ที่ลิงก์ไว้ยังถูกเฝ้าดูอยู่ การตัดสินใจข้ามจะถูกตรวจซ้ำหลังจากห้านาที สเปซที่กลับมาใช้งานอีกครั้งจึงถูกเก็บเข้ามา
ค้นหาสัญลักษณ์
หัวข้อที่มีชื่อว่า “ค้นหาสัญลักษณ์”ขอให้เอเจนต์ค้นหา เครื่องมือคือ search_code และมันต้องใช้ทั้งเวิร์กสเปซและรีโป:
search_code(workspace_id: "...", repo_id: "...", query: "authentication middleware")id ของรีโปได้มาจาก list_repos อาร์กิวเมนต์ mode เป็นทางเลือก โดยรับค่า keyword, semantic หรือ hybrid และมีค่าเริ่มต้นเป็น hybrid — BM25 บนชื่อ ลายเซ็น และคอมเมนต์เอกสาร หลอมรวมกับความคล้ายเชิงเวกเตอร์
ผลลัพธ์แต่ละรายการบรรจุ id ชื่อ ชื่อแบบเต็ม ชนิด พาธไฟล์ บรรทัดเริ่มและสิ้นสุด และลายเซ็นของมันเมื่อมี id คือตัวจับที่คุณป้อนให้เครื่องมืออื่นทุกตัวในหน้านี้
เมื่อคุณรู้ชื่อที่แน่นอน ให้ค้นหามันโดยตรงแทน:
code_symbol(workspace_id: "...", repo_id: "...", name: "MyClass")ตามรอยการเรียก
หัวข้อที่มีชื่อว่า “ตามรอยการเรียก”ทั้งคู่รับ symbol_id จากผลการค้นหา บวก limit แบบไม่บังคับ (ค่าเริ่มต้น 50):
code_callers(workspace_id: "...", symbol_id: "...")code_callees(workspace_id: "...", symbol_id: "...")code_callers คืนสัญลักษณ์ที่มีเส้นเชื่อมเข้ามาหาตัวนี้ ส่วน code_callees คืนสัญลักษณ์ที่มันพึ่งพา
ตรวจว่าการเปลี่ยนแปลงหนึ่งจะกระทบอะไร
หัวข้อที่มีชื่อว่า “ตรวจว่าการเปลี่ยนแปลงหนึ่งจะกระทบอะไร”นี่คือเครื่องมือที่ทั้งหน้านี้มีอยู่เพื่อมัน:
code_impact(workspace_id: "...", symbol_id: "...", depth: 3)มันคำนวณรัศมีการพึ่งพาแบบย้อนกลับ: ทุกอย่างที่พึ่งพาสัญลักษณ์นี้โดยตรงหรือโดยอ้อมผ่านเส้นเชื่อม calls, extends และ implements (import, mixes-in และการอ้างอิงแบบเจเนอริกถูกเก็บไว้ในกราฟแต่ไม่ถูกไล่ที่นี่) depth คือจำนวนฮอปสูงสุด อยู่ระหว่าง 1 ถึง 6 ค่าเริ่มต้นคือ 2
ผลลัพธ์มีสามฟิลด์:
root— สัญลักษณ์ที่คุณถามถึงimpacted— ชุดที่เข้าถึงได้ รวมรากที่ depth 0 โดยแต่ละรายการพาdepthของตัวเองจากรากมาด้วยedgeCount— จำนวนเส้นเชื่อมที่การไล่ข้ามผ่านไป เป็นจำนวนนับ ไม่ใช่ตัวเส้นเชื่อมเอง
รันมันก่อนที่คุณจะเปลี่ยนชื่อหรือแก้ลายเซ็น แล้วให้รายการที่ได้รับผลกระทบแก่เอเจนต์เป็นขอบเขตงาน
ผลลัพธ์ถูกตรวจเทียบกับสำเนาทำงานของผู้เรียกเอง
หัวข้อที่มีชื่อว่า “ผลลัพธ์ถูกตรวจเทียบกับสำเนาทำงานของผู้เรียกเอง”สำหรับผู้เรียกที่เป็นเอเจนต์ id ของสเปซจะถูกใส่ให้อัตโนมัติ และผลลัพธ์จะถูกตรวจสอบเทียบกับสำเนาทำงานของสเปซนั้น สัญลักษณ์ที่ไฟล์ของมันไม่มีอยู่ในทรีของผู้เรียกอีกต่อไปจะถูกตัดออก และคำตอบจะพาจำนวน staleOmitted มาด้วย พร้อมหมายเหตุว่าดัชนีล้าสมัยสำหรับสัญลักษณ์เหล่านั้น
นี่คือเหตุผลที่คุณกับเอเจนต์อาจได้คำตอบต่างกันสำหรับคำค้นเดียวกัน และเหตุผลที่เอเจนต์ในสเปซหนึ่งอาจได้คำตอบต่างจากเอเจนต์ในอีกสเปซ ทุกการสนทนาในสเปซใช้ worktree เดียวกันนั้นร่วมกัน การตรวจสอบเป็นแบบ fail-open: คำตอบที่ล้าสมัยถูกเลือกไว้เหนือคำตอบที่ว่างเปล่า
ขอให้เอเจนต์รัน code_impact (หรือ review_studio.blastRadius) เมื่อคุณต้องการรัศมีผลกระทบของการเปลี่ยนแปลงหนึ่ง ดู การคำนวณรีวิว
การค้นหาเชิงความหมายต้องมีโมเดล embedding
หัวข้อที่มีชื่อว่า “การค้นหาเชิงความหมายต้องมีโมเดล embedding”สัญลักษณ์และข้อเท็จจริงจะถูกสร้าง embedding ตอนเขียน และเฉพาะเมื่อโมเดล embedding บนอุปกรณ์ถูกติดตั้งไว้แล้วเท่านั้น จนถึงตอนนั้น mode: "semantic" และครึ่งเชิงความหมายของ hybrid จะไม่มีอะไรให้จับคู่ และการค้นหาก็เป็นแบบคีย์เวิร์ดล้วนในทางปฏิบัติ
ติดตั้งโมเดลที่ การตั้งค่า → เซิร์ฟเวอร์ → การวินิจฉัยและความเป็นส่วนตัว → ค้นหาเชิงความหมาย ก่อนจัดทำดัชนี สัญลักษณ์จะได้เวกเตอร์ตอนที่ไฟล์ของมันถูกนำเข้า
โปรดทราบด้วยว่าการบิลด์ไบนารีเซิร์ฟเวอร์ใหม่ทุกครั้งจะเตรียมไวยากรณ์ dylib ใหม่และเปลี่ยน mtime ของมัน ซึ่งทำให้จุดตรวจสอบของดัชนีทุกจุดใช้ไม่ได้ และบังคับให้ไล่เช็กเอาต์ทุกตัวใหม่เต็มรอบในการรันครั้งถัดไป มันจะแฮชใหม่ แต่จะไม่แยกไฟล์ที่ไม่เปลี่ยนแปลงใหม่
อะไรอยู่ในกราฟ
หัวข้อที่มีชื่อว่า “อะไรอยู่ในกราฟ”ชนิดของสัญลักษณ์: function, method, class, field, enum, constructor, getter, setter, typedef, extension, mixin, variable
ชนิดของเส้นเชื่อม: calls, imports, extends, implements, mixes in, references
ลายเซ็นมาตรฐานของเครื่องมือเหล่านี้อยู่ที่ เครื่องมือ MCP