Hoppa till innehåll

Sök kod med kodgrafen

Den här guiden visar hur du får in ett repo i kodgrafen och sedan använder den för att svara på frågan du faktiskt har före en refaktorering: vad beror på det här?

Kodgrafen är en databas över symboler och kanter som byggs genom att parsa dina registrerade utcheckningar med tree-sitter. Dess verktyg är avsedda för agenter — du når dem genom att be en agent.

Grafen indexerar Dart, JavaScript, TypeScript, TSX, PHP, Python, Rust, Zig, C, C++, Go, Java, Ruby, C#, Swift, Kotlin, R, Assembly, MATLAB och Ada. Filer i något annat språk parsas inte och förekommer därför inte i search_code, code_symbol, code_callers, code_callees eller code_impact.

Ytterligare två saker styr vad som indexeras:

  • I ett git-worktree utgår uppräkningen från git ls-files --cached --others --exclude-standard, så varje .gitignore, nästlad ignore-fil, .git/info/exclude och den globala exclude-filen respekteras. Det är vad som håller node_modules och byggutdata utanför grafen.
  • Genererad Dart tas bort oavsett. Genererade filer är oftast incheckade, så git ensamt skulle inte utesluta dem, och de ändras vid varje kodgenereringskörning.

När du registrerar en utcheckning utlöses RepoAdded, vilket automatiskt startar pipelinen index_code för den. Se Lägg till repos i en arbetsyta.

Så här indexerar du om manuellt:

  1. Öppna Inställningar → Arbetsyta → Arkiv.
  2. Klicka på knappen Indexera kod i repots rad.
  3. Medan den kör visas antalet klara filer av totalen i knappen, tillsammans med en kontroll för att avbryta. När den är klar övergår den till en bock med symbolantalet.

Grafen partitioneras per arbetsyta, repo och utcheckning: den länkade utcheckningen är en partition, och varje ytas worktree får sin egen (nycklad på sitt isolerade repo-id).

Två begränsningar är värda att känna till, eftersom de förklarar en väntan som ser ut som en hängning:

  • Filbevakaren tillåter bara en indexeringskörning i taget på värden — en andra utcheckning får vänta. Pipelinen index_code är separat begränsad till en körning per arbetsyta, så två repos i samma arbetsyta ställer sig i kö; olika arbetsytor kan indexera parallellt. Indexeraren serialiserar själv två körningar av samma utcheckning, så att en pipelinesstart och en bevakarsvep inte kan parsa den två gånger.
  • Worktrees som tillhör vilande ytor (inget meddelande den senaste veckan) bevakas eller indexeras inte. Länkade utcheckningar bevakas fortfarande. Ett beslut att hoppa över kontrolleras om efter fem minuter, så en yta som blir aktiv igen plockas upp.

Be en agent att söka. Verktyget är search_code och det behöver både en arbetsyta och ett repo:

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

Repo-id:n kommer från list_repos. Det valfria argumentet mode är keyword, semantic eller hybrid och har standardvärdet hybrid — BM25 över namn, signaturer och doc-kommentarer, sammansmält med vektorlikhet.

Varje resultat innehåller symbolens id, namn, kvalificerade namn, typ, filsökväg, start- och slutrad samt dess signatur när den har en. id:t är handtaget du skickar in i alla andra verktyg på den här sidan.

När du vet det exakta namnet kan du slå upp det direkt i stället:

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

Båda tar ett symbol_id från ett sökresultat, plus en valfri limit (standard 50):

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

code_callers returnerar symbolerna med en inkommande kant till den här; code_callees returnerar de som den beror på.

Det här är verktyget som hela sidan finns till för:

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

Den beräknar radien för omvända beroenden: allt som direkt eller transitivt beror på symbolen längs kanterna calls, extends och implements (imports, mixes-in och generiska referenser lagras i grafen men vandras inte här). depth är det maximala antalet hopp, mellan 1 och 6, med standardvärdet 2.

Resultatet har tre fält:

  • root — symbolen du frågade om
  • impacted — den nåbara mängden, inklusive roten vid djup 0, där var och en bär sitt depth från roten
  • edgeCount — hur många kanter genomgången korsade, som ett antal i stället för kanterna själva

Kör den innan du byter namn på något eller ändrar en signatur, och ge agenten listan över påverkade som dess omfattning.

Resultaten kontrolleras mot anroparens egen arbetskopia

Avsnitt med rubriken “Resultaten kontrolleras mot anroparens egen arbetskopia”

För en agent som anropare injiceras ytans id automatiskt och resultaten verifieras mot den ytans arbetskopia. En symbol vars fil inte längre finns i anroparens träd utelämnas, och svaret innehåller ett staleOmitted-antal plus en notis om att indexet är inaktuellt för de symbolerna.

Det är därför du och en agent kan få olika svar på samma fråga, och därför en agent i en yta kan få ett annat svar än en agent i en annan. Varje samtal i en yta delar den enda worktreen. Verifieringen misslyckas öppet: ett inaktuellt svar föredras framför ett tomt.

Be en agent köra code_impact (eller review_studio.blastRadius) när du vill ha påverkansradien för en ändring. Se Granskningsberäkning.

Symboler och fakta bäddas in vid skrivtillfället, och bara när inbäddningsmodellen på enheten är installerad. Fram till dess har mode: "semantic" och den semantiska halvan av hybrid inget att matcha mot, och sökningen är i praktiken enbart nyckelordsbaserad.

Installera modellen under Inställningar → Server → Diagnostik och integritet → Semantisk sökning innan du indexerar. Symboler får en vektor när deras fil läses in.

Notera också att varje ombyggnad av serverbinären lägger ut grammatik-dylib-filerna på nytt och ändrar deras mtime, vilket ogiltigförklarar varje indexkontrollpunkt och tvingar fram en fullständig ny genomgång av varje utcheckning vid nästa körning. Den hashar om, men den extraherar inte om oförändrade filer.

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

Kanttyper: calls, imports, extends, implements, mixes in, references.

De kanoniska signaturerna för de här verktygen finns i MCP-verktyg.