İçeriğe geç
ivralo
Bölümler

Dokümantasyon / Geliştirici modu

Paralel coder'lar ve worktree'ler

Bir planın dalgasında birden fazla kodlama adımı varsa ivralo bunları aynı anda çalıştırır; her Code Engineer kendi git worktree'sinde çalışır. Kaç coder olduğu, worktree'lerin nerede tutulduğu, her coder'ın değişikliğinin üç yönlü bir patch olarak nasıl geri geldiği ve çakışmaların nasıl çözüldüğü bu sayfada.

Kaç coder var

Bir repo'da ekipte, kod işlerinin uzmanı olan birden fazla Code Engineer bulunur. Sayısını IVRALO_CODERS belirler, varsayılan değer 3'tür.

CoderNerede çalışır
Code EngineerHer zamanki gibi sizin çalışma alanınızda
Code Engineer 2, Code Engineer 3, ...ivralo'nun home dizini altında kendine ait bir git worktree'de

Git worktree, aynı repo'nun başka bir klasördeki ikinci bir checkout'udur ve geçmişi repo ile ortaktır. Bir dalgadaki kodlama adımları adım sırasına göre dağıtılır: ilki Code Engineer'a, ikincisi Code Engineer 2'ye, bu şekilde devam eder. Coder sayısından fazla adım varsa fazlası coder'ların önünde sırayla bekler. Tek kodlama adımı olan bir dalgada hiç worktree açılmaz. IVRALO_CODERS=1 ise bütün kodlama adımlarını sırayla sizin çalışma alanınızda çalıştırır.

Paralel coder'lar yalnızca bir plan içinde kullanılır (Plan modu). Plan dışında uzun süren yan bir kodlama işi bir instance olur ve o da kendi worktree'sini alır (Instance'lar).

Worktree'ler nerede tutulur

<home>/worktrees/<slug>-<hash>/2
<home>/worktrees/<slug>-<hash>/3

<slug> repo'nuzun klasör adıdır, <hash> ise tam yolundan hesaplanır. Böylece ikisinin de adı app olan iki checkout hiçbir zaman aynı klasörü paylaşmaz. Her worktree, coder'ın o dalgadaki ilk adımı başladığında sizin HEAD'inizden detached olarak açılır.

Worktree HEAD'den açıldığı için commit'lemediğiniz değişiklikleri göremez. İki ya da daha fazla kodlama adımı olan bir dalga, commit'lenmemiş değişiklikleri olan bir çalışma alanında çalışacaksa plan ekranı bunu siz onaylamadan önce belirtir:

the workspace has uncommitted changes; Code Engineer 2.. start from the last commit

Worktree'de yalnızca git'in takip ettiği dosyalar bulunur: virtual environment, kurulu paketler ya da build çıktısı olmaz. Her coder'a bu durum ve bunların projenin kendi kurulum komutuyla hazırlanacağı söylenir. Bu komutun ne olduğu IVRALO.md'deki # Commands bölümünüzden okunur. ivralo kendisi hiçbir şey kurmaz.

Coder'ları birbirinden ayırmak

Her coder'ın shell'inde ve Python worker'ında IVRALO_CODER değişkeni tanımlıdır: Code Engineer 2 için 2, Code Engineer 3 için 3. Çalışma alanınızdaki Code Engineer'da bu değişken yoktur, dolayısıyla eksik değeri 1 kabul eden bir kurulum onu da kapsar. Aynı anda suite çalıştıran iki coder aynı test veritabanını kullanmasın diye bu değişkeni kendi test kurulumunuzda kullanın. Nasıl kullanılacağını da her coder'ın okuduğu IVRALO.md'ye yazın:

# Conventions

- Testler `shop_test_${IVRALO_CODER:-1}` veritabanını kullanır; `make test-db` onu oluşturur.

Her kodlama adımının prompt'unda ayrıca repo'nun kısa bir özeti bulunur. Bu özet her dalga için bir kez, model çağrısı yapılmadan hazırlanır. Planda bitmiş her kodlama adımı için de bir satır eklenir: adımın dosyaları ve raporunun ilk cümlesi. Hâlâ çalışan bir coder, başka bir coder'ın işini bitirdiğini bir sonraki araç sonucuyla öğrenir. Worktree'deki coder'a orada git worktree, checkout, stash ya da commit çalıştırmaması söylenir, çünkü entegrasyonu ivralo yapar.

Coder'ın yaptığı her düzenleme, diğer bütün düzenlemeler gibi onay ister. Diyaloğa worktree'yi gösteren bir where satırı eklenir. Transcript'te de satırların başında adım ve coder yazar, örneğin step 3 · Code Engineer 2 ›.

Entegrasyon: üç yönlü bir patch

Dalgadaki bütün coder'lar işini bitirince her worktree adım sırasıyla entegre edilir. Code Engineer 1'in adımları zaten sizin çalışma alanınızdadır.

  1. Worktree'nin açıldığı noktadan bu yana oluşan farkın tamamı, commit'lenmiş olsun olmasın, tek bir patch olarak alınır. .ivralo/ hiçbir zaman bu patch'e girmez.
  2. Patch'in dokunduğu her dosya önce ivralo'nun geçmişine kopyalanır, böylece geri getirilebilir.
  3. Patch, .ivralo/ altındaki geçici bir index'e karşı git apply --3way ile uygulanır. Sizin staging alanınız olduğu gibi kalır ve hiçbir şey commit'lenmez. Nelerin geldiğini git diff ile görebilirsiniz.

Üç yönlü uygulamada hunk'lar, worktree açıldığından beri çalışma alanınızda değişen yerlerle (önceki bir coder'ın entegrasyonu ya da sizin commit'lenmemiş düzenlemeniz dahil) çakışmadığı her yere yerleşir. Gerçekten örtüşen bir değişiklik çakışmadır. Bu, merge'ün uyguladığı kuralın aynısıdır.

Uygulamadan önce entegrasyon diyaloğu adımı, coder'ı ve her dosya için eklenen ve silinen satırları gösterir (Düzenleme ve onaylar). Oturum boyunca düzenlemeleri kabul etmek ya da allow_tools'ta edit_file bulunması bu diyaloğu kaldırır. Başında kimse yokken ivralo ask --plan yalnızca allow_tools varsa entegre eder. Yoksa adım not integrated - allow edit_file in permissions.json hatasıyla başarısız olur ve worktree'si saklanır. Her entegrasyondan sonra bir satır yazılır, örneğin step 3: 4 files integrated.

Çakışmalar ve resolve adımı

Bir çakışma geri alınmaz, çözülür. git'in çakışma işaretleri dosyalarda kalır ve ivralo çakışan adımın hemen arkasına (resolve) işaretli bir resolve adımı ekler:

step 2: conflict in src/db.py - resolving (step 3)
⇄ 3. (resolve) Code Engineer: Resolve conflicts in src/db.py

Çalışma alanınızdaki Code Engineer'a hangi dosyaların etkilendiği ve hangi adımın değişikliklerinin çalışma alanında zaten olanlarla çakıştığı söylenir. Ayrıca bütün işaretleri kaldırması ve projenin kontrollerini çalıştırması istenir. Resolve adımı plan onayı beklemeden hemen başlar ve düzenlemeleri diğer bütün düzenlemeler gibi onay ister. Sıradaki worktree onun bitmesini bekler. Resolve adımı ancak hiçbir işaret kalmadığında teslim edilmiş sayılır. O zaman çakışan adımın worktree'si silinir.

Resolve adımı başarısız olursa hata ekranında işaret kalan dosyalar ve saklanan worktree'nin yolu gösterilir. Bu ekranda b, dalgayı geçmiş üzerinden geri alır: entegre edilen her dosyayı patch gelmeden önceki hâline döndürür ve dalganın worktree'lerini siler. Başında kimse yokken ve düzenlemeler için allow_tools tanımlı değilken çakışma olursa adım başarısız sayılır ve işaretler yerinde bırakılır.

Durdurmak ve devam etmek

Coder'lar çalışırken Esc'e basarsanız dalga durur: biten adımların sonuçları korunur, hiçbir şey entegre edilmez ve geride kalan worktree'ler bir satırda listelenir. /plan resume bu adımları yeni worktree'lerde baştan çalıştırır ve saklanan worktree'lerin yerine yenilerini koyar. Bu yüzden içlerinde işinize yarayacak bir şey varsa önce kopyalayın. Resolve adımı sırasında Esc'e basarsanız o ana kadar entegre edilenler, işaretler dahil, korunur ve /plan resume sıradaki iş olarak resolve adımını çalıştırır.

Saklanan bir worktree, o coder için yeni bir worktree açılana kadar kalır. İsterseniz elle silip ardından git worktree prune çalıştırabilirsiniz. ivralo yalnızca kendi worktrees/<slug>-<hash>/ klasörü altındaki worktree'leri siler.