ข้ามไปยังเนื้อหา

ค้นหาโค้ดด้วยกราฟโค้ด

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

กราฟโค้ดคือฐานข้อมูลของสัญลักษณ์และเส้นเชื่อม ที่สร้างจากการแยกวิเคราะห์เช็กเอาต์ที่คุณลงทะเบียนไว้ด้วย 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 ให้มันโดยอัตโนมัติ ดู เพิ่มรีโปในเวิร์กสเปซ

หากต้องการจัดทำดัชนีใหม่ด้วยตัวเอง:

  1. เปิด การตั้งค่า → เวิร์กสเปซ → รีโพสิทอรี
  2. คลิกปุ่ม จัดทำดัชนีโค้ด ในแถวของรีโป
  3. ระหว่างที่มันทำงาน ปุ่มจะแสดงจำนวนไฟล์ที่ทำเสร็จเทียบกับทั้งหมด พร้อมตัวควบคุมยกเลิก เมื่อเสร็จแล้วมันจะกลายเป็นเครื่องหมายถูกพร้อมจำนวนสัญลักษณ์

กราฟถูกแบ่งพาร์ทิชันตามเวิร์กสเปซ รีโป และเช็กเอาต์: เช็กเอาต์ที่ลิงก์ไว้เป็นหนึ่งพาร์ทิชัน และ 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 บนอุปกรณ์ถูกติดตั้งไว้แล้วเท่านั้น จนถึงตอนนั้น 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