dsh-composer-plus 1.17.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.tr.md CHANGED
@@ -14,7 +14,7 @@ Bu sayfa bir çeviridir. Esas alınan sürüm, İngilizce [README.md](README.md)
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus ile DeepSeek Harness: çalışan proje kenar çubuğunda dönen bir simge gösteriyor, Değişiklikler paneli bir git farkı gösteriyor"></p>
16
16
 
17
- Resmî olmayan bir topluluk eklentisidir. Eklentinin yaptığı tek ağ çağrısı güncelleme denetimidir (GitHub sürümleri ve npm kayıt defteri). Açılışta bu çağrıları durdurmak için **Otomatik güncellemeler** ayarını kapatın. **Özellik fikirleri**, sohbetin kendi modelini yalnızca **Özellik öner** düğmesine tıkladığınızda çağırır. **Sonraki mesaj tahmini** (varsayılan olarak açık), biten her turdan sonra Ayarlar’da seçilen modeli (siz başka bir model seçmediyseniz dsh’nin varsayılan modelini) tıklama olmadan bir kez çağırır. Bu çağrıları durdurmak için özelliği **Ayarlar → Composer Plus** içinden kapatın. **Yazarken tamamla** (varsayılan olarak kapalı), siz açtıktan sonra yazarken her duraklamada kendisi için seçilen modeli (varsayılan olarak tahminin modelini) çağırır. **İstemi iyileştir**, bir modeli yalnızca sihirli değnek düğmesine tıkladığınızda çağırır. **Hedef kontrolü** (varsayılan olarak açık), ajan otomatik bir turda bir `/goal` hedefini tamamlandı olarak her işaretlediğinde bir modeli bir kez çağırır. **Mobil bağlantı** (varsayılan olarak kapalı), yerel ağınızdan veya tailnet’inizden gelen iPhone bağlantılarını yalnızca siz açtıktan sonra kabul eder.
17
+ Resmî olmayan bir topluluk eklentisidir. Eklentinin yaptığı tek ağ çağrısı güncelleme denetimidir (GitHub sürümleri ve npm kayıt defteri). Açılışta bu çağrıları durdurmak için **Otomatik güncellemeler** ayarını kapatın. **Özellik fikirleri**, sohbetin kendi modelini yalnızca **Özellik öner** düğmesine tıkladığınızda çağırır. **Sonraki mesaj tahmini** (varsayılan olarak açık), biten her turdan sonra Ayarlar’da seçilen modeli (siz başka bir model seçmediyseniz dsh’nin varsayılan modelini) tıklama olmadan bir kez çağırır. Bu çağrıları durdurmak için özelliği **Ayarlar → Composer Plus** içinden kapatın. **Yazarken tamamla** (varsayılan olarak kapalı), siz açtıktan sonra yazarken her duraklamada kendisi için seçilen modeli (varsayılan olarak tahminin modelini) çağırır. **İstemi iyileştir**, bir modeli yalnızca sihirli değnek düğmesine tıkladığınızda çağırır. **Görev panosu**, panoda başlattığınız her görevin etiketleri için yeni sohbetin modelini bir kez çağırır. **Hedef kontrolü** (varsayılan olarak açık), ajan otomatik bir turda bir `/goal` hedefini tamamlandı olarak her işaretlediğinde bir modeli bir kez çağırır. **Mobil bağlantı** (varsayılan olarak kapalı), yerel ağınızdan veya tailnet’inizden gelen iPhone bağlantılarını yalnızca siz açtıktan sonra kabul eder.
18
18
 
19
19
  ## Kurulum
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz; bu profili uygulama yönetir.)
31
31
 
32
- > dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.17.0`.
32
+ > dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.19.0`.
33
33
 
34
34
  ## Özellikler
35
35
 
@@ -68,11 +68,14 @@ Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz;
68
68
  | **Hedef kontrolü** | <a id="feature-goalcheck"></a>`/goal` ile bir hedef başlatın. Ajan otomatik bir turda hedefi tamamlandı olarak işaretlediğinde hedef yalnızca iki kontrolden sonra kapanır. Önce projenin test komutu sohbetin klasöründe, sohbetin korumalı alan moduyla çalışır. Komut sizin kendi komutunuzdur ya da `package.json`, `Makefile`, `Cargo.toml`, `go.mod` veya pytest içinde bulunan komuttur. Ajanın kendi en yeni adımı bu testin başarılı bir çalıştırmasıysa test yeniden çalışmaz. Sonra araç kullanmayan bağımsız bir model çağrısı hedefi, bu sohbeti, `git status` çıktısını ve test sonucunu okur. Model bir kanıt tablosuyla yanıt verir: hedefin her parçası kanıtı ve düzeltmesiyle birlikte doğrulandı, yanlış ya da çözülmedi olarak işaretlenir. Hedef yalnız her parça doğrulandığında kapanır. Bir kontrol başarısız olursa hedef etkin kalır, ajan açık her parçayı kanıtı ve düzeltmesiyle okur ve sonraki tur devam eder. Hedef çubuğunun altındaki bir satır (**Hedef kontrolü**) testi, son sonucu ve kaç parçanın doğrulandığını gösterir (tablo için üzerine gelin). **Düzenle** kendi test komutunuzu ve bir süre ya da token sınırını belirler; sınır aşılınca hedef engellenir. Token sınırı sohbetin alt ajanlarını da sayar. **Şimdi çalıştır** kontrolü hedefi kapatmadan çalıştırır. Ayarlar'da kendi **Model** menüsü vardır (varsayılan: **Sohbetin modeliyle aynı**). Hedefi kendiniz tamamladığınızda hiçbir şey kontrol edilmez. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Ekran görüntüsü: Hedef kontrolü"></a> |
69
69
  | **Yeni sohbette devam et** | <a id="feature-handoffchat"></a>Kenar çubuğunda bir sohbete sağ tıklayın (ya da sohbetin **…** menüsünü açın) → **Yeni sohbette devam et…**. Sohbetin kendi modeline yapılan tek çağrı, sohbetten bir devir notu yazar: Görev, Çıktılar, Tamamlananlar, Kararlar, Açık sorunlar ve Sonraki adım. Not, sohbetin gösterdiklerinden yazılır (araç çağrıları ve sonuçları kanıttır; geri aldığınız adımlar dışarıda kalır). Not bir pencerede açılır: okuyun ve düzenleyin. **Yeniden yaz** yeni bir not yazar. **Yeni sohbet başlat** (ya da `Cmd/Ctrl+Enter`), aynı projede ilk mesajı not ve eski sohbetin bağlantısı olan yeni bir sohbet açar; eski sohbet olduğu gibi kalır. Uzun bir sohbet dolduğunda ya da yavaşladığında veya ertesi gün devam etmek için kullanın. Projeye hiçbir şey yazılmaz. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Ekran görüntüsü: Yeni sohbette devam et"></a> |
70
70
  | **Bağlam dökümü** | <a id="feature-contextbreakdown"></a>Sağ kenar çubuğu → `+` → **Bağlam**. Sayfa, açık sohbetin model bağlamını şu anda neyin doldurduğunu ve bağlam penceresinin ne kadarını kullandığını gösterir: sistem istemi, proje talimatları (AGENTS.md), beceriler, mesajlarınız, ajan yanıtları ve araç çağrıları, araç sonuçları (araca göre), MCP sonuçları (sunucuya göre), araç tanımları, sıkıştırma özeti ve diğer bağlam notları; her biri token sayısı ve payıyla. Bir parçaya tıklayın, araçlarını ya da sunucularını görün. Yalnız sohbet günlüğünü okur (`/compact` ve geri almalardan sonraki hâlini), model çağırmaz; her turdan sonra ve **Yenile** ile yeniden okur. Bir sohbetin neden yavaş ya da dolu olduğunu görmek için kullanın, örneğin büyük bir MCP araç sonucu ya da çok sayıda araç tanımı. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Ekran görüntüsü: Bağlam dökümü"></a> |
71
+ | **Planlı adımlar** | <a id="feature-plannedsteps"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Ajan `plan_next_steps` aracını alır: bir komutla aynı mesajda, sonraki komutları kesin argümanları ve bir koşulla planlayabilir; örneğin "derleme geçince `npm test` çalıştır". Sonuç koşulu karşılarsa Composer Plus sonraki adımı yeni bir model çağrısı yapmadan kendisi çalıştırır; böylece uzun bir sohbet daha az token harcar. Adım sohbette kısa bir satırla görünür: "Composer Plus · Planned steps: ran `test` … without a model call"; ardından araç çağrısı ve sonucu gelir. Yalnız `bash`, `read`, `grep` ve `glob` adımları; onaylar, sandbox ve Korunan dosyalar her adımda her zamanki gibi geçerlidir. Koşul tutmazsa, aynı anda iki adım hazırsa, son adımdan sonra ve siz mesaj yazınca model yeniden yanıt verir. Fikir HarnessMM'den (arXiv 2610.32813) gelir. | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Ekran görüntüsü: Planlı adımlar"></a> |
71
72
  | **Korunan dosyalar** | <a id="feature-protectedfiles"></a>Varsayılan olarak açık. Ajanın kendi dosya araçları, desenlerinizle eşleşen dosyaları okuyamaz ve değiştiremez: **okuma ve yazma** desenlerinde bir dosya üzerindeki `read`, `read_image` ve `grep` reddedilir; her iki türde de `write`, `edit` ve `str_replace_editor` reddedilir. Ajan nedenini okur ve size sorması söylenir. Varsayılan desenler `.env*`, `*.pem` ve `*.key`. Ayarlar → Composer Plus → **Korunan dosyalar**: bir desen ekleyin (örneğin `published/**` ya da `config/*.yml`), türüne tıklayarak **okuma ve yazma** ile **yalnızca yazma** arasında geçin, ✕ ile kaldırın ya da **Varsayılanları kullan**. `/` içermeyen bir desen, her klasördeki dosya adıyla eşleşir. Bu bir korkuluktur, korumalı alan değildir: bir kabuk komutu (`cat .env`), bir betik ya da bir MCP aracı dosyaya yine erişebilir (bkz. Sınırlar). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ekran görüntüsü: Korunan dosyalar"></a> |
73
+ | **Engellenen komutlar** | <a id="feature-blockedcommands"></a>Varsayılan olarak açık, liste başta boştur. Ajanın kabuk komutları (`bash`, `pwsh`) kurallarınızla eşleşen bir komutu çalıştıramaz: bir **engelle** kuralı çağrıyı reddeder (ajan nedenini okur ve size sorması söylenir), bir **önce sor** kuralı dsh’nin onay kartını gösterir ve komut yalnızca siz izin verince çalışır. Ayarlar → Composer Plus → **Engellenen komutlar**: bir kural yazın (örneğin `npm publish`, `git push --force` ya da `ssh *192.168.2.19`), türüne tıklayarak **engelle** ile **önce sor** arasında geçin, sonra **Ekle** düğmesine tıklayın; bir kuralın türünü değiştirmek için türüne tıklayın, kuralı ✕ ile kaldırın. Bir kural, bir komut adı ve ondan sonra bu sırayla gelmesi gereken sözcüklerdir; `*` herhangi bir metinle eşleşir. Kontrol, komutu `&&`, `;`, `\|` sonrasında, `$(…)`, `bash -c "…"` ya da `eval` içinde ve `sudo` ya da `env` sonrasında da bulur. Bu bir korkuluktur, korumalı alan değildir: bir değişken (`$CMD`), bir betik dosyası ya da başka bir program komutu yine çalıştırabilir (bkz. Sınırlar). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ekran görüntüsü: Engellenen komutlar"></a> |
74
+ | **Görev panosu** | <a id="feature-taskboard"></a>Sol kenar çubuğu → **Görev panosu**. Kenar çubuğunun gösterdiği canlı durumla dsh sohbetlerinizin kanban panosu: onayınızı, yanıtınızı ya da plan incelemenizi bekleyen sohbet turuncu bir noktayla **İncelemede** sütunundadır, çalışan sohbet **Yapılıyor** sütunundadır, biten sohbet **Bitti** sütunundadır (siz açana kadar yeşil). Soldan bir proje ya da **Tüm projeler** seçin; “Sohbet başına dal” klasörü kendi projesinden sayılır. **Yeni görev** (ya da `n`) yalnız bir istem alır: `Enter` projede yeni bir sohbet başlatır, kart **Yapılacak** sütununda görünür, sohbete dsh ad verir ve sohbetin modeli en çok 3 etiket yazar. Sohbetini açmak için bir karta tıklayın. Turuncu bir kartı panoda yanıtlamak için kartta **Yanıtla** düğmesine tıklayın: **Reddet** ya da **Bir kez izin ver**, plan için **Onayla** ya da **Değişiklik iste**, soru için seçenekler ve kendi metniniz. **Bitenleri gizle**, bu cihazda **Bitti** sütununu gizler. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ekran görüntüsü: Görev panosu"></a> |
72
75
  | **Proje hafızası** | <a id="feature-projectmemory"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Her proje klasörünün kendi hafızası olur ve o projenin sonraki sohbetleri bu hafızayı okur. DS Bot da her Bot için böyle bir hafıza tutar. Her tur bittikten sonra sohbetin modeline bir çağrı yapılır: yeni mesajları okur (geri alınanları okumaz), kalıcı tercihlerinizi, kararlarınızı ve olguları kısa notlar olarak saklar, eski notları değiştirir ya da siler. Ajan da notları kendisi kaydedebilir, silebilir ve arayabilir (`memory_remember`, `memory_forget`, `memory_recall`). Bir not genel de olabilir: o notu her proje okur. Yeni bir sohbet notları sistem isteminde alır; sonra kaydedilen bir not bir sonraki sohbette görünür. Dosyalar dsh ana klasöründe Markdown dosyalarıdır (`storages/dsh-composer-plus/memory/`), hiçbir zaman proje klasöründe değildir. Aynı satırdaki **Hafızayı aç**, kaydedilen tüm notları proje proje (ve genel hafızayı) gösterir; notları filtreleyebilirsiniz. Neyin değişeceğini kendi sözlerinizle yazın (örneğin "yarn yerine artık pnpm kullanıyorum"), sonra **Değişiklikleri önizle**: değişiklikleri dsh’nin varsayılan modeli önerir, yalnız **Uygula** onları kaydeder. Tether’de: sohbet başlığı menüsü → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ekran görüntüsü: Proje hafızası"></a> |
73
76
  | **Sohbet boyunca izin** | <a id="feature-allowforchat"></a>Otomatik inceleme size sorduğunda onay kartında **Bu sohbet boyunca izin ver** düğmesi görünür. Bundan sonra aynı sohbette aynı araca, parametreleri ne olursa olsun, süre sınırı dolana kadar izin verilir (varsayılan olarak 1 saat; süreyi **Ayarlar → Composer Plus → Sohbet boyunca izin** içinden seçin). Sonra ajan yeniden sorar. Başlıktaki küçük bir etiket izinleri bitiş saatleriyle listeler ve kaldırır. İzinler yeniden başlatmadan sonra da korunur. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ekran görüntüsü: Sohbet boyunca izin"></a> |
74
77
  | **Proje durumu** | <a id="feature-projectstatus"></a>Kenar çubuğundaki proje satırı, sohbetlerindeki dönen simge / bekliyor / tamamlandı işaretinin aynısını gösterir. Böylece daraltılmış bir proje de içindeki bir sohbetin çalıştığını ya da sizi beklediğini gösterir. Önce sizi bekleyen bir sohbet gösterilir, sonra henüz açmadığınız tamamlanmış bir sohbet (yeşil nokta, başka bir sohbet hâlâ çalışırken de), sonra dönen simge. Ayrıntılar için üzerine gelin. **Çalışma alanı ağacı** görünümünde üst klasörün satırı, içindeki her projenin (örneğin `.worktrees/` içindeki her dal klasörünün) sohbetlerini de gösterir. Bu, klasör daraltılmışken de geçerlidir. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ekran görüntüsü: Proje durumu"></a> |
75
- | **Sohbet satırlarında Git dalı** | <a id="feature-sessionbranch"></a>Kenar çubuğundaki her sohbet satırı, küçük gri bir etiketle sohbetin proje klasörünün sohbetin son turunda bulunduğu git dalını gösterir (örneğin `main` ya da `feature/login`; ayrık HEAD durumunda dal olmadığından etiket görünmez). Böylece bir projenin farklı dallardaki iki sohbeti artık aynı görünmez ve bir sohbeti yanlış dalda sürdürmek üzereyken bunu hemen görürsünüz. Dalın tam adını görmek için etiketin üzerine gelin. Host tarafı dalı bir tur başlarken ve biterken okur (`git branch --show-current`, salt okunur). Bu özelliği yükledikten sonra hiç turu olmayan bir sohbette ya da Git deposu olmayan bir klasörde etiket görünmez. Sohbetin üstündeki proje satırının adı dalın adıyla aynıysa (örneğin bir “Sohbet başına dal” klasöründe), sohbet satırında dal etiketi görünmez; “Tek listede” görünümünde etiket yine görünür. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ekran görüntüsü: Sohbet satırlarında Git dalı"></a> |
78
+ | **Sohbet satırlarında Git dalı** | <a id="feature-sessionbranch"></a>Kenar çubuğunun “Tek listede” görünümünde her sohbet satırı, küçük gri bir etiketle sohbetin proje klasörünün sohbetin son turunda bulunduğu git dalını gösterir (örneğin `main` ya da `feature/login`; ayrık HEAD durumunda dal olmadığından etiket görünmez). Böylece bir projenin farklı dallardaki iki sohbeti artık aynı görünmez ve bir sohbeti yanlış dalda sürdürmek üzereyken bunu hemen görürsünüz. Dalın tam adını görmek için etiketin üzerine gelin. Host tarafı dalı bir tur başlarken ve biterken okur (`git branch --show-current`, salt okunur). Bu özelliği yükledikten sonra hiç turu olmayan bir sohbette ya da Git deposu olmayan bir klasörde etiket görünmez. “Çalışma alanı” ve “Çalışma alanı ağacı” görünümlerinde sohbet zaten proje satırının altında olduğu için hiçbir sohbet satırında etiket görünmez. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ekran görüntüsü: Sohbet satırlarında Git dalı"></a> |
76
79
  | **Tümünü okundu işaretle** | <a id="feature-markprojectread"></a>Kenar çubuğunda bir projenin **…** düğmesine tıklayın → **Tümünü okundu işaretle**. O projedeki her sohbetin yeşil okunmamış noktası hemen kalkar. Diğer projelerin noktaları kalır. Projede okunmamış sohbet yoksa öğe soluk görünür (**Okunmamış sohbet yok**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Ekran görüntüsü: Tümünü okundu işaretle"></a> |
77
80
  | **Etkin projeler üstte** | <a id="feature-activeprojectsfirst"></a>Bir sohbet çalışmaya başladığında ya da sizi beklediğinde, projesi dsh’nin kendi satır animasyonuyla kenar çubuğunun en üstüne taşınır (projeyi oraya sürüklediğinizdeki hareketin aynısı). Tamamlanan projeler yerinde kalır. Onları her zamanki gibi istediğiniz yere sürükleyebilirsiniz. Taşımalar dsh’nin proje sırasına kaydedilir. Bu yüzden özelliği kapatmak mevcut sırayı korur. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ekran görüntüsü: Etkin projeler üstte"></a> |
78
81
  | **Yakın zamanda aktif proje filtresi** | <a id="feature-recentprojects"></a>Kenar çubuğu → görünüm seçenekleri (kaydırıcı simgesi) → **Son 2 saatte aktif olanlar**. Bu seçenek seçiliyken kenar çubuğu yalnızca son 2 saatte etkin bir sohbeti olan projeleri gösterir. Etkin sohbet şunlardan biridir: bu sürede güncellenen bir sohbet, çalışan ya da bekleyen bir sohbet, açık olan sohbet veya henüz açmadığınız tamamlanmış bir sohbet (dsh’nin yeşil “tamamlandı” noktası). Sonuncusu 2 saat geçtikten sonra da geçerlidir. Böyle bir sohbeti olmayan projeler gizlenir; yeni ve boş projeler de gizlenir. **Çalışma alanı ağacı** görünümünde, içindeki bir proje etkin olduğu sürece üst klasör görünür kalır ve son 2 saatte etkin olmayan sohbetler de gizlenir; böylece yalnızca yakın zamandaki sohbetler görünür. Tüm projeleri göstermek için seçeneği yeniden seçin. Seçim bu cihazda saklanır. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Ekran görüntüsü: Yakın zamanda aktif proje filtresi"></a> |
@@ -82,7 +85,7 @@ Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz;
82
85
  | **Boştayken bekleyen sohbeti aç** | <a id="feature-idleswitch"></a>Bir sohbet soru sorduğunda, bir onay veya plan incelemesi beklediğinde (turuncu nokta) ya da henüz okumadığınız bir turu bitirdiğinde (yeşil nokta) ve siz dsh'yi 30 saniye kullanmadığınızda, dsh o sohbeti açar. Turuncu sohbetler yeşillerden önce açılır. Her grupta en uzun süredir bekleyen önce açılır. Sonraki, yine 30 saniye kullanılmadığında açılır. Bir tuş, tıklama, fare hareketi, kaydırma tekerleği veya dokunma 30 saniyeyi yeniden başlatır. Odaktaki alanda metin olması, seçili metin ya da açık bir menü veya iletişim kutusu da geçişi durdurur. Bekleyen bir sohbet ekrandayken hiçbir şey değişmez. Bekleyen bir sohbetten yanıt vermeden ayrılırsanız, sohbet bir sonraki 30 saniyelik boşlukta yeniden açılabilir. Yeşil bir sohbet açılınca noktası kalkar. Sonraki yeşil sohbet, siz dsh'yi yeniden kullandıktan sonra 30 saniye boşta kalınca açılır. Bu, dsh arka plandayken de çalışır ama dsh öne gelmez. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Ekran görüntüsü: Boştayken bekleyen sohbeti aç"></a> |
83
86
  | **Uygulama dili** | <a id="feature-language"></a>Ayarlar → Composer Plus → **Uygulama dili**, dsh arayüzünün tamamını Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt veya हिन्दी diline geçirir (aşağıya bakın). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ekran görüntüsü: Uygulama dili"></a> |
84
87
  | **Mobil bağlantı (iPhone)** | <a id="feature-mobileconnect"></a>dsh’yi iPhone’unuzdan [Tether](tether/) uygulamasıyla, aynı Wi-Fi ağında ya da [Tailscale](https://tailscale.com) üzerinden kullanın. Özelliği **Ayarlar → Composer Plus** içinden açın (varsayılan olarak kapalıdır, çünkü bu Mac’te bir ağ portu açar). Sonra kenar çubuğunun sol altındaki **Mobil bağlantı** düğmesine tıklayın. QR kodunu iPhone’un Kamera uygulamasıyla (**Open in Tether** düğmesine dokunun) ya da Tether’deki **Scan code** ile tarayın. **Connect** düğmesine dokunun ve **Approve** düğmesine tıklayın. Önce Tether’i yükleyin: Tether yüklü değilse Kamera bu kodu açamaz. Telefon sohbetlerinizi gösterir, mesaj gönderir (fotoğraflarla birlikte: mesaj alanındaki **+** → Camera, Photos ya da Paste image), onayları ve soruları yanıtlar, modelleri ve ajanları değiştirir. İstediğiniz kadar Mac eşleştirebilirsiniz: uygulamanın sol üstündeki Mac adıyla Mac’ler arasında geçiş yaparsınız. **Mobil bağlantı** paneli eşleştirilmiş iPhone’ları son bağlantı zamanlarıyla listeler: **Remove** ile birinin bağlantısını hemen kesersiniz. “Tailscale only” yerel ağı reddeder (paylaşılan bir Wi-Fi için) ve erişim günlüğü kimin bağlanmayı denediğini gösterir. Tether’de “Settings → Privacy” uygulamayı Face ID ile kilitler. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ekran görüntüsü: Mobil bağlantı (iPhone)"></a> |
85
- | **Otomatik güncellemeler** | <a id="feature-autoupdate"></a>dsh açıldığında eklenti [en son GitHub sürümünü](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) denetler. Bu sürüm daha yeniyse ve npm’de de varsa, tam olarak o sürümü dsh’nin kendi eklenti yöneticisiyle yükler (Ayarlar → Eklentiler ile aynı yol) ve size bildirir. Yeni sürümü yüklemek için dsh’yi yeniden başlatın. **Ayarlar → Composer Plus → Composer Plus güncellemeleri** sürümü gösterir. **Güncellemeleri denetle** / **Şimdi güncelle** düğmeleri de buradadır. dsh yeni sürümle ilk kez açıldığında **Composer Plus N sürümündeki yenilikler** penceresi o sürümün sürüm notlarını bir kez gösterir (notlar aynı güncelleme denetiminden gelir, ek ağ çağrısı yapılmaz). **Kapat** düğmesi ya da `Esc` pencereyi kapatır. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ekran görüntüsü: Otomatik güncellemeler"></a> |
88
+ | **Otomatik güncellemeler** | <a id="feature-autoupdate"></a>dsh açıldığında eklenti [en son GitHub sürümünü](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) denetler. Bu sürüm daha yeniyse ve npm’de de varsa, tam olarak o sürümü dsh’nin kendi eklenti yöneticisiyle yükler (Ayarlar → Eklentiler ile aynı yol) ve size bildirir. Yeni sürümü yüklemek için dsh’yi yeniden başlatın. **Ayarlar → Composer Plus → Composer Plus güncellemeleri** sürümü gösterir. **Güncellemeleri denetle** / **Şimdi güncelle** düğmeleri de buradadır. dsh yeni sürümle ilk kez açıldığında **Composer Plus N sürümündeki yenilikler** penceresi o sürümün sürüm notlarını **Uygulama dili** ayarındaki dilde bir kez gösterir (notlar yeni sürümle birlikte gelir, ek ağ çağrısı yapılmaz; notu olmayan bir dilde İngilizce notlar görünür). **Kapat** düğmesi ya da `Esc` pencereyi kapatır. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ekran görüntüsü: Otomatik güncellemeler"></a> |
86
89
  | **Yedekleme** | <a id="feature-backup"></a>Ayarlar → Composer Plus → **Yedekleme** → **Şimdi yedekle**, dsh ana klasörünüzün tamamını (sohbetler, ayarlar, eklentiler, MCP, beceriler) sağlama toplamıyla birlikte `~/Desktop/dsh-backups` içindeki tek bir arşive yazar. Gizli bilgiler arşivde maskelenir: kimlik bilgisi dosyaları, anahtar dosyaları (`.pem`, `.key`) ve yml ayarlarındaki token, secret ve password değerleri yalnızca bu bilgisayarda, klasördeki `vault` içinde kalır. `cache/`, `dsh-runtimes/` ve `node_modules` arşive girmez (dsh bunları yeniden oluşturur). Listedeki her yedekte **Kontrol et** (yedeği baştan sona okur), **Başka bir bilgisayar için** (yeni bilgisayara kopyalanacak, kurtarma konsolunu da içeren bir klasör) ve **Sil** vardır. Aynı klasördeki dsh-backup arşivleri de listede görünür ve kullanılabilir. Geri yüklemek için dsh’den çıkın ve kurtarma konsolunu kullanın. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Ekran görüntüsü: Yedekleme"></a> |
87
90
  | **Otomatik yedekleme** | <a id="feature-autobackup"></a>**Otomatik yedekleme** özelliğini açın (varsayılan olarak kapalıdır: her kopya, önbelleği hariç dsh ana klasörünüz kadar yer kaplar). Ne sıklıkla yedekleneceğini (**Sıklık**: 6 saatten 7 güne kadar, varsayılan 24 saat) ve kaç yedeğin saklanacağını (**Sakla**: 3 ile 14 arası, varsayılan 7) seçin. Sonraki yedekleme zamanı anahtarın altında görünür. Başarısız bir yedekleme de orada görünür ve 30 dakika sonra yeniden denenir. dsh ya da Composer Plus yeni bir sürümle açıldığında, açılıştan kısa süre sonra, yeni sürüm verilerinizi uzun süre kullanmadan önce bir anlık görüntü alınır (en yeni ikisi saklanır ve **Yükseltmeden önce** olarak işaretlenir). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Ekran görüntüsü: Otomatik yedekleme"></a> |
88
91
  | **Oturum günlüğü kontrolü** | <a id="feature-sessiondoctor"></a>**Oturum günlüklerini kontrol et**, her sohbetin günlüğünü okur ve dsh’nin açamadığı günlükleri listeler (bozuk bir çerçeve, kesik bir kayıt, yanlış bir sıra numarası). Sonu yarım kalmış bir günlük listelenmez: dsh onu kendisi onarır. **Yedeklerden onar**, sağlam kopyası olan en yeni yedekteki kopyayı geri koyar ve hasarlı dosyayı yanında saklar (`.corrupt-<zaman>`). O yedekten sonra yazılan mesajlar kopyada yoktur. Bu dsh’de açık olan bir sohbet burada onarılmaz: dsh’den çıkın ve sohbeti kurtarma konsolunda onarın. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Ekran görüntüsü: Oturum günlüğü kontrolü"></a> |
@@ -166,7 +169,9 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
166
169
  - **Hedef kontrolü:** yalnızca ajan otomatik bir turda bir `/goal` hedefini tamamlandı olarak işaretlediğinde (ya da siz **Şimdi çalıştır** düğmesine tıkladığınızda) çalışır. Host tarafı test komutunu sohbetin klasöründe, sohbetin korumalı alan moduyla çalıştırır (dsh’nin kendi `bash` aracı gibi: aynı dosya erişimi politikası; bu korumalı alan başlayamazsa test çalışmaz ve kontrol başarısız olur). Komutu bulmak için yalnızca `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` ve `pytest.ini` dosyalarını, klasörün içindeki normal dosyalar olarak okur (klasörün dışını gösteren sembolik bağlantılar ve FIFO’lar okunmaz). Sonra **Hedef kontrolü** için seçilen modele (varsayılan olarak sohbetin kendi modeline), araç içermeyen tek bir istek gönderir. İstekte şunlar vardır: hedef; hedef başladığından beri sohbet (mesajlarınız, ajanın yanıtları, 1.000 karaktere kısaltılmış araç çağrıları ve her araç sonucunun son 2.000 karakteri; akıl yürütme metni ve geri alınan adımlar yoktur; en çok yaklaşık 60.000 karakter, en yeni kısım); `git status --short` çıktısı ve test çıktısının sonu. Araç çıktısı ajanın okuduklarını içerebilir. Bu yüzden bu istek, sohbetin kendisi gibi, dosyalarınızın parçalarını içerebilir. Sohbete ve projeye hiçbir şey yazılmaz. Test komutunuz, sınırlar, son sonuç (çıktısının sonuyla) ve model seçimi `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` dosyasındadır (yalnızca sahibin erişebildiği dosya, en yeni 500 sohbet).
167
170
  - **Yeni sohbette devam et:** siz tıklayana kadar hiçbir şey çalışmaz. Sonra Host tarafı sohbeti (Hedef kontrolü'nün okuduğu gibi: akıl yürütme yok, geri alınan adımlar yok) sohbetin kendi modeline gönderir ve notu gösterir; yalnız **Yeni sohbet başlat** yeni bir sohbet açar. Projeye hiçbir şey yazılmaz.
168
171
  - **Bağlam dökümü:** Host'ta yalnız sohbet günlüğünü okur; model çağrısı yapmaz, proje dosyası okumaz.
172
+ - **Görev panosu:** pano, bu penceredeki dsh'nin kendi listelerinden dsh'nin kendi sohbetlerini gösterir; kendi sohbet verisi eklemez. Bir görev başlattığınızda Host tarafı, seçtiğiniz projede yeni bir sohbet oluşturur ve isteminizi ona ilk mesaj olarak, sanki oraya siz yazmışsınız gibi gönderir. Bu yüzden onaylar, sandbox ve sohbetin modeli her zamanki gibi uygulanır. Sonra istemi (ilk 4.000 karakterini, başka hiçbir şeyi) araç olmadan bir istekle daha o sohbetin modeline gönderir ve en çok 3 etiket ister. Her görevin istemi, etiketleri ve başlama zamanı `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` dosyasında tutulur (yalnız sahibinin okuyabildiği dosya, en yeni 2.000 görev); anahtar, yanındaki `board-switch.json` dosyasındadır. Hiçbir proje klasörüne bir şey yazılmaz. **Yanıtla**, yanıtınızı dsh'nin kendi bekleyen isteğine, sohbetin kendi kartının yaptığı gibi gönderir. Önceki sürümlerin eski görev listesi (`board.json`) diskte olduğu gibi kalır ve okunmaz.
169
173
  - **Korunan dosyalar:** liste ve anahtar `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her dosya aracı çağrısının yalnız yolunu (ve gerçek yolunu) okur, dosyanın kendisini okumaz.
174
+ - **Engellenen komutlar:** kurallar ve anahtar `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her `bash` ve `pwsh` çağrısının yalnız komut metnini okur; hiçbir şey çalıştırmaz ve hiçbir şey göndermez.
170
175
  - **Proje hafızası:** siz açana kadar kapalıdır. Açıkken, üst düzey bir sohbetin her turu bittikten sonra Host tarafı, sohbetin son incelemeden bu yana gelen kendi yeni mesajlarını (sizin mesajlarınız ve ajanın metin yanıtları; araç çıktısı, akıl yürütme, gizli bağlam ve geri alınan mesajlar yok; çatallanmış bir sohbette üst sohbetten gelen kopya dışarıda kalır; en çok yaklaşık 16.000 karakter) ve kayıtlı notları, araç içermeyen tek bir istek olarak sohbetin kendi modeline gönderir. Notlar `$DSH_HOME/storages/dsh-composer-plus/memory/` altındaki Markdown dosyalarıdır (yalnız sahibinin erişebildiği dosyalar): her proje klasörü için `projects/<id>/` (`<id>`, klasörün gerçek yolunun bir özetidir; `project.json` klasörün yolunu yazar), `global/`, `journal.jsonl` (her değişiklik, öncesi ve sonrasındaki satırla) ve `reviewed.json` (her sohbetin nereye kadar okunduğu). Proje klasörüne hiçbir şey yazılmaz. Anahtar, token, parola ya da kimlik numarasına benzeyen notlar reddedilir. Bir projenin notları o klasördeki her yeni sohbetin sistem istemine girer, bu yüzden o sohbetin her isteğiyle modele gider. Anahtar, aynı yerdeki `memory.json` dosyasındadır. **Hafızayı aç**, siz **Değişiklikleri önizle** düğmesine basana kadar hiçbir şey göndermez; basınca gösterdiği notları ve metninizi araçsız tek bir istek olarak dsh’nin varsayılan modeline gönderir. Değişiklikler yalnız **Uygula** ile yazılır, günlükte `editor` olarak görünür. Tether notları aynı yoldan okur ve değiştirir.
171
176
  - **Yedekleme:** hiçbir şey bilgisayarınızdan çıkmaz. Arşivler `~/Desktop/dsh-backups` klasörüne gider (yalnızca sahibin erişebildiği dosyalar). Gizli bilgiler arşivde yoktur: kimlik bilgisi dosyaları (`.credentials.yaml`, `.env`), anahtar dosyaları (`.pem`, `.key`, `.p12`, `.pfx`) ve yml dosyalarındaki token, secret, password ve API anahtarı ayarlarının değerleri maskelenir. Bunların gerçek kopyaları aynı klasördeki `composer-plus-vault/<archive>/` içinde (yalnızca sahibin erişebildiği), yalnızca bu bilgisayarda kalır. **Başka bir bilgisayar için** vault’u kopyalamaz: bu gizli bilgileri orada yeniden girin. Sohbet günlükleriniz, ayarlarınız ve dsh ana klasörünün geri kalanı arşivde olduğu gibi durur: klasörü, `$DSH_HOME` klasörünün kendisi gibi gizli tutun. Yedekleme, dosyaları `O_NOFOLLOW | O_NONBLOCK` ile okur. Sembolik bağlantı, bağlantı olarak saklanır (hiçbir zaman izlenmez); FIFO ve aygıt dosyaları atlanır. Otomatik yedekleme anahtarı ve ayarları `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json` dosyasında, kurtarma konsolu anahtarı `rescue-console.json` dosyasındadır. dsh çalışırken `running/host-<pid>.json` her dsh sürecini belirtir (kurtarma konsolu, bir geri yüklemeyi reddetmek için bu dosyaları okur).
172
177
  - **Kurtarma konsolu:** bir terminal menüsüdür ve ağ portu açmaz. Geri yükleme yalnızca dsh ana klasörünün yanındaki yeni bir klasöre yazar (dosyalar `O_EXCL | O_NOFOLLOW` ile; sembolik bağlantılar en son ve hiçbir zaman izlenmeden yazılır). Güvenli olmayan bir ad (`..`, mutlak bir yol), aygıt dosyası ya da FIFO, birden çok üst klasör veya bir bağlantının altındaki bir öğe içeren arşivi reddeder.
@@ -186,10 +191,10 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
186
191
  - **Bir sohbet yeniden başlatmadan sonra devam etmedi:** dsh kapandığında Yeniden açılışta sürdür kapalıydı, o turu kendiniz durdurdunuz, tur bitmişti (tamamlandı ya da hata verdi), sohbet arşivlenmişti veya 20’den fazla sohbet çalışıyordu (en yeni 20 sohbet devam eder).
187
192
  - **Yeniden başlatmadan sonra kuyruk boş:** Kuyruğu dsh kapanırken kendisi boşaltır. Yeniden açılışta sürdür kuyruğu yalnız sürdürdüğü sohbette geri koyar; diğer sohbetlerde mesajları yeniden gönderin. Kapanıştan hemen önce kaldırdığınız bir mesaj geri gelebilir: Onu yeniden kaldırın.
188
193
  - **GitHub’da issue aç "gh could not open the issue" diyor:** bu mesaj, `gh` aracının kendi ilk satırıdır. Bir terminalde `gh auth status` komutunu çalıştırın ve `gh auth login` ile oturum açın. Sohbetin klasöründe bir GitHub uzak deposu (remote) olmalıdır (`git remote -v`). "not installed or not on the PATH of dsh", dsh’nin `gh` aracını bulamadığı anlamına gelir: aracı yükleyin ya da dsh’yi `gh` aracının çalıştığı bir terminalden başlatın.
189
- - **Bir sohbet satırında dal etiketi yok:** bu sürümü yüklediğinizden beri sohbette hiç tur olmadı, sohbetin klasörü bir git deposu değil ya da **Sohbet satırlarında Git dalı** kapalı. Bir güncellemeden sonra dsh’yi yeniden başlatın (dalı Host tarafı kaydeder).
194
+ - **Bir sohbet satırında dal etiketi yok:** kenar çubuğu “Tek listede” görünümünde değil (“Çalışma alanı” ve “Çalışma alanı ağacı” görünümlerinde hiçbir sohbet satırında etiket görünmez), bu sürümü yüklediğinizden beri sohbette hiç tur olmadı, sohbetin klasörü bir git deposu değil ya da **Sohbet satırlarında Git dalı** kapalı. Bir güncellemeden sonra dsh’yi yeniden başlatın (dalı Host tarafı kaydeder).
190
195
  - **Hedef kontrolü, testin 127 koduyla ya da "not found" ile çıktığını söylüyor:** Finder’dan veya Dock’tan başlatılan dsh’nin PATH’i terminalinizdekinden daha kısa olabilir. Bu yüzden dsh `npm`, `pnpm` veya `cargo` aracını bulamaz. dsh’yi bir terminalden başlatın ya da **Hedef kontrolü** → **Düzenle** içinde tam yolu olan kendi test komutunuzu belirleyin. **Şimdi çalıştır** sonucu hemen gösterir.
191
196
  - **Hedef kapanmıyor ve ajan çalışmaya devam ediyor:** **Hedef kontrolü** başarısız bir test ya da eksik bir iş buldu. Hedefin altındaki satır nedenini gösterir (ayrıntılar için imleci sonucun üzerine getirin). Nedeni ya da test komutunu düzeltin veya hedefi `/goal` ya da hedef çubuğuyla kendiniz tamamlayın (bu tamamlama kontrol edilmez).
192
- - **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.17.0`) ve yukarıdaki kurulum notuna bakın.
197
+ - **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.19.0`) ve yukarıdaki kurulum notuna bakın.
193
198
  - **Şimdi yedekle, "Başka bir yedekleme işlemi sürüyor" diyor:** başka bir dsh penceresinde ya da kurtarma konsolunda bir işlem çalışıyor (ikisi, yedek klasöründeki `.composer-plus.lock` kilit dosyasını paylaşır). İşlemin bitmesini bekleyin. Çalışan bir işlem yoksa, kapanmış bir sürecin kilidi bir sonraki tıklamada devralınır.
194
199
  - **Kurtarma konsolu "dsh is running" diyor:** önce dsh’den çıkın. dsh gerçekten kapalıysa mesajda adı geçen dosya bir çökmeden kalmıştır: dosyayı silin ve yeniden deneyin.
195
200
  - **Geri yüklemeden sonra dsh açılmıyor ya da bir eklenti eksik:** bir profilin eklenti paketlerinin yeniden yüklenmesi gerekir. Kurtarma konsolu bunu geri yüklemeden sonra önerir. Ya da konsolun listelediği, `$DSH_HOME/profiles/` altındaki her klasörde `pnpm install` komutunu çalıştırın. Vault’ta olmayan gizli bilgiler (başka bir bilgisayar) yeniden girilmelidir: konsol bunları listeler.
@@ -209,6 +214,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
209
214
  - **Sohbeti sil** için dsh’nin arşivleme özelliği gerekir (dsh 0.2.0 ve sonrası). 15 sn içinde durmayan ya da başka bir dsh’nin tuttuğu bir sohbet (veya alt ajan sohbetlerinden biri) arşivlenmiş olarak kalır ve hiçbir şey taşınmaz. macOS dışındaki sistemlerde çöp klasörü, sohbet geçmişiyle aynı diskte olmalıdır. Sildiğiniz açık bir sohbet, dsh yeniden başlayana kadar dsh’nin belleğinde arşivlenmiş ve gizli olarak kalır. Çöp Sepeti’ni kendiniz boşaltın; dsh bunu yapmaz.
210
215
  - dsh’nin kuyruğunda `move` işlemi yoktur. Bu yüzden eklentinin Host tarafı, sıradaki mesajın kendisini dsh’nin kuyruğunda taşır (tek bir değişiklik, aynı mesaj). Görsel veya dosya içeren mesajlar da taşınır. Yalnızca kendi mesajlarınız taşınır: kuyruktaki bir hedef turu veya bir soruya verilen yanıt yerinde kalır. Siz sürüklerken bir mesajın gönderimi başlarsa hiçbir şey taşınmaz ve bunu bildiren bir uyarı görünür.
211
216
  - dsh 0.2.1, yeni sürüm hiçbir dsh ayarını değiştirmiyorsa güncellemeyi hemen yükler. Aksi durumda ve dsh 0.2.0’da güncellemeyi yüklemek için dsh’yi yeniden başlatın. Eklenti dsh’yi sizin yerinize hiçbir zaman yeniden başlatmaz. dsh’nin eklenti yöneticisi olmayan web/CLI profilleri yalnızca yeni sürümü bildirir.
217
+ - **Composer Plus N sürümündeki yenilikler** penceresi notları **Uygulama dili** ayarındaki dilde gösterir. Başka bir bölgeye ait bir arayüz dili, ana dilinin notlarını alır (`en-GB` İngilizce notları, `zh-TW` ise `zh` Çince notlarını gösterir). Notu olmayan bir dil (başka bir dil paketinin eklediği bir dil ya da `pt-BR` olmayan `pt-PT`) İngilizce notları gösterir. Notlar yeni sürümle birlikte gelir. Çalışan kopyada okunabilir bir not dosyası (`release-notes.json`) yoksa pencere GitHub’daki İngilizce notları gösterir.
212
218
  - **Sohbet boyunca izin**, süre sınırını iznin verildiği andan başlayarak sayar. Yeni bir süre sınırı, geçerli izinlere hemen uygulanır. Bu yüzden daha kısa bir süre sınırı bu izinleri hemen bitirebilir. 1.12 ve önceki sürümlerden kalan izinlerin bir süresi yoktur: güncellemeden sonra ajan bu araçlar için bir kez daha sorar.
213
219
  - **Mesaj alanında odağı koru**, odağı yalnızca bir `/` komutundan veya beceriden sonra geri verir. dsh komutu çözümlerken mesaj alanı birkaç milisaniye salt okunur kalır. Bu sürede basılan tuşlar kaybolur. dsh’nin `/` menüsü hâlâ açıksa `Enter` vurgulanan satırı seçer ve mesajı göndermez.
214
220
  - **Soru kartını pencereye sığdır** yalnız dsh'nin soru kartını değiştirir, plan inceleme kartını değiştirmez. Kartı dsh'nin işaretlemesiyle bulur (`data-question-key`, `data-question-scroll`). Bir dsh güncellemesi bu işaretlemeyi değiştirirse kart dsh'nin çizdiği gibi görünür. Kartın yüksekliği sohbeti değil pencereyi izler: dar bir yan paneldeki sohbette uzun bir kart sohbetin üstüne taşabilir.
@@ -222,7 +228,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
222
228
  - **Bu sohbet** yalnızca dsh’nin dosya araçlarının (`write`, `edit`, `str_replace_editor`) yazdığı dosyaları sayar. Bir komutun (`bash`) değiştirdiği dosyalar bu görünümde yoktur. Bu dosyalar **Commit edilmemiş** altında görünür. Sohbetin Tur geri alma anlık görüntüsü yoksa (Tur geri alma kapalı, dsh-rewind-plugin yüklü ya da sohbet eklentiden daha eski), görünüm son commit ile karşılaştırır ve bunu belirtir. Tur geri alma bir sohbetin en yeni 50 anlık görüntüsünü saklar. Daha uzun bir sohbette görünüm, saklanan en eski anlık görüntüyle karşılaştırır, hangi mesajdan başladığını söyler ve daha önceki değişiklikleri saymaz. **Boşluk değişikliklerini gizle**, `git diff -w` ile aynıdır: yalnızca satır içindeki boşlukları değişen bir satır da gizlenir.
223
229
  - **GitHub’da issue aç** için dsh’nin PATH’inde GitHub CLI (`gh`) ve sohbetin klasöründe bir GitHub uzak deposu (remote) gerekir. En çok 60 sn çalışır. `gh` daha uzun sürerse issue GitHub’da açılmış olabilir, ama bağlantısı listede görünmez. Yeniden tıklamadan önce GitHub’a bakın: liste bağlantıyı yalnızca tamamlanan bir çalıştırmadan okur, bu yüzden yeni bir tıklama ikinci bir issue açabilir. Birden çok GitHub uzak deposu olan bir klasör, `gh` aracının kendi varsayılanını kullanır (`gh repo set-default`).
224
230
  - **Bu dosyayı değiştiren sohbetler**, **Bu sohbet** gibi yalnızca dsh’nin dosya araçlarını (`write`, `edit`, `str_replace_editor`) tanır: bir komutun (`bash`) yaptığı değişiklik listelenmez. Deponun en yeni 300 sohbetini okur (oluşturulma zamanına göre) ve daha fazlası varsa bunu belirtir. En çok 100 satır gösterir. Yeniden adlandırılan bir dosya, aracın yazdığı adla listelenir. Klasörü deponun dışında olan bir sohbet (aynı dosyalara başka bir yoldan ulaşsa bile) sayılmaz. dsh açıldıktan sonraki ilk açılış, deponun tüm sohbet günlüklerini okur (275 sohbet için yaklaşık 4 sn). Sonraki açılışlar yalnızca o zamandan beri değişen sohbetleri okur.
225
- - **Sohbet satırlarında Git dalı**, şu anki dalı değil, sohbetin son turu başladığında ya da bittiğinde sohbetin klasörünün bulunduğu dalı gösterir: bir tur dışında yapılan dal değişikliği bir sonraki turdan sonra görünür. Bu sürümden önceki sohbetlerde bir sonraki turlarına kadar etiket görünmez. Etiket, dsh’nin sohbet satırı yapısına yerleşir (dsh’de orada bir yuva yoktur). Bir dsh güncellemesi bu yapıyı değiştirirse etiket görünmez. Sohbetin üstündeki proje satırının adı dalın adıyla aynıysa (örneğin bir “Sohbet başına dal” klasöründe), sohbet satırında dal etiketi görünmez; “Tek listede” görünümünde etiket yine görünür.
231
+ - **Sohbet satırlarında Git dalı**, şu anki dalı değil, sohbetin son turu başladığında ya da bittiğinde sohbetin klasörünün bulunduğu dalı gösterir: bir tur dışında yapılan dal değişikliği bir sonraki turdan sonra görünür. Bu sürümden önceki sohbetlerde bir sonraki turlarına kadar etiket görünmez. Etiket, dsh’nin sohbet satırı yapısına yerleşir (dsh’de orada bir yuva yoktur). Bir dsh güncellemesi bu yapıyı değiştirirse etiket görünmez. Etiket yalnızca “Tek listede” görünümünde görünür.
226
232
  - **Sohbet başına dal** plan modunda: dsh, `/plan <mesaj>` metnini mesaj olarak değil, komut olarak gönderir. Bu yüzden Composer Plus, komutun gönderilmesini dsh’nin mesaj alanında yakalar (herkese açık API değildir). Bir dsh güncellemesi bunu değiştirirse **Yeni dal** seçiliyken `/plan <mesaj>`, açık Yeni sohbet ekranında dsh’nin kendi komutu olarak çalışır. Host yeni sohbette plan modunu açamazsa dal klasörü kalır ve mesaj gönderilmez. Böylece yeni sohbet, varsayılan modda dosyaları değiştirmez.
227
233
  - **Sohbet başına dal**: bir sohbetin dal klasörü (`<project>/.worktrees/<name>`) silinince (örneğin sohbetin kendi ajanı worktree'yi kaldırıp dalı silince) sohbetin bir sonraki adımı sohbeti bu klasörden çıkarır. Dal klasörünün projesi kenar çubuğundan kalkar; sohbet Gruplanmamış altında görünür ve açık kalır. dsh 0.2.1 ve sonrasında sohbet ana proje klasöründe devam eder ve model yeni klasörü bildiren bir not alır. dsh 0.2.0'da sohbet silinen klasörde kalır: orada çalışan bir komut, yeni bir sohbet başlatana kadar hata verir. Hiçbir sohbetin kullanmadığı, silinmiş bir dalın projesi de kenar çubuğundan kalkar: Composer Plus dal klasörlerini açılışta ve 30 saniyede bir denetler. Bunun için kenar çubuğu filtresi gerekmez. Bir sohbet taşınırken aynı depodaki **Yeni dal** "yeniden deneyin" yanıtını verir. Anahtar kapalıyken dsh'nin kendi hatası yine görünür ("working-directory: directory does not exist").
228
234
  - **Çalışma alanı ağacında dallar** tıklama olmadan git’e yazar: bir sohbeti taşırken proje klasörünü önceki dalına geri alır (`git switch`) ve bir worktree ekler (`git worktree add`). Hiçbir dalı, worktree’yi veya dosyayı silmez. dsh bir sohbetin klasörünü değiştiremez. Bu yüzden taşınan sohbet bir kopyadır (dsh’nin kendi çatallaması, yeni bir kimlikle) ve eski sohbet arşivlenir. Kopya, durdurulan işe devam eder. Dal ortaya çıktığında çalışan araç çağrısı reddedilerek biter ve ajan onu yeni klasörde yeniden çalıştırır. Eski sohbetin hedefi kopyaya geçmez. Yalnızca klasörü deponun ana klasörü olan sohbet taşınır. Bu da yalnızca o turda oluşturup geçtiği dal için olur (`git switch -c`, `git checkout -b`). Yalnızca `git branch` ile yapılan dal, commit edilmemiş değişikliği olan klasör, bağlı bir worktree veya alt klasör hiçbir şeyi taşımaz. Ağaçta yalnızca doğrudan `<project>/.worktrees/` içinde olan ve dalı olan worktree’ler görünür. Ayrık (detached) bir worktree veya başka yerdeki bir worktree görünmez. Kopya, yalnızca eski sohbet açık olan sohbetse kendiliğinden açılır (eklenti bunu dsh’nin kenar çubuğu satırından okur). Aksi halde kopya dal projesindedir.
@@ -239,8 +245,11 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
239
245
  - **İstemi iyileştir** yalnızca kısa bir proje özetini, değişen yolları ve adı sözcüklerinizle eşleşen yolları görür: kodun kendisini görmez. Bu yüzden doğru dosyayı kaçırabilir ve yalnızca kendisine verilen yolların adını yazar. Yeni metni göndermeden önce okuyun. `/goal <hedef>` dışındaki bir eğik çizgi komutunda, bir `/goal` kontrol sözcüğünde (`clear`, `pause`, `resume`) veya dosya ya da sembol etiketi olan bir mesajda çalışmaz (yeni metin düz metindir, bu yüzden etiket kaybolurdu). Bir `/goal` hedefinde koşulları yalnız taslaktan ve bağlamdan yazar. Fazla katı bir koşul hedef turlarını harcayabilir, bu yüzden göndermeden önce okuyun. Bir mesaj en çok 8.000 karakter olabilir. Görseller ekli kalır: yalnızca metin değişir. Her tıklama bir model çağrısı yapar. Güçlü bir model bir dakika sürebilir (`Esc` iptal eder).
240
246
  - **Hedef kontrolü** yalnızca ajanın otomatik bir hedef turunda yaptığı tamamlamayı kontrol eder: sohbette sizin istediğiniz bir tamamlama, `/goal` ve hedef çubuğu kontrol edilmez. Ajan testleri ya da test komutunun dosyalarını kendisi değiştirebilir. Doğrulayıcı sohbeti okur ve bunu görebilir, ama iki yönde de yanılabilir (yanlış bir "tamamlanmadı" bir tur daha harcar; yanlış bir "tamamlandı" hedefi kapatır). Doğrulayıcı sohbeti ve `git status` çıktısını görür, kodun kendisini görmez. Bir test çalıştırması yalnızca ajanın dosya değiştirebilen en yeni adımı, aynı klasörde tam olarak aynı komutun ajanın kendi başarılı `bash` çalıştırmasıysa yeniden kullanılır. Kanal (`| tail`) ya da `&&` içeren bir komut yeniden kullanılmaz. Bütçe bir tur bittiğinde ölçülür. Bu yüzden tek bir tur bütçeyi aşabilir. Token bütçesi sohbetin alt ajan sohbetlerinin çağrılarını da sayar (her tur sonunda kayıtlı günlüklerinden okunur, bu yüzden çok alt ajanı olan bir sohbetin kontrolü biraz daha uzun sürer). Kanıt tablosu doğrulayıcının sohbeti kendi okumasından gelir: doğrulandı dediği bir parçaya, önemliyse siz de bakın. Kontrol çalışırken `update_goal` bekler (test en çok 15 dakika, doğrulayıcı en çok 3 dakika). Dallandırılmış bir sohbet yeni bir sohbet kimliği alır. Bu yüzden üst sohbetin kendi test komutu ve sınırları olmadan başlar. Doğrulayıcıya ulaşan her tamamlama bir model çağrısı yapar.
241
247
  - **Korunan dosyalar** bir korkuluktur, korumalı alan değildir. dsh'nin kendi dosya araçlarını kapsar (`read`, `read_image`, bir dosyada `grep`, `write`, `edit`, `str_replace_editor`). Bir kabuk komutu (`cat .env`), ajanın yazdığı bir betik, bir alt ajanın kabuğu, bir MCP aracı, bir `glob` listesi ve bütün bir klasörde `grep` korumalı bir dosyaya yine erişebilir. Gerçek bir sınır için dsh'nin korumalı alan modlarını kullanın ya da gizli bilgileri proje klasörünün dışında tutun. Desenler `*`, `**` ve `?` bilir, `{a,b}` ya da `[ab]` bilmez ve büyük-küçük harf farkını yok sayar.
248
+ - **Engellenen komutlar** bir korkuluktur, korumalı alan değildir. Yalnız dsh’nin `bash` ve `pwsh` araçlarının komut metnini okur. Komutu adlandıran bir değişken ya da takma ad (`CMD=npm; $CMD publish`), bir kabuk fonksiyonu, ajanın yazdığı bir betik dosyası, başka bir program (`python -c`, `node -e`, `make`), bir MCP aracı ve kendi terminaliniz komutu yine çalıştırabilir. Bir kural, istediğinizden fazlasıyla eşleşebilir: bir komutun her sözcüğü komut adı olabilir (`echo npm publish`, `npm publish` ile eşleşir) ve kuralın sözcükleri arasında başka sözcükler olabilir (`git push --force`, `git push origin main --force` ile de eşleşir). Bir kural fazla eşleşiyorsa onu uzatın. **önce sor** için sorabilen bir sohbet gerekir: onay politikası never olan bir sohbette (örneğin görev verilmiş bir alt ajan) dsh kartı gösteremez, bu yüzden çağrı nedeniyle birlikte reddedilir. Onay kartı nedeni İngilizce gösterir. **Sohbet boyunca izin** bir **önce sor** kartını yanıtlamaz.
242
249
  - **Yeni sohbette devam et** sohbeti (mesajlar, araç çağrıları ve her araç sonucunun sonu; en çok yaklaşık 60.000 karakter, en yeni kısım) sohbetin kendi modeline gönderir. Not bir kararı ya da dosyayı atlayabilir: başlatmadan önce okuyun. Yeni sohbet yalnız notu ve bağlantılı sohbeti bilir (dsh eski sohbeti salt okunur bağlam olarak ekler); model bağlamı küçük başlar, eski sohbet olduğu gibi kalır. Her sohbet için aynı anda tek not ya da başlatma çalışır.
243
250
  - **Bağlam dökümü** dsh'nin kendi kuralıyla tahmin gösterir (token başına yaklaşık 4 karakter), dsh'nin bağlam halkasıyla aynı kural; modelin kendi sayımı farklı olabilir. Araç tanımları en yeni isteğinkilerdir. Bağlamı sohbet günlüğündeki hâliyle gösterir; şu anda çalışan bir tur bir sonraki adımından sonra görünür.
251
+ - **Planlı adımlar** yalnız model plan yaptığında token kazandırır: açıkken her istek `plan_next_steps` aracını ve kısa bir talimatı (yaklaşık 500 token) taşır; modelin hiç plan yapmadığı sohbetlerde de. Koşul yalnız yazdığını kanıtlar (örneğin: derlemenin çıkış kodu 0 oldu); işin doğru olduğunu kanıtlamaz. `ok`, dsh'nin kendi sonuç işaretlerini okur (`[exit code: N]`, zaman aşımı, sandbox reddi); sıfırdan farklı çıkış kodu vermeden başarısız olan bir komut geçmiş sayılır. Adımlar tek tek çalışır; aynı anda hazır olan iki adım modele geri döner. Adımın mesajı, sohbetin modelinin bir asistan mesajı olarak kaydedilir (dsh'de bir eklentinin yazdığı mesaj için işaret yok); bu yüzden metni, adımı Composer Plus'ın çalıştırdığını söyler. Tether'de yok.
252
+ - **Görev panosu** bu pencerede dsh'nin listelediği sohbetleri gösterir: proje dışındaki bir sohbet yalnız **Tüm projeler** içinde görünür ve “Sohbet başına dal” klasörü (`<project>/.worktrees/<name>`) kendi projesinden sayılır. Bir kartın sütunu sohbetin canlı durumudur, bu yüzden kartlar sürüklenemez: bir sohbet, turu bitince (bir hatadan ya da durdurmadan sonra da) **Bitti** sütununa geçer ve yeniden çalışınca **Yapılıyor** sütununa döner. Yeşil nokta dsh'nin kendi “bitti” noktasıdır ve dsh onu yalnız bu pencerede tutar: sayfa yeniden yüklenince biten sohbetler noktasız görünür. **Bitti** en yeni 50 sohbeti gösterir (**Daha eski N görevi göster** kalanları gösterir). Etiketler, başlatılan her görev için tek bir model çağrısından gelir: yanlış olabilirler ve panoda başlatmadığınız bir sohbetin etiketi yoktur. Başlık, dsh'nin kendi sohbet başlığıdır (dsh'nin başlık hizmeti, sohbetin modeliyle); başlık gelene kadar kart istemin ilk satırını gösterir. dsh'nin bildiği bir `/` komutuyla (`/plan`, `/goal`) başlayan istem o komut olarak çalışır. **Yanıtla** yalnız sohbetin en yeni isteğini yanıtlar: sohbet o isteği başka bir yerde yanıtladıysa (başka bir pencere, Tether, Otomatik inceleme) ya da yeni bir şey soruyorsa panel bunu söyler ve hiçbir şey göndermez. Önceki sürümlerde yorumlu bir görev listesi ve ajan araçları vardı; bunlar kaldırıldı ve eski `board.json` gösterilmez. Fikir ve görünüm emanuele-em'in [Kanzo](https://github.com/emanuele-em/kanzo) projesinden gelir (AGPL-3.0); Composer Plus onun kodunu kullanmaz.
244
253
  - **Durdurduktan sonra gönderilen önce gider** yalnız sohbeti durdurduktan sonra çalışır (ya da bir tur hata verdikten sonra veya hâlâ kuyruğu olan bir sohbeti açtığınızda): bir tur çalışırken gönderdiğiniz mesaj yine kuyruğun sonunda bekler. Mesaj yalnız sizin kuyruktaki mesajlarınızın önüne geçer: kuyrukta bir hedef turu ya da bir soru yanıtı bekliyorsa dsh’nin kendi sırası kalır. dsh’nin herkese açık API olmayan bir bölümünü okur (durdurulan turun hâlâ bitip bitmediğini); bir dsh güncellemesi bunun adını değiştirirse mesaj, o tur bittikten sonra öne alınır. Alt ajan sohbetleri dsh’nin kendi sırasını korur.
245
254
  - **Proje hafızası** sohbetin ilk klasörüne (dsh'nin proje klasörüne) aittir: klasörünü `cd` ile değiştiren bir sohbet ilk projesinin hafızasını kullanmaya devam eder; aynı klasör aynı dosyalara giden başka bir yoldan açılırsa hafızayı paylaşır. Bir sohbet, başladığında hafıza bölümünü dondurur; bu yüzden sonra kaydedilen bir not bir sonraki sohbette görünür (`memory_recall` onu hemen bulur). İnceleme yalnız modelin saklamaya karar verdiği şeyi saklar: bir olguyu kaçırabilir ya da yanlış bir şeyi saklayabilir. Notları **Hafızayı aç** içinde kontrol edip orada değiştirin ya da dsh kapalıyken dosyaları elle düzenleyin. **Hafızayı aç**, seçili projenin notlarını ve genel notları (Tüm notlar seçiliyse bütün projeleri; en çok yaklaşık 60.000 karakter, kalanı yalnız sayılır ve o istekte değişemez) ve yazdığınız metni sohbetin modeline değil, dsh’nin varsayılan modeline gönderir. Önizleme Mac’te 30 dakika ve dsh yeniden başlayana kadar tutulur; bu arada bir inceleme ya da ajan notları değiştirirse **Uygula** reddeder ve yeniden önizlersiniz. **Uygula** bir önizlemenin ya bütün değişikliklerini ya hiçbirini kaydeder: bir değişiklik kaydedilemezse (örneğin MEMORY.md doluysa) notlar olduğu gibi kalır ve nedeni görünür. Sizden bir mesaj içeren her bitmiş tur bir model çağrısına mal olur; başarısız bir çağrı, sonraki turdan sonra aynı mesajları yeniden okur. Alt ajan sohbetleri incelenmez. Fikir ve dosya biçimi [DS Bot](https://github.com/Fei2411/DS-Bot) projesinden gelir (Apache-2.0); Composer Plus onun kodunu kullanmaz ve DS Bot'un kendi hafızasını hiçbir zaman okumaz ya da yazmaz.
246
255
  - **Yedekleme** tek ve sabit bir klasör kullanır: `~/Desktop/dsh-backups` (dsh-backup’ın varsayılan klasörü; böylece onun arşivleri kullanılabilir kalır). Başka bir klasör için ayar yoktur. Bir arşiv, `cache/` ve `dsh-runtimes/` olmadan dsh ana klasörü kadar büyüktür (ölçüm: Apple Silicon’da 1,6 GB dosya, yaklaşık 30 sn’de 830 MB’lık bir arşiv oldu; dsh bu sırada yanıt vermeye devam etti). Okunurken değişen bir dosya, yedeklemenin onu açtığı andaki hâliyle saklanır. Bu yüzden açık bir sohbetin günlüğü kesik bir kayıtla bitebilir; dsh bunu bir sonraki yazmada onarır. Maskeleme, yml dosyasındaki bir gizli bilgiyi tek satırdaki anahtar adından bulur (`token:`, `apiKey:`, …). Akış eşlemindeki (`{token: x}`), böyle bir anahtarın altındaki bir listedeki, bir JSON dosyasındaki (örneğin bir `.json` dosyasındaki bir MCP sunucusunun `apiKey` değeri) ya da başka bir ad altındaki gizli bilgi arşivde kalır. dsh-backup’ın türe göre aldığı arşivler (`dsh-t-…`) listelenmez. **Başka bir bilgisayar için** arşivi kopyalar (APFS’te bir klon: ek yer kaplamaz); vault onunla gitmez. **Şimdi yedekle** hiçbir yedeği silmez. Otomatik yedekleme, Composer Plus’ın aldığı en yeni yedekleri tutar (**Otomatik yedekleme** içindeki **Sakla** ayarı) ve kendi aldığı daha eski yedekleri siler. Yükseltme öncesi anlık görüntüler ayrı sayılır (en yeni 2 tanesi kalır). dsh-backup’ın arşivleri hiçbir zaman silinmez: onları **Sil** ile kaldırın. dsh-backup hâlâ yüklüyse Composer Plus arşivlerini kendi saklama sayısına katar ve onları silebilir.
@@ -277,6 +286,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
277
286
 
278
287
  **Ajan, DS Bot'un hafızası gibi tercihlerimi sohbetler arasında hatırlayabilir mi?** Evet, **Proje hafızası** ile (varsayılan olarak kapalı): **Ayarlar → Composer Plus** içinden açın. Her turdan sonra kalıcı tercihleriniz ve kararlarınız, sohbetin projesi için kısa notlar olarak saklanır; o projedeki her yeni sohbet bunları okur. Ajandan bir şeyi hatırlamasını isterseniz onu hemen kaydeder. Notları görmek ya da değiştirmek için aynı satırdaki **Hafızayı aç** düğmesine basın ve neyin değişeceğini yazın.
279
288
 
289
+ **Tüm sohbetlerimi bir kanban panosu olarak görüp panodan yeni sohbet başlatabilir miyim?** Evet, **Görev panosu** ile (varsayılan olarak açık): sol kenar çubuğundan açın. Her sohbet **Yapılıyor**, **İncelemede** (sizi bekler) ya da **Bitti** sütununda bir karttır. **Yeni görev** yalnız bir istem alır ve onunla yeni bir sohbet başlatır; bir sohbeti açmadan yanıtlamak için turuncu karttaki **Yanıtla** düğmesine tıklayın.
290
+
280
291
  **dsh, dsh-backup gibi sohbetlerimi ve ayarlarımı yedekleyebilir mi?** Evet: **Ayarlar → Composer Plus → Yedekleme → Şimdi yedekle**. Aynı arşiv biçimini aynı klasöre (`~/Desktop/dsh-backups`) yazar. Bu yüzden dsh-backup’ın arşivleri de görünür ve geri yüklenebilir; dsh-backup’ı kaldırabilirsiniz. Zamanlanmış yedekleme için **Otomatik yedekleme** ayarını açın.
281
292
 
282
293
  **dsh artık açılmıyor. Bir yedeği nasıl geri yüklerim?** Yedek klasörünü (`~/Desktop/dsh-backups`) açın ve `Composer Plus Rescue.command` dosyasına çift tıklayın (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). `3) Restore a backup` seçeneğini seçin, bir yedek seçin ve `RESTORE` yazın. Bu, dsh olmadan çalışır.
@@ -301,6 +312,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
301
312
 
302
313
  **Yalnızca bir sohbetin değiştirdiği dosyaları nasıl görürüm?** Sağ kenar çubuğu → **Değişiklikler** → **Bu sohbet**. Yalnızca boşluk olan değişiklikleri gizlemek için **␣** düğmesine tıklayın.
303
314
 
315
+ **Ajanın `npm publish` ya da `git push --force` çalıştırmasını nasıl engellerim?** **Ayarlar → Composer Plus → Engellenen komutlar**: `npm publish` yazın, **engelle** ya da **önce sor** seçin, sonra **Ekle** düğmesine tıklayın. **engelle** komutu reddeder ve ajan size sorar; **önce sor** her seferinde onay kartını gösterir. Korunan dosyalar ajanın dosya araçlarını kapsar; Engellenen komutlar ise kabuk komutlarını kapsar.
316
+
304
317
  **Otomatik inceleme’nin tek bir sohbette aynı araç için tekrar sormasını nasıl durdururum?** Onay kartında **Bu sohbet boyunca izin ver** düğmesine tıklayın. Bu izin yalnızca o sohbetteki o aracı kapsar ve varsayılan olarak 1 saat sürer. İzni başlıktaki etiketten kaldırın. Süreyi **Ayarlar → Composer Plus → Sohbet boyunca izin** içinden değiştirin.
305
318
 
306
319
  **iPhone’umu kaybettim. Mac’ime erişmesini nasıl engellerim?** Kenar çubuğunun sol altındaki **Mobil bağlantı** düğmesine tıklayın, sonra o iPhone’un yanındaki **Remove** düğmesine tıklayın. iPhone’un anahtarı hemen geçersiz olur. iPhone, ancak sizin Mac’te onayladığınız yeni bir eşleştirmeyle yeniden bağlanabilir.
@@ -329,6 +342,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
329
342
 
330
343
  **iPhone’umdan fotoğraf gönderebilir miyim?** Evet. Tether’deki bir sohbette mesaj alanının yanındaki **+** düğmesine dokunun → Camera, Photos (en çok 4) ya da Paste image. Fotoğraflar, mesajınızın ekleri olarak Mac’teki sohbete gider. Bu yüzden model onları görür.
331
344
 
345
+ **dsh, modele yeniden sormadan sonraki komutu çalıştırabilir mi?** Evet, **Planlı adımlar** ile (varsayılan olarak kapalı): Ayarlar → Composer Plus içinden açın. Model sonraki komutlarını bir koşulla planlayabilir, örneğin "derleme geçince testleri çalıştır"; sonuç koşulu karşılarsa Composer Plus adımı yeni bir model çağrısı yapmadan çalıştırır. Onaylar ve sandbox olduğu gibi kalır.
346
+
332
347
  **Masaüstü uygulamasıyla çalışır mı?** Evet: Ayarlar → Eklentiler → **Eklenti ekle** → `dsh-composer-plus`. dsh 0.2.0-rc.2 (masaüstü ve web) ve 0.2.1-rc.2 (web) üzerinde test edildi.
333
348
 
334
349
  ## Geliştirme
@@ -393,6 +408,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
412
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
413
  ```
397
414
 
398
415
  ```sh
package/README.vi.md CHANGED
@@ -14,7 +14,7 @@ Các tính năng tiện ích kiểu Codex cho ứng dụng desktop và giao di
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness với Composer Plus: dự án đang chạy hiện biểu tượng xoay trên thanh bên và Bảng thay đổi hiện một git diff"></p>
16
16
 
17
- Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Kiểm tra mục tiêu** (mặc định bật) gọi mô hình một lần mỗi khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
17
+ Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Bảng tác vụ** gọi mô hình của cuộc trò chuyện mới một lần để tạo nhãn cho mỗi tác vụ mà bạn bắt đầu trên bảng. **Kiểm tra mục tiêu** (mặc định bật) gọi mô hình một lần mỗi khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
18
18
 
19
19
  ## Cách cài đặt
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Sau đó khởi động lại dsh. (CLI không cài được vào profile desktop; ứng dụng tự quản lý profile này.)
31
31
 
32
- > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.17.0`.
32
+ > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.19.0`.
33
33
 
34
34
  ## Tính năng
35
35
 
@@ -68,11 +68,14 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
68
68
  | **Kiểm tra mục tiêu** | <a id="feature-goalcheck"></a>Bắt đầu một mục tiêu bằng `/goal`. Khi tác tử đánh dấu mục tiêu là hoàn tất trong một vòng tự động, mục tiêu chỉ đóng sau hai bước kiểm tra. Đầu tiên, lệnh kiểm thử của dự án chạy trong thư mục của cuộc trò chuyện, theo chế độ sandbox của cuộc trò chuyện. Lệnh này là lệnh của riêng bạn hoặc lệnh tìm thấy trong `package.json`, `Makefile`, `Cargo.toml`, `go.mod` hoặc pytest. Khi bước mới nhất của chính tác tử là một lần chạy đạt của bài kiểm thử đó, lệnh không chạy lại. Sau đó, một lần gọi mô hình độc lập, không có công cụ, đọc mục tiêu, cuộc trò chuyện này, `git status` và kết quả kiểm thử. Mô hình trả lời bằng một bảng bằng chứng: mỗi phần của mục tiêu được đánh dấu là đã xác minh, sai hoặc chưa giải quyết, kèm bằng chứng và cách sửa; mục tiêu chỉ đóng khi mọi phần đều đã xác minh. Nếu một bước kiểm tra không đạt, mục tiêu vẫn đang hoạt động và tác tử đọc từng phần còn mở kèm bằng chứng và cách sửa, rồi vòng tiếp theo tiếp tục. Một dòng bên dưới thanh mục tiêu (**Kiểm tra mục tiêu**) hiện bài kiểm thử, kết quả gần nhất và số phần đã xác minh (di chuột lên dòng này để xem bảng). **Sửa** đặt lệnh kiểm thử của riêng bạn và giới hạn thời gian hoặc token; khi vượt giới hạn, mục tiêu bị chặn. Giới hạn token cũng tính cả các subagent của cuộc trò chuyện. **Chạy ngay** chạy bước kiểm tra mà không đóng mục tiêu. Tính năng có menu **Mô hình** riêng trong Cài đặt (mặc định: **Giống mô hình của cuộc trò chuyện**). Khi bạn tự hoàn tất mục tiêu, không có gì được kiểm tra. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Ảnh chụp màn hình: Kiểm tra mục tiêu"></a> |
69
69
  | **Tiếp tục trong cuộc trò chuyện mới** | <a id="feature-handoffchat"></a>Nhấp chuột phải vào một cuộc trò chuyện trên thanh bên (hoặc mở menu **…** của nó) → **Tiếp tục trong cuộc trò chuyện mới…**. Một lần gọi chính mô hình của cuộc trò chuyện viết ghi chú bàn giao từ những gì cuộc trò chuyện hiển thị: Nhiệm vụ, Kết quả đầu ra, Đã hoàn thành, Quyết định, Vấn đề còn mở và Hành động tiếp theo (các lệnh gọi công cụ và kết quả của chúng là bằng chứng; các bước bạn đã hoàn tác được bỏ ra). Ghi chú mở trong một hộp thoại: hãy đọc và sửa ghi chú. **Viết lại** viết một ghi chú mới. **Bắt đầu cuộc trò chuyện mới** (hoặc `Cmd/Ctrl+Enter`) mở một cuộc trò chuyện mới trong cùng dự án với ghi chú và liên kết đến cuộc trò chuyện cũ làm tin nhắn đầu tiên; cuộc trò chuyện cũ vẫn giữ nguyên. Dùng tính năng này khi một cuộc trò chuyện dài đã đầy hoặc chậm, hoặc để tiếp tục vào ngày mai. Không có gì được ghi vào dự án. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Ảnh chụp màn hình: Tiếp tục trong cuộc trò chuyện mới"></a> |
70
70
  | **Phân tích ngữ cảnh** | <a id="feature-contextbreakdown"></a>Thanh bên phải → `+` → **Ngữ cảnh**. Trang cho biết những gì đang chiếm ngữ cảnh mô hình của cuộc trò chuyện đang mở và lượng cửa sổ ngữ cảnh đã dùng: system prompt, hướng dẫn dự án (AGENTS.md), skill, tin nhắn của bạn, câu trả lời của tác tử và lệnh gọi công cụ, kết quả công cụ (theo từng công cụ), kết quả MCP (theo từng máy chủ), định nghĩa công cụ, bản tóm tắt nén và các ghi chú ngữ cảnh khác, mỗi mục kèm số token và tỷ lệ. Nhấp vào một phần để xem các công cụ hoặc máy chủ của phần đó. Trang chỉ đọc nhật ký cuộc trò chuyện, sau `/compact` và các lần hoàn tác, và không gọi mô hình nào; trang đọc lại sau mỗi lượt và khi nhấn **Làm mới**. Dùng trang này để xem vì sao một cuộc trò chuyện chậm hoặc đầy, ví dụ do một kết quả công cụ MCP lớn hoặc nhiều định nghĩa công cụ. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Ảnh chụp màn hình: Phân tích ngữ cảnh"></a> |
71
+ | **Các bước đã lên kế hoạch** | <a id="feature-plannedsteps"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Tác tử nhận công cụ `plan_next_steps`: trong cùng tin nhắn với một lệnh, tác tử có thể lên kế hoạch cho các lệnh tiếp theo với đối số chính xác và một điều kiện, ví dụ “chạy `npm test` khi bản dựng thành công”. Khi kết quả đáp ứng điều kiện, Composer Plus tự chạy bước tiếp theo mà không gọi lại mô hình, nhờ đó cuộc trò chuyện dài tốn ít token hơn. Bước đó hiện trong cuộc trò chuyện thành một dòng ngắn “Composer Plus · Planned steps: ran `test` … without a model call”, sau đó là lời gọi công cụ và kết quả. Chỉ các bước `bash`, `read`, `grep` và `glob`; phê duyệt, sandbox và Tệp được bảo vệ vẫn áp dụng cho từng bước như thường lệ. Mô hình trả lời lại khi điều kiện không đạt, khi hai bước cùng sẵn sàng, sau bước cuối cùng và khi bạn gửi tin nhắn. Ý tưởng đến từ HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Ảnh chụp màn hình: Các bước đã lên kế hoạch"></a> |
71
72
  | **Tệp được bảo vệ** | <a id="feature-protectedfiles"></a>Bật theo mặc định. Các công cụ tệp riêng của tác tử không thể đọc hoặc thay đổi các tệp khớp với mẫu của bạn: `read`, `read_image` và `grep` trên một tệp bị từ chối với mẫu **đọc và ghi**, còn `write`, `edit` và `str_replace_editor` bị từ chối với cả hai loại. Tác tử đọc lý do và được yêu cầu hỏi bạn. Mẫu mặc định là `.env*`, `*.pem` và `*.key`. Cài đặt → Composer Plus → **Tệp được bảo vệ**: thêm một mẫu (ví dụ `published/**` hoặc `config/*.yml`), nhấp vào loại của mẫu để chuyển giữa **đọc và ghi** và **chỉ ghi**, xóa mẫu bằng ✕, hoặc nhấp **Dùng giá trị mặc định**. Mẫu không có `/` khớp với tên tệp trong bất kỳ thư mục nào. Đây là rào chắn bảo vệ, không phải sandbox: lệnh shell (`cat .env`), script hoặc công cụ MCP vẫn có thể truy cập tệp (xem Giới hạn). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ảnh chụp màn hình: Tệp được bảo vệ"></a> |
73
+ | **Lệnh bị chặn** | <a id="feature-blockedcommands"></a>Bật theo mặc định, với danh sách trống. Các lệnh shell của tác tử (`bash`, `pwsh`) không thể chạy lệnh khớp với quy tắc của bạn: quy tắc **chặn** từ chối lệnh gọi (tác tử đọc lý do và được yêu cầu hỏi bạn), quy tắc **hỏi trước** hiện thẻ phê duyệt của dsh, và lệnh chỉ chạy khi bạn cho phép. Cài đặt → Composer Plus → **Lệnh bị chặn**: nhập một quy tắc (ví dụ `npm publish`, `git push --force` hoặc `ssh *192.168.2.19`), nhấp vào loại để chuyển giữa **chặn** và **hỏi trước**, rồi nhấp **Thêm**; nhấp vào loại của một quy tắc để đổi loại, xóa quy tắc bằng ✕. Một quy tắc là tên lệnh và các từ phải đứng sau nó theo đúng thứ tự này; `*` khớp với mọi văn bản. Tính năng cũng tìm thấy lệnh sau `&&`, `;`, `\|`, bên trong `$(…)`, `bash -c "…"` hoặc `eval`, và sau `sudo` hoặc `env`. Đây là rào chắn bảo vệ, không phải sandbox: một biến (`$CMD`), một tệp script hoặc một chương trình khác vẫn có thể chạy lệnh (xem Giới hạn). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ảnh chụp màn hình: Lệnh bị chặn"></a> |
74
+ | **Bảng tác vụ** | <a id="feature-taskboard"></a>Thanh bên trái → **Bảng tác vụ**. Bảng kanban các cuộc trò chuyện dsh của bạn với trạng thái trực tiếp giống thanh bên: cuộc trò chuyện đang chờ bạn phê duyệt, trả lời hoặc xem xét kế hoạch nằm ở **Đang duyệt** với chấm cam, cuộc trò chuyện đang chạy nằm ở **Đang làm**, cuộc trò chuyện đã xong nằm ở **Xong** (màu xanh lá cho đến khi bạn mở). Chọn một dự án hoặc **Tất cả dự án** ở bên trái; thư mục branch riêng của từng cuộc trò chuyện được tính là thuộc dự án của nó. **Tác vụ mới** (hoặc `n`) chỉ cần một prompt: `Enter` bắt đầu một cuộc trò chuyện mới trong dự án, thẻ hiện ở **Cần làm**, dsh đặt tên cho cuộc trò chuyện và mô hình của cuộc trò chuyện viết tối đa 3 nhãn. Nhấp vào thẻ để mở cuộc trò chuyện của nó. Trên thẻ màu cam, nhấp **Trả lời** để trả lời ngay trên bảng: **Từ chối** hoặc **Cho phép một lần**, **Phê duyệt** hoặc **Yêu cầu thay đổi** cho một kế hoạch, hoặc các lựa chọn và văn bản của riêng bạn cho một câu hỏi. **Ẩn mục đã xong** ẩn **Xong** trên thiết bị này. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ảnh chụp màn hình: Bảng tác vụ"></a> |
72
75
  | **Bộ nhớ dự án** | <a id="feature-projectmemory"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Mỗi thư mục dự án có bộ nhớ riêng, các cuộc trò chuyện sau này của dự án đó sẽ đọc, giống như DS Bot giữ một bộ nhớ cho mỗi Bot. Sau mỗi lượt kết thúc, một lần gọi mô hình của cuộc trò chuyện đọc các tin nhắn mới (không đọc tin nhắn đã hoàn tác), lưu sở thích, quyết định và dữ kiện lâu dài của bạn thành ghi chú ngắn, đồng thời sửa hoặc xóa ghi chú cũ. Tác tử cũng có thể tự lưu, xóa và tìm ghi chú (`memory_remember`, `memory_forget`, `memory_recall`). Ghi chú cũng có thể là ghi chú chung: mọi dự án đều đọc. Cuộc trò chuyện mới nhận các ghi chú trong system prompt; ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo. Các tệp là Markdown trong thư mục home của dsh (`storages/dsh-composer-plus/memory/`), không bao giờ nằm trong thư mục dự án. **Mở bộ nhớ** ở cùng hàng hiển thị mọi ghi chú đã lưu, nhóm theo dự án (và bộ nhớ chung), có bộ lọc. Viết bằng lời của bạn điều cần thay đổi (ví dụ "tôi đã chuyển từ yarn sang pnpm"), rồi bấm **Xem trước thay đổi**: mô hình mặc định của dsh đề xuất các thay đổi, và chỉ **Áp dụng** mới lưu chúng. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ảnh chụp màn hình: Bộ nhớ dự án"></a> |
73
76
  | **Cho phép trong cuộc trò chuyện này** | <a id="feature-allowforchat"></a>Khi Đánh giá tự động hỏi bạn, thẻ phê duyệt có thêm nút **Cho phép trong cuộc trò chuyện này**: từ đó trở đi, cùng công cụ đó trong cùng cuộc trò chuyện được cho phép, với mọi đối số, cho đến khi hết giới hạn thời gian (mặc định 1 giờ; chọn trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**). Sau đó, agent sẽ hỏi lại. Một nhãn nhỏ ở phần đầu liệt kê các quyền đã cấp kèm thời điểm kết thúc và cho phép thu hồi. Quyền vẫn còn sau khi khởi động lại. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ảnh chụp màn hình: Cho phép trong cuộc trò chuyện này"></a> |
74
77
  | **Trạng thái dự án** | <a id="feature-projectstatus"></a>Dòng dự án trên thanh bên hiện cùng dấu đang chạy / đang chờ / xong như các cuộc trò chuyện của nó. Vì vậy, dự án đã thu gọn vẫn cho bạn biết có cuộc trò chuyện bên trong đang làm việc hoặc cần bạn. Cuộc trò chuyện đang chờ bạn được hiện trước, sau đó là cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh, kể cả khi một cuộc trò chuyện khác vẫn đang chạy), rồi đến dấu đang chạy. Di chuột lên để xem chi tiết. Trong **Cây không gian làm việc**, dòng của thư mục cha cũng hiện các cuộc trò chuyện của từng dự án bên trong (ví dụ mỗi thư mục nhánh trong `.worktrees/`), kể cả khi thư mục đã thu gọn. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Trạng thái dự án"></a> |
75
- | **Branch Git trên dòng cuộc trò chuyện** | <a id="feature-sessionbranch"></a>Mỗi dòng cuộc trò chuyện ở thanh bên hiển thị một nhãn nhỏ màu xám với branch git mà thư mục dự án của cuộc trò chuyện đang ở trong lượt cuối của cuộc trò chuyện đó (ví dụ `main` hoặc `feature/login`; HEAD tách rời không có branch nên không hiển thị nhãn). Hai cuộc trò chuyện của cùng một dự án trên các branch khác nhau không còn trông giống nhau, và bạn thấy ngay khi sắp tiếp tục một cuộc trò chuyện trên sai branch. Di chuột lên nhãn để xem tên đầy đủ. Phần Host đọc branch (`git branch --show-current`, chỉ đọc) khi một lượt bắt đầu và khi kết thúc; cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài tính năng này, hoặc thư mục không phải repository git, sẽ không có nhãn. Nếu dòng dự án phía trên cuộc trò chuyện có cùng tên với branch (ví dụ thư mục của “Branch riêng cho từng cuộc trò chuyện”), dòng cuộc trò chuyện không hiển thị nhãn, nhưng “Trong một danh sách” vẫn hiển thị nhãn. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ảnh chụp màn hình: Branch Git trên dòng cuộc trò chuyện"></a> |
78
+ | **Branch Git trên dòng cuộc trò chuyện** | <a id="feature-sessionbranch"></a>Ở chế độ xem “Trong một danh sách” của thanh bên, mỗi dòng cuộc trò chuyện hiển thị một nhãn nhỏ màu xám với branch git mà thư mục dự án của cuộc trò chuyện đang ở trong lượt cuối của cuộc trò chuyện đó (ví dụ `main` hoặc `feature/login`; HEAD tách rời không có branch nên không hiển thị nhãn). Hai cuộc trò chuyện của cùng một dự án trên các branch khác nhau không còn trông giống nhau, và bạn thấy ngay khi sắp tiếp tục một cuộc trò chuyện trên sai branch. Di chuột lên nhãn để xem tên đầy đủ. Phần Host đọc branch (`git branch --show-current`, chỉ đọc) khi một lượt bắt đầu và khi kết thúc; cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài tính năng này, hoặc thư mục không phải repository git, sẽ không có nhãn. Trong “Không gian làm việc” và “Cây không gian làm việc”, không dòng cuộc trò chuyện nào hiển thị nhãn, vì cuộc trò chuyện đã nằm dưới dòng dự án của nó. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ảnh chụp màn hình: Branch Git trên dòng cuộc trò chuyện"></a> |
76
79
  | **Đánh dấu tất cả là đã đọc** | <a id="feature-markprojectread"></a>Trên thanh bên, nhấp nút **…** của một dự án → **Đánh dấu tất cả là đã đọc**. Mọi cuộc trò chuyện trong dự án đó mất chấm xanh chưa đọc cùng lúc; các dự án khác vẫn giữ chấm của mình. Mục này hiện màu xám (**Không có cuộc trò chuyện chưa đọc**) khi dự án không có cuộc trò chuyện chưa đọc nào. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Ảnh chụp màn hình: Đánh dấu tất cả là đã đọc"></a> |
77
80
  | **Ưu tiên dự án đang hoạt động** | <a id="feature-activeprojectsfirst"></a>Khi một cuộc trò chuyện bắt đầu chạy hoặc cần bạn, dự án của nó di chuyển lên đầu thanh bên với hiệu ứng dòng của chính dsh (giống như khi bạn kéo dự án lên đó). Dự án đã xong giữ nguyên vị trí; bạn vẫn kéo chúng đến bất kỳ đâu như thường. Các lần di chuyển được lưu vào thứ tự dự án của dsh, nên khi tắt tính năng này, thứ tự hiện tại được giữ nguyên. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Ưu tiên dự án đang hoạt động"></a> |
78
81
  | **Bộ lọc dự án gần đây** | <a id="feature-recentprojects"></a>Thanh bên → tùy chọn hiển thị (biểu tượng thanh trượt) → **Hoạt động trong 2 giờ qua**. Khi tùy chọn này được chọn, thanh bên chỉ hiện các dự án có cuộc trò chuyện hoạt động trong 2 giờ qua: cuộc trò chuyện được cập nhật trong khoảng thời gian này, cuộc trò chuyện đang chạy hoặc đang chờ, cuộc trò chuyện đang mở, hoặc cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh “xong” của dsh), kể cả sau 2 giờ. Các dự án không có cuộc trò chuyện như vậy bị ẩn, kể cả dự án mới và trống. Trong **Cây không gian làm việc**, thư mục cha vẫn hiển thị khi có dự án bên trong đang hoạt động, và các cuộc trò chuyện không hoạt động trong 2 giờ qua cũng bị ẩn, nên chỉ hiện các cuộc trò chuyện gần đây. Chọn lại tùy chọn để hiện tất cả dự án. Lựa chọn được lưu trên thiết bị này. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Ảnh chụp màn hình: Bộ lọc dự án gần đây"></a> |
@@ -82,7 +85,7 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
82
85
  | **Mở cuộc trò chuyện đang chờ khi không hoạt động** | <a id="feature-idleswitch"></a>Khi một cuộc trò chuyện đặt câu hỏi, đang chờ phê duyệt hay xem xét kế hoạch (chấm cam), hoặc hoàn tất một lượt mà bạn chưa đọc (chấm xanh), và bạn không dùng dsh trong 30 giây, dsh sẽ mở cuộc trò chuyện đó. Cuộc trò chuyện chấm cam được mở trước cuộc trò chuyện chấm xanh. Trong mỗi nhóm, cuộc chờ lâu nhất được mở trước; cuộc tiếp theo mở sau thêm 30 giây không dùng. Một phím, một cú nhấp, di chuột, con lăn hoặc một lần chạm sẽ bắt đầu lại 30 giây. Văn bản trong ô đang có tiêu điểm, văn bản đang chọn, hoặc một menu hay hộp thoại đang mở cũng ngăn việc chuyển. Khi một cuộc trò chuyện đang chờ ở trên màn hình, không có gì thay đổi. Nếu bạn rời một cuộc trò chuyện đang chờ mà chưa trả lời, nó có thể mở lại sau 30 giây không dùng tiếp theo. Khi một cuộc trò chuyện chấm xanh mở ra, chấm của nó biến mất; cuộc trò chuyện chấm xanh tiếp theo chỉ mở sau khi bạn dùng lại dsh rồi không dùng trong 30 giây. Tính năng cũng chạy khi dsh ở chế độ nền, nhưng dsh không được đưa lên trước. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Ảnh chụp màn hình: Mở cuộc trò chuyện đang chờ khi không hoạt động"></a> |
83
86
  | **Ngôn ngữ ứng dụng** | <a id="feature-language"></a>Cài đặt → Composer Plus → **Ngôn ngữ ứng dụng** chuyển toàn bộ giao diện dsh sang Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt hoặc हिन्दी (xem bên dưới). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ảnh chụp màn hình: Ngôn ngữ ứng dụng"></a> |
84
87
  | **Kết nối di động (iPhone)** | <a id="feature-mobileconnect"></a>Dùng dsh từ iPhone với ứng dụng [Tether](tether/), trong cùng mạng Wi-Fi hoặc qua [Tailscale](https://tailscale.com). Bật tính năng trong **Cài đặt → Composer Plus** (mặc định tắt, vì tính năng này mở một cổng mạng trên máy Mac này). Sau đó nhấp **Kết nối di động** ở góc dưới bên trái thanh bên: quét mã QR bằng Camera của iPhone (chạm vào **Open in Tether**) hoặc bằng **Scan code** trong Tether, chạm vào **Connect** và nhấp **Approve**. Hãy cài đặt Tether trước: nếu không có Tether, Camera không thể mở mã này. Điện thoại hiện các cuộc trò chuyện của bạn, gửi tin nhắn (kèm ảnh: **+** trong khung soạn thảo → Camera, Photos hoặc Paste image), trả lời phê duyệt và câu hỏi, và chuyển đổi mô hình và agent. Bạn có thể ghép nối bao nhiêu máy Mac tùy ý: tên máy Mac ở góc trên bên trái ứng dụng dùng để chuyển giữa các máy. Bảng **Kết nối di động** liệt kê các iPhone đã ghép nối kèm lần kết nối gần nhất: **Remove** ngắt ngay một máy. “Tailscale only” từ chối mạng cục bộ (dành cho Wi-Fi dùng chung), và nhật ký truy cập cho biết ai đã thử kết nối. Trong Tether, “Settings → Privacy” khóa ứng dụng bằng Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ảnh chụp màn hình: Kết nối di động (iPhone)"></a> |
85
- | **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần (lấy từ chính lần kiểm tra cập nhật, không gọi mạng thêm); **Đóng** hoặc `Esc` đóng nó. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
88
+ | **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần bằng ngôn ngữ trong **Ngôn ngữ ứng dụng** (ghi chú đi kèm phiên bản mới, không gọi mạng thêm; ngôn ngữ không có ghi chú sẽ hiện ghi chú tiếng Anh); **Đóng** hoặc `Esc` đóng nó. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
86
89
  | **Sao lưu** | <a id="feature-backup"></a>Cài đặt → Composer Plus → **Sao lưu** → **Sao lưu ngay** ghi toàn bộ thư mục home của dsh (cuộc trò chuyện, cài đặt, plugin, MCP, skill) vào một tệp lưu trữ duy nhất trong `~/Desktop/dsh-backups`, kèm checksum. Thông tin bí mật được che trong tệp lưu trữ: các tệp thông tin xác thực, tệp khóa (`.pem`, `.key`) và các giá trị token, secret và password trong cài đặt yml chỉ ở lại trên máy tính này, trong `vault` của thư mục. `cache/`, `dsh-runtimes/` và `node_modules` không có trong tệp lưu trữ (dsh tạo lại chúng). Mỗi bản sao lưu trong danh sách có **Kiểm tra** (đọc hết bản sao lưu), **Cho máy tính khác** (một thư mục để sao chép sang máy tính mới, kèm bảng điều khiển cứu hộ) và **Xóa**. Các tệp lưu trữ của dsh-backup trong cùng thư mục cũng hiện ra và dùng được. Để khôi phục, hãy thoát dsh và dùng bảng điều khiển cứu hộ. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Ảnh chụp màn hình: Sao lưu"></a> |
87
90
  | **Tự động sao lưu** | <a id="feature-autobackup"></a>Bật **Tự động sao lưu** (mặc định tắt: mỗi bản sao có dung lượng gần bằng thư mục home của dsh khi không tính bộ nhớ đệm). Chọn tần suất (**Mỗi**: từ 6 giờ đến 7 ngày, mặc định 24 giờ) và số bản sao lưu được giữ (**Giữ**: từ 3 đến 14, mặc định 7). Thời điểm tiếp theo hiện bên dưới công tắc; một lần sao lưu thất bại cũng hiện ở đó và được thử lại sau 30 phút. Khi dsh hoặc Composer Plus khởi động với phiên bản mới, một snapshot được tạo ngay sau khi khởi động, trước khi phiên bản mới dùng dữ liệu của bạn lâu (hai bản mới nhất được giữ, đánh dấu **Trước khi nâng cấp**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Ảnh chụp màn hình: Tự động sao lưu"></a> |
88
91
  | **Kiểm tra sức khỏe nhật ký phiên** | <a id="feature-sessiondoctor"></a>**Kiểm tra nhật ký phiên** đọc nhật ký của mọi cuộc trò chuyện và liệt kê những nhật ký mà dsh không mở được (frame bị hỏng, bản ghi bị cắt, số thứ tự sai). Phần cuối bị dở dang không được liệt kê: dsh tự sửa phần đó. **Sửa từ bản sao lưu** đưa bản sao từ bản sao lưu mới nhất có bản còn tốt trở lại, và giữ tệp bị hỏng ngay bên cạnh (`.corrupt-<thời gian>`). Các tin nhắn viết sau bản sao lưu đó không có trong bản sao. Cuộc trò chuyện đang mở trong dsh này không được sửa ở đây: hãy thoát dsh và sửa nó trong bảng điều khiển cứu hộ. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Ảnh chụp màn hình: Kiểm tra sức khỏe nhật ký phiên"></a> |
@@ -166,7 +169,9 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
166
169
  - **Kiểm tra mục tiêu:** chỉ chạy khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động (hoặc khi bạn nhấp **Chạy ngay**). Phần Host chạy lệnh kiểm thử trong thư mục của cuộc trò chuyện theo chế độ sandbox của cuộc trò chuyện (giống công cụ `bash` của chính dsh: cùng chính sách truy cập tệp; khi sandbox đó không khởi động được, bài kiểm thử không chạy và bước kiểm tra thất bại). Để tìm lệnh, phần Host chỉ đọc `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` và `pytest.ini`, dưới dạng tệp thông thường bên trong thư mục (không có symlink trỏ ra ngoài thư mục, không có FIFO). Sau đó phần Host gửi mục tiêu, cuộc trò chuyện kể từ khi mục tiêu bắt đầu (tin nhắn của bạn, câu trả lời của tác tử, các lệnh gọi công cụ cắt còn 1.000 ký tự và 2.000 ký tự cuối của mỗi kết quả công cụ; không có phần suy luận, không có bước đã bị hoàn tác; tối đa khoảng 60.000 ký tự, phần mới nhất), `git status --short` và phần cuối đầu ra kiểm thử đến mô hình đã chọn trong **Kiểm tra mục tiêu** (mặc định là mô hình của chính cuộc trò chuyện), dưới dạng một yêu cầu duy nhất không có công cụ. Đầu ra công cụ có thể chứa những gì tác tử đã đọc, nên yêu cầu này có thể chứa một phần tệp của bạn, giống như chính cuộc trò chuyện. Không có gì được ghi vào cuộc trò chuyện hay dự án. Lệnh kiểm thử của bạn, các giới hạn, kết quả gần nhất (kèm phần cuối đầu ra) và mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (tệp chỉ chủ sở hữu truy cập được, 500 cuộc trò chuyện mới nhất).
167
170
  - **Tiếp tục trong cuộc trò chuyện mới:** không có gì chạy cho đến khi bạn nhấp. Sau đó phần Host gửi cuộc trò chuyện (như Kiểm tra mục tiêu đọc: không có phần suy luận, không có bước đã bị hoàn tác) đến mô hình của chính cuộc trò chuyện và hiện ghi chú bàn giao; chỉ **Bắt đầu cuộc trò chuyện mới** mới tạo cuộc trò chuyện mới. Không có gì được ghi vào dự án.
168
171
  - **Phân tích ngữ cảnh:** phần Host chỉ đọc nhật ký cuộc trò chuyện; không gọi mô hình, không đọc tệp dự án.
172
+ - **Bảng tác vụ:** bảng hiện các cuộc trò chuyện của chính dsh từ các danh sách của chính dsh trong cửa sổ này; bảng không thêm dữ liệu trò chuyện riêng nào. Khi bạn bắt đầu một tác vụ, phần Host tạo một cuộc trò chuyện mới trong dự án bạn đã chọn và gửi prompt của bạn làm tin nhắn đầu tiên của nó, như thể bạn gõ prompt ở đó, nên phê duyệt, sandbox và mô hình của cuộc trò chuyện áp dụng như bình thường. Sau đó phần Host gửi prompt (4.000 ký tự đầu tiên, không gì khác) đến mô hình của cuộc trò chuyện đó trong thêm một yêu cầu, không có công cụ, để lấy tối đa 3 nhãn. Prompt, nhãn và thời điểm bắt đầu của mỗi tác vụ được lưu trong `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (tệp chỉ chủ sở hữu truy cập được, 2.000 mục mới nhất); công tắc nằm trong `board-switch.json` bên cạnh. Không có gì được ghi vào thư mục dự án. **Trả lời** gửi câu trả lời của bạn đến yêu cầu đang chờ của chính dsh, giống như thẻ của chính cuộc trò chuyện. Danh sách tác vụ cũ của các phiên bản trước (`board.json`) vẫn nằm trên đĩa như cũ và không được đọc.
169
173
  - **Tệp được bảo vệ:** danh sách và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc đường dẫn của mỗi lệnh gọi công cụ tệp (và đường dẫn thật của nó), không bao giờ đọc tệp.
174
+ - **Lệnh bị chặn:** các quy tắc và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc văn bản lệnh của mỗi lệnh gọi `bash` và `pwsh`; nó không chạy gì và không gửi gì.
170
175
  - **Bộ nhớ dự án:** tắt cho đến khi bạn bật. Khi bật, sau mỗi lượt kết thúc của một cuộc trò chuyện cấp cao nhất, phần Host gửi các tin nhắn mới của chính cuộc trò chuyện đó kể từ lần xem xét trước (tin nhắn của bạn và câu trả lời dạng văn bản của tác tử; không có đầu ra công cụ, suy luận, ngữ cảnh ẩn hay tin nhắn đã hoàn tác; trong cuộc trò chuyện rẽ nhánh, bản sao từ cuộc trò chuyện cha bị bỏ qua; tối đa khoảng 16.000 ký tự) và các ghi chú đã lưu tới mô hình của chính cuộc trò chuyện, trong một yêu cầu không có công cụ. Ghi chú là các tệp Markdown trong `$DSH_HOME/storages/dsh-composer-plus/memory/` (chỉ chủ sở hữu đọc/ghi): `projects/<id>/` cho mỗi thư mục dự án (`<id>` là mã băm của đường dẫn thật của thư mục; `project.json` ghi tên thư mục), `global/`, `journal.jsonl` (mỗi thay đổi kèm dòng trước và sau) và `reviewed.json` (đã đọc mỗi cuộc trò chuyện đến đâu). Không có gì được ghi vào thư mục dự án. Ghi chú trông giống khóa, token, mật khẩu hoặc số giấy tờ tùy thân bị từ chối. Ghi chú của một dự án đi vào system prompt của mỗi cuộc trò chuyện mới trong thư mục đó, nên chúng tới mô hình cùng mọi yêu cầu của cuộc trò chuyện đó. Công tắc nằm trong `memory.json` ở cùng chỗ. **Mở bộ nhớ** không gửi gì cho đến khi bạn bấm **Xem trước thay đổi**; khi đó nó gửi các ghi chú đang hiển thị và văn bản của bạn tới mô hình mặc định của dsh, trong một yêu cầu không có công cụ. Các thay đổi chỉ được ghi khi **Áp dụng**, với `editor` trong nhật ký. Tether đọc và thay đổi ghi chú qua cùng một tuyến.
171
176
  - **Sao lưu:** không có gì rời khỏi máy của bạn. Tệp lưu trữ được ghi vào `~/Desktop/dsh-backups` (tệp chỉ chủ sở hữu truy cập được). Thông tin bí mật không có trong tệp lưu trữ: các tệp thông tin xác thực (`.credentials.yaml`, `.env`), tệp khóa (`.pem`, `.key`, `.p12`, `.pfx`) và giá trị của các cài đặt token, secret, password và khóa API trong các tệp yml được che; bản thật của chúng nằm trong `composer-plus-vault/<archive>/` ở cùng thư mục (chỉ chủ sở hữu truy cập được), chỉ trên máy tính này. **Cho máy tính khác** không sao chép vault: hãy nhập lại các thông tin bí mật đó ở máy kia. Nhật ký trò chuyện, cài đặt và phần còn lại của thư mục home của dsh nằm nguyên trong tệp lưu trữ: hãy giữ thư mục này riêng tư, như chính `$DSH_HOME`. Quá trình sao lưu đọc tệp bằng `O_NOFOLLOW | O_NONBLOCK`; symlink được lưu dưới dạng liên kết (không bao giờ đi theo), còn FIFO hoặc thiết bị bị bỏ qua. Công tắc và cài đặt của sao lưu tự động nằm trong `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, công tắc của bảng điều khiển cứu hộ nằm trong `rescue-console.json`, và trong lúc dsh chạy, `running/host-<pid>.json` cho biết từng tiến trình dsh (bảng điều khiển cứu hộ đọc các tệp này để từ chối khôi phục).
172
177
  - **Bảng điều khiển cứu hộ:** một menu trong terminal; nó không mở cổng mạng nào. Khi khôi phục, nó chỉ ghi vào một thư mục mới bên cạnh thư mục home của dsh (tệp được ghi với `O_EXCL | O_NOFOLLOW`, symlink được tạo sau cùng và không bao giờ đi theo) và từ chối tệp lưu trữ có tên không an toàn (`..`, đường dẫn tuyệt đối), thiết bị hoặc FIFO, nhiều hơn một thư mục cấp cao nhất hoặc một mục nằm dưới liên kết.
@@ -186,10 +191,10 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
186
191
  - **Một cuộc trò chuyện không tiếp tục sau khi khởi động lại:** Tiếp tục sau khi khởi động lại đang tắt khi dsh thoát, bạn đã tự dừng lượt đó, lượt đã kết thúc (xong hoặc thất bại), cuộc trò chuyện đã được lưu trữ, hoặc có hơn 20 cuộc trò chuyện đang chạy (20 cuộc trò chuyện mới nhất sẽ tiếp tục).
187
192
  - **Hàng đợi trống sau khi khởi động lại:** chính dsh xóa hàng đợi khi thoát. Tiếp tục sau khi khởi động lại chỉ đặt lại hàng đợi trong cuộc trò chuyện mà nó tiếp tục; ở các cuộc trò chuyện khác, hãy gửi lại tin nhắn. Tin nhắn bạn xóa ngay trước khi thoát có thể quay lại: hãy xóa lại.
188
193
  - **Mở issue trên GitHub báo "gh could not open the issue":** thông báo này là dòng đầu tiên của chính `gh`. Chạy `gh auth status` trong terminal và đăng nhập bằng `gh auth login`; thư mục của cuộc trò chuyện phải có một remote GitHub (`git remote -v`). "not installed or not on the PATH of dsh" nghĩa là dsh không tìm thấy `gh`: hãy cài nó, hoặc khởi động dsh từ một terminal mà ở đó `gh` hoạt động.
189
- - **Dòng cuộc trò chuyện không có nhãn branch:** cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
194
+ - **Dòng cuộc trò chuyện không có nhãn branch:** thanh bên không ở chế độ xem “Trong một danh sách” (trong “Không gian làm việc” và “Cây không gian làm việc”, không dòng cuộc trò chuyện nào hiển thị nhãn), cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
190
195
  - **Kiểm tra mục tiêu báo bài kiểm thử thoát với mã 127 hoặc "not found":** dsh khởi động từ Finder hoặc Dock có thể có PATH ngắn hơn terminal của bạn, nên không tìm thấy `npm`, `pnpm` hoặc `cargo`. Hãy khởi động dsh từ terminal, hoặc đặt lệnh kiểm thử của riêng bạn với đường dẫn đầy đủ trong **Kiểm tra mục tiêu** → **Sửa**. **Chạy ngay** hiện kết quả ngay lập tức.
191
196
  - **Mục tiêu không đóng và tác tử tiếp tục làm việc:** **Kiểm tra mục tiêu** đã tìm thấy một bài kiểm thử thất bại hoặc phần việc còn thiếu; dòng bên dưới mục tiêu cho biết lý do (di chuột lên kết quả để xem chi tiết). Hãy sửa nguyên nhân hoặc lệnh kiểm thử, hoặc tự hoàn tất mục tiêu bằng `/goal` hoặc thanh mục tiêu (việc này không được kiểm tra).
192
- - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.17.0`), xem ghi chú cài đặt ở trên.
197
+ - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.19.0`), xem ghi chú cài đặt ở trên.
193
198
  - **Sao lưu ngay báo "Một thao tác sao lưu khác đang chạy":** một thao tác đang chạy trong cửa sổ dsh khác hoặc trong bảng điều khiển cứu hộ (chúng dùng chung tệp khóa `.composer-plus.lock` trong thư mục sao lưu). Hãy chờ thao tác đó xong. Nếu không có thao tác nào đang chạy, khóa của tiến trình đã đóng sẽ được tiếp quản ở lần nhấp tiếp theo.
194
199
  - **Bảng điều khiển cứu hộ báo "dsh is running":** trước tiên hãy thoát dsh. Nếu dsh thật sự đã đóng, tệp được nêu trong thông báo là phần còn sót lại sau một sự cố: hãy xóa tệp đó rồi thử lại.
195
200
  - **Sau khi khôi phục, dsh không khởi động hoặc thiếu một plugin:** cần cài lại các gói plugin của profile. Bảng điều khiển cứu hộ đề nghị việc này sau khi khôi phục; hoặc chạy `pnpm install` trong từng thư mục dưới `$DSH_HOME/profiles/` mà nó liệt kê. Các thông tin bí mật không có trong vault (máy tính khác) phải được nhập lại: bảng điều khiển liệt kê chúng.
@@ -209,6 +214,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
209
214
  - **Xóa cuộc trò chuyện** cần tính năng lưu trữ của dsh (dsh 0.2.0 trở lên). Một cuộc trò chuyện (hoặc một cuộc trò chuyện subagent của nó) không dừng trong vòng 15 giây, hoặc đang bị một dsh khác giữ, sẽ ở trạng thái đã lưu trữ và không có gì bị di chuyển. Trên hệ thống khác macOS, thư mục thùng rác phải nằm cùng ổ đĩa với lịch sử trò chuyện. Một cuộc trò chuyện đang mở mà bạn xóa vẫn ở trong bộ nhớ của dsh, ở trạng thái đã lưu trữ và bị ẩn, cho đến khi dsh khởi động lại. Hãy tự dọn Thùng rác; dsh không làm việc này.
210
215
  - Hàng đợi của dsh không có thao tác `move`, nên phần Host của plugin di chuyển chính tin nhắn đang chờ trong hàng đợi của dsh (một thay đổi, vẫn là tin nhắn đó). Tin nhắn có hình ảnh hoặc tệp cũng di chuyển được. Chỉ tin nhắn của chính bạn mới di chuyển được: một vòng mục tiêu hoặc một câu trả lời cho câu hỏi trong hàng đợi vẫn ở nguyên chỗ. Nếu một tin nhắn bắt đầu được gửi trong lúc bạn kéo, không có gì được di chuyển và một thông báo cho biết điều đó.
211
216
  - dsh 0.2.1 tải bản cập nhật ngay lập tức khi phiên bản mới không thay đổi cài đặt nào của dsh; trong các trường hợp khác và trên dsh 0.2.0, hãy khởi động lại dsh để tải bản cập nhật. Plugin không bao giờ tự khởi động lại dsh thay bạn. Profile web/CLI không có trình quản lý plugin của dsh chỉ báo có phiên bản mới.
217
+ - **Có gì mới trong Composer Plus N** hiện ghi chú bằng ngôn ngữ trong **Ngôn ngữ ứng dụng**. Ngôn ngữ giao diện có vùng khác sẽ nhận ghi chú của ngôn ngữ gốc (`en-GB` nhận ghi chú tiếng Anh, `zh-TW` nhận ghi chú tiếng Trung của `zh`). Ngôn ngữ không có ghi chú (ngôn ngữ do gói ngôn ngữ khác thêm vào, hoặc `pt-PT`, không phải `pt-BR`) sẽ hiện ghi chú tiếng Anh. Ghi chú đi kèm phiên bản mới. Nếu bản đang chạy không có tệp ghi chú đọc được (`release-notes.json`), cửa sổ hiện ghi chú tiếng Anh trên GitHub.
212
218
  - **Cho phép trong cuộc trò chuyện này** tính giới hạn thời gian từ lúc cấp quyền. Giới hạn thời gian mới áp dụng ngay cho các quyền đang có hiệu lực, nên một giới hạn ngắn hơn có thể kết thúc chúng ngay. Quyền từ phiên bản 1.12 trở về trước không có thời gian: sau khi cập nhật, agent sẽ hỏi lại một lần cho các công cụ đó.
213
219
  - **Giữ con trỏ trong khung soạn thảo** chỉ trả lại tiêu điểm sau một lệnh `/` hoặc một skill. Trong lúc dsh xử lý lệnh, khung soạn thảo ở chế độ chỉ đọc trong vài mili giây, nên các phím nhấn trong khoảng đó bị mất. Nếu menu `/` của dsh vẫn đang mở, `Enter` chọn dòng đang được tô sáng và không gửi.
214
220
  - **Vừa thẻ câu hỏi với cửa sổ** chỉ thay đổi thẻ câu hỏi của dsh, không thay đổi thẻ duyệt kế hoạch. Tính năng tìm thẻ qua mã đánh dấu của dsh (`data-question-key`, `data-question-scroll`); nếu một bản cập nhật dsh thay đổi mã đánh dấu đó, thẻ hiển thị như dsh vẽ. Chiều cao của thẻ theo cửa sổ, không theo cuộc trò chuyện: trong một cuộc trò chuyện ở bảng bên hẹp, một thẻ cao vẫn có thể vượt lên trên cuộc trò chuyện.
@@ -222,7 +228,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
222
228
  - **Cuộc trò chuyện này** chỉ tính các tệp mà công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`) đã ghi. Tệp do một lệnh (`bash`) thay đổi không có trong chế độ xem này; chúng hiện trong **Chưa commit**. Khi không có snapshot Hoàn tác lượt của cuộc trò chuyện (Hoàn tác lượt đang tắt, đã cài dsh-rewind-plugin, hoặc cuộc trò chuyện cũ hơn plugin), chế độ xem so sánh với commit gần nhất và báo như vậy. Hoàn tác lượt giữ 50 snapshot mới nhất của một cuộc trò chuyện: trong cuộc trò chuyện dài hơn, chế độ xem so sánh với snapshot cũ nhất còn giữ, cho biết từ tin nhắn nào và không tính các thay đổi trước đó. **Ẩn thay đổi khoảng trắng** là `git diff -w`: một dòng chỉ thay đổi khoảng trắng bên trong cũng bị ẩn.
223
229
  - **Mở issue trên GitHub** cần GitHub CLI (`gh`) trong PATH của dsh và một remote GitHub trong thư mục của cuộc trò chuyện. Tính năng chạy tối đa 60 giây; nếu `gh` mất nhiều thời gian hơn, issue có thể đã có trên GitHub mà không có liên kết trong danh sách (trước khi nhấp lại, hãy xem trên GitHub: danh sách chỉ đọc liên kết từ một lần chạy đã xong, nên một lần nhấp mới có thể mở issue thứ hai). Thư mục có nhiều hơn một remote GitHub dùng mặc định của chính `gh` (`gh repo set-default`).
224
230
  - **Các cuộc trò chuyện đã thay đổi tệp này** chỉ biết các công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`), giống **Cuộc trò chuyện này**: thay đổi do một lệnh (`bash`) tạo ra không được liệt kê. Tính năng đọc 300 cuộc trò chuyện mới nhất của repository (theo thời điểm tạo) và báo khi có nhiều hơn; tính năng hiển thị tối đa 100 dòng. Tệp đã đổi tên được liệt kê theo tên mà công cụ đã ghi. Cuộc trò chuyện có thư mục nằm ngoài repository (kể cả qua một đường dẫn khác tới cùng các tệp) không được tính. Lần mở đầu tiên sau khi khởi động dsh sẽ đọc mọi nhật ký trò chuyện của repository (khoảng 4 giây cho 275 cuộc trò chuyện); các lần mở sau chỉ đọc những cuộc trò chuyện đã thay đổi từ đó.
225
- - **Branch Git trên dòng cuộc trò chuyện** hiển thị branch của thư mục cuộc trò chuyện khi lượt cuối của nó bắt đầu hoặc kết thúc, không phải branch hiện tại: việc chuyển branch bên ngoài một lượt sẽ hiện sau lượt tiếp theo. Các cuộc trò chuyện từ trước phiên bản này không có nhãn cho đến lượt tiếp theo của chúng. Nhãn nằm trong markup dòng cuộc trò chuyện của dsh (dsh không có vị trí dành cho nó ở đó); nếu một bản cập nhật dsh thay đổi markup đó, nhãn không hiện. Nếu dòng dự án phía trên cuộc trò chuyện có cùng tên với branch (ví dụ thư mục của “Branch riêng cho từng cuộc trò chuyện”), dòng cuộc trò chuyện không hiển thị nhãn, nhưng “Trong một danh sách” vẫn hiển thị nhãn.
231
+ - **Branch Git trên dòng cuộc trò chuyện** hiển thị branch của thư mục cuộc trò chuyện khi lượt cuối của nó bắt đầu hoặc kết thúc, không phải branch hiện tại: việc chuyển branch bên ngoài một lượt sẽ hiện sau lượt tiếp theo. Các cuộc trò chuyện từ trước phiên bản này không có nhãn cho đến lượt tiếp theo của chúng. Nhãn nằm trong markup dòng cuộc trò chuyện của dsh (dsh không có vị trí dành cho nó ở đó); nếu một bản cập nhật dsh thay đổi markup đó, nhãn không hiện. Nhãn chỉ hiện trong “Trong một danh sách”.
226
232
  - **Branch riêng cho từng cuộc trò chuyện** ở chế độ kế hoạch: dsh gửi `/plan <tin nhắn>` như một lệnh, không phải một tin nhắn, nên Composer Plus chặn thao tác gửi lệnh đó trong ô nhập của dsh (không phải API công khai). Nếu một bản cập nhật dsh thay đổi điều này, `/plan <tin nhắn>` khi đã chọn **Branch mới** sẽ chạy trong Cuộc trò chuyện mới đang mở như lệnh riêng của dsh. Khi Host không thể bật chế độ kế hoạch trong cuộc trò chuyện mới, thư mục branch vẫn còn và tin nhắn không được gửi, nên cuộc trò chuyện mới không thay đổi tệp ở chế độ mặc định.
227
233
  - **Branch riêng cho từng cuộc trò chuyện**: khi thư mục branch của một cuộc trò chuyện (`<project>/.worktrees/<name>`) bị xóa, ví dụ khi chính agent của cuộc trò chuyện gỡ worktree và xóa branch, bước tiếp theo của cuộc trò chuyện sẽ chuyển cuộc trò chuyện ra khỏi thư mục đó. Dự án của thư mục branch biến mất khỏi thanh bên, còn cuộc trò chuyện hiển thị dưới Chưa nhóm và vẫn mở. Trên dsh 0.2.1 trở lên, cuộc trò chuyện tiếp tục trong thư mục chính của dự án, và mô hình nhận được một ghi chú về thư mục mới. Trên dsh 0.2.0, cuộc trò chuyện vẫn giữ thư mục đã xóa: lệnh chạy ở đó sẽ lỗi cho đến khi bạn bắt đầu cuộc trò chuyện mới. Dự án của một branch đã xóa mà không cuộc trò chuyện nào dùng cũng biến mất khỏi thanh bên: Composer Plus kiểm tra các thư mục branch khi khởi động và mỗi 30 giây, kể cả khi không có bộ lọc thanh bên. Trong lúc một cuộc trò chuyện đang được chuyển, **Branch mới** trong cùng kho mã sẽ trả lời "hãy thử lại". Khi tắt công tắc, lỗi của chính dsh lại hiện ra ("working-directory: directory does not exist").
228
234
  - **Branch trong cây không gian làm việc** ghi vào git mà không cần nhấp: khi chuyển một cuộc trò chuyện, nó đưa thư mục dự án về branch trước đó (`git switch`) và thêm một worktree (`git worktree add`). Nó không bao giờ xóa branch, worktree hay tệp. dsh không thể đổi thư mục của một cuộc trò chuyện, nên cuộc trò chuyện được chuyển là một bản sao (fork của chính dsh, với id mới) và cuộc trò chuyện cũ được lưu trữ. Bản sao tiếp tục công việc đã dừng; lệnh gọi công cụ đang chạy khi branch xuất hiện kết thúc bằng một lời từ chối, và agent chạy lại nó trong thư mục mới. Mục tiêu của cuộc trò chuyện cũ không đi theo. Chỉ cuộc trò chuyện có thư mục là thư mục chính của kho mới được chuyển, và chỉ với branch mà nó đã tạo và chuyển sang trong lượt đó (`git switch -c`, `git checkout -b`): branch chỉ tạo bằng `git branch`, thư mục có thay đổi chưa commit, worktree được liên kết hoặc thư mục con đều không chuyển gì. Trong cây chỉ hiện các worktree nằm trực tiếp trong `<project>/.worktrees/` và có branch; worktree tách rời (detached) hoặc ở nơi khác thì không hiện. Bản sao chỉ tự mở khi cuộc trò chuyện của nó là cuộc trò chuyện đang mở (plugin đọc điều này từ hàng thanh bên của dsh); nếu không, nó nằm trong dự án của branch.
@@ -239,8 +245,11 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
239
245
  - **Cải thiện prompt** chỉ thấy bản tóm tắt ngắn về dự án, các đường dẫn đã thay đổi và các đường dẫn có tên khớp với từ ngữ của bạn: không thấy chính mã nguồn. Vì vậy tính năng có thể bỏ sót đúng tệp cần dùng, và chỉ nêu những đường dẫn được cung cấp. Hãy đọc văn bản mới trước khi gửi. Tính năng không chạy với lệnh gạch chéo khác `/goal <mục tiêu>`, với từ điều khiển của `/goal` (`clear`, `pause`, `resume`) hoặc tin nhắn có nhãn tệp hoặc nhãn ký hiệu (văn bản mới là văn bản thuần, nên sẽ mất nhãn), và một tin nhắn có tối đa 8.000 ký tự. Với một mục tiêu `/goal`, tính năng chỉ viết điều kiện từ bản nháp và ngữ cảnh; một điều kiện quá chặt có thể tốn thêm vòng mục tiêu, nên hãy đọc điều kiện trước khi gửi. Hình ảnh vẫn được đính kèm: chỉ văn bản thay đổi. Mỗi lần nhấp tốn một lần gọi mô hình; một mô hình mạnh có thể mất một phút (`Esc` để hủy).
240
246
  - **Kiểm tra mục tiêu** chỉ kiểm tra lần hoàn tất mà tác tử thực hiện trong một vòng mục tiêu tự động: lần hoàn tất mà bạn yêu cầu trong cuộc trò chuyện, `/goal` và thanh mục tiêu không được kiểm tra. Tác tử có thể tự thay đổi các bài kiểm thử hoặc các tệp của lệnh kiểm thử; bộ xác minh đọc cuộc trò chuyện và có thể thấy điều đó, nhưng có thể sai theo cả hai hướng (một kết quả "chưa xong" sai tốn thêm một vòng; một kết quả "đã xong" sai đóng mục tiêu). Bộ xác minh thấy cuộc trò chuyện và `git status`, không thấy chính mã nguồn. Một lần chạy kiểm thử chỉ được dùng lại khi bước mới nhất có thể thay đổi tệp của tác tử là lần chạy `bash` đạt của chính tác tử với đúng cùng một lệnh trong cùng thư mục; lệnh có pipe (`| tail`) hoặc `&&` không được dùng lại. Ngân sách được đo khi một lượt kết thúc, nên một lượt có thể vượt quá ngân sách. Ngân sách token cũng tính các lần gọi của các cuộc trò chuyện subagent của cuộc trò chuyện (đọc từ nhật ký đã lưu của chúng ở cuối mỗi lượt, nên một cuộc trò chuyện có nhiều subagent cần lâu hơn một chút để kiểm tra). Bảng bằng chứng đến từ việc bộ xác minh tự đọc cuộc trò chuyện: một phần mà bộ xác minh gọi là đã xác minh vẫn cần bạn tự xem lại khi phần đó quan trọng. `update_goal` chờ trong khi bước kiểm tra chạy (bài kiểm thử tối đa 15 phút, bộ xác minh tối đa 3 phút). Cuộc trò chuyện tách nhánh nhận một id cuộc trò chuyện mới, nên bắt đầu mà không có lệnh kiểm thử và các giới hạn riêng của cuộc trò chuyện gốc. Mỗi lần hoàn tất đi đến bộ xác minh tốn một lần gọi mô hình.
241
247
  - **Tệp được bảo vệ** là rào chắn bảo vệ, không phải sandbox. Tính năng bao gồm các công cụ tệp của chính dsh (`read`, `read_image`, `grep` trên một tệp, `write`, `edit`, `str_replace_editor`). Một lệnh shell (`cat .env`), một script mà tác tử viết, shell của một subagent, một công cụ MCP, một danh sách `glob` và một lệnh `grep` trên cả thư mục vẫn có thể truy cập tệp được bảo vệ. Để có giới hạn thật, hãy dùng các chế độ sandbox của dsh hoặc giữ bí mật bên ngoài thư mục dự án. Mẫu hiểu `*`, `**` và `?`, không hiểu `{a,b}` hoặc `[ab]`, và không phân biệt chữ hoa/thường.
248
+ - **Lệnh bị chặn** là rào chắn bảo vệ, không phải sandbox. Tính năng chỉ đọc văn bản lệnh của các công cụ `bash` và `pwsh` của dsh. Một biến hoặc alias mang tên lệnh (`CMD=npm; $CMD publish`), một hàm shell, một tệp script mà tác tử viết, một chương trình khác (`python -c`, `node -e`, `make`), một công cụ MCP và terminal của chính bạn vẫn có thể chạy lệnh đó. Một quy tắc có thể khớp nhiều hơn bạn muốn: bất kỳ từ nào trong lệnh cũng có thể là tên lệnh (`echo npm publish` khớp với `npm publish`), và các từ khác có thể nằm giữa các từ của quy tắc (`git push --force` cũng khớp với `git push origin main --force`). Hãy làm quy tắc dài hơn khi nó khớp quá nhiều. **hỏi trước** cần một cuộc trò chuyện có thể hỏi: trong cuộc trò chuyện có chính sách phê duyệt là never (ví dụ một subagent được ủy quyền), dsh không thể hiện thẻ, nên lệnh gọi bị từ chối kèm lý do. Thẻ phê duyệt hiện lý do bằng tiếng Anh. **Cho phép trong cuộc trò chuyện này** không trả lời thẻ **hỏi trước**.
242
249
  - **Tiếp tục trong cuộc trò chuyện mới** gửi cuộc trò chuyện (tin nhắn, lệnh gọi công cụ và phần cuối của mỗi kết quả công cụ, tối đa khoảng 60.000 ký tự, phần mới nhất) đến mô hình của chính cuộc trò chuyện. Ghi chú bàn giao có thể bỏ sót một quyết định hoặc một tệp: hãy đọc ghi chú trước khi bắt đầu. Cuộc trò chuyện mới chỉ biết ghi chú và cuộc trò chuyện được liên kết (dsh đính kèm cuộc trò chuyện cũ làm ngữ cảnh chỉ đọc); ngữ cảnh mô hình của nó bắt đầu nhỏ, cuộc trò chuyện cũ vẫn giữ nguyên. Mỗi cuộc trò chuyện chỉ có một lần viết ghi chú hoặc bắt đầu tại một thời điểm.
243
250
  - **Phân tích ngữ cảnh** hiện số ước tính theo quy tắc của chính dsh (khoảng 4 ký tự cho mỗi token), cùng quy tắc với vòng ngữ cảnh của dsh; số đếm của chính mô hình có thể khác. Định nghĩa công cụ là định nghĩa của yêu cầu mới nhất. Tính năng hiện ngữ cảnh như nhật ký cuộc trò chuyện ghi lại; một lượt đang chạy xuất hiện sau bước tiếp theo của lượt đó.
251
+ - **Các bước đã lên kế hoạch** chỉ tiết kiệm token khi mô hình thực sự lên kế hoạch: khi đang bật, mỗi yêu cầu đều mang công cụ `plan_next_steps` và một chỉ dẫn ngắn (khoảng 500 token), kể cả trong những cuộc trò chuyện mà mô hình không bao giờ lên kế hoạch. Một điều kiện chỉ chứng minh đúng điều nó nêu (ví dụ: mã thoát của bản dựng là 0), không chứng minh công việc là đúng. `ok` đọc các dấu kết quả riêng của dsh (`[exit code: N]`, hết thời gian, sandbox từ chối); một lệnh thất bại mà không có mã thoát khác 0 vẫn được tính là đạt. Các bước chạy lần lượt từng bước; hai bước cùng sẵn sàng sẽ được trả lại cho mô hình. Tin nhắn của bước được lưu dưới dạng tin nhắn trợ lý của mô hình trong cuộc trò chuyện (dsh không có dấu cho tin nhắn do plugin viết), nên nội dung của nó ghi rằng Composer Plus đã chạy bước đó. Không có trong Tether.
252
+ - **Bảng tác vụ** hiện các cuộc trò chuyện mà dsh liệt kê trong cửa sổ này: cuộc trò chuyện nằm ngoài dự án chỉ hiện trong **Tất cả dự án**, và thư mục branch riêng của từng cuộc trò chuyện (`<project>/.worktrees/<name>`) được tính là thuộc dự án của nó. Cột của một thẻ là trạng thái trực tiếp của cuộc trò chuyện, nên không thể kéo thẻ: cuộc trò chuyện chuyển sang **Xong** khi lượt của nó kết thúc, kể cả sau lỗi hoặc khi bị dừng, và quay lại **Đang làm** khi chạy lại. Chấm xanh lá là chấm hoàn tất của chính dsh, mà dsh chỉ giữ trong cửa sổ này: sau khi trang được tải lại, các cuộc trò chuyện đã xong hiện không có chấm này. **Xong** hiện 50 cuộc trò chuyện mới nhất (**Hiện N tác vụ cũ hơn** hiện phần còn lại). Nhãn đến từ một lệnh gọi mô hình cho mỗi tác vụ đã bắt đầu: nhãn có thể sai, và cuộc trò chuyện mà bạn không bắt đầu trên bảng thì không có nhãn. Tiêu đề là tiêu đề cuộc trò chuyện của chính dsh (dịch vụ đặt tiêu đề của dsh, với mô hình của cuộc trò chuyện); cho đến khi có tiêu đề, thẻ hiện dòng đầu tiên của prompt. Prompt bắt đầu bằng một lệnh `/` mà dsh biết (`/plan`, `/goal`) chạy như lệnh đó. **Trả lời** chỉ trả lời yêu cầu mới nhất của cuộc trò chuyện: khi yêu cầu đó đã được trả lời ở nơi khác (cửa sổ khác, Tether, Đánh giá tự động) hoặc cuộc trò chuyện hỏi điều mới, khung chi tiết báo điều đó và không gửi gì. Các phiên bản trước có danh sách tác vụ với bình luận và công cụ cho tác tử; chúng đã bị bỏ, và `board.json` cũ không được hiển thị. Ý tưởng và giao diện lấy từ [Kanzo](https://github.com/emanuele-em/kanzo) của emanuele-em (AGPL-3.0); Composer Plus không dùng mã của nó.
244
253
  - **Ưu tiên tin nhắn gửi sau khi Dừng** chỉ hoạt động sau khi bạn dừng cuộc trò chuyện (hoặc sau một lượt bị lỗi, hoặc khi bạn mở một cuộc trò chuyện vẫn còn hàng đợi): tin nhắn bạn gửi khi một lượt đang chạy vẫn chờ ở cuối hàng đợi. Nó chỉ vượt lên trước các tin nhắn của chính bạn trong hàng đợi: nếu trong hàng đợi có một vòng mục tiêu hoặc một câu trả lời cho câu hỏi đang chờ, thứ tự của dsh được giữ nguyên. Nó đọc một phần của dsh không phải là API công khai (lượt đã dừng có còn đang kết thúc không); nếu một bản cập nhật dsh đổi tên phần đó, tin nhắn chỉ được đưa lên đầu sau khi lượt đó kết thúc. Cuộc trò chuyện của subagent giữ thứ tự của dsh.
245
254
  - **Bộ nhớ dự án** thuộc về thư mục đầu tiên của cuộc trò chuyện (thư mục dự án của dsh): cuộc trò chuyện đổi thư mục bằng `cd` vẫn giữ bộ nhớ của dự án đầu tiên, và cùng thư mục được mở qua một đường dẫn khác tới cùng các tệp sẽ dùng chung bộ nhớ. Cuộc trò chuyện cố định phần bộ nhớ khi bắt đầu, nên ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo (`memory_recall` tìm thấy ngay). Việc xem xét chỉ giữ những gì mô hình quyết định giữ: có thể bỏ sót một dữ kiện hoặc giữ một dữ kiện sai; hãy kiểm tra trong **Mở bộ nhớ** và sửa ở đó, hoặc sửa các tệp bằng tay khi dsh đã đóng. **Mở bộ nhớ** gửi ghi chú của dự án được chọn và ghi chú chung (mọi dự án khi bạn chọn Tất cả ghi chú; tối đa khoảng 60.000 ký tự, phần còn lại chỉ được đếm và không thể thay đổi trong yêu cầu đó) cùng văn bản của bạn tới mô hình mặc định của dsh, không phải mô hình của cuộc trò chuyện. Bản xem trước được giữ trên Mac trong 30 phút và cho đến khi dsh khởi động lại; nếu việc xem xét hoặc tác tử thay đổi ghi chú trong lúc đó, **Áp dụng** sẽ từ chối và bạn xem trước lại. **Áp dụng** lưu tất cả thay đổi của một bản xem trước hoặc không lưu gì: nếu một thay đổi không lưu được (ví dụ MEMORY.md đã đầy), ghi chú giữ nguyên và lý do được hiển thị. Mỗi lượt kết thúc có tin nhắn của bạn tốn một lần gọi mô hình; lần gọi thất bại sẽ đọc lại cùng các tin nhắn sau lượt tiếp theo. Cuộc trò chuyện của tác tử con không được xem xét. Ý tưởng và định dạng tệp lấy từ [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus không dùng mã của nó và không bao giờ đọc hay ghi bộ nhớ riêng của DS Bot.
246
255
  - **Sao lưu** dùng một thư mục cố định duy nhất, `~/Desktop/dsh-backups` (thư mục mặc định của dsh-backup, nên các tệp lưu trữ của nó vẫn dùng được); không có cài đặt cho thư mục khác. Một tệp lưu trữ lớn gần bằng thư mục home của dsh khi không tính `cache/` và `dsh-runtimes/` (đo thực tế: 1,6 GB tệp tạo ra tệp lưu trữ 830 MB trong khoảng 30 giây trên Apple Silicon; dsh vẫn phản hồi bình thường). Một tệp thay đổi trong lúc được đọc sẽ được lưu ở trạng thái lúc quá trình sao lưu mở nó, nên nhật ký của một cuộc trò chuyện đang mở có thể kết thúc bằng một bản ghi bị cắt, và dsh sửa bản ghi đó ở lần ghi tiếp theo. Việc che tìm thông tin bí mật trong tệp yml theo tên khóa trên một dòng (`token:`, `apiKey:`, …); thông tin bí mật trong flow map (`{token: x}`), trong một danh sách dưới khóa như vậy, trong tệp JSON (ví dụ `apiKey` của một máy chủ MCP trong tệp `.json`) hoặc dưới tên khác vẫn nằm trong tệp lưu trữ. Các tệp lưu trữ theo loại của dsh-backup (`dsh-t-…`) không được liệt kê. **Cho máy tính khác** sao chép tệp lưu trữ (trên APFS là bản clone: không tốn thêm dung lượng); vault không đi kèm. **Sao lưu ngay** không xóa bản sao lưu nào. Một lần sao lưu tự động giữ các bản sao lưu mới nhất do Composer Plus tạo (cài đặt **Giữ** của **Tự động sao lưu**) và xóa các bản cũ hơn do nó tạo; các snapshot trước khi nâng cấp được đếm riêng (giữ lại 2 bản mới nhất). Các tệp lưu trữ của dsh-backup không bao giờ bị xóa: hãy xóa chúng bằng **Xóa**. Khi dsh-backup vẫn còn được cài, nó tính các tệp lưu trữ của Composer Plus vào số bản giữ lại của riêng nó và có thể xóa chúng.
@@ -277,6 +286,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
277
286
 
278
287
  **Tác tử có thể nhớ sở thích của tôi giữa các cuộc trò chuyện, như bộ nhớ của DS Bot không?** Có, với **Bộ nhớ dự án** (mặc định tắt): hãy bật trong **Cài đặt → Composer Plus**. Sau mỗi lượt, sở thích và quyết định lâu dài của bạn được lưu thành ghi chú ngắn cho dự án của cuộc trò chuyện, và mọi cuộc trò chuyện mới trong dự án đó đều đọc chúng. Hãy bảo tác tử nhớ một điều, nó sẽ lưu ngay. Để xem hoặc thay đổi ghi chú, bấm **Mở bộ nhớ** ở cùng hàng và viết điều cần thay đổi.
279
288
 
289
+ **Tôi có thể xem tất cả cuộc trò chuyện của mình dưới dạng bảng kanban và bắt đầu cuộc trò chuyện mới từ đó không?** Có, với **Bảng tác vụ** (mặc định bật): mở nó ở thanh bên trái. Mỗi cuộc trò chuyện là một thẻ trong **Đang làm**, **Đang duyệt** (đang chờ bạn) hoặc **Xong**. **Tác vụ mới** chỉ cần một prompt và bắt đầu một cuộc trò chuyện mới với prompt đó; nhấp **Trả lời** trên thẻ màu cam để trả lời mà không cần mở cuộc trò chuyện.
290
+
280
291
  **dsh có thể sao lưu các cuộc trò chuyện và cài đặt của tôi như dsh-backup không?** Có: **Cài đặt → Composer Plus → Sao lưu → Sao lưu ngay**. Nó ghi cùng định dạng tệp lưu trữ vào cùng thư mục (`~/Desktop/dsh-backups`), nên các tệp lưu trữ của dsh-backup cũng hiện ra và khôi phục được, và bạn có thể gỡ dsh-backup. Bật **Tự động sao lưu** để sao lưu theo lịch.
281
292
 
282
293
  **dsh không khởi động được nữa. Làm sao để khôi phục một bản sao lưu?** Mở thư mục sao lưu (`~/Desktop/dsh-backups`) và nhấp đúp vào `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Chọn `3) Restore a backup`, chọn một bản sao lưu rồi gõ `RESTORE`. Cách này chạy được mà không cần dsh.
@@ -301,6 +312,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
301
312
 
302
313
  **Làm sao để chỉ xem các tệp mà một cuộc trò chuyện đã thay đổi?** Thanh bên phải → **Thay đổi** → **Cuộc trò chuyện này**. Nhấp **␣** để ẩn các thay đổi chỉ có khoảng trắng.
303
314
 
315
+ **Làm sao để ngăn tác tử chạy `npm publish` hoặc `git push --force`?** **Cài đặt → Composer Plus → Lệnh bị chặn**: nhập `npm publish`, chọn **chặn** hoặc **hỏi trước**, rồi nhấp **Thêm**. **chặn** từ chối lệnh và tác tử hỏi bạn; **hỏi trước** hiện thẻ phê duyệt mỗi lần. Tệp được bảo vệ áp dụng cho các công cụ tệp của tác tử; Lệnh bị chặn áp dụng cho các lệnh shell của tác tử.
316
+
304
317
  **Làm sao để Đánh giá tự động thôi hỏi về cùng một công cụ trong một cuộc trò chuyện?** Nhấp **Cho phép trong cuộc trò chuyện này** trên thẻ phê duyệt. Quyền này chỉ áp dụng cho đúng công cụ đó trong cuộc trò chuyện đó, mặc định trong 1 giờ; thu hồi quyền từ nhãn ở phần đầu. Đổi thời gian trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**.
305
318
 
306
319
  **Tôi bị mất iPhone. Làm sao để chặn nó truy cập máy Mac của tôi?** Nhấp **Kết nối di động** ở góc dưới bên trái thanh bên, rồi nhấp **Remove** bên cạnh iPhone đó. Khóa của iPhone đó ngừng hoạt động ngay; nó chỉ có thể kết nối lại bằng một lần ghép nối mới mà bạn phê duyệt trên máy Mac.
@@ -329,6 +342,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
329
342
 
330
343
  **Tôi có thể gửi ảnh từ iPhone không?** Có. Trong một cuộc trò chuyện Tether, chạm vào **+** bên cạnh ô tin nhắn → Camera, Photos (tối đa 4) hoặc Paste image. Ảnh được gửi tới cuộc trò chuyện trên Mac dưới dạng tệp đính kèm của tin nhắn, nên mô hình nhìn thấy chúng.
331
344
 
345
+ **dsh có thể chạy lệnh tiếp theo mà không hỏi lại mô hình không?** Có, với **Các bước đã lên kế hoạch** (mặc định tắt): hãy bật trong Cài đặt → Composer Plus. Khi đó mô hình có thể lên kế hoạch cho các lệnh tiếp theo kèm điều kiện, ví dụ “chạy kiểm thử khi bản dựng thành công”, và Composer Plus chạy một bước mà không gọi lại mô hình khi kết quả đáp ứng điều kiện. Phê duyệt và sandbox vẫn giữ nguyên.
346
+
332
347
  **Plugin có hoạt động với ứng dụng desktop không?** Có: Cài đặt → Plugin → **Thêm plugin** → `dsh-composer-plus`. Đã kiểm thử trên dsh 0.2.0-rc.2 (desktop và web) và 0.2.1-rc.2 (web).
333
348
 
334
349
  ## Phát triển
@@ -393,6 +408,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
412
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
413
  ```
397
414
 
398
415
  ```sh