İçeriğe geç

Kod grafiğiyle kod arama

Bu kılavuz, bir depoyu kod grafiğine nasıl alacağınızı ve ardından bir yeniden düzenlemeden önce gerçekten sorduğunuz soruyu yanıtlamak için ondan nasıl yararlanacağınızı gösterir: buna ne bağlı?

Kod grafiği, kayıtlı checkout’larınızın tree-sitter ile ayrıştırılmasıyla oluşturulan bir sembol ve kenar veritabanıdır. Araçları ajana yöneliktir — onlara bir ajandan isteyerek ulaşırsınız.

Grafik; Dart, JavaScript, TypeScript, TSX, PHP, Python, Rust, Zig, C, C++, Go, Java, Ruby, C#, Swift, Kotlin, R, Assembly, MATLAB ve Ada dillerini indeksler. Başka bir dildeki dosyalar ayrıştırılmaz, bu yüzden search_code, code_symbol, code_callers, code_callees veya code_impact sonuçlarında görünmezler.

İndekslenenleri belirleyen iki etken daha var:

  • Bir git çalışma ağacında numaralandırma git ls-files --cached --others --exclude-standard komutuna bırakılır; böylece her .gitignore, iç içe ignore dosyası, .git/info/exclude ve genel excludes dosyası dikkate alınır. node_modules ile derleme çıktısını graftan uzak tutan şey budur.
  • Üretilmiş Dart dosyaları ise her durumda dışarıda bırakılır. Üretilmiş dosyalar genellikle commit’lenir, dolayısıyla git tek başına onları dışlamaz ve her kod üretimi çalıştırmasında değişip dururlar.

Bir checkout kaydettiğinizde RepoAdded olayı tetiklenir ve bu olay onun için index_code pipeline’ını otomatik olarak başlatır. Bkz. Bir çalışma alanına depo ekleme.

Elle yeniden indekslemek için:

  1. Ayarlar → Çalışma alanı → Depolar yolunu açın.
  2. Deponun satırındaki Kodu indeksle düğmesine tıklayın.
  3. Çalışırken düğme, tamamlanan dosya sayısını toplam dosya sayısı üzerinden gösterir ve yanında bir iptal denetimi bulunur. İş bittiğinde düğme, sembol sayısını gösteren bir onay işaretine dönüşür.

Grafik; çalışma alanına, depoya ve checkout’a göre bölümlenir: bağlantılı checkout tek bir bölümdür ve her alan worktree’si kendi bölümüne sahiptir (yalıtılmış depo kimliğiyle anahtarlanır).

Takılmış gibi görünen bir bekleyişi açıkladıkları için bilmeye değer iki kısıtlama var:

  • Dosya izleyici, ana makinede aynı anda yalnızca bir indeks çalıştırmasına izin verir — ikinci bir checkout bekler. index_code pipeline’ı ayrıca çalışma alanı başına bir çalıştırmayla sınırlıdır, dolayısıyla aynı çalışma alanındaki iki depo kuyruğa girer; farklı çalışma alanları paralel indekslenebilir. İndeksleyicinin kendisi aynı checkout’un iki çalıştırmasını sıraya sokar; böylece bir pipeline başlangıcı ile bir izleyici taraması onu iki kez ayrıştıramaz.
  • Uyku durumundaki alanlara (son bir haftada hiç mesaj almamış olanlara) ait worktree’ler ne izlenir ne de indekslenir. Bağlantılı checkout’lar izlenmeye devam eder. Atlama kararı beş dakika sonra yeniden denetlenir; böylece yeniden etkinleşen bir alan yakalanır.

Aramayı bir ajandan isteyin. Araç search_code’tur ve hem bir çalışma alanına hem de bir depoya ihtiyaç duyar:

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

Depo kimlikleri list_repos’tan gelir. İsteğe bağlı mode argümanı keyword, semantic veya hybrid değerlerini alır ve varsayılanı hybrid’dir — adlar, imzalar ve doküman yorumları üzerinde BM25’in vektör benzerliğiyle kaynaştırılması.

Her sonuç, sembolün kimliğini, adını, nitelikli adını, türünü, dosya yolunu, başlangıç ve bitiş satırını ve varsa imzasını taşır. id, bu sayfadaki diğer tüm araçlara verdiğiniz tanıtıcıdır.

Tam adı biliyorsanız, bunun yerine doğrudan ona bakın:

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

İkisi de bir arama sonucundan gelen bir symbol_id ile isteğe bağlı bir limit (varsayılan 50) alır:

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

code_callers, bu sembole gelen kenarı olan sembolleri döndürür; code_callees ise onun bağımlı olduğu sembolleri döndürür.

Bu sayfanın var olma sebebi olan araç şudur:

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

Ters bağımlılık yarıçapını hesaplar: calls, extends ve implements kenarları boyunca sembole doğrudan ya da dolaylı olarak bağlı olan her şey (imports, mixes-in ve generic referanslar grafta saklanır ama burada dolaşılmaz). depth, en fazla atlama sayısıdır; 1 ile 6 arasında bir değer alır ve varsayılanı 2’dir.

Sonuç üç alandan oluşur:

  • root — hakkında soru sorduğunuz sembol
  • impacted — ulaşılabilen küme; kök 0. derinlikte olacak şekilde kümeye dahildir ve her öğe kökten uzaklığını depth olarak taşır
  • edgeCount — dolaşmanın kaç kenardan geçtiği; kenarların kendisi değil, sayısı

Bir adı ya da bir imzayı değiştirmeden önce bunu çalıştırın ve etkilenenler listesini ajanın kapsamı olarak verin.

Sonuçlar çağıranın kendi çalışma kopyasına göre denetlenir

Bölüm başlığı “Sonuçlar çağıranın kendi çalışma kopyasına göre denetlenir”

Çağıran bir ajansa alan kimliği otomatik olarak eklenir ve sonuçlar o alanın çalışma kopyasına göre doğrulanır. Dosyası çağıranın ağacında artık bulunmayan bir sembol atlanır; yanıt, bir staleOmitted sayısı ve bu semboller için indeksin bayat olduğunu belirten bir not taşır.

Hem sizinle bir ajanın aynı sorguya farklı yanıtlar alabilmesinin hem de bir alandaki ajanın başka bir alandaki ajandan farklı yanıt alabilmesinin nedeni budur. Bir alandaki her konuşma o tek worktree’yi paylaşır. Doğrulama, hata durumunda kabul yönünde başarısız olur: boş bir yanıt yerine bayat bir yanıt tercih edilir.

Bir değişikliğin etki yarıçapını istediğinizde bir ajandan code_impact (veya review_studio.blastRadius) çalıştırmasını isteyin. Bkz. İnceleme hesaplaması.

Semboller ve olgular, yazma anında ve yalnızca cihazdaki gömme modeli kuruluysa gömülür. Model kurulana kadar mode: "semantic" ile hybrid’in anlamsal yarısının eşleştirecek bir şeyi yoktur ve arama fiilen yalnızca anahtar sözcükle çalışır.

İndekslemeden önce modeli Ayarlar → Sunucu → Tanılama ve gizlilik → Anlamsal arama yolundan kurun. Semboller, dosyaları içeri alındığında bir vektör edinir.

Ayrıca sunucu ikili dosyasının her yeniden derlenmesinin gramer dylib’lerini yeniden hazırladığını ve mtime’larını değiştirdiğini unutmayın; bu, her indeks denetim noktasını geçersiz kılar ve bir sonraki çalıştırmada her checkout için tam bir yeniden tarama zorunlu kılar. Yeniden karma hesaplanır, ancak değişmemiş dosyalar yeniden çıkarılmaz.

Sembol türleri: function, method, class, field, enum, constructor, getter, setter, typedef, extension, mixin, variable.

Kenar türleri: calls, imports, extends, implements, mixes in, references.

Bu araçların kurallı imzaları MCP araçları sayfasındadır.