Herkese selamlar, ben Ömer. Bu yazıda bir süredir beni epey sinir eden küçük ama inatçı bir sorunu ve onu çözmek için geliştirdiğim ClaudeDeck'i anlatmak istiyorum.
Sorun neydi
Projelerimin neredeyse hepsini Claude ile geliştiriyorum. Zamanla masaüstüm klasörlerle doldu ve bir gün hepsini tek bir yerde, ~/ClaudeDeck altında toplamaya karar verdim. Klasörleri taşıdım, Claude'u açtım ve projelerin hiçbirini tanımadığını gördüm.
Konuşma geçmişi, proje hafızası, verdiğim izinler: hepsi eski klasörün yolunda kalmıştı. Klasör aynı klasördü ama Claude için yepyeni bir projeydi. Her taşımada sıfırdan başlamak ya da birkaç farklı dosyada elle yol düzeltmek zorundaydım.
Elle düzeltmek mümkün ama hem sıkıcı hem de riskli. Üstelik projeleri düzenli tutmak istedikçe aynı sorun yeniden karşıma çıkıyordu. Bu yüzden işi bir uygulamaya bırakmaya karar verdim.
Claude bir projeyi nerede tutuyor
İşe önce Claude'un bir projeyi nasıl hatırladığını anlamakla başladım. Claude bir projeyi klasörün tam yoluyla tanıyor ve bu yolu üç ayrı yerde saklıyor:
| Yer | İçindekiler |
|---|---|
| ~/.claude/projects/… | Konuşma kayıtları ve proje hafızası |
| ~/.claude.json | Güven, izin verilen araçlar, MCP ayarları |
| Masaüstü uygulaması kayıtları | Her oturumun hangi klasörde açıldığı |
Kayıt klasörünün adı, proje yolundaki harf ve rakam dışındaki her karakterin - ile değiştirilmesiyle oluşuyor. Masaüstü oturumları ~/Library/Application Support/Claude/claude-code-sessions/**/local_*.json dosyalarında cwd, originCwd ve gitAnchors alanlarıyla tutuluyor.
Denerken şunu gördüm: bir oturumu kimliğiyle yeniden açmak her klasörden çalışıyor; ama "buradaki son oturuma devam et", hafıza ve güven ayarları yola göre bulunuyor. Kaybolan da tam olarak bunlardı.
ClaudeDeck ne yapıyor
ClaudeDeck, ~/ClaudeDeck klasörünün üstünde çalışan ve Finder'a benzeyen küçük bir Mac uygulaması. Projeleri gezmek, dosya sürükleyip bırakmak ve her şeyin yerinde olduğunu görmek için tek bir pencere.
Taşınan bir projeyi tek tıkla Claude'a yeniden bağlıyor. Geçmiş, hafıza ve izinler geri geliyor.
Değişen dosyaları ve her projenin GitHub'a gönderilip gönderilmediğini bir bakışta gösteriyor.
Sürükle bırak, Boşluk ile önizleme, ⌘⌫ ile çöpe atma. Hiçbir şey kalıcı olarak silinmiyor.
Klasör iCloud dışında durduğu için projelerin tek yedeği GitHub. Bu yüzden her projenin yanındaki "gönderildi" rozeti benim için en az yeniden bağlama kadar önemli. Uygulama git tarafında yalnızca okuyor; commit ya da push yapmıyor.
Yeniden bağlama nasıl çalışıyor
Bir projenin klasörü taşındığında uygulamanın üstünde bir şerit beliriyor ve eski yolla yeni yolu yan yana gösteriyor. Tek düğmeye basınca üç kayıt da yeni yere taşınıyor.
Eski kayıt klasörü yenisiyle birleştiriliyor, ayarlar yeni yola aktarılıyor ve masaüstü oturumlarındaki yollar güncelleniyor. Claude açıldığında projeyi kaldığı yerden tanıyor.
ClaudeRelinker eski kayıt klasörünü yenisiyle birleştiriyor (Claude yenisini çoktan oluşturmuş olabilir; aynı isimli dosyada yeni olan kalıyor). ~/.claude.json girdisi taşınıp birleştiriliyor: listeler birleşiyor, bayraklar OR'lanıyor. Masaüstü oturum kayıtlarındaki yollar yeniden yazılıyor, deleted_* klasörleri atlanıyor.
İç içe taşımalarda (bir klasör ve içindeki bir klasör) en özel olan kazanıyor: PathRewriter.rewrite.
Artık ihtiyaç duymadığım projeler için bir de "Unut" seçeneği var. Unutmak silmek değil; kayıtlar yedek klasörüne taşınıyor ve geri taşımak her şeyi geri getiriyor.
Taşınan klasörü bulmak
Yeniden bağlamanın ilk adımı, klasörün nereye gittiğini bilmek. Bunun için üç yöntem sırayla deneniyor:
- Yer imleri: Her projeye macOS'un yer imi veriliyor; Finder'daki takma adların kullandığı yöntem bu. Klasör aynı diskte nereye taşınırsa taşınsın yer imi onu takip ediyor.
- İsimle arama: Yer imi verilmeden önce taşınmış klasörler için çalışma alanında, Masaüstü'nde ve Belgeler'de aynı isimli tek bir klasör aranıyor; bulunursa "isimle bulundu" olarak öneriliyor.
- Elle gösterme: Kalanlar "Kayıp" bölümünde bekliyor; Bul… düğmesiyle yeri gösterilebiliyor.
Yer imleri ProjectBookmarks ile bookmarks.json dosyasında tutuluyor ve Claude'un proje listesini izliyor. İsimle arama LostProjectFinder içinde, üç klasör derinliğe kadar yapılıyor.
Önlemler
Claude'un kayıtlarına dokunmak dikkat isteyen bir iş. Bir hata, bir projenin bütün geçmişini yanlış yere taşıyabilir. O yüzden şu kurallara bağlı kaldım:
- Değişen ya da üzerine yazılan her dosya önce yedekleniyor; ne yapıldığı bir listede kayıt altına alınıyor.
- Claude masaüstü uygulaması açıkken kendi kopyasını geri yazdığı için işlem sırasında uygulama kapatılıyor ve iş bitince arka planda yeniden açılıyor. Terminalde Claude çalışıyorsa işlem hiç başlamıyor.
- Bir kayıt klasörünün hangi projeye ait olduğu ancak kanıtla kabul ediliyor, tahmin yapılmıyor.
Son kural bir hatadan doğdu. İlk sürüm, kanıt bulamadığında konuşma kayıtlarındaki başka bir klasöre bakıp tahmin yürütüyordu ve bir projenin geçmişini yanlış klasöre taşıdı. O günden beri kanıt yoksa uygulama o kaydı "bilinmiyor" olarak bırakıyor.
Yedekler ~/Library/Application Support/ClaudeDeck/Backups/<zaman>/ altına moves.json listesiyle yazılıyor. Kanıt sırası: kayıtlardaki cwd, masaüstü oturumunun cwd'si, sonra önceki bağlamaların günlüğü (storage-paths.json).
Uygulamanın yapısı
Uygulama Swift ve SwiftUI ile yazıldı. Disk, git ve Claude kayıtlarıyla ilgili bütün işler arayüzden ayrı servislerde duruyor; bu sayede testler uygulama hiç açılmadan çalışabiliyor.
ClaudeDeck/
Models/ Değer tipleri
Services/ Disk, git, Claude kayıtları, yeniden bağlama
Store/ AppModel: tek doğruluk kaynağı (@Observable)
Views/ SwiftUI görünümleriDosya tablosu SwiftUI Table yerine NSTableView ile yazıldı; satırlar sürüklenebilir olunca SwiftUI tablosunda çift tıklama bozuluyordu.
Okuyup yeniden yazdığı Claude dosya biçimleri Claude'un iç yapısına ait ve sürümler arasında değişebilir. Bu yüzden uygulama dağıtılmıyor; şimdilik yalnızca benim Mac'imde çalışıyor.
Son söz
ClaudeDeck büyük bir proje değil ama günlük işimi epey rahatlattı. Artık klasörleri gönül rahatlığıyla düzenleyebiliyor, hangi projenin yedeğinin alınıp alınmadığını bir bakışta görebiliyorum.
Benzer bir sorunla uğraşıyorsanız ya da merak ettiğiniz bir yer olursa bana yazmaktan çekinmeyin. Okuduğunuz için teşekkür ederim, bir sonraki yazıda görüşmek üzere.