Langkau ke kandungan

Cari kod dengan graf kod

Panduan ini menunjukkan cara memasukkan repo ke dalam graf kod dan kemudian menggunakannya untuk menjawab soalan yang sebenarnya anda hadapi sebelum refaktor: apa yang bergantung pada ini?

Graf kod ialah pangkalan data simbol dan tepi yang dibina dengan menghuraikan checkout berdaftar anda menggunakan tree-sitter. Alatnya dihadapi ejen — anda mengaksesnya dengan meminta ejen.

Graf mengindeks Dart, JavaScript, TypeScript, TSX, PHP, Python, Rust, Zig, C, C++, Go, Java, Ruby, C#, Swift, Kotlin, R, Assembly, MATLAB dan Ada. Fail dalam bahasa lain tidak dihuraikan, jadi ia tidak muncul dalam search_code, code_symbol, code_callers, code_callees atau code_impact.

Dua lagi perkara menentukan apa yang diindeks:

  • Dalam work tree git, penghitungan menurut git ls-files --cached --others --exclude-standard, jadi setiap .gitignore, fail abaikan bersarang, .git/info/exclude dan fail pengecualian global dihormati. Itulah yang mengekalkan node_modules dan output binaan di luar graf.
  • Dart yang dijana tetap dibuang. Fail yang dijana biasanya dikomit, jadi git sahaja tidak akan mengecualikannya, dan ia sentiasa berubah pada setiap larian penjanaan kod.

Mendaftarkan checkout mencetuskan RepoAdded, yang memulakan pipeline index_code untuknya secara automatik. Lihat Tambah repositori ke ruang kerja.

Untuk mengindeks semula secara manual:

  1. Buka Tetapan → Ruang kerja → Repositori.
  2. Klik butang Indeks kod pada baris repo itu.
  3. Semasa ia berjalan, butang itu menunjukkan fail yang selesai daripada jumlah keseluruhan, dengan kawalan batal. Apabila ia selesai, ia bertukar menjadi tanda semak dengan bilangan simbol.

Graf dipartisyen mengikut ruang kerja, repo dan checkout: checkout yang dipautkan ialah satu partisyen, dan setiap worktree ruang mendapat partisyen sendiri (dikunci pada id repo terasingnya).

Dua pengehadan patut anda ketahui, kerana ia menjelaskan penantian yang kelihatan seperti tergantung:

  • Pemantau fail hanya membenarkan satu larian indeks pada satu masa pada hos — checkout kedua menunggu. Pipeline index_code dihadkan secara berasingan kepada satu larian bagi setiap ruang kerja, jadi dua repo dalam ruang kerja yang sama beratur; ruang kerja yang berbeza boleh mengindeks secara selari. Pengindeks itu sendiri menjalankan dua larian checkout yang sama secara bersiri supaya permulaan pipeline dan sapuan pemantau tidak boleh menghuraikannya dua kali.
  • Worktree milik ruang dorman (tiada mesej dalam minggu lalu) tidak dipantau dan tidak diindeks. Checkout yang dipautkan kekal dipantau. Keputusan melangkau disemak semula selepas lima minit, jadi ruang yang menjadi aktif semula akan diambil semula.

Minta ejen mencari. Alatnya ialah search_code dan ia memerlukan kedua-dua ruang kerja dan repo:

search_code(workspace_id: "...", repo_id: "...", query: "authentication middleware")

Id repo datang daripada list_repos. Argumen mode yang pilihan ialah keyword, semantic atau hybrid dan lalainya hybrid — BM25 ke atas nama, tandatangan dan komen doc, digabungkan dengan keserupaan vektor.

Setiap hasil membawa id, nama, nama berkelayakan, jenis, laluan fail, baris mula dan baris akhir simbol itu serta tandatangannya apabila ada. id itulah kunci yang anda suapkan kepada setiap alat lain pada halaman ini.

Apabila anda tahu nama tepatnya, cari terus sebagai ganti:

code_symbol(workspace_id: "...", repo_id: "...", name: "MyClass")

Kedua-duanya mengambil symbol_id daripada hasil carian, serta limit yang pilihan (lalai 50):

code_callers(workspace_id: "...", symbol_id: "...")
code_callees(workspace_id: "...", symbol_id: "...")

code_callers memulangkan simbol yang mempunyai tepi masuk ke simbol ini; code_callees memulangkan simbol yang bergantung padanya.

Semak apa yang akan dipecahkan oleh sesuatu perubahan

Bahagian bertajuk “Semak apa yang akan dipecahkan oleh sesuatu perubahan”

Inilah alat yang menjadi tujuan seluruh halaman ini:

code_impact(workspace_id: "...", symbol_id: "...", depth: 3)

Ia mengira jejari kebergantungan terbalik: segala-galanya yang bergantung secara langsung atau transitif pada simbol itu merentasi tepi calls, extends dan implements (imports, mixes-in dan rujukan generik disimpan dalam graf tetapi tidak dilalui di sini). depth ialah bilangan hop maksimum, antara 1 dan 6, dengan lalai 2.

Hasilnya ialah tiga medan:

  • root — simbol yang anda tanyakan
  • impacted — set yang boleh dicapai, termasuk root pada kedalaman 0, setiap satu membawa depth-nya dari root
  • edgeCount — bilangan tepi yang dilalui oleh traversal, sebagai kiraan dan bukan tepi itu sendiri

Jalankannya sebelum anda menamakan semula atau mengubah sesuatu tandatangan dan berikan senarai impacted itu kepada ejen sebagai skopnya.

Hasil disemak terhadap salinan kerja pemanggil sendiri

Bahagian bertajuk “Hasil disemak terhadap salinan kerja pemanggil sendiri”

Bagi pemanggil ejen, id ruang disuntik secara automatik dan hasilnya disahkan terhadap salinan kerja ruang itu. Simbol yang failnya tidak lagi wujud dalam pokok pemanggil akan ditinggalkan dan respons membawa kiraan staleOmitted serta nota yang mengatakan indeks itu lapuk bagi simbol tersebut.

Inilah sebabnya anda dan ejen boleh mendapat jawapan yang berbeza bagi pertanyaan yang sama, dan sebabnya ejen dalam satu ruang boleh mendapat jawapan yang berbeza daripada ejen dalam ruang lain. Setiap perbualan dalam sesuatu ruang berkongsi satu worktree itu. Pengesahan gagal secara terbuka: jawapan yang lapuk lebih diutamakan daripada jawapan yang kosong.

Minta ejen menjalankan code_impact (atau review_studio.blastRadius) apabila anda mahukan jejari letupan sesuatu perubahan. Lihat Pengiraan semakan.

Simbol dan fakta dibenamkan pada masa penulisan dan hanya apabila model pembenaman pada peranti dipasang. Sehingga itu, mode: "semantic" dan separuh semantik bagi hibrid tiada apa-apa untuk dipadankan dan carian pada praktiknya hanya berdasarkan kata kunci.

Pasang model itu di Tetapan → Pelayan → Diagnostik & privasi → Carian semantik sebelum anda mengindeks. Simbol mendapat vektor apabila failnya diinges.

Perhatikan juga bahawa sebarang pembinaan semula binari pelayan akan menempatkan semula dylib tatabahasa dan mengubah mtime-nya, yang membatalkan setiap titik semak indeks dan memaksa satu laluan semula penuh bagi setiap checkout pada larian seterusnya. Ia mengira semula hash, tetapi ia tidak mengekstrak semula fail yang tidak berubah.

Jenis simbol: function, method, class, field, enum, constructor, getter, setter, typedef, extension, mixin, variable.

Jenis tepi: calls, imports, extends, implements, mixes in, references.

Tandatangan kanonik bagi alat ini terdapat dalam Alat MCP.