dsh-composer-plus 1.17.0 → 1.18.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 CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  फिर dsh रीस्टार्ट करें। (CLI डेस्कटॉप प्रोफ़ाइल में इंस्टॉल नहीं कर सकता; उस प्रोफ़ाइल को ऐप खुद संभालता है।)
31
31
 
32
- > dsh का pnpm 24 घंटे से नए वर्शन छोड़ देता है। रिलीज़ के तुरंत बाद वर्शन भी लिखें: `dsh-composer-plus@1.17.0`।
32
+ > dsh का pnpm 24 घंटे से नए वर्शन छोड़ देता है। रिलीज़ के तुरंत बाद वर्शन भी लिखें: `dsh-composer-plus@1.18.0`।
33
33
 
34
34
  ## सुविधाएं
35
35
 
@@ -68,7 +68,10 @@ dsh plugin --profile web add dsh-composer-plus
68
68
  | **लक्ष्य जांच** | <a id="feature-goalcheck"></a>`/goal` से एक लक्ष्य शुरू करें। जब एजेंट किसी अपने-आप चलने वाले राउंड में लक्ष्य को पूरा मार्क करता है, तो लक्ष्य दो जांचों के बाद ही बंद होता है। पहले, प्रोजेक्ट की टेस्ट कमांड चैट के फ़ोल्डर में, चैट के सैंडबॉक्स मोड में चलती है। कमांड आपकी अपनी होती है या वह जो `package.json`, `Makefile`, `Cargo.toml`, `go.mod` या pytest में मिली। अगर एजेंट का अपना सबसे नया कदम इसी टेस्ट का सफल रन था, तो यह दोबारा नहीं चलती। फिर एक स्वतंत्र मॉडल कॉल, बिना टूल के, लक्ष्य, यह चैट, `git status` और टेस्ट का नतीजा पढ़ती है। मॉडल सबूतों की तालिका के साथ जवाब देता है: लक्ष्य का हर हिस्सा सत्यापित, गलत या अनसुलझा होता है, उसके सबूत और सुधार के साथ; लक्ष्य तभी बंद होता है जब हर हिस्सा सत्यापित हो। अगर कोई जांच विफल होती है, तो लक्ष्य सक्रिय रहता है, एजेंट हर खुला हिस्सा उसके सबूत और सुधार के साथ पढ़ता है, फिर अगला राउंड चलता है। लक्ष्य बार के नीचे एक पंक्ति (**लक्ष्य जांच**) टेस्ट, पिछला नतीजा और कितने हिस्से सत्यापित हुए, यह दिखाती है (तालिका देखने के लिए उस पर पॉइंटर ले जाएं)। **संपादित करें** से आप अपनी टेस्ट कमांड और समय या टोकन की सीमा तय करते हैं; सीमा पार होने पर लक्ष्य अवरुद्ध हो जाता है। टोकन सीमा में चैट के सबएजेंट भी गिने जाते हैं। **अभी चलाएं** लक्ष्य को बंद किए बिना जांच चलाता है। सेटिंग में इसका अपना **मॉडल** मेन्यू है (डिफ़ॉल्ट: **चैट के मॉडल जैसा**)। जब आप खुद लक्ष्य पूरा करते हैं, तो कुछ भी नहीं जांचा जाता। | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="स्क्रीनशॉट: लक्ष्य जांच"></a> |
69
69
  | **नई चैट में जारी रखें** | <a id="feature-handoffchat"></a>साइडबार में किसी चैट पर राइट-क्लिक करें (या उसका **…** मेन्यू खोलें) → **नई चैट में जारी रखें…**। चैट के अपने मॉडल को एक कॉल, चैट में जो दिखता है उससे एक हैंडऑफ़ नोट लिखती है: काम, आउटपुट, पूरा हुआ, फ़ैसले, खुले मुद्दे और अगला कदम (टूल कॉल और उनके नतीजे सबूत हैं; जिन कदमों को आपने रोलबैक किया, वे शामिल नहीं होते)। नोट एक डायलॉग में खुलता है: उसे पढ़ें और संपादित करें। **फिर से लिखें** एक नया नोट लिखता है। **नई चैट शुरू करें** (या `Cmd/Ctrl+Enter`) उसी प्रोजेक्ट में एक नई चैट खोलता है, जिसका पहला संदेश नोट और पुरानी चैट का लिंक होता है; पुरानी चैट जैसी है वैसी ही रहती है। जब कोई लंबी चैट भर जाए या धीमी हो जाए, या कल जारी रखना हो, तब इसका इस्तेमाल करें। प्रोजेक्ट में कुछ नहीं लिखा जाता। | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="स्क्रीनशॉट: नई चैट में जारी रखें"></a> |
70
70
  | **कॉन्टेक्स्ट का ब्योरा** | <a id="feature-contextbreakdown"></a>दायां साइडबार → `+` → **कॉन्टेक्स्ट**। पेज दिखाता है कि खुली चैट के मॉडल कॉन्टेक्स्ट को अभी क्या भर रहा है और कॉन्टेक्स्ट विंडो का कितना हिस्सा इस्तेमाल हो रहा है: सिस्टम प्रॉम्प्ट, प्रोजेक्ट निर्देश (AGENTS.md), Skills, आपके संदेश, एजेंट के जवाब और टूल कॉल, टूल नतीजे (टूल के हिसाब से), MCP नतीजे (सर्वर के हिसाब से), टूल की परिभाषाएं, कॉम्पैक्शन का सारांश और दूसरे कॉन्टेक्स्ट नोट, हर एक अपने टोकन और हिस्से के साथ। किसी हिस्से के टूल या सर्वर देखने के लिए उस पर क्लिक करें। यह सिर्फ़ चैट लॉग पढ़ता है, `/compact` और रोलबैक के बाद, और किसी मॉडल को कॉल नहीं करता; हर टर्न के बाद और **रीफ़्रेश करें** से यह फिर से पढ़ता है। इससे देखें कि कोई चैट धीमी या भरी हुई क्यों है, जैसे कोई बड़ा MCP टूल नतीजा या बहुत सारी टूल परिभाषाएं। | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="स्क्रीनशॉट: कॉन्टेक्स्ट का ब्योरा"></a> |
71
+ | **नियोजित चरण** | <a id="feature-plannedsteps"></a>डिफ़ॉल्ट रूप से बंद: इसे **सेटिंग → Composer Plus** में चालू करें। एजेंट को `plan_next_steps` टूल मिलता है: किसी कमांड वाले संदेश में ही वह अगली कमांड को सटीक आर्ग्युमेंट और एक शर्त के साथ योजना बना सकता है, जैसे “बिल्ड पास होने पर `npm test` चलाओ”। नतीजा शर्त पूरी करे तो Composer Plus नई मॉडल कॉल के बिना अगला चरण ख़ुद चलाता है, इसलिए लंबी चैट कम टोकन खर्च करती है। चरण चैट में एक छोटी लाइन “Composer Plus · Planned steps: ran `test` … without a model call” के रूप में दिखता है, उसके बाद उसकी टूल कॉल और नतीजा आते हैं। सिर्फ़ `bash`, `read`, `grep` और `glob` चरण; मंज़ूरी, सैंडबॉक्स और सुरक्षित फ़ाइलें हर चरण पर हमेशा की तरह लागू रहती हैं। शर्त पूरी न हो, एक साथ दो चरण तैयार हों, आख़िरी चरण के बाद और जब आप संदेश भेजें, तब मॉडल फिर से जवाब देता है। यह विचार HarnessMM (arXiv 2610.32813) से आया है। | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="स्क्रीनशॉट: नियोजित चरण"></a> |
71
72
  | **सुरक्षित फ़ाइलें** | <a id="feature-protectedfiles"></a>डिफ़ॉल्ट रूप से चालू। एजेंट के अपने फ़ाइल टूल आपके पैटर्न से मेल खाने वाली फ़ाइलें न पढ़ सकते हैं, न बदल सकते हैं: **पढ़ना और लिखना** पैटर्न के लिए किसी फ़ाइल पर `read`, `read_image` और `grep` मना किए जाते हैं, और दोनों तरह के पैटर्न के लिए `write`, `edit` और `str_replace_editor`। एजेंट वजह पढ़ता है और उसे आपसे पूछने को कहा जाता है। डिफ़ॉल्ट पैटर्न `.env*`, `*.pem` और `*.key` हैं। सेटिंग → Composer Plus → **सुरक्षित फ़ाइलें**: एक पैटर्न जोड़ें (जैसे `published/**` या `config/*.yml`), **पढ़ना और लिखना** और **सिर्फ़ लिखना** के बीच बदलने के लिए उसकी तरह पर क्लिक करें, ✕ से उसे हटाएं, या **डिफ़ॉल्ट इस्तेमाल करें** पर क्लिक करें। `/` के बिना पैटर्न किसी भी फ़ोल्डर में फ़ाइल के नाम से मेल खाता है। यह एक सुरक्षा रेलिंग है, सैंडबॉक्स नहीं: शेल कमांड (`cat .env`), स्क्रिप्ट या MCP टूल फिर भी फ़ाइल तक पहुंच सकते हैं (सीमाएं देखें)। | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="स्क्रीनशॉट: सुरक्षित फ़ाइलें"></a> |
73
+ | **ब्लॉक की गई कमांड** | <a id="feature-blockedcommands"></a>डिफ़ॉल्ट रूप से चालू, खाली सूची के साथ। एजेंट की शेल कमांड (`bash`, `pwsh`) आपके नियमों से मेल खाने वाली कमांड नहीं चला सकतीं: **ब्लॉक** नियम कॉल को मना करता है (एजेंट वजह पढ़ता है और उसे आपसे पूछने को कहा जाता है), **पहले पूछना** नियम dsh का मंज़ूरी कार्ड दिखाता है, और कमांड सिर्फ़ तब चलती है जब आप उसकी अनुमति देते हैं। सेटिंग → Composer Plus → **ब्लॉक की गई कमांड**: एक नियम टाइप करें (जैसे `npm publish`, `git push --force` या `ssh *192.168.2.19`), **ब्लॉक** और **पहले पूछना** के बीच बदलने के लिए उसकी तरह पर क्लिक करें, फिर **जोड़ें** पर क्लिक करें; किसी नियम की तरह बदलने के लिए उसकी तरह पर क्लिक करें, ✕ से नियम हटाएं। नियम एक कमांड का नाम और वे शब्द होते हैं, जो इसी क्रम में उसके बाद आने चाहिए; `*` किसी भी टेक्स्ट से मेल खाता है। यह `&&`, `;`, `\|` के बाद, `$(…)`, `bash -c "…"` या `eval` के अंदर, और `sudo` या `env` के बाद भी कमांड ढूंढता है। यह एक सुरक्षा रेलिंग है, सैंडबॉक्स नहीं: कोई वैरिएबल (`$CMD`), स्क्रिप्ट फ़ाइल या दूसरा प्रोग्राम फिर भी कमांड चला सकता है (सीमाएं देखें)। | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="स्क्रीनशॉट: ब्लॉक की गई कमांड"></a> |
74
+ | **टास्क बोर्ड** | <a id="feature-taskboard"></a>बायां साइडबार → **टास्क बोर्ड**। आपके और एजेंट के लिए आपके dsh प्रोजेक्ट का कानबान बोर्ड: **करना है**, **प्रगति में**, **समीक्षा** और **पूरा हुआ** (और **बैकलॉग**, नीचे देखें)। बाईं ओर कोई प्रोजेक्ट या **सभी प्रोजेक्ट** चुनें। **नया टास्क** (या `n`) एक नया कार्ड खोलता है: उसका शीर्षक लिखें और `Enter` दबाएं। किसी कार्ड को दूसरे कॉलम में या दो कार्ड के बीच खींचें। कार्ड पर क्लिक करके उसकी **स्थिति**, **टैग**, **मैन्युअल** (एजेंट इसे छोड़ देते हैं), विवरण (Markdown) और टिप्पणियां देखें और बदलें। `/` हर प्रोजेक्ट में खोजता है, `h` सिर्फ़ मैन्युअल टास्क दिखाता है, और एक्सपोर्ट बटन बोर्ड को Markdown या JSON के रूप में सेव करता है। एजेंट को बोर्ड टूल मिलते हैं: किसी चैट से "बोर्ड से अगला टास्क लो" कहें, तो एजेंट **करना है** का सबसे ऊपर वाला कार्ड **प्रगति में** ले जाता है, जो किया उस पर टिप्पणी करता है और कार्ड को **समीक्षा** में ले जाता है; उसे **पूरा हुआ** में आप ले जाते हैं। जिस प्रोजेक्ट में खुले टास्क हैं, उसकी हर चैट को यह नियम अपने-आप मिलता है। सेटिंग → Composer Plus → **टास्क बोर्ड** में **बैकलॉग** कॉलम का स्विच है: इस कॉलम के कार्ड एजेंट आप पर छोड़ते हैं। | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="स्क्रीनशॉट: टास्क बोर्ड"></a> |
72
75
  | **प्रोजेक्ट मेमोरी** | <a id="feature-projectmemory"></a>डिफ़ॉल्ट रूप से बंद: इसे **सेटिंग → Composer Plus** में चालू करें। हर प्रोजेक्ट फ़ोल्डर की अपनी मेमोरी होती है, जिसे उस प्रोजेक्ट की आगे की चैट पढ़ती हैं, जैसे DS Bot हर Bot के लिए एक मेमोरी रखता है। हर पूरे हुए टर्न के बाद चैट के मॉडल को एक कॉल नए संदेश पढ़ती है (रोलबैक किए गए नहीं), आपकी लंबे समय तक रहने वाली पसंद, फ़ैसले और तथ्य छोटे नोट के रूप में रखती है, और पुराने नोट बदलती या हटाती है। एजेंट खुद भी नोट सेव कर, हटा और खोज सकता है (`memory_remember`, `memory_forget`, `memory_recall`)। कोई नोट ग्लोबल भी हो सकता है: उसे हर प्रोजेक्ट पढ़ता है। नई चैट को नोट उसके सिस्टम प्रॉम्प्ट में मिलते हैं; बाद में सेव हुआ नोट अगली चैट से दिखता है। फ़ाइलें dsh के होम फ़ोल्डर में Markdown हैं (`storages/dsh-composer-plus/memory/`), कभी प्रोजेक्ट फ़ोल्डर में नहीं। उसी पंक्ति में **मेमोरी खोलें** हर सेव किया गया नोट प्रोजेक्ट के हिसाब से (और ग्लोबल मेमोरी) दिखाता है, फ़िल्टर के साथ। अपने शब्दों में लिखें कि क्या बदलना है (जैसे "मैंने yarn छोड़कर pnpm अपनाया"), फिर **बदलावों का प्रीव्यू**: dsh का डिफ़ॉल्ट मॉडल बदलाव सुझाता है, और सिर्फ़ **लागू करें** उन्हें सेव करता है। Tether में: चैट शीर्षक मेनू → Project memory। | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="स्क्रीनशॉट: प्रोजेक्ट मेमोरी"></a> |
73
76
  | **इस चैट के लिए अनुमति दें** | <a id="feature-allowforchat"></a>जब ऑटो रिव्यू आपसे पूछता है, तो मंज़ूरी कार्ड पर **इस चैट के लिए अनुमति दें** दिखता है। इसके बाद उसी चैट में वही टूल किसी भी आर्ग्युमेंट के साथ बिना पूछे चलता है, जब तक समय सीमा खत्म नहीं होती (डिफ़ॉल्ट रूप से 1 घंटा; इसे **सेटिंग → Composer Plus → इस चैट के लिए अनुमति दें** में चुनें)। फिर एजेंट दोबारा पूछता है। हेडर की एक चिप अनुमतियों की सूची उनके खत्म होने के समय के साथ दिखाती है और उन्हें रद्द करती है। रीस्टार्ट के बाद भी अनुमतियां बनी रहती हैं। | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="स्क्रीनशॉट: इस चैट के लिए अनुमति दें"></a> |
74
77
  | **प्रोजेक्ट की स्थिति** | <a id="feature-projectstatus"></a>साइडबार में प्रोजेक्ट की पंक्ति वही स्पिनर / इंतज़ार / पूरा होने का संकेत दिखाती है, जो उसकी चैट दिखाती हैं। इसलिए बंद (collapsed) प्रोजेक्ट भी बताता है कि अंदर कोई चैट काम कर रही है या उसे आपकी ज़रूरत है। सबसे पहले आपका इंतज़ार कर रही चैट दिखती है, फिर पूरी हुई ऐसी चैट जिसे आपने अभी तक नहीं खोला (हरा बिंदु, तब भी जब कोई दूसरी चैट अभी चल रही हो), फिर स्पिनर। विवरण देखने के लिए उस पर पॉइंटर ले जाएं। **वर्कस्पेस ट्री** में पैरेंट फ़ोल्डर की पंक्ति उसके अंदर के हर प्रोजेक्ट (जैसे `.worktrees/` में हर ब्रांच फ़ोल्डर) की चैट भी दिखाती है, तब भी जब फ़ोल्डर बंद (collapsed) हो। | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="स्क्रीनशॉट: प्रोजेक्ट की स्थिति"></a> |
@@ -166,7 +169,9 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
166
169
  - **लक्ष्य जांच:** यह सिर्फ़ तब चलती है, जब एजेंट किसी अपने-आप चलने वाले राउंड में `/goal` को पूरा मार्क करता है (या जब आप **अभी चलाएं** पर क्लिक करते हैं)। Host वाला हिस्सा टेस्ट कमांड को चैट के फ़ोल्डर में, चैट के सैंडबॉक्स मोड में चलाता है (dsh के अपने `bash` टूल की तरह: फ़ाइल एक्सेस की वही नीति; अगर वह सैंडबॉक्स शुरू नहीं हो पाता, तो टेस्ट नहीं चलता और जांच विफल होती है)। कमांड ढूंढने के लिए यह सिर्फ़ `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` और `pytest.ini` पढ़ता है, फ़ोल्डर के अंदर की सामान्य फ़ाइलों के रूप में (फ़ोल्डर से बाहर जाने वाला symlink नहीं, FIFO नहीं)। फिर यह लक्ष्य, लक्ष्य शुरू होने के बाद की चैट (आपके संदेश, एजेंट के जवाब, 1,000 अक्षरों तक काटी गई टूल कॉल और हर टूल नतीजे के आखिरी 2,000 अक्षर; रीज़निंग और रोलबैक किए गए कदम नहीं; ज़्यादा से ज़्यादा लगभग 60,000 अक्षर, सबसे नया हिस्सा), `git status --short` और टेस्ट आउटपुट का आखिरी हिस्सा **लक्ष्य जांच** में चुने गए मॉडल (डिफ़ॉल्ट रूप से चैट का अपना मॉडल) को बिना टूल वाले एक अनुरोध के रूप में भेजता है। टूल आउटपुट में वह हो सकता है जो एजेंट ने पढ़ा, इसलिए इस अनुरोध में, चैट की तरह ही, आपकी फ़ाइलों के हिस्से हो सकते हैं। चैट या प्रोजेक्ट में कुछ नहीं लिखा जाता। आपकी टेस्ट कमांड, सीमाएं, पिछला नतीजा (उसके आउटपुट के आखिरी हिस्से के साथ) और चुना गया मॉडल `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` में रहते हैं (सिर्फ़ मालिक की फ़ाइल, सबसे नई 500 चैट)।
167
170
  - **नई चैट में जारी रखें:** जब तक आप क्लिक नहीं करते, कुछ नहीं चलता। फिर Host हिस्सा चैट (जैसे लक्ष्य जांच उसे पढ़ती है: रीज़निंग और रोलबैक किए गए कदम नहीं) चैट के अपने मॉडल को भेजता है और हैंडऑफ़ नोट दिखाता है; सिर्फ़ **नई चैट शुरू करें** नई चैट बनाता है। प्रोजेक्ट में कुछ नहीं लिखा जाता।
168
171
  - **कॉन्टेक्स्ट का ब्योरा:** Host पर सिर्फ़ चैट लॉग पढ़ता है; कोई मॉडल कॉल नहीं, कोई प्रोजेक्ट फ़ाइल नहीं।
172
+ - **टास्क बोर्ड:** बोर्ड (आपके टास्क के शीर्षक, विवरण, टैग और टिप्पणियां, प्रोजेक्ट फ़ोल्डर के पाथ और उनकी छोटी id) `$DSH_HOME/storages/dsh-composer-plus/board.json` में रहता है (सिर्फ़ मालिक की फ़ाइल); स्विच उसके बगल में `board-switch.json` में रहता है। कुछ भी आपके कंप्यूटर से बाहर नहीं जाता और किसी प्रोजेक्ट फ़ोल्डर में कुछ नहीं लिखा जाता। बोर्ड टूल एजेंट को वह देते हैं जो आपने बोर्ड पर लिखा है, इसलिए जब कोई एजेंट किसी टास्क को पढ़ता है तो उसका टेक्स्ट चैट के मॉडल तक पहुंचता है। खराब बोर्ड फ़ाइल `board.json.broken-<time>` के रूप में रखी जाती है और बोर्ड खाली शुरू होता है।
169
173
  - **सुरक्षित फ़ाइलें:** सूची और स्विच `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` में रहते हैं (सिर्फ़ मालिक की फ़ाइल)। जांच हर फ़ाइल टूल कॉल का सिर्फ़ पाथ (और उसका असली पाथ) पढ़ती है, फ़ाइल को कभी नहीं।
174
+ - **ब्लॉक की गई कमांड:** नियम और स्विच `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` में रहते हैं (सिर्फ़ मालिक की फ़ाइल)। जांच हर `bash` और `pwsh` कॉल का सिर्फ़ कमांड टेक्स्ट पढ़ती है; यह न कुछ चलाती है, न कुछ भेजती है।
170
175
  - **प्रोजेक्ट मेमोरी:** जब तक आप इसे चालू नहीं करते, यह बंद रहती है। चालू रहने पर, सबसे ऊपर के स्तर की चैट का हर टर्न पूरा होने के बाद Host हिस्सा पिछली समीक्षा के बाद आए उस चैट के अपने नए संदेश (आपके संदेश और एजेंट के टेक्स्ट जवाब; टूल आउटपुट, रीज़निंग, छिपा संदर्भ और रोलबैक किए गए संदेश नहीं; फ़ोर्क की गई चैट में पैरेंट चैट की कॉपी शामिल नहीं; ज़्यादा से ज़्यादा लगभग 16,000 अक्षर) और सेव किए गए नोट, बिना टूल वाले एक अनुरोध के रूप में चैट के अपने मॉडल को भेजता है। नोट `$DSH_HOME/storages/dsh-composer-plus/memory/` में Markdown फ़ाइलें हैं (सिर्फ़ मालिक के लिए): हर प्रोजेक्ट फ़ोल्डर के लिए `projects/<id>/` (`<id>` फ़ोल्डर के असली पाथ का हैश है; `project.json` में फ़ोल्डर लिखा रहता है), `global/`, `journal.jsonl` (हर बदलाव, पहले और बाद वाली लाइन के साथ) और `reviewed.json` (हर चैट कहां तक पढ़ी गई)। प्रोजेक्ट फ़ोल्डर में कुछ नहीं लिखा जाता। जो नोट कुंजी, टोकन, पासवर्ड या पहचान संख्या जैसे दिखते हैं, वे अस्वीकार होते हैं। किसी प्रोजेक्ट के नोट उस फ़ोल्डर की हर नई चैट के सिस्टम प्रॉम्प्ट में जाते हैं, इसलिए वे उस चैट के हर अनुरोध के साथ मॉडल तक पहुंचते हैं। स्विच उसी जगह `memory.json` में है। जब तक आप **बदलावों का प्रीव्यू** नहीं दबाते, **मेमोरी खोलें** कुछ नहीं भेजता; दबाने पर यह दिखाए गए नोट और आपका टेक्स्ट बिना टूल वाले एक अनुरोध में dsh के डिफ़ॉल्ट मॉडल को भेजता है। बदलाव सिर्फ़ **लागू करें** पर लिखे जाते हैं, जर्नल में `editor` के साथ। Tether उसी रूट से नोट पढ़ता और बदलता है।
171
176
  - **बैकअप:** कुछ भी आपके कंप्यूटर से बाहर नहीं जाता। आर्काइव `~/Desktop/dsh-backups` में जाते हैं (सिर्फ़ मालिक की फ़ाइलें)। सीक्रेट आर्काइव में नहीं होते: क्रेडेंशियल फ़ाइलें (`.credentials.yaml`, `.env`), की फ़ाइलें (`.pem`, `.key`, `.p12`, `.pfx`) और yml फ़ाइलों में token, secret, password और API key सेटिंग के मान मास्क किए जाते हैं; उनकी असली कॉपी उसी फ़ोल्डर के `composer-plus-vault/<archive>/` में (सिर्फ़ मालिक के लिए), सिर्फ़ इसी कंप्यूटर पर रहती हैं। **दूसरे कंप्यूटर के लिए** कोई vault कॉपी नहीं करता: वे सीक्रेट वहां फिर से डालें। आपके चैट लॉग, सेटिंग और dsh होम का बाकी हिस्सा आर्काइव में जैसे हैं वैसे ही रहते हैं: फ़ोल्डर को `$DSH_HOME` की तरह ही निजी रखें। बैकअप फ़ाइलों को `O_NOFOLLOW | O_NONBLOCK` से पढ़ता है; symlink को लिंक के रूप में सेव किया जाता है (उसके टारगेट तक कभी नहीं जाया जाता), और FIFO या डिवाइस छोड़ दिया जाता है। अपने-आप बैकअप का स्विच और सेटिंग `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json` में हैं, रेस्क्यू कंसोल का स्विच `rescue-console.json` में है, और dsh चलते समय `running/host-<pid>.json` में हर dsh प्रोसेस दर्ज रहता है (रेस्क्यू कंसोल इन्हें पढ़कर बहाली से मना करता है)।
172
177
  - **रेस्क्यू कंसोल:** टर्मिनल का एक मेन्यू; यह कोई नेटवर्क पोर्ट नहीं खोलता। बहाली सिर्फ़ dsh होम के बगल में एक नए फ़ोल्डर में लिखती है (फ़ाइलें `O_EXCL | O_NOFOLLOW` के साथ, symlink सबसे आखिर में और उनके टारगेट तक कभी नहीं जाया जाता), और ऐसा आर्काइव मना कर देती है जिसमें असुरक्षित नाम (`..`, absolute पाथ), डिवाइस या FIFO, एक से ज़्यादा टॉप फ़ोल्डर, या किसी लिंक के नीचे की एंट्री हो।
@@ -189,7 +194,7 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
189
194
  - **चैट पंक्ति पर ब्रांच लेबल नहीं है:** यह वर्शन इंस्टॉल करने के बाद से उस चैट में कोई टर्न नहीं हुआ, उसका फ़ोल्डर git रिपॉज़िटरी नहीं है, या **चैट पंक्तियों पर Git ब्रांच** बंद है। अपडेट के बाद dsh रीस्टार्ट करें (ब्रांच Host वाला हिस्सा दर्ज करता है)।
190
195
  - **लक्ष्य जांच बताती है कि टेस्ट कोड 127 या "not found" के साथ बंद हुआ:** Finder या Dock से शुरू किए गए dsh का PATH आपके टर्मिनल से छोटा हो सकता है, इसलिए उसे `npm`, `pnpm` या `cargo` नहीं मिलता। dsh को टर्मिनल से शुरू करें, या **लक्ष्य जांच** → **संपादित करें** में पूरे पाथ के साथ अपनी टेस्ट कमांड सेट करें। **अभी चलाएं** नतीजा तुरंत दिखाता है।
191
196
  - **लक्ष्य बंद नहीं होता और एजेंट काम करता रहता है:** **लक्ष्य जांच** को कोई विफल टेस्ट या अधूरा काम मिला; लक्ष्य के नीचे की पंक्ति वजह दिखाती है (ब्योरा देखने के लिए नतीजे पर पॉइंटर ले जाएं)। वजह या टेस्ट कमांड ठीक करें, या `/goal` या लक्ष्य बार से लक्ष्य खुद पूरा करें (उसकी जांच नहीं होती)।
192
- - **रिलीज़ के तुरंत बाद इंस्टॉल विफल होता है:** वर्शन जोड़ें (`dsh-composer-plus@1.17.0`), ऊपर इंस्टॉल वाला नोट देखें।
197
+ - **रिलीज़ के तुरंत बाद इंस्टॉल विफल होता है:** वर्शन जोड़ें (`dsh-composer-plus@1.18.0`), ऊपर इंस्टॉल वाला नोट देखें।
193
198
  - **अभी बैकअप लें कहता है "बैकअप की दूसरी कार्रवाई चल रही है":** किसी दूसरी dsh विंडो में या रेस्क्यू कंसोल में कोई कार्रवाई चल रही है (दोनों बैकअप फ़ोल्डर में एक लॉक फ़ाइल, `.composer-plus.lock`, साझा करते हैं)। उसके पूरा होने का इंतज़ार करें। अगर कोई कार्रवाई नहीं चल रही, तो अगली क्लिक पर बंद हो चुकी प्रोसेस का लॉक ले लिया जाता है।
194
199
  - **रेस्क्यू कंसोल कहता है "dsh is running":** पहले dsh बंद करें। अगर dsh सच में बंद है, तो संदेश में बताई गई फ़ाइल किसी क्रैश के बाद बची रह गई है: उसे हटाएं और फिर से कोशिश करें।
195
200
  - **बहाली के बाद dsh शुरू नहीं होता या कोई प्लगइन नहीं है:** किसी प्रोफ़ाइल के प्लगइन पैकेज फिर से इंस्टॉल करने होंगे। बहाली के बाद रेस्क्यू कंसोल यह करने का विकल्प देता है; या `$DSH_HOME/profiles/` के नीचे के हर उस फ़ोल्डर में `pnpm install` चलाएं, जिसकी सूची वह दिखाता है। जो सीक्रेट vault में नहीं थे (दूसरा कंप्यूटर), उन्हें फिर से डालना होगा: कंसोल उनकी सूची दिखाता है।
@@ -239,8 +244,11 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
239
244
  - **प्रॉम्प्ट बेहतर करें** सिर्फ़ प्रोजेक्ट का छोटा सारांश, बदले गए पाथ और वे पाथ देखता है जिनके नाम आपके शब्दों से मिलते हैं: खुद कोड नहीं। इसलिए यह सही फ़ाइल चूक सकता है, और सिर्फ़ वही पाथ बताता है जो उसे दिए गए थे। भेजने से पहले नया टेक्स्ट पढ़ें। यह `/goal <लक्ष्य>` के अलावा किसी स्लैश कमांड पर, `/goal` के किसी कंट्रोल शब्द (`clear`, `pause`, `resume`) पर या फ़ाइल या सिंबल चिप वाले संदेश पर नहीं चलता (नया टेक्स्ट सादा टेक्स्ट होता है, इसलिए चिप खो जाती), और एक संदेश में ज़्यादा से ज़्यादा 8,000 अक्षर हो सकते हैं। `/goal` के किसी लक्ष्य के लिए यह शर्तें सिर्फ़ ड्राफ़्ट और कॉन्टेक्स्ट से लिखता है; बहुत सख़्त शर्त से लक्ष्य के राउंड ज़्यादा लग सकते हैं, इसलिए भेजने से पहले उसे पढ़ें। इमेज जुड़ी रहती हैं: सिर्फ़ टेक्स्ट बदलता है। हर क्लिक पर एक मॉडल कॉल होती है; किसी शक्तिशाली मॉडल को एक मिनट लग सकता है (`Esc` रद्द करता है)।
240
245
  - **लक्ष्य जांच** सिर्फ़ वह पूरा होना जांचती है, जो एजेंट किसी अपने-आप चलने वाले लक्ष्य राउंड में करता है: चैट में आपके कहने पर किया गया पूरा होना, `/goal` और लक्ष्य बार नहीं जांचे जाते। एजेंट खुद टेस्ट या टेस्ट कमांड की फ़ाइलें बदल सकता है; सत्यापक चैट पढ़ता है और यह देख सकता है, पर वह दोनों तरफ़ गलत हो सकता है (गलत "पूरा नहीं हुआ" एक और राउंड लेता है; गलत "पूरा हुआ" लक्ष्य बंद कर देता है)। सत्यापक चैट और `git status` देखता है, खुद कोड नहीं। टेस्ट रन तभी दोबारा इस्तेमाल होता है, जब फ़ाइलें बदल सकने वाला एजेंट का सबसे नया कदम उसी फ़ोल्डर में बिल्कुल उसी कमांड का एजेंट का अपना सफल `bash` रन था; पाइप (`| tail`) या `&&` वाली कमांड दोबारा इस्तेमाल नहीं होती। बजट टर्न खत्म होने पर मापा जाता है, इसलिए एक टर्न उससे आगे जा सकता है। टोकन बजट में चैट की सबएजेंट चैट की कॉल भी गिनी जाती हैं (हर टर्न के अंत में उनके सेव किए गए लॉग से पढ़ी जाती हैं, इसलिए बहुत सबएजेंट वाली चैट की जांच में थोड़ा ज़्यादा समय लगता है)। सबूत की तालिका सत्यापक के खुद चैट पढ़ने से बनती है: जिस हिस्से को वह सत्यापित कहता है, अगर वह अहम है, तो उसे आप भी खुद देखें। जांच चलते समय `update_goal` इंतज़ार करता है (टेस्ट ज़्यादा से ज़्यादा 15 मिनट, सत्यापक ज़्यादा से ज़्यादा 3 मिनट)। फ़ोर्क को नया चैट id मिलता है, इसलिए वह पैरेंट चैट की अपनी टेस्ट कमांड और सीमाओं के बिना शुरू होता है। सत्यापक तक पहुंचने वाले हर पूरा होने पर एक मॉडल कॉल लगती है।
241
246
  - **सुरक्षित फ़ाइलें** एक सुरक्षा रेलिंग है, सैंडबॉक्स नहीं। यह dsh के अपने फ़ाइल टूल (`read`, `read_image`, किसी फ़ाइल पर `grep`, `write`, `edit`, `str_replace_editor`) को कवर करती है। कोई शेल कमांड (`cat .env`), एजेंट की लिखी स्क्रिप्ट, किसी सबएजेंट का शेल, कोई MCP टूल, `glob` सूची और पूरे फ़ोल्डर पर `grep` फिर भी किसी सुरक्षित फ़ाइल तक पहुंच सकते हैं। असली सीमा के लिए dsh के सैंडबॉक्स मोड इस्तेमाल करें या सीक्रेट को प्रोजेक्ट फ़ोल्डर से बाहर रखें। पैटर्न `*`, `**` और `?` समझते हैं, `{a,b}` या `[ab]` नहीं, और बड़े-छोटे अक्षरों में फ़र्क नहीं करते।
247
+ - **ब्लॉक की गई कमांड** एक सुरक्षा रेलिंग है, सैंडबॉक्स नहीं। यह सिर्फ़ dsh के `bash` और `pwsh` टूल का कमांड टेक्स्ट पढ़ती है। कमांड का नाम रखने वाला कोई वैरिएबल या एलियास (`CMD=npm; $CMD publish`), कोई शेल फ़ंक्शन, एजेंट की लिखी स्क्रिप्ट फ़ाइल, कोई दूसरा प्रोग्राम (`python -c`, `node -e`, `make`), कोई MCP टूल और आपका अपना टर्मिनल फिर भी उसे चला सकते हैं। कोई नियम आपकी चाह से ज़्यादा कमांड से मेल खा सकता है: कमांड का कोई भी शब्द कमांड का नाम हो सकता है (`echo npm publish`, `npm publish` से मेल खाता है), और नियम के शब्दों के बीच दूसरे शब्द आ सकते हैं (`git push --force`, `git push origin main --force` से भी मेल खाता है)। जब कोई नियम बहुत ज़्यादा कमांड से मेल खाए, तो उसे लंबा करें। **पहले पूछना** के लिए ऐसी चैट चाहिए जो पूछ सके: जिस चैट की मंज़ूरी नीति never है (जैसे सौंपा गया सबएजेंट), उसमें dsh कार्ड नहीं दिखा सकता, इसलिए कॉल वजह के साथ मना कर दी जाती है। मंज़ूरी कार्ड वजह अंग्रेज़ी में दिखाता है। **इस चैट के लिए अनुमति दें** किसी **पहले पूछना** कार्ड का जवाब नहीं देता।
242
248
  - **नई चैट में जारी रखें** चैट (संदेश, टूल कॉल और हर टूल नतीजे का आखिरी हिस्सा, ज़्यादा से ज़्यादा लगभग 60,000 अक्षर, सबसे नया हिस्सा) चैट के अपने मॉडल को भेजता है। हैंडऑफ़ नोट से कोई फ़ैसला या फ़ाइल छूट सकती है: शुरू करने से पहले उसे पढ़ें। नई चैट सिर्फ़ नोट और लिंक की गई चैट को जानती है (dsh पुरानी चैट को सिर्फ़ पढ़ने लायक कॉन्टेक्स्ट के रूप में जोड़ता है); उसका मॉडल कॉन्टेक्स्ट छोटा शुरू होता है, पुरानी चैट जैसी है वैसी रहती है। हर चैट के लिए एक समय में एक ही नोट या शुरुआत चलती है।
243
249
  - **कॉन्टेक्स्ट का ब्योरा** dsh के अपने नियम (हर टोकन पर लगभग 4 अक्षर) से अनुमान दिखाता है, वही नियम जो dsh की कॉन्टेक्स्ट रिंग में है; मॉडल की अपनी गिनती अलग हो सकती है। टूल की परिभाषाएं सबसे नए अनुरोध की होती हैं। यह कॉन्टेक्स्ट वैसा दिखाता है जैसा चैट लॉग में है; अभी चल रहा टर्न अपने अगले कदम के बाद दिखता है।
250
+ - **नियोजित चरण** से टोकन तभी बचते हैं जब मॉडल सच में योजना बनाए: चालू रहने पर हर अनुरोध में `plan_next_steps` टूल और एक छोटा निर्देश (लगभग 500 टोकन) जाता है, उन चैट में भी जहाँ मॉडल कभी योजना नहीं बनाता। शर्त सिर्फ़ वही साबित करती है जो उसमें लिखा है (जैसे: बिल्ड का एग्ज़िट कोड 0 था), यह नहीं कि काम सही है। `ok` dsh के अपने नतीजे वाले निशान पढ़ता है (`[exit code: N]`, टाइमआउट, सैंडबॉक्स से इनकार); जो कमांड शून्य से अलग एग्ज़िट कोड दिए बिना विफल हो, वह पास मानी जाती है। चरण एक-एक करके चलते हैं; एक साथ तैयार दो चरण मॉडल को लौटते हैं। चरण का संदेश चैट के मॉडल के असिस्टेंट संदेश के रूप में सेव होता है (dsh में प्लगइन के लिखे संदेश के लिए कोई निशान नहीं है), इसलिए उसके टेक्स्ट में लिखा होता है कि इसे Composer Plus ने चलाया। Tether में नहीं है।
251
+ - **टास्क बोर्ड** सिर्फ़ dsh के प्रोजेक्ट जानता है: किसी प्रोजेक्ट के बाहर की चैट **सभी प्रोजेक्ट** दिखाती है, और हर चैट की अपनी ब्रांच का फ़ोल्डर (`<project>/.worktrees/<name>`) अपने प्रोजेक्ट में गिना जाता है। प्रोजेक्ट id (`acme#12`) फ़ोल्डर के नाम से आती हैं और dsh में प्रोजेक्ट का नाम बदलने पर भी वही रहती हैं। "बोर्ड को अपडेट रखें" नियम किसी चैट में तभी जाता है जब उसके प्रोजेक्ट में खुले टास्क हों; जिस चैट को यह मिल गया, उसमें यह बना रहता है। एजेंट से कहा जाता है कि वे **पूरा हुआ**, **बैकलॉग** और मैन्युअल टास्क आप पर छोड़ें, लेकिन टूल इसे मना नहीं करते: एजेंट फिर भी ऐसा कार्ड दूसरे कॉलम में ले जा सकता है। सुविधा चालू रहने तक बोर्ड टूल हर चैट की टूल सूची में रहते हैं (हर अनुरोध में लगभग 1,000 टोकन); अगर आप बोर्ड इस्तेमाल नहीं करते तो इसे बंद करें। पेज दिखने के दौरान हर 2 सेकंड में बोर्ड पढ़ता है; एजेंट का बदलाव इतने समय में दिख जाता है। जब एजेंट वही फ़ील्ड बदल रहा हो, तब आपका बदला गया टेक्स्ट सेव नहीं होता: पैनल नया टेक्स्ट और वजह दिखाता है। तस्वीरें, कंप्यूटरों के बीच git सिंक और नेटवर्क पर शेयरिंग नहीं हैं (Kanzo में ये हैं)। विचार और रूप emanuele-em के [Kanzo](https://github.com/emanuele-em/kanzo) (AGPL-3.0) से लिए गए हैं; Composer Plus उसका कोई कोड इस्तेमाल नहीं करता।
244
252
  - **रोकने के बाद भेजा संदेश पहले चलाएँ** केवल चैट रोकने के बाद काम करता है (या किसी विफल टर्न के बाद, या ऐसी चैट खोलने पर जिसमें अभी कतार है): किसी टर्न के चलते समय भेजा गया संदेश पहले की तरह कतार के अंत में प्रतीक्षा करता है। यह केवल आपके अपने कतार वाले संदेशों से आगे जाता है: अगर कतार में कोई लक्ष्य राउंड या किसी सवाल का जवाब प्रतीक्षा कर रहा है, तो dsh का अपना क्रम रहता है। यह dsh का एक ऐसा हिस्सा पढ़ता है जो सार्वजनिक API नहीं है (रोका गया टर्न अभी ख़त्म हो रहा है या नहीं); अगर किसी dsh अपडेट में उसका नाम बदलता है, तो संदेश उस टर्न के ख़त्म होने के बाद ही आगे जाता है। सबएजेंट चैट dsh का अपना क्रम रखती हैं।
245
253
  - **प्रोजेक्ट मेमोरी** चैट के पहले फ़ोल्डर (dsh के प्रोजेक्ट फ़ोल्डर) की होती है: जो चैट `cd` से फ़ोल्डर बदलती है, वह अपने पहले प्रोजेक्ट की मेमोरी ही रखती है, और वही फ़ोल्डर उन्हीं फ़ाइलों तक जाने वाले दूसरे पाथ से खोला जाए तो वह भी यही मेमोरी साझा करता है। चैट शुरू होते समय अपना मेमोरी हिस्सा स्थिर कर देती है, इसलिए बाद में सेव हुआ नोट अगली चैट से दिखता है (`memory_recall` उसे तुरंत ढूंढ लेता है)। समीक्षा सिर्फ़ वही रखती है, जो मॉडल रखना तय करता है: वह कोई तथ्य छोड़ सकती है या कोई गलत बात रख सकती है; उन्हें **मेमोरी खोलें** में जांचें और वहीं बदलें, या dsh बंद होने पर फ़ाइलें हाथ से बदलें। **मेमोरी खोलें** चुने गए प्रोजेक्ट के नोट और ग्लोबल नोट (सभी नोट चुनने पर सभी प्रोजेक्ट; ज़्यादा से ज़्यादा लगभग 60,000 अक्षर, बाकी सिर्फ़ गिने जाते हैं और उस अनुरोध में नहीं बदल सकते) और आपका लिखा हुआ टेक्स्ट चैट के मॉडल को नहीं, dsh के डिफ़ॉल्ट मॉडल को भेजता है। प्रीव्यू Mac पर 30 मिनट तक और dsh के दोबारा शुरू होने तक रहता है; अगर इस बीच समीक्षा या एजेंट नोट बदल दे, तो **लागू करें** मना कर देता है और आपको फिर से प्रीव्यू लेना होता है। **लागू करें** किसी प्रीव्यू के सभी बदलाव सेव करता है या एक भी नहीं: अगर कोई बदलाव सेव नहीं हो पाता (जैसे MEMORY.md भर गई हो), तो नोट पहले जैसे रहते हैं और कारण दिखता है। आपके संदेश वाले हर पूरे टर्न पर एक मॉडल कॉल लगती है; विफल कॉल अगले टर्न के बाद वही संदेश फिर पढ़ती है। सब-एजेंट चैट की समीक्षा नहीं होती। यह विचार और फ़ाइल फ़ॉर्मैट [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0) से लिए गए हैं; Composer Plus उसका कोई कोड इस्तेमाल नहीं करता और DS Bot की अपनी मेमोरी को कभी नहीं पढ़ता या लिखता।
246
254
  - **बैकअप** एक ही तय फ़ोल्डर इस्तेमाल करता है, `~/Desktop/dsh-backups` (dsh-backup का डिफ़ॉल्ट, ताकि उसके आर्काइव काम के बने रहें); किसी दूसरे फ़ोल्डर के लिए कोई सेटिंग नहीं है। एक आर्काइव लगभग उतना ही बड़ा होता है जितना `cache/` और `dsh-runtimes/` के बिना dsh होम (मापा गया: Apple Silicon पर 1.6 GB फ़ाइलों से लगभग 30 सेकंड में 830 MB का आर्काइव बना; इस दौरान dsh जवाब देता रहा)। पढ़ते समय बदलने वाली फ़ाइल उसी रूप में सेव होती है, जैसी वह तब थी जब बैकअप ने उसे खोला था। इसलिए किसी खुली चैट का लॉग एक कटे हुए रिकॉर्ड पर खत्म हो सकता है, जिसे dsh अगली बार लिखते समय ठीक कर देता है। मास्किंग yml फ़ाइल में किसी सीक्रेट को एक लाइन पर उसकी key के नाम (`token:`, `apiKey:`, …) से ढूंढती है; flow map (`{token: x}`) में, ऐसी key के नीचे की सूची में, JSON फ़ाइल में (जैसे किसी `.json` फ़ाइल में किसी MCP सर्वर की `apiKey`) या किसी दूसरे नाम से रखा सीक्रेट आर्काइव में रहता है। dsh-backup के प्रकार के हिसाब से बने आर्काइव (`dsh-t-…`) सूची में नहीं दिखते। **दूसरे कंप्यूटर के लिए** आर्काइव कॉपी करता है (APFS पर एक क्लोन: कोई अतिरिक्त जगह नहीं); vault उसके साथ नहीं जाता। **अभी बैकअप लें** कोई बैकअप नहीं हटाता। अपने-आप होने वाला बैकअप Composer Plus के बनाए सबसे नए बैकअप रखता है (**अपने-आप बैकअप** की **रखें** सेटिंग) और अपने बनाए पुराने बैकअप हटा देता है; अपग्रेड से पहले के स्नैपशॉट अलग गिने जाते हैं (सबसे नए 2 रहते हैं)। dsh-backup के आर्काइव कभी नहीं हटाए जाते: उन्हें **हटाएं** से हटाएं। जब तक dsh-backup इंस्टॉल है, वह Composer Plus के आर्काइव को रखे जाने वाले बैकअप की अपनी गिनती में गिनता है और उन्हें हटा सकता है।
@@ -277,6 +285,8 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
277
285
 
278
286
  **क्या एजेंट DS Bot की मेमोरी की तरह अलग-अलग चैट में मेरी पसंद याद रख सकता है?** हां, **प्रोजेक्ट मेमोरी** से (डिफ़ॉल्ट रूप से बंद): इसे **सेटिंग → Composer Plus** में चालू करें। हर टर्न के बाद आपकी लंबे समय तक रहने वाली पसंद और फ़ैसले चैट के प्रोजेक्ट के लिए छोटे नोट के रूप में सेव होते हैं, और उस प्रोजेक्ट की हर नई चैट उन्हें पढ़ती है। एजेंट से कुछ याद रखने को कहें, वह उसे तुरंत सेव कर देता है। नोट देखने या बदलने के लिए उसी पंक्ति में **मेमोरी खोलें** दबाएँ और लिखें कि क्या बदलना है।
279
287
 
288
+ **क्या मैं और मेरे एजेंट Kanzo की तरह एक ही टास्क बोर्ड साझा कर सकते हैं?** हां, **टास्क बोर्ड** से (डिफ़ॉल्ट रूप से चालू): इसे बाएं साइडबार में खोलें और **नया टास्क** से टास्क जोड़ें। किसी चैट में एजेंट से "बोर्ड से अगला टास्क लो" कहें: वह कार्ड को **प्रगति में** ले जाता है, जो किया उस पर टिप्पणी करता है और उसे **समीक्षा** में ले जाता है। किसी टास्क को अपने लिए रखने के लिए उसे **मैन्युअल** मार्क करें।
289
+
280
290
  **क्या dsh, dsh-backup की तरह, मेरी चैट और सेटिंग का बैकअप ले सकता है?** हां: **सेटिंग → Composer Plus → बैकअप → अभी बैकअप लें**। यह उसी फ़ॉर्मैट का आर्काइव उसी फ़ोल्डर (`~/Desktop/dsh-backups`) में लिखता है, इसलिए dsh-backup के आर्काइव भी दिखते हैं और बहाल हो सकते हैं, और आप dsh-backup हटा सकते हैं। तय समय पर बैकअप के लिए **अपने-आप बैकअप** चालू करें।
281
291
 
282
292
  **dsh अब शुरू नहीं होता। बैकअप कैसे बहाल करें?** बैकअप फ़ोल्डर (`~/Desktop/dsh-backups`) खोलें और `Composer Plus Rescue.command` पर डबल-क्लिक करें (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`)। `3) Restore a backup` चुनें, कोई एक बैकअप चुनें और `RESTORE` टाइप करें। यह dsh के बिना काम करता है।
@@ -301,6 +311,8 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
301
311
 
302
312
  **सिर्फ़ वे फ़ाइलें कैसे देखें, जो एक चैट ने बदलीं?** दायां साइडबार → **बदलाव** → **यह चैट**। सिर्फ़ व्हाइटस्पेस वाले बदलाव छिपाने के लिए **␣** पर क्लिक करें।
303
313
 
314
+ **एजेंट को `npm publish` या `git push --force` चलाने से कैसे रोकें?** **सेटिंग → Composer Plus → ब्लॉक की गई कमांड**: `npm publish` टाइप करें, **ब्लॉक** या **पहले पूछना** चुनें, फिर **जोड़ें** पर क्लिक करें। **ब्लॉक** कमांड को मना करता है और एजेंट आपसे पूछता है; **पहले पूछना** हर बार मंज़ूरी कार्ड दिखाता है। सुरक्षित फ़ाइलें एजेंट के फ़ाइल टूल को कवर करती है; ब्लॉक की गई कमांड उसकी शेल कमांड को कवर करती है।
315
+
304
316
  **एक चैट में ऑटो रिव्यू को एक ही टूल के बारे में बार-बार पूछने से कैसे रोकें?** मंज़ूरी कार्ड पर **इस चैट के लिए अनुमति दें** पर क्लिक करें। यह सिर्फ़ उसी चैट में उसी तय टूल पर लागू होता है, डिफ़ॉल्ट रूप से 1 घंटे के लिए; इसे हेडर की चिप से रद्द करें। समय **सेटिंग → Composer Plus → इस चैट के लिए अनुमति दें** में बदलें।
305
317
 
306
318
  **मेरा iPhone खो गया। उसे मेरे Mac तक पहुंचने से कैसे रोकूं?** साइडबार में नीचे बाईं ओर **मोबाइल कनेक्ट** पर क्लिक करें और उस iPhone के पास **Remove** पर क्लिक करें। उसकी कुंजी तुरंत काम करना बंद कर देती है; वह सिर्फ़ नई पेयरिंग से वापस आ सकता है, जिसे आप Mac पर मंज़ूर करें।
@@ -329,6 +341,8 @@ dsh `0.2.0-rc.2` (डेस्कटॉप और वेब) और `0.2.1-rc.2`
329
341
 
330
342
  **क्या मैं अपने iPhone से फ़ोटो भेज सकता हूं?** हां। Tether की किसी चैट में संदेश फ़ील्ड के पास **+** पर टैप करें → Camera, Photos (ज़्यादा से ज़्यादा 4) या Paste image। फ़ोटो आपके संदेश के अटैचमेंट के रूप में Mac की चैट में जाती हैं, इसलिए मॉडल उन्हें देखता है।
331
343
 
344
+ **क्या dsh मॉडल से दोबारा पूछे बिना अगली कमांड चला सकता है?** हाँ, **नियोजित चरण** से (डिफ़ॉल्ट रूप से बंद): इसे सेटिंग → Composer Plus में चालू करें। तब मॉडल अगली कमांड को शर्त के साथ योजना बना सकता है, जैसे “बिल्ड पास होने पर टेस्ट चलाओ”, और नतीजा शर्त पूरी करे तो Composer Plus नई मॉडल कॉल के बिना वह चरण चलाता है। मंज़ूरी और सैंडबॉक्स जैसे थे वैसे ही रहते हैं।
345
+
332
346
  **क्या यह डेस्कटॉप ऐप के साथ काम करता है?** हां: सेटिंग → प्लगइन → **प्लगइन जोड़ें** → `dsh-composer-plus`। dsh 0.2.0-rc.2 (डेस्कटॉप और वेब) और 0.2.1-rc.2 (वेब) पर टेस्ट किया गया।
333
347
 
334
348
  ## डेवलपमेंट
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
407
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
408
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
409
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
410
+ # Task board: the page, the agent tools (fake model), drag and drop, search, the switch
411
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
412
  ```
397
413
 
398
414
  ```sh
package/README.id.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil itu dikelola oleh aplikasi.)
31
31
 
32
- > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.17.0`.
32
+ > pnpm milik dsh melewati versi yang berumur kurang dari 24 jam. Tepat setelah rilis, tambahkan versinya: `dsh-composer-plus@1.18.0`.
33
33
 
34
34
  ## Fitur
35
35
 
@@ -68,7 +68,10 @@ Lalu mulai ulang dsh. (CLI tidak dapat memasang plugin ke profil desktop; profil
68
68
  | **Pemeriksaan tujuan** | <a id="feature-goalcheck"></a>Mulai tujuan dengan `/goal`. Saat agen menandai tujuan sebagai selesai dalam putaran otomatis, tujuan baru ditutup setelah dua pemeriksaan. Pertama, perintah pengujian proyek berjalan di folder obrolan, dengan mode sandbox obrolan itu. Perintah itu adalah perintah Anda sendiri atau perintah yang ditemukan di `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, atau pytest. Jika langkah terbaru agen sendiri adalah menjalankan pengujian itu dengan hasil lulus, pengujian tidak dijalankan lagi. Lalu satu panggilan model independen, tanpa alat, membaca tujuan, obrolan ini, `git status`, dan hasil pengujian. Model menjawab dengan tabel bukti: setiap bagian tujuan ditandai terverifikasi, salah, atau belum terselesaikan, beserta bukti dan perbaikannya; tujuan baru ditutup jika setiap bagian terverifikasi. Jika satu pemeriksaan gagal, tujuan tetap aktif dan agen membaca setiap bagian yang masih terbuka beserta bukti dan perbaikannya, lalu putaran berikutnya berlanjut. Satu baris di bawah bilah tujuan (**Pemeriksaan tujuan**) menampilkan pengujian, hasil terakhir, dan jumlah bagian yang terverifikasi (arahkan penunjuk ke baris itu untuk melihat tabelnya). **Edit** mengatur perintah pengujian Anda sendiri dan batas waktu atau token; jika batas terlampaui, tujuan menjadi terhambat. Batas token juga menghitung subagen obrolan. **Jalankan sekarang** menjalankan pemeriksaan tanpa menutup tujuan. Fitur ini memiliki menu **Model** sendiri di Pengaturan (default: **Sama dengan model obrolan**). Jika Anda menyelesaikan tujuan sendiri, tidak ada yang diperiksa. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Tangkapan layar: Pemeriksaan tujuan"></a> |
69
69
  | **Lanjutkan di obrolan baru** | <a id="feature-handoffchat"></a>Klik kanan obrolan di bilah samping (atau buka menu **…** obrolan itu) → **Lanjutkan di obrolan baru…**. Satu panggilan ke model obrolan itu sendiri menulis catatan serah terima dari apa yang ditampilkan obrolan: Tugas, Hasil, Selesai, Keputusan, Masalah terbuka, dan Tindakan berikutnya (panggilan alat dan hasilnya menjadi bukti; langkah yang Anda putar balik tidak disertakan). Catatan terbuka di sebuah dialog: baca dan edit catatan itu. **Tulis ulang** menulis catatan baru. **Mulai obrolan baru** (atau `Cmd/Ctrl+Enter`) membuka obrolan baru di proyek yang sama dengan catatan itu dan tautan ke obrolan lama sebagai pesan pertamanya; obrolan lama tetap seperti semula. Gunakan saat obrolan panjang sudah penuh atau lambat, atau untuk melanjutkan besok. Tidak ada yang ditulis ke proyek. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Tangkapan layar: Lanjutkan di obrolan baru"></a> |
70
70
  | **Rincian konteks** | <a id="feature-contextbreakdown"></a>Bilah samping kanan → `+` → **Konteks**. Halaman ini menampilkan apa yang sekarang mengisi konteks model obrolan yang terbuka dan berapa banyak jendela konteks yang dipakainya: prompt sistem, instruksi proyek (AGENTS.md), skill, pesan Anda, balasan agen dan panggilan alat, hasil alat (per alat), hasil MCP (per server), definisi alat, ringkasan pemadatan, dan catatan konteks lainnya, masing-masing dengan token dan porsinya. Klik sebuah bagian untuk melihat alat atau servernya. Halaman ini hanya membaca log obrolan, setelah `/compact` dan putar balik, dan tidak memanggil model; halaman ini membaca ulang setelah setiap giliran dan dengan **Segarkan**. Gunakan untuk melihat mengapa obrolan lambat atau penuh, misalnya karena hasil alat MCP yang besar atau banyak definisi alat. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Tangkapan layar: Rincian konteks"></a> |
71
+ | **Langkah terencana** | <a id="feature-plannedsteps"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Agen mendapat alat `plan_next_steps`: dalam pesan yang sama dengan sebuah perintah, agen dapat merencanakan perintah berikutnya beserta argumen persisnya dan sebuah syarat, misalnya “jalankan `npm test` jika build berhasil”. Jika hasilnya memenuhi syarat, Composer Plus menjalankan langkah berikutnya sendiri tanpa panggilan model baru, sehingga obrolan panjang memakai lebih sedikit token. Langkah itu muncul di obrolan sebagai satu baris pendek, “Composer Plus · Planned steps: ran `test` … without a model call”, diikuti panggilan alat dan hasilnya. Hanya langkah `bash`, `read`, `grep`, dan `glob`; persetujuan, sandbox, dan File yang dilindungi berlaku untuk setiap langkah seperti biasa. Model menjawab lagi saat syarat tidak terpenuhi, saat dua langkah siap bersamaan, setelah langkah terakhir, dan saat Anda mengirim pesan. Idenya berasal dari HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Tangkapan layar: Langkah terencana"></a> |
71
72
  | **File yang dilindungi** | <a id="feature-protectedfiles"></a>Aktif secara bawaan. Alat file milik agen sendiri tidak dapat membaca atau mengubah file yang cocok dengan pola Anda: `read`, `read_image`, dan `grep` pada file ditolak untuk pola **baca dan tulis**, sedangkan `write`, `edit`, dan `str_replace_editor` ditolak untuk kedua jenis. Agen membaca alasannya dan diminta untuk bertanya kepada Anda. Pola bawaannya `.env*`, `*.pem`, dan `*.key`. Pengaturan → Composer Plus → **File yang dilindungi**: tambahkan pola (misalnya `published/**` atau `config/*.yml`), klik jenisnya untuk beralih antara **baca dan tulis** dan **hanya tulis**, hapus dengan ✕, atau klik **Gunakan bawaan**. Pola tanpa `/` cocok dengan nama file di folder mana pun. Ini pagar pengaman, bukan sandbox: perintah shell (`cat .env`), skrip, atau alat MCP tetap dapat menjangkau file itu (lihat Batasan). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Tangkapan layar: File yang dilindungi"></a> |
73
+ | **Perintah yang diblokir** | <a id="feature-blockedcommands"></a>Aktif secara bawaan, dengan daftar kosong. Perintah shell agen (`bash`, `pwsh`) tidak dapat menjalankan perintah yang cocok dengan aturan Anda: aturan **blokir** menolak panggilan itu (agen membaca alasannya dan diminta untuk bertanya kepada Anda), aturan **tanya dulu** menampilkan kartu persetujuan dsh, dan perintah hanya berjalan jika Anda mengizinkannya. Pengaturan → Composer Plus → **Perintah yang diblokir**: ketik aturan (misalnya `npm publish`, `git push --force`, atau `ssh *192.168.2.19`), klik jenisnya untuk beralih antara **blokir** dan **tanya dulu**, lalu klik **Tambah**; klik jenis sebuah aturan untuk mengubahnya, hapus aturan dengan ✕. Aturan adalah nama perintah dan kata-kata yang harus muncul sesudahnya dalam urutan ini; `*` cocok dengan teks apa pun. Fitur ini juga menemukan perintah sesudah `&&`, `;`, `\|`, di dalam `$(…)`, `bash -c "…"`, atau `eval`, dan sesudah `sudo` atau `env`. Ini pagar pengaman, bukan sandbox: variabel (`$CMD`), file skrip, atau program lain tetap dapat menjalankan perintah itu (lihat Batasan). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Tangkapan layar: Perintah yang diblokir"></a> |
74
+ | **Papan tugas** | <a id="feature-taskboard"></a>Bilah samping kiri → **Papan tugas**. Papan kanban proyek dsh Anda, untuk Anda dan para agen: **Akan dikerjakan**, **Sedang dikerjakan**, **Ditinjau**, dan **Selesai** (serta **Tertunda**, lihat di bawah). Pilih proyek atau **Semua proyek** di kiri. **Tugas baru** (atau `n`) membuka kartu baru: ketik judulnya lalu tekan `Enter`. Seret kartu ke kolom lain atau ke antara dua kartu. Klik kartu untuk melihat dan mengubah **Status**, **Label**, **Manual** (agen melewatinya), deskripsi (Markdown), dan komentarnya. `/` mencari di semua proyek, `h` hanya menampilkan tugas manual, dan tombol ekspor menyimpan papan sebagai Markdown atau JSON. Agen mendapat alat papan: minta obrolan untuk "mengambil tugas berikutnya dari papan", lalu agen memindahkan kartu teratas di **Akan dikerjakan** ke **Sedang dikerjakan**, mengomentari apa yang dikerjakannya, dan memindahkannya ke **Ditinjau**; Anda yang memindahkannya ke **Selesai**. Di proyek yang punya tugas terbuka, setiap obrolan mendapat aturan ini dengan sendirinya. Pengaturan → Composer Plus → **Papan tugas** berisi sakelar kolom **Tertunda**: agen menyerahkan kartu di kolom itu kepada Anda. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Tangkapan layar: Papan tugas"></a> |
72
75
  | **Memori proyek** | <a id="feature-projectmemory"></a>Nonaktif secara default: aktifkan di **Pengaturan → Composer Plus**. Setiap folder proyek mendapat memorinya sendiri, yang dibaca oleh obrolan berikutnya di proyek itu, seperti DS Bot menyimpan satu memori untuk setiap Bot. Setelah setiap giliran selesai, satu panggilan ke model obrolan membaca pesan baru (bukan yang ditarik oleh putar balik), menyimpan preferensi, keputusan, dan fakta Anda yang bertahan lama sebagai catatan singkat, serta mengubah atau menghapus catatan lama. Agen juga dapat menyimpan, menghapus, dan mencari catatan sendiri (`memory_remember`, `memory_forget`, `memory_recall`). Catatan juga bisa global: setiap proyek membacanya. Obrolan baru mendapat catatan di prompt sistemnya; catatan yang disimpan kemudian muncul mulai obrolan berikutnya. File berupa Markdown di folder home dsh (`storages/dsh-composer-plus/memory/`), tidak pernah di folder proyek. **Buka memori** di baris yang sama menampilkan semua catatan tersimpan, dikelompokkan per proyek (dan memori global), dengan saringan. Tulis dengan kata-kata Anda apa yang diubah (misalnya "saya beralih dari yarn ke pnpm"), lalu **Pratinjau perubahan**: model default dsh mengusulkan perubahan, dan hanya **Terapkan** yang menyimpannya. Di Tether: menu judul obrolan → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Tangkapan layar: Memori proyek"></a> |
73
76
  | **Izinkan untuk obrolan ini** | <a id="feature-allowforchat"></a>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, sampai batas waktu berakhir (1 jam secara default; pilih di **Pengaturan → Composer Plus → Izinkan untuk obrolan ini**). Setelah itu agen bertanya lagi. Sebuah chip di header menampilkan daftar izin beserta waktu berakhirnya 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> |
74
77
  | **Status proyek** | <a id="feature-projectstatus"></a>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. Di **Pohon Ruang Kerja**, baris folder induk juga menampilkan obrolan dari setiap proyek di dalamnya (misalnya setiap folder branch di `.worktrees/`), juga saat folder itu diciutkan. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Tangkapan layar: Status proyek"></a> |
@@ -166,7 +169,9 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
166
169
  - **Pemeriksaan tujuan:** hanya berjalan saat agen menandai `/goal` sebagai selesai dalam putaran otomatis (atau saat Anda mengklik **Jalankan sekarang**). Bagian Host menjalankan perintah pengujian di folder obrolan dengan mode sandbox obrolan itu (seperti alat `bash` milik dsh sendiri: kebijakan akses file yang sama; jika sandbox itu tidak dapat dimulai, pengujian tidak berjalan dan pemeriksaan gagal). Untuk menemukan perintahnya, bagian ini hanya membaca `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml`, dan `pytest.ini`, sebagai file biasa di dalam folder (tanpa symlink ke luar folder, tanpa FIFO). Lalu bagian ini mengirim tujuan, obrolan sejak tujuan dimulai (pesan Anda, balasan agen, panggilan alat yang dipotong menjadi 1.000 karakter, dan 2.000 karakter terakhir dari setiap hasil alat; tanpa penalaran, tanpa langkah yang ditarik oleh putar balik; paling banyak sekitar 60.000 karakter, bagian terbaru), `git status --short`, dan bagian akhir keluaran pengujian ke model yang dipilih di **Pemeriksaan tujuan** (secara default model obrolan itu sendiri), sebagai satu permintaan tanpa alat. Keluaran alat dapat berisi apa yang dibaca agen, jadi permintaan ini dapat memuat bagian dari file Anda, sama seperti obrolan itu sendiri. Tidak ada yang ditulis ke obrolan atau proyek. Perintah pengujian Anda, batas, hasil terakhir (dengan bagian akhir keluarannya), dan pilihan model disimpan di `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (file hanya untuk pemilik, 500 obrolan terbaru).
167
170
  - **Lanjutkan di obrolan baru:** tidak ada yang berjalan sampai Anda mengkliknya. Lalu bagian Host mengirim obrolan (seperti yang dibaca Pemeriksaan tujuan: tanpa penalaran, tanpa langkah yang ditarik oleh putar balik) ke model obrolan itu sendiri dan menampilkan catatan serah terima; hanya **Mulai obrolan baru** yang membuat obrolan baru. Tidak ada yang ditulis ke proyek.
168
171
  - **Rincian konteks:** bagian Host hanya membaca log obrolan; tanpa panggilan model, tanpa file proyek.
172
+ - **Papan tugas:** papan (judul, deskripsi, label, dan komentar tugas Anda, path folder proyek, dan id pendeknya) ada di `$DSH_HOME/storages/dsh-composer-plus/board.json` (file hanya untuk pemilik); sakelarnya ada di `board-switch.json` di sebelahnya. Tidak ada yang keluar dari komputer Anda dan tidak ada yang ditulis ke folder proyek. Alat papan memberikan apa yang Anda tulis di papan kepada agen, jadi teks tugas sampai ke model obrolan saat agen membacanya. File papan yang rusak disimpan sebagai `board.json.broken-<time>` dan papan dimulai kosong.
169
173
  - **File yang dilindungi:** daftar dan sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (file hanya untuk pemilik). Pemeriksaan hanya membaca path dari setiap panggilan alat file (dan path aslinya), tidak pernah membaca file itu.
174
+ - **Perintah yang diblokir:** aturan dan sakelarnya ada di `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (file hanya untuk pemilik). Pemeriksaan hanya membaca teks perintah dari setiap panggilan `bash` dan `pwsh`; pemeriksaan tidak menjalankan apa pun dan tidak mengirim apa pun.
170
175
  - **Memori proyek:** nonaktif sampai Anda mengaktifkannya. Saat aktif, setelah setiap giliran selesai di obrolan tingkat atas, bagian Host mengirim pesan baru obrolan itu sejak tinjauan terakhir (pesan Anda dan balasan teks agen; tanpa keluaran alat, penalaran, konteks tersembunyi, atau pesan yang ditarik oleh putar balik; salinan obrolan induk pada obrolan cabang tidak ikut; paling banyak sekitar 16.000 karakter) dan catatan yang tersimpan ke model obrolan itu sendiri, sebagai satu permintaan tanpa alat. Catatan berupa file Markdown di `$DSH_HOME/storages/dsh-composer-plus/memory/` (file khusus pemilik): `projects/<id>/` untuk setiap folder proyek (`<id>` adalah hash dari path asli folder; `project.json` mencatat foldernya), `global/`, `journal.jsonl` (setiap perubahan dengan baris sebelum dan sesudahnya), dan `reviewed.json` (sampai mana setiap obrolan dibaca). Tidak ada yang ditulis ke folder proyek. Catatan yang tampak seperti kunci, token, kata sandi, atau nomor identitas ditolak. Catatan sebuah proyek masuk ke prompt sistem setiap obrolan baru di folder itu, sehingga ikut ke model pada setiap permintaan obrolan itu. Sakelarnya ada di `memory.json` di tempat yang sama. **Buka memori** tidak mengirim apa pun sampai Anda menekan **Pratinjau perubahan**; lalu ia mengirim catatan yang ditampilkan dan teks Anda ke model default dsh, sebagai satu permintaan tanpa alat. Perubahan hanya ditulis saat **Terapkan**, dengan `editor` di jurnal. Tether membaca dan mengubah catatan melalui rute yang sama.
171
176
  - **Pencadangan:** tidak ada yang keluar dari komputer Anda. Arsip disimpan di `~/Desktop/dsh-backups` (file hanya untuk pemilik). Rahasia tidak ada di dalam arsip: file kredensial (`.credentials.yaml`, `.env`), file kunci (`.pem`, `.key`, `.p12`, `.pfx`), serta nilai pengaturan token, secret, password, dan kunci API di file yml disamarkan; salinan aslinya tetap ada di `composer-plus-vault/<archive>/` di folder yang sama (hanya untuk pemilik), hanya di komputer ini. **Untuk komputer lain** tidak menyalin vault: masukkan lagi rahasia itu di sana. Log obrolan, pengaturan, dan isi dsh home lainnya masuk ke arsip apa adanya: jaga folder itu tetap privat, sama seperti `$DSH_HOME` itu sendiri. Pencadangan membaca file dengan `O_NOFOLLOW | O_NONBLOCK`; symlink disimpan sebagai tautan (tidak pernah diikuti), dan FIFO atau perangkat dilewati. Sakelar dan pengaturan pencadangan otomatis ada di `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, sakelar konsol penyelamat di `rescue-console.json`, dan selama dsh berjalan, `running/host-<pid>.json` menyebut setiap proses dsh (konsol penyelamat membaca file-file itu untuk menolak pemulihan).
172
177
  - **Konsol penyelamat:** menu terminal; konsol ini tidak membuka port jaringan. Pemulihan hanya menulis ke folder baru di sebelah dsh home (file dengan `O_EXCL | O_NOFOLLOW`, symlink paling akhir dan tidak pernah diikuti) dan menolak arsip dengan nama yang tidak aman (`..`, jalur absolut), perangkat atau FIFO, lebih dari satu folder teratas, atau entri di bawah tautan.
@@ -189,7 +194,7 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
189
194
  - **Tidak ada label branch di baris obrolan:** obrolan itu belum memiliki giliran sejak Anda memasang versi ini, foldernya bukan repositori git, atau **Branch Git di baris obrolan** nonaktif. Setelah pembaruan, mulai ulang dsh (bagian Host mencatat branch).
190
195
  - **Pemeriksaan tujuan menyebut pengujian keluar dengan kode 127 atau "not found":** dsh yang dimulai dari Finder atau Dock dapat memiliki PATH yang lebih pendek daripada terminal Anda, sehingga tidak menemukan `npm`, `pnpm`, atau `cargo`. Mulai dsh dari terminal, atau atur perintah pengujian Anda sendiri dengan jalur lengkap di **Pemeriksaan tujuan** → **Edit**. **Jalankan sekarang** langsung menampilkan hasilnya.
191
196
  - **Tujuan tidak ditutup dan agen terus bekerja:** **Pemeriksaan tujuan** menemukan pengujian yang gagal atau pekerjaan yang belum selesai; baris di bawah tujuan menampilkan alasannya (arahkan penunjuk ke hasil untuk melihat detailnya). Perbaiki penyebabnya atau perintah pengujiannya, atau selesaikan tujuan sendiri dengan `/goal` atau bilah tujuan (penyelesaian itu tidak diperiksa).
192
- - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.17.0`), lihat catatan pemasangan di atas.
197
+ - **Pemasangan gagal tepat setelah rilis:** tambahkan versinya (`dsh-composer-plus@1.18.0`), lihat catatan pemasangan di atas.
193
198
  - **Cadangkan sekarang menyatakan "Tindakan pencadangan lain sedang berjalan":** ada tindakan yang berjalan di jendela dsh lain atau di konsol penyelamat (keduanya berbagi file kunci, `.composer-plus.lock`, di folder cadangan). Tunggu sampai tindakan itu selesai. Jika tidak ada tindakan yang berjalan, kunci milik proses yang sudah ditutup diambil alih pada klik berikutnya.
194
199
  - **Konsol penyelamat menyatakan "dsh is running":** keluar dari dsh terlebih dahulu. Jika dsh memang sudah tertutup, file yang disebut dalam pesan itu tersisa dari crash: hapus file itu dan coba lagi.
195
200
  - **Setelah pemulihan, dsh tidak mau dimulai atau ada plugin yang hilang:** paket plugin sebuah profil harus dipasang lagi. Konsol penyelamat menawarkannya setelah pemulihan; atau jalankan `pnpm install` di setiap folder di bawah `$DSH_HOME/profiles/` yang dicantumkannya. Rahasia yang tidak ada di vault (komputer lain) harus dimasukkan lagi: konsol mencantumkannya.
@@ -239,8 +244,11 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
239
244
  - **Sempurnakan prompt** hanya melihat ringkasan proyek yang singkat, jalur yang berubah, dan jalur yang namanya cocok dengan kata-kata Anda: bukan kodenya sendiri. Jadi fitur ini bisa melewatkan file yang tepat, dan hanya menyebut jalur yang diberikan kepadanya. Baca teks baru sebelum Anda mengirimnya. Fitur ini tidak berjalan untuk perintah garis miring selain `/goal <tujuan>`, untuk kata kontrol `/goal` (`clear`, `pause`, `resume`), atau untuk pesan dengan chip file atau simbol (teks baru adalah teks biasa, jadi chip itu akan hilang), dan sebuah pesan paling banyak 8.000 karakter. Untuk tujuan `/goal`, fitur ini menulis syarat hanya dari draf dan konteks; syarat yang terlalu ketat bisa memakai putaran tujuan, jadi baca syarat itu sebelum Anda mengirimnya. Gambar tetap terlampir: hanya teksnya yang berubah. Setiap klik memakai satu panggilan model; model yang kuat bisa memerlukan satu menit (`Esc` membatalkannya).
240
245
  - **Pemeriksaan tujuan** hanya memeriksa penyelesaian yang dibuat agen dalam putaran tujuan otomatis: penyelesaian yang Anda minta di obrolan, `/goal`, dan bilah tujuan tidak diperiksa. Agen dapat mengubah sendiri pengujian atau file perintah pengujian; pemeriksa membaca obrolan dan dapat melihatnya, tetapi bisa salah ke dua arah ("belum selesai" yang salah memakai satu putaran lagi; "selesai" yang salah menutup tujuan). Pemeriksa melihat obrolan dan `git status`, bukan kodenya sendiri. Satu kali menjalankan pengujian hanya dipakai ulang jika langkah terbaru agen yang dapat mengubah file adalah eksekusi `bash` milik agen sendiri yang lulus, dengan perintah yang persis sama di folder yang sama; perintah dengan pipe (`| tail`) atau `&&` tidak dipakai ulang. Anggaran diukur saat sebuah giliran berakhir, jadi satu giliran bisa melampauinya. Anggaran token juga menghitung panggilan obrolan subagen milik obrolan itu (dibaca dari log tersimpan mereka di setiap akhir giliran, jadi obrolan dengan banyak subagen perlu waktu sedikit lebih lama untuk diperiksa). Tabel bukti berasal dari bacaan pemeriksa sendiri atas obrolan: bagian yang disebutnya terverifikasi tetap perlu Anda lihat sendiri jika bagian itu penting. `update_goal` menunggu selama pemeriksaan berjalan (pengujian paling lama 15 menit, pemeriksa paling lama 3 menit). Obrolan hasil pencabangan mendapat id obrolan baru, jadi dimulai tanpa perintah pengujian dan batas milik obrolan induknya. Setiap penyelesaian yang mencapai pemeriksa memakai satu panggilan model.
241
246
  - **File yang dilindungi** adalah pagar pengaman, bukan sandbox. Fitur ini mencakup alat file milik dsh sendiri (`read`, `read_image`, `grep` pada file, `write`, `edit`, `str_replace_editor`). Perintah shell (`cat .env`), skrip yang ditulis agen, shell milik subagen, alat MCP, daftar `glob`, dan `grep` pada seluruh folder tetap dapat menjangkau file yang dilindungi. Untuk batas yang sebenarnya, gunakan mode sandbox dsh atau simpan rahasia di luar folder proyek. Pola mengenal `*`, `**`, dan `?`, tidak mengenal `{a,b}` atau `[ab]`, dan tidak membedakan huruf besar-kecil.
247
+ - **Perintah yang diblokir** adalah pagar pengaman, bukan sandbox. Fitur ini hanya membaca teks perintah dari alat `bash` dan `pwsh` milik dsh. Variabel atau alias yang menyebut nama perintah itu (`CMD=npm; $CMD publish`), fungsi shell, file skrip yang ditulis agen, program lain (`python -c`, `node -e`, `make`), alat MCP, dan terminal Anda sendiri tetap dapat menjalankannya. Aturan bisa cocok dengan lebih banyak perintah daripada yang Anda inginkan: kata mana pun dalam perintah dapat menjadi nama perintah (`echo npm publish` cocok dengan `npm publish`), dan kata lain dapat muncul di antara kata-kata aturan (`git push --force` juga cocok dengan `git push origin main --force`). Buat aturan lebih panjang jika aturan itu cocok dengan terlalu banyak perintah. **tanya dulu** memerlukan obrolan yang dapat bertanya: di obrolan yang kebijakan persetujuannya never (misalnya subagen yang didelegasikan), dsh tidak dapat menampilkan kartu itu, sehingga panggilan ditolak beserta alasannya. Kartu persetujuan menampilkan alasannya dalam bahasa Inggris. **Izinkan untuk obrolan ini** tidak menjawab kartu **tanya dulu**.
242
248
  - **Lanjutkan di obrolan baru** mengirim obrolan (pesan, panggilan alat, dan bagian akhir setiap hasil alat, paling banyak sekitar 60.000 karakter, bagian terbaru) ke model obrolan itu sendiri. Catatan serah terima bisa melewatkan sebuah keputusan atau file: baca catatan itu sebelum Anda memulai. Obrolan baru hanya mengetahui catatan dan obrolan yang ditautkan (dsh melampirkan obrolan lama sebagai konteks hanya-baca); konteks modelnya dimulai kecil, dan obrolan lama tetap seperti apa adanya. Hanya satu catatan atau satu mulai per obrolan pada satu waktu.
243
249
  - **Rincian konteks** menampilkan perkiraan dengan aturan milik dsh sendiri (sekitar 4 karakter per token), aturan yang sama dengan cincin konteks dsh; hitungan model itu sendiri bisa berbeda. Definisi alat adalah definisi dari permintaan terbaru. Fitur ini menampilkan konteks seperti yang ada di log obrolan; giliran yang sedang berjalan muncul setelah langkah berikutnya.
250
+ - **Langkah terencana** menghemat token hanya ketika model benar-benar merencanakan: selama aktif, setiap permintaan membawa alat `plan_next_steps` dan instruksi singkat (sekitar 500 token), juga di obrolan tempat model tidak pernah merencanakan. Sebuah syarat hanya membuktikan apa yang tertulis (misalnya: kode keluar build adalah 0), bukan bahwa pekerjaannya benar. `ok` membaca tanda hasil milik dsh sendiri (`[exit code: N]`, batas waktu, penolakan sandbox); perintah yang gagal tanpa kode keluar bukan nol dianggap lolos. Langkah berjalan satu per satu; dua langkah yang siap bersamaan kembali ke model. Pesan langkah disimpan sebagai pesan asisten dari model obrolan (dsh tidak punya tanda untuk pesan yang ditulis plugin), jadi teksnya menyebutkan bahwa Composer Plus yang menjalankannya. Tidak ada di Tether.
251
+ - **Papan tugas** hanya mengenal proyek dsh: obrolan di luar proyek menampilkan **Semua proyek**, dan folder branch per obrolan (`<project>/.worktrees/<name>`) dihitung sebagai proyeknya. Id proyek (`acme#12`) berasal dari nama folder dan tetap sama saat Anda mengganti nama proyek di dsh. Aturan "jaga papan tetap terbaru" masuk ke obrolan hanya jika proyeknya punya tugas terbuka; obrolan yang sudah mendapatkannya tetap menyimpannya. Agen diminta menyerahkan **Selesai**, **Tertunda**, dan tugas manual kepada Anda, tetapi alatnya tidak menolak: agen tetap bisa memindahkan kartu seperti itu. Alat papan ada di daftar alat setiap obrolan selama fitur ini aktif (sekitar 1.000 token per permintaan); nonaktifkan jika Anda tidak memakai papan. Halaman membaca papan setiap 2 detik selama tampil; perubahan oleh agen muncul dalam waktu itu. Teks yang Anda edit saat agen mengubah bidang yang sama tidak disimpan: panel menampilkan teks baru dan alasannya. Tidak ada gambar, sinkronisasi git antarkomputer, atau berbagi lewat jaringan (Kanzo punya semuanya). Ide dan tampilannya berasal dari [Kanzo](https://github.com/emanuele-em/kanzo) karya emanuele-em (AGPL-3.0); Composer Plus tidak memakai kodenya.
244
252
  - **Dahulukan pesan setelah Hentikan** hanya bekerja setelah Anda menghentikan obrolan (atau setelah giliran yang gagal, atau saat Anda membuka obrolan yang masih punya antrean): pesan yang Anda kirim saat sebuah giliran berjalan tetap menunggu di akhir antrean. Pesan itu hanya mendahului pesan antrean milik Anda sendiri: jika ada putaran tujuan atau balasan pertanyaan yang menunggu di antrean, urutan dsh tetap. Fitur ini membaca bagian dsh yang bukan API publik (apakah giliran yang dihentikan masih sedang berakhir); jika pembaruan dsh mengganti namanya, pesan baru dipindah ke depan setelah giliran itu selesai. Obrolan subagen tetap memakai urutan dsh.
245
253
  - **Memori proyek** milik folder pertama obrolan (folder proyek dsh): obrolan yang mengganti foldernya dengan `cd` tetap memakai memori proyek pertamanya, dan folder yang sama yang dibuka lewat path lain ke file yang sama memakai memori yang sama. Obrolan membekukan bagian memorinya saat dimulai, jadi catatan yang disimpan kemudian muncul mulai obrolan berikutnya (`memory_recall` langsung menemukannya). Tinjauan hanya menyimpan apa yang diputuskan model: tinjauan bisa melewatkan fakta atau menyimpan yang salah; periksa di **Buka memori** dan ubah di sana, atau edit file-nya secara manual saat dsh tertutup. **Buka memori** mengirim catatan proyek yang dipilih dan catatan global (semua proyek saat Anda memilih Semua catatan; paling banyak sekitar 60.000 karakter, sisanya hanya dihitung dan tidak dapat diubah dalam permintaan itu) serta teks Anda ke model default dsh, bukan ke model obrolan. Pratinjau disimpan di Mac selama 30 menit dan sampai dsh dimulai ulang; jika tinjauan atau agen mengubah catatan di antaranya, **Terapkan** menolak dan Anda meminta pratinjau lagi. **Terapkan** menyimpan semua perubahan dari satu pratinjau atau tidak sama sekali: jika satu perubahan tidak bisa disimpan (misalnya MEMORY.md sudah penuh), catatan tetap seperti semula dan alasannya ditampilkan. Setiap giliran selesai yang berisi pesan dari Anda memakan satu panggilan model; panggilan yang gagal membaca pesan yang sama lagi setelah giliran berikutnya. Obrolan subagen tidak ditinjau. Ide dan format file berasal dari [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus tidak memakai kodenya dan tidak pernah membaca atau menulis memori milik DS Bot sendiri.
246
254
  - **Pencadangan** memakai satu folder tetap, `~/Desktop/dsh-backups` (default dsh-backup, sehingga arsipnya tetap dapat dipakai); tidak ada pengaturan untuk folder lain. Ukuran arsip kurang lebih sama dengan dsh home tanpa `cache/` dan `dsh-runtimes/` (diukur: file sebesar 1,6 GB menghasilkan arsip 830 MB dalam sekitar 30 detik di Apple Silicon; dsh tetap responsif). File yang berubah saat dibaca disimpan seperti saat pencadangan membukanya, sehingga log obrolan yang terbuka dapat berakhir dengan catatan yang terpotong, yang diperbaiki dsh pada penulisan berikutnya. Penyamaran menemukan rahasia di file yml dari nama kuncinya dalam satu baris (`token:`, `apiKey:`, …); rahasia dalam flow map (`{token: x}`), dalam daftar di bawah kunci seperti itu, dalam file JSON (misalnya `apiKey` milik server MCP di file `.json`), atau dengan nama lain tetap ada di arsip. Arsip per jenis milik dsh-backup (`dsh-t-…`) tidak dicantumkan. **Untuk komputer lain** menyalin arsip (klon di APFS: tanpa ruang tambahan); vault tidak ikut. **Cadangkan sekarang** tidak menghapus cadangan apa pun. Pencadangan otomatis menyimpan cadangan terbaru yang dibuat Composer Plus (pengaturan **Simpan** di **Pencadangan otomatis**) dan menghapus cadangannya yang lebih lama; snapshot sebelum peningkatan dihitung terpisah (2 yang terbaru tetap ada). Arsip dsh-backup tidak pernah dihapus: hapus arsip itu dengan **Hapus**. Selama dsh-backup masih terpasang, dsh-backup menghitung arsip Composer Plus dalam jumlah simpanannya sendiri dan dapat menghapusnya.
@@ -277,6 +285,8 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
277
285
 
278
286
  **Bisakah agen mengingat preferensi saya antar-obrolan, seperti memori DS Bot?** Bisa, dengan **Memori proyek** (nonaktif secara default): aktifkan di **Pengaturan → Composer Plus**. Setelah setiap giliran, preferensi dan keputusan Anda yang bertahan lama disimpan sebagai catatan singkat untuk proyek obrolan itu, dan setiap obrolan baru di proyek itu membacanya. Minta agen mengingat sesuatu, dan agen langsung menyimpannya. Untuk melihat atau mengubah catatan, klik **Buka memori** di baris yang sama dan tulis apa yang diubah.
279
287
 
288
+ **Bisakah saya dan agen saya berbagi satu papan tugas, seperti Kanzo?** Bisa, dengan **Papan tugas** (aktif secara default): buka di bilah samping kiri dan tambahkan tugas dengan **Tugas baru**. Di obrolan, minta agen untuk "mengambil tugas berikutnya dari papan": agen memindahkan kartu ke **Sedang dikerjakan**, mengomentari apa yang dikerjakannya, lalu memindahkannya ke **Ditinjau**. Tandai tugas sebagai **Manual** untuk menyimpannya bagi Anda sendiri.
289
+
280
290
  **Bisakah dsh mencadangkan obrolan dan pengaturan saya, seperti dsh-backup?** Bisa: **Pengaturan → Composer Plus → Pencadangan → Cadangkan sekarang**. Fitur ini menulis format arsip yang sama ke folder yang sama (`~/Desktop/dsh-backups`), jadi arsip dsh-backup juga tampil dan dapat dipulihkan, dan Anda dapat menghapus dsh-backup. Aktifkan **Pencadangan otomatis** untuk pencadangan terjadwal.
281
291
 
282
292
  **dsh tidak mau dimulai lagi. Bagaimana cara memulihkan cadangan?** Buka folder cadangan (`~/Desktop/dsh-backups`) dan klik dua kali `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Pilih `3) Restore a backup`, pilih satu cadangan, lalu ketik `RESTORE`. Cara ini berjalan tanpa dsh.
@@ -301,6 +311,8 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
301
311
 
302
312
  **Bagaimana cara melihat hanya file yang diubah oleh satu obrolan?** Bilah samping kanan → **Perubahan** → **Obrolan ini**. Klik **␣** untuk menyembunyikan perubahan yang hanya berupa spasi.
303
313
 
314
+ **Bagaimana cara menghentikan agen agar tidak menjalankan `npm publish` atau `git push --force`?** **Pengaturan → Composer Plus → Perintah yang diblokir**: ketik `npm publish`, pilih **blokir** atau **tanya dulu**, lalu klik **Tambah**. **blokir** menolak perintah itu dan agen bertanya kepada Anda; **tanya dulu** menampilkan kartu persetujuan setiap kali. File yang dilindungi mencakup alat file agen; Perintah yang diblokir mencakup perintah shell-nya.
315
+
304
316
  **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, selama 1 jam secara default; cabut izin dari chip di header. Ubah waktunya di **Pengaturan → Composer Plus → Izinkan untuk obrolan ini**.
305
317
 
306
318
  **iPhone saya hilang. Bagaimana cara mencegahnya mengakses Mac saya?** Klik **Koneksi seluler** di kiri bawah bilah samping, lalu klik **Remove** di samping iPhone itu. Kuncinya langsung tidak berfungsi; iPhone itu hanya dapat kembali dengan pemasangan baru yang Anda setujui di Mac.
@@ -329,6 +341,8 @@ Diuji pada dsh `0.2.0-rc.2` (desktop dan web) dan `0.2.1-rc.2` (web). CI menjala
329
341
 
330
342
  **Bisakah saya mengirim foto dari iPhone?** Bisa. Di obrolan Tether, ketuk **+** di samping kolom pesan → Camera, Photos (hingga 4) atau Paste image. Foto dikirim ke obrolan di Mac sebagai lampiran pesan Anda, jadi model dapat melihatnya.
331
343
 
344
+ **Bisakah dsh menjalankan perintah berikutnya tanpa bertanya lagi ke model?** Bisa, dengan **Langkah terencana** (nonaktif secara default): aktifkan di Pengaturan → Composer Plus. Model lalu dapat merencanakan perintah berikutnya dengan sebuah syarat, misalnya “jalankan tes jika build berhasil”, dan Composer Plus menjalankan langkah tanpa panggilan model baru ketika hasilnya memenuhi syarat. Persetujuan dan sandbox tetap seperti biasa.
345
+
332
346
  **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).
333
347
 
334
348
  ## Pengembangan
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
407
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
408
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
409
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
410
+ # Task board: the page, the agent tools (fake model), drag and drop, search, the switch
411
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
412
  ```
397
413
 
398
414
  ```sh
package/README.ja.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  その後、dsh を再起動してください。(CLI はデスクトップのプロファイルにはインストールできません。デスクトップのプロファイルはアプリが管理します。)
31
31
 
32
- > dsh の pnpm は、公開から 24 時間たっていないバージョンをスキップします。リリース直後は、バージョンを指定してください:`dsh-composer-plus@1.17.0`。
32
+ > dsh の pnpm は、公開から 24 時間たっていないバージョンをスキップします。リリース直後は、バージョンを指定してください:`dsh-composer-plus@1.18.0`。
33
33
 
34
34
  ## 機能
35
35
 
@@ -68,7 +68,10 @@ dsh plugin --profile web add dsh-composer-plus
68
68
  | **目標チェック** | <a id="feature-goalcheck"></a>`/goal` で目標を開始します。自動ラウンドでエージェントが目標を完了にすると、目標は 2 つのチェックを通ったときだけ閉じます。まず、プロジェクトのテストコマンドが、チャットのフォルダーで、チャットのサンドボックスモードのもとで実行されます。コマンドは、あなた自身のコマンドか、`package.json`、`Makefile`、`Cargo.toml`、`go.mod` または pytest から見つけたコマンドです。エージェント自身の最新のステップがそのテストの成功した実行だった場合は、もう一度は実行しません。次に、ツールを持たない独立したモデル呼び出しが、目標、このチャット、`git status`、テスト結果を読みます。モデルは証拠の表で答えます。目標の各部分を、証拠と修正方法とともに、検証済み、不正確、未解決のいずれかにします。すべての部分が検証済みのときだけ、目標は閉じます。チェックが失敗すると、目標は進行中のままになり、エージェントが未完了の各部分を証拠と修正方法とともに読んで、次のラウンドが続きます。目標バーの下の行(**目標チェック**)に、テスト、最後の結果、検証済みの部分の数が表示されます(ポインターを合わせると表が表示されます)。**編集** で、独自のテストコマンドと、時間またはトークンの制限を設定します。制限を超えると、目標はブロック中になります。トークンの制限には、チャットのサブエージェントの分も含まれます。**今すぐ実行** は、目標を閉じずにチェックを実行します。設定に専用の **モデル** メニューがあります(既定は **チャットのモデルと同じ**)。目標を自分で完了したときは、何もチェックしません。 | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="スクリーンショット: 目標チェック"></a> |
69
69
  | **新しいチャットで続ける** | <a id="feature-handoffchat"></a>サイドバーのチャットを右クリック(またはチャットの **…** メニューを開く)→ **新しいチャットで続ける…**。チャット自身のモデルを 1 回呼び出し、チャットに表示されている内容から引き継ぎメモを書きます。項目は、タスク、成果物、完了したこと、決定事項、未解決の問題、次のアクションです(ツール呼び出しとその結果が証拠になります。ロールバックしたステップは含まれません)。メモはダイアログで開きます。読んで編集してください。**もう一度書く** で新しいメモを書きます。**新しいチャットを開始**(または `Cmd/Ctrl+Enter`)は、同じプロジェクトで新しいチャットを開き、メモと元のチャットへのリンクを最初のメッセージにします。元のチャットはそのまま残ります。長いチャットがいっぱいになったときや遅くなったとき、または翌日に続けるときに使います。プロジェクトには何も書き込みません。 | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="スクリーンショット: 新しいチャットで続ける"></a> |
70
70
  | **コンテキストの内訳** | <a id="feature-contextbreakdown"></a>右サイドバー → `+` → **コンテキスト**。開いているチャットのモデルのコンテキストを、いま何が占めているか、コンテキストウィンドウのどれだけを使っているかを表示します。システムプロンプト、プロジェクトの指示(AGENTS.md)、スキル、自分のメッセージ、エージェントの返信とツール呼び出し、ツールの結果(ツールごと)、MCP の結果(サーバーごと)、ツールの定義、圧縮の概要、その他のコンテキストのメモを、それぞれのトークン数と割合とともに示します。項目をクリックすると、そのツールやサーバーを表示します。`/compact` とロールバックの後のチャットのログだけを読み、モデルは呼び出しません。各ターンの後と **更新** で読み直します。チャットが遅い理由やいっぱいになった理由を調べるときに使います。たとえば、大きな MCP ツールの結果や多数のツール定義が原因のことがあります。 | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="スクリーンショット: コンテキストの内訳"></a> |
71
+ | **計画済みステップ** | <a id="feature-plannedsteps"></a>既定ではオフです。**設定 → Composer Plus** でオンにしてください。エージェントはツール `plan_next_steps` を使えるようになります。コマンドと同じメッセージで、次に実行するコマンドを正確な引数と条件付きで計画できます(例:「ビルドが通ったら `npm test` を実行」)。結果が条件を満たすと、Composer Plus がモデルを呼び出さずに次のステップを自分で実行するため、長いチャットのトークン消費が減ります。ステップはチャットに「Composer Plus · Planned steps: ran `test` … without a model call」という短い行として表示され、その後にツール呼び出しと結果が続きます。対象は `bash`、`read`、`grep`、`glob` のステップのみで、承認、サンドボックス、保護されたファイルは各ステップにいつもどおり適用されます。条件を満たさないとき、2 つのステップが同時に実行可能なとき、最後のステップの後、そしてあなたがメッセージを送ったときは、モデルが再び応答します。この考え方は HarnessMM(arXiv 2610.32813)に基づきます。 | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="スクリーンショット: 計画済みステップ"></a> |
71
72
  | **保護されたファイル** | <a id="feature-protectedfiles"></a>既定でオンです。エージェント自身のファイルツールは、指定したパターンに一致するファイルを読むことも変更することもできません。**読み取りと書き込み** のパターンでは、ファイルに対する `read`、`read_image`、`grep` が拒否され、どちらの種類でも `write`、`edit`、`str_replace_editor` が拒否されます。エージェントは理由を読み、あなたに確認するよう指示されます。既定のパターンは `.env*`、`*.pem`、`*.key` です。設定 → Composer Plus → **保護されたファイル**:パターンを追加し(例:`published/**` または `config/*.yml`)、種類をクリックして **読み取りと書き込み** と **書き込みのみ** を切り替え、✕ で削除するか、**既定値を使う** をクリックします。`/` を含まないパターンは、どのフォルダーのファイル名にも一致します。これはガードレールであり、サンドボックスではありません。シェルコマンド(`cat .env`)、スクリプト、MCP ツールからはファイルに届くことがあります(「制限事項」を参照)。 | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="スクリーンショット: 保護されたファイル"></a> |
73
+ | **ブロックされたコマンド** | <a id="feature-blockedcommands"></a>既定でオンで、リストは空です。エージェントのシェルコマンド(`bash`、`pwsh`)は、指定したルールに一致するコマンドを実行できません。**ブロック** のルールは呼び出しを拒否し(エージェントは理由を読み、あなたに確認するよう指示されます)、**先に確認** のルールは dsh の承認カードを表示します。コマンドは、あなたが許可したときだけ実行されます。設定 → Composer Plus → **ブロックされたコマンド**:ルールを入力し(例:`npm publish`、`git push --force` または `ssh *192.168.2.19`)、種類をクリックして **ブロック** と **先に確認** を切り替えてから、**追加** をクリックします。ルールの種類をクリックすると変更でき、✕ で削除できます。ルールは、コマンド名と、その後にこの順で続く必要がある単語です。`*` は任意のテキストに一致します。`&&`、`;`、`\|` の後、`$(…)`、`bash -c "…"`、`eval` の中、`sudo` や `env` の後にあるコマンドも見つけます。これはガードレールであり、サンドボックスではありません。変数(`$CMD`)、スクリプトファイル、ほかのプログラムからはコマンドを実行できることがあります(「制限事項」を参照)。 | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="スクリーンショット: ブロックされたコマンド"></a> |
74
+ | **タスクボード** | <a id="feature-taskboard"></a>左サイドバー → **タスクボード**。あなたとエージェントが使う、dsh のプロジェクトのカンバンボードです。列は **未着手**、**作業中**、**レビュー**、**完了** です(**バックログ** もあります。下記を参照)。左でプロジェクトか **すべてのプロジェクト** を選びます。**新しいタスク**(または `n`)で新しいカードが開きます。タイトルを入力して `Enter` を押します。カードは別の列や 2 枚のカードの間にドラッグできます。カードをクリックすると、**ステータス**、**タグ**、**手動**(エージェントはスキップします)、説明(Markdown)、コメントを確認して変更できます。`/` ですべてのプロジェクトを検索し、`h` で手動タスクだけを表示します。エクスポートボタンでボードを Markdown または JSON として保存します。エージェントはボードのツールを使えます。チャットで「ボードから次のタスクを取って」と頼むと、エージェントは **未着手** の一番上のカードを **作業中** に移し、行ったことをコメントして **レビュー** に移します。**完了** に移すのはあなたです。未完了のタスクがあるプロジェクトでは、各チャットがこのルールを自動で受け取ります。設定 → Composer Plus → **タスクボード** に **バックログ** 列のスイッチがあります。この列のカードはエージェントがあなたに任せます。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="スクリーンショット: タスクボード"></a> |
72
75
  | **プロジェクトメモリー** | <a id="feature-projectmemory"></a>既定ではオフです。**設定 → Composer Plus** でオンにしてください。プロジェクトのフォルダーごとに専用のメモリーがあり、そのプロジェクトの後のチャットが読みます。DS Bot が Bot ごとにメモリーを持つのと同じです。ターンが終わるたびに、チャットのモデルを 1 回呼び出して新しいメッセージ(ロールバックしたものは除きます)を読み、長く続く好み、決定、事実を短いメモとして保存し、古いメモを変更または削除します。エージェントも自分でメモを保存、削除、検索できます(`memory_remember`、`memory_forget`、`memory_recall`)。メモはグローバルにもでき、その場合はすべてのプロジェクトが読みます。新しいチャットはシステムプロンプトでメモを受け取ります。後で保存したメモは次のチャットから表示されます。ファイルは dsh のホームフォルダーにある Markdown(`storages/dsh-composer-plus/memory/`)で、プロジェクトのフォルダーには保存されません。 同じ行の **メモリーを開く** は、保存されたすべてのメモをプロジェクトごと(とグローバルメモリー)にまとめて表示し、絞り込みもできます。変更する内容を自分の言葉で書き(例:「yarn から pnpm に変えた」)、**変更をプレビュー** を押します。dsh の既定のモデルが変更を提案し、**適用** を押したときだけ保存されます。Tether では: チャットのタイトルメニュー → Project memory。 | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="スクリーンショット: プロジェクトメモリー"></a> |
73
76
  | **このチャットで許可** | <a id="feature-allowforchat"></a>自動レビューで確認を求められると、承認カードに **このチャットで許可** が表示されます。これを選ぶと、同じチャットの同じツールが、引数にかかわらず、時間制限が終わるまで許可されます(既定は 1 時間。**設定 → Composer Plus → このチャットで許可** で選べます)。その後、エージェントが再び確認します。ヘッダーのチップに許可の一覧が終了時刻とともに表示され、そこから取り消せます。許可は再起動後も有効です。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="スクリーンショット: このチャットで許可"></a> |
74
77
  | **プロジェクトの状態** | <a id="feature-projectstatus"></a>サイドバーのプロジェクトの行に、そのチャットと同じ実行中/待機中/完了のマーカーが表示されます。そのため、折りたたんだプロジェクトでも、中のチャットが作業中か、あなたの操作を待っているかがわかります。最初に表示されるのはあなたの操作を待っているチャットで、次がまだ開いていない完了済みのチャット(緑色の点。別のチャットがまだ実行中でも表示されます)、その次が実行中のマーカーです。ポインターを合わせると詳細が表示されます。**ワークスペースのツリー** では、親フォルダーの行にも、中にある各プロジェクト(たとえば `.worktrees/` 内の各ブランチのフォルダー)のチャットの状態が表示されます。フォルダーを折りたたんでいるときも同じです。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="スクリーンショット: プロジェクトの状態"></a> |
@@ -166,7 +169,9 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
166
169
  - **目標チェック:** 自動ラウンドでエージェントが `/goal` を完了にしたとき(または **今すぐ実行** をクリックしたとき)だけ実行されます。ホスト側は、テストコマンドをチャットのフォルダーで、チャットのサンドボックスモードのもとで実行します(dsh 自身の `bash` ツールと同じで、ファイルアクセスのポリシーも同じです。そのサンドボックスを開始できないときは、テストを実行せず、チェックは失敗します)。コマンドを見つけるために読むのは `package.json`、`Makefile`、`Cargo.toml`、`go.mod`、`pyproject.toml`、`pytest.ini` だけで、フォルダー内の通常のファイルとしてだけ読みます(フォルダーの外を指すシンボリックリンクや FIFO は読みません)。次に、ツールなしの 1 回のリクエストとして、**目標チェック** で選んだモデル(既定ではチャット自身のモデル)に次の内容を送ります。目標、目標の開始以降のチャット(あなたのメッセージ、エージェントの返信、1,000 文字に切り詰めたツール呼び出し、各ツール結果の最後の 2,000 文字。推論とロールバックで取り消したステップは含みません。最大で約 60,000 文字、最新の部分)、`git status --short`、テスト出力の末尾です。ツールの出力にはエージェントが読んだ内容が含まれることがあるため、このリクエストには、チャットそのものと同じように、あなたのファイルの一部が含まれることがあります。チャットにもプロジェクトにも何も書き込みません。テストコマンド、制限、最後の結果(出力の末尾を含む)、モデルの選択は `$DSH_HOME/storages/dsh-composer-plus/goal-check.json`(所有者のみのファイル、最新の 500 チャット)に保存されます。
167
170
  - **新しいチャットで続ける:** クリックするまで、何も実行されません。クリックすると、ホスト側はチャット(目標チェックと同じ読み方です。推論とロールバックで取り消したステップは含みません)をチャット自身のモデルに送り、引き継ぎメモを表示します。新しいチャットを作るのは **新しいチャットを開始** だけです。プロジェクトには何も書き込みません。
168
171
  - **コンテキストの内訳:** ホスト側でチャットのログだけを読みます。モデル呼び出しはせず、プロジェクトのファイルも読みません。
172
+ - **タスクボード:** ボード(タスクのタイトル、説明、タグ、コメント、プロジェクトのフォルダーのパスとその短い ID)は `$DSH_HOME/storages/dsh-composer-plus/board.json`(所有者のみのファイル)にあります。スイッチはその隣の `board-switch.json` にあります。データがマシンの外に出ることはなく、プロジェクトのフォルダーには何も書き込みません。ボードのツールはボードに書いた内容をエージェントに渡すため、エージェントがタスクを読むと、その本文がチャットのモデルに届きます。壊れたボードのファイルは `board.json.broken-<time>` として残り、ボードは空の状態から始まります。
169
173
  - **保護されたファイル:** リストとスイッチは `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(所有者のみのファイル)にあります。チェックが読むのは、各ファイルツール呼び出しのパス(とその実際のパス)だけで、ファイルそのものは読みません。
174
+ - **ブロックされたコマンド:** ルールとスイッチは `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json`(所有者のみのファイル)にあります。チェックが読むのは、各 `bash` と `pwsh` 呼び出しのコマンドテキストだけです。何も実行せず、何も送信しません。
170
175
  - **プロジェクトメモリー:** オンにするまではオフです。オンの間は、最上位のチャットのターンが終わるたびに、Host 側が、前回の確認以降のそのチャット自身の新しいメッセージ(あなたのメッセージとエージェントのテキスト返信。ツールの出力、推論、隠しコンテキスト、ロールバックしたメッセージは含みません。分岐したチャットでは、親チャットからのコピーは除きます。最大約 16,000 文字)と保存済みのメモを、ツールなしの 1 回のリクエストとしてチャット自身のモデルに送ります。メモは `$DSH_HOME/storages/dsh-composer-plus/memory/` にある Markdown ファイル(所有者だけが読み書きできます)です。プロジェクトのフォルダーごとの `projects/<id>/`(`<id>` はフォルダーの実際のパスのハッシュで、`project.json` にフォルダーを記録します)、`global/`、`journal.jsonl`(各変更と、変更前後の行)、`reviewed.json`(各チャットをどこまで読んだか)があります。プロジェクトのフォルダーには何も書き込みません。キー、トークン、パスワード、ID 番号のように見えるメモは拒否します。プロジェクトのメモはそのフォルダーの新しいチャットのシステムプロンプトに入るので、そのチャットのリクエストごとにモデルに送られます。スイッチは同じ場所の `memory.json` にあります。**メモリーを開く** は、**変更をプレビュー** を押すまで何も送りません。押すと、表示しているメモとあなたの文章を、ツールなしの 1 回のリクエストとして dsh の既定のモデルに送ります。変更は **適用** を押したときだけ書き込まれ、ジャーナルには `editor` と記録されます。Tether も同じルートでメモを読み、変更します。
171
176
  - **バックアップ:** データがマシンの外に出ることはありません。アーカイブは `~/Desktop/dsh-backups` に保存されます(所有者のみのファイル)。シークレットはアーカイブに含まれません。認証情報ファイル(`.credentials.yaml`、`.env`)、鍵ファイル(`.pem`、`.key`、`.p12`、`.pfx`)、yml ファイル内の token、secret、password、API キーの設定の値はマスクされます。それらの実際のコピーは、同じフォルダーの `composer-plus-vault/<archive>/`(所有者のみ)に、このコンピュータ上にだけ残ります。**別のコンピュータ用** は vault をコピーしません。それらのシークレットは、移行先でもう一度入力してください。チャットのログ、設定、dsh のホームのその他の内容は、そのままアーカイブに入ります。`$DSH_HOME` そのものと同じように、フォルダーを非公開にしておいてください。バックアップは `O_NOFOLLOW | O_NONBLOCK` でファイルを読み取ります。シンボリックリンクはリンクとして保存し(リンク先はたどりません)、FIFO やデバイスはスキップします。自動バックアップのスイッチと設定は `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json` に、レスキューコンソールのスイッチは `rescue-console.json` に保存されます。dsh の実行中は、`running/host-<pid>.json` が各 dsh プロセスを示します(レスキューコンソールはこれらを読み取り、復元を拒否します)。
172
177
  - **レスキューコンソール:** ターミナルのメニューです。ネットワークポートは開きません。復元は、dsh のホームの隣にある新しいフォルダーにだけ書き込みます(ファイルは `O_EXCL | O_NOFOLLOW` で書き込み、シンボリックリンクは最後に作成し、たどりません)。安全でない名前(`..`、絶対パス)、デバイスや FIFO、複数の最上位フォルダー、リンクの下のエントリーを含むアーカイブは拒否します。
@@ -189,7 +194,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
189
194
  - **チャット行にブランチのラベルがない:** 原因は次のいずれかです。このバージョンをインストールしてから、そのチャットにターンがない。フォルダーが git リポジトリではない。**チャット行の Git ブランチ** がオフになっている。アップデートの後は、dsh を再起動してください(ブランチはホスト側が記録します)。
190
195
  - **目標チェックで、テストが終了コード 127 または「not found」で終了したと表示される:** Finder や Dock から起動した dsh は、ターミナルより PATH が短いことがあるため、`npm`、`pnpm`、`cargo` が見つかりません。ターミナルから dsh を起動するか、**目標チェック** → **編集** で、フルパスを使った独自のテストコマンドを設定してください。**今すぐ実行** を使うと、すぐに結果が表示されます。
191
196
  - **目標が閉じず、エージェントが作業を続ける:** **目標チェック** が、失敗したテストまたは足りない作業を見つけました。目標の下の行に理由が表示されます(詳細は、結果にポインターを合わせると表示されます)。原因またはテストコマンドを直すか、`/goal` または目標バーで目標を自分で完了してください(その完了はチェックされません)。
192
- - **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.17.0`)。上のインストールの注記を参照してください。
197
+ - **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.18.0`)。上のインストールの注記を参照してください。
193
198
  - **今すぐバックアップ で「別のバックアップ操作を実行中です」と表示される:** 別の dsh のウィンドウ、またはレスキューコンソールで操作が実行中です(どちらも、バックアップフォルダーのロックファイル `.composer-plus.lock` を共有します)。完了するまで待ってください。実行中の操作がない場合は、次のクリックで、終了したプロセスのロックを引き継ぎます。
194
199
  - **レスキューコンソールで「dsh is running」と表示される:** まず dsh を終了してください。dsh が本当に閉じている場合、メッセージに示されたファイルはクラッシュで残ったものです。そのファイルを削除して、もう一度試してください。
195
200
  - **復元の後に dsh が起動しない、またはプラグインが見つからない:** プロファイルのプラグインパッケージを、もう一度インストールする必要があります。レスキューコンソールが、復元の後にこれを提案します。または、コンソールが一覧表示する `$DSH_HOME/profiles/` の下の各フォルダーで `pnpm install` を実行してください。vault に入っていなかったシークレット(別のコンピュータ)は、もう一度入力する必要があります。コンソールがそれらを一覧表示します。
@@ -239,8 +244,11 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
239
244
  - **プロンプトを改善** が見るのは、短いプロジェクトの概要、変更されたパス、名前があなたの言葉と一致するパスだけで、コードそのものは見ません。そのため、正しいファイルを見落とすことがあり、渡されたパスしか挙げません。送信する前に新しいテキストを読んでください。`/goal <目標>` 以外のスラッシュコマンド、`/goal` の制御語(`clear`、`pause`、`resume`)、ファイルやシンボルのチップを含むメッセージには使えません(新しいテキストはプレーンテキストなので、チップが失われるためです)。`/goal` の目標では、下書きとコンテキストだけから条件を書きます。厳しすぎる条件は目標のラウンドを余分に使うことがあるため、送信する前に読んでください。メッセージは最大 8,000 文字です。画像は添付されたままで、変わるのはテキストだけです。クリックするたびに、モデル呼び出しが 1 回行われます。性能の高いモデルでは 1 分ほどかかることがあります(`Esc` でキャンセルします)。
240
245
  - **目標チェック** がチェックするのは、自動の目標ラウンドでエージェントが行った完了だけです。チャットであなたが頼んだ完了、`/goal`、目標バーはチェックされません。エージェントは、テストやテストコマンドのファイルを自分で変更できます。検証用のモデルはチャットを読むのでそれに気づけますが、どちらの方向にも誤ることがあります(誤った「未完了」はラウンドを 1 回余分に使い、誤った「完了」は目標を閉じます)。検証用のモデルが見るのはチャットと `git status` で、コードそのものは見ません。テストの実行結果を再利用するのは、ファイルを変更できるエージェントの最新のステップが、同じフォルダーで完全に同じコマンドを実行して成功した、エージェント自身の `bash` 実行だった場合だけです。パイプ(`| tail`)や `&&` を含むコマンドは再利用しません。予算はターンの終わりに計測されるため、1 回のターンで予算を超えることがあります。トークンの予算には、そのチャットのサブエージェントのチャットの呼び出しも数えます(各ターンの終わりに、保存されたログから読み取ります。そのため、サブエージェントが多いチャットはチェックに少し長くかかります)。証拠の表は、検証用のモデル自身がチャットを読んだ結果です。検証済みとされた部分でも、重要なときは自分で確認してください。チェックの実行中、`update_goal` は待機します(テストは最大 15 分、検証は最大 3 分)。フォークしたチャットには新しいチャット ID が付くため、親チャット独自のテストコマンドと制限なしで始まります。検証まで進んだ完了 1 回ごとに、モデル呼び出しが 1 回行われます。
241
246
  - **保護されたファイル** はガードレールであり、サンドボックスではありません。対象は dsh 自身のファイルツール(`read`、`read_image`、ファイルへの `grep`、`write`、`edit`、`str_replace_editor`)です。シェルコマンド(`cat .env`)、エージェントが書いたスクリプト、サブエージェントのシェル、MCP ツール、`glob` の一覧、フォルダー全体への `grep` からは、保護されたファイルに届くことがあります。本当の制限が必要なときは、dsh のサンドボックスモードを使うか、シークレットをプロジェクトのフォルダーの外に置いてください。パターンは `*`、`**`、`?` を理解しますが、`{a,b}` や `[ab]` は理解しません。また、大文字と小文字は区別しません。
247
+ - **ブロックされたコマンド** はガードレールであり、サンドボックスではありません。読むのは、dsh の `bash` と `pwsh` ツールのコマンドテキストだけです。コマンドを指す変数やエイリアス(`CMD=npm; $CMD publish`)、シェル関数、エージェントが書いたスクリプトファイル、ほかのプログラム(`python -c`、`node -e`、`make`)、MCP ツール、あなた自身のターミナルからは、そのコマンドを実行できます。ルールは、意図より多くのコマンドに一致することがあります。コマンドのどの単語もコマンド名になり得ます(`echo npm publish` は `npm publish` に一致します)。また、ルールの単語の間にほかの単語があっても一致します(`git push --force` は `git push origin main --force` にも一致します)。一致する範囲が広すぎるときは、ルールを長くしてください。**先に確認** のルールには、確認できるチャットが必要です。承認ポリシーが never のチャット(例:委任されたサブエージェント)では dsh はカードを表示できないため、呼び出しは理由とともに拒否されます。承認カードには理由が英語で表示されます。**このチャットで許可** では **先に確認** のカードに応答できません。
242
248
  - **新しいチャットで続ける** は、チャット(メッセージ、ツール呼び出し、各ツール結果の末尾。最大で約 60,000 文字、最新の部分)をチャット自身のモデルに送ります。引き継ぎメモには、決定やファイルが抜けることがあります。開始する前に読んでください。新しいチャットが知っているのは、メモとリンクしたチャットだけです(dsh は元のチャットを読み取り専用のコンテキストとして添付します)。モデルのコンテキストは小さい状態から始まり、元のチャットはそのまま残ります。1 つのチャットで同時に実行できるメモの作成または開始は 1 つだけです。
243
249
  - **コンテキストの内訳** は、dsh 自身のルール(1 トークンあたり約 4 文字)で推定値を表示します。これは dsh のコンテキストリングと同じルールで、モデル自身の数え方とは異なることがあります。ツールの定義は、最新のリクエストのものです。コンテキストはチャットのログにあるとおりに表示します。実行中のターンは、次のステップの後に表示されます。
250
+ - **計画済みステップ** でトークンが減るのは、モデルが実際に計画したときだけです。オンの間は、モデルが計画しないチャットでも、各リクエストに `plan_next_steps` ツールと短い指示(約 500 トークン)が含まれます。条件が証明するのは書かれた内容だけです(例:ビルドの終了コードが 0 だった)。作業が正しいことは証明しません。`ok` は dsh 自身の結果マーク(`[exit code: N]`、タイムアウト、サンドボックスの拒否)を読みます。0 以外の終了コードを返さずに失敗したコマンドは成功とみなされます。ステップは 1 つずつ実行され、同時に実行可能な 2 つのステップはモデルに戻されます。ステップのメッセージはチャットのモデルのアシスタントメッセージとして保存されます(dsh にはプラグインが書いたメッセージを示す印がありません)。そのため、その文面に Composer Plus が実行したことが書かれています。Tether にはありません。
251
+ - **タスクボード** が知っているのは dsh のプロジェクトだけです。プロジェクトの外にあるチャットでは **すべてのプロジェクト** が表示され、チャットごとのブランチのフォルダー(`<project>/.worktrees/<name>`)はそのプロジェクトとして扱われます。プロジェクトの ID(`acme#12`)はフォルダー名から作られ、dsh でプロジェクトの名前を変えても変わりません。「ボードを最新に保つ」というルールがチャットに入るのは、そのプロジェクトに未完了のタスクがあるときだけです。一度受け取ったチャットはルールを保ちます。エージェントには **完了**、**バックログ**、手動タスクをあなたに任せるよう伝えますが、ツールはそれを拒否しません。エージェントがそのようなカードを動かすこともあります。機能がオンの間、ボードのツールはすべてのチャットのツール一覧に入ります(リクエストごとに約 1,000 トークン)。ボードを使わない場合はオフにしてください。ページは表示中、2 秒ごとにボードを読みます。エージェントの変更はその時間内に表示されます。エージェントが同じ項目を変えている間にあなたが編集したテキストは保存されません。パネルに新しいテキストと理由が表示されます。画像、コンピューター間の git 同期、ネットワーク経由の共有はありません(Kanzo にはあります)。考え方と見た目は emanuele-em の [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)から来ています。Composer Plus はそのコードを使っていません。
244
252
  - **停止後の新規メッセージ優先** は、チャットを停止した後(または失敗したターンの後、まだキューがあるチャットを開いたとき)にだけ働きます。ターンの実行中に送信したメッセージは、これまでどおりキューの末尾で待ちます。追い越すのは自分がキューに入れたメッセージだけです。キューに目標のラウンドや質問への回答が待っている場合は、dsh 自身の順序のままです。公開 API ではない dsh の一部(停止したターンがまだ終了処理中かどうか)を読み取ります。dsh の更新でその名前が変わった場合、メッセージはそのターンが終わった後にだけ先頭に移ります。サブエージェントのチャットは dsh 自身の順序のままです。
245
253
  - **プロジェクトメモリー** はチャットの最初のフォルダー(dsh のプロジェクトのフォルダー)に属します。`cd` でフォルダーを変えたチャットは最初のプロジェクトのメモリーを使い続けます。同じファイルへの別のパスで開いた同じフォルダーは、同じメモリーを共有します。チャットは開始時にメモリーのセクションを固定するため、後で保存したメモは次のチャットから表示されます(`memory_recall` ならすぐに見つかります)。確認では、モデルが残すと決めたものだけを残します。事実を見落としたり、誤った内容を残したりすることがあります。**メモリーを開く** で確認してそこで変更するか、dsh を閉じている間にファイルを手で編集してください。**メモリーを開く** は、選んだプロジェクトのメモとグローバルなメモ(「すべてのメモ」を選んだときはすべてのプロジェクト。最大で約 60,000 文字で、残りは数だけ示され、そのリクエストでは変更できません)とあなたの文章を、チャットのモデルではなく dsh の既定のモデルに送ります。プレビューは Mac に 30 分間、dsh を再起動するまで保持されます。その間に確認やエージェントがメモを変更すると **適用** は拒否されるので、もう一度プレビューしてください。**適用** はプレビューの変更をすべて保存するか、1 つも保存しないかのどちらかです。保存できない変更が 1 つでもあると(たとえば MEMORY.md がいっぱいのとき)、メモは元のままで、理由が表示されます。あなたのメッセージを含むターンが終わるたびに、モデルを 1 回呼び出します。呼び出しが失敗すると、次のターンの後に同じメッセージをもう一度読みます。サブエージェントのチャットは確認しません。考え方とファイル形式は [DS Bot](https://github.com/Fei2411/DS-Bot)(Apache-2.0)から来ています。Composer Plus はそのコードを使っておらず、DS Bot 自身のメモリーを読み書きすることもありません。
246
254
  - **バックアップ** が使うのは、固定の 1 つのフォルダー `~/Desktop/dsh-backups` だけです(dsh-backup の既定のフォルダーなので、dsh-backup のアーカイブも引き続き使えます)。別のフォルダーを選ぶ設定はありません。アーカイブの大きさは、`cache/` と `dsh-runtimes/` を除いた dsh のホームとほぼ同じです(測定:Apple Silicon で、1.6 GB のファイルから約 30 秒で 830 MB のアーカイブができました。その間も dsh は応答し続けました)。読み取り中に変わったファイルは、バックアップがそのファイルを開いた時点の状態で保存されます。そのため、開いているチャットのログが、途切れたレコードで終わることがあります。これは、dsh が次の書き込みで修復します。マスクでは、yml ファイル内のシークレットを、1 行にあるキーの名前(`token:`、`apiKey:`、…)で見つけます。フローマップ内(`{token: x}`)、そのようなキーの下のリスト内、JSON ファイル内(たとえば、`.json` ファイル内にある MCP サーバーの `apiKey`)、または別の名前のシークレットは、アーカイブに残ります。dsh-backup の種類別アーカイブ(`dsh-t-…`)は一覧に表示されません。**別のコンピュータ用** はアーカイブをコピーします(APFS ではクローンなので、追加の容量は使いません)。vault は一緒にコピーされません。**今すぐバックアップ** はバックアップを削除しません。自動バックアップは、Composer Plus が作成したバックアップのうち最新のものを保持し(**自動バックアップ** の **保持** の設定)、それより古い自身のバックアップを削除します。アップグレード前のスナップショットは別に数えます(最新の 2 件が残ります)。dsh-backup のアーカイブが削除されることはありません。**削除** で取り除いてください。dsh-backup がまだインストールされている間は、dsh-backup が自身の保持件数に Composer Plus のアーカイブを数え、それらを削除することがあります。
@@ -277,6 +285,8 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
277
285
 
278
286
  **DS Bot のメモリーのように、エージェントがチャットをまたいで好みを覚えておけますか?** はい、**プロジェクトメモリー**(既定ではオフ)で可能です。**設定 → Composer Plus** でオンにしてください。ターンが終わるたびに、長く続く好みや決定がチャットのプロジェクトの短いメモとして保存され、そのプロジェクトの新しいチャットがそれを読みます。エージェントに何かを覚えるように頼むと、すぐに保存します。メモを見たり変えたりするには、同じ行の **メモリーを開く** を押して、変更する内容を書いてください。
279
287
 
288
+ **Kanzo のように、エージェントと 1 つのタスクボードを共有できますか?** はい、**タスクボード**(既定でオン)で可能です。左サイドバーで開き、**新しいタスク** でタスクを追加します。チャットでエージェントに「ボードから次のタスクを取って」と頼むと、エージェントはカードを **作業中** に移し、行ったことをコメントして **レビュー** に移します。自分で行うタスクには **手動** の印を付けてください。
289
+
280
290
  **dsh-backup のように、dsh でチャットや設定をバックアップできますか?** はい。**設定 → Composer Plus → バックアップ → 今すぐバックアップ** を使います。同じ形式のアーカイブを同じフォルダー(`~/Desktop/dsh-backups`)に書き込むため、dsh-backup のアーカイブも表示され、復元できます。dsh-backup は削除してかまいません。定期的にバックアップするには、**自動バックアップ** をオンにしてください。
281
291
 
282
292
  **dsh が起動しなくなりました。バックアップを復元するには?** バックアップフォルダー(`~/Desktop/dsh-backups`)を開き、`Composer Plus Rescue.command` をダブルクリックします(Linux:`composer-plus-rescue.sh`、Windows:`Composer Plus Rescue.cmd`)。`3) Restore a backup` を選び、バックアップを 1 つ選んで `RESTORE` と入力します。dsh がなくても動作します。
@@ -301,6 +311,8 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
301
311
 
302
312
  **1 つのチャットが変更したファイルだけを見るには?** 右サイドバー → **変更** → **このチャット** を開きます。空白だけの変更を隠すには、**␣** をクリックします。
303
313
 
314
+ **エージェントが `npm publish` や `git push --force` を実行しないようにするには?** **設定 → Composer Plus → ブロックされたコマンド** で `npm publish` を入力し、**ブロック** または **先に確認** を選んでから、**追加** をクリックします。**ブロック** はコマンドを拒否し、エージェントはあなたに確認します。**先に確認** は毎回承認カードを表示します。「保護されたファイル」はエージェントのファイルツールを、「ブロックされたコマンド」はシェルコマンドを対象にします。
315
+
304
316
  **1 つのチャットで、自動レビューが同じツールについて何度も確認しないようにするには?** 承認カードの **このチャットで許可** をクリックします。対象は、そのチャットのその特定のツールだけで、既定では 1 時間有効です。許可は、ヘッダーのチップから取り消せます。時間は **設定 → Composer Plus → このチャットで許可** で変更できます。
305
317
 
306
318
  **iPhone をなくしました。その iPhone が Mac に接続できないようにするには?** サイドバーの左下にある **モバイル接続** をクリックし、その iPhone の横にある **Remove** をクリックします。その iPhone の鍵はすぐに使えなくなります。再び接続するには、Mac で承認する新しいペアリングが必要です。
@@ -329,6 +341,8 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
329
341
 
330
342
  **iPhone から写真を送れますか?** はい。Tether のチャットで、メッセージ欄の横の **+** → Camera、Photos(最大 4 枚)、または Paste image をタップします。写真はメッセージの添付ファイルとして Mac のチャットに届くため、モデルはそれを見ることができます。
331
343
 
344
+ **モデルに再度問い合わせずに、dsh が次のコマンドを実行できますか?** はい、**計画済みステップ**(既定ではオフ)を使います。設定 → Composer Plus でオンにしてください。モデルは次のコマンドを条件付きで計画できるようになり(例:「ビルドが通ったらテストを実行」)、結果が条件を満たすと、Composer Plus がモデルを呼び出さずにそのステップを実行します。承認とサンドボックスはそのままです。
345
+
332
346
  **デスクトップアプリで使えますか?** はい。設定 → プラグイン → **プラグインを追加** → `dsh-composer-plus` でインストールします。dsh 0.2.0-rc.2(デスクトップと Web)と 0.2.1-rc.2(Web)でテストしています。
333
347
 
334
348
  ## 開発
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
393
407
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
394
408
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
395
409
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
410
+ # Task board: the page, the agent tools (fake model), drag and drop, search, the switch
411
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
396
412
  ```
397
413
 
398
414
  ```sh