dsh-composer-plus 1.9.0 → 1.10.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.hi.md ADDED
@@ -0,0 +1,236 @@
1
+ # dsh-composer-plus — DeepSeek Harness के लिए Composer Plus
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](README.id.md) · [Tiếng Việt](README.vi.md) · **हिन्दी**
8
+
9
+ यह एक अनुवाद है। संदर्भ संस्करण अंग्रेज़ी [README.md](README.md) है।
10
+
11
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh) के डेस्कटॉप ऐप और वेब UI के लिए Codex जैसी सुविधाएं, जो रोज़ का काम आसान बनाती हैं: बदलाव पैनल, स्वाइप कार्ड वाले सुविधाओं के आइडिया, साइडबार खोज जो संदेशों का टेक्स्ट भी खोजती है, फ़ाइलें वापस लाने वाला टर्न रोलबैक, चैट को ट्रैश में भेजकर हटाना, कंपोज़र के नीचे प्रोजेक्ट का नाम, साइडबार में प्रोजेक्ट की स्थिति, इनपुट इतिहास, प्लान मोड का शॉर्टकट, एक क्लिक में जारी रखना, रीस्टार्ट के बाद चल रही चैट को जारी रखना, कतार में खींचकर छोड़ना, सेशन डीपलिंक, हर चैट के लिए अलग ऑटो रिव्यू अनुमतियां, बैकग्राउंड सूचनाएं, Tether ऐप से iPhone पर पहुंच और अपने-आप अपडेट।
12
+
13
+ **एक लाइन में:** यह DeepSeek Harness का एक ही प्लगइन है (npm `dsh-composer-plus`, सेटिंग → प्लगइन में **Composer Plus** नाम से दिखता है)। यह जोड़ता है: git बदलाव पैनल, Tinder जैसे सुविधाओं के आइडिया वाले कार्ड, साइडबार खोज जो संदेशों के शब्द भी ढूंढती है, ↶ टर्न रोलबैक (सिर्फ़ चैट, या चैट और फ़ाइलें), चैट हटाएं, कंपोज़र के नीचे प्रोजेक्ट का नाम, ↑/↓ इनपुट इतिहास, Shift+Tab से `/plan` चालू/बंद, एक क्लिक में ▶ जारी रखें, रीस्टार्ट के बाद जारी रखें, खींचकर छोड़ने से कतार का क्रम बदलना, सेशन लिंक कॉपी करें, ऑटो रिव्यू में “इस चैट के लिए अनुमति दें”, बैकग्राउंड सूचनाएं, iPhone से पहुंच (मोबाइल कनेक्ट, Tether ऐप), इंटरफ़ेस की 11 अतिरिक्त भाषाएं और अपने-आप अपडेट।
14
+
15
+ <p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus के साथ DeepSeek Harness: चल रहे प्रोजेक्ट के लिए साइडबार में स्पिनर दिखता है और बदलाव पैनल git डिफ़ दिखाता है"></p>
16
+
17
+ यह एक अनौपचारिक कम्युनिटी प्लगइन है। यह सिर्फ़ अपडेट जांचने के लिए नेटवर्क कॉल करता है (GitHub रिलीज़ और npm रजिस्ट्री)। शुरू होते समय ये कॉल रोकने के लिए **अपने-आप अपडेट** बंद करें। **सुविधाओं के आइडिया** आपकी चैट के अपने मॉडल को सिर्फ़ तब कॉल करता है, जब आप **सुविधाएं सुझाएं** पर क्लिक करते हैं। **मोबाइल कनेक्ट** (डिफ़ॉल्ट रूप से बंद) आपके लोकल नेटवर्क या tailnet से iPhone के कनेक्शन सिर्फ़ तब स्वीकार करता है, जब आप इसे चालू करते हैं।
18
+
19
+ ## इंस्टॉल करें
20
+
21
+ **डेस्कटॉप ऐप:** सेटिंग → प्लगइन → **प्लगइन जोड़ें** → `dsh-composer-plus` डालें → **अभी चालू करें**।
22
+ npm नाम की जगह आप `https://github.com/furkancak1r/dsh-composer-plus` भी पेस्ट कर सकते हैं।
23
+
24
+ **वेब / CLI प्रोफ़ाइल:**
25
+
26
+ ```sh
27
+ dsh plugin --profile web add dsh-composer-plus
28
+ ```
29
+
30
+ फिर dsh रीस्टार्ट करें। (CLI डेस्कटॉप प्रोफ़ाइल में इंस्टॉल नहीं कर सकता; उस प्रोफ़ाइल को ऐप खुद संभालता है।)
31
+
32
+ > dsh का pnpm 24 घंटे से नए वर्शन छोड़ देता है। रिलीज़ के तुरंत बाद वर्शन भी लिखें: `dsh-composer-plus@1.10.0`।
33
+
34
+ ## सुविधाएं
35
+
36
+ | सुविधा | उपयोग कैसे करें | स्क्रीनशॉट |
37
+ |---|---|---|
38
+ | **बदलाव पैनल** | दायां साइडबार → `+` → **बदलाव**। बदली हुई फ़ाइलें `+/-` गिनती के साथ देखने के लिए **कमिट नहीं किए गए**, **स्टेज नहीं किए गए**, **स्टेज किए गए** या **ब्रांच** चुनें। किसी फ़ाइल का डिफ़ देखने के लिए उस पर क्लिक करें। **पिछला टर्न** सबसे नए टर्न का dsh का अपना रिव्यू खोलता है। | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="स्क्रीनशॉट: बदलाव पैनल"></a> |
39
+ | **सुविधाओं के आइडिया** | दायां साइडबार → `+` → **सुविधाओं के आइडिया** → **सुविधाएं सुझाएं**। चैट का अपना मॉडल चैट के प्रोजेक्ट का छोटा सारांश पढ़ता है (टॉप-लेवल फ़ाइलें, README और मैनिफ़ेस्ट की शुरुआत, पिछले 15 कमिट)। फिर वह ज़्यादा से ज़्यादा 8 सुविधाएं सुझाता है। सुझाव कार्ड के ढेर के रूप में dsh की UI भाषा में दिखते हैं। उसी प्रोजेक्ट में नई चैट शुरू करने के लिए कार्ड को दाएं स्वाइप करें (या **✓** पर क्लिक करें, या `→` दबाएं; हर बार कार्ड अपनी तरफ़ उड़ जाता है)। नई चैट प्लान मोड में शुरू होती है और आइडिया उसका अनुरोध होता है। इसलिए जब तक आप प्लान मंज़ूर नहीं करते, कुछ नहीं बदलता। प्लान छोड़ने के लिए **▶ अभी बनाएं** पर क्लिक करें (या `↑` दबाएं; कार्ड ऊपर उड़ जाता है): नई चैट तुरंत शुरू होती है और आइडिया उसका सामान्य अनुरोध होता है। मॉडल बदलाव करता है और अपनी जांचें चलाता है (मंज़ूरियां हमेशा की तरह लागू होती हैं)। छोड़ने के लिए बाएं स्वाइप करें (या **✕**, या `←`)। **पहले जैसा करें** (या `Z`) छोड़ा गया कार्ड वापस लाता है। किसी अच्छे आइडिया को बाद के लिए रखने के लिए **↓** पर क्लिक करें (या `↓` दबाएं)। वह प्रोजेक्ट की **बाद में** सूची में चला जाता है। उसी प्रोजेक्ट फ़ोल्डर की हर चैट यह सूची दिखाती है (रीस्टार्ट के बाद भी)। **बाद में (N)** सूची खोलता है। **योजना बनाएं** उस आइडिया के लिए वैसी ही प्लान मोड वाली चैट शुरू करता है और **अभी बनाएं** बिना प्लान वाली चैट; दोनों आइडिया को सूची से हटा देते हैं। **सबकी एक योजना बनाएं (N)** सूची के सभी आइडिया के लिए एक ही प्लान मोड वाली चैट शुरू करता है, इसलिए साझा हिस्सों की योजना एक ही बार बनती है। **सूची से हटाएं** आइडिया को मिटा देता है। **और आइडिया** नए कार्ड जोड़ता है। एक प्रोजेक्ट में कोई आइडिया दो बार नहीं सुझाया जाता: हर सुझाया गया आइडिया (छोड़ा गया, रखा गया या शुरू किया गया) प्रोजेक्ट के **इतिहास** में जाता है, मॉडल से कहा जाता है कि वह इन्हें फिर न सुझाए, और दोहराए गए शीर्षक वाला आइडिया हटा दिया जाता है। **इतिहास** इन्हें **शुरू किया गया** या **सुझाया गया** के साथ दिखाता है; **भूल जाएं** (या **सब भूल जाएं**) से कोई आइडिया फिर आ सकता है; जो आइडिया अभी भी **बाद में** सूची में है, वह तब तक सुझावों में नहीं आता जब तक आप उसे वहां से हटा नहीं देते। मॉडल सिर्फ़ आपके क्लिक करने पर चलता है। | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="स्क्रीनशॉट: सुविधाओं के आइडिया"></a> |
40
+ | **कंटेंट में खोज** | dsh के साइडबार की अपनी खोज (**वर्कस्पेस** के पास का आवर्धक लेंस; डेस्कटॉप ऐप में `Cmd+K`, ब्राउज़र में `Cmd+Alt+K`) अब चैट को सिर्फ़ शीर्षक से नहीं, बल्कि आपके संदेशों और जवाबों के शब्दों से भी ढूंढती है। मिलता-जुलता टेक्स्ट चैट के नीचे दिखता है। dsh में यह खोज पहले से है, लेकिन यह बंद रहती है। यह सुविधा इसे चालू करती है और आपके कंप्यूटर पर एक खोज इंडेक्स फ़ाइल इस्तेमाल करती है। dsh शुरू होने के बाद पहली खोज पर इंडेक्स बनता है (250 चैट के लिए लगभग 15 सेकंड, सीमाएं देखें)। अगली बार शुरू करने पर यही इंडेक्स फिर से काम आता है। यह डिफ़ॉल्ट रूप से चालू है। बदलाव dsh रीस्टार्ट करने के बाद लागू होता है। | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="स्क्रीनशॉट: कंटेंट में खोज"></a> |
41
+ | **टर्न रोलबैक** | अपने किसी संदेश पर पॉइंटर ले जाएं और **↶** पर क्लिक करें (कॉपी करें के पास)। **सिर्फ़ चैट** उस संदेश और उसके बाद की हर चीज़ (जवाब, टूल कॉल) को चैट और मॉडल के कॉन्टेक्स्ट से हटा देता है। संदेश कंपोज़र में वापस आ जाता है: उसे बदलें और फिर से भेजें। **चैट और फ़ाइलें** पहले उन प्रोजेक्ट फ़ाइलों की सूची दिखाता है, जो उस संदेश के बाद बदलीं। फिर वह उन्हें भी पहले जैसी स्थिति में वापस लाता है। इसमें कमांड (`bash`) से हुए बदलाव भी शामिल हैं, सिर्फ़ dsh के एडिट टूल से हुए बदलाव नहीं। चल रहा टर्न पहले रुकता है। चैट लॉग कभी दोबारा नहीं लिखा जाता: एक छिपा हुआ मार्कर हटाए गए हिस्से को छिपा देता है, ठीक वैसे ही जैसे dsh का अपना `/compact` पुराने संदेश छिपाता है। अगर [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) इंस्टॉल है, तो यह काम वही करता है और Composer Plus दूसरा बटन नहीं दिखाता। | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="स्क्रीनशॉट: टर्न रोलबैक"></a> |
42
+ | **चैट हटाएं** | साइडबार → चैट का **…** मेन्यू (या राइट-क्लिक) → **हटाएं…** → **हटाएं**। dsh खुद सिर्फ़ आर्काइव कर सकता है। चैट रुक जाती है (उसका टर्न, जॉब, सबएजेंट और शेड्यूल भी, जैसे dsh के अपने आर्काइव में होता है)। उसका सेव किया गया इतिहास, उसकी सबएजेंट चैट के साथ, macOS के ट्रैश में चला जाता है (दूसरे सिस्टम पर: `$DSH_HOME/trash`)। चैट वापस लाने के लिए फ़ोल्डर को उसकी जगह पर वापस रखें और dsh रीस्टार्ट करें: चैट साइडबार के **सिर्फ़ आर्काइव किए गए** व्यू में दिखेगी। | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="स्क्रीनशॉट: चैट हटाएं"></a> |
43
+ | **कंपोज़र में प्रोजेक्ट का नाम** | कंपोज़र के नीचे की पंक्ति (टर्न, टोकन, कैश हिट, कॉन्टेक्स्ट) चैट के प्रोजेक्ट के नाम से शुरू होती है। इससे आपको हमेशा पता रहता है कि चैट किस प्रोजेक्ट में काम करती है। यह dsh का अपना प्रोजेक्ट शीर्षक होता है। अगर प्रोजेक्ट का कोई शीर्षक नहीं है, तो फ़ोल्डर का नाम दिखता है। फ़ोल्डर का पूरा पाथ देखने के लिए उस पर पॉइंटर ले जाएं। साइडबार में चैट ढूंढने के लिए उस पर क्लिक करें, यह सूची और प्रोजेक्ट दोनों व्यू में काम करता है: साइडबार और प्रोजेक्ट खुल जाते हैं (बंद प्रोजेक्ट और उसका **और दिखाएं** भी), सूची चैट तक स्क्रॉल होती है और चैट 5 सेकंड तक टिमटिमाती है। | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="स्क्रीनशॉट: कंपोज़र में प्रोजेक्ट का नाम"></a> |
44
+ | **इनपुट इतिहास** | खाली कंपोज़र में `↑` / `↓` दबाकर भेजे गए संदेशों में आगे-पीछे जाएं, जैसे टर्मिनल में। | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="स्क्रीनशॉट: इनपुट इतिहास"></a> |
45
+ | **प्लान मोड शॉर्टकट** | `Shift+Tab` ड्राफ़्ट की शुरुआत में `/plan ` जोड़ता है (हटाने के लिए फिर से दबाएं)। अगर चैट पहले से प्लान मोड में है, तो `Shift+Tab` उससे बाहर निकालता है। | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="स्क्रीनशॉट: प्लान मोड शॉर्टकट"></a> |
46
+ | **कंपोज़र में फ़ोकस बनाए रखें** | `/` कमांड या स्किल भेजने के बाद कर्सर कंपोज़र में ही रहता है, और आप तुरंत फिर से टाइप कर सकते हैं। यह उन कीबोर्ड मैक्रो के साथ भी काम करता है, जो कमांड टाइप करके `Enter` दबाते हैं। कमांड प्रोसेस करते समय dsh कंपोज़र को सिर्फ़ पढ़ने लायक (read-only) बना देता है, और तब ब्राउज़र फ़ोकस हटा देता है। यह सुविधा फ़ोकस वापस लाती है, बशर्ते फ़ोकस किसी मेन्यू, डायलॉग या दूसरे फ़ील्ड में न हो। | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="स्क्रीनशॉट: कंपोज़र में फ़ोकस बनाए रखें"></a> |
47
+ | **एक क्लिक में जारी रखें** | रुके हुए, विफल या बीच में कटे टर्न के बाद खाली कंपोज़र में **▶** दिखता है। एक क्लिक मौजूदा बातचीत से काम फिर से शुरू करता है। इनपुट में कुछ नहीं लिखा जाता और चैट में कोई दिखने वाला संदेश नहीं जुड़ता (मॉडल को “जहां रुका था, वहीं से जारी रखें” वाला एक छोटा छिपा नोट मिलता है, क्योंकि Claude जैसे कुछ प्रोवाइडर ऐसा अनुरोध अस्वीकार करते हैं, जो असिस्टेंट के जवाब पर खत्म होता है)। पूरे हुए टर्न के बाद सामान्य भेजें बटन ही रहता है। | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="स्क्रीनशॉट: एक क्लिक में जारी रखें"></a> |
48
+ | **रीस्टार्ट के बाद जारी रखें** | डिफ़ॉल्ट रूप से बंद: इसे **सेटिंग → Composer Plus** में चालू करें। अगर चैट के काम करते समय आप dsh बंद करते हैं (या वह बंद हो जाता है), तो dsh दोबारा खोलने पर वह चैट अपने आप जारी रहती है। उसे वही छिपा नोट मिलता है, जो एक क्लिक में जारी रखें में मिलता है। अगर कोई लक्ष्य राउंड (`/goal`) चल रहा था, तो लक्ष्य अपने अगले राउंड से जारी रहता है (dsh हर बार शुरू होने पर लक्ष्यों को तब तक रोक देता है, जब तक आप उन्हें फिर से शुरू नहीं करते)। जिन चैट को आपने रोका, जो पूरी हो गईं या विफल हुईं, वे जारी नहीं रहतीं। dsh में इसकी अपनी कोई सेटिंग नहीं है: वह ऐसे टर्न को सिर्फ़ बीच में रुका हुआ मार्क करता है। | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="स्क्रीनशॉट: रीस्टार्ट के बाद जारी रखें"></a> |
49
+ | **कतार में खींचकर छोड़ें** | कतार वाले संदेशों पर एक हैंडल (⠿) दिखता है। क्रम बदलने के लिए उसे खींचें, या हैंडल पर फ़ोकस करके `↑` / `↓` दबाएं। `Esc` रद्द करता है। | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="स्क्रीनशॉट: कतार में खींचकर छोड़ें"></a> |
50
+ | **सेशन लिंक कॉपी करें** | साइडबार में किसी चैट पर राइट-क्लिक करें → **सेशन लिंक कॉपी करें**। उस चैट को सिर्फ़ पढ़ने लायक कॉन्टेक्स्ट के रूप में जोड़ने के लिए `dsh-session:…` लिंक किसी दूसरी चैट में पेस्ट करें। dsh 0.2.1 में अपना **सेशन ID कॉपी करें** है, जो सिर्फ़ सादा ID कॉपी करता है; यह आइटम ठीक उसके बाद आता है। | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="स्क्रीनशॉट: सेशन लिंक कॉपी करें"></a> |
51
+ | **प्रोजेक्ट का पाथ कॉपी करें** | साइडबार में किसी प्रोजेक्ट पर राइट-क्लिक करें → **पाथ कॉपी करें** उसके फ़ोल्डर का पूरा पाथ कॉपी करता है। | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="स्क्रीनशॉट: प्रोजेक्ट का पाथ कॉपी करें"></a> |
52
+ | **इस चैट के लिए अनुमति दें** | जब ऑटो रिव्यू आपसे पूछता है, तो मंज़ूरी कार्ड पर **इस चैट के लिए अनुमति दें** दिखता है। इसके बाद उसी चैट में वही टूल किसी भी आर्ग्युमेंट के साथ बिना पूछे चलता है। हेडर की एक चिप अनुमतियों की सूची दिखाती है और उन्हें रद्द करती है। रीस्टार्ट के बाद भी अनुमतियां बनी रहती हैं। | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="स्क्रीनशॉट: इस चैट के लिए अनुमति दें"></a> |
53
+ | **प्रोजेक्ट की स्थिति** | साइडबार में प्रोजेक्ट की पंक्ति वही स्पिनर / इंतज़ार / पूरा होने का संकेत दिखाती है, जो उसकी चैट दिखाती हैं। इसलिए बंद (collapsed) प्रोजेक्ट भी बताता है कि अंदर कोई चैट काम कर रही है या उसे आपकी ज़रूरत है। सबसे पहले आपका इंतज़ार कर रही चैट दिखती है, फिर पूरी हुई ऐसी चैट जिसे आपने अभी तक नहीं खोला (हरा बिंदु, तब भी जब कोई दूसरी चैट अभी चल रही हो), फिर स्पिनर। विवरण देखने के लिए उस पर पॉइंटर ले जाएं। | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="स्क्रीनशॉट: प्रोजेक्ट की स्थिति"></a> |
54
+ | **सक्रिय प्रोजेक्ट पहले** | जब कोई चैट चलने लगती है या उसे आपकी ज़रूरत होती है, तो उसका प्रोजेक्ट dsh के अपने पंक्ति एनिमेशन के साथ साइडबार में सबसे ऊपर चला जाता है (वैसे ही जैसे आप उसे खींचकर वहां ले जाते)। पूरे हो चुके प्रोजेक्ट अपनी जगह पर रहते हैं; उन्हें हमेशा की तरह कहीं भी खींचें। बदला गया क्रम dsh के प्रोजेक्ट क्रम में सेव होता है, इसलिए इसे बंद करने पर मौजूदा क्रम बना रहता है। | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="स्क्रीनशॉट: सक्रिय प्रोजेक्ट पहले"></a> |
55
+ | **हाल के प्रोजेक्ट का फ़िल्टर** | साइडबार → व्यू के विकल्प (स्लाइडर आइकन) → **पिछले 2 घंटों में सक्रिय**। इसके चुने रहने पर साइडबार सिर्फ़ वे प्रोजेक्ट दिखाता है, जिनमें पिछले 2 घंटों में कोई चैट सक्रिय रही हो। इसमें शामिल हैं: इस समय में अपडेट हुई चैट, चल रही या इंतज़ार कर रही चैट, खुली हुई चैट, या पूरी हुई ऐसी चैट जिसे आपने अभी तक नहीं खोला (dsh का हरा “पूरा हुआ” बिंदु), 2 घंटे बाद भी। जिन प्रोजेक्ट में ऐसी कोई चैट नहीं है, वे छिप जाते हैं, नए और खाली प्रोजेक्ट भी। सभी प्रोजेक्ट दिखाने के लिए इसे फिर से चुनें। यह चुनाव इसी डिवाइस पर याद रहता है। | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="स्क्रीनशॉट: हाल के प्रोजेक्ट का फ़िल्टर"></a> |
56
+ | **सभी प्रोजेक्ट छोटे करें** | जब साइडबार में कोई प्रोजेक्ट खुला होता है, तो व्यू के विकल्पों (स्लाइडर आइकन) के पास एक बटन दिखता है। सभी खुले प्रोजेक्ट एक साथ बंद करने के लिए उस पर क्लिक करें, जैसे 5 में से 3 खुले प्रोजेक्ट। जब कोई प्रोजेक्ट खुला नहीं होता, तो बटन फिर से छिप जाता है। | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="स्क्रीनशॉट: सभी प्रोजेक्ट छोटे करें"></a> |
57
+ | **स्थिति के अनुसार क्रम** | साइडबार → व्यू के विकल्प → **इसके अनुसार क्रम दें** → **स्थिति के अनुसार** (**एक ही सूची में** के साथ)। सबसे पहले पूरी हुई चैट आती हैं (dsh का “पूरा हुआ” बिंदु, जो गड़बड़ी के साथ खत्म हुए टर्न को भी मिलता है)। फिर चल रही या इंतज़ार कर रही चैट, फिर सक्रिय ऑटोमेशन (शेड्यूल) वाली चैट, और आखिर में बाकी चैट dsh के क्रम में आती हैं। पूरी हुई चैट खोलने पर वह नीचे चली जाती है। सिर्फ़ व्यू बदलता है: वापस जाने के लिए **मैन्युअल** या **पिछला अपडेट** चुनें। | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="स्क्रीनशॉट: स्थिति के अनुसार क्रम"></a> |
58
+ | **बैकग्राउंड सूचनाएं** | जब dsh बैकग्राउंड में होता है, तो टर्न पूरा होने पर आपको सूचना मिलती है (जवाब की पहली पंक्ति)। जब कोई चैट सच में आपका इंतज़ार करती है, तब भी सूचना मिलती है: मंज़ूरी (टूल का नाम), जवाब (सवाल) या प्लान रिव्यू। अनुरोध 1.5 सेकंड बाद भी खुला होना चाहिए। इसलिए अपने-आप मंज़ूर हुए अनुरोधों (ऑटो रिव्यू अनुमतियां, दूसरे प्लगइन) पर कोई सूचना नहीं आती। अनुरोध का जवाब मिलते ही उसकी सूचना हटा ली जाती है। Dock/टास्कबार का बैज इंतज़ार कर रही चैट की गिनती दिखाता है। सूचना पर क्लिक करने से वह चैट खुलती है। | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="स्क्रीनशॉट: बैकग्राउंड सूचनाएं"></a> |
59
+ | **11 अतिरिक्त UI भाषाएं** | सेटिंग → Composer Plus → **ऐप्लिकेशन की भाषा** पूरे dsh इंटरफ़ेस को Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt या हिन्दी में बदल देता है (नीचे देखें)। | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="स्क्रीनशॉट: 11 अतिरिक्त UI भाषाएं"></a> |
60
+ | **मोबाइल कनेक्ट (iPhone)** | [Tether](tether/) ऐप से अपने iPhone पर dsh का उपयोग करें, उसी Wi-Fi पर या [Tailscale](https://tailscale.com) के ज़रिए। इसे **सेटिंग → Composer Plus** में चालू करें (यह डिफ़ॉल्ट रूप से बंद रहता है, क्योंकि यह इस Mac पर एक नेटवर्क पोर्ट खोलता है)। फिर साइडबार में नीचे बाईं ओर **मोबाइल कनेक्ट** पर क्लिक करें: Tether में QR कोड स्कैन करें और **Approve** पर क्लिक करें। फ़ोन आपकी चैट दिखाता है, संदेश भेजता है, मंज़ूरियों और सवालों के जवाब देता है, और मॉडल व एजेंट बदलता है। आप जितने चाहें उतने Mac पेयर कर सकते हैं: ऐप में ऊपर बाईं ओर Mac का नाम उनके बीच बदलता है। | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="स्क्रीनशॉट: मोबाइल कनेक्ट"></a> |
61
+ | **अपने-आप अपडेट** | dsh शुरू होने पर प्लगइन [GitHub की नवीनतम रिलीज़](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) जांचता है। अगर वह नई है और npm पर पहले से है, तो प्लगइन वही वर्शन dsh के अपने प्लगइन मैनेजर से इंस्टॉल करता है (सेटिंग → प्लगइन वाला ही रास्ता) और आपको सूचित करता है। इसे लोड करने के लिए **dsh रीस्टार्ट करें**। **सेटिंग → Composer Plus → Composer Plus अपडेट** वर्शन दिखाता है और उसमें **अपडेट जांचें** / **अभी अपडेट करें** बटन हैं। | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="स्क्रीनशॉट: अपने-आप अपडेट"></a> |
62
+
63
+ बटन, टूलटिप, नोटिस और सूचनाएं dsh की चुनी गई भाषा में दिखते हैं (नीचे ऐप्लिकेशन की भाषा देखें)।
64
+
65
+ ## सेटिंग
66
+
67
+ हर सुविधा को अलग से चालू या बंद किया जा सकता है: dsh **सेटिंग → Composer Plus**। हर पंक्ति में एक छोटा स्क्रीनशॉट है: बड़ा पूर्वावलोकन देखने के लिए उस पर पॉइंटर ले जाएं, पूरे आकार में खोलने के लिए उस पर क्लिक करें (`Esc` बंद करता है)। ऊपर का **सुविधाएं खोजें** बॉक्स पेज को नाम या विवरण से फ़िल्टर करता है (कोई भी भाषा; बड़े-छोटे अक्षरों और एक्सेंट से फ़र्क नहीं पड़ता); `Esc` उसे खाली करता है। हर पंक्ति में एक स्विच और छोटा विवरण है। बदलाव बिना रीस्टार्ट के तुरंत लागू होते हैं और उस डिवाइस पर याद रहते हैं। **मोबाइल कनेक्ट** और **रीस्टार्ट के बाद जारी रखें** को छोड़कर सब कुछ डिफ़ॉल्ट रूप से चालू है। इन दोनों के और **कंटेंट में खोज** व **टर्न रोलबैक** के स्विच dsh का Host रखता है, इसलिए वे हर विंडो पर लागू होते हैं और रीस्टार्ट के बाद भी बने रहते हैं। **कंटेंट में खोज** सिर्फ़ dsh रीस्टार्ट करने के बाद बदलती है (dsh इसे शुरू होते समय पढ़ता है); तब तक उसकी पंक्ति में लिखा रहता है **यह बदलाव लागू करने के लिए dsh रीस्टार्ट करें।**
68
+
69
+ <p align="center"><img src="docs/images/settings.webp" width="720" alt="सेटिंग → Composer Plus: सुविधाओं की खोज, भाषा चुनने का विकल्प, अपडेट की पंक्ति और हर सुविधा के लिए एक स्विच, होवर करने पर स्क्रीनशॉट का पूर्वावलोकन"></p>
70
+
71
+ ### ऐप्लिकेशन की भाषा
72
+
73
+ **सेटिंग → Composer Plus → ऐप्लिकेशन की भाषा** खोलें और **सिस्टम की भाषा** या 13 भाषाओं में से कोई एक चुनें:
74
+
75
+ English · 中文 · Türkçe · Español · Português (Brasil) · Français · Deutsch · Русский · 日本語 · 한국어 · Bahasa Indonesia · Tiếng Việt · हिन्दी
76
+
77
+ <p align="center"><img src="docs/images/language-tr.webp" width="720" alt="DeepSeek Harness का इंटरफ़ेस Türkçe में बदला गया"></p>
78
+
79
+ पूरा ऐप तुरंत बदल जाता है। यह चुनाव dsh की अपनी सेव की गई `locale.preference` है (वही जो सामान्य → भाषा में है), इसलिए यह रीस्टार्ट के बाद भी बना रहता है। **सिस्टम की भाषा** यह चुनाव हटा देता है: डेस्कटॉप ऐप OS की भाषा अपनाता है, वेब UI ब्राउज़र की भाषा, और जो भाषा समर्थित नहीं है, उसकी जगह अंग्रेज़ी दिखती है। प्लगइन इंस्टॉल करने से आपकी पहले से चुनी हुई भाषा कभी नहीं बदलती।
80
+
81
+ हर पैक में 3,143 टेक्स्ट हैं: dsh `0.2.0-rc.2` और `0.2.1-rc.2` का हर UI टेक्स्ट (चैट, साइडबार, सेटिंग, मंज़ूरियां, शेड्यूल, फ़ाइल पूर्वावलोकन, प्लगइन मैनेजर, प्लगइन मार्केट), प्लगइन के अपने कंट्रोल, और लोकप्रिय [dsh-rewind](https://github.com/SiriLee/dsh-rewind) प्लगइन। इनका अनुवाद नहीं होता: आपके संदेश, मॉडल का आउटपुट, कोड, स्लैश कमांड के नाम (`/plan`, `/compact`), प्रोवाइडर के अपने लेबल जैसे `High` रीज़निंग प्रयास, दूसरे प्लगइन के टेक्स्ट, और डेस्कटॉप ऐप के नेटिव मेन्यू/अपडेट डायलॉग (dsh इन्हें सिर्फ़ अंग्रेज़ी/चीनी में देता है)। नए dsh में जोड़े गए टेक्स्ट तब तक अंग्रेज़ी में दिखते हैं, जब तक पैक अपडेट नहीं होते। अगर कोई दूसरा प्लगइन पहले से कोई भाषा देता है, तो वह भाषा उसी प्लगइन की रहती है।
82
+
83
+ ## कीबोर्ड शॉर्टकट
84
+
85
+ | कुंजी | कहां | काम |
86
+ |---|---|---|
87
+ | `↑` / `↓` | खाली कंपोज़र | पिछला / अगला भेजा गया संदेश |
88
+ | `Shift+Tab` | कंपोज़र | `/plan ` जोड़ें/हटाएं, या प्लान मोड से बाहर निकलें |
89
+ | `↑` / `↓` | फ़ोकस किया गया कतार हैंडल | कतार वाला संदेश खिसकाएं |
90
+ | `Esc` | खींचते समय | खिसकाना रद्द करें |
91
+ | `→` / `←` | सुविधाओं के आइडिया पेज | सबसे ऊपर का कार्ड बनाएं / छोड़ें |
92
+ | `↓` | सुविधाओं के आइडिया पेज | सबसे ऊपर का कार्ड प्रोजेक्ट की बाद में सूची में रखें |
93
+ | `↑` | सुविधाओं के आइडिया पेज | सबसे ऊपर का कार्ड बिना प्लान के अभी बनाएं |
94
+ | `Z` | सुविधाओं के आइडिया पेज | पिछला छोड़ा गया कार्ड वापस लाएं |
95
+
96
+ खुला `/` या `@` मेन्यू इन कुंजियों को खुद इस्तेमाल करता है।
97
+
98
+ ## संगतता
99
+
100
+ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2` (वेब) पर टेस्ट किया गया। CI हर push पर टेस्ट चलाता है।
101
+
102
+ ## गोपनीयता और सुरक्षा
103
+
104
+ - **जारी रखें:** प्रमाणित लोकल एंडपॉइंट सिर्फ़ आखिरी बीच में रुके टर्न को फिर से शुरू करता है। वह पुराने या दोहराए गए अनुरोध अस्वीकार करता है और मौजूदा मंज़ूरी हुक बनाए रखता है। वह कोई नया यूज़र संदेश नहीं भेजता।
105
+ - **रीस्टार्ट के बाद जारी रखें:** जब तक आप इसे चालू नहीं करते, यह बंद रहता है। Host वाला हिस्सा सिर्फ़ चैट ID और शुरू होने का समय `$DSH_HOME/storages/dsh-composer-plus/resume.json` में रखता है (सिर्फ़ मालिक की अनुमति), और कुछ भी आपकी मशीन से बाहर नहीं जाता। यह चैट को सिर्फ़ तब जारी रखता है, जब dsh का अपना लॉग बताता है कि उसका पिछला टर्न dsh ने रोका था (आपने नहीं)। जारी रखे गए टर्न पर मंज़ूरियां और ऑटो रिव्यू हमेशा की तरह लागू होते हैं।
106
+
107
+ - **बदलाव पैनल:** git आपकी मशीन पर, चैट के अपने फ़ोल्डर में, dsh के प्रमाणित `/api` चैनल से सिर्फ़ पढ़ने के मोड में चलता है। यह कभी commit, stage या fetch नहीं करता, और सिर्फ़ वही पाथ दिखाता है, जो git ने खुद सूची में दिए।
108
+ - **सुविधाओं के आइडिया:** जब तक आप **सुविधाएं सुझाएं** पर क्लिक नहीं करते, कुछ नहीं चलता। फिर Host वाला हिस्सा सिर्फ़ चैट का अपना फ़ोल्डर पढ़ता है (ब्राउज़र कभी कोई पाथ नहीं भेजता): टॉप-लेवल एंट्री के नाम, README, AGENTS.md और मैनिफ़ेस्ट (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) के पहले 6 kB, और `git log --oneline -15`, कुल मिलाकर ज़्यादा से ज़्यादा 16 kB। यह `.env*`, कुंजी (key) फ़ाइलें और `node_modules` जैसे फ़ोल्डर छोड़ देता है। यह सिर्फ़ वे सामान्य फ़ाइलें पढ़ता है, जो फ़ोल्डर के अंदर रहती हैं: फ़ोल्डर से बाहर इशारा करने वाला symlink, FIFO या डिवाइस छोड़ दिया जाता है। यह सारांश dsh की अपनी प्रोवाइडर सेटिंग के ज़रिए, एक अनुरोध के रूप में, उस मॉडल को जाता है जिसे चैट इस्तेमाल करती है; यह किसी चैट में नहीं जुड़ता। प्रोजेक्ट में कुछ नहीं लिखा जाता। दाएं स्वाइप किया गया आइडिया प्लान मोड में नई चैट शुरू करता है, इसलिए मंज़ूरियां और प्लान रिव्यू हमेशा की तरह लागू होते हैं। **अभी बनाएं** प्लान मोड के बिना चैट शुरू करता है: मॉडल तुरंत फ़ाइलें बदल सकता है, चैट की सामान्य मंज़ूरियों और ऑटो रिव्यू के साथ। बाद के लिए रखे गए आइडिया (शीर्षक, सारांश, कारण, मेहनत) प्रोजेक्ट के फ़ोल्डर पाथ के साथ dsh होम के अंदर `storages/dsh-composer-plus/later.json` में रखे जाते हैं (सिर्फ़ मालिक की फ़ाइल); प्रोजेक्ट में कुछ नहीं जाता। सुझाए गए आइडिया का इतिहास (शीर्षक, सारांश, कारण, मेहनत, तारीख, शुरू हुआ या नहीं) इसी तरह `storages/dsh-composer-plus/idea-history.json` में रखा जाता है, हर प्रोजेक्ट में ज़्यादा से ज़्यादा 200 (सबसे पुराने पहले हटते हैं); इसके शीर्षक उस प्रोजेक्ट के अगले **सुविधाएं सुझाएं** के साथ मॉडल को जाते हैं।
109
+ - **कंटेंट में खोज:** कोई नया कोड आपकी चैट नहीं खोजता: प्लगइन सिर्फ़ dsh का अपना संदेश इंडेक्स (SQLite FTS5, `dsh-session-query-sqlite`) चालू करता है और उसे एक फ़ाइल देता है: `$DSH_HOME/cache/composer-plus/session-search.db` (फ़ाइल और फ़ोल्डर सिर्फ़ मालिक के)। इस फ़ाइल में आपके यूज़र और असिस्टेंट संदेशों का टेक्स्ट होता है, इसलिए यह उतनी ही निजी है जितने `$DSH_HOME/sessions` में चैट लॉग। कुछ भी आपकी मशीन से बाहर नहीं जाता। यह एक कॉपी है, जिसे dsh फिर से बना सकता है: dsh बंद होने पर आप इसे हटा सकते हैं। स्विच `$DSH_HOME/storages/dsh-composer-plus/content-search.json` में है।
110
+ - **टर्न रोलबैक:** आपके हर संदेश से पहले Host चैट के फ़ोल्डर का git स्नैपशॉट अपने अलग स्टोर में लेता है: `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (सिर्फ़ मालिक का फ़ोल्डर)। इसमें उस फ़ोल्डर की उन फ़ाइलों की कॉपी होती है, जिन्हें git देखता है (ignore की गई फ़ाइलें नहीं), इसलिए यह उतना ही निजी है जितना प्रोजेक्ट। यह आपकी रिपॉज़िटरी के ऑब्जेक्ट पढ़ता है (जो git के पास पहले से है, उसकी कॉपी नहीं बनाता)। यह आपकी रिपॉज़िटरी का index, `HEAD`, ब्रांच, टैग, stash या config कभी नहीं लिखता। git वहां सिर्फ़ एक बदलाव करता है: दोबारा इस्तेमाल की गई ऑब्जेक्ट फ़ाइलों पर नया टाइम स्टैंप (इससे `git gc` उन्हें थोड़ी देर से साफ़ करता है)। फ़ाइलों के साथ रोलबैक सिर्फ़ चैट के फ़ोल्डर के अंदर की सामान्य फ़ाइलें लिखता है; यह symlink, पाइप और फ़ोल्डर के बाहर की हर चीज़ छोड़ देता है। कुछ भी आपकी मशीन से बाहर नहीं जाता। dsh बंद होने पर आप स्टोर हटा सकते हैं (तब नए संदेश आने तक रोलबैक सिर्फ़ चैट के लिए काम करता है)। **चैट हटाएं** चैट का स्टोर भी हटाता है। स्विच `$DSH_HOME/storages/dsh-composer-plus/rollback.json` में है।
111
+ - **चैट हटाएं:** चैट के अपने लॉग फ़ोल्डर (`$DSH_HOME/sessions/<project>/<chat>`) को ट्रैश में ले जाता है। यह प्रोजेक्ट फ़ोल्डर को नहीं छूता।
112
+ - **इस चैट के लिए अनुमति दें:** अनुमतियां `$DSH_HOME/storages/dsh-composer-plus/grants.json` में रखी जाती हैं (सिर्फ़ मालिक की अनुमति)। एक अनुमति **एक चैट में एक तय टूल** पर लागू होती है। अगर वह टूल लिख सकता है, तो अनुमति हर तरह के लिखने पर भी लागू होती है। इसे हेडर की चिप से रद्द करें।
113
+ - ऑटो रिव्यू फिर भी हर कॉल पर चलता है; रिव्यू विफल होने पर कभी अपने-आप अनुमति नहीं मिलती।
114
+ - **मोबाइल कनेक्ट:** जब तक आप इसे चालू नहीं करते, यह बंद रहता है। चालू रहने पर Host वाला हिस्सा Tether गेटवे चलाता है: पोर्ट 19390 पर HTTPS, जो सिर्फ़ आपके Wi-Fi सबनेट और आपके tailnet (100.64.0.0/10) से कनेक्शन स्वीकार करता है, और `127.0.0.1:19391` पर एक पेयरिंग पेज (सिर्फ़ यह Mac)। फ़ोन को QR कोड से मिला एक बार का कोड (5 मिनट) और Mac पर आपका **Approve** चाहिए। फ़ोन गेटवे का सर्टिफ़िकेट पिन करता है। Mac हर फ़ोन के टोकन का सिर्फ़ हैश रखता है (30 दिन, उपयोग होते रहने पर नवीनीकृत)। **Revoke** उस फ़ोन के कनेक्शन तुरंत बंद कर देता है। फ़ोन dsh के सिर्फ़ मंज़ूर सूची वाले मेथड कॉल कर सकते हैं (चैट, प्रॉम्प्ट, अटैचमेंट, स्लैश कमांड, मंज़ूरियां, सवाल, मॉडल, एजेंट, लक्ष्य); सेटिंग, क्रेडेंशियल, फ़ाइल ब्राउज़र या टर्मिनल नहीं। डेटा: `$DSH_HOME/storages/dsh-composer-plus/mobile/`। विवरण: [tether/README.md](tether/README.md)।
115
+ - **अपडेट:** Host वाला हिस्सा `api.github.com` से नवीनतम रिलीज़ और `registry.npmjs.org` से वही वर्शन पूछता है; आपके या आपकी चैट के बारे में कुछ नहीं भेजा जाता। इंस्टॉलेशन dsh के प्लगइन मैनेजर (`pnpm add dsh-composer-plus@<version>`; जब dsh 0.2.1 पहले से इंस्टॉल प्लगइन के लिए इसे मना करता है, तो `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, और फिर प्रोफ़ाइल उस URL को प्लगइन के स्रोत के रूप में सूचीबद्ध करती है) से होता है, इसलिए dsh की अपनी रजिस्ट्री, स्क्रिप्ट और वर्शन-संगतता जांच लागू होती हैं। प्री-रिलीज़ टैग और पुराने वर्शन कभी इंस्टॉल नहीं होते।
116
+
117
+ ## समस्या निवारण
118
+
119
+ - **macOS पर सूचनाएं नहीं आतीं:** सिस्टम सेटिंग → सूचनाएं → DeepSeek Harness → अनुमति दें। सूचनाओं को स्क्रीन पर बनाए रखने के लिए **अलर्ट** चुनें।
120
+ - **dsh अपडेट के बाद ▶, कतार हैंडल, प्रोजेक्ट की स्थिति, हाल के प्रोजेक्ट का विकल्प, सभी प्रोजेक्ट छोटे करें, पाथ कॉपी करें, इस चैट के लिए अनुमति दें या राइट-क्लिक गायब है:** ये dsh के मौजूदा HTML से जुड़ते हैं, क्योंकि dsh में अभी इनके लिए कोई जगह (slot) नहीं है। अगर dsh वह मार्कअप बदलता है, तो ये खुद छिप जाते हैं; और कुछ नहीं टूटता। कृपया एक [issue](https://github.com/furkancak1r/dsh-composer-plus/issues) खोलें।
121
+ - **"अपडेट विफल रहा" या "npm से इंस्टॉल नहीं की गई थी":** लोकल फ़ोल्डर से लिंक की गई या नाम बदली गई कॉपी खुद को अपडेट नहीं कर सकती; सेटिंग → प्लगइन से `dsh-composer-plus` फिर से इंस्टॉल करें। नहीं तो संदेश में pnpm की गड़बड़ी की पहली पंक्ति दिखती है; **अपडेट जांचें** फिर से कोशिश करता है।
122
+ - **मोबाइल कनेक्ट कहता है कि गेटवे नहीं चल रहा है:** "no IPv4 address on en0" का मतलब है कि इस Mac का कोई Wi-Fi/Ethernet पता नहीं है। "EADDRINUSE" का मतलब है कि कोई दूसरा dsh (या ऐप) पोर्ट 19390 या 19391 इस्तेमाल कर रहा है। एक समय में सिर्फ़ एक dsh मोबाइल कनेक्ट चला सकता है।
123
+ - **मोबाइल कनेक्ट, रीस्टार्ट के बाद जारी रखें या कंटेंट में खोज "dsh रीस्टार्ट करें" कहता है:** dsh चलते समय प्लगइन अपडेट हुआ (या, कंटेंट में खोज के लिए, आपने स्विच बदला); नई स्थिति रीस्टार्ट के बाद लोड होती है।
124
+ - **खोज सिर्फ़ शीर्षक ढूंढती है:** कंटेंट में खोज बंद है, या इसे चालू करने या प्लगइन इंस्टॉल करने के बाद dsh रीस्टार्ट नहीं हुआ, या वह शब्द सिर्फ़ किसी टूल आउटपुट में है (सीमाएं देखें)।
125
+ - **मेरे संदेशों पर ↶ बटन नहीं है:** टर्न रोलबैक बंद है, चैट एक सबएजेंट चैट है, या dsh-rewind-plugin इंस्टॉल है (उसका ↶ बटन इस्तेमाल करें)। अपडेट के बाद dsh रीस्टार्ट करें।
126
+ - **चैट और फ़ाइलें धूसर (बंद) दिखता है:** प्रोजेक्ट git रिपॉज़िटरी नहीं है, उस संदेश से पहले का कोई स्नैपशॉट नहीं है (संदेश प्लगइन से पुराना है, या 50 सबसे नए स्नैपशॉट ने उसकी जगह ले ली), या कोई फ़ाइल नहीं बदली।
127
+ - **हटाएं कहता है कि किसी दूसरे dsh में यह चैट खुली है:** उसी dsh होम पर चल रहा दूसरा dsh चैट का लॉक रखता है। वह विंडो या dsh बंद करें, फिर से हटाएं। तब तक चैट आर्काइव में रहती है।
128
+ - **रीस्टार्ट के बाद कोई चैट जारी नहीं रही:** dsh बंद होते समय रीस्टार्ट के बाद जारी रखें बंद था, आपने वह टर्न खुद रोका था, टर्न खत्म हो चुका था (पूरा या विफल), चैट आर्काइव थी, या 20 से ज़्यादा चैट चल रही थीं (सबसे नई 20 जारी रहती हैं)।
129
+ - **रिलीज़ के तुरंत बाद इंस्टॉल विफल होता है:** वर्शन जोड़ें (`dsh-composer-plus@1.10.0`), ऊपर इंस्टॉल वाला नोट देखें।
130
+
131
+ ## सीमाएं
132
+
133
+ - संदेश के बिना जारी रखना dsh के `agent/pre-step` → `agent/request` लाइफ़साइकल पर निर्भर है। dsh अपग्रेड करते समय संगतता फिर से जांचें।
134
+ - **सुविधाओं के आइडिया** हर चैट के कार्ड तब तक मेमोरी में रखता है, जब तक dsh या पेज फिर से लोड नहीं होता; उसके बाद **सुविधाएं सुझाएं** मॉडल से फिर पूछता है। क्लिक करते समय dsh की जो UI भाषा होती है, कार्ड उसी में आते हैं। भाषा बदलने के बाद ढेर में पहले से मौजूद कार्ड अपनी भाषा रखते हैं, और **और आइडिया** नई भाषा इस्तेमाल करता है। मॉडल सिर्फ़ प्रोजेक्ट का छोटा सारांश देखता है, कोड नहीं, इसलिए कोई आइडिया ऐसी चीज़ दोहरा सकता है जो प्रोजेक्ट में पहले से है: उसे छोड़ दें। नई चैट सिर्फ़ तब प्लान मोड में चलती है, जब प्रोफ़ाइल में dsh का `/plan` कमांड हो; नहीं तो आइडिया एक सामान्य पहले संदेश के रूप में जाता है। **बाद में** सूची चैट के फ़ोल्डर पाथ से जुड़ी है: symlink से खोले गए उसी फ़ोल्डर की अपनी अलग सूची होती है। यह हर प्रोजेक्ट में ज़्यादा से ज़्यादा 50 आइडिया रखती है (और जोड़ने के लिए एक हटाएं), और एक शीर्षक सिर्फ़ एक बार। कार्ड खींचने से सिर्फ़ बाएं या दाएं का फ़ैसला होता है; उसे रखने के लिए **↓** और अभी बनाने के लिए **▶** इस्तेमाल करें। दोहराव सिर्फ़ शीर्षक से पहचाना जाता है: मॉडल किसी पुराने आइडिया को नए नाम से फिर भी सुझा सकता है; उसे छोड़ दें। जब मॉडल सिर्फ़ पुराने आइडिया लौटाता है, तो कुछ नया नहीं दिखता: फिर से क्लिक करें।
135
+ - **रीस्टार्ट के बाद जारी रखें** टर्न को जारी रखता है; उसे दोबारा नहीं चलाता। बंद होते समय चल रहा टूल कॉल dsh के “नतीजा अज्ञात” परिणाम के साथ खत्म होता है, और मॉडल को बताया जाता है कि पूरा हो चुका काम न दोहराए। फिर भी, जो कमांड दो बार चलाना सुरक्षित नहीं है, वह फिर से चल सकता है। खुले सबएजेंट, मंज़ूरियां और सवाल वापस नहीं आते: उनकी पैरेंट चैट जारी रहती है और फिर से पूछती है। एक बार शुरू होने पर ज़्यादा से ज़्यादा 20 चैट जारी रहती हैं।
136
+
137
+ - **कंटेंट में खोज** dsh की अपनी खोज है, इसलिए इसमें dsh की सीमाएं हैं। यह सिर्फ़ यूज़र और असिस्टेंट संदेश खोजती है: टूल आउटपुट (कमांड, फ़ाइल कंटेंट, नतीजे) नहीं, रीज़निंग नहीं, और इसमें यूज़र, असिस्टेंट या टूल संदेशों के लिए कोई फ़िल्टर नहीं है। यह पूरे शब्द मिलाती है, शब्द के हिस्से नहीं (`deploy` से `deployment` नहीं मिलता); एक्सेंट वाले अक्षर बिना एक्सेंट के भी मिलते हैं (`seker` से `şeker` मिलता है)। हर चैट की एक पंक्ति, dsh के 240 अक्षरों वाले अंश के साथ, ज़्यादा से ज़्यादा 20 पंक्तियां।
138
+ - **कंटेंट में खोज** की लागत, 247 असली चैट लॉग की कॉपी पर मापी गई (159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB): शुरू होने के बाद पहली खोज लगभग 15 सेकंड में इंडेक्स बनाती है। इस दौरान dsh का Host लगभग 7 सेकंड तक कोई जवाब नहीं देता, इसलिए उस समय दूसरी चैट की स्ट्रीमिंग रुक जाती है (पेज खुद नहीं अटकता)। सबसे ज़्यादा उपयोग के समय Host की मेमोरी लगभग 1.1 GB बढ़ती है। एक मिनट बाद भी यह शुरुआत से लगभग 0.5–0.6 GB ज़्यादा रहती है, जब तक dsh बंद नहीं होता। इंडेक्स फ़ाइल लगभग 165 MB की होती है। बाद की खोजों में लगभग 0.5 सेकंड लगते हैं। रीस्टार्ट के बाद पहली खोज में लगभग 1 सेकंड लगता है (सिर्फ़ नई या बदली हुई चैट जोड़ी जाती हैं) और मेमोरी लगभग 70 MB बढ़ती है। अगर आपके कंप्यूटर में मेमोरी कम है, तो इसे बंद करें।
139
+ - **कंटेंट में खोज** सिर्फ़ dsh रीस्टार्ट के बाद लागू होती है, और इंडेक्स फ़ाइल उन सभी dsh के बीच साझा होती है, जो एक ही dsh होम इस्तेमाल करते हैं: एक समय में ऐसा सिर्फ़ एक dsh चलाएं (dsh हर इंडेक्स फ़ाइल का एक ही मालिक होने देता है)।
140
+ - **टर्न रोलबैक** फ़ाइलें सिर्फ़ git रिपॉज़िटरी में, और सिर्फ़ चैट के फ़ोल्डर में वापस लाता है। यह हर चैट के 50 सबसे नए स्नैपशॉट रखता है। ignore की गई फ़ाइलें (`.gitignore`, `info/exclude`, आपकी ग्लोबल ignore फ़ाइल), खाली फ़ोल्डर, symlink और submodule वापस नहीं आते। जो फ़ाइल स्नैपशॉट लेते समय ignore थी, वह कभी नहीं हटाई जाती, भले ही टर्न ने ignore नियम बदल दिए हों। जो फ़ाइल git नहीं पढ़ सकता, वह स्नैपशॉट में नहीं आती। आपका हर संदेश चैट के फ़ोल्डर का एक `git add --all` निजी स्टोर में चलाता है: बहुत बड़े फ़ोल्डर में, जहां बहुत सी untracked फ़ाइलें हों, इसमें कुछ सेकंड लग सकते हैं, और अगला टूल कॉल इसका इंतज़ार करता है (ज़्यादा से ज़्यादा 10 सेकंड; उसके बाद स्नैपशॉट बैकग्राउंड में पूरा होता है)। अगर आपकी रिपॉज़िटरी का `git gc` कोई ऐसा ऑब्जेक्ट हटा देता है, जिसकी किसी पुराने स्नैपशॉट को ज़रूरत है, तो वह फ़ाइल "वापस नहीं लाई गई" सूची में दिखती है। कंपोज़र में सिर्फ़ संदेश का टेक्स्ट वापस आता है: उसकी इमेज या फ़ाइलें फिर से जोड़ें। सबएजेंट चैट में ↶ नहीं होता (सबएजेंट के फ़ाइल बदलाव उस चैट के बदलाव माने जाते हैं, जिसने उसे शुरू किया)। एक्सपोर्ट की गई चैट (`/export`) में हटाए गए संदेश फिर भी रहते हैं। चैट का हिस्सा हटाने वाले एक छिपे मार्कर का आइडिया SiriLee के [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind) (MIT) से आया है; Composer Plus उसका कोई कोड इस्तेमाल नहीं करता।
141
+ - **चैट हटाएं** के लिए dsh का आर्काइव चाहिए (dsh 0.2.0 और बाद के वर्शन)। जो चैट (या उसकी कोई सबएजेंट चैट) 15 सेकंड में नहीं रुकती, या जिसे कोई दूसरा dsh रखता है, वह आर्काइव में रहती है और कुछ नहीं खिसकता। macOS के अलावा दूसरे सिस्टम पर ट्रैश फ़ोल्डर उसी डिस्क पर होना चाहिए, जिस पर चैट इतिहास है। अगर आप कोई खुली चैट हटाते हैं, तो वह dsh रीस्टार्ट होने तक dsh की मेमोरी में आर्काइव और छिपी हुई रहती है। ट्रैश खुद खाली करें; dsh यह नहीं करता।
142
+ - dsh की कतार में `move` कार्रवाई नहीं है, इसलिए क्रम बदलने पर प्रभावित पंक्तियों का टेक्स्ट दोबारा लिखा जाता है। अगर खिसकाने के बीच एजेंट कोई पंक्ति उठा लेता है, तो खिसकाना वापस हो जाता है और कुछ नहीं खोता। इमेज या फ़ाइलों वाले संदेश नहीं खिसकाए जा सकते।
143
+ - अगर नया वर्शन dsh की कोई सेटिंग नहीं बदलता, तो dsh 0.2.1 अपडेट तुरंत लोड करता है; बाकी मामलों में, और dsh 0.2.0 पर, इसे लोड करने के लिए dsh रीस्टार्ट करें। प्लगइन आपके लिए dsh कभी रीस्टार्ट नहीं करता। जिन वेब/CLI प्रोफ़ाइल में dsh का प्लगइन मैनेजर नहीं है, वे सिर्फ़ नए वर्शन की जानकारी देती हैं।
144
+ - **कंपोज़र में फ़ोकस बनाए रखें** सिर्फ़ `/` कमांड या स्किल के बाद फ़ोकस वापस देता है। जब तक dsh कमांड प्रोसेस करता है, कंपोज़र कुछ मिलीसेकंड तक सिर्फ़ पढ़ने लायक रहता है, इसलिए उस समय दबाई गई कुंजियां खो जाती हैं। अगर dsh का `/` मेन्यू अभी भी खुला है, तो `Enter` हाइलाइट की गई पंक्ति चुनता है और कुछ नहीं भेजता।
145
+ - **मोबाइल कनेक्ट** सिर्फ़ macOS पर काम करता है (यह `en0`, `openssl`, `swift` और `dns-sd` इस्तेमाल करता है)। यह तय पोर्ट 19390 और 19391 इस्तेमाल करता है, इसलिए हर Mac पर एक समय में सिर्फ़ एक dsh इसे चला सकता है (फ़ोन की Mac सूची में हर Mac एक एंट्री है)। फ़ोन को सूचनाएं सिर्फ़ तब मिलती हैं, जब Tether खुला हो या अभी-अभी बैकग्राउंड में गया हो (कोई पुश सेवा नहीं)। iOS ऐप अभी App Store पर नहीं है: इसे Xcode से `tether/ios` से बनाएं।
146
+ - सेशन लिंक चैट के अंदर काम करता है; उस पर क्लिक करने से चैट नहीं खुलती।
147
+ - रीस्टार्ट से पहले भेजी गई सूचना पर क्लिक करने से सिर्फ़ dsh सामने आता है।
148
+ - सक्रिय प्रोजेक्ट dsh के सेव किए गए प्रोजेक्ट क्रम के ज़रिए खिसकाए जाते हैं, इसलिए नया क्रम रीस्टार्ट के बाद भी बना रहता है। किसी प्रोजेक्ट से बाहर की चैट ("बिना समूह") नहीं खिसकाई जा सकतीं; dsh उन्हें हमेशा आखिर में दिखाता है।
149
+ - dsh के साइडबार के व्यू के विकल्प वाले मेन्यू में कोई एक्सटेंशन पॉइंट नहीं है, इसलिए हाल के प्रोजेक्ट का विकल्प dsh के अपने मेन्यू में जोड़ा जाता है। अगर dsh का कोई अपडेट वह मेन्यू बदलता है, तो विकल्प नहीं दिखता और सभी प्रोजेक्ट दिखते रहते हैं। फ़िल्टर प्रोजेक्ट की पंक्तियों पर काम करता है, इसलिए **एक ही सूची में** फ़िल्टर नहीं होता। इसे **वर्कस्पेस** के साथ इस्तेमाल करें: **वर्कस्पेस ट्री** में छिपा हुआ पैरेंट फ़ोल्डर अपने अंदर के सक्रिय प्रोजेक्ट भी छिपा देता है। **स्थिति के अनुसार** की भी ऐसी ही सीमा है: dsh में क्रम के लिए कोई slot नहीं है, इसलिए आइटम और पंक्तियों का क्रम dsh के मेन्यू और सूची के मार्कअप से जुड़ते हैं।
150
+ - dsh में प्रोजेक्ट की पंक्ति का मेन्यू या वर्कस्पेस हेडर का slot भी नहीं है। **पाथ कॉपी करें** dsh की पंक्ति के मार्कअप से प्रोजेक्ट की पंक्ति ढूंढता है। **सभी प्रोजेक्ट छोटे करें** dsh के हेडर में जाता है और हर खुले प्रोजेक्ट को उसी क्लिक से बंद करता है, जो प्रोजेक्ट की पंक्ति पर होता है। अगर dsh का कोई अपडेट वह मार्कअप बदलता है, तो राइट-क्लिक पर ब्राउज़र का मेन्यू दिखता है और बटन नहीं दिखता।
151
+ - बिल्ट-इन सपोर्ट का अनुरोध upstream में किया गया है: कतार के `move` के लिए [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), जारी रखें वाली स्थिति के लिए [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269)।
152
+
153
+ ## अक्सर पूछे जाने वाले सवाल
154
+
155
+ **DeepSeek Harness में बदलाव / git डिफ़ पैनल कैसे जोड़ें?** `dsh-composer-plus` इंस्टॉल करें, फिर दायां साइडबार → `+` → **बदलाव**।
156
+
157
+ **क्या dsh मेरे प्रोजेक्ट के लिए Tinder कार्ड की तरह स्वाइप करके सुविधाएं सुझा सकता है?** हां: दायां साइडबार → `+` → **सुविधाओं के आइडिया** → **सुविधाएं सुझाएं**। सुविधा की योजना बनाने वाली नई चैट शुरू करने के लिए दाएं स्वाइप करें; बिना प्लान के सुविधा को तुरंत बनाने वाली चैट शुरू करने के लिए **▶ अभी बनाएं** पर क्लिक करें; छोड़ने के लिए बाएं स्वाइप करें।
158
+
159
+ **क्या dsh की साइडबार खोज किसी चैट को सिर्फ़ शीर्षक से नहीं, बल्कि उसके संदेशों के किसी शब्द से भी ढूंढ सकती है?** हां, **कंटेंट में खोज** के साथ (डिफ़ॉल्ट रूप से चालू): प्लगइन इंस्टॉल करने के बाद dsh एक बार रीस्टार्ट करें, फिर **वर्कस्पेस** के पास का आवर्धक लेंस इस्तेमाल करें। मिलने वाली चैट शब्द के आसपास का टेक्स्ट दिखाती हैं।
160
+
161
+ **क्या मैं OpenCode या Claude Code की तरह कोई टर्न वापस लेकर अपना प्रॉम्प्ट बदल सकता हूं?** हां, **टर्न रोलबैक** के साथ: संदेश पर **↶** पर क्लिक करें, **चैट और फ़ाइलें** चुनें, कंपोज़र में वापस आया टेक्स्ट बदलें और उसे भेजें।
162
+
163
+ **क्या मैं चैट को आर्काइव करने की जगह हटा सकता हूं?** हां, **चैट हटाएं** के साथ: **…** → **हटाएं…**। इतिहास ट्रैश में जाता है, इसलिए गलती होने पर उसे वापस लाया जा सकता है।
164
+
165
+ **मैं कैसे देखूं कि कोई चैट किस प्रोजेक्ट की है?** कंपोज़र के नीचे की पंक्ति देखें: **कंपोज़र में प्रोजेक्ट का नाम** (डिफ़ॉल्ट रूप से चालू) के साथ यह प्रोजेक्ट के नाम से शुरू होती है। फ़ोल्डर का पाथ देखने के लिए उस पर पॉइंटर ले जाएं।
166
+
167
+ **dsh कंपोज़र में ↑/↓ से संदेश इतिहास कैसे पाएं?** यह प्लगइन इंस्टॉल करें; खाली कंपोज़र में `↑` / `↓` भेजे गए संदेशों में आगे-पीछे जाते हैं।
168
+
169
+ **"continue" टाइप किए बिना रुका हुआ या विफल dsh टर्न कैसे जारी रखें?** इस प्लगइन के साथ, रुके हुए, विफल या बीच में कटे टर्न के बाद भेजें बटन **▶** बन जाता है; एक क्लिक से टर्न फिर से शुरू होता है।
170
+
171
+ **क्या dsh बंद करके दोबारा खोलने पर चल रही चैट जारी रहती हैं?** अपने आप नहीं: dsh ऐसे टर्न को बीच में रुका हुआ मार्क करता है और इंतज़ार करता है (लक्ष्य भी `/goal resume` का इंतज़ार करता है)। **सेटिंग → Composer Plus → रीस्टार्ट के बाद जारी रखें** चालू करें: तब dsh बंद होते समय जो चैट काम कर रही थीं, वे अगली बार शुरू होने पर अपने आप जारी रहती हैं।
172
+
173
+ **dsh में कतार वाले संदेशों का क्रम कैसे बदलें?** कतार वाले संदेश पर ⠿ हैंडल खींचें, या उस पर फ़ोकस करके `↑` / `↓` दबाएं।
174
+
175
+ **एक चैट में ऑटो रिव्यू को एक ही टूल के बारे में बार-बार पूछने से कैसे रोकें?** मंज़ूरी कार्ड पर **इस चैट के लिए अनुमति दें** पर क्लिक करें। यह सिर्फ़ उसी चैट में उसी तय टूल पर लागू होता है; इसे हेडर की चिप से रद्द करें।
176
+
177
+ **dsh साइडबार में सिर्फ़ आज इस्तेमाल किए गए प्रोजेक्ट कैसे दिखाएं?** साइडबार → व्यू के विकल्प (स्लाइडर आइकन) → **पिछले 2 घंटों में सक्रिय**। सभी प्रोजेक्ट दिखाने के लिए इसे फिर से चुनें।
178
+
179
+ **dsh में किसी प्रोजेक्ट के फ़ोल्डर का पाथ कैसे कॉपी करें?** साइडबार में प्रोजेक्ट पर राइट-क्लिक करें → **पाथ कॉपी करें**।
180
+
181
+ **dsh साइडबार में सभी प्रोजेक्ट एक साथ कैसे छोटे करें?** व्यू के विकल्पों (स्लाइडर आइकन) के पास वाले छोटा करने के बटन पर क्लिक करें। यह तब दिखता है, जब कम से कम एक प्रोजेक्ट खुला हो।
182
+
183
+ **dsh का कोई टास्क पूरा होने या मंज़ूरी मांगने पर macOS / Windows सूचनाएं कैसे पाएं?** **बैकग्राउंड सूचनाएं** चालू रखें (डिफ़ॉल्ट) और OS की सेटिंग में DeepSeek Harness के लिए सूचनाओं की अनुमति दें।
184
+
185
+ **DeepSeek Harness का इंटरफ़ेस तुर्की, स्पेनिश, जापानी… में कैसे बदलें?** सेटिंग → Composer Plus → **ऐप्लिकेशन की भाषा**।
186
+
187
+ **अपने iPhone से dsh कैसे इस्तेमाल करें?** `tether/ios` से Tether ऐप बनाएं (Xcode), **सेटिंग → Composer Plus → मोबाइल कनेक्ट (iPhone)** चालू करें, नीचे बाईं ओर **मोबाइल कनेक्ट** पर क्लिक करें, Tether में QR कोड स्कैन करें और **Approve** पर क्लिक करें। घर से दूर होने पर दोनों डिवाइस पर Tailscale इस्तेमाल करें।
188
+
189
+ **क्या यह डेस्कटॉप ऐप के साथ काम करता है?** हां: सेटिंग → प्लगइन → **प्लगइन जोड़ें** → `dsh-composer-plus`। dsh 0.2.0-rc.2 (डेस्कटॉप और वेब) और 0.2.1-rc.2 (वेब) पर टेस्ट किया गया।
190
+
191
+ ## डेवलपमेंट
192
+
193
+ स्क्रीनशॉट एक अस्थायी dsh से फिर से बनाए जाते हैं, जिसमें नकली मॉडल और बनाए गए डेमो प्रोजेक्ट (`acme-web`, `weather-cli`, `docs-site`) होते हैं, इसलिए उनमें कोई असली डेटा नहीं होता। सुविधाओं के थंबनेल `assets/features/` में जाते हैं (पैकेज के साथ आते हैं, सेटिंग में दिखते हैं); सिर्फ़ README वाली तस्वीरें `docs/images/` में जाती हैं (npm पैकेज में नहीं):
194
+
195
+ ```sh
196
+ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh/lib/bin.js
197
+ # sidebar project features (recent filter, Copy path, Collapse all): real-app test + their thumbnails
198
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
199
+ # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
200
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
201
+ # Order by status (fake model + Schedule): real-app test + its thumbnail
202
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
203
+ # every Settings feature row shows a loading screenshot
204
+ PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
205
+ # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
206
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
207
+ # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
208
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
209
+ # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
210
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
211
+ # 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 + its thumbnail
212
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
213
+ # Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
214
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
215
+ # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
216
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
217
+ ```
218
+
219
+ ```sh
220
+ npm run build:locales # after editing locales/<id>.json
221
+ npm test
222
+ ```
223
+
224
+ **नई सुविधाओं का नियम:** सेटिंग → Composer Plus में हर सुविधा की पंक्ति एक स्क्रीनशॉट दिखाती है। सुविधा का id `client.js` में `SHOT_OF` और `index.js` में `SHOTS` में जोड़ें, और `assets/features/<id>.webp` शिप करें (अस्थायी डेमो dsh से लिया गया, अंग्रेज़ी UI, लगभग 60 kB या कम)। सुविधा को उसी इमेज के साथ README टेबल में जोड़ें: `README.md` में और हर अनुवादित `README.<id>.md` में। जब किसी सुविधा का स्क्रीनशॉट नहीं होता, तो `test/shots.test.mjs` विफल होता है, और `test/browser-settings-shots.mjs` असली सेटिंग पेज जांचता है। हर बदलाव की पूरी चेकलिस्ट [AGENTS.md](AGENTS.md) में है।
225
+
226
+ टेस्ट असली `client.js` को नकली React/DOM पर और असली `index.js` (Host वाला हिस्सा) को एक अस्थायी git रिपॉज़िटरी पर चलाते हैं। Tether गेटवे के टेस्ट (`test/tether-gateway.test.mjs`) एक मॉक dsh होस्ट और असली TLS गेटवे इस्तेमाल करते हैं। iPhone ऐप `tether/ios` में है (देखें [tether/README.md](tether/README.md) और [tether/AGENTS.md](tether/AGENTS.md))। `node test/browser-history.mjs '<dsh web URL with ?token=…>'` एक अस्थायी `dsh web` पर, जिसका अपना `DSH_HOME` है, असली ब्राउज़र में इनपुट इतिहास जांचता है।
227
+
228
+ भाषा पैक सिर्फ़ डेटा वाली JSON फ़ाइलें हैं: `locales/<id>.json`। `npm run build:locales` उन्हें एक ही क्लाइंट एंट्री में जोड़ता है (कोई अनुवाद सेवा या रनटाइम डाउनलोड नहीं)। `npm test` हर पैक में सभी कुंजियां, एक जैसे प्लेसहोल्डर और लाइन ब्रेक, और सिस्टम/ओवरराइड व्यवहार जांचता है। लोकल रूप से इंस्टॉल किए गए Playwright के साथ अलग-थलग असली ऐप की जांच के लिए:
229
+
230
+ ```sh
231
+ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/bin.js
232
+ ```
233
+
234
+ ## License
235
+
236
+ MIT