dsh-composer-plus 1.9.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md ADDED
@@ -0,0 +1,257 @@
1
+ # dsh-composer-plus — DeepSeek Harness 用 Composer Plus
2
+
3
+ [![npm](https://img.shields.io/npm/v/dsh-composer-plus)](https://www.npmjs.com/package/dsh-composer-plus)
4
+ [![test](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml/badge.svg)](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml)
5
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
+
7
+ [English](README.md) · [中文](README.zh.md) · [Türkçe](README.tr.md) · [Español](README.es.md) · [Português (Brasil)](README.pt-BR.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md) · **日本語** · [한국어](README.ko.md) · [Bahasa Indonesia](README.id.md) · [Tiếng Việt](README.vi.md) · [हिन्दी](README.hi.md)
8
+
9
+ これは翻訳版です。基準となるのは英語版の [README.md](README.md) です。
10
+
11
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(dsh)のデスクトップアプリと Web UI に、Codex 風の便利な機能を追加します。追加される機能は、変更パネル、スワイプで選ぶ機能のアイデアカード、メッセージ本文も探せるサイドバー検索、ファイルの復元付きのターンのロールバック、ゴミ箱へのチャットの削除、入力欄の下のプロジェクト名、サイドバーのプロジェクトの状態、入力履歴、計画モードのショートカット、ワンクリックで続行、再起動後の実行中チャットの再開、キューのドラッグ&ドロップ、セッションのディープリンク、Markdown へのチャットの書き出し、チャットごとの自動レビュー(Auto Review)の許可、バックグラウンド通知、Tether アプリによる iPhone からのアクセス、自動アップデートです。
12
+
13
+ **ひとことで言うと:** DeepSeek Harness 用の 1 つのプラグインです(npm `dsh-composer-plus`。設定 → プラグインでは **Composer Plus** と表示されます)。このプラグインは、git の変更パネル、Tinder 風の機能のアイデアカード、メッセージ内の単語も探せるサイドバー検索、↶ ターンのロールバック(チャットのみ、またはチャットとファイル)、チャットを削除、入力欄の下のプロジェクト名、↑/↓ の入力履歴、Shift+Tab による `/plan` の切り替え、ワンクリックの ▶ 続行、再起動後に再開、ドラッグ&ドロップによるキューの並べ替え、セッションリンクをコピー、Markdown として書き出し、自動レビューの「このチャットで許可」、バックグラウンド通知、iPhone からのアクセス(モバイル接続、Tether アプリ)、11 の追加 UI 言語、自動アップデートを追加します。
14
+
15
+ <p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus を入れた DeepSeek Harness:実行中のプロジェクトはサイドバーにスピナーを表示し、変更パネルは git の差分を表示しています"></p>
16
+
17
+ 非公式のコミュニティプラグインです。ネットワーク通信は、アップデートの確認(GitHub のリリースと npm レジストリ)だけです。起動時のこの通信を止めるには、**自動アップデート** をオフにしてください。**機能のアイデア** は、**機能を提案** をクリックしたときだけ、チャットで使っているモデルを呼び出します。**次のメッセージの予測**(既定ではオン)は、ターンが終わるたびに、設定で選んだモデル(別のモデルを選ばない限り dsh の既定のモデル)を、クリックなしで 1 回呼び出します。この呼び出しを止めるには、**設定 → Composer Plus** でオフにしてください。**入力中に補完**(既定ではオフ)は、オンにした後、入力が止まるたびに、この機能で選んだモデル(既定では予測のモデル)を呼び出します。**モバイル接続**(既定ではオフ)は、オンにした後だけ、ローカルネットワークまたは tailnet からの iPhone の接続を受け付けます。
18
+
19
+ ## インストール
20
+
21
+ **デスクトップアプリ:** 設定 → プラグイン → **プラグインを追加** → `dsh-composer-plus` を入力 → **今すぐ有効にする**。
22
+ npm の名前の代わりに `https://github.com/furkancak1r/dsh-composer-plus` を貼り付けることもできます。
23
+
24
+ **Web / CLI プロファイル:**
25
+
26
+ ```sh
27
+ dsh plugin --profile web add dsh-composer-plus
28
+ ```
29
+
30
+ その後、dsh を再起動してください。(CLI はデスクトップのプロファイルにはインストールできません。デスクトップのプロファイルはアプリが管理します。)
31
+
32
+ > dsh の pnpm は、公開から 24 時間たっていないバージョンをスキップします。リリース直後は、バージョンを指定してください:`dsh-composer-plus@1.11.0`。
33
+
34
+ ## 機能
35
+
36
+ | 機能 | 使い方 | スクリーンショット |
37
+ |---|---|---|
38
+ | **変更パネル** | 右サイドバー → `+` → **変更**。**未コミット**、**未ステージ**、**ステージ済み**、**ブランチ** のいずれかを選ぶと、変更されたファイルが `+/-` の行数とともに表示されます。ファイルをクリックすると、その差分を表示します。**最後のターン** は、最新のターンに対する dsh 標準のレビューを開きます。 | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="スクリーンショット: 変更パネル"></a> |
39
+ | **機能のアイデア** | 右サイドバー → `+` → **機能のアイデア** → **機能を提案**。チャットのモデルが、チャットのプロジェクトの短い概要(最上位のファイル、README とマニフェストの冒頭、直近 15 件のコミット)を読み、最大 8 件の機能を提案します。提案は、dsh の UI 言語のカードの束として表示されます。カードを右にスワイプする(または **✓** をクリックするか `→` を押す。どの場合もカードはその方向へ飛んでいきます)と、同じプロジェクトで新しいチャットを開始します。新しいチャットはアイデアを依頼内容として計画モードで始まるため、計画を承認するまで何も変更されません。計画を省くには、**▶ すぐに実装** をクリックします(または `↑` を押します。カードは上へ飛んでいきます)。新しいチャットはアイデアを通常の依頼としてすぐに始まり、モデルが変更を加えてチェックを実行します(承認は通常どおり適用されます)。スキップするには、左にスワイプします(または **✕**、`←`)。**元に戻す**(または `Z`)で、スキップしたカードを戻せます。良いアイデアを後で使うには、**↓** をクリックします(または `↓` を押します)。アイデアはプロジェクトの **あとで** リストに入ります。このリストは、同じプロジェクトフォルダーのすべてのチャットに表示されます(再起動後も表示されます)。**あとで(N)** でリストを開きます。**計画する** は、そのアイデアで同じ計画モードのチャットを開始し、**すぐに実装** は計画なしのチャットを開始します。どちらもアイデアをリストから外します。**すべてまとめて計画(N)** は、リストのすべてのアイデアで 1 つの計画モードのチャットを開始するため、共通する部分は 1 回だけ計画されます。**リストから削除** はアイデアを削除します。**チェックリストとしてコピー** は、リスト全体を Markdown のチェックリスト(`- [ ] Title — Summary`、アイデアごとに 1 行)としてクリップボードにコピーします。課題管理ツールや TODO ファイルに使えます。ネットワーク通信はしません。**アイデアをさらに提案** でカードを追加します。1 つの分野だけのアイデアがほしい場合は、**機能を提案** の横の欄に短い **重点テーマ** を入力するか(80 文字まで。`Enter` でも提案します)、その下の固定テーマ **パフォーマンス**、**アクセシビリティ**、**テスト**、**セキュリティ**、**使いやすさ**、**ドキュメント** のどれかをクリックします(もう一度クリックすると解除されます)。するとモデルは、そのテーマに関する機能だけを提案します。欄が空のときは、どの機能でも提案します。同じプロジェクトで同じアイデアが 2 回提案されることはありません。提案されたアイデアは(スキップ、保存、開始のどれでも)すべてプロジェクトの **履歴** に入ります。モデルにはそれらを再び提案しないよう指示され、同じタイトルのアイデアは除外されます。**履歴** では、アイデアが **開始済み** または **提案済み** として一覧表示されます。**忘れる**(または **すべて忘れる**)で、そのアイデアが再び提案されるようになりますが、まだ **あとで** リストにあるアイデアは、そこから削除するまで提案されません。モデルはクリックしたときだけ実行されます。 | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="スクリーンショット: 機能のアイデア"></a> |
40
+ | **内容検索** | dsh 標準のサイドバー検索(**ワークスペース** の横の虫眼鏡。デスクトップアプリでは `Cmd+K`、ブラウザーでは `Cmd+Alt+K`)で、タイトルだけでなく、自分のメッセージと返信に含まれる単語からもチャットを探せます。一致したテキストはチャットの下に表示されます。dsh にはこの検索がすでにありますが、オフの状態で提供されています。この機能は、コンピューター上の検索インデックスファイルを使って、この検索をオンにします。インデックスは起動後の最初の検索で作成され(250 件のチャットで約 15 秒。「制限事項」を参照)、次回以降の起動でも使われます。既定ではオンです。変更は dsh の再起動後に反映されます。 | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="スクリーンショット: 内容検索"></a> |
41
+ | **ターンのロールバック** | 自分のメッセージにポインターを合わせ、**↶**(コピーの横)をクリックします。**チャットのみ** は、そのメッセージとそれ以降のすべて(返信、ツール呼び出し)をチャットとモデルのコンテキストから取り除き、メッセージを入力欄に戻します。内容を変更して、もう一度送信してください。**チャットとファイル** は、まずそのメッセージ以降に変更されたプロジェクトのファイルを一覧表示し、それらのファイルも元の状態に戻します。dsh の編集ツールによる変更だけでなく、コマンド(`bash`)による変更も戻します。実行中のターンは先に停止します。チャットのログが書き換えられることはありません。1 つの隠しマーカーが、取り除いた部分を隠します。これは、dsh 標準の `/compact` が古いメッセージを隠すのと同じ方法です。[dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) がインストールされている場合は、そのプラグインがこの役割を担い、Composer Plus は 2 つ目のボタンを表示しません。 | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="スクリーンショット: ターンのロールバック"></a> |
42
+ | **チャットを削除** | サイドバー → チャットの **…** メニュー(または右クリック)→ **削除…** → **削除**。dsh 自体にはアーカイブしかありません。チャットは停止し(dsh 標準のアーカイブと同じく、ターン、ジョブ、サブエージェント、スケジュールも停止します)、保存された履歴はサブエージェントのチャットとともに macOS のゴミ箱に移動します(ほかのシステムでは `$DSH_HOME/trash`)。元に戻すには、フォルダーを元の場所に戻して dsh を再起動します。チャットはサイドバーの **アーカイブのみ** の表示に現れます。 | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="スクリーンショット: チャットを削除"></a> |
43
+ | **入力欄にプロジェクト名** | 入力欄の下の行(ターン数、トークン数、キャッシュヒット、コンテキスト)の先頭に、チャットのプロジェクト名が表示されます。そのため、チャットがどのプロジェクトで作業しているかが常にわかります。表示されるのは dsh のプロジェクトのタイトルで、タイトルがない場合はフォルダー名です。ポインターを合わせると、フォルダーのフルパスが表示されます。クリックすると、サイドバーでそのチャットを表示します(リスト表示とプロジェクト表示のどちらでも動作します)。サイドバーとプロジェクトが開き(折りたたんだプロジェクトとその **さらに表示** も開きます)、リストがチャットまでスクロールし、チャットが 5 秒間点滅します。 | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="スクリーンショット: 入力欄にプロジェクト名"></a> |
44
+ | **入力履歴** | 入力欄が空のときに `↑` / `↓` を押すと、ターミナルのように、送信済みのメッセージを順に呼び出せます。 | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="スクリーンショット: 入力履歴"></a> |
45
+ | **計画モードのショートカット** | `Shift+Tab` で、下書きの先頭に `/plan ` を追加します(もう一度押すと削除します)。チャットがすでに計画モードの場合は、`Shift+Tab` で計画モードを終了します。 | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="スクリーンショット: 計画モードのショートカット"></a> |
46
+ | **入力欄のフォーカスを維持** | `/` コマンドやスキルを送信した後もカーソルが入力欄に残るため、すぐに続けて入力できます。コマンドを入力して `Enter` を押すキーボードマクロでも動作します。dsh はコマンドを処理する間、入力欄を読み取り専用にするため、ブラウザーがフォーカスを外してしまいます。この機能はフォーカスを入力欄に戻します。ただし、メニュー、ダイアログ、ほかの入力欄にフォーカスがある場合は戻しません。 | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="スクリーンショット: 入力欄のフォーカスを維持"></a> |
47
+ | **ワンクリックで続行** | 停止、失敗、または途中で切れたターンの後、空の入力欄に **▶** が表示されます。1 回クリックすると、入力欄に何も書かず、チャットに見えるメッセージも追加せずに、既存の会話から再開します(モデルには「止まったところから続ける」という短い隠しメモが届きます。Claude など一部のプロバイダーは、アシスタントの返信で終わるリクエストを拒否するためです)。キューで待っているメッセージはそのまま残ります。▶ は止まったタスクだけを続行し、その後でキューが実行されます。完了したターンの後は、通常の送信ボタンのままです。 | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="スクリーンショット: ワンクリックで続行"></a> |
48
+ | **再起動後に再開** | 既定ではオフです。**設定 → Composer Plus** でオンにしてください。チャットの実行中に dsh を終了した(または dsh が閉じた)場合、次に dsh を開くと、そのチャットが自動で続行します。このとき、ワンクリックで続行と同じ隠しメモを使います。目標のラウンド(`/goal`)が実行中だった場合は、目標が次のラウンドに進みます(dsh は起動のたびに目標を一時停止し、再開されるまで待ちます)。自分で停止したチャット、完了したチャット、失敗したチャットは続行しません。dsh 自体にはこの設定がなく、そのようなターンを中断済みとして記録するだけです。 | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="スクリーンショット: 再起動後に再開"></a> |
49
+ | **キューのドラッグ&ドロップ** | キュー内のメッセージにハンドル(⠿)が付きます。ドラッグして並べ替えるか、ハンドルにフォーカスを置いて `↑` / `↓` を押します。`Esc` でキャンセルします。 | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="スクリーンショット: キューのドラッグ&ドロップ"></a> |
50
+ | **セッションリンクをコピー** | サイドバーのチャットを右クリック → **セッションリンクをコピー**。`dsh-session:…` のリンクを別のチャットに貼り付けると、そのチャットを読み取り専用のコンテキストとして添付できます。dsh 0.2.1 には標準の **セッション ID をコピー** があり、こちらは ID だけをコピーします。この項目は、そのすぐ後に表示されます。 | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="スクリーンショット: セッションリンクをコピー"></a> |
51
+ | **チャットを Markdown として書き出し** | サイドバーのチャットを右クリック(またはチャットの **…** メニューを開く)→ **Markdown として書き出し…**。ダイアログにチャットのメッセージ数が表示されます。**クリップボードにコピー** はチャットを Markdown としてコピーし、**.md ファイルを保存** はブラウザーのダウンロードで `<chat title>.md` として保存します(dsh デスクトップでは、システムの設定に応じて「ダウンロード」フォルダーに保存されるか、保存ダイアログが開きます)。ファイルには、チャットのタイトル、プロジェクト名、日付が入り、その後にメッセージごとに 1 つの `## あなた` または `## アシスタント` のセクションが続きます。コードブロックはそのまま残ります。メッセージが閉じていないコードブロックは閉じられます。 | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="スクリーンショット: チャットを Markdown として書き出し"></a> |
52
+ | **プロジェクトのパスをコピー** | サイドバーのプロジェクトを右クリック → **パスをコピー** で、そのフォルダーのフルパスをコピーします。 | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="スクリーンショット: プロジェクトのパスをコピー"></a> |
53
+ | **新しいチャットでのプロジェクト検索** | 新しいチャット → 入力欄の上にあるプロジェクトのボタン。プロジェクトが A–Z 順に並び、上部に **プロジェクトを検索** ボックスが表示されます。名前の一部を入力し(大文字と小文字、アクセント記号は区別しません)、`Enter` を押すと、最初に一致したプロジェクトを選びます。一致するものがない場合は、**一致するプロジェクトはありません** と表示されます。サイドバーにある dsh の保存済みのプロジェクトの順序は変わりません。 | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="スクリーンショット: 新しいチャットでのプロジェクト検索"></a> |
54
+ | **次のメッセージの予測** | 既定ではオンです。**設定 → Composer Plus** でオフにできます。エージェントがターンを終えると(停止または失敗したターンを除く)、空の入力欄に、あなたが次に送りそうなメッセージの予測がグレーで表示され、**Tab で受け入れ** というヒントが付きます。`Tab` を押すとテキストが入力欄に入りますが、送信はされません。`Esc` を押すと、そのターンの間は予測を非表示にします。入力を始めたときも非表示になり、新しいターンでは新しい予測に置き換わります。スイッチの下の **モデル** メニューには、dsh のモデルが一覧で表示されます(dsh のモデルメニューと同じ一覧です)。既定では **dsh の既定** が選ばれていて、dsh の既定のモデルに従います。ターンが終わるたびに、短いモデル呼び出しが 1 回行われます。Tether では、予測が空の入力欄の上に表示されます。タップすると入力欄に入ります。 | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="スクリーンショット: 次のメッセージの予測"></a> |
55
+ | **入力中に補完** | 既定ではオフです。**設定 → Composer Plus** でオンにできます。入力中、カーソルのすぐ後ろに、メッセージの続きの候補がグレーで表示されます。`Tab` を押すと候補がメッセージに追加されますが、送信はされません。`Esc` を押すと非表示になります。グレーの文字の続きを入力すると、候補はそのまま残り、新しいモデル呼び出しは行われません。スイッチの下に、この機能専用の **モデル** メニューがあります。最初の項目 **次のメッセージの予測と同じ** は、**次のメッセージの予測** のモデルを使います(既定)。機能ごとに別のモデルを使うには、ほかのモデルを選んでください。たとえば、補完には速いモデルを選べます。入力が止まるたびにモデル呼び出しを 1 回行うため、予測よりトークンをかなり多く消費します。速くて低コストのモデルを選んでください。スラッシュコマンド、ファイルのチップを含むメッセージ、カーソルが末尾にないときは動作しません。Tether では、入力中に残りの部分が入力欄の上に表示されます。タップすると追加されます。 | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="スクリーンショット: 入力中に補完"></a> |
56
+ | **このチャットで許可** | 自動レビューで確認を求められると、承認カードに **このチャットで許可** が表示されます。これを選ぶと、同じチャットの同じツールが、引数にかかわらず以後は許可されます。ヘッダーのチップに許可の一覧が表示され、そこから取り消せます。許可は再起動後も有効です。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="スクリーンショット: このチャットで許可"></a> |
57
+ | **プロジェクトの状態** | サイドバーのプロジェクトの行に、そのチャットと同じ実行中/待機中/完了のマーカーが表示されます。そのため、折りたたんだプロジェクトでも、中のチャットが作業中か、あなたの操作を待っているかがわかります。最初に表示されるのはあなたの操作を待っているチャットで、次がまだ開いていない完了済みのチャット(緑色の点。別のチャットがまだ実行中でも表示されます)、その次が実行中のマーカーです。ポインターを合わせると詳細が表示されます。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="スクリーンショット: プロジェクトの状態"></a> |
58
+ | **アクティブなプロジェクトを先頭に表示** | チャットが実行を始めたり、あなたの操作が必要になったりすると、そのプロジェクトがサイドバーの先頭に移動します。移動には dsh 標準の行のアニメーション(ドラッグして移動したときと同じ動き)を使います。完了したプロジェクトはその場所に残ります。いつもどおり、ドラッグして好きな場所に移動できます。移動は dsh のプロジェクトの順序に保存されるため、この機能をオフにしても現在の順序は維持されます。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="スクリーンショット: アクティブなプロジェクトを先頭に表示"></a> |
59
+ | **最近のプロジェクトのフィルター** | サイドバー → 表示オプション(スライダーのアイコン)→ **過去 2 時間以内にアクティブ**。選択中は、過去 2 時間以内にアクティブなチャットがあるプロジェクトだけがサイドバーに表示されます。対象となるチャットは、その間に更新されたチャット、実行中または待機中のチャット、開いているチャット、まだ開いていない完了済みのチャット(dsh の緑色の「完了」の点)です。完了済みのチャットは、2 時間を過ぎても対象のままです。このようなチャットがないプロジェクトは、新しい空のプロジェクトも含めて非表示になります。もう一度選択すると、すべてのプロジェクトを表示します。選択はこのデバイスに保存されます。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="スクリーンショット: 最近のプロジェクトのフィルター"></a> |
60
+ | **すべてのプロジェクトを折りたたむ** | サイドバーでプロジェクトが開いているとき、表示オプション(スライダーのアイコン)の横にボタンが表示されます。クリックすると、開いているすべてのプロジェクトを一度に閉じます(たとえば、5 件中 3 件が開いている場合)。開いているプロジェクトがなくなると、ボタンは再び非表示になります。 | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="スクリーンショット: すべてのプロジェクトを折りたたむ"></a> |
61
+ | **状態で並べ替え** | サイドバー → 表示オプション → **並べ替え** → **状態別**(**1つのリスト** と組み合わせます)。完了したチャットが先頭に来ます(dsh の「完了」の点。エラーで終わったターンにもこの点が付きます)。その次に実行中または待機中のチャット、有効なオートメーション(Schedule)があるチャットが続き、残りのチャットは dsh の順序で並びます。完了したチャットを開くと、そのチャットは下に移動します。変わるのは表示だけです。元に戻すには、**手動** または **最終更新日時** を選択します。 | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="スクリーンショット: 状態で並べ替え"></a> |
62
+ | **バックグラウンド通知** | dsh がバックグラウンドにあるとき、ターンが完了すると通知が届きます(返信の 1 行目を表示します)。チャットが本当にあなたを待っているときにも通知が届きます。対象は、承認(ツール名)、回答(質問)、計画のレビューです。通知されるのは、1.5 秒後もリクエストが開いたままの場合だけです。そのため、自動で承認されたもの(自動レビューの許可、ほかのプラグイン)は通知されません。また、リクエストに応答すると、その通知はすぐに取り消されます。Dock/タスクバーのバッジは、待機中のチャットの数を示します。通知をクリックすると、そのチャットが開きます。 | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="スクリーンショット: バックグラウンド通知"></a> |
63
+ | **11 の追加 UI 言語** | 設定 → Composer Plus → **アプリケーションの言語** で、dsh のインターフェース全体を Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt、हिन्दी のいずれかに切り替えます(下記を参照)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="スクリーンショット: 11 の追加 UI 言語"></a> |
64
+ | **モバイル接続(iPhone)** | [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 がないと、カメラはこのコードを開けません。スマートフォンでは、チャットの表示、メッセージの送信、承認と質問への回答、モデルとエージェントの切り替えができます。ペアリングできる Mac の数に制限はありません。アプリの左上にある Mac の名前で、Mac を切り替えます。 | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="スクリーンショット: モバイル接続"></a> |
65
+ | **自動アップデート** | dsh の起動時に、プラグインは [GitHub の最新リリース](https://github.com/furkancak1r/dsh-composer-plus/releases/latest) を確認します。そのリリースのほうが新しく、すでに npm にある場合は、dsh 標準のプラグインマネージャー(設定 → プラグインと同じ経路)でそのバージョンをインストールし、通知します。読み込むには、**dsh を再起動** してください。**設定 → Composer Plus → Composer Plus のアップデート** にはバージョンが表示され、**アップデートを確認** / **今すぐアップデート** のボタンがあります。 | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="スクリーンショット: 自動アップデート"></a> |
66
+
67
+ ボタン、ツールチップ、お知らせ、通知は、選択した dsh の言語で表示されます(下の「アプリケーションの言語」を参照)。
68
+
69
+ ## 設定
70
+
71
+ すべての機能は、個別にオン/オフできます。場所は dsh の **設定 → Composer Plus** です。各行には小さなスクリーンショットがあります。ポインターを合わせると大きなプレビューが表示され、クリックすると原寸で開きます(`Esc` で閉じます)。上部の **機能を検索** ボックスは、名前または説明でページを絞り込みます(どの言語でも使えます。大文字と小文字、アクセント記号は区別しません)。`Esc` で入力を消去します。各行にはスイッチと短い説明があります。変更は再起動なしですぐに適用され、そのデバイスに保存されます。**モバイル接続**、**再起動後に再開**、**入力中に補完** を除き、すべての機能が既定でオンです。この 3 つと **内容検索**、**ターンのロールバック**、**次のメッセージの予測** のスイッチは、dsh のホストが保持します。そのため、これらのスイッチはすべてのウィンドウに適用され、再起動後も有効です。**次のメッセージの予測** で選んだ **モデル** も、ホストが保持します。**入力中に補完** のモデルの選択(既定は **次のメッセージの予測と同じ**)も、ホストが保持します。**内容検索** の変更は、dsh の再起動後にだけ反映されます(dsh は起動時にこの設定を読み込みます)。それまでは、その行に **この変更を反映するには dsh を再起動してください。** と表示されます。
72
+
73
+ <p align="center"><img src="docs/images/settings.webp" width="720" alt="設定 → Composer Plus:機能の検索、言語の選択、アップデートの行、機能ごとのスイッチ。ポインターを合わせるとスクリーンショットのプレビューが表示されます"></p>
74
+
75
+ ### アプリケーションの言語
76
+
77
+ **設定 → Composer Plus → アプリケーションの言語** を開き、**システムの言語** または 13 の言語のいずれかを選びます:
78
+
79
+ English · 中文 · Türkçe · Español · Português (Brasil) · Français · Deutsch · Русский · 日本語 · 한국어 · Bahasa Indonesia · Tiếng Việt · हिन्दी
80
+
81
+ <p align="center"><img src="docs/images/language-tr.webp" width="720" alt="Türkçe に切り替えた DeepSeek Harness のインターフェース"></p>
82
+
83
+ アプリ全体がすぐに切り替わります。この選択は dsh 標準の保存済みの設定 `locale.preference`(一般 → 言語と同じもの)なので、再起動後も維持されます。**システムの言語** は、この選択を消去します。その場合、デスクトップアプリは OS の言語に、Web UI はブラウザーの言語に従います。対応していない言語の場合は英語になります。プラグインをインストールしても、すでに選んだ言語が上書きされることはありません。
84
+
85
+ 各言語パックには 3,143 件のテキストがあります。対象は、dsh `0.2.0-rc.2` と `0.2.1-rc.2` のすべての UI テキスト(チャット、サイドバー、設定、承認、スケジュール、ファイルのプレビュー、プラグインマネージャー、プラグインマーケット)、このプラグイン自体のコントロール、人気の [dsh-rewind](https://github.com/SiriLee/dsh-rewind) プラグインです。次のものは翻訳されません:あなたのメッセージ、モデルの出力、コード、スラッシュコマンドの名前(`/plan`、`/compact`)、推論の強度 `High` のようなプロバイダー側のラベル、ほかのプラグインのテキスト、デスクトップアプリのネイティブメニューとアップデートのダイアログ(dsh はこれらを英語と中国語でしか提供していません)。新しい dsh で追加された文字列は、言語パックが更新されるまで英語で表示されます。ほかのプラグインがすでにある言語を提供している場合、その言語にはそのプラグインのものが使われます。
86
+
87
+ ## キーボードショートカット
88
+
89
+ | キー | 場所 | 操作 |
90
+ |---|---|---|
91
+ | `↑` / `↓` | 空の入力欄 | 前の/次の送信済みメッセージ |
92
+ | `Shift+Tab` | 入力欄 | `/plan ` を追加/削除、または計画モードを終了 |
93
+ | `↑` / `↓` | フォーカスしたキューのハンドル | キュー内のメッセージを移動 |
94
+ | `Esc` | ドラッグ中 | 移動をキャンセル |
95
+ | `→` / `←` | 機能のアイデアのページ | 一番上のカードを実装/スキップ |
96
+ | `↓` | 機能のアイデアのページ | 一番上のカードをプロジェクトの「あとで」リストに保存 |
97
+ | `↑` | 機能のアイデアのページ | 一番上のカードを計画なしですぐに実装 |
98
+ | `Z` | 機能のアイデアのページ | 最後にスキップしたカードを戻す |
99
+ | `Enter` | 新しいチャットのプロジェクトメニュー、検索ボックス | 最初に一致したプロジェクトを選ぶ |
100
+ | `↑` / `↓` | 新しいチャットのプロジェクトメニュー | 表示中のプロジェクトを移動 |
101
+ | `Esc` | 新しいチャットのプロジェクトメニュー、検索ボックス | 検索を消去(もう一度押すとメニューを閉じる) |
102
+ | `Tab` | 予測が表示された空の入力欄 | 予測を入力欄に入れる |
103
+ | `Tab` | カーソルの後ろのグレーの補完 | 補完をメッセージに追加する |
104
+ | `Esc` | 予測が表示された空の入力欄 | 予測を非表示にする |
105
+
106
+ `/` または `@` のメニューが開いているときは、これらのキーはメニューが使います。
107
+
108
+ ## 互換性
109
+
110
+ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテストしています。CI は、プッシュのたびにテストを実行します。
111
+
112
+ ## プライバシーとセキュリティ
113
+
114
+ - **続行:** 認証済みのローカルエンドポイントは、最後に中断されたターンだけを再開します。古いリクエストや重複したリクエストは拒否し、既存の承認フックはそのまま維持します。新しいユーザーメッセージは送信しません。
115
+ - **再起動後に再開:** オンにするまではオフです。ホスト側は、チャットの ID と開始時刻だけを `$DSH_HOME/storages/dsh-composer-plus/resume.json`(所有者のみのアクセス権)に保存します。データがマシンの外に出ることはありません。チャットを続行するのは、最後のターンを止めたのが(あなたではなく)dsh であることが、dsh 自身のログからわかる場合だけです。続行したターンにも、承認と自動レビューが通常どおり適用されます。
116
+
117
+ - **変更パネル:** git は、あなたのマシン上のチャットのフォルダーで、dsh の認証済みの `/api` チャネルを通じて、読み取り専用で実行されます。コミット、ステージ、フェッチは一切行いません。表示するのは、git 自体が一覧にしたパスだけです。
118
+ - **機能のアイデア:** **機能を提案** をクリックするまで、何も実行されません。クリックすると、ホスト側はチャットのフォルダーだけを読み取ります(ブラウザーがパスを送ることはありません)。読み取るのは、最上位の項目の名前、README・AGENTS.md・マニフェスト(`package.json`、`pyproject.toml`、`Cargo.toml`、`go.mod` など)の先頭 6 kB、`git log --oneline -15` で、合計 16 kB までです。`.env*`、鍵ファイル、`node_modules` などのフォルダーはスキップします。また、フォルダーの中にある通常のファイルだけを読み取ります。フォルダーの外を指すシンボリックリンク、FIFO、デバイスはスキップします。この概要は、dsh 標準のプロバイダー設定を通じて、チャットが使うモデルに 1 回のリクエストとして送られます。どのチャットにも追加されません。プロジェクトには何も書き込みません。右にスワイプしたアイデアは計画モードの新しいチャットを開始するため、承認と計画のレビューが通常どおり適用されます。**すぐに実装** は、計画モードなしでチャットを開始します。モデルはすぐにファイルを変更でき、チャットの通常の承認と自動レビューが適用されます。あとで使うために保存したアイデア(タイトル、概要、理由、規模)は、プロジェクトのフォルダーパスとともに、dsh のホームの `storages/dsh-composer-plus/later.json`(所有者のみのファイル)に保存されます。プロジェクトには何も入りません。提案されたアイデアの履歴(タイトル、概要、理由、規模、日付、開始済みかどうか)も同じ方法で `storages/dsh-composer-plus/idea-history.json` に保存されます。保存できるのはプロジェクトごとに最大 200 件で、古いものから削除されます。そのタイトルは、そのプロジェクトで次に **機能を提案** を実行したときにモデルに送られます。
119
+ - **内容検索:** チャットを検索する新しいコードはありません。プラグインは、dsh 標準のメッセージインデックス(SQLite FTS5、`dsh-session-query-sqlite`)をオンにし、そのためのファイル `$DSH_HOME/cache/composer-plus/session-search.db`(所有者のみのファイルとフォルダー)を割り当てるだけです。このファイルにはあなたのメッセージとアシスタントのメッセージのテキストが入るため、`$DSH_HOME/sessions` にあるチャットのログと同じように扱う必要がある個人的なデータです。データがマシンの外に出ることはありません。このファイルは、dsh が作り直せるコピーです。dsh を閉じている間なら削除できます。スイッチは `$DSH_HOME/storages/dsh-composer-plus/content-search.json` にあります。
120
+ - **ターンのロールバック:** あなたがメッセージを送るたびに、その前にホストがチャットのフォルダーの git スナップショットを作成し、専用のストア `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(所有者のみのフォルダー)に保存します。ストアには、そのフォルダーの中で git が認識するファイル(無視されたファイルを除く)のコピーが入ります。そのため、ストアはプロジェクトと同じように扱う必要がある個人的なデータです。ストアはリポジトリのオブジェクトを読み取ります(git がすでに持っているものはコピーしません)。リポジトリのインデックス、`HEAD`、ブランチ、タグ、stash、config には一切書き込みません。git がリポジトリに加える唯一の変更は、再利用するオブジェクトファイルのタイムスタンプの更新です(このため、`git gc` によるそれらのファイルの削除が遅れます)。ファイルを含むロールバックは、チャットのフォルダーの中の通常のファイルだけに書き込みます。シンボリックリンク、パイプ、フォルダーの外にあるものはスキップします。データがマシンの外に出ることはありません。dsh を閉じている間なら、ストアを削除できます(その後は、新しいメッセージを送るまで、ロールバックはチャットのみで動作します)。**チャットを削除** は、そのチャットのストアも削除します。スイッチは `$DSH_HOME/storages/dsh-composer-plus/rollback.json` にあります。
121
+ - **チャットを Markdown として書き出し:** ホスト側はチャット自身のログ(dsh が表示するのと同じメッセージ)だけを読み取り、ページに渡します。プロジェクトのファイルは読み取らず、ネットワークには何も送りません。Markdown が入るのは、クリップボードか、あなたが保存するファイルだけです。
122
+ - **チャットを削除:** チャット自身のログフォルダー(`$DSH_HOME/sessions/<project>/<chat>`)をゴミ箱に移動します。プロジェクトのフォルダーには触れません。
123
+ - **このチャットで許可:** 許可は `$DSH_HOME/storages/dsh-composer-plus/grants.json`(所有者のみのアクセス権)に保存されます。1 つの許可の対象は、**1 つのチャットの 1 つの特定のツール** です。そのツールが書き込みできる場合は、あらゆる書き込みも許可の対象になります。許可は、ヘッダーのチップから取り消します。
124
+ - 自動レビューは、引き続きすべての呼び出しで実行されます。レビューの失敗が自動で許可されることはありません。
125
+ - **モバイル接続:** オンにするまではオフです。オンの間、ホスト側は Tether ゲートウェイを実行します。ゲートウェイは、ポート 19390 の HTTPS(Wi-Fi のサブネットと tailnet(100.64.0.0/10)からの接続だけを受け付けます)と、`127.0.0.1:19391` のペアリングページ(この Mac からのみ)で構成されます。スマートフォンを接続するには、QR コードに含まれる 1 回限りのコード(5 分間有効)と、Mac での **Approve** が必要です。スマートフォンは、ゲートウェイの証明書を固定(ピン留め)します。Mac が保存するのは、各スマートフォンのトークンのハッシュだけです(30 日間有効で、使用中は更新されます)。**Revoke** をクリックすると、そのスマートフォンの接続をすぐに切断します。スマートフォンから呼び出せるのは、許可リストにある dsh のメソッド(チャット、プロンプト、添付ファイル、スラッシュコマンド、承認、質問、モデル、エージェント、目標)だけです。設定、認証情報、ファイルブラウザー、ターミナルは呼び出せません。データ:`$DSH_HOME/storages/dsh-composer-plus/mobile/`。詳細:[tether/README.md](tether/README.md)。
126
+ - **アップデート:** ホスト側は、`api.github.com` に最新のリリースを問い合わせ、`registry.npmjs.org` にそのバージョンを問い合わせます。あなたやあなたのチャットに関する情報は送信しません。インストールには dsh のプラグインマネージャー(`pnpm add dsh-composer-plus@<version>`。インストール済みのプラグインに対して dsh 0.2.1 がこれを拒否する場合は `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`。その場合、プロファイルにはその URL がプラグインのソースとして記載されます)を使うため、dsh 標準のレジストリ、スクリプト、バージョン互換性のチェックが適用されます。プレリリースのタグや古いバージョンがインストールされることはありません。
127
+ - **次のメッセージの予測:** 既定ではオンです。このモデル呼び出しを止めるには、**設定 → Composer Plus** でオフにしてください。ターンが終わるたびに、ホスト側は、そのチャットでのあなた自身のメッセージと、エージェントのテキストの返信(ツールの出力、隠れたコンテキスト、推論は含みません)を、最大で約 6,000 文字(最新の部分)、選んだモデル(別のモデルを選ばない限り dsh の既定のモデル)に送ります。送信は、dsh 標準のプロバイダー設定を通じた 1 回のリクエストです。チャットには何も保存しません。予測がチャットの履歴に追加されることはありません。スイッチと選んだモデルは `$DSH_HOME/storages/dsh-composer-plus/predict.json`(所有者のみのファイル)に保存されます。
128
+ - **入力中に補完:** オンにするまではオフです。オンの間は、入力が止まるたびに、ホスト側が、それまでに入力したテキストと、そのチャットでのあなた自身のメッセージ、エージェントのテキストの返信(ツールの出力、隠れたコンテキスト、推論は含みません)を、**入力中に補完** で選んだモデル(既定では **次のメッセージの予測** のモデル)に送ります。チャットの部分は最大で約 3,000 文字です。次に入力が止まると、前のリクエストは止まります。チャットには何も保存しません。スイッチは `$DSH_HOME/storages/dsh-composer-plus/complete.json`(所有者のみのファイル)に保存されます。
129
+
130
+ ## トラブルシューティング
131
+
132
+ - **macOS で通知が届かない:** システム設定 → 通知 → DeepSeek Harness で通知を許可します。通知を画面に残すには、**通知パネル** を選びます。
133
+ - **dsh のアップデート後に、▶、キューのハンドル、プロジェクトの状態、最近のプロジェクトのオプション、すべてのプロジェクトを折りたたむ、パスをコピー、プロジェクトの検索ボックス、次のメッセージの予測、入力中の補完、このチャットで許可、または右クリックが表示されない:** これらの機能は、dsh の現在の HTML に取り付けています。dsh にはまだ、これらを置く場所(スロット)がないためです。dsh がそのマークアップを変更すると、これらの機能は自動で非表示になります。ほかの部分が壊れることはありません。[issue](https://github.com/furkancak1r/dsh-composer-plus/issues) を作成してください。
134
+ - **「アップデートに失敗しました」または「npm からインストールされていない」と表示される:** ローカルフォルダーからリンクしたコピーや、名前を変更したコピーは、自分自身をアップデートできません。設定 → プラグインから `dsh-composer-plus` を再インストールしてください。それ以外の場合、メッセージには pnpm のエラーの 1 行目が表示されます。**アップデートを確認** で再試行できます。
135
+ - **モバイル接続で、ゲートウェイが動作していないと表示される:** 「no IPv4 address on en0」は、この Mac に Wi-Fi/Ethernet のアドレスがないことを意味します。「EADDRINUSE」は、別の dsh(または別のアプリ)がポート 19390 または 19391 を使っていることを意味します。モバイル接続を実行できる dsh は、一度に 1 つだけです。
136
+ - **モバイル接続、再起動後に再開、または内容検索に「dsh を再起動してください」と表示される:** dsh の実行中にプラグインがアップデートされました(内容検索の場合は、スイッチを変更したときにも表示されます)。新しい状態は、再起動後に読み込まれます。
137
+ - **検索でタイトルしか見つからない:** 原因は次のいずれかです。内容検索がオフになっている。内容検索をオンにした後、またはプラグインをインストールした後に、dsh を再起動していない。その単語がツールの出力にしかない(「制限事項」を参照)。
138
+ - **自分のメッセージに ↶ ボタンがない:** 原因は次のいずれかです。ターンのロールバックがオフになっている。そのチャットがサブエージェントのチャットである。dsh-rewind-plugin がインストールされている(そのプラグインの ↶ ボタンを使ってください)。アップデートの後は、dsh を再起動してください。
139
+ - **チャットとファイルがグレー表示になっている:** 原因は次のいずれかです。プロジェクトが git リポジトリではない。そのメッセージより前のスナップショットがない(メッセージがプラグインより古い、または最新 50 件のスナップショットに置き換えられた)。変更されたファイルがない。
140
+ - **削除すると、別の dsh がこのチャットを開いていると表示される:** 同じ dsh のホームを使う 2 つ目の dsh が、チャットのロックを持っています。そのウィンドウまたは dsh を閉じてから、もう一度削除してください。それまで、チャットはアーカイブされたままです。
141
+ - **再起動後にチャットが続行しなかった:** 原因は次のいずれかです。dsh の終了時に、再起動後に再開がオフだった。そのターンを自分で停止した。ターンがすでに終わっていた(完了または失敗)。チャットがアーカイブされていた。20 件を超えるチャットが実行中だった(最新の 20 件が続行します)。
142
+ - **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.11.0`)。上のインストールの注記を参照してください。
143
+
144
+ ## 制限事項
145
+
146
+ - メッセージを送らずに続行する機能は、dsh の `agent/pre-step` → `agent/request` のライフサイクルに依存しています。dsh をアップグレードするときは、互換性を再確認してください。
147
+ - **機能のアイデア** は、dsh またはページを再読み込みするまで、チャットごとにカードをメモリに保持します。再読み込みの後は、**機能を提案** でモデルにもう一度問い合わせます。カードは、クリックしたときの dsh の UI 言語で作成されます。言語を変更しても、すでに束にあるカードは元の言語のままで、**アイデアをさらに提案** は新しい言語を使います。モデルが見るのはプロジェクトの短い概要だけで、コードは見ません。そのため、プロジェクトにすでにある機能が提案されることがあります。その場合はスキップしてください。新しいチャットが計画モードで実行されるのは、プロファイルに dsh の `/plan` コマンドがある場合だけです。ない場合、アイデアは通常の最初のメッセージとして送られます。**あとで** リストは、チャットのフォルダーパスに属します。シンボリックリンク経由で開いた同じフォルダーには、別のリストがあります。リストに保存できるアイデアは、プロジェクトごとに最大 50 件です(さらに追加するには、1 件削除してください)。同じタイトルは 1 回だけ保存できます。カードのドラッグで決められるのは、左か右かだけです。保存するには **↓** を、すぐに実装するには **▶** を使ってください。重複はタイトルだけで判定されます。そのため、モデルが以前のアイデアを新しい名前で提案することもあります。その場合はスキップしてください。モデルが以前のアイデアだけを返した場合、新しいカードは表示されません。もう一度クリックしてください。重点テーマが狭いと、この状況が起こりやすくなります。より広いテーマにするか、テーマを解除してください。重点テーマは、dsh またはページを再読み込みするまで、チャットごとに欄に残ります。
148
+ - **チャットを Markdown として書き出し** に含まれるのは、あなたのメッセージとアシスタントのテキストの返信だけです。ツール呼び出しとその出力、思考、画像(`[image]` の行で示されます)、非表示のコンテキスト、ターンのロールバックまたは dsh-rewind-plugin で取り消したメッセージは含まれません。1 つのターンの返信は、1 つのセクションにまとめられます。1 回の書き出しに入るのは、約 400 万文字までです。それより長いチャットでは、最初の部分と注記が書き出されます。
149
+ - **再起動後に再開** はターンを続行するもので、ターンをやり直すものではありません。終了時に実行中だったツール呼び出しは、dsh の「結果不明」という結果で終わります。モデルには完了済みの作業を繰り返さないよう伝えます。それでも、2 回実行すると安全でないコマンドが、もう一度実行される可能性があります。開いていたサブエージェント、承認、質問は復元されません。親のチャットが続行し、もう一度尋ねます。1 回の起動で続行するチャットは、最大 20 件です。
150
+
151
+ - **内容検索** は dsh 標準の検索なので、dsh の制限がそのまま当てはまります。検索対象は、ユーザーとアシスタントのメッセージだけです。ツールの出力(コマンド、ファイルの内容、結果)や推論は検索しません。ユーザー、アシスタント、ツールのメッセージで絞り込む機能もありません。単語単位で一致し、単語の一部には一致しません(`deploy` で `deployment` は見つかりません)。アクセント付きの文字は、アクセントなしでも一致します(`seker` で `şeker` が見つかります)。結果は 1 つのチャットにつき 1 行で、dsh の 240 文字の抜粋を表示し、最大 20 行です。
152
+ - **内容検索** のコスト(247 件の実際のチャットログのコピーで測定。159 MB、dsh 0.2.1-rc.2、Apple Silicon、32 GB):起動後の最初の検索で、約 15 秒かけてインデックスを作成します。その間の約 7 秒は dsh のホストが何も応答しないため、ほかのチャットのストリーミングが一時的に止まります(ページ自体は固まりません)。ホストのメモリは、ピーク時に約 1.1 GB 増えます。1 分後も起動時より約 0.5–0.6 GB 多いままで、この状態は dsh を終了するまで続きます。インデックスファイルは約 165 MB です。2 回目以降の検索は約 0.5 秒です。再起動後の最初の検索は約 1 秒で(新しいチャットと変更されたチャットだけを追加します)、メモリが約 70 MB 増えます。コンピューターのメモリが少ない場合は、オフにしてください。
153
+ - **内容検索** は、dsh の再起動後にだけ反映されます。また、インデックスファイルは、同じ dsh のホームを使うすべての dsh で共有されます。そのような dsh は、一度に 1 つだけ実行してください(dsh は、1 つのインデックスファイルにつき所有者を 1 つだけ許可します)。
154
+ - **ターンのロールバック** がファイルを戻すのは、git リポジトリの中だけで、さらにチャットのフォルダーの中だけです。スナップショットは、チャットごとに最新の 50 件を保持します。無視されたファイル(`.gitignore`、`info/exclude`、グローバルの ignore ファイル)、空のフォルダー、シンボリックリンク、サブモジュールは戻しません。スナップショットの作成時に無視されていたファイルは、ターンで ignore のルールが変わっても削除しません。git が読み取れないファイルは、スナップショットから除外されます。メッセージを送るたびに、チャットのフォルダーに対して `git add --all` を 1 回実行し、専用のストアに記録します。追跡されていないファイルが多い非常に大きなフォルダーでは、数秒かかることがあります。次のツール呼び出しは、それが終わるのを待ちます(最大 10 秒。その後、スナップショットはバックグラウンドで完了します)。リポジトリの `git gc` が、古いスナップショットに必要なオブジェクトを削除した場合、そのファイルは戻せなかったファイルとして一覧に表示されます。入力欄に戻るのは、メッセージのテキストだけです。画像やファイルは、もう一度追加してください。サブエージェントのチャットには ↶ がありません(サブエージェントによるファイルの変更は、それを開始したチャットの変更として扱われます)。書き出したチャット(`/export`)には、取り除いたメッセージが残ります。1 つの隠しマーカーでチャットの一部を取り除くというアイデアは、SiriLee による [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind)(MIT)から来ています。Composer Plus は、そのコードを一切使っていません。
155
+ - **チャットを削除** には、dsh のアーカイブ機能が必要です(dsh 0.2.0 以降)。15 秒以内に停止しないチャット(またはそのサブエージェントのチャット)や、別の dsh が保持しているチャットは、アーカイブされたままになり、何も移動しません。macOS 以外のシステムでは、ゴミ箱のフォルダーがチャットの履歴と同じディスク上にある必要があります。開いているチャットを削除すると、dsh を再起動するまで、そのチャットはアーカイブされた非表示の状態で dsh のメモリに残ります。ゴミ箱は自分で空にしてください。dsh は空にしません。
156
+ - dsh のキューには `move` 操作がないため、プラグインのホスト側が、dsh のキューの中でメッセージそのものを移動します(1 回の変更で、同じメッセージのままです)。画像やファイルを含むメッセージも移動できます。移動できるのは自分のメッセージだけです。キュー内の目標のラウンドや質問への回答は、その位置から動きません。ドラッグ中にメッセージの送信が始まった場合は、何も移動せず、そのことを知らせる通知が表示されます。
157
+ - 新しいバージョンが dsh の設定を何も変更しない場合、dsh 0.2.1 はアップデートをすぐに読み込みます。それ以外の場合と dsh 0.2.0 では、読み込むには dsh を再起動してください。プラグインが dsh を自動で再起動することはありません。dsh のプラグインマネージャーがない Web/CLI プロファイルでは、新しいバージョンがあることを知らせるだけです。
158
+ - **入力欄のフォーカスを維持** がフォーカスを戻すのは、`/` コマンドまたはスキルの後だけです。dsh がコマンドを処理する間、入力欄は数ミリ秒だけ読み取り専用になります。そのため、その間に押したキーは失われます。dsh の `/` メニューがまだ開いている場合、`Enter` は強調表示された行を選び、送信はしません。
159
+ - **モバイル接続** は macOS でのみ動作します(`en0`、`openssl`、`swift`、`dns-sd` を使います)。固定のポート 19390 と 19391 を使うため、各 Mac でこれを実行できる dsh は、一度に 1 つだけです(スマートフォンの Mac の一覧では、各 Mac が 1 項目になります)。スマートフォンが通知を受け取るのは、Tether が開いているとき、またはバックグラウンドに移った直後だけです(プッシュサービスはありません)。iOS アプリは、まだ App Store にありません。Xcode で `tether/ios` からビルドしてください。
160
+ - セッションリンクは、チャットの中で機能します。クリックしても、そのチャットは開きません。
161
+ - 再起動の前に送られた通知をクリックしても、dsh が前面に表示されるだけです。
162
+ - アクティブなプロジェクトは、dsh に保存されたプロジェクトの順序を使って移動します。そのため、新しい順序は再起動後も維持されます。どのプロジェクトにも属さないチャット(「グループなし」)は移動できません。dsh は、これらのチャットを常に最後に表示します。
163
+ - dsh には、サイドバーの表示オプションのメニューに拡張ポイントがありません。そのため、最近のプロジェクトのオプションは、dsh 標準のメニューに追加しています。dsh のアップデートでこのメニューが変わった場合、オプションは表示されず、すべてのプロジェクトが表示されたままになります。フィルターはプロジェクトの行に対して動作するため、**1つのリスト** は絞り込まれません。**ワークスペース** と組み合わせて使ってください。**ワークスペースのツリー** では、非表示になった親フォルダーの中にあるアクティブなプロジェクトも、非表示になります。**状態別** にも、同じ種類の制限があります。dsh には並べ替えのスロットがないため、この項目と行の並び順は、dsh のメニューとリストのマークアップに取り付けています。
164
+ - dsh には、プロジェクトの行のメニューも、ワークスペースのヘッダーのスロットもありません。**パスをコピー** は、dsh の行のマークアップからプロジェクトの行を見つけます。**すべてのプロジェクトを折りたたむ** は dsh のヘッダーに入り、プロジェクトの行をクリックするのと同じ方法で、開いている各プロジェクトを閉じます。dsh のアップデートでこのマークアップが変わった場合、右クリックではブラウザーのメニューが表示され、ボタンは表示されません。
165
+ - dsh には、新しいチャットのプロジェクトメニューにも拡張ポイントがありません。そのため、**プロジェクトを検索** ボックスと A–Z 順は、dsh のメニューのマークアップに取り付けています。dsh のアップデートでこのマークアップが変わった場合、メニューは dsh が描くとおりに表示されます(保存済みの順序で、ボックスはありません)。A–Z 順は表示だけのもので、dsh に保存されたプロジェクトの順序は変わりません。
166
+ - dsh には、入力欄のヒントのための拡張ポイントもありません。そのため、**次のメッセージの予測** のテキストは、dsh 標準のプレースホルダー(`[data-composer-placeholder]`)の上に重ねて表示します。dsh のアップデートでこのマークアップが変わった場合、予測は表示されません。オンの間は、ターンが終わるたびに短いモデル呼び出しが 1 回行われます。
167
+ - **入力中に補完** は、dsh 標準の入力欄のヒント(dsh がスラッシュコマンドの引数のヒントに使う `--dsh-composer-hint` スタイル)を通じてテキストを表示します。スラッシュコマンド、ファイルやシンボルのチップを含むメッセージ、カーソルがメッセージの末尾にないときは動作しません。dsh のアップデートでこのスタイルが変わった場合、補完は表示されません。入力が止まるたびに、モデル呼び出しが 1 回行われます。
168
+ - 標準機能としてのサポートを、上流に要望しています:キューの `move` は [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773)、続行の状態は [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269) です。
169
+
170
+ ## よくある質問
171
+
172
+ **DeepSeek Harness に変更/git diff のパネルを追加するには?** `dsh-composer-plus` をインストールし、右サイドバー → `+` → **変更** を開きます。
173
+
174
+ **Tinder のカードをスワイプするように、dsh にプロジェクトの機能を提案してもらえますか?** はい。右サイドバー → `+` → **機能のアイデア** → **機能を提案** を開きます。右にスワイプすると、その機能を計画する新しいチャットを開始します。**▶ すぐに実装** をクリックすると、計画なしでその機能をすぐに実装するチャットを開始します。左にスワイプすると、スキップします。
175
+
176
+ **dsh のサイドバー検索で、タイトルだけでなく、メッセージ内の単語からチャットを探せますか?** はい、**内容検索**(既定でオン)で探せます。プラグインをインストールした後に dsh を 1 回再起動し、**ワークスペース** の横の虫眼鏡を使ってください。一致したチャットには、その単語の前後のテキストが表示されます。
177
+
178
+ **OpenCode や Claude Code のように、ターンを取り消してプロンプトを編集できますか?** はい、**ターンのロールバック** でできます。メッセージの **↶** をクリックし、**チャットとファイル** を選びます。入力欄に戻ったテキストを編集して、送信してください。
179
+
180
+ **チャットをアーカイブではなく、削除できますか?** はい、**チャットを削除** でできます。**…** → **削除…** を選びます。履歴はゴミ箱に移動するため、間違えても元に戻せます。
181
+
182
+ **チャットがどのプロジェクトのものかを確認するには?** 入力欄の下の行を見てください。**入力欄にプロジェクト名**(既定でオン)が有効なら、行の先頭にプロジェクト名が表示されます。ポインターを合わせると、フォルダーのパスが表示されます。
183
+
184
+ **dsh の入力欄で ↑/↓ のメッセージ履歴を使うには?** このプラグインをインストールしてください。空の入力欄で `↑` / `↓` を押すと、送信済みのメッセージを順に呼び出せます。
185
+
186
+ **「continue」と入力せずに、停止または失敗した dsh のターンを続行するには?** このプラグインを入れると、停止、失敗、または途中で切れたターンの後に、送信ボタンが **▶** に変わります。1 回クリックすると、ターンを再開します。
187
+
188
+ **dsh を終了して再び開いたとき、実行中だったチャットは続行しますか?** 自動では続行しません。dsh はそのようなターンを中断済みとして記録し、待機します(目標も `/goal resume` を待ちます)。**設定 → Composer Plus → 再起動後に再開** をオンにしてください。dsh の終了時に作業中だったチャットが、次の起動時に自動で続行します。
189
+
190
+ **予測はどのモデルが書きますか?** **設定 → Composer Plus → 次のメッセージの予測 → モデル** で選んだモデルです。一覧は dsh 自身のモデルの一覧です。**dsh の既定** は、dsh の既定のモデルに従います。選んだモデルが dsh の一覧からなくなった場合、予測には既定のモデルを使います。**入力中に補完** には専用の **モデル** メニューがあります。**次のメッセージの予測と同じ**(既定)は予測のモデルに従います。ほかのモデルを選ぶと、そのモデルは補完だけに使われます。そのモデルが dsh の一覧からなくなった場合、補完には予測のモデルを使います。
191
+
192
+ **dsh でキュー内のメッセージを並べ替えるには?** キュー内のメッセージの ⠿ ハンドルをドラッグします。または、ハンドルにフォーカスを置いて `↑` / `↓` を押します。
193
+
194
+ **1 つのチャットで、自動レビューが同じツールについて何度も確認しないようにするには?** 承認カードの **このチャットで許可** をクリックします。対象は、そのチャットのその特定のツールだけです。許可は、ヘッダーのチップから取り消せます。
195
+
196
+ **dsh のサイドバーに、今日使ったプロジェクトだけを表示するには?** サイドバー → 表示オプション(スライダーのアイコン)→ **過去 2 時間以内にアクティブ** を選びます。もう一度選択すると、すべてのプロジェクトを表示します。
197
+
198
+ **dsh でプロジェクトのフォルダーパスをコピーするには?** サイドバーでプロジェクトを右クリック → **パスをコピー** を選びます。
199
+
200
+ **dsh のサイドバーで、すべてのプロジェクトを一度に折りたたむには?** 表示オプション(スライダーのアイコン)の横にある、折りたたみのボタンをクリックします。このボタンは、少なくとも 1 つのプロジェクトが開いているときに表示されます。
201
+
202
+ **dsh のタスクが完了したときや承認が必要なときに、macOS/Windows の通知を受け取るには?** **バックグラウンド通知** をオン(既定)のままにしてください。そのうえで、OS の設定で DeepSeek Harness の通知を許可します。
203
+
204
+ **DeepSeek Harness のインターフェースを、トルコ語、スペイン語、日本語などに切り替えるには?** 設定 → Composer Plus → **アプリケーションの言語** で切り替えます。
205
+
206
+ **iPhone から dsh を使うには?** `tether/ios` から Tether アプリをビルドし(Xcode)、**設定 → Composer Plus → モバイル接続(iPhone)** をオンにします。左下の **モバイル接続** をクリックし、QR コードを読み取って(iPhone のカメラまたは Tether の **Scan code**)、**Connect** をタップし、**Approve** をクリックします。外出先では、両方のデバイスで Tailscale を使ってください。
207
+
208
+ **デスクトップアプリで使えますか?** はい。設定 → プラグイン → **プラグインを追加** → `dsh-composer-plus` でインストールします。dsh 0.2.0-rc.2(デスクトップと Web)と 0.2.1-rc.2(Web)でテストしています。
209
+
210
+ ## 開発
211
+
212
+ スクリーンショットは、偽のモデルと架空のデモプロジェクト(`acme-web`、`weather-cli`、`docs-site`)を使った使い捨ての dsh から作り直します。そのため、実際のデータは含まれません。機能のサムネイルは `assets/features/` に置きます(パッケージに含まれ、設定に表示されます)。README 専用の画像は `docs/images/` に置きます(npm パッケージには含まれません):
213
+
214
+ ```sh
215
+ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh/lib/bin.js
216
+ # sidebar project features (recent filter, Copy path, Collapse all): real-app test + their thumbnails
217
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
218
+ # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
219
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
220
+ # Order by status (fake model + Schedule): real-app test + its thumbnail
221
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
222
+ # every Settings feature row shows a loading screenshot
223
+ PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
224
+ # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
225
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
226
+ # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
227
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
228
+ # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
229
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
230
+ # Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
231
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
232
+ # Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
233
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-export-markdown.mjs /path/to/dsh/lib/bin.js
234
+ # Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
235
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
236
+ # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
237
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
238
+ ```
239
+
240
+ ```sh
241
+ npm run build:locales # after editing locales/<id>.json
242
+ npm test
243
+ ```
244
+
245
+ **新しい機能のルール:** 設定 → Composer Plus の各機能の行には、スクリーンショットを表示します。機能の ID を `client.js` の `SHOT_OF` と `index.js` の `SHOTS` に追加し、`assets/features/<id>.webp` を同梱してください(使い捨てのデモ dsh で英語の UI を使って撮影し、約 60 kB 以下にします)。機能を、同じ画像とともに README の表に追加します。追加先は、`README.md` と、翻訳済みの各 `README.<id>.md` です。機能にスクリーンショットがないと、`test/shots.test.mjs` が失敗します。`test/browser-settings-shots.mjs` は、実際の設定ページを確認します。変更のたびに確認するチェックリストの全体は、[AGENTS.md](AGENTS.md) にあります。
246
+
247
+ テストでは、本物の `client.js` を偽の React/DOM に対して実行し、本物の `index.js`(ホスト側)を一時的な git リポジトリに対して実行します。Tether ゲートウェイのテスト(`test/tether-gateway.test.mjs`)は、モックの dsh ホストと本物の TLS ゲートウェイを使います。iPhone アプリは `tether/ios` にあります([tether/README.md](tether/README.md) と [tether/AGENTS.md](tether/AGENTS.md) を参照)。`node test/browser-history.mjs '<dsh web URL with ?token=…>'` は、専用の `DSH_HOME` を持つ使い捨ての `dsh web` に対して、実際のブラウザーで入力履歴を確認します。
248
+
249
+ 言語パックは、データだけを含む JSON で、`locales/<id>.json` にあります。`npm run build:locales` が、これらを 1 つのクライアントのエントリーに埋め込みます(翻訳サービスや実行時のダウンロードは使いません)。`npm test` は、各パックについて、すべてのキーがそろっていること、プレースホルダーと改行が同じであること、システム言語と上書きの動作を確認します。ローカルにインストールした Playwright を使って、隔離した実際のアプリで確認するには、次のコマンドを実行します:
250
+
251
+ ```sh
252
+ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/bin.js
253
+ ```
254
+
255
+ ## License
256
+
257
+ MIT