dsh-composer-plus 1.23.0 → 1.24.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.de.md +12 -5
- package/README.es.md +12 -5
- package/README.fr.md +12 -5
- package/README.hi.md +12 -5
- package/README.id.md +12 -5
- package/README.ja.md +12 -5
- package/README.ko.md +12 -5
- package/README.md +12 -5
- package/README.pt-BR.md +12 -5
- package/README.ru.md +12 -5
- package/README.tr.md +12 -5
- package/README.vi.md +12 -5
- package/README.zh.md +12 -5
- package/assets/features/assistant.webp +0 -0
- package/client.js +148 -48
- package/index.js +334 -1
- package/package.json +2 -2
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +17 -7
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.
|
|
32
|
+
> dsh の pnpm は、公開から 24 時間たっていないバージョンをスキップします。リリース直後は、バージョンを指定してください:`dsh-composer-plus@1.24.0`。
|
|
33
33
|
|
|
34
34
|
## 機能
|
|
35
35
|
|
|
@@ -75,6 +75,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
75
75
|
| **保護されたファイル** | <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> |
|
|
76
76
|
| **ブロックされたコマンド** | <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> |
|
|
77
77
|
| **タスクボード** | <a id="feature-taskboard"></a>左サイドバー → **タスクボード**。dsh のどこでも `Cmd+Shift+K`(Windows と Linux では `Ctrl+Shift+K`)でも開けます。サイドバーと同じライブの状態を表示する、dsh のチャットのカンバンボードです。承認、回答、計画のレビューを待っているチャットはオレンジの点付きで **レビュー** に、実行中のチャットは **作業中** に、まだ開いていない終わったチャットは **完了**(緑)に入ります。チャットを開くと、そのカードは **完了** から自動で外れます。緑のカードの下にある **最近完了 (N)** をクリックすると、読んだ終わったチャットを表示できます(新しい 10 件、続きは **古いタスクを N 件表示**。開閉の状態はこのデバイスに保存されます)。ボードの裏で開いたまま終わったチャット(**新しいタスク**)は、開くまで緑のままです。ボード上部のプロジェクト名をクリックするとプロジェクト一覧が開きます。そこでプロジェクトか **すべてのプロジェクト** を選びます。チャットごとのブランチのフォルダーは、そのプロジェクトとして扱われます。一覧は、選んだとき、`Esc` を押したとき、一覧の外をクリックしたときに閉じます。一覧の上部の **プロジェクトを検索** に入力すると、名前でプロジェクトを探せます(大文字と小文字、アクセント記号は区別しません。`Esc` で入力欄を空にします)。`Enter` を押すと、最初に一致したプロジェクトを選びます。**過去 2 時間以内にアクティブ** をクリックすると、待機中、実行中、未確認のまま完了、または過去 2 時間以内に変更されたチャットがあるプロジェクトだけを表示します(この設定はこのデバイスに保存されます)。**新しいタスク**(または `n`)は、ボードが表示しているプロジェクトで dsh 自身の新しいチャットを開きます(**すべてのプロジェクト** のときは、dsh の新しいセッションが選ぶプロジェクトです)。そのため、ほかのチャットと同じように、ファイルを追加し、コマンドを使い、モデルを選べます。最初のメッセージを送ると、自動でボードに戻ります。それまで、そのチャットは **作業中** の一番上で **新しいタスク** として待ちます。クリックすると、最初のメッセージを書けます。あなたを待っているチャットがあるプロジェクトには、プロジェクト一覧でオレンジの点が付きます(どれかのチャットが待っている間は、上部のプロジェクト名にも付きます)。dsh がチャットに名前を付け、チャットのモデルがそのメッセージから最大 3 個のタグを付けます。カードをクリックすると、そのチャットが開きます。オレンジのカード(またはその **回答**)をクリックすると、ボード上で回答できます。チャット全体はパネルの **チャットを開く** で開けます。承認のリクエストには **拒否** か **1回だけ許可**、計画には **承認** か **変更をリクエスト**、質問には選択肢か自分のテキストで答えます。終わったカードで **×** をクリックすると、そのカードをボードから外せます。**最近完了** を開いて **完了** の上部にある **すべてクリア** をクリックすると、それらのカードをボードから外せます。先に、どのプロジェクトのカードが何枚外れるかが表示され、未読(緑)のカードは残ります。その後 8 秒間は、**元に戻す** でカードを戻せます。**完了** の下の **外したカード (N)** には、ボードから外したカードが一覧表示され、**ボードに戻す** で 1 枚を再び **完了** に表示できます。チャットは削除されません。チャットは dsh のサイドバーに残り、ボードは再起動の後もこれを覚えています(Tether にも同じボードが表示されます)。再び実行されたチャットは、ボードに戻ります。**作業中** のカードにポインターを合わせる(またはキーボードのフォーカスを移す)と、その進行状況が表示されます。実行時間、ToDo リストのステップ、いま実行中のツール、エージェントの最後の行です。設定 → Composer Plus → タスクボード の **ホバーで進行状況を表示** で、**高速(AI なし)**(既定:チャットを読むだけです)か **AI の要約**(チャットのモデルを短く 1 回呼び出し、1〜2 文も書きます)を選びます。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="スクリーンショット: タスクボード"></a> |
|
|
78
|
+
| **アシスタント** | <a id="feature-assistant"></a>既定ではオフです。**設定 → Composer Plus** でオンにしてください。次に、左サイドバーの **アシスタント**(**タスクボード** のすぐ下)をクリックします。ChatGPT や Grok のチャットのように、パーソナルアシスタントとして使う、長く続く 1 つのチャットが開きます。最初のクリックでフォルダー `~/Assistant` を作り、それをプロジェクト「Assistant」として追加し、workspace-write 権限モードと dsh の既定のモデルでチャットを開始します。その後のクリックでは、毎回同じチャットが開きます(アーカイブしたチャットは戻り、削除したチャットは新しく作られます)。リマインダーを頼むと(「2 分後に水を飲むようにリマインドして」)、dsh のスケジュールされたタスクを使います。そのため、その時刻にリマインダーがチャットを実行し、モバイル接続がオンのときは Tether が「Turn finished」の通知を送ります。Web の検索や、ほかのチャットについても頼めます。すべてのプロジェクトのチャット(実行中、あなたを待っている、アイドル)を一覧表示し、1 つのチャットの最新のメッセージを読めます。また、チャットへのメッセージ送信、プロジェクトでの新しいチャットの開始、実行中のチャットの停止、チャットのアーカイブもできます。この 4 つの操作は、それぞれ先に dsh の承認カードを表示し(Tether にも表示されます)、あなたが **1回だけ許可** をクリックするまで何も起きません。削除のツールはありません。これらのツールと短い指示があるのは、このチャットだけです。Web ページやほかのチャットで読んだテキストは、命令ではなくデータとして扱われます。毎回プロフィールを伝える代わりに、このプロジェクトのメモリー(**プロジェクトメモリー**、トピック「profil」)に保存してください。 | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="スクリーンショット: アシスタント"></a> |
|
|
78
79
|
| **プロジェクトメモリー** | <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> |
|
|
79
80
|
| **メモリーのバージョン履歴** | <a id="feature-memoryhistory"></a>**プロジェクトメモリー** がオンの間、既定でオンです。メモリーを保存するたびに(エージェント、ターン後のレビュー、**メモリーを開く**)、保存前のメモのコピーが残ります。**メモリーを開く** でプロジェクトまたは **グローバルメモリー** を選び、**履歴** を押すと、日付順のバージョンと、それぞれの後にメモリーを変更したものが表示されます。バージョンを選ぶと復元で変わる内容が差分で表示され、**復元** できます。復元前のメモも残るので、復元は元に戻せます。各メモリーの最新 50 バージョンが残ります。Tether では:チャットのタイトルメニュー → Project memory → History。 | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="スクリーンショット: メモリーのバージョン履歴"></a> |
|
|
80
81
|
| **メモリーを AGENTS.md に書き出す** | <a id="feature-memoryexport"></a>**メモリーを開く** でプロジェクトを選び、**AGENTS.md に書き出す** を押すと、そのプロジェクトのメモがフォルダー内の `AGENTS.md` の目印付きセクションに書かれます。コミットしてチームや他のエージェントツールと共有できます。まず変更が差分で表示され、**AGENTS.md に書き込む** を押したときだけ保存されます。次の書き出しはこのセクションだけを置き換えます。グローバルメモリー、出典、日付は書かれません。Tether では:チャットのタイトルメニュー → Project memory → Export to AGENTS.md。 | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="スクリーンショット: メモリーを AGENTS.md に書き出す"></a> |
|
|
@@ -103,7 +104,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
103
104
|
| **選択肢ボタン** | <a id="feature-optionpicks"></a>回答が選択肢のリスト(「選択肢」見出しまたは太字の「選択肢」行の下にある 1~9 項目の番号付きリスト。「次のステップ」やアプリの各言語の同じ語も対象)で終わると、回答の下に選択肢ごとのボタンが表示されます。クリックすると、選択肢全体を含む「Option N: …」が、入力したのと同じようにあなたのメッセージとして送信されます。「(推奨)」の付いた選択肢は強調されます。ボタンは最新の回答の下にだけ、チャットが待機中で入力欄が空のときに表示されます。選択済みの回答と、ロールバックで取り消された回答には表示されません。ボタンの表示中は、次のメッセージの予測は候補を出しません。エージェントの質問カードでは、1~9 キーでクリックと同じくその選択肢を選べます(回答欄の中と、質問が表示されてから最初の 0.8 秒間は除く)。 | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="スクリーンショット: 選択肢ボタン"></a> |
|
|
104
105
|
| **アプリケーションの言語** | <a id="feature-language"></a>設定 → Composer Plus → **アプリケーションの言語** で、dsh のインターフェース全体を Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt、हिन्दी のいずれかに切り替えます(下記を参照)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="スクリーンショット: アプリケーションの言語"></a> |
|
|
105
106
|
| **モバイル接続(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) アプリを使うと、同じ Wi-Fi で、または [Tailscale](https://tailscale.com) 経由で、iPhone から dsh を使えます。**設定 → Composer Plus** でオンにしてください(この Mac でネットワークポートを開くため、既定ではオフです)。次に、サイドバーの左下にある **モバイル接続** をクリックします。iPhone のカメラ(**Open in Tether** をタップ)または Tether の **Scan code** で QR コードを読み取り、**Connect** をタップして、**Approve** をクリックします。先に Tether をインストールしてください。Tether がないと、カメラはこのコードを開けません。スマートフォンでは、チャットの表示、メッセージの送信(写真付き:入力欄の **+** → Camera、Photos、Paste image)、承認と質問への回答、モデルとエージェントの切り替えができます。ペアリングできる Mac の数に制限はありません。アプリの左上にある Mac の名前で、Mac を切り替えます。**モバイル接続** パネルには、ペアリング済みの iPhone が最後の接続日時とともに表示され、**Remove** でその iPhone をすぐに切断できます。「Tailscale only」はローカルネットワークからの接続を拒否し(共有の Wi-Fi 向け)、アクセスログには接続を試みた相手が表示されます。Tether では、「Settings → Privacy」で Face ID によるアプリのロックを設定できます。 | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="スクリーンショット: モバイル接続(iPhone)"></a> |
|
|
106
|
-
| **リモートコンピュータ** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com) 経由でほかの Mac の dsh を開き、この dsh のウインドウで使えます。各 Mac の **設定 → Composer Plus** でオンにしてください(ネットワークポートを開くため、既定ではオフです)。開きたい Mac で **ほかのコンピュータからこの Mac を開けるようにする** をオンにし、**ペアリングリンクを作成** をクリックして、リンクをコピーします。この Mac では、左サイドバーのコンピュータの選択メニュー(ブランド名の右、**新しいセッション** の上)で **コンピュータを追加…** を選び、リンクを貼り付けて、**名前** を入力し(この Mac やほかのコンピュータと同じ名前は使えません)、**接続** をクリックします。次に、もう一方の Mac で **承認** をクリックします。以後、選択メニューには **この Mac** とあなたのコンピュータが表示されます。1 台を選ぶと、その dsh がこのウインドウ全体に表示され、そのコンピュータ自身のチャット、サイドバー、ツール、ファイルを使えます。その間も、この Mac
|
|
107
|
+
| **リモートコンピュータ** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com) 経由でほかの Mac の dsh を開き、この dsh のウインドウで使えます。各 Mac の **設定 → Composer Plus** でオンにしてください(ネットワークポートを開くため、既定ではオフです)。開きたい Mac で **ほかのコンピュータからこの Mac を開けるようにする** をオンにし、**ペアリングリンクを作成** をクリックして、リンクをコピーします。この Mac では、左サイドバーのコンピュータの選択メニュー(ブランド名の右、**新しいセッション** の上)で **コンピュータを追加…** を選び、リンクを貼り付けて、**名前** を入力し(この Mac やほかのコンピュータと同じ名前は使えません)、**接続** をクリックします。次に、もう一方の Mac で **承認** をクリックします。以後、選択メニューには **この Mac** とあなたのコンピュータが表示されます。1 台を選ぶと、その dsh がこのウインドウ全体に表示され、そのコンピュータ自身のチャット、サイドバー、ツール、ファイルを使えます。その間も、この Mac は裏で動き続けます。選択メニューは同じ場所にあり、**この Mac に戻る** と表示されます。クリックすると戻れます。コンピュータが 2 台以上ある場合は、クリックでメニューが開きます。そこで **この Mac** か別のコンピュータを選びます。設定パネルでは、コンピュータの名前の変更と削除ができ、この Mac を開けるコンピュータの一覧も表示されます(**削除** でその 1 台をすぐに切断できます)。 | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="スクリーンショット: リモートコンピュータ"></a> |
|
|
107
108
|
| **自動アップデート** | <a id="feature-autoupdate"></a>dsh の起動時に、プラグインは [GitHub の最新リリース](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) を確認します。そのリリースのほうが新しく、すでに npm にある場合は、dsh 標準のプラグインマネージャー(設定 → プラグインと同じ経路)でそのバージョンをインストールし、通知します。読み込むには、dsh を再起動してください。**設定 → Composer Plus → Composer Plus のアップデート** にはバージョンが表示され、**アップデートを確認** / **今すぐアップデート** のボタンがあります。新しいバージョンで dsh を初めて起動すると、**Composer Plus N の新機能** ウィンドウにそのバージョンのリリースノートが **アプリケーションの言語** で選んだ言語で 1 回だけ表示されます(ノートは新しいバージョンに含まれていて、追加の通信はありません。その言語のノートがない場合は英語のノートが表示されます)。**閉じる** または `Esc` で閉じます。ノートの下に GitHub のスターをお願いする 1 行が、30 日に 1 回まで表示されます(通信はありません)。**GitHub でスターを付ける** または **今後は表示しない** をクリックすると、もう表示されません。 設定 → プラグイン やコピーしたフォルダーで更新した後も、新しいバージョンごとに 1 回このウィンドウが表示されます。最初のインストール時には表示されません。更新の行にある **このバージョンの新機能** で再び開けます。実行中のバージョンより新しいバージョンがディスクにある場合、行に dsh を再起動するよう表示されます。 | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="スクリーンショット: 自動アップデート"></a> |
|
|
108
109
|
| **オン/オフ フィルター** | <a id="feature-featurefilter"></a>**設定 → Composer Plus** の **機能を検索** の横にあります。**すべて** はすべての機能を、**オン** はスイッチがオンの機能だけを、**オフ** はスイッチがオフの機能だけを表示します。判断するのは各行のスイッチで、dsh の Host が保存するスイッチ(たとえば **モバイル接続**)も含みます。検索と一緒に使えます。語を入力して **オフ** を選ぶと、オフにした機能が見つかります。**オン** または **オフ** を選んでいるときに切り替えた行は、もう一度フィルターを選ぶまで残るので、フォーカスはそのスイッチにとどまります。**オン** と **オフ** では、**アプリケーションの言語** と **Composer Plus のアップデート** の行は表示されません(スイッチがないため)。設定は毎回 **すべて** で開きます。 | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="スクリーンショット: オン/オフ フィルター"></a> |
|
|
109
110
|
| **issue を報告** | <a id="feature-issuereport"></a>設定 → Composer Plus → **issue を報告…**(冒頭の説明の下)、またはサイドバーのチャットを右クリック(またはチャットの **…** メニューを開く)→ **Composer Plus の issue を報告…**。種類を選びます:**バグ**、**機能リクエスト**、**改善**、**翻訳**、または **質問**。自分の言葉と言語で内容を書き、**下書きを書く**(または `Cmd/Ctrl+Enter`)をクリックします。dsh の既定のモデルを 1 回呼び出して、英語の issue を書きます。内容は、種類の接頭辞が付いたタイトル(例:`[Bug]`)、その種類のセクション(バグの場合:What happened、Steps to reproduce、Expected、Actual)、Composer Plus、dsh、システムのバージョンを書いた 1 行です。タイトルと説明を読んで編集してください。**もう一度書く** で新しい下書きを書きます。**issue を作成** は、あなたの GitHub CLI(`gh`)のログインで Composer Plus の GitHub リポジトリに issue を作成し、そのリンクを表示します。issue は公開されます。キーやパスワードのように見えるテキストは拒否されます。`gh` で作成できないときは、**代わりに GitHub で開く** が、下書きを入力した GitHub 自身のページを開きます。 | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="スクリーンショット: issue を報告"></a> |
|
|
@@ -198,6 +199,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
198
199
|
- **新しいチャットで続ける:** クリックするまで、何も実行されません。クリックすると、ホスト側はチャット(目標チェックと同じ読み方です。推論とロールバックで取り消したステップは含みません)をチャット自身のモデルに送り、引き継ぎメモを表示します。新しいチャットを作るのは **新しいチャットを開始** だけです。プロジェクトには何も書き込みません。
|
|
199
200
|
- **コンテキストの内訳:** ホスト側でチャットのログだけを読みます。モデル呼び出しはせず、プロジェクトのファイルも読みません。
|
|
200
201
|
- **タスクボード:** ボードは、このウィンドウにある dsh 自身の一覧から、dsh 自身のチャットを表示します。独自のチャットデータは追加しません。**新しいタスク** は dsh 自身の新しいチャットを開き、最初のメッセージはあなたが dsh の入力欄で書きます。そのため、承認、サンドボックス、チャットのモデルはいつもどおり適用されます。ホスト側は、そのチャットの最初のメッセージをカードのプロンプトとして保存し、最大 3 個のタグを得るために、それ(最初の 4,000 文字だけで、ほかには何も送りません)を、ツールなしのもう 1 回のリクエストでそのチャットのモデルに送ります。各タスクのプロンプト、タグ、開始時刻は `$DSH_HOME/storages/dsh-composer-plus/board-chats.json`(所有者のみのファイル、最新の 2,000 件)に保存されます。**×** または **すべてクリア** でボードから外したチャットの ID(最新の 5,000 件)も、このファイルに保存されます。スイッチはその隣の `board-switch.json` にあります。プロジェクトのフォルダーには何も書き込みません。**回答** は、チャット自身のカードと同じ方法で、dsh 自身の保留中のリクエストに回答を送ります。以前のバージョンの古いタスク一覧(`board.json`)はディスク上にそのまま残り、読み込まれません。**ホバーで進行状況を表示** は、この Mac 上でチャットのログを読みます。**高速(AI なし)**(既定)では何も送りません。**AI の要約** では、実行中のカードの進行状況ボックスが表示されている間(または Tether のボードが開いている間、実行中のカード最大 8 枚について)、ホスト側がそのチャットの最新の部分(最大で約 6,000 文字。あなたのメッセージ、エージェントのテキストの返信、そのツール呼び出しと結果の末尾。推論とロールバックで取り消したメッセージは含みません)を、ツールなしの 1 回のリクエストでチャットのモデルに送ります。再び送るのはチャットが進んだ後だけで、チャットごとに最大 20 秒に 1 回です。メモはメモリーにだけ保持されます。設定は `$DSH_HOME/storages/dsh-composer-plus/board-progress.json`(所有者のみのファイル)にあります。
|
|
202
|
+
- **アシスタント:** アシスタントのチャットは、`~/Assistant` にある通常の dsh のチャットです。モデルの呼び出しは、ほかのチャットと同じく dsh の既定のモデルに送られます。ツールは、この Mac 上でほかのチャットのログ(タイトル、プロジェクト、状態、chat_read ではその最新のメッセージ)を読み、モデルがツールを呼び出したときだけ、それをそのモデルに渡します。チャットへの送信、開始、停止、アーカイブは、それぞれあなたの承認を待ちます。チャットの ID は `$DSH_HOME/storages/dsh-composer-plus/assistant.json` に、スイッチは `assistant-switch.json` に保存されます(所有者のみのファイル)。リマインダーと自動化は dsh 自身のスケジュールされたタスクです。このチャットが行うモデルのリクエストと Web 検索のほかには、何もこの Mac の外に出ません。
|
|
201
203
|
- **保護されたファイル:** リストとスイッチは `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(所有者のみのファイル)にあります。チェックが読むのは、各ファイルツール呼び出しのパス(とその実際のパス)だけで、ファイルそのものは読みません。
|
|
202
204
|
- **ブロックされたコマンド:** ルールとスイッチは `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json`(所有者のみのファイル)にあります。チェックが読むのは、各 `bash` と `pwsh` 呼び出しのコマンドテキストだけです。何も実行せず、何も送信しません。
|
|
203
205
|
- **シークレット入力:** 値は回答リクエストの中だけで、カードから(または Tether から、リクエスト本文を記録しないゲートウェイ経由で)Host に送られます。Host は値を `$DSH_HOME/storages/dsh-composer-plus/secrets/<ランダムな名前>` に書き込みます(フォルダ 0700、ファイル 0600)。プロジェクト、チャットの記録、ツール結果には何も書き込まれません。Host はそのチャットの後のツール結果で値を `[secret]` に置き換えるため、値をメモリに保持します。ファイルとこのコピーは、そのチャットのターンが終わったときと dsh の起動時に削除されます。スイッチは同じ場所の `secrets.json` にあります。エージェントがこのファイルを使って実行するコマンドは、そのコマンドの送信先に値を送れます。それがこの機能の目的です。
|
|
@@ -224,7 +226,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
224
226
|
- **チャット行にブランチのラベルがない:** 原因は次のいずれかです。サイドバーが「1つのリスト」表示ではない(「ワークスペース」と「ワークスペースのツリー」では、どのチャット行にもラベルは表示されません)。このバージョンをインストールしてから、そのチャットにターンがない。フォルダーが git リポジトリではない。**チャット行の Git ブランチ** がオフになっている。アップデートの後は、dsh を再起動してください(ブランチはホスト側が記録します)。
|
|
225
227
|
- **目標チェックで、テストが終了コード 127 または「not found」で終了したと表示される:** Finder や Dock から起動した dsh は、ターミナルより PATH が短いことがあるため、`npm`、`pnpm`、`cargo` が見つかりません。ターミナルから dsh を起動するか、**目標チェック** → **編集** で、フルパスを使った独自のテストコマンドを設定してください。**今すぐ実行** を使うと、すぐに結果が表示されます。
|
|
226
228
|
- **目標が閉じず、エージェントが作業を続ける:** **目標チェック** が、失敗したテストまたは足りない作業を見つけました。目標の下の行に理由が表示されます(詳細は、結果にポインターを合わせると表示されます)。原因またはテストコマンドを直すか、`/goal` または目標バーで目標を自分で完了してください(その完了はチェックされません)。
|
|
227
|
-
- **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.
|
|
229
|
+
- **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.24.0`)。上のインストールの注記を参照してください。
|
|
228
230
|
- **今すぐバックアップ で「別のバックアップ操作を実行中です」と表示される:** 別の dsh のウィンドウ、またはレスキューコンソールで操作が実行中です(どちらも、バックアップフォルダーのロックファイル `.composer-plus.lock` を共有します)。完了するまで待ってください。実行中の操作がない場合は、次のクリックで、終了したプロセスのロックを引き継ぎます。
|
|
229
231
|
- **レスキューコンソールで「dsh is running」と表示される:** まず dsh を終了してください。dsh が本当に閉じている場合、メッセージに示されたファイルはクラッシュで残ったものです。そのファイルを削除して、もう一度試してください。
|
|
230
232
|
- **復元の後に dsh が起動しない、またはプラグインが見つからない:** プロファイルのプラグインパッケージを、もう一度インストールする必要があります。レスキューコンソールが、復元の後にこれを提案します。または、コンソールが一覧表示する `$DSH_HOME/profiles/` の下の各フォルダーで `pnpm install` を実行してください。vault に入っていなかったシークレット(別のコンピュータ)は、もう一度入力する必要があります。コンソールがそれらを一覧表示します。
|
|
@@ -258,7 +260,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
258
260
|
- **質問カードをウィンドウに合わせる**は dsh の質問カードだけを変更し、計画レビューのカードは変更しません。カードは dsh のマークアップ(`data-question-key`、`data-question-scroll`)で見つけます。dsh の更新でこのマークアップが変わると、カードは dsh が描くとおりに表示されます。カードの高さはチャットではなくウィンドウに従います。狭いサイドパネル内のチャットでは、高いカードがチャットの上にはみ出すことがあります。
|
|
259
261
|
- **チャットのヘッダーをウィンドウに合わせる**は、dsh が生成したクラス名(`_titleRow`、`_titleCluster`、`_crumbs`、`_headerActions`、`_headerUtilities`)でチャットのヘッダーを見つけます。dsh にはヘッダーのレイアウト用のフックがないためです。dsh の更新でこれらの名前が変わると、ヘッダーは dsh の表示のままになります。とても狭いチャット列ではヘッダーが 2〜3 行になり、メッセージの上の領域が低くなります。
|
|
260
262
|
- **モバイル接続** は macOS でのみ動作します(`en0`、`openssl`、`swift`、`dns-sd` を使います)。固定のポート 19390 と 19391 を使うため、各 Mac でこれを実行できる dsh は、一度に 1 つだけです(スマートフォンの Mac の一覧では、各 Mac が 1 項目になります)。`apns.json` に APNs キーがあると(`tether/README.md` を参照)、Mac は Apple のプッシュサービスで通知を送るため、Tether を閉じていても通知が届きます。Mac はスリープせず、dsh が開いている必要があります。キーがない場合、スマートフォンが通知を受け取るのは、Tether が開いているとき、またはバックグラウンドに移った直後だけです。Tether で「Settings → Notifications → Send notifications」をオンにするまで、Tether は通知を送りません。Tether は、この設定と時間帯をペアリング済みの Mac ごとに別々に保存します。この設定はどの Mac でも初期状態でオフで、オンにしたときに iOS が許可を求めます。iOS アプリは、まだ App Store にありません。Xcode で `tether/ios` からビルドしてください。「Tailscale only」でも、Mac に Wi-Fi または Ethernet のアドレスが必要です(ゲートウェイは、そのアドレスがある場合だけ起動します)。アクセスログは Mac ごとに保存され、最新 200 件の試行だけを残します。1 分以内に繰り返された試行は、新しい行を作らず、同じ行の回数を 1 つ増やします。各通知には Mac とチャットのプロジェクト(`Studio Mac · recipe-box`)、チャットのタイトル、本文が表示されます。Turn finished にはエージェントの最後の返信が表示されます。APNs キーがある場合、この本文は Apple のプッシュサービスを通ります。Tether のアプリのロックは、iPhone のロック画面に表示される通知のプレビューを隠しません。iOS の設定でオフにしてください。Tether の緑の点は Mac に従います。dsh で開いたチャットは、スマートフォンでも点が消えます。Tether で開いたチャットは、スマートフォンでだけ点が消えます。Mac 上の dsh 自身の点は、Mac でそのチャットを開くまで残ります。
|
|
261
|
-
- **リモートコンピュータ** を使うには、両方の Mac に Tailscale が必要です。また、開く対象の Mac に、この機能をオンにした Composer Plus が必要です。その Mac はスリープしておらず、dsh が動作している必要があります。選択メニューは、左サイドバーを開いているときだけ表示されます(アイコンだけの表示では表示されません)。もう一方の Mac
|
|
263
|
+
- **リモートコンピュータ** を使うには、両方の Mac に Tailscale が必要です。また、開く対象の Mac に、この機能をオンにした Composer Plus が必要です。その Mac はスリープしておらず、dsh が動作している必要があります。選択メニューは、左サイドバーを開いているときだけ表示されます(アイコンだけの表示では表示されません)。もう一方の Mac のページに自身の選択メニューがない場合(そちらの Composer Plus が 1.23.0 より古い場合)、この Mac の選択メニューが同じ場所でそのページの上に表示されます。そちらが 1.23.0 の場合、選択メニューにはその Mac の名前が表示されます。戻るには、そのメニューで **この Mac** を選びます。開いた各コンピュータのページは、この機能をオフにするか dsh を再起動するまでメモリに残ります。デスクトップアプリでは、もう一方の Mac のページは埋め込みページです。dsh 自身のキーボードショートカット(たとえば新しいチャット)はその中では動作せず、ファイルのダウンロード、マイク、通知もそこでは動作しません。ポート 19392 を使います(ほかのコンピュータを受け入れられる dsh は、各 Mac で 1 つだけです)。ほかの Mac のページの選択メニューは、この Mac のコンピュータの間でしか切り替えられません。そのため、もう一方の Mac を経由して 3 台目の Mac は開けません。
|
|
262
264
|
- セッションリンクは、チャットの中で機能します。クリックしても、そのチャットは開きません。**メッセージリンクをコピー** で作ったリンクでメッセージを開けるのは、dsh 0.2.1 以降で、チャットの中のメッセージから開いた場合だけです(dsh 0.2.0 にはユーザーテキストのルールがないため、リンクはコピーされますが、プレーンテキストとして表示されます)。ロールバックで取り除かれたメッセージや、圧縮によって dsh が読み込む履歴から削除されたメッセージは表示できません。その場合、リンクがそのことを表示します。🔗 ボタンは、dsh のメッセージ行に取り付けています。dsh のアップデートでそのマークアップが変わった場合、ボタンは表示されません。
|
|
263
265
|
- **すべて既読にする** は、公開 API ではない dsh の一部(dsh のセッション状態の `completionUnread` 一覧)を通じて、dsh 自身の未読の点を変更します。dsh のアップデートでこの名前が変わった場合、この項目は表示されません。この項目は dsh のプロジェクトの「…」メニューに入りますが、このメニューにはプラグイン用のスロットがありません。dsh がこのメニューを変更した場合も、この項目は表示されません。
|
|
264
266
|
- **キュー内のメッセージをその場で編集** は、その間に送信が始まったメッセージを変更せず、その間に変更されたメッセージ(たとえば iPhone の Tether で変更したもの)も上書きせず、そのことを通知で知らせます。新しい画像には画像を受け付けるモデルが必要で(dsh 標準の画像の制限も適用されます)、新しいファイルはアップロードが終わるまで保存できません。編集できるのは自分のキュー内のメッセージだけで、キュー内の目標のラウンドや質問への回答は編集できません。プラグインの更新後すぐに使えるのはテキストだけの編集で、画像やファイルを含むメッセージを保存する前には dsh を再起動してください(ホスト側は起動時に読み込まれます)。
|
|
@@ -294,6 +296,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
294
296
|
- **トルコ語スキルパック** はサードパーティのスキルを入れます。ルールは Composer Plus ではなく作者の GitHub リポジトリから来ており、新しい版は私たちが確認しないまま、次の日次確認から使われます。確認でわかるのは、ファイルがそのコミットで GitHub が示すファイルと同じことだけで、ルールがよいことではありません。スキルを読み込むタイミングはモデルが決めます(名前で呼び出すこともできます)。ルールはトルコ語の文章にだけ当てはまります。ホスト側は、ブラウザーが最後に伝えた言語を使います。2 つのブラウザーが別の言語を使うと、新しいほうが優先されます。GitHub はログインなしで 1 時間に 60 回まで API を受け付けます。確認が拒否されたときはインストール済みのコピーを残し、理由を設定に表示します。
|
|
295
297
|
- **コードベースを整理** には、スキルの固定コピー(caldoai/skills、コミット f3cf477)が入っています。元のスキルの変更は、新しい Composer Plus のバージョンでのみ届きます。このスキルは多くのファイルを変更しうる長い目標を実行し、そのサブエージェントと確認は多くのトークンを使います。テストのない部分では、気づかないうちに動作を変えることがあります。専用のブランチで開始し、マージ前に差分を読んでください。プロジェクト、カスタムのスキルフォルダー、または `~/.dsh/skills` に同じ名前のスキルがあると、そちらに置き換わります。スイッチがオフの間、`/untangle-codebase` は普通のテキストとしてモデルに送られます。
|
|
296
298
|
- **タスクボード** は、このウィンドウで dsh が一覧に表示するチャットを表示します。プロジェクトの外にあるチャットは **すべてのプロジェクト** にだけ表示され、チャットごとのブランチのフォルダー(`<project>/.worktrees/<name>`)はそのプロジェクトとして扱われます。カードの列はチャットのライブの状態なので、カードはドラッグできません。チャットはターンが終わると **完了** に移り(エラーや停止の後も同じです)、再び実行されると **作業中** に戻ります。緑の点は dsh 自身の完了の点で、dsh はこのウィンドウでだけこれを保持します。再読み込みの後、終わったチャットは緑の点なしで表示されます。**完了** には最新の 50 件のチャットが表示されます(**古いタスクを N 件表示** で残りを表示します)。**プロジェクトを検索** はプロジェクトを名前だけで探し、フォルダーのパスでは探しません。**過去 2 時間以内にアクティブ** は、プロジェクトのチャットがすべて 2 時間より古く、アイドル状態で既読のとき、そのプロジェクトを隠します。選んだプロジェクトは、ボードに表示されたままです。**新しいタスク** が覚えているのは、このウィンドウで最も新しい新規チャットだけです。最初のメッセージの前に別のチャットを開くと、そのチャットはあなたが書き込むまで **作業中** の一番上に **新しいタスク** として残りますが、自動でボードに戻るのは最も新しいチャットだけです。再読み込みの後、メッセージのない新しいチャットはボードに表示されません(dsh はそれを空の新しいセッションとして保持します)。タグは、タスクごとに、その最初のメッセージから 1 回のモデル呼び出しで作られます。タグが正しくないこともあり、ボードで開始しなかったチャットにはタグがありません。タイトルは dsh 自身のチャットのタイトルです(dsh のタイトルサービスが、チャットのモデルで作ります)。タイトルができるまで、カードには最初のメッセージの最初の行が表示されます。**×** と **すべてクリア** は、カードをボードから外すだけです。チャットは削除されません。**元に戻す** は、このウィンドウで 8 秒間だけ表示されます。その後は、**外したカード (N)** → **ボードに戻す** でカードを戻せます。再び実行されたチャットは、自動で戻ります。**すべてクリア** は、先に確認してから、表示しているプロジェクトの既読の終わったカードを外します(**すべてのプロジェクト** のときは、すべてのプロジェクトのカードです)。**古いタスクを N 件表示** の後ろにあるカードも外します。未読(緑)のカードは残ります。dsh は緑の点をこのウィンドウでだけ保持するので、再読み込みの後は、すべてクリアが、回答をまだ読んでいないカードを外すことがあります。この一覧はこの Mac に保存され、すべてのウィンドウと Tether で使われます。一覧が 5,000 件のチャットになると、最も古いチャットがボードに戻ります。**回答** が答えるのは、チャットの最新のリクエストだけです。そのリクエストに別の場所(別のウィンドウ、Tether、自動レビュー)で回答済みのとき、またはチャットが新しいことを尋ねているときは、パネルにそのことが表示され、何も送信しません。以前のバージョンには、コメントとエージェントのツールがあるタスク一覧がありました。これらはなくなり、古い `board.json` は表示されません。考え方と見た目は emanuele-em の [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)から来ています。Composer Plus はそのコードを使っていません。 `Cmd+Shift+K` は dsh のショートカットです。Linux のブラウザーでは既定のキーがありません(dsh のキーボードショートカットのページで設定してください)。また、ブラウザー拡張機能や別のアプリが先にこのキーを使う場合があります。カードが **完了** から外れるのは、dsh 自身の緑の点が消えたとき(チャットを開いたとき)です。ボードの裏で開いているチャットとして終わったチャットは、そのチャットが上にパネルのない状態で表示されたときに外れます。この既読の状態は dsh 自身の点と同じく、この dsh のウィンドウの中だけにあります。再読み込みの後や別のウィンドウでは、終わったチャットはすべて既読になり、**最近完了** に入ります。
|
|
299
|
+
- **アシスタント** のチャットは、この Mac のすべてのウィンドウで 1 つです。workspace-write 権限モードで動作します。ファイルを書き込むのは `~/Assistant` の中だけで、その外で実行するコマンドは先に確認を求めます。チャットを承認なしのモード(フルアクセス)に切り替えると、dsh は各承認を拒否するため、アシスタントはチャットへの送信、開始、停止、アーカイブができなくなります。承認カードが守るのは、この 6 つのツールだけです。そのモードのほかのチャットと同じく、アシスタントのシェルコマンドは、それでもネットワークにアクセスできます。dsh 0.2.0 と 0.2.1 では、dsh のスケジュールのツールはアシスタントのチャット自身のリマインダーだけを見て、ほかのチャットの自動化は見ません。dsh 0.2.2 からは、すべてのスケジュールされたタスクを一覧表示して変更します。chats_list は、アーカイブ済み、空、サブエージェントのチャットと、アシスタントのチャット自身を含みません。「あなたを待っている」は、実行中のチャットに未処理の承認、質問、計画のレビューがあることを意味します。chat_read が返すのは、ユーザーのメッセージとエージェントの返信(ツールの出力は含みません)で、最大 50 件のメッセージ、約 24,000 文字です。chat_archive は、まだ実行中のチャットや、有効なリマインダーがあるチャットを拒否します。モデルは、読んだテキストにだまされることがあります。承認カードが最後のチェックなので、**1回だけ許可** をクリックする前に内容を読んでください。
|
|
297
300
|
- **停止後の新規メッセージ優先** は、チャットを停止した後(または失敗したターンの後、まだキューがあるチャットを開いたとき)にだけ働きます。ターンの実行中に送信したメッセージは、これまでどおりキューの末尾で待ちます。追い越すのは自分がキューに入れたメッセージだけです。キューに目標のラウンドや質問への回答が待っている場合は、dsh 自身の順序のままです。公開 API ではない dsh の一部(停止したターンがまだ終了処理中かどうか)を読み取ります。dsh の更新でその名前が変わった場合、メッセージはそのターンが終わった後にだけ先頭に移ります。サブエージェントのチャットは dsh 自身の順序のままです。
|
|
298
301
|
- **プロジェクトメモリー** はチャットの最初のフォルダー(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 自身のメモリーを読み書きすることもありません。
|
|
299
302
|
- **メモリーのバージョン履歴** は各メモリー(各プロジェクトとグローバルメモリー)の最新 50 バージョンを残し、それより古いものは削除します。1 つのバージョンは 1 件のメモではなく、そのプロジェクトのメモリー全体です。**復元** はそのバージョンのすべてのファイル(トピックを含む)を戻し、バージョンを開いた後にメモリーが変わっていれば拒否します。復元前のメモリーは新しいバージョンになるので、復元は元に戻せます。スイッチがオフの間は新しいバージョンを残さず、**復元** は拒否されます。残したバージョンは消えません。この機能より前のバージョンはありません。履歴はインストール後の最初の保存から始まります。
|
|
@@ -347,6 +350,8 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
347
350
|
|
|
348
351
|
**すべてのチャットをカンバンボードで見て、そこから新しいチャットを開始できますか?** はい、**タスクボード**(既定でオン)で可能です。左サイドバーで開きます。各チャットは、**作業中**、**レビュー**(あなたを待っています)、**完了** のいずれかの列のカードになります。**新しいタスク** はプロジェクトで dsh の新しいチャットを開き、最初のメッセージを送るとボードに戻ります。オレンジのカードで **回答** をクリックすると、チャットを開かずに回答できます。**完了** の **すべてクリア** は、先に確認してから、読んだ終わったカードをボードから外します。**元に戻す** と **外したカード (N)** でカードを戻せます。チャットは dsh に残ります。
|
|
349
352
|
|
|
353
|
+
**リマインドしてくれて、ほかのチャットも管理してくれる個人アシスタントのチャットを使えますか?** はい、**アシスタント**(既定でオフ)で可能です。設定 → Composer Plus でオンにしてから、左サイドバーの **アシスタント** をクリックします。dsh のスケジュールされたタスクでリマインダーを設定し、Web を検索し、チャットを一覧表示して読みます。チャットへのメッセージ送信と、チャットの開始、停止、アーカイブは、あなたが承認した後にだけ行います。プロフィールは、そのプロジェクトメモリーのトピック「profil」に保存してください。
|
|
354
|
+
|
|
350
355
|
**dsh-backup のように、dsh でチャットや設定をバックアップできますか?** はい。**設定 → Composer Plus → バックアップ → 今すぐバックアップ** を使います。同じ形式のアーカイブを同じフォルダー(`~/Desktop/dsh-backups`)に書き込むため、dsh-backup のアーカイブも表示され、復元できます。dsh-backup は削除してかまいません。定期的にバックアップするには、**自動バックアップ** をオンにしてください。
|
|
351
356
|
|
|
352
357
|
**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 がなくても動作します。
|
|
@@ -389,7 +394,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
|
|
|
389
394
|
|
|
390
395
|
**iPhone をなくしました。その iPhone が Mac に接続できないようにするには?** サイドバーの左下にある **モバイル接続** をクリックし、その iPhone の横にある **Remove** をクリックします。その iPhone の鍵はすぐに使えなくなります。再び接続するには、Mac で承認する新しいペアリングが必要です。
|
|
391
396
|
|
|
392
|
-
**もう一方の Mac のチャットを、この Mac で続けるには?** もう一方の Mac で **設定 → Composer Plus → リモートコンピュータ** と **ほかのコンピュータからこの Mac を開けるようにする** をオンにし、**ペアリングリンクを作成** をクリックして、リンクをコピーします(たとえば AirDrop やメモで、自分に送ります)。この Mac でも **リモートコンピュータ** をオンにし、左サイドバーの選択メニュー(ブランド名の右、**新しいセッション** の上)で **コンピュータを追加…** を選び、リンクを貼り付けて、**名前** を入力し、**接続** をクリックします。次に、もう一方の Mac で **承認** をクリックします。以後は、同じメニューでそのコンピュータを選びます。そのコンピュータがこのウインドウ全体に表示されます。戻るには、同じ場所で **この Mac
|
|
397
|
+
**もう一方の Mac のチャットを、この Mac で続けるには?** もう一方の Mac で **設定 → Composer Plus → リモートコンピュータ** と **ほかのコンピュータからこの Mac を開けるようにする** をオンにし、**ペアリングリンクを作成** をクリックして、リンクをコピーします(たとえば AirDrop やメモで、自分に送ります)。この Mac でも **リモートコンピュータ** をオンにし、左サイドバーの選択メニュー(ブランド名の右、**新しいセッション** の上)で **コンピュータを追加…** を選び、リンクを貼り付けて、**名前** を入力し、**接続** をクリックします。次に、もう一方の Mac で **承認** をクリックします。以後は、同じメニューでそのコンピュータを選びます。そのコンピュータがこのウインドウ全体に表示されます。戻るには、同じ場所で **この Mac に戻る** をクリックします。その間も、この Mac のチャットは動き続けます。
|
|
393
398
|
|
|
394
399
|
**Face ID で Tether をロックできますか?** はい。Tether で「Settings → Privacy → Lock with Face ID」をオンにします。すると Tether は、開いたときと、アプリに戻ったときに Face ID(またはパスコード)を求めます。
|
|
395
400
|
|
|
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
|
|
|
499
504
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
500
505
|
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
|
|
501
506
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
507
|
+
# Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
|
|
508
|
+
SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
|
|
502
509
|
```
|
|
503
510
|
|
|
504
511
|
```sh
|
package/README.ko.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.
|
|
32
|
+
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.24.0`.
|
|
33
33
|
|
|
34
34
|
## 기능
|
|
35
35
|
|
|
@@ -75,6 +75,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
75
75
|
| **보호된 파일** | <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> |
|
|
76
76
|
| **차단된 명령** | <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> |
|
|
77
77
|
| **작업 보드** | <a id="feature-taskboard"></a>왼쪽 사이드바 → **작업 보드**. dsh 어디서나 `Cmd+Shift+K`(Windows와 Linux에서는 `Ctrl+Shift+K`)를 눌러도 열립니다. 사이드바와 같은 실시간 상태를 보여 주는 dsh 채팅의 칸반 보드입니다. 승인, 답변 또는 계획 검토를 기다리는 채팅은 주황색 점과 함께 **검토**에, 실행 중인 채팅은 **진행 중**에, 아직 열지 않은 끝난 채팅은 **완료**에 있습니다(초록색). 채팅을 열면 그 카드는 **완료**에서 저절로 빠집니다. 초록색 카드 아래의 **최근 완료 (N)**을 클릭하면 읽은 끝난 채팅을 볼 수 있습니다(최신 10개, 그다음 **이전 작업 N개 보기**; 열림/닫힘 상태는 이 기기에 저장됩니다). 보드 뒤에서 열린 채로 끝난 채팅(**새 작업**)은 열 때까지 초록색으로 남습니다. 보드 위쪽의 프로젝트 이름을 클릭하면 프로젝트 목록이 열립니다. 여기서 프로젝트나 **모든 프로젝트**를 고르세요. 채팅별 브랜치 폴더는 해당 프로젝트로 취급됩니다. 목록은 고른 뒤, `Esc`를 누르거나 목록 밖을 클릭하면 닫힙니다. 목록 맨 위의 **프로젝트 검색**에 입력하면 이름으로 프로젝트를 찾을 수 있습니다(대소문자와 악센트는 구분하지 않으며, `Esc`를 누르면 입력란이 비워집니다). `Enter`를 누르면 첫 번째로 일치하는 프로젝트가 선택됩니다. **최근 2시간 내 활성**을 클릭하면 대기 중이거나 실행 중인 채팅, 확인하지 않은 채 끝난 채팅 또는 최근 2시간 안에 바뀐 채팅이 있는 프로젝트만 표시됩니다(이 설정은 이 기기에 저장됩니다). **새 작업**(또는 `n`)은 보드가 보여 주는 프로젝트에서 dsh 자체의 새 채팅을 엽니다(**모든 프로젝트**일 때는 dsh의 새 세션이 고르는 프로젝트). 그래서 다른 채팅에서처럼 파일을 추가하고, 명령을 쓰고, 모델을 고를 수 있습니다. 첫 메시지를 보내면 자동으로 보드로 돌아옵니다. 그때까지 채팅은 **진행 중**의 맨 위에서 **새 작업**으로 기다립니다. 클릭해서 첫 메시지를 쓰세요. 응답을 기다리는 채팅이 있는 프로젝트에는 프로젝트 목록에서 주황색 점이 붙습니다(어느 채팅이든 기다리는 동안에는 위쪽 프로젝트 이름에도 붙습니다). dsh가 채팅 이름을 짓고 채팅의 모델이 그 메시지에서 태그를 최대 3개 씁니다. 카드를 클릭하면 채팅이 열립니다. 주황색 카드(또는 그 카드의 **답변**)를 클릭하면 보드에서 바로 답할 수 있습니다. 채팅 전체는 패널의 **채팅 열기**로 엽니다. 승인 요청에는 **거부** 또는 **한 번 허용**, 계획에는 **승인** 또는 **변경 요청**, 질문에는 선택지와 직접 쓴 텍스트로 답합니다. 끝난 카드에서 **×** 버튼을 클릭하면 그 카드를 보드에서 뺍니다. **최근 완료**를 열고 **완료** 맨 위의 **모두 빼기**를 클릭하면 그 카드들을 보드에서 뺍니다. 먼저 어느 프로젝트의 카드가 몇 개 빠지는지 보여 주며, 읽지 않은(초록색) 카드는 남습니다. 그 뒤 8초 동안 **실행 취소**를 누르면 카드가 돌아옵니다. **완료** 아래의 **뺀 카드 (N)**에는 보드에서 뺀 카드가 나열되고, **보드에 되돌리기**는 그중 하나를 다시 **완료**에 표시합니다. 채팅은 삭제되지 않습니다. 채팅은 dsh의 사이드바에 남고, 보드는 다시 시작한 뒤에도 이를 기억하며(Tether도 같은 보드를 보여 줍니다), 다시 실행되는 채팅은 보드로 돌아옵니다. **진행 중**의 카드를 가리키면(또는 키보드 포커스를 옮기면) 진행 상황을 볼 수 있습니다. 실행된 시간, 할 일 목록의 단계, 지금 실행 중인 도구, 에이전트의 마지막 줄이 표시됩니다. 설정 → Composer Plus → 작업 보드의 **마우스를 올리면 진행 상황 표시**에서 **빠름(AI 없음)**(기본값: 채팅만 읽음) 또는 **AI 요약**(채팅의 모델을 한 번 짧게 호출해 한두 문장도 씀)을 고릅니다. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="스크린샷: 작업 보드"></a> |
|
|
78
|
+
| **어시스턴트** | <a id="feature-assistant"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 그다음 왼쪽 사이드바에서 **어시스턴트**(**작업 보드** 바로 아래)를 클릭하세요. ChatGPT나 Grok 채팅처럼 개인 어시스턴트로 쓰는, 오래 유지되는 채팅 하나가 열립니다. 첫 클릭은 `~/Assistant` 폴더를 만들고, 이를 “Assistant” 프로젝트로 추가하고, workspace-write 권한 모드와 dsh의 기본 모델로 채팅을 시작합니다. 이후의 클릭은 매번 같은 채팅을 엽니다(보관된 채팅은 돌아오고, 삭제된 채팅은 다시 만들어집니다). 미리 알림을 부탁하면(“2분 뒤에 물 마시라고 알려 줘”) dsh의 예약 작업을 사용합니다. 그래서 그 시각에 미리 알림이 채팅을 실행하고, 모바일 연결이 켜져 있으면 Tether가 “Turn finished” 알림을 보냅니다. 웹 검색을 부탁하거나 다른 채팅에 대해 물어볼 수도 있습니다. 모든 프로젝트의 채팅(실행 중, 사용자를 기다림, 유휴)을 나열하고 한 채팅의 최신 메시지를 읽을 수 있습니다. 또한 채팅에 메시지를 보내고, 프로젝트에서 새 채팅을 시작하고, 실행 중인 채팅을 중지하거나 채팅을 보관할 수 있습니다. 이 네 가지 작업은 각각 먼저 dsh의 승인 카드를 보여 주며(Tether에서도), **한 번 허용**을 클릭하기 전에는 아무 일도 일어나지 않습니다. 삭제 도구는 없습니다. 이 도구와 짧은 지침은 이 채팅에만 있습니다. 웹 페이지나 다른 채팅에서 읽은 텍스트는 명령이 아니라 데이터로 취급됩니다. 매번 알려 주는 대신 프로필을 이 프로젝트의 메모리(**프로젝트 메모리**, 주제 “profil”)에 저장해 두세요. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="스크린샷: 어시스턴트"></a> |
|
|
78
79
|
| **프로젝트 메모리** | <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> |
|
|
79
80
|
| **메모리 버전 기록** | <a id="feature-memoryhistory"></a>**프로젝트 메모리** 가 켜져 있는 동안 기본으로 켜집니다. 메모리를 저장할 때마다(에이전트, 턴 후 검토, **메모리 열기**) 저장 전 메모의 사본이 보관됩니다. **메모리 열기** 에서 프로젝트나 **전역 메모리** 를 선택한 다음 **기록** 을 누르면 날짜별 버전과 각 버전 뒤에 메모리를 바꾼 주체가 표시됩니다. 버전을 선택하면 복원 시 바뀌는 내용을 diff로 보고 **복원** 할 수 있습니다. 복원 전의 메모도 보관되므로 복원을 되돌릴 수 있습니다. 메모리마다 최신 50개 버전이 남습니다. Tether에서는: 채팅 제목 메뉴 → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="스크린샷: 메모리 버전 기록"></a> |
|
|
80
81
|
| **메모리를 AGENTS.md로 내보내기** | <a id="feature-memoryexport"></a>**메모리 열기** 에서 프로젝트를 선택한 다음 **AGENTS.md로 내보내기** 를 누르면 그 프로젝트의 메모가 폴더의 `AGENTS.md` 에 있는 표시된 섹션에 기록됩니다. 커밋해서 팀이나 다른 에이전트 도구와 공유할 수 있습니다. 먼저 변경 내용을 diff로 보고, **AGENTS.md 쓰기** 를 눌러야만 저장됩니다. 다음 내보내기는 이 섹션만 바꿉니다. 전역 메모리, 출처, 날짜는 넣지 않습니다. Tether에서는: 채팅 제목 메뉴 → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="스크린샷: 메모리를 AGENTS.md로 내보내기"></a> |
|
|
@@ -103,7 +104,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
103
104
|
| **선택지 버튼** | <a id="feature-optionpicks"></a>답변이 선택지 목록("선택지" 제목 또는 굵은 "선택지" 줄 아래의 1~9개 번호 목록, "다음 단계"와 앱 언어의 같은 단어도 포함)으로 끝나면 답변 아래에 선택지마다 버튼이 표시됩니다. 클릭하면 선택지 전체가 담긴 "Option N: …"이 직접 입력한 것처럼 내 메시지로 전송됩니다. "(권장)" 표시가 있는 선택지는 강조됩니다. 버튼은 최신 답변 아래에만, 채팅이 대기 중이고 입력란이 비어 있을 때 표시되며, 이미 선택한 답변과 롤백으로 철회된 답변에는 표시되지 않습니다. 버튼이 표시되는 동안 다음 메시지 예측은 추측을 보여 주지 않습니다. 에이전트의 질문 카드에서는 1–9 키가 클릭과 같이 해당 선택지를 고릅니다(답변 입력란 안과 질문이 나타난 뒤 처음 0.8초 동안은 제외). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="스크린샷: 선택지 버튼"></a> |
|
|
104
105
|
| **애플리케이션 언어** | <a id="feature-language"></a>설정 → Composer Plus → **애플리케이션 언어**에서 dsh 인터페이스 전체를 Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt, हिन्दी 중 하나로 바꿉니다(아래 참고). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="스크린샷: 애플리케이션 언어"></a> |
|
|
105
106
|
| **모바일 연결(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. iPhone 카메라(**Open in Tether**를 탭)나 Tether의 **Scan code**로 QR 코드를 스캔하고, **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 먼저 Tether를 설치하세요. Tether가 없으면 카메라가 이 코드를 열 수 없습니다. 휴대폰에서 채팅을 보고, 메시지를 보내고(사진 포함: 입력란의 **+** → Camera, Photos 또는 Paste image), 승인과 질문에 답하고, 모델과 에이전트를 바꿀 수 있습니다. Mac은 원하는 만큼 페어링할 수 있으며, 앱 왼쪽 위의 Mac 이름으로 Mac을 전환합니다. **모바일 연결** 패널에는 페어링된 iPhone이 마지막 연결 시각과 함께 표시되며, **Remove**를 누르면 그 iPhone의 연결이 즉시 끊깁니다. “Tailscale only”는 로컬 네트워크의 연결을 거부하고(공유 Wi-Fi용), 액세스 로그는 누가 연결을 시도했는지 보여 줍니다. Tether에서는 “Settings → Privacy”에서 Face ID로 앱을 잠급니다. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="스크린샷: 모바일 연결(iPhone)"></a> |
|
|
106
|
-
| **원격 컴퓨터** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com)을 통해 다른 Mac의 dsh를 열고, 이 dsh 창에서 사용하세요. 각 Mac의 **설정 → Composer Plus**에서 켜세요(네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 열려는 Mac에서 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요. 이 Mac에서는 왼쪽 사이드바의 컴퓨터 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고르고, 링크를 붙여 넣은 뒤 **이름**을 입력하고(이 Mac이나 다른 컴퓨터와 같은 이름은 쓸 수 없습니다) **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이제 선택 메뉴에 **이 Mac**과 내 컴퓨터들이 표시됩니다. 하나를 고르면 그 컴퓨터의 dsh가 이 창을 채우며, 그 컴퓨터의 채팅, 사이드바, 도구, 파일을 그대로 쓸 수 있습니다. 그동안 이 Mac은 뒤에서 계속 실행됩니다.
|
|
107
|
+
| **원격 컴퓨터** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com)을 통해 다른 Mac의 dsh를 열고, 이 dsh 창에서 사용하세요. 각 Mac의 **설정 → Composer Plus**에서 켜세요(네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 열려는 Mac에서 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요. 이 Mac에서는 왼쪽 사이드바의 컴퓨터 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고르고, 링크를 붙여 넣은 뒤 **이름**을 입력하고(이 Mac이나 다른 컴퓨터와 같은 이름은 쓸 수 없습니다) **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이제 선택 메뉴에 **이 Mac**과 내 컴퓨터들이 표시됩니다. 하나를 고르면 그 컴퓨터의 dsh가 이 창을 채우며, 그 컴퓨터의 채팅, 사이드바, 도구, 파일을 그대로 쓸 수 있습니다. 그동안 이 Mac은 뒤에서 계속 실행됩니다. 선택 메뉴는 같은 위치에 있고 **이 Mac으로 돌아가기**로 표시됩니다. 클릭하면 돌아옵니다. 컴퓨터가 두 대 이상이면 클릭할 때 메뉴가 열리고, 거기서 **이 Mac**이나 다른 컴퓨터를 고릅니다. 설정 패널에서 컴퓨터의 이름을 바꾸거나 제거할 수 있고, 이 Mac을 열 수 있는 컴퓨터 목록도 볼 수 있습니다(**제거**를 누르면 그 컴퓨터의 연결이 즉시 끊깁니다). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="스크린샷: 원격 컴퓨터"></a> |
|
|
107
108
|
| **자동 업데이트** | <a id="feature-autoupdate"></a>dsh가 시작되면 플러그인이 [최신 GitHub 릴리스](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)를 확인합니다. 더 새로운 버전이고 npm에도 올라와 있으면, dsh 자체 플러그인 관리자(설정 → 플러그인과 같은 경로)로 정확히 그 버전을 설치하고 알려 줍니다. 새 버전을 로드하려면 dsh를 다시 시작하세요. **설정 → Composer Plus → Composer Plus 업데이트**에서 버전을 볼 수 있고, **업데이트 확인** / **지금 업데이트** 버튼도 있습니다. 새 버전으로 dsh를 처음 시작하면 **Composer Plus N의 새로운 기능** 창이 그 버전의 릴리스 노트를 **애플리케이션 언어**에서 고른 언어로 한 번 보여 줍니다(노트는 새 버전에 함께 들어 있으며 추가 네트워크 호출은 없습니다. 그 언어의 노트가 없으면 영어 노트를 보여 줍니다). **닫기** 또는 `Esc`로 닫습니다. 노트 아래에 GitHub 별표를 부탁하는 한 줄이 30일에 한 번까지 표시됩니다(네트워크 호출 없음). **GitHub에서 별표 주기** 또는 **다시 묻지 않기**를 누르면 다시 표시되지 않습니다. 설정 → 플러그인 이나 복사한 폴더로 업데이트한 뒤에도 새 버전마다 한 번 이 창이 표시됩니다. 처음 설치할 때는 표시되지 않습니다. 업데이트 행의 **이 버전의 새로운 기능** 으로 다시 열 수 있습니다. 실행 중인 버전보다 새 버전이 디스크에 있으면 행에 dsh를 다시 시작하라고 표시됩니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="스크린샷: 자동 업데이트"></a> |
|
|
108
109
|
| **켬/끔 필터** | <a id="feature-featurefilter"></a>**설정 → Composer Plus**의 **기능 검색** 옆에 있습니다. **전체**는 모든 기능을, **켬**은 스위치가 켜진 기능만, **끔**은 스위치가 꺼진 기능만 보여 줍니다. 기준은 각 행의 스위치이며, dsh Host가 저장하는 스위치(예: **모바일 연결**)도 포함됩니다. 검색과 함께 작동합니다. 단어를 입력하고 **끔**을 고르면 꺼 둔 기능을 찾을 수 있습니다. **켬** 또는 **끔**을 고른 상태에서 전환한 행은 필터를 다시 고를 때까지 남아 있으므로 포커스가 그 스위치에 머뭅니다. **켬**과 **끔**에서는 **애플리케이션 언어**와 **Composer Plus 업데이트** 행이 숨겨집니다(스위치가 없기 때문입니다). 설정은 매번 **전체**로 열립니다. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="스크린샷: 켬/끔 필터"></a> |
|
|
109
110
|
| **이슈 보고** | <a id="feature-issuereport"></a>설정 → Composer Plus → **이슈 보고…**(소개 문구 아래), 또는 사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭(또는 채팅의 **…** 메뉴 열기) → **Composer Plus 이슈 보고…**. 유형을 고르세요: **버그**, **기능 요청**, **개선**, **번역** 또는 **질문**. 자신의 말과 언어로 설명한 뒤 **초안 쓰기**를 클릭하세요(또는 `Cmd/Ctrl+Enter`). dsh의 기본 모델을 한 번 호출해 영어 이슈를 씁니다. 이슈에는 유형의 접두어가 붙은 제목(예: `[Bug]`)과 그 유형의 섹션(버그의 경우: What happened, Steps to reproduce, Expected, Actual), 그리고 Composer Plus, dsh, 시스템 버전이 적힌 줄 하나가 들어갑니다. 제목과 설명을 읽고 편집하세요. **다시 쓰기**는 새 초안을 씁니다. **이슈 열기**는 GitHub CLI(`gh`) 로그인으로 Composer Plus GitHub 저장소에 이슈를 열고 그 링크를 보여 줍니다. 이슈는 공개됩니다. 키나 비밀번호처럼 보이는 텍스트는 거부됩니다. `gh`로 열 수 없으면 **GitHub에서 대신 열기**가 초안이 채워진 GitHub 자체 페이지를 엽니다. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="스크린샷: 이슈 보고"></a> |
|
|
@@ -198,6 +199,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
198
199
|
- **새 채팅에서 계속:** 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 채팅(목표 확인이 읽는 방식과 같음: 추론과 되돌린 단계 제외)을 채팅 자체의 모델에 보내고 인계 메모를 보여 줍니다. 새 채팅을 만드는 것은 **새 채팅 시작**뿐입니다. 프로젝트에는 아무것도 쓰지 않습니다.
|
|
199
200
|
- **컨텍스트 구성:** Host에서 채팅 로그만 읽습니다. 모델 호출도 프로젝트 파일도 없습니다.
|
|
200
201
|
- **작업 보드:** 보드는 이 창에 있는 dsh 자체 목록에서 dsh 자체 채팅을 보여 주며, 자체 채팅 데이터를 추가하지 않습니다. **새 작업**은 dsh 자체의 새 채팅을 열고, 첫 메시지는 사용자가 dsh의 입력란에 씁니다. 그래서 승인, 샌드박스, 채팅의 모델이 평소처럼 적용됩니다. Host 쪽은 그 채팅의 첫 메시지를 카드의 프롬프트로 보관하고, 태그를 최대 3개 얻기 위해 그 메시지(처음 4,000자만, 다른 것은 없음)를 도구 없이 요청 한 번으로 그 채팅의 모델에 더 보냅니다. 각 작업의 프롬프트, 태그, 시작 시각은 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json`(소유자 전용 파일, 최신 2,000개)에 보관됩니다. **×** 버튼이나 **모두 빼기**로 보드에서 뺀 채팅의 ID(최신 5,000개)도 이 파일에 보관됩니다. 스위치는 그 옆의 `board-switch.json`에 있습니다. 프로젝트 폴더에는 아무것도 쓰지 않습니다. **답변**은 채팅 자체의 카드와 같은 방식으로 dsh 자체의 대기 중인 요청에 답변을 보냅니다. 이전 버전의 예전 작업 목록(`board.json`)은 디스크에 그대로 남으며 읽지 않습니다. **마우스를 올리면 진행 상황 표시**는 이 Mac에서 채팅 로그를 읽습니다. **빠름(AI 없음)**(기본값)에서는 아무것도 보내지 않습니다. **AI 요약**에서는 실행 중인 카드의 진행 상황 상자가 보이는 동안(또는 Tether의 보드가 열려 있는 동안, 실행 중인 카드 최대 8개에 대해) Host 쪽이 그 채팅의 가장 최근 부분(최대 약 6,000자: 사용자 메시지, 에이전트의 텍스트 답변, 도구 호출과 그 결과의 끝부분. 추론과 되돌린 메시지는 제외)을 도구 없는 요청 한 번으로 채팅의 모델에 보냅니다. 채팅이 진행된 뒤에만 다시 보내며, 채팅마다 최대 20초에 한 번입니다. 메모는 메모리에만 보관됩니다. 설정은 `$DSH_HOME/storages/dsh-composer-plus/board-progress.json`(소유자 전용 파일)에 있습니다.
|
|
202
|
+
- **어시스턴트:** 어시스턴트 채팅은 `~/Assistant`에 있는 일반 dsh 채팅입니다. 모델 호출은 다른 채팅처럼 dsh의 기본 모델로 갑니다. 도구는 이 Mac에서 다른 채팅의 로그(제목, 프로젝트, 상태, 그리고 chat_read로는 최신 메시지)를 읽고, 모델이 도구를 호출할 때만 그 내용을 모델에 넘깁니다. 채팅에 보내기, 시작, 중지, 보관은 각각 사용자의 승인을 기다립니다. 채팅 ID는 `$DSH_HOME/storages/dsh-composer-plus/assistant.json`에, 스위치는 `assistant-switch.json`에 보관됩니다(소유자 전용 파일). 미리 알림과 자동화는 dsh 자체의 예약 작업입니다. 이 채팅이 보내는 모델 요청과 웹 검색 말고는 아무것도 이 Mac 밖으로 나가지 않습니다.
|
|
201
203
|
- **보호된 파일:** 목록과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(소유자 전용 파일)에 있습니다. 확인은 각 파일 도구 호출의 경로(와 실제 경로)만 읽으며, 파일 자체는 읽지 않습니다.
|
|
202
204
|
- **차단된 명령:** 규칙과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json`(소유자 전용 파일)에 있습니다. 확인은 각 `bash`와 `pwsh` 호출의 명령 텍스트만 읽으며, 아무것도 실행하거나 보내지 않습니다.
|
|
203
205
|
- **비밀 값 입력:** 값은 답변 요청 안에서만 카드에서(또는 요청 본문을 기록하지 않는 게이트웨이를 거쳐 Tether에서) Host로 갑니다. Host는 값을 `$DSH_HOME/storages/dsh-composer-plus/secrets/<임의 이름>`에 씁니다(폴더 0700, 파일 0600). 프로젝트, 채팅 기록, 도구 결과에는 아무것도 들어가지 않습니다. Host는 그 채팅의 이후 도구 결과에서 값을 `[secret]`으로 바꾸기 위해 값을 메모리에 보관합니다. 파일과 이 사본은 그 채팅의 턴이 끝날 때와 dsh가 시작될 때 삭제됩니다. 스위치는 같은 위치의 `secrets.json`에 있습니다. 에이전트가 이 파일로 실행하는 명령은 그 명령이 보내는 곳으로 값을 보낼 수 있습니다. 그것이 이 기능의 목적입니다.
|
|
@@ -224,7 +226,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
224
226
|
- **채팅 행에 브랜치 배지가 없음:** 사이드바가 “하나의 목록” 보기가 아니거나(“작업 공간”과 “작업 공간 트리”에서는 어떤 채팅 행에도 배지가 없음), 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
|
|
225
227
|
- **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
|
|
226
228
|
- **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
|
|
227
|
-
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.
|
|
229
|
+
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.24.0`). 위의 설치 안내를 참고하세요.
|
|
228
230
|
- **지금 백업에서 "다른 백업 작업이 실행 중입니다"라고 표시됨:** 다른 dsh 창이나 복구 콘솔에서 작업이 실행 중입니다(둘은 백업 폴더의 잠금 파일 `.composer-plus.lock`을 함께 씁니다). 작업이 끝날 때까지 기다리세요. 실행 중인 작업이 없으면, 다음에 클릭할 때 종료된 프로세스의 잠금을 넘겨받습니다.
|
|
229
231
|
- **복구 콘솔에 "dsh is running"이라고 표시됨:** 먼저 dsh를 종료하세요. dsh가 정말 닫혀 있다면, 메시지에 나온 파일은 비정상 종료로 남은 것입니다. 그 파일을 삭제하고 다시 시도하세요.
|
|
230
232
|
- **복원 후 dsh가 시작되지 않거나 플러그인이 없음:** 프로필의 플러그인 패키지를 다시 설치해야 합니다. 복구 콘솔이 복원 후에 이를 제안합니다. 또는 콘솔이 나열하는 `$DSH_HOME/profiles/` 아래의 각 폴더에서 `pnpm install`을 실행하세요. vault에 없던 비밀 값(다른 컴퓨터)은 다시 입력해야 합니다. 콘솔이 그 목록을 보여 줍니다.
|
|
@@ -258,7 +260,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
258
260
|
- **질문 카드를 창에 맞추기**는 dsh의 질문 카드만 바꾸고 계획 검토 카드는 바꾸지 않습니다. 카드는 dsh의 마크업(`data-question-key`, `data-question-scroll`)으로 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 카드는 dsh가 그리는 대로 보입니다. 카드 높이는 채팅이 아니라 창을 따릅니다. 좁은 사이드 패널 안의 채팅에서는 높은 카드가 채팅 위로 넘칠 수 있습니다.
|
|
259
261
|
- **채팅 헤더를 창에 맞추기**는 dsh가 생성한 클래스 이름(`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`)으로 채팅 헤더를 찾습니다. dsh에 헤더 레이아웃용 훅이 없기 때문입니다. dsh 업데이트로 이 이름이 바뀌면 헤더는 dsh가 그리는 그대로 보입니다. 아주 좁은 채팅 열에서는 헤더가 두세 줄을 차지할 수 있어 메시지 위의 공간이 줄어듭니다.
|
|
260
262
|
- **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). `apns.json`에 APNs 키가 있으면(`tether/README.md` 참고) Mac이 Apple 푸시 서비스로 알림을 보내므로 Tether가 닫혀 있어도 알림이 옵니다. Mac은 깨어 있고 dsh가 열려 있어야 합니다. 키가 없으면 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다. Tether에서 "Settings → Notifications → Send notifications"를 켜기 전에는 Tether가 알림을 보내지 않습니다. Tether는 이 설정과 시간대를 페어링된 Mac마다 따로 저장합니다. 이 설정은 Mac마다 기본적으로 꺼져 있으며, 켤 때 iOS가 권한을 요청합니다. iOS 앱은 아직 App Store에 없습니다. Xcode로 `tether/ios`에서 빌드하세요. "Tailscale only"를 켜도 Mac에 Wi-Fi 또는 이더넷 주소가 있어야 합니다(게이트웨이는 그런 주소가 있을 때만 시작됩니다). 액세스 로그는 Mac마다 따로 있으며, 가장 최근의 시도 200개만 보관합니다. 1분 안에 반복된 시도는 새 행을 만들지 않고 같은 행의 횟수를 하나 늘립니다. 각 알림에는 Mac과 채팅의 프로젝트(`Studio Mac · recipe-box`), 채팅 제목, 본문이 표시됩니다. Turn finished에는 에이전트의 마지막 답변이 표시됩니다. APNs 키가 있으면 이 본문은 Apple의 푸시 서비스를 거칩니다. Tether의 앱 잠금은 iPhone 잠금 화면의 알림 미리보기를 숨기지 않습니다. iOS 설정에서 끄세요. Tether의 초록 점은 Mac을 따릅니다. dsh에서 연 채팅은 휴대폰에서도 점이 사라집니다. Tether에서 연 채팅은 휴대폰에서만 점이 사라집니다. Mac에 있는 dsh 자체의 점은 Mac에서 그 채팅을 열 때까지 남습니다.
|
|
261
|
-
- **원격 컴퓨터**를 쓰려면 두 Mac 모두에 Tailscale이 있어야 하고, 여는 대상 Mac에 이 기능을 켠 Composer Plus가 있어야 합니다. 그 Mac은 잠자기 상태가 아니어야 하며 dsh가 실행 중이어야 합니다. 선택 메뉴는 왼쪽 사이드바가 열려 있을 때만 표시됩니다(아이콘만 보이는 상태에서는 표시되지 않습니다). 다른 Mac의
|
|
263
|
+
- **원격 컴퓨터**를 쓰려면 두 Mac 모두에 Tailscale이 있어야 하고, 여는 대상 Mac에 이 기능을 켠 Composer Plus가 있어야 합니다. 그 Mac은 잠자기 상태가 아니어야 하며 dsh가 실행 중이어야 합니다. 선택 메뉴는 왼쪽 사이드바가 열려 있을 때만 표시됩니다(아이콘만 보이는 상태에서는 표시되지 않습니다). 다른 Mac의 페이지에 자체 선택 메뉴가 없으면(그쪽 Composer Plus가 1.23.0보다 오래된 경우) 이 Mac의 선택 메뉴가 같은 위치에서 그 페이지 위에 표시됩니다. 그쪽이 1.23.0이면 선택 메뉴에 그 Mac의 이름이 표시됩니다. 돌아오려면 그 메뉴에서 **이 Mac**을 고르세요. 연 컴퓨터마다 그 페이지가 메모리에 남으며, 이 기능을 끄거나 dsh를 다시 시작할 때까지 유지됩니다. 데스크톱 앱에서 다른 Mac의 페이지는 임베드된 페이지입니다. dsh 자체의 키보드 단축키(예: 새 채팅)는 그 안에서 작동하지 않으며, 파일 다운로드, 마이크, 알림도 그곳에서 작동하지 않습니다. 포트 19392를 씁니다(Mac마다 다른 컴퓨터를 받아들일 수 있는 dsh는 하나뿐입니다). 다른 Mac의 페이지에서 선택 메뉴는 이 Mac의 컴퓨터들 사이에서만 전환하므로, 다른 Mac을 거쳐 세 번째 Mac을 열 수 없습니다.
|
|
262
264
|
- 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다. **메시지 링크 복사**로 만든 링크는 dsh 0.2.1 이상에서만, 그리고 채팅 안의 메시지에서만 그 메시지를 엽니다(dsh 0.2.0에는 사용자 텍스트 규칙이 없으므로, 링크는 복사되지만 일반 텍스트로 보입니다). 되돌리기로 빠진 메시지나, 압축으로 dsh가 불러오는 기록에서 빠진 메시지는 보여 줄 수 없습니다. 이때 링크가 그렇다고 알려 줍니다. 🔗 버튼은 dsh의 메시지 행에 붙습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼이 표시되지 않습니다.
|
|
263
265
|
- **모두 읽음으로 표시**는 공개 API가 아닌 dsh의 일부(dsh 세션 상태의 `completionUnread` 목록)를 통해 dsh 자체의 읽지 않음 점을 바꿉니다. dsh 업데이트로 이 이름이 바뀌면 항목이 표시되지 않습니다. 이 항목은 dsh의 프로젝트 "…" 메뉴에 들어가는데, 이 메뉴에는 플러그인용 슬롯이 없습니다. dsh가 이 메뉴를 바꾸면 이 항목도 표시되지 않습니다.
|
|
264
266
|
- **대기 중인 메시지 제자리 편집**은 그사이 전송이 시작된 메시지를 바꾸지 않고, 그사이 바뀐 메시지(예: iPhone의 Tether에서 바꾼 메시지)를 덮어쓰지 않으며, 알림으로 이를 알려 줍니다. 새 이미지에는 이미지를 받는 모델이 필요하고(dsh 자체의 이미지 제한이 적용됩니다), 새 파일은 업로드가 끝나야 저장할 수 있습니다. 내 대기 중인 메시지만 편집할 수 있고, 대기열의 목표 라운드나 질문에 대한 답변은 편집할 수 없습니다. 플러그인을 업데이트한 뒤에는 텍스트만 바꾸는 편집만 바로 되며, 이미지나 파일이 있는 메시지를 저장하려면 먼저 dsh를 다시 시작해야 합니다(Host 쪽은 시작할 때 로드됩니다).
|
|
@@ -294,6 +296,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
294
296
|
- **터키어 스킬 팩**은 서드파티 스킬을 설치합니다. 규칙은 Composer Plus가 아니라 작성자의 GitHub 저장소에서 오며, 새 버전은 우리가 검토하지 않은 채 다음 일일 확인부터 사용됩니다. 확인은 파일이 GitHub가 해당 커밋에 나열한 파일과 같다는 것만 증명하며, 규칙이 좋다는 것을 증명하지는 않습니다. 스킬을 언제 불러올지는 모델이 정합니다(이름으로 직접 부를 수도 있습니다). 규칙은 터키어 글에만 적용됩니다. Host 쪽은 브라우저가 마지막으로 알린 언어를 사용합니다. 두 브라우저가 서로 다른 언어를 쓰면 가장 최근 것이 적용됩니다. GitHub는 로그인 없이 시간당 60회의 API 호출만 허용합니다. 확인이 거부되면 설치된 사본을 유지하고 설정에 이유를 표시합니다.
|
|
295
297
|
- **코드베이스 정리**에는 스킬의 고정된 사본(caldoai/skills, 커밋 f3cf477)이 들어 있습니다. 원본의 변경은 새 Composer Plus 버전으로만 들어옵니다. 이 스킬은 많은 파일을 바꿀 수 있는 긴 목표를 실행하며, 하위 에이전트와 확인 작업이 많은 토큰을 씁니다. 테스트가 없는 부분에서는 모르는 사이에 동작이 바뀔 수 있습니다. 별도 브랜치에서 시작하고 병합 전에 diff를 읽으세요. 프로젝트, 사용자 지정 스킬 폴더 또는 `~/.dsh/skills`에 같은 이름의 스킬이 있으면 그 스킬이 대신 쓰입니다. 스위치가 꺼져 있으면 `/untangle-codebase`는 일반 텍스트로 모델에 전달됩니다.
|
|
296
298
|
- **작업 보드**는 dsh가 이 창에 나열하는 채팅을 보여 줍니다. 프로젝트 밖의 채팅은 **모든 프로젝트**에만 표시되고, 채팅별 브랜치 폴더(`<project>/.worktrees/<name>`)는 해당 프로젝트로 취급됩니다. 카드의 열은 채팅의 실시간 상태이므로 카드를 끌어 옮길 수 없습니다. 채팅은 턴이 끝나면(오류나 중지 후에도) **완료**로 가고, 다시 실행되면 **진행 중**으로 돌아갑니다. 초록색 점은 dsh 자체의 완료 점이며, dsh는 이 점을 이 창에만 보관합니다. 페이지를 다시 불러오면 끝난 채팅이 이 점 없이 표시됩니다. **완료**에는 최신 채팅 50개가 표시됩니다(나머지는 **이전 작업 N개 보기**로 볼 수 있습니다). **프로젝트 검색**은 프로젝트를 이름으로만 찾고, 폴더 경로로는 찾지 않습니다. **최근 2시간 내 활성**은 프로젝트의 모든 채팅이 2시간보다 오래되었고 유휴 상태이며 읽은 상태일 때 그 프로젝트를 숨깁니다. 선택한 프로젝트는 보드에 계속 표시됩니다. **새 작업**은 이 창의 가장 최근 새 채팅만 기억합니다. 첫 메시지 전에 다른 채팅을 열면, 그 채팅은 사용자가 거기에 쓸 때까지 **진행 중**의 맨 위에 **새 작업**으로 남지만, 자동으로 보드로 돌아오는 것은 가장 최근 채팅뿐입니다. 페이지를 다시 불러오면 메시지가 없는 새 채팅은 보드에 없습니다(dsh는 그 채팅을 빈 새 세션으로 보관합니다). 태그는 작업마다 그 첫 메시지를 바탕으로 한 모델 호출 한 번으로 만들어지므로 틀릴 수 있으며, 보드에서 시작하지 않은 채팅에는 태그가 없습니다. 제목은 dsh 자체의 채팅 제목입니다(dsh의 제목 서비스가 채팅의 모델로 만듭니다). 제목이 오기 전까지 카드에는 첫 메시지의 첫 줄이 표시됩니다. **×** 버튼과 **모두 빼기**는 카드를 보드에서 빼기만 합니다. 채팅은 삭제되지 않습니다. **실행 취소**는 이 창에서 8초 동안만 표시됩니다. 그 뒤에는 **뺀 카드 (N)** → **보드에 되돌리기**로 카드를 되돌릴 수 있고, 다시 실행되는 채팅은 자동으로 돌아옵니다. **모두 빼기**는 먼저 확인을 묻고, 표시된 프로젝트에서 읽은 끝난 카드를 뺍니다(**모든 프로젝트**에서는 모든 프로젝트의 카드). **이전 작업 N개 보기** 뒤에 있는 카드도 뺍니다. 읽지 않은(초록색) 카드는 남습니다. dsh는 초록색 점을 이 창에만 보관하므로, 페이지를 다시 불러온 뒤에는 모두 빼기가 아직 답변을 읽지 않은 카드도 뺄 수 있습니다. 이 목록은 이 Mac에 보관되며 모든 창과 Tether에 적용됩니다. 목록이 채팅 5,000개에 이르면 가장 오래된 채팅이 돌아옵니다. **답변**은 채팅의 가장 최근 요청에만 답합니다. 그 요청이 다른 곳(다른 창, Tether, 자동 검토)에서 이미 답변되었거나 채팅이 새로운 것을 물으면, 패널이 그렇게 알려 주고 아무것도 보내지 않습니다. 이전 버전에는 댓글과 에이전트 도구가 있는 작업 목록이 있었지만 이제 없어졌으며, 예전 `board.json`은 표시되지 않습니다. 아이디어와 디자인은 emanuele-em의 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)에서 왔습니다. Composer Plus는 그 코드를 쓰지 않습니다. `Cmd+Shift+K`는 dsh 단축키입니다. Linux의 브라우저에서는 기본 키가 없으므로 dsh의 키보드 단축키 페이지에서 설정하세요. 브라우저 확장 프로그램이나 다른 앱이 이 키를 먼저 사용할 수도 있습니다. 카드는 dsh 자체의 초록색 점이 사라질 때(채팅을 열었을 때) **완료**에서 빠집니다. 보드 뒤에서 열린 채팅으로 끝난 채팅은 그 채팅이 위에 패널 없이 보일 때 빠집니다. 이 읽음 상태는 dsh 자체의 점처럼 이 dsh 창 안에만 있습니다. 다시 불러오거나 다른 창에서는 끝난 채팅이 모두 읽은 것으로 보이므로 **최근 완료**에 있습니다.
|
|
299
|
+
- **어시스턴트**는 이 Mac의 모든 창에서 채팅 하나를 씁니다. workspace-write 권한 모드로 실행됩니다. 파일은 `~/Assistant` 안에만 쓰고, 그 밖에서 실행하는 명령은 먼저 묻습니다. 채팅을 승인이 없는 모드(전체 액세스)로 바꾸면 dsh가 모든 승인을 거부하므로, 어시스턴트는 채팅에 보내기, 시작, 중지, 보관을 할 수 없습니다. 승인 카드는 이 여섯 도구만 지킵니다. 그 모드의 다른 채팅과 마찬가지로, 어시스턴트의 셸 명령은 여전히 네트워크에 접근할 수 있습니다. dsh 0.2.0과 0.2.1에서 dsh의 예약 도구는 어시스턴트 채팅 자신의 미리 알림만 보고, 다른 채팅의 자동화는 보지 못합니다. dsh 0.2.2부터는 모든 예약 작업을 나열하고 바꿉니다. chats_list는 보관된 채팅, 빈 채팅, 하위 에이전트 채팅과 어시스턴트 채팅 자신을 빼고 보여 줍니다. “사용자를 기다림”은 실행 중인 채팅에 열린 승인, 질문 또는 계획 검토가 있다는 뜻입니다. chat_read는 사용자의 메시지와 에이전트의 답변(도구 출력 제외)을 최대 50개 메시지, 약 24,000자까지 돌려줍니다. chat_archive는 아직 실행 중이거나 활성 미리 알림이 있는 채팅을 거부합니다. 모델은 읽은 텍스트에 여전히 속을 수 있습니다. 승인 카드가 마지막 확인이므로, **한 번 허용**을 클릭하기 전에 읽어 보세요.
|
|
297
300
|
- **중지 후 보낸 메시지 먼저 실행**은 채팅을 중지한 뒤에만 동작합니다(또는 실패한 턴 뒤, 아직 대기열이 있는 채팅을 열 때). 턴이 실행되는 중에 보낸 메시지는 여전히 대기열 끝에서 기다립니다. 내가 대기열에 넣은 메시지만 앞지릅니다. 대기열에 목표 라운드나 질문 답변이 기다리고 있으면 dsh 자체 순서가 유지됩니다. 공개 API가 아닌 dsh의 일부(중지된 턴이 아직 끝나는 중인지)를 읽습니다. dsh 업데이트로 그 이름이 바뀌면, 메시지는 그 턴이 끝난 뒤에만 앞으로 옮겨집니다. 서브에이전트 채팅은 dsh 자체 순서를 유지합니다.
|
|
298
301
|
- **프로젝트 메모리**는 채팅의 첫 폴더(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 자체의 메모리를 읽거나 쓰지 않습니다.
|
|
299
302
|
- **메모리 버전 기록** 은 메모리(각 프로젝트와 전역 메모리)마다 최신 50개 버전을 보관하고, 더 오래된 것은 지웁니다. 한 버전은 메모 하나가 아니라 그 프로젝트의 메모리 전체입니다. **복원** 은 그 버전의 모든 파일(주제 포함)을 되돌리며, 버전을 연 뒤에 메모리가 바뀌었으면 거부합니다. 복원 전의 메모리는 새 버전이 되므로 복원을 되돌릴 수 있습니다. 스위치가 꺼져 있는 동안에는 새 버전을 보관하지 않고 **복원** 도 거부됩니다. 보관된 버전은 남습니다. 이 기능 이전의 버전은 없습니다. 기록은 설치 후 첫 저장부터 시작합니다.
|
|
@@ -347,6 +350,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
347
350
|
|
|
348
351
|
**모든 채팅을 칸반 보드로 보고 거기서 새 채팅을 시작할 수 있나요?** 네, **작업 보드**(기본적으로 켜짐)로 가능합니다. 왼쪽 사이드바에서 여세요. 각 채팅은 **진행 중**, **검토**(사용자를 기다림) 또는 **완료**에 있는 카드입니다. **새 작업**은 프로젝트에서 dsh의 새 채팅을 열고, 첫 메시지를 보내면 보드로 돌아옵니다. 주황색 카드에서 **답변**을 클릭하면 채팅을 열지 않고 답할 수 있습니다. **완료**의 **모두 빼기**는 먼저 확인을 묻고, 읽은 끝난 카드를 보드에서 뺍니다. **실행 취소**와 **뺀 카드 (N)**로 카드를 되돌릴 수 있으며, 채팅은 dsh에 남습니다.
|
|
349
352
|
|
|
353
|
+
**알림을 주고 다른 채팅도 관리해 주는 개인 어시스턴트 채팅을 쓸 수 있나요?** 네, **어시스턴트**(기본적으로 꺼짐)로 가능합니다. 설정 → Composer Plus에서 켠 다음, 왼쪽 사이드바에서 **어시스턴트**를 클릭하세요. dsh의 예약 작업으로 미리 알림을 설정하고, 웹을 검색하고, 채팅을 나열하고 읽습니다. 채팅에 메시지를 보내거나 채팅을 시작, 중지, 보관하는 일은 사용자가 승인한 뒤에만 합니다. 프로필은 그 프로젝트 메모리에 “profil” 주제로 저장해 두세요.
|
|
354
|
+
|
|
350
355
|
**dsh-backup처럼 dsh에서 채팅과 설정을 백업할 수 있나요?** 네. **설정 → Composer Plus → 백업 → 지금 백업**을 사용하세요. 같은 아카이브 형식으로 같은 폴더(`~/Desktop/dsh-backups`)에 쓰므로, dsh-backup의 아카이브도 표시되고 복원할 수 있으며, dsh-backup은 삭제해도 됩니다. 정해진 일정으로 백업하려면 **자동 백업**을 켜세요.
|
|
351
356
|
|
|
352
357
|
**dsh가 더 이상 시작되지 않습니다. 백업을 어떻게 복원하나요?** 백업 폴더(`~/Desktop/dsh-backups`)를 열고 `Composer Plus Rescue.command`를 더블클릭하세요(Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). `3) Restore a backup`을 선택하고, 백업 하나를 고른 뒤 `RESTORE`를 입력하세요. dsh 없이도 작동합니다.
|
|
@@ -389,7 +394,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
389
394
|
|
|
390
395
|
**iPhone을 잃어버렸습니다. 그 iPhone이 Mac에 접속하지 못하게 하려면 어떻게 하나요?** 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하고, 그 iPhone 옆의 **Remove**를 클릭하세요. 그 iPhone의 키는 즉시 작동을 멈춥니다. 다시 연결하려면 Mac에서 승인하는 새 페어링이 필요합니다.
|
|
391
396
|
|
|
392
|
-
**다른 Mac의 채팅을 이 Mac에서 이어 가려면 어떻게 하나요?** 다른 Mac에서 **설정 → Composer Plus → 원격 컴퓨터**와 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요(예: AirDrop이나 메모로 나에게 보내세요). 이 Mac에서도 **원격 컴퓨터**를 켜고, 왼쪽 사이드바의 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고른 뒤 링크를 붙여 넣고, **이름**을 입력하고 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이후에는 같은 메뉴에서 그 컴퓨터를 고르면 됩니다. 그 컴퓨터가 이 창을 채웁니다. 돌아오려면 같은 위치에서 **이 Mac
|
|
397
|
+
**다른 Mac의 채팅을 이 Mac에서 이어 가려면 어떻게 하나요?** 다른 Mac에서 **설정 → Composer Plus → 원격 컴퓨터**와 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요(예: AirDrop이나 메모로 나에게 보내세요). 이 Mac에서도 **원격 컴퓨터**를 켜고, 왼쪽 사이드바의 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고른 뒤 링크를 붙여 넣고, **이름**을 입력하고 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이후에는 같은 메뉴에서 그 컴퓨터를 고르면 됩니다. 그 컴퓨터가 이 창을 채웁니다. 돌아오려면 같은 위치에서 **이 Mac으로 돌아가기**를 클릭하세요. 그동안 이 Mac의 채팅은 계속 실행됩니다.
|
|
393
398
|
|
|
394
399
|
**Face ID로 Tether를 잠글 수 있나요?** 네. Tether에서 "Settings → Privacy → Lock with Face ID"를 켜세요. 그러면 Tether를 열 때와 Tether로 돌아올 때 Face ID(또는 암호)를 요구합니다.
|
|
395
400
|
|
|
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
|
|
|
499
504
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
500
505
|
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
|
|
501
506
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
507
|
+
# Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
|
|
508
|
+
SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
|
|
502
509
|
```
|
|
503
510
|
|
|
504
511
|
```sh
|
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
27
27
|
|
|
28
28
|
Then restart dsh. (The CLI can't install into the desktop profile; the app manages it.)
|
|
29
29
|
|
|
30
|
-
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.
|
|
30
|
+
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.24.0`.
|
|
31
31
|
|
|
32
32
|
## Features
|
|
33
33
|
|
|
@@ -73,6 +73,7 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
|
|
|
73
73
|
| **Protected files** | <a id="feature-protectedfiles"></a>On by default. The agent's own file tools cannot read or change files that match your patterns: `read`, `read_image` and `grep` on a file are refused for **read and write** patterns, and `write`, `edit` and `str_replace_editor` for both kinds. The agent reads why and is told to ask you. The defaults are `.env*`, `*.pem` and `*.key`. Settings → Composer Plus → **Protected files**: add a pattern (for example `published/**` or `config/*.yml`), click its kind to switch between **read and write** and **write only**, remove it with ✕, or **Use the defaults**. A pattern without `/` matches a file name in any folder. This is a guard rail, not a sandbox: a shell command (`cat .env`), a script or an MCP tool can still reach the file (see Limits). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Screenshot: Protected files"></a> |
|
|
74
74
|
| **Blocked commands** | <a id="feature-blockedcommands"></a>On by default, with an empty list. The agent's shell commands (`bash`, `pwsh`) cannot run a command that matches your rules: a **block** rule refuses the call (the agent reads why and is told to ask you), an **ask first** rule shows dsh's approval card, and the command runs only when you allow it. Settings → Composer Plus → **Blocked commands**: type a rule (for example `npm publish`, `git push --force` or `ssh *192.168.2.19`), click the kind to switch between **block** and **ask first**, then **Add**; click a rule's kind to change it, remove it with ✕. A rule is a command name and words that must come after it in this order; `*` matches any text. It also finds the command after `&&`, `;`, `\|`, inside `$(…)`, `bash -c "…"` or `eval`, and after `sudo` or `env`. This is a guard rail, not a sandbox: a variable (`$CMD`), a script file or another program can still run the command (see Limits). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Screenshot: Blocked commands"></a> |
|
|
75
75
|
| **Task board** | <a id="feature-taskboard"></a>Left sidebar → **Task board**, or press `Cmd+Shift+K` (`Ctrl+Shift+K` on Windows and Linux) anywhere in dsh. A kanban board of your dsh chats with the live state that the sidebar shows: a chat that waits for your approval, answer or plan review is in **Review** with an orange dot, a running chat is in **Doing**, a finished chat that you did not open yet is in **Done** (green). When you open a chat, its card leaves **Done** by itself; click **Recently finished (N)** under the green cards to see the finished chats that you read (the newest 10, then **Show N older**; open or closed is kept on this device). A chat that finishes while it is open behind the board (a **New task**) stays green until you open it. Click the project name at the top of the board to open the project list, then pick a project or **All projects**; a Branch per chat folder counts as its project. The list closes after the pick, with `Esc` or with a click outside it. Type in **Search projects** at the top of the list to find a project by its name (case and accents do not matter; `Esc` empties the box) and press `Enter` to pick the first match, and click **Active in the last 2 hours** to show only projects with a chat that waits, runs, finished unseen or changed in the last 2 hours (kept on this device). **New task** (or `n`) opens dsh's own new chat in the project that the board shows (with **All projects**, the project that dsh's New session picks), so you can add files, use commands and pick the model as in any chat. When your first message goes, the board comes back by itself. Until then the chat waits at the top of **Doing** as **New task**: click it to write the first message. A project with a chat that waits for you has an orange dot in the project list (the project name at the top has it too while any chat waits). dsh names the chat and the chat's model writes up to 3 tags from that message. Click a card to open its chat. Click an orange card (or its **Answer**) to answer it on the board; the panel has **Open chat** for the whole chat: **Reject** or **Allow once**, **Approve** or **Request changes** for a plan, or the options and your own text for a question. Click **×** on a finished card to take it off the board, or open **Recently finished** and click **Clear all** at the top of **Done** to take those cards off it: it first shows how many cards of which project go, and unread (green) cards stay. For 8 seconds after, **Undo** puts the cards back; **Removed (N)** under **Done** lists the cards that are off the board, and **Put back** shows one in **Done** again. No chat is deleted: the chats stay in dsh's sidebar, the board remembers this after a restart (Tether shows the same board), and a chat that runs again comes back. Point at a card in **Doing** (or move the keyboard focus to it) to see its progress: how long it runs, the step of its todo list, the tool that runs now and the agent's last line. In Settings → Composer Plus → Task board, **Progress on hover** picks **Fast (no AI)** (the default: it reads the chat only) or **AI summary** (one short call to the chat's model also writes one or two sentences). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Screenshot: Task board"></a> |
|
|
76
|
+
| **Assistant** | <a id="feature-assistant"></a>Off by default: switch it on in **Settings → Composer Plus**. Then click **Assistant** in the left sidebar (right under **Task board**): it opens one lasting chat that you use as your personal assistant, like a ChatGPT or Grok chat. The first click makes the folder `~/Assistant`, adds it as the project "Assistant" and starts the chat with the workspace-write permission mode and dsh's default model; each later click opens the same chat (an archived one comes back, a deleted one is made again). Ask it to remind you ("remind me to drink water in 2 minutes"): it uses dsh's scheduled tasks, so the reminder runs the chat at that time, and Tether sends its "Turn finished" notification when Mobile connect is on. Ask it to search the web, or about your other chats: it can list the chats of all projects (running, waiting for you or idle) and read the newest messages of one. It can also send a message to a chat, start a new chat in a project, stop a running chat or archive one: each of these four actions shows dsh's approval card first (also in Tether), and nothing happens until you click **Allow once**. It has no delete tool. Only this chat has these tools and its short instructions; text that it reads in a web page or another chat counts as data, not as an order. Keep your profile in this project's memory (**Project memory**, topic "profil") instead of telling it each time. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Screenshot: Assistant"></a> |
|
|
76
77
|
| **Project memory** | <a id="feature-projectmemory"></a>Off by default: switch it on in **Settings → Composer Plus**. Each project folder gets its own memory, which later chats of that project read, as DS Bot keeps one per Bot. After each finished turn, one call to the chat's model reads the new messages (not rolled-back ones) and keeps your lasting preferences, decisions and facts as short notes, and changes or removes old ones. The agent can also save, remove and search notes itself (`memory_remember`, `memory_forget`, `memory_recall`). A note can also be global: every project reads it. A new chat gets the notes in its system prompt; a note saved later shows from the next chat. The files are Markdown under the dsh home (`storages/dsh-composer-plus/memory/`), never in the project folder. **Open memory** in the same row shows every saved note, grouped by project (and the global memory), with a filter. Write what to change in your own words (for example "I switched from yarn to pnpm"), then **Preview changes**: dsh's default model proposes the changes, and only **Apply** saves them. In Tether: chat title menu → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Screenshot: Project memory"></a> |
|
|
77
78
|
| **Memory version history** | <a id="feature-memoryhistory"></a>On by default while **Project memory** is on. Before each save of the memory (the agent, the review after a turn, **Open memory**), a copy of the notes as they were is kept. In **Open memory**, select a project or **Global memory**, then **History**: the versions by date and who changed the memory after each one. Select a version to see what a restore changes as a diff, then **Restore**. The notes before a restore are kept too, so you can undo it. The newest 50 versions of each memory stay. In Tether: chat title menu → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Screenshot: Memory version history"></a> |
|
|
78
79
|
| **Export memory to AGENTS.md** | <a id="feature-memoryexport"></a>In **Open memory**, select a project, then **Export to AGENTS.md**: the notes of that project go into a marked section of `AGENTS.md` in its folder, so you can commit them and share them with your team and other agent tools. You see the change as a diff first; only **Write AGENTS.md** saves it. The next export replaces only that section. The global memory, sources and dates stay out. In Tether: chat title menu → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Screenshot: Export memory to AGENTS.md"></a> |
|
|
@@ -101,7 +102,7 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
|
|
|
101
102
|
| **Option buttons** | <a id="feature-optionpicks"></a>When an answer ends with a list of options (a numbered list of 1 to 9 items under an "Options" heading or a bold "Options" line, also "Next steps" and the same words in the app's languages), a button for each option shows under the answer. A click sends "Option N: …" with the whole option as your message, as if you typed it. The option marked "(recommended)" is marked. The buttons show only under the newest answer, while the chat is idle and the composer is empty; a picked answer and an answer that a rollback withdrew show none. While they show, Next message prediction makes no guess. On a question card of the agent, the keys 1–9 pick that option, as a click does (not in the answer field, and not in the first 0.8 seconds after the question shows). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Screenshot: Option buttons"></a> |
|
|
102
103
|
| **Application language** | <a id="feature-language"></a>Settings → Composer Plus → **Application language** switches the whole dsh interface to Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt or हिन्दी (see below). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Screenshot: Application language"></a> |
|
|
103
104
|
| **Mobile connect (iPhone)** | <a id="feature-mobileconnect"></a>Use dsh from your iPhone with the [Tether](tether/) app, on the same Wi-Fi or over [Tailscale](https://tailscale.com). Switch it on in **Settings → Composer Plus** (it is off by default, because it opens a network port on this Mac). Then click **Mobile connect** at the bottom left of the sidebar: scan the QR code with the iPhone Camera (tap **Open in Tether**) or with **Scan code** in Tether, tap **Connect** and click **Approve**. Tether must be installed first: without it the Camera cannot open the code. The phone shows your chats, sends messages (with photos: the composer's **+** → Camera, Photos or Paste image), answers approvals and questions, and switches models and agents. Pair as many Macs as you like: the Mac name at the top left of the app switches between them. The **Mobile connect** panel lists the paired iPhones with their last connection: **Remove** cuts one off at once. **Tailscale only** refuses the local network (for a shared Wi-Fi), and the access log shows who tried to connect. In Tether, **Settings → Privacy** locks the app with Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile connect (iPhone)"></a> |
|
|
104
|
-
| **Remote computers** | <a id="feature-remotecomputers"></a>Open the dsh of your other Macs over [Tailscale](https://tailscale.com) and use them in this dsh window. Switch it on in **Settings → Composer Plus** on each Mac (it is off by default, because it opens network ports). On the Mac that you want to open, switch on **Let other computers open this Mac**, click **Create pairing link** and copy the link. On this Mac, pick **Add a computer…** in the computer picker of the left sidebar (right of the brand, above **New session**), paste the link, type a **Name** (not the name of this Mac or of another computer), click **Connect**, then click **Approve** on the other Mac. The picker then lists **This Mac** and your computers: pick one and its dsh fills this window, with its own chats, sidebar, tools and files, while this Mac keeps running behind it. The
|
|
105
|
+
| **Remote computers** | <a id="feature-remotecomputers"></a>Open the dsh of your other Macs over [Tailscale](https://tailscale.com) and use them in this dsh window. Switch it on in **Settings → Composer Plus** on each Mac (it is off by default, because it opens network ports). On the Mac that you want to open, switch on **Let other computers open this Mac**, click **Create pairing link** and copy the link. On this Mac, pick **Add a computer…** in the computer picker of the left sidebar (right of the brand, above **New session**), paste the link, type a **Name** (not the name of this Mac or of another computer), click **Connect**, then click **Approve** on the other Mac. The picker then lists **This Mac** and your computers: pick one and its dsh fills this window, with its own chats, sidebar, tools and files, while this Mac keeps running behind it. The picker stays in the same place and says **Back to this Mac**: click it to come back. With more than one computer, the click opens the menu, where you pick **This Mac** or another computer. The Settings panel renames and removes computers, and lists the computers that can open this Mac (**Remove** cuts one off at once). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Screenshot: Remote computers"></a> |
|
|
105
106
|
| **Automatic updates** | <a id="feature-autoupdate"></a>When dsh starts, the plugin checks the [latest GitHub release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). If it is newer and already on npm, it installs that exact version through dsh's own plugin manager (the same path as Settings → Plugins) and notifies you. Restart dsh to load it. **Settings → Composer Plus → Composer Plus updates** shows the version and has **Check for updates** / **Update now**. The first time dsh starts with the new version, a **What’s new in Composer Plus N** window shows the release notes of that version once, in the language of **Application language** (they come with the new version, no extra network call; a language without notes shows the English notes); **Close** or `Esc` closes it. Below the notes, one line asks for a GitHub star, at most once in 30 days (no network call); after **Star on GitHub** or **Do not ask again**, it does not show again. The window also shows after an update from Settings → Plugins or a copied folder, once per new version; not at the first install. **What’s new in this version** in the update row opens it again. When a newer version is on disk than the one that runs, the row says to restart dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatic updates"></a> |
|
|
106
107
|
| **On/off filter** | <a id="feature-featurefilter"></a>Next to **Search features** in **Settings → Composer Plus**: **All** shows every feature, **On** only the features whose switch is on, and **Off** only the ones whose switch is off. Each row's own switch decides, also a switch that dsh's Host keeps (for example **Mobile connect**). It works with the search: type a word and pick **Off** to find a feature that you switched off. A row that you switch while **On** or **Off** is picked stays until you pick a filter again, so the focus stays on its switch. **On** and **Off** hide the **Application language** and **Composer Plus updates** rows (they have no switch). Settings opens with **All** each time. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Screenshot: On/off filter"></a> |
|
|
107
108
|
| **Report an issue** | <a id="feature-issuereport"></a>Settings → Composer Plus → **Report an issue…** (under the intro), or right-click a chat in the sidebar (or open its **…** menu) → **Report a Composer Plus issue…**. Pick a type: **Bug**, **Feature request**, **Improvement**, **Translation** or **Question**. Describe it in your own words and language, then click **Write draft** (or `Cmd/Ctrl+Enter`). One call to dsh's default model writes an English issue: a title with the type's prefix (for example `[Bug]`) and the sections of that type (for a bug: What happened, Steps to reproduce, Expected, Actual), plus one line with the Composer Plus, dsh and system versions. Read and edit the title and the description; **Write again** writes a new draft. **Open issue** opens it in the Composer Plus GitHub repository with your GitHub CLI (`gh`) login and shows its link. The issue is public: text that looks like a key or a password is refused. When `gh` cannot open it, **Open on GitHub instead** opens GitHub's own page with the draft filled in. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Screenshot: Report an issue"></a> |
|
|
@@ -196,6 +197,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
196
197
|
- **Continue in a new chat:** nothing runs until you click it. Then the Host half sends the chat (as Goal check reads it: no reasoning, no rolled-back steps) to the chat's own model and shows the note; only **Start new chat** makes a new chat. Nothing is written to the project.
|
|
197
198
|
- **Context breakdown:** reads only the chat log on the Host; no model call, no project file.
|
|
198
199
|
- **Task board:** the board shows dsh's own chats from dsh's own lists in this window; it adds no chat data of its own. **New task** opens dsh's own new chat, and you write the first message in dsh's composer, so approvals, the sandbox and the chat's model apply as usual. The Host half keeps that chat's first message as the card's prompt and sends it (its first 4,000 characters, nothing else) to that chat's model in one more request, with no tools, for up to 3 tags. The prompt, the tags and the start time of each task are kept in `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (owner-only file, the newest 2,000), with the ids of the chats that you took off the board with **×** or **Clear all** (the newest 5,000); the switch is in `board-switch.json` next to it. Nothing is written to a project folder. **Answer** sends your answer to dsh's own pending request, the same way the chat's own card does. The old task list of earlier versions (`board.json`) stays on disk as it was and is not read. **Progress on hover** reads the chat's log on this Mac. With **Fast (no AI)** (the default), nothing is sent. With **AI summary**, while a running card's progress box shows (or while Tether's board is open, for up to 8 running cards), the Host half sends that chat's newest part (at most about 6,000 characters: your messages, the agent's text replies, its tool calls and the end of their results; no reasoning, no rolled-back messages) to the chat's model, as one request with no tools. It sends again only after the chat moved on, at most once every 20 seconds per chat. The note is kept only in memory; the setting is in `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (owner-only file).
|
|
200
|
+
- **Assistant:** the assistant chat is an ordinary dsh chat in `~/Assistant`; its model calls go to dsh's default model as in any chat. Its tools read your other chats' logs on this Mac (titles, projects, status, and with chat_read their newest messages) and give them to that model only when it calls a tool. Sending, starting, stopping and archiving a chat each wait for your approval. The chat id is kept in `$DSH_HOME/storages/dsh-composer-plus/assistant.json` and the switch in `assistant-switch.json` (owner-only files). Reminders and automations are dsh's own scheduled tasks. Nothing leaves this Mac except the model requests and the web searches that the chat makes.
|
|
199
201
|
- **Protected files:** the list and the switch are in `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (owner-only file). The check reads only the path of each file tool call (and its real path), never the file.
|
|
200
202
|
- **Blocked commands:** the rules and the switch are in `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (owner-only file). The check reads only the command text of each `bash` and `pwsh` call; it runs nothing and sends nothing.
|
|
201
203
|
- **Secret input:** the value goes from the card (or from Tether, through the gateway, which does not log request bodies) to the Host only in the answer request. The Host writes it to `$DSH_HOME/storages/dsh-composer-plus/secrets/<random name>` (folder 0700, file 0600); nothing goes into the project, the chat log or the tool result. The Host keeps the value in memory to replace it with `[secret]` in later tool results of that chat. The file and that copy go when the chat's turn ends and at dsh start. The switch is in `secrets.json` next to it. A command that the agent runs with the file can send the value where that command sends it: that is the purpose.
|
|
@@ -222,7 +224,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
222
224
|
- **No branch pill on a chat row:** the sidebar is not in “In one list” (in “WorkSpace” and “Workspace Tree”, no chat row shows a pill), the chat had no turn since you installed this version, its folder is not a git repository, or **Git branch on chat rows** is off. After an update, restart dsh (the Host half records the branch).
|
|
223
225
|
- **Goal check says the test exited with code 127 or "not found":** dsh started from the Finder or the Dock can have a shorter PATH than your terminal, so it does not find `npm`, `pnpm` or `cargo`. Start dsh from a terminal, or set your own test command with the full path under **Goal check** → **Edit**. **Run now** shows the result at once.
|
|
224
226
|
- **The goal does not close and the agent keeps working:** **Goal check** found a failing test or missing work; the row under the goal shows why (hover the result for the details). Fix the cause or the test command, or complete the goal yourself with `/goal` or the goal bar (that is not checked).
|
|
225
|
-
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.
|
|
227
|
+
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.24.0`), see the install note above.
|
|
226
228
|
- **Back up now says "another backup action is running":** an action runs in another dsh window or in the rescue console (they share a lock file, `.composer-plus.lock`, in the backup folder). Wait for it. If no action runs, the lock of a closed process is taken over at the next click.
|
|
227
229
|
- **The rescue console says "dsh is running":** quit dsh first. If dsh is really closed, the file named in the message is left from a crash: remove it and try again.
|
|
228
230
|
- **After a restore, dsh does not start or a plugin is missing:** the plugin packages of a profile must be installed again. The rescue console offers it after a restore; or run `pnpm install` in each folder under `$DSH_HOME/profiles/` that it lists. Secrets that were not in the vault (another computer) must be entered again: the console lists them.
|
|
@@ -256,7 +258,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
256
258
|
- **Fit question card to window** changes only dsh's question card, not the plan review card. It finds the card by dsh's markup (`data-question-key`, `data-question-scroll`); if a dsh update changes that markup, the card shows as dsh draws it. The card's height follows the window, not the chat: in a chat in a narrow side panel, a tall card can still reach above the chat.
|
|
257
259
|
- **Fit chat header to window** finds dsh's chat header by its generated class names (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), because dsh has no layout hook for it. If a dsh update renames them, the header shows as dsh draws it. In a very narrow chat column the header can take two or three lines, so the chat area above the messages gets lower.
|
|
258
260
|
- **Mobile connect** works on macOS only (it uses `en0`, `openssl`, `swift` and `dns-sd`). It uses fixed ports 19390 and 19391, so only one dsh on each Mac can run it at a time (each Mac is one entry in the phone's Mac list). With an APNs key in `apns.json` (see `tether/README.md`), the Mac sends the notifications through Apple's push service, so they come also while Tether is closed; the Mac must be awake with dsh open. Without the key, the phone gets them only while Tether is open or just went to the background. Tether sends them only after you switch on **Settings → Notifications → Send notifications** in Tether. Tether keeps this switch and its hours separately for each paired Mac. The switch is off by default for each Mac, and iOS asks for the permission when you switch it on. The iOS app is not on the App Store yet: build it from `tether/ios` with Xcode. **Tailscale only** still needs a Wi-Fi or Ethernet address on the Mac (the gateway starts only with one). The access log is per Mac and keeps only the newest 200 attempts; a repeated attempt within a minute counts up one row. Each notification shows the Mac and the chat's project (`Studio Mac · recipe-box`), the chat's title and the text: Turn finished shows the agent's last reply. With the APNs key, this text goes through Apple's push service. Tether's app lock does not hide notification previews on the iPhone Lock Screen: turn them off in iOS Settings. Tether's green dots follow the Mac: a chat that you open in dsh loses its dot on the phone too. A chat that you open in Tether loses its dot on the phones only; dsh's own dot on the Mac stays until you open the chat there.
|
|
259
|
-
- **Remote computers** needs Tailscale on both Macs, and Composer Plus with this feature on the Mac that you open. That Mac must be awake with dsh running. The picker shows only while the left sidebar is open (not in its icon rail).
|
|
261
|
+
- **Remote computers** needs Tailscale on both Macs, and Composer Plus with this feature on the Mac that you open. That Mac must be awake with dsh running. The picker shows only while the left sidebar is open (not in its icon rail). When the other Mac's page has no picker of its own (Composer Plus older than 1.23.0 there), this Mac's picker shows over that page in the same place. With 1.23.0 there, the picker shows that Mac's name: pick **This Mac** in its menu to come back. Each computer that you opened keeps its page in memory until you switch the feature off or restart dsh. On the desktop app, the other Mac's page is an embedded page: dsh's own keyboard shortcuts (for example a new chat) do not work in it, and file downloads, microphone and notifications do not work there either. It uses port 19392 (only one dsh on each Mac can let other computers in). From another Mac's page, the picker switches only among the computers of this Mac: you cannot open a third Mac through the other Mac.
|
|
260
262
|
- A session link works inside chats; clicking it does not open the chat. A **Copy message link** link opens its message only on dsh 0.2.1 and later, and only from a message in a chat (dsh 0.2.0 has no user-text rules, so there the link is copied but shows as plain text). A message that a rollback took out, or that compaction removed from the history that dsh loads, cannot be shown: the link then says so. The 🔗 buttons attach to dsh's message rows; if a dsh update changes that markup, they do not show.
|
|
261
263
|
- **Mark all as read** changes dsh's own unread dots through a part of dsh that is not a public API (the `completionUnread` list of dsh's session status). If a dsh update renames it, the item does not show. The item goes into dsh's project "…" menu, which has no slot for plugins; if dsh changes that menu, the item does not show either.
|
|
262
264
|
- **Edit queued message in place** does not change a message that started to send meanwhile, and it does not overwrite a message that changed meanwhile (for example in Tether on the iPhone): a notice tells you. A new image needs a model that takes images (dsh's own image limits apply), and a new file must finish its upload before you can save. Only your own queued messages can be edited: a goal round or a question reply in the queue cannot. After a plugin update, only text-only edits work at once: restart dsh before you save a message with images or files (the Host half loads at start).
|
|
@@ -292,6 +294,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
292
294
|
- **Turkish skill pack** installs a third-party skill: its rules come from the author's GitHub repository, not from Composer Plus, and a new version is used from the next daily check without a review by us. The check proves that the files are the ones GitHub lists for that commit, not that the rules are good. The model decides when to load the skill (the user can also call it by name); the rules apply to Turkish texts only. The Host uses the language that a browser reported last: when two browsers use different languages, the newest one wins. GitHub allows 60 API calls per hour without a login; a refused check keeps the installed copy and shows the reason in Settings.
|
|
293
295
|
- **Untangle codebase** ships a fixed copy of the skill (caldoai/skills, commit f3cf477): a change upstream comes only with a new Composer Plus version. The skill runs a long goal that can change many files, and its subagents and checks use many tokens. Where the project has no tests, it can change behavior without notice: start it on a branch and read the diff before you merge. A skill with the same name in the project, in a custom skill folder or in `~/.dsh/skills` replaces it. While the switch is off, `/untangle-codebase` goes to the model as plain text.
|
|
294
296
|
- **Task board** shows the chats that dsh lists in this window: a chat outside a project shows only in **All projects**, and a Branch per chat folder (`<project>/.worktrees/<name>`) counts as its project. A card's column is the chat's live state, so cards cannot be dragged: a chat goes to **Done** when its turn ends, also after an error or a stop, and back to **Doing** when it runs again. The green dot is dsh's own done dot, which dsh keeps only in this window: after a reload, finished chats show without it. **Done** shows the newest 50 chats (**Show N older** shows the rest). **Search projects** finds a project by its name only, not by its folder path. **Active in the last 2 hours** hides a project when each of its chats is older than 2 hours, idle and read; the board still shows the project that you picked. **New task** remembers only the newest new chat of this window: when you open another chat before the first message, that chat stays at the top of **Doing** as **New task** until you write in it, but the board comes back by itself only for the newest one. After a reload, a new chat without a message is not on the board (dsh keeps it as its empty New session). The tags come from one model call per task, from its first message: they can be wrong, and a chat that you did not start on the board has none. The title is dsh's own chat title (dsh's title service, with the chat's model); until it comes, the card shows the first line of the first message. **×** and **Clear all** take cards off the board only: no chat is deleted. **Undo** shows for 8 seconds only, in this window; later, **Removed (N)** → **Put back** brings a card back, and a chat that runs again comes back by itself. **Clear all** asks first and takes the read finished cards of the shown project (all projects with **All projects**), also the ones behind **Show N older**; an unread (green) card stays. dsh keeps its green dot only in this window, so after a reload Clear all can take a card whose answer you did not read. The list is kept on this Mac for every window and for Tether; when it has 5,000 chats, the oldest come back. **Answer** answers only the newest request of the chat: when the chat answered it elsewhere (another window, Tether, Auto Review) or asks something new, the panel says so and sends nothing. Earlier versions had a task list with comments and agent tools; they are gone, and the old `board.json` is not shown. The idea and the look come from [Kanzo](https://github.com/emanuele-em/kanzo) by emanuele-em (AGPL-3.0); Composer Plus uses no code from it. `Cmd+Shift+K` is a dsh shortcut: in a browser on Linux it has no default key (set one on dsh's Keyboard shortcuts page), and a browser extension or another app can take it first. A card leaves **Done** when dsh's own green dot goes (you opened the chat) or, for a chat that finished behind the board while it was the open chat, when that chat shows with no panel over it. This read state lives only in this dsh window, as dsh's own dots: after a reload or in another window every finished chat is read, so it is in **Recently finished**.
|
|
297
|
+
- **Assistant** has one chat for all windows of this Mac. It runs with the workspace-write permission mode: it writes files only in `~/Assistant`, and a command outside it asks first. When you switch the chat to a mode without approvals (Full access), dsh rejects each approval, so the assistant cannot send, start, stop or archive a chat. The approval card guards the six tools only: a shell command of the assistant can still reach the network, as in any chat with that mode. On dsh 0.2.0 and 0.2.1, dsh's schedule tools see only the reminders of the assistant chat itself, not the automations of other chats; from dsh 0.2.2, they list and change every scheduled task. chats_list leaves out archived, blank and subagent chats, and the assistant chat itself; "waiting for you" means an open approval, question or plan review in a running chat. chat_read gives the user's messages and the agent's replies (no tool output), at most 50 messages and about 24,000 characters. chat_archive refuses a chat that still runs or has active reminders. A model can still be misled by text that it reads: the approval card is the last check, so read it before you click **Allow once**.
|
|
295
298
|
- **Send after Stop goes first** works only after you stop the chat (or after a turn that failed, or when you open a chat that still has a queue): a message that you send while a turn runs still waits at the end of the queue. It moves only past your own queued messages: when a goal round or a question reply waits in the queue, dsh's own order stays. It reads a part of dsh that is not a public API (whether the stopped turn still ends); if a dsh update renames it, the message moves only after that turn has ended. Subagent chats keep dsh's own order.
|
|
296
299
|
- **Project memory** belongs to the chat's first folder (dsh's project folder): a chat that changes its folder with `cd` keeps its first project's memory, and the same folder opened through another path to the same files shares it. A chat freezes its memory section when it starts, so a note saved later shows from the next chat (`memory_recall` finds it at once). The review keeps only what the model decides to keep: it can miss a fact or keep a wrong one; check them in **Open memory** and change them there, or edit the files by hand while dsh is closed. **Open memory** sends the notes of the selected project and the global notes (all projects when you select All notes; at most about 60,000 characters, the rest is counted and cannot change in that request) and your text to dsh's default model, not to the chat's model. A preview is kept on the Mac for 30 minutes and until dsh restarts; when a review or the agent changes the notes in between, **Apply** refuses and you preview again. **Apply** saves all the changes of a preview or none: when one change cannot be saved (for example, MEMORY.md is full), the notes stay as they were and the reason shows. Each finished turn with a message from you costs one model call; a failed call reads the same messages again after the next turn. Subagent chats are not reviewed. The idea and the file format come from [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus uses no code from it, and it never reads or writes DS Bot's own memory.
|
|
297
300
|
- **Memory version history** keeps the newest 50 versions of each memory (each project and the global memory); older ones go. A version holds the whole memory of that project, not one note. **Restore** puts back every file of that version (topics included) and refuses when the memory changed after you opened the version; the memory before the restore becomes a new version, so you can undo it. While the switch is off, no new version is kept and **Restore** refuses; the kept versions stay. A version from before this feature does not exist: the history starts with the first save after you install it.
|
|
@@ -345,6 +348,8 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
345
348
|
|
|
346
349
|
**Can I see all my chats as a kanban board and start new ones from it?** Yes, with **Task board** (on by default): open it in the left sidebar. Each chat is a card in **Doing**, **Review** (it waits for you) or **Done**. **New task** opens dsh's new chat in the project, and the board comes back when your first message goes; click **Answer** on an orange card to answer it without opening the chat. **Clear all** in **Done** asks first and takes the finished cards that you read off the board; **Undo** and **Removed (N)** bring them back, and the chats stay in dsh.
|
|
347
350
|
|
|
351
|
+
**Can I have a personal assistant chat that reminds me and manages my other chats?** Yes, with **Assistant** (off by default): switch it on in Settings → Composer Plus, then click **Assistant** in the left sidebar. It sets reminders with dsh's scheduled tasks, searches the web, lists and reads your chats, and sends a message to a chat or starts, stops or archives one only after you approve it. Keep your profile in its project memory, topic "profil".
|
|
352
|
+
|
|
348
353
|
**Can dsh back up my chats and settings, like dsh-backup?** Yes: **Settings → Composer Plus → Backup → Back up now**. It writes the same archive format into the same folder (`~/Desktop/dsh-backups`), so dsh-backup's archives show and restore too, and you can remove dsh-backup. Switch on **Automatic backup** for a schedule.
|
|
349
354
|
|
|
350
355
|
**dsh does not start any more. How do I restore a backup?** Open the backup folder (`~/Desktop/dsh-backups`) and double-click `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Choose **3) Restore a backup**, pick one and type `RESTORE`. It works without dsh.
|
|
@@ -387,7 +392,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
387
392
|
|
|
388
393
|
**I lost my iPhone. How do I stop it from reaching my Mac?** Click **Mobile connect** at the bottom left of the sidebar and click **Remove** next to that iPhone. Its key stops working at once; it can come back only with a new pairing that you approve on the Mac.
|
|
389
394
|
|
|
390
|
-
**How do I continue a chat of my other Mac from this one?** On the other Mac, switch on **Settings → Composer Plus → Remote computers** and **Let other computers open this Mac**, click **Create pairing link** and copy the link (send it to yourself, for example with AirDrop or Notes). On this Mac, switch on **Remote computers** too, pick **Add a computer…** in the picker of the left sidebar (right of the brand, above **New session**), paste the link, type a **Name** and click **Connect**, then click **Approve** on the other Mac. From then on, pick that computer in the same menu: it fills this window.
|
|
395
|
+
**How do I continue a chat of my other Mac from this one?** On the other Mac, switch on **Settings → Composer Plus → Remote computers** and **Let other computers open this Mac**, click **Create pairing link** and copy the link (send it to yourself, for example with AirDrop or Notes). On this Mac, switch on **Remote computers** too, pick **Add a computer…** in the picker of the left sidebar (right of the brand, above **New session**), paste the link, type a **Name** and click **Connect**, then click **Approve** on the other Mac. From then on, pick that computer in the same menu: it fills this window. To come back, click **Back to this Mac** in the same place; this Mac's chats keep running meanwhile.
|
|
391
396
|
|
|
392
397
|
**Can I lock Tether with Face ID?** Yes: in Tether, **Settings → Privacy → Lock with Face ID**. Tether then asks for Face ID (or the passcode) when it opens and when you come back to it.
|
|
393
398
|
|
|
@@ -497,6 +502,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
|
|
|
497
502
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
498
503
|
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
|
|
499
504
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
505
|
+
# Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
|
|
506
|
+
SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
|
|
500
507
|
```
|
|
501
508
|
|
|
502
509
|
```sh
|