dsh-composer-plus 1.9.1 → 1.11.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.id.md ADDED
@@ -0,0 +1,257 @@
1
+ # dsh-composer-plus — Composer Plus untuk DeepSeek Harness
2
+
3
+ [![npm](https://img.shields.io/npm/v/dsh-composer-plus)](https://www.npmjs.com/package/dsh-composer-plus)
4
+ [![test](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml/badge.svg)](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml)
5
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
+
7
+ [English](README.md) · [中文](README.zh.md) · [Türkçe](README.tr.md) · [Español](README.es.md) · [Português (Brasil)](README.pt-BR.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · **Bahasa Indonesia** · [Tiếng Việt](README.vi.md) · [हिन्दी](README.hi.md)
8
+
9
+ Ini adalah terjemahan. Versi acuannya adalah [README.md](README.md) berbahasa Inggris.
10
+
11
+ Fitur kenyamanan bergaya Codex untuk UI desktop dan web [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh): panel Perubahan, ide fitur dalam bentuk kartu geser, pencarian teks pesan di bilah samping, putar balik giliran beserta pemulihan file, penghapusan obrolan ke Tong Sampah, nama proyek di bawah kotak pesan, status proyek di bilah samping, riwayat input, pintasan mode rencana, Lanjutkan sekali klik, melanjutkan obrolan yang sedang berjalan setelah mulai ulang, seret dan lepas antrean, tautan sesi, ekspor obrolan sebagai Markdown, izin Tinjauan otomatis per obrolan, notifikasi latar belakang, akses dari iPhone dengan aplikasi Tether, dan pembaruan otomatis.
12
+
13
+ **Singkatnya:** satu plugin DeepSeek Harness (npm `dsh-composer-plus`, tampil sebagai **Composer Plus** di Pengaturan → Plugin) yang menambahkan panel Perubahan git, kartu ide fitur bergaya Tinder, pencarian bilah samping yang juga menemukan kata di dalam pesan, ↶ putar balik giliran (obrolan saja, atau obrolan dan file), Hapus obrolan, nama proyek di bawah kotak pesan, riwayat input ↑/↓, tombol alih `/plan` dengan Shift+Tab, ▶ Lanjutkan sekali klik, Lanjutkan setelah mulai ulang, pengurutan ulang antrean dengan seret dan lepas, Salin tautan sesi, Ekspor sebagai Markdown, “Izinkan untuk obrolan ini” untuk Tinjauan otomatis, notifikasi latar belakang, akses dari iPhone (Koneksi seluler, aplikasi Tether), 11 bahasa antarmuka tambahan, dan pembaruan otomatis.
14
+
15
+ <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness dengan Composer Plus: proyek yang sedang berjalan menampilkan spinner di bilah samping, dan panel Perubahan menampilkan diff git"></p>
16
+
17
+ Plugin komunitas tidak resmi. Satu-satunya panggilan jaringan adalah pemeriksaan pembaruan (rilis GitHub dan registri npm). Nonaktifkan **Pembaruan otomatis** untuk menghentikannya saat dsh dimulai. **Ide fitur** memanggil model obrolan Anda sendiri hanya saat Anda mengklik **Sarankan fitur**. **Prediksi pesan berikutnya** (aktif secara default) memanggil model yang dipilih di Pengaturan (model default dsh, kecuali Anda memilih yang lain) satu kali setelah setiap giliran selesai, tanpa klik. Nonaktifkan di **Pengaturan → Composer Plus** untuk menghentikan panggilan ini. **Lengkapi saat mengetik** (nonaktif secara default) memanggil model yang dipilih untuknya (secara default model prediksi) di setiap jeda saat Anda mengetik, setelah Anda mengaktifkannya. **Koneksi seluler** (nonaktif secara default) menerima koneksi iPhone dari jaringan lokal atau tailnet Anda hanya setelah Anda mengaktifkannya.
18
+
19
+ ## Instalasi
20
+
21
+ **Aplikasi desktop:** Pengaturan → Plugin → **Tambahkan plugin** → masukkan `dsh-composer-plus` → **Aktifkan sekarang**.
22
+ Anda juga dapat menempelkan `https://github.com/furkancak1r/dsh-composer-plus` sebagai pengganti nama npm.
23
+
24
+ **Profil web / CLI:**
25
+
26
+ ```sh
27
+ dsh plugin --profile web add dsh-composer-plus
28
+ ```
29
+
30
+ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil itu dikelola oleh aplikasi.)
31
+
32
+ > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.11.0`.
33
+
34
+ ## Fitur
35
+
36
+ | Fitur | Cara menggunakannya | Tangkapan layar |
37
+ |---|---|---|
38
+ | **Panel perubahan** | Bilah samping kanan → `+` → **Perubahan**. Pilih **Belum Di-commit**, **Belum Di-stage**, **Di-stage**, atau **Branch** untuk melihat file yang berubah beserta jumlah `+/-`; klik sebuah file untuk melihat diff-nya. **Giliran Terakhir** membuka tinjauan bawaan dsh untuk giliran terakhir. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Tangkapan layar: Panel perubahan"></a> |
39
+ | **Ide fitur** | Bilah samping kanan → `+` → **Ide fitur** → **Sarankan fitur**. Model obrolan itu sendiri membaca ringkasan singkat proyek obrolan (file tingkat atas, bagian awal README dan manifes, 15 commit terakhir) dan menyarankan hingga 8 fitur. Fitur ditampilkan sebagai tumpukan kartu dalam bahasa UI dsh. Geser kartu ke kanan (atau klik **✓**, atau tekan `→`; dengan cara mana pun, kartu terbang ke sisinya) untuk memulai obrolan baru di proyek yang sama. Obrolan itu dimulai dalam mode rencana dengan ide tersebut sebagai permintaan, jadi tidak ada yang berubah sebelum Anda menyetujui rencananya. Untuk melewati rencana, klik **▶ Buat sekarang** (atau tekan `↑`; kartu terbang ke atas): obrolan baru langsung dimulai dengan ide itu sebagai permintaan biasa, lalu model membuat perubahan dan menjalankan pemeriksaannya (persetujuan berlaku seperti biasa). Geser ke kiri (atau **✕**, atau `←`) untuk melewatinya; **Urungkan** (atau `Z`) mengembalikan kartu yang dilewati. Klik **↓** (atau tekan `↓`) untuk menyimpan ide bagus untuk nanti. Ide itu masuk ke daftar **Nanti** milik proyek, yang ditampilkan oleh setiap obrolan di folder proyek yang sama (juga setelah mulai ulang). **Nanti (N)** membuka daftar itu. **Rencanakan** memulai obrolan mode rencana yang sama untuk ide itu dan **Buat sekarang** memulai obrolan tanpa rencana; keduanya mengeluarkan ide itu dari daftar. **Rencanakan semua (N)** memulai satu obrolan mode rencana untuk semua ide di daftar, jadi bagian bersama cukup direncanakan sekali. **Hapus dari daftar** menghapusnya. **Salin sebagai daftar periksa** menyalin seluruh daftar ke papan klip sebagai daftar periksa Markdown (`- [ ] Title — Summary`, satu baris per ide) untuk pelacak isu atau file TODO; fitur ini tidak membuat panggilan jaringan. **Ide lainnya** menambahkan kartu. Untuk mendapatkan ide tentang satu area saja, ketik **Topik fokus** yang singkat di kolom di samping **Sarankan fitur** (paling banyak 80 karakter; `Enter` juga menyarankan), atau klik salah satu topik tetap di bawahnya: **Kinerja**, **Aksesibilitas**, **Pengujian**, **Keamanan**, **Kegunaan**, atau **Dokumentasi** (klik lagi untuk mengosongkannya). Model lalu hanya menyarankan fitur tentang topik itu; kolom kosong berarti fitur apa pun. Ide tidak disarankan dua kali dalam satu proyek: setiap ide yang disarankan (dilewati, disimpan, atau dimulai) masuk ke **Riwayat** proyek, model diminta untuk tidak menyarankannya lagi, dan judul yang berulang dibuang. **Riwayat** mencantumkannya dengan **Dimulai** atau **Disarankan**; **Lupakan** (atau **Lupakan semua**) membuat ide itu bisa muncul lagi; ide yang masih ada di daftar **Nanti** tidak masuk saran sampai Anda menghapusnya dari sana. Model hanya berjalan saat Anda mengklik. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Tangkapan layar: Ide fitur"></a> |
40
+ | **Pencarian isi** | Pencarian bawaan di bilah samping dsh (kaca pembesar di samping **Ruang kerja**; `Cmd+K` di aplikasi desktop, `Cmd+Alt+K` di browser) juga menemukan obrolan dari kata-kata dalam pesan Anda dan dalam balasannya, bukan hanya dari judul. Teks yang cocok ditampilkan di bawah obrolan. dsh sudah memiliki pencarian ini, tetapi mengirimkannya dalam keadaan nonaktif. Fitur ini mengaktifkannya dengan file indeks pencarian di komputer Anda. Indeks dibuat pada pencarian pertama setelah dsh dimulai (sekitar 15 detik untuk 250 obrolan, lihat Batasan) dan disimpan untuk saat dsh dimulai berikutnya. Aktif secara default; perubahan berlaku setelah Anda memulai ulang dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Tangkapan layar: Pencarian isi"></a> |
41
+ | **Putar balik giliran** | Arahkan penunjuk ke salah satu pesan Anda dan klik **↶** (di samping Salin). **Obrolan saja** mengeluarkan pesan itu dan semua yang ada sesudahnya (balasan, panggilan alat) dari obrolan dan dari konteks model, lalu menaruh pesan itu kembali di kotak pesan: ubah, lalu kirim lagi. **Obrolan dan file** lebih dulu menampilkan daftar file proyek yang berubah sejak pesan itu, lalu juga mengembalikan file tersebut seperti semula. Ini termasuk perubahan yang dibuat oleh perintah (`bash`), bukan hanya oleh alat edit dsh. Giliran yang sedang berjalan dihentikan lebih dulu. Log obrolan tidak pernah ditulis ulang: satu penanda tersembunyi menyembunyikan bagian yang ditarik, sama seperti `/compact` bawaan dsh menyembunyikan pesan lama. Jika [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) terpasang, plugin itulah yang melakukan tugas ini, dan Composer Plus tidak menampilkan tombol kedua. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Tangkapan layar: Putar balik giliran"></a> |
42
+ | **Hapus obrolan** | Bilah samping → menu **…** pada obrolan (atau klik kanan) → **Hapus…** → **Hapus**. dsh sendiri hanya dapat mengarsipkan. Obrolan berhenti (gilirannya, job, subagen, dan jadwalnya, seperti saat diarsipkan oleh dsh). Riwayat tersimpannya, beserta obrolan subagennya, dipindahkan ke Tong Sampah macOS (di sistem lain: `$DSH_HOME/trash`). Untuk mengembalikannya, kembalikan folder itu ke tempat semula dan mulai ulang dsh: obrolan muncul di tampilan **Hanya yang diarsipkan** pada bilah samping. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Tangkapan layar: Hapus obrolan"></a> |
43
+ | **Nama proyek di kotak pesan** | Baris di bawah kotak pesan (giliran, token, cache hit, konteks) dimulai dengan nama proyek obrolan, jadi Anda selalu tahu di proyek mana sebuah obrolan bekerja. Nama ini adalah judul proyek bawaan dsh, atau nama folder jika proyek tidak memiliki judul. Arahkan penunjuk ke nama itu untuk melihat jalur folder lengkap. Klik nama itu untuk menemukan obrolan di bilah samping, dalam tampilan daftar atau proyek: bilah samping dan proyek terbuka (termasuk proyek yang diciutkan dan **Tampilkan lainnya** di proyek itu), daftar bergulir ke obrolan itu, dan obrolan berkedip selama 5 detik. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Tangkapan layar: Nama proyek di kotak pesan"></a> |
44
+ | **Riwayat input** | Di kotak pesan yang kosong, tekan `↑` / `↓` untuk menelusuri pesan yang telah Anda kirim, seperti di terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Tangkapan layar: Riwayat input"></a> |
45
+ | **Mode rencana Shift+Tab** | `Shift+Tab` menambahkan `/plan ` di awal draf (tekan lagi untuk menghapusnya). Jika obrolan sudah dalam mode rencana, `Shift+Tab` keluar dari mode itu. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Tangkapan layar: Mode rencana Shift+Tab"></a> |
46
+ | **Pertahankan fokus composer** | Setelah Anda mengirim perintah `/` atau skill, kursor tetap berada di kotak pesan, dan Anda dapat langsung mengetik lagi. Ini juga berlaku untuk makro keyboard yang mengetik perintah lalu menekan `Enter`. dsh membuat kotak pesan menjadi hanya-baca saat memproses perintah, lalu browser melepas fokusnya. Fitur ini mengembalikan fokus, kecuali jika menu, dialog, atau kolom lain sedang memegangnya. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Tangkapan layar: Pertahankan fokus composer"></a> |
47
+ | **Lanjutkan Sekali Klik** | Setelah giliran dihentikan, gagal, atau terpotong, kotak pesan yang kosong menampilkan **▶**. Satu klik melanjutkan percakapan yang ada tanpa menulis di input atau menambahkan pesan obrolan yang terlihat. (Model menerima catatan tersembunyi singkat “lanjutkan dari tempat berhenti”, karena beberapa penyedia, seperti Claude, menolak permintaan yang berakhir dengan balasan asisten.) Pesan di antrean tetap di sana: ▶ hanya melanjutkan tugas yang dihentikan, lalu antrean berjalan. Giliran yang selesai tetap memakai tombol Kirim biasa. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Tangkapan layar: Lanjutkan Sekali Klik"></a> |
48
+ | **Lanjutkan setelah mulai ulang** | Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Jika Anda keluar dari dsh (atau dsh tertutup) saat sebuah obrolan sedang bekerja, obrolan itu berlanjut sendiri saat Anda membuka dsh lagi, dengan catatan tersembunyi yang sama seperti Lanjutkan Sekali Klik. Jika putaran tujuan (`/goal`) sedang berjalan, tujuan itu berlanjut ke putaran berikutnya (dsh menjeda tujuan setiap kali dimulai sampai Anda melanjutkannya). Obrolan yang Anda hentikan, yang selesai, atau yang gagal tidak berlanjut. dsh sendiri tidak memiliki pengaturan untuk ini: dsh hanya menandai giliran seperti itu sebagai terinterupsi. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Tangkapan layar: Lanjutkan setelah mulai ulang"></a> |
49
+ | **Seret dan lepas antrean** | Pesan dalam antrean mendapat pegangan (⠿). Seret untuk mengubah urutan, atau fokuskan pegangan lalu tekan `↑` / `↓`. `Esc` membatalkan. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Tangkapan layar: Seret dan lepas antrean"></a> |
50
+ | **Salin tautan sesi** | Klik kanan obrolan di bilah samping → **Salin tautan sesi**. Tempelkan tautan `dsh-session:…` ke obrolan lain untuk melampirkan obrolan itu sebagai konteks hanya-baca. dsh 0.2.1 memiliki **Salin ID sesi** sendiri, yang hanya menyalin ID polos; item ini muncul tepat sesudahnya. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Tangkapan layar: Salin tautan sesi"></a> |
51
+ | **Ekspor obrolan sebagai Markdown** | Klik kanan obrolan di bilah samping (atau buka menu **…** obrolan itu) → **Ekspor sebagai Markdown…**. Dialog menampilkan jumlah pesan dalam obrolan. **Salin ke papan klip** menyalin obrolan sebagai Markdown, dan **Simpan file .md** menyimpannya sebagai `<chat title>.md` melalui unduhan browser (dsh desktop: ke folder Unduhan atau lewat dialog simpan, sesuai pengaturan sistem Anda). File berisi judul obrolan, nama proyek, dan tanggal, lalu satu bagian `## Anda` atau `## Asisten` untuk setiap pesan. Blok kode tetap seperti aslinya; blok kode yang dibiarkan terbuka oleh suatu pesan akan ditutup. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Tangkapan layar: Ekspor obrolan sebagai Markdown"></a> |
52
+ | **Salin jalur proyek** | Klik kanan proyek di bilah samping → **Salin jalur** menyalin jalur lengkap foldernya. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Tangkapan layar: Salin jalur proyek"></a> |
53
+ | **Pencarian proyek di obrolan baru** | Obrolan baru → tombol proyek di atas kotak pesan. Proyek ditampilkan dalam urutan A–Z, dengan kotak **Cari proyek** di bagian atas. Ketik sebagian nama (tanpa membedakan huruf besar-kecil dan aksen), lalu tekan `Enter` untuk memilih hasil pertama. Jika tidak ada yang cocok, muncul **Tidak ada proyek yang cocok**. Urutan proyek tersimpan milik dsh di bilah samping tidak berubah. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Tangkapan layar: Pencarian proyek di obrolan baru"></a> |
54
+ | **Prediksi pesan berikutnya** | Aktif secara default: Anda dapat menonaktifkannya di **Pengaturan → Composer Plus**. Setelah agen menyelesaikan satu giliran (bukan giliran yang dihentikan atau gagal), kotak pesan yang kosong menampilkan tebakan pesan Anda berikutnya dengan teks abu-abu, beserta petunjuk **Tab untuk menerima**. `Tab` memasukkan teks ke kotak pesan, tetapi tidak mengirimnya. `Esc` menyembunyikannya untuk giliran itu. Mulai mengetik juga menyembunyikannya, dan giliran baru menggantinya. Menu **Model** di bawah sakelar menampilkan model milik dsh sendiri (daftar yang sama dengan menu model dsh). **Default dsh** dipilih secara default dan mengikuti model default dsh. Setiap giliran yang selesai memakai satu panggilan model singkat. Di Tether, tebakan tampil di atas kotak pesan yang kosong: ketuk untuk memasukkannya ke kolom. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Tangkapan layar: Prediksi pesan berikutnya"></a> |
55
+ | **Lengkapi saat mengetik** | Nonaktif secara default: Anda dapat mengaktifkannya di **Pengaturan → Composer Plus**. Saat Anda mengetik, teks abu-abu tepat setelah kursor menunjukkan kelanjutan pesan Anda. `Tab` menambahkannya ke pesan, tetapi tidak mengirimnya. `Esc` menyembunyikannya. Jika Anda mengetik huruf berikutnya dari teks abu-abu itu, teks tetap ada, tanpa panggilan model baru. Fitur ini memiliki menu **Model** sendiri di bawah sakelarnya. Entri pertamanya, **Sama dengan prediksi pesan berikutnya**, memakai model **Prediksi pesan berikutnya** (default); pilih model lain untuk memakai model yang berbeda bagi setiap fitur, misalnya model yang lebih cepat untuk pelengkapan. Fitur ini melakukan satu panggilan model di setiap jeda saat Anda mengetik, jadi memakai jauh lebih banyak token daripada prediksi: pilih model yang cepat dan murah. Fitur ini tidak berjalan untuk perintah garis miring, pesan dengan chip file, atau saat kursor tidak berada di akhir. Di Tether, sisa teks tampil di atas kolom saat Anda mengetik: ketuk untuk menambahkannya. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Tangkapan layar: Lengkapi saat mengetik"></a> |
56
+ | **Izinkan untuk obrolan ini** | Saat Tinjauan otomatis bertanya kepada Anda, kartu persetujuan mendapat tombol **Izinkan untuk obrolan ini**: mulai saat itu, alat yang sama di obrolan yang sama diizinkan, dengan argumen apa pun. Sebuah chip di header menampilkan daftar izin dan dapat mencabutnya. Izin tetap ada setelah mulai ulang. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Tangkapan layar: Izinkan untuk obrolan ini"></a> |
57
+ | **Status proyek** | Baris proyek di bilah samping menampilkan penanda spinner / menunggu / selesai yang sama seperti obrolannya. Jadi, proyek yang diciutkan tetap memberi tahu Anda bahwa ada obrolan di dalamnya yang sedang bekerja atau memerlukan Anda. Obrolan yang menunggu Anda ditampilkan lebih dulu, lalu obrolan selesai yang belum Anda buka (titik hijau, juga saat obrolan lain masih berjalan), lalu spinner. Arahkan penunjuk ke penanda itu untuk melihat detailnya. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Tangkapan layar: Status proyek"></a> |
58
+ | **Proyek aktif di atas** | Saat sebuah obrolan mulai berjalan atau memerlukan Anda, proyeknya pindah ke bagian atas bilah samping dengan animasi baris bawaan dsh (gerakan yang sama seperti saat Anda menyeretnya ke sana). Proyek yang selesai tetap di tempatnya; seret ke mana saja seperti biasa. Perpindahan disimpan ke urutan proyek dsh, jadi menonaktifkan fitur ini mempertahankan urutan saat ini. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Tangkapan layar: Proyek aktif di atas"></a> |
59
+ | **Filter proyek terbaru** | Bilah samping → opsi tampilan (ikon slider) → **Aktif dalam 2 jam terakhir**. Selama opsi ini dipilih, bilah samping hanya menampilkan proyek yang memiliki obrolan aktif dalam 2 jam terakhir. Itu adalah obrolan yang diperbarui dalam waktu itu, obrolan yang sedang berjalan atau menunggu, obrolan yang terbuka, atau obrolan selesai yang belum Anda buka (titik hijau “selesai” dari dsh), juga setelah 2 jam. Proyek tanpa obrolan seperti itu disembunyikan, termasuk proyek baru dan kosong. Pilih opsi ini lagi untuk menampilkan semua proyek. Pilihan ini disimpan di perangkat ini. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Tangkapan layar: Filter proyek terbaru"></a> |
60
+ | **Ciutkan semua proyek** | Saat ada proyek yang terbuka di bilah samping, sebuah tombol muncul di samping opsi tampilan (ikon slider). Klik tombol itu untuk menutup semua proyek yang terbuka sekaligus, misalnya 3 proyek terbuka dari 5. Tombol itu tersembunyi lagi saat tidak ada proyek yang terbuka. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Tangkapan layar: Ciutkan semua proyek"></a> |
61
+ | **Urutkan menurut status** | Bilah samping → opsi tampilan → **Urutkan menurut** → **Menurut status** (dengan **Dalam satu daftar**). Obrolan yang selesai muncul pertama (titik “selesai” dari dsh, yang juga didapat oleh giliran yang berakhir dengan kesalahan). Lalu muncul obrolan yang berjalan atau menunggu, lalu obrolan dengan otomatisasi aktif (Tugas otomatisasi), lalu sisanya dalam urutan dsh. Membuka obrolan yang selesai memindahkannya ke bawah. Hanya tampilan yang berubah: pilih **Manual** atau **Terakhir diperbarui** untuk kembali. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Tangkapan layar: Urutkan menurut status"></a> |
62
+ | **Notifikasi latar belakang** | Saat dsh berada di latar belakang, Anda mendapat notifikasi ketika sebuah giliran selesai (baris pertama balasan). Anda juga mendapat notifikasi ketika obrolan benar-benar menunggu Anda: persetujuan (nama alat), jawaban (pertanyaannya), atau tinjauan rencana. Permintaan harus masih terbuka 1,5 detik kemudian. Jadi, persetujuan yang dijawab otomatis (izin Tinjauan otomatis, plugin lain) tidak memunculkan notifikasi, dan notifikasi ditarik begitu permintaannya dijawab. Lencana di Dock/taskbar menghitung obrolan yang menunggu. Mengklik notifikasi membuka obrolan itu. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Tangkapan layar: Notifikasi latar belakang"></a> |
63
+ | **11 bahasa UI tambahan** | Pengaturan → Composer Plus → **Bahasa aplikasi** mengganti seluruh antarmuka dsh ke Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt, atau हिन्दी (lihat di bawah). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Tangkapan layar: 11 bahasa UI tambahan"></a> |
64
+ | **Koneksi seluler (iPhone)** | Gunakan dsh dari iPhone Anda dengan aplikasi [Tether](tether/), di Wi-Fi yang sama atau melalui [Tailscale](https://tailscale.com). Aktifkan di **Pengaturan → Composer Plus** (nonaktif secara default karena membuka port jaringan di Mac ini). Lalu klik **Koneksi seluler** di kiri bawah bilah samping: pindai kode QR dengan Kamera iPhone (ketuk **Open in Tether**) atau dengan **Scan code** di Tether, ketuk **Connect**, lalu klik **Approve**. Instal Tether terlebih dahulu: tanpa aplikasi itu, Kamera tidak dapat membuka kode tersebut. Ponsel menampilkan obrolan Anda, mengirim pesan, menjawab persetujuan dan pertanyaan, serta mengganti model dan agen. Pasangkan Mac sebanyak yang Anda mau: nama Mac di kiri atas aplikasi berpindah di antara Mac tersebut. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Tangkapan layar: Koneksi seluler"></a> |
65
+ | **Pembaruan otomatis** | Saat dsh dimulai, plugin memeriksa [rilis GitHub terbaru](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Jika rilis itu lebih baru dan sudah ada di npm, plugin memasang versi persis itu melalui pengelola plugin bawaan dsh (jalur yang sama dengan Pengaturan → Plugin) dan memberi tahu Anda. **Mulai ulang dsh** untuk memuatnya. **Pengaturan → Composer Plus → Pembaruan Composer Plus** menampilkan versi dan memiliki **Periksa pembaruan** / **Perbarui sekarang**. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Tangkapan layar: Pembaruan otomatis"></a> |
66
+
67
+ Tombol, tooltip, pemberitahuan, dan notifikasi mengikuti bahasa dsh yang dipilih (lihat Bahasa aplikasi di bawah).
68
+
69
+ ## Pengaturan
70
+
71
+ Setiap fitur dapat diaktifkan atau dinonaktifkan secara terpisah: dsh **Pengaturan → Composer Plus**. Setiap baris memiliki tangkapan layar kecil: arahkan penunjuk ke gambar itu untuk pratinjau yang lebih besar, atau klik untuk membukanya dalam ukuran penuh (`Esc` menutupnya). Kotak **Cari fitur** di bagian atas memfilter halaman menurut nama atau deskripsi (bahasa apa pun, tanpa membedakan huruf besar-kecil dan aksen); `Esc` mengosongkannya. Setiap baris memiliki sakelar dan deskripsi singkat. Perubahan langsung berlaku tanpa mulai ulang dan diingat di perangkat itu. Semua fitur aktif secara default, kecuali **Koneksi seluler**, **Lanjutkan setelah mulai ulang**, dan **Lengkapi saat mengetik**. Host dsh menyimpan sakelar ketiga fitur ini serta sakelar **Pencarian isi**, **Putar balik giliran**, dan **Prediksi pesan berikutnya**, jadi sakelar itu berlaku untuk setiap jendela dan tetap ada setelah mulai ulang. Host juga menyimpan pilihan **Model** untuk **Prediksi pesan berikutnya** dan untuk **Lengkapi saat mengetik** (bawaannya **Sama dengan prediksi pesan berikutnya**). **Pencarian isi** baru berubah setelah dsh dimulai ulang (dsh membacanya saat dimulai). Sampai saat itu, barisnya menampilkan **Mulai ulang dsh agar perubahan ini berlaku.**
72
+
73
+ <p align="center"><img src="docs/images/settings.webp" width="720" alt="Pengaturan → Composer Plus: pencarian fitur, pemilih bahasa, baris pembaruan, dan satu sakelar per fitur, dengan pratinjau tangkapan layar saat penunjuk diarahkan"></p>
74
+
75
+ ### Bahasa aplikasi
76
+
77
+ Buka **Pengaturan → Composer Plus → Bahasa aplikasi**, lalu pilih **Bahasa sistem** atau salah satu dari 13 bahasa:
78
+
79
+ English · 中文 · Türkçe · Español · Português (Brasil) · Français · Deutsch · Русский · 日本語 · 한국어 · Bahasa Indonesia · Tiếng Việt · हिन्दी
80
+
81
+ <p align="center"><img src="docs/images/language-tr.webp" width="720" alt="Antarmuka DeepSeek Harness yang dialihkan ke Türkçe"></p>
82
+
83
+ Seluruh aplikasi langsung berganti bahasa. Pilihan ini adalah `locale.preference` tersimpan milik dsh sendiri (sama dengan Umum → Bahasa), jadi pilihan tetap ada setelah mulai ulang. **Bahasa sistem** menghapus pilihan itu: aplikasi desktop mengikuti bahasa OS, UI web mengikuti bahasa browser, dan bahasa yang tidak didukung kembali ke bahasa Inggris. Memasang plugin tidak pernah menimpa bahasa yang sudah Anda pilih.
84
+
85
+ Setiap paket berisi 3.143 teks: setiap teks UI dsh `0.2.0-rc.2` dan `0.2.1-rc.2` (obrolan, bilah samping, pengaturan, persetujuan, jadwal, pratinjau file, pengelola plugin, pasar plugin), kontrol milik plugin ini, dan plugin populer [dsh-rewind](https://github.com/SiriLee/dsh-rewind). Yang tidak diterjemahkan: pesan Anda, output model, kode, nama perintah garis miring (`/plan`, `/compact`), label milik penyedia seperti tingkat penalaran `High`, teks plugin lain, serta menu bawaan dan dialog pembaruan aplikasi desktop (dsh hanya menyediakannya dalam bahasa Inggris/Mandarin). Teks yang ditambahkan oleh dsh versi lebih baru tampil dalam bahasa Inggris sampai paket diperbarui. Jika plugin lain sudah menyediakan suatu bahasa, plugin itu tetap memegang bahasa tersebut.
86
+
87
+ ## Pintasan keyboard
88
+
89
+ | Tombol | Tempat | Tindakan |
90
+ |---|---|---|
91
+ | `↑` / `↓` | kotak pesan kosong | pesan terkirim sebelumnya / berikutnya |
92
+ | `Shift+Tab` | kotak pesan | tambah/hapus `/plan `, atau keluar dari mode rencana |
93
+ | `↑` / `↓` | pegangan antrean yang difokuskan | pindahkan pesan dalam antrean |
94
+ | `Esc` | saat menyeret | batalkan perpindahan |
95
+ | `→` / `←` | halaman Ide fitur | buat / lewati kartu teratas |
96
+ | `↓` | halaman Ide fitur | simpan kartu teratas di daftar Nanti milik proyek |
97
+ | `↑` | halaman Ide fitur | buat kartu teratas sekarang, tanpa rencana |
98
+ | `Z` | halaman Ide fitur | kembalikan kartu terakhir yang dilewati |
99
+ | `Enter` | menu proyek obrolan baru, kotak pencarian | pilih hasil pertama |
100
+ | `↑` / `↓` | menu proyek obrolan baru | berpindah di antara proyek yang ditampilkan |
101
+ | `Esc` | menu proyek obrolan baru, kotak pencarian | kosongkan pencarian (tekan lagi untuk menutup menu) |
102
+ | `Tab` | kotak pesan kosong dengan prediksi | masukkan prediksi ke kotak pesan |
103
+ | `Tab` | pelengkapan abu-abu setelah kursor | tambahkan pelengkapan ke pesan |
104
+ | `Esc` | kotak pesan kosong dengan prediksi | sembunyikan prediksi |
105
+
106
+ Menu `/` atau `@` yang terbuka memakai tombol-tombol ini untuk dirinya sendiri.
107
+
108
+ ## Kompatibilitas
109
+
110
+ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjalankan pengujian pada setiap push.
111
+
112
+ ## Privasi dan keamanan
113
+
114
+ - **Lanjutkan:** endpoint lokal yang terautentikasi hanya melanjutkan giliran terakhir yang terinterupsi, menolak permintaan yang usang atau duplikat, dan mempertahankan hook persetujuan yang ada. Endpoint ini tidak mengirim pesan pengguna baru.
115
+ - **Lanjutkan setelah mulai ulang:** nonaktif sampai Anda mengaktifkannya. Bagian Host hanya menyimpan ID obrolan dan waktu mulai di `$DSH_HOME/storages/dsh-composer-plus/resume.json` (izin akses hanya untuk pemilik), dan tidak ada yang keluar dari mesin Anda. Fitur ini melanjutkan obrolan hanya jika log dsh sendiri menyatakan bahwa dsh (bukan Anda) yang menghentikan giliran terakhirnya. Persetujuan dan Tinjauan otomatis berlaku untuk giliran yang dilanjutkan seperti biasa.
116
+
117
+ - **Panel perubahan:** git berjalan dalam mode hanya-baca di mesin Anda, di folder obrolan itu sendiri, melalui kanal `/api` dsh yang terautentikasi. Git tidak pernah melakukan commit, stage, atau fetch, dan hanya menampilkan jalur yang didaftarkan oleh git sendiri.
118
+ - **Ide fitur:** tidak ada yang berjalan sampai Anda mengklik **Sarankan fitur**. Setelah itu, bagian Host hanya membaca folder obrolan itu sendiri (browser tidak pernah mengirim jalur): nama entri tingkat atas, 6 kB pertama dari README, AGENTS.md, dan manifes (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …), serta `git log --oneline -15`, total paling banyak 16 kB. Bagian Host melewati `.env*`, file kunci, dan folder seperti `node_modules`. Bagian Host juga hanya membaca file biasa yang tetap berada di dalam folder: symlink yang menunjuk ke luar folder, FIFO, atau perangkat akan dilewati. Ringkasan ini dikirim ke model yang dipakai obrolan, melalui pengaturan penyedia bawaan dsh, sebagai satu permintaan; ringkasan ini tidak ditambahkan ke obrolan mana pun. Tidak ada yang ditulis ke proyek. Ide yang digeser ke kanan memulai obrolan baru dalam mode rencana, jadi persetujuan dan tinjauan rencana berlaku seperti biasa. **Buat sekarang** memulai obrolan tanpa mode rencana: model dapat langsung mengubah file, dengan persetujuan obrolan yang biasa dan Tinjauan otomatis. Ide yang disimpan untuk nanti (judul, ringkasan, alasan, upaya) disimpan bersama jalur folder proyek di `storages/dsh-composer-plus/later.json` di dalam dsh home (file hanya untuk pemilik); tidak ada yang masuk ke proyek. Riwayat ide yang disarankan (judul, ringkasan, alasan, upaya, tanggal, sudah dimulai atau belum) disimpan dengan cara yang sama di `storages/dsh-composer-plus/idea-history.json`, paling banyak 200 per proyek (yang terlama keluar lebih dulu); judul-judulnya dikirim ke model bersama **Sarankan fitur** berikutnya di proyek itu.
119
+ - **Pencarian isi:** tidak ada kode baru yang mencari di obrolan Anda. Plugin hanya mengaktifkan indeks pesan bawaan dsh (SQLite FTS5, `dsh-session-query-sqlite`) dan memberinya sebuah file, `$DSH_HOME/cache/composer-plus/session-search.db` (file dan folder hanya untuk pemilik). File ini berisi teks pesan pengguna dan asisten Anda, jadi sama privatnya dengan log obrolan di `$DSH_HOME/sessions`. Tidak ada yang keluar dari mesin Anda. File ini adalah salinan yang dapat dibuat ulang oleh dsh: Anda dapat menghapusnya saat dsh ditutup. Sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
120
+ - **Putar balik giliran:** sebelum setiap pesan Anda, Host mengambil snapshot git dari folder obrolan ke penyimpanannya sendiri, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (folder hanya untuk pemilik). Penyimpanan ini berisi salinan file di folder itu yang terlihat oleh git (bukan file yang diabaikan), jadi sama privatnya dengan proyek. Fitur ini membaca objek repositori Anda (tanpa menyalin apa yang sudah dimiliki git) dan tidak pernah menulis index, `HEAD`, branch, tag, stash, atau config repositori Anda. Satu-satunya perubahan yang dibuat git di sana adalah stempel waktu yang lebih baru pada file objek yang dipakai ulang (ini menunda pembersihannya oleh `git gc`). Putar balik dengan file hanya menulis file biasa di dalam folder obrolan; symlink, pipe, dan apa pun di luar folder dilewati. Tidak ada yang keluar dari mesin Anda. Anda dapat menghapus penyimpanan ini saat dsh ditutup (putar balik lalu hanya berlaku untuk obrolan, sampai ada pesan baru). **Hapus obrolan** juga menghapus penyimpanan milik obrolan itu. Sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
121
+ - **Ekspor obrolan sebagai Markdown:** bagian Host hanya membaca log milik obrolan itu (pesan yang sama dengan yang ditampilkan dsh) dan memberikannya ke halaman; bagian ini tidak membaca file proyek dan tidak mengirim apa pun lewat jaringan. Markdown hanya masuk ke papan klip Anda atau ke file yang Anda simpan.
122
+ - **Hapus obrolan:** memindahkan folder log milik obrolan (`$DSH_HOME/sessions/<project>/<chat>`) ke Tong Sampah. Folder proyek tidak disentuh.
123
+ - **Izinkan untuk obrolan ini:** izin disimpan di `$DSH_HOME/storages/dsh-composer-plus/grants.json` (izin akses hanya untuk pemilik). Satu izin berlaku untuk **satu alat tertentu di satu obrolan**. Jika alat itu dapat menulis, izin itu juga mencakup penulisan apa pun. Cabut izin dari chip di header.
124
+ - Tinjauan otomatis tetap berjalan pada setiap panggilan; tinjauan yang gagal tidak pernah diizinkan secara otomatis.
125
+ - **Koneksi seluler:** nonaktif sampai Anda mengaktifkannya. Selama aktif, bagian Host menjalankan gateway Tether: HTTPS di port 19390 yang hanya menerima subnet Wi-Fi dan tailnet Anda (100.64.0.0/10), serta halaman pemasangan di `127.0.0.1:19391` (hanya Mac ini). Ponsel memerlukan kode sekali pakai dari kode QR (berlaku 5 menit) dan klik **Approve** dari Anda di Mac. Ponsel menyematkan (pin) sertifikat gateway. Mac hanya menyimpan hash token setiap ponsel (30 hari, diperpanjang selama dipakai); **Revoke** langsung menutup koneksi ponsel itu. Ponsel hanya dapat memanggil daftar metode dsh yang diizinkan (obrolan, prompt, lampiran, perintah garis miring, persetujuan, pertanyaan, model, agen, tujuan), bukan pengaturan, kredensial, browser file, atau terminal. Data: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Detail: [tether/README.md](tether/README.md).
126
+ - **Pembaruan:** bagian Host menanyakan rilis terbaru ke `api.github.com` dan versi persis itu ke `registry.npmjs.org`; tidak ada data tentang Anda atau obrolan Anda yang dikirim. Pemasangan memakai pengelola plugin dsh (`pnpm add dsh-composer-plus@<version>`; jika dsh 0.2.1 menolaknya untuk plugin yang sudah terpasang, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, lalu profil mencantumkan URL itu sebagai sumber plugin), jadi pemeriksaan registri, skrip, dan kompatibilitas versi milik dsh tetap berlaku. Tag pra-rilis dan versi lama tidak pernah dipasang.
127
+ - **Prediksi pesan berikutnya:** aktif secara default. Nonaktifkan di **Pengaturan → Composer Plus** untuk menghentikan panggilan model ini. Setelah setiap giliran selesai, bagian Host mengirim pesan Anda sendiri di obrolan itu dan balasan teks agen (tanpa keluaran alat, tanpa konteks tersembunyi, tanpa penalaran), paling banyak sekitar 6.000 karakter (bagian terbaru), ke model yang dipilih (model default dsh, kecuali Anda memilih yang lain). Pengiriman ini memakai pengaturan penyedia bawaan dsh, sebagai satu permintaan. Tidak ada yang disimpan di obrolan: tebakan tidak ditambahkan ke riwayat obrolan. Sakelar dan pilihan model disimpan di `$DSH_HOME/storages/dsh-composer-plus/predict.json` (file hanya untuk pemilik).
128
+ - **Lengkapi saat mengetik:** nonaktif sampai Anda mengaktifkannya. Selama aktif, di setiap jeda saat Anda mengetik, bagian Host mengirim teks yang sudah Anda ketik, serta pesan Anda sendiri di obrolan itu dan balasan teks agen (tanpa keluaran alat, tanpa konteks tersembunyi, tanpa penalaran), paling banyak sekitar 3.000 karakter dari obrolan, ke model yang dipilih di **Lengkapi saat mengetik** (secara default model **Prediksi pesan berikutnya**). Jeda yang lebih baru menghentikan permintaan yang lebih lama. Tidak ada yang disimpan di obrolan. Sakelar disimpan di `$DSH_HOME/storages/dsh-composer-plus/complete.json` (file hanya untuk pemilik).
129
+
130
+ ## Pemecahan masalah
131
+
132
+ - **Tidak ada notifikasi di macOS:** Pengaturan Sistem → Pemberitahuan → DeepSeek Harness → izinkan. Pilih **Peringatan** agar notifikasi tetap tampil di layar.
133
+ - **▶, pegangan antrean, status proyek, opsi proyek terbaru, Ciutkan semua proyek, Salin jalur, kotak pencarian proyek, prediksi pesan berikutnya, pelengkapan saat mengetik, Izinkan untuk obrolan ini, atau klik kanan hilang setelah dsh diperbarui:** elemen-elemen ini menempel ke HTML dsh saat ini karena dsh belum memiliki slot untuknya. Jika dsh mengubah markup itu, elemen-elemen ini menyembunyikan dirinya sendiri; tidak ada hal lain yang rusak. Silakan buka [issue](https://github.com/furkancak1r/dsh-composer-plus/issues).
134
+ - **"Pembaruan gagal" atau "tidak dipasang dari npm":** salinan yang ditautkan dari folder lokal atau yang diganti namanya tidak dapat memperbarui dirinya sendiri; pasang ulang `dsh-composer-plus` dari Pengaturan → Plugin. Selain itu, pesan menampilkan baris pertama error pnpm; **Periksa pembaruan** mencoba lagi.
135
+ - **Koneksi seluler menyatakan gateway tidak berjalan:** "no IPv4 address on en0" berarti Mac ini tidak memiliki alamat Wi-Fi/Ethernet; "EADDRINUSE" berarti dsh lain (atau aplikasi lain) memakai port 19390 atau 19391. Hanya satu dsh yang dapat menjalankan Koneksi seluler pada satu waktu.
136
+ - **Koneksi seluler, Lanjutkan setelah mulai ulang, atau Pencarian isi menampilkan "Mulai ulang dsh":** plugin diperbarui saat dsh sedang berjalan (atau, untuk Pencarian isi, Anda mengubah sakelarnya); status baru dimuat setelah mulai ulang.
137
+ - **Pencarian hanya menemukan judul:** Pencarian isi nonaktif, dsh belum dimulai ulang sejak Anda mengaktifkannya atau memasang plugin, atau kata itu hanya ada di output alat (lihat Batasan).
138
+ - **Tidak ada tombol ↶ di pesan saya:** Putar balik giliran nonaktif, obrolan itu adalah obrolan subagen, atau dsh-rewind-plugin terpasang (gunakan tombol ↶ miliknya). Setelah pembaruan, mulai ulang dsh.
139
+ - **Obrolan dan file berwarna abu-abu:** proyek bukan repositori git, tidak ada snapshot dari sebelum pesan itu (pesan lebih lama dari plugin, atau salah satu dari 50 snapshot terbaru telah menggantikannya), atau tidak ada file yang berubah.
140
+ - **Hapus menyatakan dsh lain sedang membuka obrolan ini:** dsh kedua pada dsh home yang sama memegang kunci obrolan. Tutup jendela atau dsh itu, lalu hapus lagi. Sementara itu, obrolan tetap diarsipkan.
141
+ - **Obrolan tidak berlanjut setelah mulai ulang:** Lanjutkan setelah mulai ulang nonaktif saat dsh ditutup, Anda sendiri yang menghentikan giliran itu, giliran sudah berakhir (selesai atau gagal), obrolan diarsipkan, atau lebih dari 20 obrolan sedang berjalan (20 yang terbaru berlanjut).
142
+ - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.11.0`), lihat catatan pemasangan di atas.
143
+
144
+ ## Batasan
145
+
146
+ - Lanjutkan tanpa pesan bergantung pada siklus hidup `agent/pre-step` → `agent/request` dsh. Periksa ulang kompatibilitas saat meningkatkan versi dsh.
147
+ - **Ide fitur** menyimpan kartu di memori untuk setiap obrolan sampai dsh atau halaman dimuat ulang; setelah itu **Sarankan fitur** bertanya lagi ke model. Kartu muncul dalam bahasa UI yang dipakai dsh saat Anda mengklik. Setelah Anda mengganti bahasa, kartu yang sudah ada di tumpukan tetap memakai bahasanya, dan **Ide lainnya** memakai bahasa yang baru. Model hanya melihat ringkasan proyek yang singkat, bukan kodenya, jadi sebuah ide bisa saja mengulang sesuatu yang sudah ada di proyek: lewati saja. Obrolan baru berjalan dalam mode rencana hanya jika profil memiliki perintah `/plan` dsh; jika tidak, ide dikirim sebagai pesan pertama biasa. Daftar **Nanti** terikat pada jalur folder obrolan: folder yang sama yang dibuka melalui symlink memiliki daftar sendiri. Daftar ini menyimpan paling banyak 50 ide per proyek (hapus satu untuk menambah lagi) dan menyimpan judul yang sama hanya sekali. Menyeret kartu hanya memutuskan kiri atau kanan; gunakan **↓** untuk menyimpannya dan **▶** untuk langsung membuatnya. Pengulangan hanya dikenali dari judulnya: model masih bisa menyarankan ide lama dengan nama baru; lewati saja. Jika model hanya menjawab dengan ide lama, tidak ada yang baru yang muncul: klik lagi. Topik fokus yang sempit membuat hal ini lebih mungkin terjadi; gunakan topik yang lebih luas atau kosongkan topiknya. Topik fokus tetap ada di kolom untuk setiap obrolan sampai dsh atau halaman dimuat ulang.
148
+ - **Ekspor obrolan sebagai Markdown** hanya berisi pesan Anda sendiri dan balasan teks asisten: panggilan alat beserta outputnya, proses berpikir, gambar (ditandai dengan baris `[image]`), konteks tersembunyi, dan pesan yang dikeluarkan oleh Putar balik giliran atau dsh-rewind-plugin tidak disertakan. Balasan dalam satu giliran digabung menjadi satu bagian. Satu ekspor berisi paling banyak sekitar 4 juta karakter; obrolan yang lebih panjang hanya diekspor bagian pertamanya, dengan sebuah catatan.
149
+ - **Lanjutkan setelah mulai ulang** melanjutkan giliran; fitur ini tidak memutar ulang giliran itu. Panggilan alat yang sedang berjalan saat dsh ditutup berakhir dengan hasil “outcome unknown” (hasil tidak diketahui) dari dsh. Model diberi tahu agar tidak mengulang pekerjaan yang sudah selesai, tetapi perintah yang tidak aman dijalankan dua kali tetap bisa berjalan lagi. Subagen, persetujuan, dan pertanyaan yang masih terbuka tidak dipulihkan: obrolan induknya berlanjut dan bertanya lagi. Paling banyak 20 obrolan berlanjut setiap kali dsh dimulai.
150
+
151
+ - **Pencarian isi** adalah pencarian bawaan dsh, jadi batasannya sama dengan batasan dsh. Pencarian ini hanya mencakup pesan pengguna dan asisten: bukan output alat (perintah, isi file, hasil), bukan penalaran, dan tidak ada filter untuk pesan pengguna, asisten, atau alat. Pencarian mencocokkan kata utuh, bukan bagian kata (`deploy` tidak menemukan `deployment`); huruf beraksen cocok dengan huruf tanpa aksen (`seker` menemukan `şeker`). Satu baris per obrolan, dengan cuplikan 240 karakter dari dsh, paling banyak 20 baris.
152
+ - Biaya **Pencarian isi**, diukur pada salinan 247 log obrolan nyata (159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB): pencarian pertama setelah dsh dimulai membangun indeks dalam sekitar 15 detik. Selama waktu itu, Host dsh tidak menjawab apa pun selama sekitar 7 detik, jadi obrolan lain berhenti melakukan streaming sesaat (halamannya sendiri tidak membeku). Memori Host bertambah sekitar 1,1 GB pada puncaknya; satu menit kemudian, memori masih sekitar 0,5–0,6 GB di atas awal, sampai dsh ditutup. File indeks berukuran sekitar 165 MB. Pencarian berikutnya memakan waktu sekitar 0,5 detik. Setelah mulai ulang, pencarian pertama memakan waktu sekitar 1 detik (hanya obrolan baru atau yang berubah yang ditambahkan) dan menambah sekitar 70 MB. Nonaktifkan fitur ini jika memori komputer Anda kecil.
153
+ - **Pencarian isi** baru berlaku setelah dsh dimulai ulang, dan file indeks dipakai bersama oleh setiap dsh yang memakai dsh home yang sama: jalankan hanya satu dsh seperti itu pada satu waktu (dsh hanya mengizinkan satu pemilik per file indeks).
154
+ - **Putar balik giliran** mengembalikan file hanya di repositori git, dan hanya di folder obrolan. Fitur ini menyimpan 50 snapshot terbaru per obrolan. File yang diabaikan (`.gitignore`, `info/exclude`, file ignore global Anda), folder kosong, symlink, dan submodule tidak dikembalikan. File yang diabaikan saat snapshot diambil tidak pernah dihapus, bahkan jika giliran itu mengubah aturan ignore. File yang tidak dapat dibaca git tidak dimasukkan ke snapshot. Setiap pesan Anda menjalankan satu `git add --all` dari folder obrolan ke penyimpanan pribadi. Di folder yang sangat besar dengan banyak file yang tidak dilacak, ini bisa memakan waktu beberapa detik, dan panggilan alat berikutnya menunggunya (paling lama 10 detik; setelah itu snapshot selesai di latar belakang). Jika `git gc` repositori Anda menghapus objek yang diperlukan snapshot lama, file itu dicantumkan sebagai tidak dikembalikan. Hanya teks pesan yang kembali ke kotak pesan: tambahkan lagi gambar atau filenya. Obrolan subagen tidak memiliki ↶ (perubahan file oleh subagen dihitung sebagai perubahan obrolan yang memulainya). Obrolan yang diekspor (`/export`) masih berisi pesan yang ditarik. Ide satu penanda tersembunyi yang menarik sebagian obrolan berasal dari [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind) karya SiriLee (MIT); Composer Plus tidak memakai kode darinya.
155
+ - **Hapus obrolan** memerlukan fitur arsip dsh (dsh 0.2.0 dan yang lebih baru). Obrolan (atau salah satu obrolan subagennya) yang tidak berhenti dalam 15 detik, atau yang dipegang oleh dsh lain, tetap diarsipkan dan tidak ada yang dipindahkan. Di sistem selain macOS, folder sampah harus berada di disk yang sama dengan riwayat obrolan. Obrolan terbuka yang Anda hapus tetap ada di memori dsh, dalam keadaan diarsipkan dan tersembunyi, sampai dsh dimulai ulang. Kosongkan Tong Sampah sendiri; dsh tidak melakukannya.
156
+ - Antrean dsh tidak memiliki tindakan `move`, jadi bagian Host plugin memindahkan pesan antrean itu sendiri di dalam antrean dsh (satu perubahan, pesan yang sama). Pesan dengan gambar atau file juga dapat dipindahkan. Hanya pesan Anda sendiri yang dapat dipindahkan: putaran tujuan atau balasan pertanyaan di antrean tetap di tempatnya. Jika sebuah pesan mulai dikirim saat Anda menyeret, tidak ada yang dipindahkan dan muncul pemberitahuan tentang hal itu.
157
+ - dsh 0.2.1 langsung memuat pembaruan jika versi baru tidak mengubah pengaturan dsh apa pun; dalam kasus lain, dan pada dsh 0.2.0, mulai ulang dsh untuk memuatnya. Plugin tidak pernah memulai ulang dsh untuk Anda. Profil web/CLI tanpa pengelola plugin dsh hanya melaporkan adanya versi baru.
158
+ - **Pertahankan fokus composer** mengembalikan fokus hanya setelah perintah `/` atau skill. Saat dsh memproses perintah, kotak pesan tetap hanya-baca selama beberapa milidetik, jadi tombol yang ditekan dalam waktu itu hilang. Jika menu `/` dsh masih terbuka, `Enter` memilih baris yang disorot dan tidak mengirim.
159
+ - **Koneksi seluler** hanya berfungsi di macOS (memakai `en0`, `openssl`, `swift`, dan `dns-sd`). Fitur ini memakai port tetap 19390 dan 19391, jadi hanya satu dsh di setiap Mac yang dapat menjalankannya pada satu waktu (setiap Mac adalah satu entri dalam daftar Mac di ponsel). Ponsel hanya mendapat notifikasi saat Tether terbuka atau baru saja masuk ke latar belakang (tidak ada layanan push). Aplikasi iOS belum ada di App Store: bangun aplikasi itu dari `tether/ios` dengan Xcode.
160
+ - Tautan sesi berfungsi di dalam obrolan; mengkliknya tidak membuka obrolan.
161
+ - Notifikasi yang dikirim sebelum mulai ulang hanya membawa dsh ke depan saat diklik.
162
+ - Proyek aktif dipindahkan dengan urutan proyek tersimpan milik dsh, jadi urutan baru tetap ada setelah mulai ulang. Obrolan di luar proyek mana pun ("Tanpa grup") tidak dapat dipindahkan; dsh selalu menampilkannya paling akhir.
163
+ - dsh tidak memiliki titik ekstensi di menu opsi tampilan bilah samping, jadi opsi proyek terbaru ditambahkan ke menu bawaan dsh. Jika pembaruan dsh mengubah menu itu, opsi ini tidak ditampilkan dan semua proyek tetap terlihat. Filter bekerja pada baris proyek, jadi **Dalam satu daftar** tidak difilter. Gunakan filter ini bersama **Ruang Kerja**: dalam **Pohon Ruang Kerja**, folder induk yang tersembunyi juga menyembunyikan proyek aktif di dalamnya. **Menurut status** memiliki batasan serupa: dsh tidak memiliki slot urutan, jadi item dan urutan baris menempel ke markup menu dan daftar dsh.
164
+ - dsh juga tidak memiliki menu baris proyek atau slot header Ruang kerja. **Salin jalur** menemukan baris proyek melalui markup baris dsh, dan **Ciutkan semua proyek** masuk ke header dsh lalu menutup setiap proyek yang terbuka dengan klik yang sama seperti pada baris proyek. Jika pembaruan dsh mengubah markup itu, klik kanan menampilkan menu browser dan tombolnya tidak ditampilkan.
165
+ - dsh juga tidak memiliki titik ekstensi di menu proyek obrolan baru, jadi kotak **Cari proyek** dan urutan A–Z menempel ke markup menu dsh. Jika pembaruan dsh mengubah markup itu, menu tampil seperti yang digambar dsh: dalam urutan tersimpan, tanpa kotak pencarian. Urutan A–Z hanya tampilan: urutan ini tidak mengubah urutan proyek tersimpan milik dsh.
166
+ - dsh juga tidak memiliki titik ekstensi untuk petunjuk di kotak pesan, jadi teks **Prediksi pesan berikutnya** ditampilkan di atas teks placeholder milik dsh (`[data-composer-placeholder]`). Jika pembaruan dsh mengubah markup itu, prediksi tidak ditampilkan. Selama fitur ini aktif, setiap giliran yang selesai memakai satu panggilan model singkat.
167
+ - **Lengkapi saat mengetik** menampilkan teksnya melalui petunjuk kotak pesan milik dsh sendiri (gaya `--dsh-composer-hint` yang dipakai dsh untuk petunjuk argumen perintah garis miring). Fitur ini tidak berjalan untuk perintah garis miring, pesan dengan chip file atau simbol, atau saat kursor tidak berada di akhir pesan. Jika pembaruan dsh mengubah gaya itu, pelengkapan tidak ditampilkan. Setiap jeda saat Anda mengetik memakai satu panggilan model.
168
+ - Dukungan bawaan sudah diminta ke upstream: `move` antrean di [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), status Lanjutkan di [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
169
+
170
+ ## Pertanyaan umum
171
+
172
+ **Bagaimana cara menambahkan panel Perubahan / diff git ke DeepSeek Harness?** Pasang `dsh-composer-plus`, lalu bilah samping kanan → `+` → **Perubahan**.
173
+
174
+ **Bisakah dsh menyarankan fitur untuk proyek saya, seperti menggeser kartu Tinder?** Bisa: bilah samping kanan → `+` → **Ide fitur** → **Sarankan fitur**. Geser ke kanan untuk memulai obrolan baru yang merencanakan fitur itu, klik **▶ Buat sekarang** untuk memulai obrolan yang langsung membuatnya tanpa rencana, geser ke kiri untuk melewatinya.
175
+
176
+ **Bisakah pencarian bilah samping dsh menemukan obrolan dari kata di dalam pesannya, bukan hanya dari judulnya?** Bisa, dengan **Pencarian isi** (aktif secara default): mulai ulang dsh sekali setelah Anda memasang plugin, lalu gunakan kaca pembesar di samping **Ruang kerja**. Obrolan yang cocok menampilkan teks di sekitar kata itu.
177
+
178
+ **Bisakah saya membatalkan sebuah giliran dan mengedit prompt saya, seperti di OpenCode atau Claude Code?** Bisa, dengan **Putar balik giliran**: klik **↶** pada pesan, pilih **Obrolan dan file**, edit teks yang kembali ke kotak pesan, lalu kirim.
179
+
180
+ **Bisakah saya menghapus obrolan alih-alih mengarsipkannya?** Bisa, dengan **Hapus obrolan**: **…** → **Hapus…**. Riwayatnya masuk ke Tong Sampah, jadi kesalahan masih dapat dibatalkan.
181
+
182
+ **Bagaimana cara melihat sebuah obrolan termasuk ke proyek mana?** Lihat baris di bawah kotak pesan: dengan **Nama proyek di kotak pesan** (aktif secara default), baris itu dimulai dengan nama proyek. Arahkan penunjuk ke nama itu untuk melihat jalur folder.
183
+
184
+ **Bagaimana cara mendapatkan riwayat pesan ↑/↓ di kotak pesan dsh?** Pasang plugin ini; di kotak pesan yang kosong, `↑` / `↓` menelusuri pesan yang telah Anda kirim.
185
+
186
+ **Bagaimana cara melanjutkan giliran dsh yang dihentikan atau gagal tanpa mengetik "continue"?** Dengan plugin ini, tombol Kirim berubah menjadi **▶** setelah giliran dihentikan, gagal, atau terpotong; satu klik melanjutkannya.
187
+
188
+ **Apakah dsh melanjutkan obrolan yang sedang berjalan setelah saya keluar lalu membukanya lagi?** Tidak dengan sendirinya: dsh menandai giliran seperti itu sebagai terinterupsi dan menunggu (tujuan juga menunggu `/goal resume`). Aktifkan **Pengaturan → Composer Plus → Lanjutkan setelah mulai ulang**: obrolan yang sedang bekerja saat dsh ditutup akan berlanjut sendiri saat dsh dimulai berikutnya.
189
+
190
+ **Model mana yang menulis prediksi?** Model yang Anda pilih di **Pengaturan → Composer Plus → Prediksi pesan berikutnya → Model**. Daftarnya adalah daftar model milik dsh sendiri. **Default dsh** mengikuti model default dsh. Jika dsh tidak lagi menampilkan model yang dipilih, prediksi memakai model default. **Lengkapi saat mengetik** memiliki menu **Model** sendiri: **Sama dengan prediksi pesan berikutnya** (default) mengikuti model prediksi; pilihan lain hanya dipakai untuk pelengkapan. Jika dsh tidak lagi menampilkan model itu, pelengkapan memakai model prediksi.
191
+
192
+ **Bagaimana cara mengubah urutan pesan dalam antrean di dsh?** Seret pegangan ⠿ pada pesan dalam antrean, atau fokuskan pegangan itu lalu tekan `↑` / `↓`.
193
+
194
+ **Bagaimana cara menghentikan Tinjauan otomatis agar tidak terus bertanya tentang alat yang sama dalam satu obrolan?** Klik **Izinkan untuk obrolan ini** pada kartu persetujuan. Izin ini hanya mencakup alat itu di obrolan itu; cabut izin dari chip di header.
195
+
196
+ **Bagaimana cara hanya menampilkan proyek yang saya pakai hari ini di bilah samping dsh?** Bilah samping → opsi tampilan (ikon slider) → **Aktif dalam 2 jam terakhir**. Pilih lagi untuk menampilkan semua proyek.
197
+
198
+ **Bagaimana cara menyalin jalur folder proyek di dsh?** Klik kanan proyek di bilah samping → **Salin jalur**.
199
+
200
+ **Bagaimana cara menciutkan semua proyek di bilah samping dsh sekaligus?** Klik tombol ciutkan di samping opsi tampilan (ikon slider). Tombol ini muncul selama ada setidaknya satu proyek yang terbuka.
201
+
202
+ **Bagaimana cara mendapatkan notifikasi macOS / Windows saat tugas dsh selesai atau memerlukan persetujuan?** Biarkan **Notifikasi latar belakang** aktif (default) dan izinkan notifikasi untuk DeepSeek Harness di pengaturan OS.
203
+
204
+ **Bagaimana cara mengganti antarmuka DeepSeek Harness ke bahasa Turki, Spanyol, Jepang…?** Pengaturan → Composer Plus → **Bahasa aplikasi**.
205
+
206
+ **Bagaimana cara memakai dsh dari iPhone saya?** Bangun aplikasi Tether dari `tether/ios` (Xcode), aktifkan **Pengaturan → Composer Plus → Koneksi seluler (iPhone)**, klik **Koneksi seluler** di kiri bawah, pindai kode QR (Kamera iPhone atau **Scan code** di Tether), ketuk **Connect**, lalu klik **Approve**. Saat jauh dari rumah, gunakan Tailscale di kedua perangkat.
207
+
208
+ **Apakah plugin ini berfungsi di aplikasi desktop?** Ya: Pengaturan → Plugin → **Tambahkan plugin** → `dsh-composer-plus`. Diuji pada dsh 0.2.0-rc.2 (desktop dan web) dan 0.2.1-rc.2 (web).
209
+
210
+ ## Pengembangan
211
+
212
+ Tangkapan layar dibuat ulang dari dsh sekali pakai dengan model palsu dan proyek demo rekaan (`acme-web`, `weather-cli`, `docs-site`), jadi tidak berisi data nyata. Gambar mini fitur disimpan di `assets/features/` (ikut dikirim, ditampilkan di Pengaturan); gambar khusus README disimpan di `docs/images/` (tidak ada di paket npm):
213
+
214
+ ```sh
215
+ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh/lib/bin.js
216
+ # sidebar project features (recent filter, Copy path, Collapse all): real-app test + their thumbnails
217
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
218
+ # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
219
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
220
+ # Order by status (fake model + Schedule): real-app test + its thumbnail
221
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
222
+ # every Settings feature row shows a loading screenshot
223
+ PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
224
+ # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
225
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
226
+ # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
227
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
228
+ # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
229
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
230
+ # Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
231
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
232
+ # Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
233
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-export-markdown.mjs /path/to/dsh/lib/bin.js
234
+ # Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
235
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
236
+ # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
237
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
238
+ ```
239
+
240
+ ```sh
241
+ npm run build:locales # after editing locales/<id>.json
242
+ npm test
243
+ ```
244
+
245
+ **Aturan untuk fitur baru:** setiap baris fitur di Pengaturan → Composer Plus menampilkan tangkapan layar. Tambahkan id fitur ke `SHOT_OF` di `client.js` dan ke `SHOTS` di `index.js`, lalu sertakan `assets/features/<id>.webp` (diambil dari dsh demo sekali pakai, UI bahasa Inggris, sekitar 60 kB atau kurang). Tambahkan fitur itu ke tabel README dengan gambar yang sama, di `README.md` dan di setiap `README.<id>.md` terjemahan. `test/shots.test.mjs` gagal jika sebuah fitur tidak memiliki tangkapan layar, dan `test/browser-settings-shots.mjs` memeriksa halaman Pengaturan yang asli. Daftar periksa lengkap untuk setiap perubahan ada di [AGENTS.md](AGENTS.md).
246
+
247
+ Pengujian menjalankan `client.js` yang asli terhadap React/DOM palsu, dan `index.js` (bagian Host) yang asli terhadap repositori git sementara. Pengujian gateway Tether (`test/tether-gateway.test.mjs`) memakai host dsh tiruan dan gateway TLS sungguhan. Aplikasi iPhone ada di `tether/ios` (lihat [tether/README.md](tether/README.md) dan [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` memeriksa riwayat input di browser sungguhan terhadap `dsh web` sekali pakai dengan `DSH_HOME` miliknya sendiri.
248
+
249
+ Paket bahasa adalah JSON yang hanya berisi data di `locales/<id>.json`, yang disematkan ke dalam satu entri klien oleh `npm run build:locales` (tanpa layanan terjemahan atau unduhan saat runtime). `npm test` memeriksa setiap paket untuk cakupan kunci yang lengkap, placeholder dan jeda baris yang identik, serta perilaku sistem/override. Untuk pemeriksaan terisolasi di aplikasi sungguhan dengan Playwright yang terpasang secara lokal:
250
+
251
+ ```sh
252
+ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/bin.js
253
+ ```
254
+
255
+ ## License
256
+
257
+ MIT