dsh-composer-plus 1.14.0 → 1.15.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 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.14.0`。
32
+ > dsh の pnpm は、公開から 24 時間たっていないバージョンをスキップします。リリース直後は、バージョンを指定してください:`dsh-composer-plus@1.15.0`。
33
33
 
34
34
  ## 機能
35
35
 
@@ -57,14 +57,14 @@ dsh plugin --profile web add dsh-composer-plus
57
57
  | **新しいチャットでのプロジェクト検索** | <a id="feature-projectpicker"></a>新しいチャット → 入力欄の上にあるプロジェクトのボタン。プロジェクトが A–Z 順に並び、上部に **プロジェクトを検索** ボックスが表示されます。名前の一部を入力し(大文字と小文字、アクセント記号は区別しません)、`Enter` を押すと、最初に一致したプロジェクトを選びます。一致するものがない場合は、**一致するプロジェクトはありません** と表示されます。サイドバーにある dsh の保存済みのプロジェクトの順序は変わりません。 | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="スクリーンショット: 新しいチャットでのプロジェクト検索"></a> |
58
58
  | **新しいセッションの既定のワークスペース** | <a id="feature-defaultworkspace"></a>設定 → Composer Plus → **新しいセッションの既定のワークスペース** → **新しいセッションを開く場所**:プロジェクトを選ぶか、**汎用フォルダー(default-workspace)** を選びます(既定値です。dsh 自身のフォルダー `Documents/deepseek-harness/default-workspace` で、最初に使うときに作成されます)。その後は、サイドバーの上部にある **新しいセッション**(とそのショートカット)が、別のプロジェクトのチャットを開いているときも、常にそこで新しいチャットを開きます。プロジェクトの横にある `+` は引き続きそのプロジェクトを開きます。新しいチャットの入力欄の上にあるプロジェクトのボタンでも、引き続きプロジェクトを変更できます。 | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="スクリーンショット: 新しいセッションの既定のワークスペース"></a> |
59
59
  | **チャット内を検索** | <a id="feature-findinchat"></a>チャットで Mac では `Cmd+F`(Windows と Linux では `Ctrl+F`)を押すと、チャットの上に検索ボックスが開きます。単語を入力すると、画面上のメッセージと返信の一致箇所がすべてハイライトされ、現在の一致箇所はより濃い色で表示されます。ボックスには n / 合計 が表示されます。`Enter` または `↓` で次の一致へ、`Shift+Enter` または `↑` で前の一致へ移動します(矢印ボタンも使えます)。チャットは一致箇所を中央までスクロールします。大文字と小文字、アクセント記号、トルコ語の点のない ı は区別しません。`Esc` でボックスを閉じ、カーソルを元の位置に戻します。返信がストリーミングで届いている間も、検索はチャットに追従します。 | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="スクリーンショット: チャット内を検索"></a> |
60
- | **チャットごとのブランチ** | <a id="feature-worktreechats"></a>新しいチャット → プロジェクトのボタンの横にある ⑂ main ボタン → **新しいブランチ**。続けて最初のメッセージを入力して送信します。AI がそのメッセージからブランチ名(`feat/…`、`fix/…`)を付け、Composer Plus が `<project>/.worktrees/` にその git worktree を作成し、`.worktreeinclude` に書かれた無視ファイル(たとえば `.env` や `node_modules/`)をコピーして、そこであなたのメッセージで新しいチャットを開きます。開いているチャットのヘッダーには ⑂ ブランチ · N 件の変更 · ↑ ↓(または **未プッシュ**)が表示されます。クリックすると **変更** を開きます。同じメニューには開いている worktree も並びます。1 つ選ぶと、そこでチャットを開始します。サイドバーでブランチのフォルダーをプロジェクト内に表示するには、dsh の **表示オプション** → **ワークスペースのツリー** を選びます。 | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="スクリーンショット: チャットごとのブランチ"></a> |
60
+ | **チャットごとのブランチ** | <a id="feature-worktreechats"></a>新しいチャット → プロジェクトのボタンとモードのボタンの間にある main ボタン(ブランチのアイコン) → **新しいブランチ**。続けて最初のメッセージを入力して送信します。最初のメッセージには画像やファイルを添付できます。AI がそのメッセージからブランチ名(`feat/…`、`fix/…`)を付け、Composer Plus が `<project>/.worktrees/` にその git worktree を作成し、`.worktreeinclude` に書かれた無視ファイル(たとえば `.env` や `node_modules/`)をコピーして、そこであなたのメッセージで新しいチャットを開きます。開いているチャットのヘッダーには ⑂ ブランチ · N 件の変更 · ↑ ↓(または **未プッシュ**)が表示されます。クリックすると **変更** を開きます。同じメニューには開いている worktree も並びます。1 つ選ぶと、そこでチャットを開始します。サイドバーでブランチのフォルダーをプロジェクト内に表示するには、dsh の **表示オプション** → **ワークスペースのツリー** を選びます。 | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="スクリーンショット: チャットごとのブランチ"></a> |
61
61
  | **次のメッセージの予測** | <a id="feature-nextprediction"></a>既定ではオンです。**設定 → 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> |
62
62
  | **入力中に補完** | <a id="feature-typingcompletion"></a>既定ではオフです。**設定 → Composer Plus** でオンにできます。入力中、カーソルのすぐ後ろに、メッセージの続きの候補がグレーで表示されます。`Tab` を押すと候補がメッセージに追加されますが、送信はされません。`Esc` を押すと非表示になります。候補は、あなた自身が次に書く言葉だけです。あなたへの返答や、作り話のエラー文・名前は出しません。メッセージが完結しているように見えるときや、モデルに確信がないときは、何も表示されません。グレーの文字の続きを入力すると、候補はそのまま残り、新しいモデル呼び出しは行われません。スイッチの下に、この機能専用の **モデル** メニューがあります。最初の項目 **次のメッセージの予測と同じ** は、**次のメッセージの予測** のモデルを使います(既定)。機能ごとに別のモデルを使うには、ほかのモデルを選んでください。たとえば、補完には速いモデルを選べます。入力が止まるたびにモデル呼び出しを 1 回行うため、予測よりトークンをかなり多く消費します。速くて低コストのモデルを選んでください。スラッシュコマンド、ファイルのチップを含むメッセージ、カーソルが末尾にないときは動作しません。Tether では、入力中に残りの部分が入力欄の上に表示されます。タップすると追加されます。 | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="スクリーンショット: 入力中に補完"></a> |
63
63
  | **プロンプトを改善** | <a id="feature-promptimprove"></a>大まかな依頼を入力し、モデルメニューの横にある魔法の杖(**プロンプトを改善**)をクリックします。1 回のモデル呼び出しで、より明確なプロンプトに書き直します。最初に目標、複数の部分があるときは短い番号付きの手順、最後に実行するチェックを書きます。このチャット(ロールバックで取り消したメッセージは除きます)、プロジェクトの README・AGENTS.md・マニフェスト、変更されたファイル、名前があなたの言葉と一致するファイルを読み、あなたの言語を保ちます。ファイル名を作り出すことはありません。新しいテキストは下書きと置き換わりますが、送信はされません。読んで編集してから `Enter` を押してください。`Cmd/Ctrl+Z` を押すと 1 ステップで元のテキストに戻ります。ボタン(**改善を元に戻す**)でも戻せます。処理中に入力すると、新しく入力したテキストが残ります。`Esc` を押すか、もう一度クリックするとキャンセルします。設定に専用の **モデル** メニューがあります(既定は **チャットのモデルと同じ**)。スラッシュコマンドや、ファイルのチップを含むメッセージには使えません。Tether では、魔法の杖は入力欄の横にあります。 | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="スクリーンショット: プロンプトを改善"></a> |
64
64
  | **目標チェック** | <a id="feature-goalcheck"></a>`/goal` で目標を開始します。自動ラウンドでエージェントが目標を完了にすると、目標は 2 つのチェックを通ったときだけ閉じます。まず、プロジェクトのテストコマンドが、チャットのフォルダーで、チャットのサンドボックスモードのもとで実行されます。コマンドは、あなた自身のコマンドか、`package.json`、`Makefile`、`Cargo.toml`、`go.mod` または pytest から見つけたコマンドです。エージェント自身の最新のステップがそのテストの成功した実行だった場合は、もう一度は実行しません。次に、ツールを持たない独立したモデル呼び出しが、目標、このチャット、`git status`、テスト結果を読みます。チェックが失敗すると、目標は進行中のままになり、エージェントが理由を読んで、次のラウンドが続きます。目標バーの下の行(**目標チェック**)に、テストと最後の結果が表示されます。**編集** で、独自のテストコマンドと、時間またはトークンの制限を設定します。制限を超えると、目標はブロック中になります。**今すぐ実行** は、目標を閉じずにチェックを実行します。設定に専用の **モデル** メニューがあります(既定は **チャットのモデルと同じ**)。目標を自分で完了したときは、何もチェックしません。 | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="スクリーンショット: 目標チェック"></a> |
65
65
  | **このチャットで許可** | <a id="feature-allowforchat"></a>自動レビューで確認を求められると、承認カードに **このチャットで許可** が表示されます。これを選ぶと、同じチャットの同じツールが、引数にかかわらず、時間制限が終わるまで許可されます(既定は 1 時間。**設定 → Composer Plus → このチャットで許可** で選べます)。その後、エージェントが再び確認します。ヘッダーのチップに許可の一覧が終了時刻とともに表示され、そこから取り消せます。許可は再起動後も有効です。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="スクリーンショット: このチャットで許可"></a> |
66
66
  | **プロジェクトの状態** | <a id="feature-projectstatus"></a>サイドバーのプロジェクトの行に、そのチャットと同じ実行中/待機中/完了のマーカーが表示されます。そのため、折りたたんだプロジェクトでも、中のチャットが作業中か、あなたの操作を待っているかがわかります。最初に表示されるのはあなたの操作を待っているチャットで、次がまだ開いていない完了済みのチャット(緑色の点。別のチャットがまだ実行中でも表示されます)、その次が実行中のマーカーです。ポインターを合わせると詳細が表示されます。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="スクリーンショット: プロジェクトの状態"></a> |
67
- | **チャット行の Git ブランチ** | <a id="feature-sessionbranch"></a>サイドバーの各チャット行に、チャットの最後のターンの時点でチャットのプロジェクトフォルダーがあった git ブランチが、小さな灰色のラベルで表示されます(例:`main` や `feature/login`。detached HEAD の場合は短いコミット ID を括弧内に表示します)。同じプロジェクトで別のブランチにある 2 つのチャットが同じに見えることはなくなり、間違ったブランチでチャットを続けようとしているときにすぐ気づけます。ラベルにポインターを合わせると完全な名前が表示されます。ホスト側は、ターンの開始時と終了時にブランチを読み取ります(`git branch --show-current`、読み取り専用)。この機能をインストールしてからターンのないチャットや、git リポジトリではないフォルダーには、ラベルは表示されません。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="スクリーンショット: チャット行の Git ブランチ"></a> |
67
+ | **チャット行の Git ブランチ** | <a id="feature-sessionbranch"></a>サイドバーの各チャット行に、チャットの最後のターンの時点でチャットのプロジェクトフォルダーがあった git ブランチが、小さな灰色のラベルで表示されます(例:`main` や `feature/login`。detached HEAD の場合は短いコミット ID を括弧内に表示します)。同じプロジェクトで別のブランチにある 2 つのチャットが同じに見えることはなくなり、間違ったブランチでチャットを続けようとしているときにすぐ気づけます。ラベルにポインターを合わせると完全な名前が表示されます。ホスト側は、ターンの開始時と終了時にブランチを読み取ります(`git branch --show-current`、読み取り専用)。この機能をインストールしてからターンのないチャットや、git リポジトリではないフォルダーには、ラベルは表示されません。チャットの上のプロジェクト行の名前がブランチと同じ場合(「チャットごとのブランチ」のフォルダーなど)、チャット行にラベルは表示されませんが、「1つのリスト」では表示されます。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="スクリーンショット: チャット行の Git ブランチ"></a> |
68
68
  | **すべて既読にする** | <a id="feature-markprojectread"></a>サイドバーで、プロジェクトの **…** ボタン → **すべて既読にする** をクリックします。そのプロジェクトのすべてのチャットから、緑色の未読の点が一度に消えます。ほかのプロジェクトの点はそのまま残ります。プロジェクトに未読のチャットがない場合、この項目はグレー表示になります(**未読のチャットはありません**)。 | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="スクリーンショット: すべて既読にする"></a> |
69
69
  | **アクティブなプロジェクトを先頭に表示** | <a id="feature-activeprojectsfirst"></a>チャットが実行を始めたり、あなたの操作が必要になったりすると、そのプロジェクトがサイドバーの先頭に移動します。移動には dsh 標準の行のアニメーション(ドラッグして移動したときと同じ動き)を使います。完了したプロジェクトはその場所に残ります。いつもどおり、ドラッグして好きな場所に移動できます。移動は dsh のプロジェクトの順序に保存されるため、この機能をオフにしても現在の順序は維持されます。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="スクリーンショット: アクティブなプロジェクトを先頭に表示"></a> |
70
70
  | **最近のプロジェクトのフィルター** | <a id="feature-recentprojects"></a>サイドバー → 表示オプション(スライダーのアイコン)→ **過去 2 時間以内にアクティブ**。選択中は、過去 2 時間以内にアクティブなチャットがあるプロジェクトだけがサイドバーに表示されます。対象となるチャットは、その間に更新されたチャット、実行中または待機中のチャット、開いているチャット、まだ開いていない完了済みのチャット(dsh の緑色の「完了」の点)です。完了済みのチャットは、2 時間を過ぎても対象のままです。このようなチャットがないプロジェクトは、新しい空のプロジェクトも含めて非表示になります。もう一度選択すると、すべてのプロジェクトを表示します。選択はこのデバイスに保存されます。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="スクリーンショット: 最近のプロジェクトのフィルター"></a> |
@@ -169,7 +169,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
169
169
  - **チャット行にブランチのラベルがない:** 原因は次のいずれかです。このバージョンをインストールしてから、そのチャットにターンがない。フォルダーが git リポジトリではない。**チャット行の Git ブランチ** がオフになっている。アップデートの後は、dsh を再起動してください(ブランチはホスト側が記録します)。
170
170
  - **目標チェックで、テストが終了コード 127 または「not found」で終了したと表示される:** Finder や Dock から起動した dsh は、ターミナルより PATH が短いことがあるため、`npm`、`pnpm`、`cargo` が見つかりません。ターミナルから dsh を起動するか、**目標チェック** → **編集** で、フルパスを使った独自のテストコマンドを設定してください。**今すぐ実行** を使うと、すぐに結果が表示されます。
171
171
  - **目標が閉じず、エージェントが作業を続ける:** **目標チェック** が、失敗したテストまたは足りない作業を見つけました。目標の下の行に理由が表示されます(詳細は、結果にポインターを合わせると表示されます)。原因またはテストコマンドを直すか、`/goal` または目標バーで目標を自分で完了してください(その完了はチェックされません)。
172
- - **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.14.0`)。上のインストールの注記を参照してください。
172
+ - **リリース直後にインストールが失敗する:** バージョンを指定してください(`dsh-composer-plus@1.15.0`)。上のインストールの注記を参照してください。
173
173
 
174
174
  ## 制限事項
175
175
 
@@ -195,7 +195,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
195
195
  - **このチャット** が数えるのは、dsh のファイルツール(`write`、`edit`、`str_replace_editor`)が書き込んだファイルだけです。コマンド(`bash`)が変更したファイルは、この表示には含まれず、**未コミット** に表示されます。チャットのターンのロールバックのスナップショットがない場合(ターンのロールバックがオフ、dsh-rewind-plugin がインストール済み、またはチャットがプラグインより古い場合)、表示は最後のコミットと比較し、そのことを示します。ターンのロールバックはチャットごとに最新の 50 個のスナップショットを保持します。長いチャットでは、表示は保持されている最も古いものと比較し、どのメッセージからかを示し、それより前の変更は数えません。**空白の変更を非表示** は `git diff -w` です。行の中のスペースだけが変わった行も非表示になります。
196
196
  - **GitHub issue を作成** には、dsh の PATH にある GitHub CLI(`gh`)と、チャットのフォルダーの GitHub リモートが必要です。実行時間は最大 60 秒です。`gh` がそれより長くかかると、issue は GitHub に作成されていても、そのリンクがリストに表示されないことがあります(もう一度クリックする前に、GitHub を確認してください。リストは完了した実行からしかリンクを読み取らないため、もう一度クリックすると 2 つ目の issue が作成されることがあります)。GitHub リモートが複数あるフォルダーでは、`gh` 自身のデフォルト(`gh repo set-default`)を使います。
197
197
  - **このファイルを変更したチャット** は、**このチャット** と同じく、dsh のファイルツール(`write`、`edit`、`str_replace_editor`)だけを認識します。コマンド(`bash`)による変更は表示されません。リポジトリの最新 300 件のチャット(作成日時の順)を読み取り、それより多い場合はそのことを表示します。表示するのは最大 100 行です。名前を変更したファイルは、ツールが書き込んだ名前で表示されます。フォルダーがリポジトリの外にあるチャット(同じファイルへの別のパスを通る場合も含みます)は数えません。dsh の起動後に最初に開くときは、リポジトリのすべてのチャットのログを読み取ります(275 件のチャットで約 4 秒)。2 回目以降は、それ以降に変更されたチャットだけを読み取ります。
198
- - **チャット行の Git ブランチ** が表示するのは、最後のターンの開始時または終了時に、チャットのフォルダーがあったブランチです。現在のブランチではありません。ターンの外でブランチを切り替えた場合は、次のターンの後に表示されます。このバージョンより前のチャットには、次のターンまでラベルが表示されません。ラベルは dsh のチャット行のマークアップの中に置かれます(dsh にはそこにスロットがありません)。dsh のアップデートでそのマークアップが変わった場合、ラベルは表示されません。
198
+ - **チャット行の Git ブランチ** が表示するのは、最後のターンの開始時または終了時に、チャットのフォルダーがあったブランチです。現在のブランチではありません。ターンの外でブランチを切り替えた場合は、次のターンの後に表示されます。このバージョンより前のチャットには、次のターンまでラベルが表示されません。ラベルは dsh のチャット行のマークアップの中に置かれます(dsh にはそこにスロットがありません)。dsh のアップデートでそのマークアップが変わった場合、ラベルは表示されません。チャットの上のプロジェクト行の名前がブランチと同じ場合(「チャットごとのブランチ」のフォルダーなど)、チャット行にラベルは表示されませんが、「1つのリスト」では表示されます。
199
199
  - **チャット内を検索** が検索するのは、ページに表示されている内容だけです。対象は読み込まれたメッセージと返信です(古いものは、上にスクロールするか、**以前の履歴を読み込む** をクリックします)。閉じているツールのステップや、ツールの出力の中で折りたたまれているテキストは対象外です。数える一致は最大 2,000 件です(それを超えると「2000+」)。ブラウザーのハイライト API を使います(Chromium 105 以降。デスクトップアプリには搭載されています)。古いブラウザーでは、件数と移動は動作しますが、色は付きません。Mac では `Cmd+F`(Windows と Linux では `Ctrl+F`)でこれが開くのは、画面にチャットがあるときだけです。それ以外の場所では、ブラウザー自体の検索がこれまでどおり動作します。Mac の `Ctrl+F` は、テキスト欄での macOS の動作(カーソルを 1 文字進める)のままです。
200
200
  - 再起動の前に送られた通知をクリックしても、dsh が前面に表示されるだけです。
201
201
  - アクティブなプロジェクトは、dsh に保存されたプロジェクトの順序を使って移動します。そのため、新しい順序は再起動後も維持されます。どのプロジェクトにも属さないチャット(「グループなし」)は移動できません。dsh は、これらのチャットを常に最後に表示します。
@@ -271,7 +271,7 @@ dsh `0.2.0-rc.2`(デスクトップと Web)と `0.2.1-rc.2`(Web)でテ
271
271
 
272
272
  **新しいセッションを常に同じプロジェクトで開くには?** 設定 → Composer Plus → **新しいセッションの既定のワークスペース** → **新しいセッションを開く場所** → プロジェクトを選びます。ほかのプロジェクト横の `+` は引き続きそのプロジェクトを開きます。
273
273
 
274
- **1 つのプロジェクトの複数の機能を、それぞれ専用のブランチで同時に進めるには?** **チャットごとのブランチ** を使います。新しいチャット → ⑂ main ボタン → **新しいブランチ** を選び、最初のメッセージを送信します。各チャットに専用のブランチと worktree フォルダーができ、`.worktreeinclude` に書かれていれば `.env` や `node_modules` もコピーされます。チャットのヘッダーに、今いるブランチが表示されます。
274
+ **1 つのプロジェクトの複数の機能を、それぞれ専用のブランチで同時に進めるには?** **チャットごとのブランチ** を使います。新しいチャット → ブランチのアイコンが付いた main ボタン → **新しいブランチ** を選び、最初のメッセージを送信します。各チャットに専用のブランチと worktree フォルダーができ、`.worktreeinclude` に書かれていれば `.env` や `node_modules` もコピーされます。チャットのヘッダーに、今いるブランチが表示されます。
275
275
 
276
276
  **iPhone から写真を送れますか?** はい。Tether のチャットで、メッセージ欄の横の **+** → Camera、Photos(最大 4 枚)、または Paste image をタップします。写真はメッセージの添付ファイルとして Mac のチャットに届くため、モデルはそれを見ることができます。
277
277
 
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.14.0`.
32
+ > dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.15.0`.
33
33
 
34
34
  ## 기능
35
35
 
@@ -57,14 +57,14 @@ dsh plugin --profile web add dsh-composer-plus
57
57
  | **새 채팅의 프로젝트 검색** | <a id="feature-projectpicker"></a>새 채팅 → 입력란 위의 프로젝트 버튼. 프로젝트가 A–Z 순서로 표시되고, 맨 위에 **프로젝트 검색** 상자가 있습니다. 이름의 일부를 입력하고(대소문자와 악센트 구분 없음) `Enter`를 누르면 첫 번째로 일치하는 프로젝트가 선택됩니다. 일치하는 것이 없으면 **일치하는 프로젝트 없음**이 표시됩니다. 사이드바에 저장된 dsh의 프로젝트 순서는 바뀌지 않습니다. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="스크린샷: 새 채팅의 프로젝트 검색"></a> |
58
58
  | **새 세션의 기본 작업 공간** | <a id="feature-defaultworkspace"></a>설정 → Composer Plus → **새 세션의 기본 작업 공간** → **새 세션을 열 위치**: 프로젝트나 **일반 폴더(default-workspace)** 중 하나를 고르세요(기본값: dsh 자체 폴더 `Documents/deepseek-harness/default-workspace`, 처음 사용할 때 만들어집니다). 그러면 사이드바 맨 위의 **새 세션**(과 그 단축키)은 다른 프로젝트의 채팅이 열려 있을 때도 항상 그곳에서 새 채팅을 엽니다. 프로젝트 옆의 `+`는 여전히 그 프로젝트를 열고, 새 채팅의 입력란 위에 있는 프로젝트 버튼으로도 여전히 프로젝트를 바꿀 수 있습니다. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="스크린샷: 새 세션의 기본 작업 공간"></a> |
59
59
  | **채팅에서 찾기** | <a id="feature-findinchat"></a>채팅에서 Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)를 누르면 채팅 위에 찾기 상자가 열립니다. 단어를 입력하면 화면에 있는 메시지와 답변의 일치 항목이 모두 강조 표시되고, 현재 항목은 더 진한 색으로 표시되며, 상자에 n / 전체가 표시됩니다. `Enter` 또는 `↓`는 다음 일치 항목으로, `Shift+Enter` 또는 `↑`는 이전 일치 항목으로 이동합니다(화살표 버튼도 같습니다). 채팅은 일치 항목을 가운데로 스크롤합니다. 대소문자, 악센트, 튀르키예어의 점 없는 ı는 구분하지 않습니다. `Esc`는 상자를 닫고 커서를 원래 자리로 되돌립니다. 답변이 스트리밍되는 동안에도 찾기가 채팅을 따라갑니다. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="스크린샷: 채팅에서 찾기"></a> |
60
- | **채팅별 브랜치** | <a id="feature-worktreechats"></a>새 채팅 → 프로젝트 버튼 옆의 ⑂ main 버튼 → **새 브랜치**를 고른 뒤 첫 메시지를 입력해 보내세요. AI가 그 메시지를 보고 브랜치 이름(`feat/…`, `fix/…`)을 짓고, Composer Plus가 `<project>/.worktrees/`에 그 브랜치의 git worktree를 만들고, `.worktreeinclude`에 나열된 무시된 파일(예: `.env`, `node_modules/`)을 복사한 뒤, 거기서 메시지와 함께 새 채팅을 엽니다. 열린 채팅의 헤더에는 ⑂ 브랜치 · 변경 N개 · ↑ ↓(또는 **푸시 안 됨**)가 표시됩니다. 클릭하면 **변경 사항**이 열립니다. 같은 메뉴에 열린 worktree도 나열됩니다. 하나를 고르면 거기서 채팅을 시작합니다. 사이드바에서 브랜치 폴더를 프로젝트 안에 표시하려면 dsh의 **보기 옵션** → **작업 공간 트리**를 고르세요. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="스크린샷: 채팅별 브랜치"></a> |
60
+ | **채팅별 브랜치** | <a id="feature-worktreechats"></a>새 채팅 → 프로젝트 버튼과 모드 버튼 사이의 main 버튼(브랜치 아이콘) → **새 브랜치**를 고른 뒤 첫 메시지를 입력해 보내세요. 첫 메시지에 이미지와 파일을 첨부할 수 있습니다. AI가 그 메시지를 보고 브랜치 이름(`feat/…`, `fix/…`)을 짓고, Composer Plus가 `<project>/.worktrees/`에 그 브랜치의 git worktree를 만들고, `.worktreeinclude`에 나열된 무시된 파일(예: `.env`, `node_modules/`)을 복사한 뒤, 거기서 메시지와 함께 새 채팅을 엽니다. 열린 채팅의 헤더에는 ⑂ 브랜치 · 변경 N개 · ↑ ↓(또는 **푸시 안 됨**)가 표시됩니다. 클릭하면 **변경 사항**이 열립니다. 같은 메뉴에 열린 worktree도 나열됩니다. 하나를 고르면 거기서 채팅을 시작합니다. 사이드바에서 브랜치 폴더를 프로젝트 안에 표시하려면 dsh의 **보기 옵션** → **작업 공간 트리**를 고르세요. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="스크린샷: 채팅별 브랜치"></a> |
61
61
  | **다음 메시지 예측** | <a id="feature-nextprediction"></a>기본적으로 켜져 있습니다. **설정 → Composer Plus**에서 끌 수 있습니다. 에이전트가 턴을 마치면(중지되거나 실패한 턴 제외) 빈 입력란에 다음 메시지의 예측이 회색으로 표시되고, **Tab으로 수락** 힌트가 함께 나옵니다. `Tab`을 누르면 텍스트가 입력란에 들어가지만 보내지는 않습니다. `Esc`를 누르면 그 턴 동안 예측이 숨겨집니다. 입력을 시작해도 숨겨지고, 새 턴이 오면 새 예측으로 바뀝니다. 스위치 아래의 **모델** 메뉴에는 dsh 자체의 모델 목록이 나옵니다(dsh 모델 메뉴와 같은 목록). 기본으로 **dsh 기본값**이 선택되어 있으며, dsh의 기본 모델을 따릅니다. 턴이 끝날 때마다 짧은 모델 호출이 한 번 일어납니다. Tether에서는 예측이 빈 입력란 위에 표시됩니다. 탭하면 입력란에 들어갑니다. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="스크린샷: 다음 메시지 예측"></a> |
62
62
  | **입력 중 자동 완성** | <a id="feature-typingcompletion"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켤 수 있습니다. 입력하는 동안 커서 바로 뒤의 회색 텍스트가 메시지가 이어질 수 있는 내용을 보여 줍니다. `Tab`을 누르면 메시지에 추가되지만 보내지는 않습니다. `Esc`를 누르면 숨겨집니다. 사용자가 직접 이어서 쓸 말만 제안합니다. 사용자에게 하는 답변이나 지어낸 오류 문구, 이름은 제안하지 않습니다. 메시지가 끝난 것처럼 보이거나 모델이 확신하지 못하면 아무것도 표시되지 않습니다. 회색 텍스트의 다음 글자를 그대로 입력하면 텍스트가 유지되고, 새 모델 호출은 없습니다. 스위치 아래에 이 기능 전용 **모델** 메뉴가 있습니다. 첫 항목인 **다음 메시지 예측과 같음**은 **다음 메시지 예측**의 모델을 사용합니다(기본값). 기능마다 다른 모델을 쓰려면 다른 모델을 고르세요. 예를 들어 자동 완성에는 더 빠른 모델을 고를 수 있습니다. 입력을 멈출 때마다 모델을 한 번 호출하므로 예측보다 토큰을 훨씬 많이 사용합니다. 빠르고 비용이 낮은 모델을 고르세요. 슬래시 명령, 파일 칩이 있는 메시지, 커서가 끝에 있지 않을 때는 실행되지 않습니다. Tether에서는 입력하는 동안 나머지 텍스트가 입력란 위에 표시됩니다. 탭하면 추가됩니다. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="스크린샷: 입력 중 자동 완성"></a> |
63
63
  | **프롬프트 개선** | <a id="feature-promptimprove"></a>대략적인 요청을 입력한 뒤 모델 메뉴 옆의 요술봉(**프롬프트 개선**)을 클릭하세요. 모델 호출 한 번으로 요청을 더 명확한 프롬프트로 다시 씁니다. 목표를 먼저 쓰고, 여러 부분이 있으면 짧은 번호 단계로 나누고, 실행할 검사를 적습니다. 이 채팅(되돌린 메시지 제외), 프로젝트의 README, AGENTS.md, 매니페스트, 변경된 파일, 이름이 입력한 단어와 일치하는 파일을 읽고, 사용 언어를 유지합니다. 파일 이름을 지어내지 않습니다. 새 텍스트가 초안을 대신하지만 보내지는 않습니다. 읽고 고친 뒤 `Enter`를 누르세요. `Cmd/Ctrl+Z`를 누르면 한 번에 원래 텍스트로 돌아오며, 버튼(**개선 실행 취소**)도 같습니다. 작업 중에 입력하면 새로 입력한 텍스트가 유지됩니다. `Esc`를 누르거나 한 번 더 클릭하면 취소됩니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 슬래시 명령이나 파일 칩이 있는 메시지에는 쓸 수 없습니다. Tether에서는 요술봉이 입력란 옆에 있습니다. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="스크린샷: 프롬프트 개선"></a> |
64
64
  | **목표 확인** | <a id="feature-goalcheck"></a>`/goal`로 목표를 시작하세요. 에이전트가 자동 라운드에서 목표를 완료로 표시하면, 목표는 두 가지 확인을 통과해야만 닫힙니다. 먼저 프로젝트의 테스트 명령이 채팅 폴더에서 채팅의 샌드박스 모드로 실행됩니다. 명령은 직접 정한 명령이거나 `package.json`, `Makefile`, `Cargo.toml`, `go.mod` 또는 pytest에서 찾은 명령입니다. 에이전트 자신의 최신 단계가 그 테스트의 성공한 실행이었다면 다시 실행하지 않습니다. 그다음 도구가 없는 독립적인 모델 호출 한 번이 목표, 이 채팅, `git status`, 테스트 결과를 읽습니다. 확인에 실패하면 목표는 진행 중으로 남고, 에이전트가 이유를 읽은 뒤 다음 라운드가 이어집니다. 목표 바 아래의 행(**목표 확인**)에 테스트와 마지막 결과가 표시됩니다. **편집**에서 직접 테스트 명령과 시간 또는 토큰 제한을 정합니다. 제한을 넘으면 목표가 차단됩니다. **지금 실행**은 목표를 닫지 않고 확인을 실행합니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 목표를 직접 완료하면 아무것도 확인하지 않습니다. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="스크린샷: 목표 확인"></a> |
65
65
  | **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 시간 제한이 끝날 때까지 허용됩니다(기본값 1시간. **설정 → Composer Plus → 이 채팅에서 허용**에서 고릅니다). 그 후에는 에이전트가 다시 묻습니다. 헤더 칩에서 허용 목록과 종료 시각을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="스크린샷: 이 채팅에서 허용"></a> |
66
66
  | **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
67
- | **채팅 행의 Git 브랜치** | <a id="feature-sessionbranch"></a>사이드바의 각 채팅 행에 작은 회색 배지로, 채팅의 마지막 턴 때 채팅 프로젝트 폴더가 있던 git 브랜치가 표시됩니다(예: `main` 또는 `feature/login`. 분리된 HEAD는 짧은 커밋 ID를 괄호 안에 표시합니다). 한 프로젝트에서 서로 다른 브랜치에 있는 두 채팅이 더 이상 똑같아 보이지 않으며, 잘못된 브랜치에서 채팅을 이어 가려 할 때 바로 알 수 있습니다. 배지에 포인터를 올리면 전체 이름이 보입니다. Host 쪽은 턴이 시작될 때와 끝날 때 브랜치를 읽습니다(`git branch --show-current`, 읽기 전용). 이 기능을 설치한 뒤 턴이 없는 채팅이나 git 저장소가 아닌 폴더에는 배지가 표시되지 않습니다. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="스크린샷: 채팅 행의 Git 브랜치"></a> |
67
+ | **채팅 행의 Git 브랜치** | <a id="feature-sessionbranch"></a>사이드바의 각 채팅 행에 작은 회색 배지로, 채팅의 마지막 턴 때 채팅 프로젝트 폴더가 있던 git 브랜치가 표시됩니다(예: `main` 또는 `feature/login`. 분리된 HEAD는 짧은 커밋 ID를 괄호 안에 표시합니다). 한 프로젝트에서 서로 다른 브랜치에 있는 두 채팅이 더 이상 똑같아 보이지 않으며, 잘못된 브랜치에서 채팅을 이어 가려 할 때 바로 알 수 있습니다. 배지에 포인터를 올리면 전체 이름이 보입니다. Host 쪽은 턴이 시작될 때와 끝날 때 브랜치를 읽습니다(`git branch --show-current`, 읽기 전용). 이 기능을 설치한 뒤 턴이 없는 채팅이나 git 저장소가 아닌 폴더에는 배지가 표시되지 않습니다. 채팅 위의 프로젝트 행 이름이 브랜치와 같으면(예: “채팅별 브랜치” 폴더) 채팅 행에 배지가 표시되지 않지만, “하나의 목록”에서는 계속 표시됩니다. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="스크린샷: 채팅 행의 Git 브랜치"></a> |
68
68
  | **모두 읽음으로 표시** | <a id="feature-markprojectread"></a>사이드바에서 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**를 클릭하세요. 그 프로젝트의 모든 채팅에서 초록색 읽지 않음 점이 한 번에 사라집니다. 다른 프로젝트의 점은 그대로 남습니다. 프로젝트에 읽지 않은 채팅이 없으면 이 항목은 회색으로 표시됩니다(**읽지 않은 채팅 없음**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="스크린샷: 모두 읽음으로 표시"></a> |
69
69
  | **활성 프로젝트 우선** | <a id="feature-activeprojectsfirst"></a>채팅이 실행을 시작하거나 사용자의 조치가 필요해지면, 그 프로젝트가 dsh 자체 행 애니메이션으로 사이드바 맨 위로 이동합니다(직접 끌어 올릴 때와 같은 움직임). 완료된 프로젝트는 제자리에 남으며, 평소처럼 원하는 곳으로 끌어 옮길 수 있습니다. 이동은 dsh의 프로젝트 순서에 저장되므로, 이 기능을 꺼도 현재 순서가 유지됩니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 활성 프로젝트 우선"></a> |
70
70
  | **최근 프로젝트 필터** | <a id="feature-recentprojects"></a>사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 이 옵션을 선택하면 사이드바에는 최근 2시간 안에 활성 채팅이 있었던 프로젝트만 표시됩니다. 활성 채팅은 그 시간 안에 업데이트된 채팅, 실행 중이거나 대기 중인 채팅, 열려 있는 채팅, 아직 열지 않은 완료된 채팅(dsh의 초록색 “완료” 점)입니다. 마지막 경우는 2시간이 지나도 해당됩니다. 이런 채팅이 없는 프로젝트는 숨겨지며, 새 프로젝트와 빈 프로젝트도 숨겨집니다. 모든 프로젝트를 다시 보려면 옵션을 다시 선택하세요. 선택은 이 기기에 저장됩니다. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="스크린샷: 최근 프로젝트 필터"></a> |
@@ -169,7 +169,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
169
169
  - **채팅 행에 브랜치 배지가 없음:** 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
170
170
  - **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
171
171
  - **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
172
- - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.14.0`). 위의 설치 안내를 참고하세요.
172
+ - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.15.0`). 위의 설치 안내를 참고하세요.
173
173
 
174
174
  ## 제한 사항
175
175
 
@@ -195,7 +195,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
195
195
  - **이 채팅**은 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)가 쓴 파일만 셉니다. 명령(`bash`)이 바꾼 파일은 이 보기에 없고, **커밋 안 됨**에 표시됩니다. 채팅의 턴 되돌리기 스냅샷이 없으면(턴 되돌리기 꺼짐, dsh-rewind-plugin 설치됨, 또는 플러그인보다 오래된 채팅) 보기는 마지막 커밋과 비교하고 그렇다고 알려 줍니다. 턴 되돌리기는 채팅마다 최신 스냅샷 50개를 보관합니다. 더 긴 채팅에서는 보기가 보관된 가장 오래된 스냅샷과 비교하고, 어느 메시지부터인지 알려 주며, 그 이전의 변경은 세지 않습니다. **공백 변경 숨기기**는 `git diff -w`입니다. 줄 안의 공백만 바뀐 줄도 숨겨집니다.
196
196
  - **GitHub 이슈 열기**에는 dsh의 PATH에 있는 GitHub CLI(`gh`)와 채팅 폴더의 GitHub 원격 저장소가 필요합니다. 최대 60초 동안 실행됩니다. `gh`가 더 오래 걸리면, 이슈가 GitHub에는 만들어졌지만 목록에는 링크가 없을 수 있습니다(다시 클릭하기 전에 GitHub를 확인하세요. 목록은 끝난 실행에서만 링크를 읽으므로, 다시 클릭하면 두 번째 이슈가 열릴 수 있습니다). GitHub 원격 저장소가 둘 이상인 폴더는 `gh` 자체의 기본값(`gh repo set-default`)을 씁니다.
197
197
  - **이 파일을 변경한 채팅**은 **이 채팅**처럼 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)만 압니다. 명령(`bash`)으로 만든 변경은 목록에 나오지 않습니다. 저장소의 최신 채팅 300개(만든 시점 기준)를 읽고, 더 있으면 그렇다고 알려 줍니다. 최대 100행을 보여 줍니다. 이름이 바뀐 파일은 도구가 쓴 이름으로 표시됩니다. 폴더가 저장소 밖에 있는 채팅(같은 파일로 가는 다른 경로를 통한 경우도 포함)은 세지 않습니다. dsh를 시작한 뒤 처음 열 때는 저장소의 모든 채팅 로그를 읽습니다(채팅 275개에 약 4초). 그 뒤로 열 때는 그 이후에 바뀐 채팅만 읽습니다.
198
- - **채팅 행의 Git 브랜치**는 현재 브랜치가 아니라, 마지막 턴이 시작되거나 끝날 때 채팅 폴더가 있던 브랜치를 보여 줍니다. 턴 밖에서 브랜치를 바꾸면 다음 턴 뒤에 표시됩니다. 이 버전 이전의 채팅에는 다음 턴까지 배지가 표시되지 않습니다. 배지는 dsh의 채팅 행 마크업 안에 들어갑니다(dsh에는 그곳에 슬롯이 없습니다). dsh 업데이트로 그 마크업이 바뀌면 배지가 표시되지 않습니다.
198
+ - **채팅 행의 Git 브랜치**는 현재 브랜치가 아니라, 마지막 턴이 시작되거나 끝날 때 채팅 폴더가 있던 브랜치를 보여 줍니다. 턴 밖에서 브랜치를 바꾸면 다음 턴 뒤에 표시됩니다. 이 버전 이전의 채팅에는 다음 턴까지 배지가 표시되지 않습니다. 배지는 dsh의 채팅 행 마크업 안에 들어갑니다(dsh에는 그곳에 슬롯이 없습니다). dsh 업데이트로 그 마크업이 바뀌면 배지가 표시되지 않습니다. 채팅 위의 프로젝트 행 이름이 브랜치와 같으면(예: “채팅별 브랜치” 폴더) 채팅 행에 배지가 표시되지 않지만, “하나의 목록”에서는 계속 표시됩니다.
199
199
  - **채팅에서 찾기**는 페이지가 보여 주는 것만 검색합니다. 불러온 메시지와 답변이 대상이며(이전 것은 위로 스크롤하거나 **이전 기록 로드**를 클릭하세요), 닫힌 도구 단계와 도구 출력 안의 접힌 텍스트는 검색하지 않습니다. 일치 항목은 최대 2,000개까지 셉니다(그 뒤에는 "2000+"). 브라우저의 하이라이트 API를 씁니다(Chromium 105 이상, 데스크톱 앱에는 있습니다). 더 오래된 브라우저에서는 개수와 이동은 작동하지만 색은 표시되지 않습니다. Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)가 화면에 채팅이 있을 때만 이것을 엽니다. 다른 곳에서는 브라우저 자체의 찾기가 전처럼 작동합니다. Mac에서 `Ctrl+F`는 텍스트 필드에서 macOS 기능(커서를 한 글자 앞으로 이동)을 그대로 유지합니다.
200
200
  - 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
201
201
  - 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
@@ -271,7 +271,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
271
271
 
272
272
  **새 세션를 항상 같은 프로젝트에서 열려면 어떻게 하나요?** 설정 → Composer Plus → **새 세션의 기본 작업 공간** → **새 세션을 열 위치** → 프로젝트를 선택합니다. 다른 프로젝트 옆의 `+`는 계속 그 프로젝트를 엽니다.
273
273
 
274
- **한 프로젝트의 여러 기능을 각각 자기 브랜치에서 동시에 진행하려면 어떻게 하나요?** **채팅별 브랜치**를 쓰세요. 새 채팅 → ⑂ main 버튼 → **새 브랜치**를 고른 뒤 첫 메시지를 보내세요. 채팅마다 자체 브랜치와 worktree 폴더가 생기고, `.worktreeinclude`에 나열되어 있으면 `.env`와 `node_modules`도 함께 복사됩니다. 채팅 헤더에 현재 브랜치가 표시됩니다.
274
+ **한 프로젝트의 여러 기능을 각각 자기 브랜치에서 동시에 진행하려면 어떻게 하나요?** **채팅별 브랜치**를 쓰세요. 새 채팅 → 브랜치 아이콘이 있는 main 버튼 → **새 브랜치**를 고른 뒤 첫 메시지를 보내세요. 채팅마다 자체 브랜치와 worktree 폴더가 생기고, `.worktreeinclude`에 나열되어 있으면 `.env`와 `node_modules`도 함께 복사됩니다. 채팅 헤더에 현재 브랜치가 표시됩니다.
275
275
 
276
276
  **iPhone에서 사진을 보낼 수 있나요?** 네. Tether 채팅에서 메시지 입력란 옆의 **+** → Camera, Photos(최대 4장) 또는 Paste image를 탭하세요. 사진은 메시지의 첨부 파일로 Mac의 채팅에 전달되므로 모델이 볼 수 있습니다.
277
277
 
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.14.0`.
30
+ > dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.15.0`.
31
31
 
32
32
  ## Features
33
33
 
@@ -55,14 +55,14 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
55
55
  | **Project search in a new chat** | <a id="feature-projectpicker"></a>New chat → the project button above the composer. The projects show in A–Z order, with a **Search projects** box on top. Type part of a name (case and accents do not matter) and press `Enter` to pick the first match. **No matching project** shows when nothing matches. dsh's saved project order in the sidebar does not change. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Screenshot: Project search in a new chat"></a> |
56
56
  | **Default workspace for New session** | <a id="feature-defaultworkspace"></a>Settings → Composer Plus → **Default workspace for New session** → **Open New session in**: choose a project, or **General folder (default-workspace)** (the default: dsh's own folder `Documents/deepseek-harness/default-workspace`, made at the first use). Then **New session** at the top of the sidebar (and its shortcut) always opens there, also while another project's chat is open. The `+` next to a project still opens that project, and the project button above the composer of the new chat still changes the project. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Screenshot: Default workspace for New session"></a> |
57
57
  | **Find in chat** | <a id="feature-findinchat"></a>Press `Cmd+F` on a Mac (`Ctrl+F` on Windows and Linux) in a chat: a find box opens over it. Type a word: every match in the messages and replies on screen is highlighted, the current one in a stronger color, and the box shows **n / total**. `Enter` or `↓` goes to the next match and `Shift+Enter` or `↑` to the previous one (also the arrow buttons); the chat scrolls the match to the middle. Case, accents and the Turkish dotless ı do not matter. `Esc` closes the box and puts the cursor back where it was. It follows the chat while a reply streams in. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Screenshot: Find in chat"></a> |
58
- | **Branch per chat** | <a id="feature-worktreechats"></a>New chat → the ⑂ main button next to the project button → **New branch**, then type the first message and send it. The AI names the branch (`feat/…`, `fix/…`) from that message, Composer Plus makes a git worktree for it in `<project>/.worktrees/`, copies the ignored files that `.worktreeinclude` lists (for example `.env` and `node_modules/`) and opens a new chat there with your message. The open chat's header shows ⑂ branch · N changes · ↑ ↓ (or **not pushed**); click it to open **Changes**. The same menu lists the open worktrees: pick one to start a chat in it. To see the branch folders inside their project in the sidebar, choose dsh's **View options** → **Workspace tree**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Screenshot: Branch per chat"></a> |
58
+ | **Branch per chat** | <a id="feature-worktreechats"></a>New chat → the main button (branch icon) between the project button and the mode button → **New branch**, then type the first message and send it. The first message can carry images and files. The AI names the branch (`feat/…`, `fix/…`) from that message, Composer Plus makes a git worktree for it in `<project>/.worktrees/`, copies the ignored files that `.worktreeinclude` lists (for example `.env` and `node_modules/`) and opens a new chat there with your message. The open chat's header shows ⑂ branch · N changes · ↑ ↓ (or **not pushed**); click it to open **Changes**. The same menu lists the open worktrees: pick one to start a chat in it. To see the branch folders inside their project in the sidebar, choose dsh's **View options** → **Workspace tree**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Screenshot: Branch per chat"></a> |
59
59
  | **Next message prediction** | <a id="feature-nextprediction"></a>On by default; switch it off in **Settings → Composer Plus**. When the agent finishes a turn (not a stopped or failed one), the empty composer shows a guess of your next message in grey, with a **Tab to accept** hint. `Tab` puts the text in the composer, but does not send it. `Esc` hides it for that turn. Typing also hides it, and a new turn replaces it. The **Model** menu under the switch lists dsh's own models (the same list as dsh's model menu). **dsh default** is selected by default and follows dsh's default model. Each finished turn costs one short model call. In Tether, the guess shows above the empty composer: tap it to put it in the field. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Screenshot: Next message prediction"></a> |
60
60
  | **Complete while typing** | <a id="feature-typingcompletion"></a>Off by default; switch it on in **Settings → Composer Plus**. While you type, grey text right after the cursor shows how your message may go on. `Tab` adds it to the message, but does not send it. `Esc` hides it. It suggests only your own next words: never an answer to you, and no made-up error texts or names. When the message looks complete or the model is not sure, nothing shows. Typing the next letters of the grey text keeps it, with no new model call. It has its own **Model** menu under its switch. Its first entry, **Same as Next message prediction**, uses the model of **Next message prediction** (the default); pick another model to use a different one for each feature, for example a faster model for completions. It makes one model call at each pause while you type, so it uses many more tokens than the prediction: pick a fast, low-cost model. It does not run for a slash command, a message with a file chip, or when the cursor is not at the end. In Tether, the rest shows above the field while you type: tap it to add it. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Screenshot: Complete while typing"></a> |
61
61
  | **Improve prompt** | <a id="feature-promptimprove"></a>Type a rough request, then click the magic wand (**Improve prompt**) next to the model menu. One model call rewrites it as a clearer prompt: the goal first, short numbered steps when there are several parts, and the check to run. It reads this chat (rolled-back messages left out), the project's README, AGENTS.md and manifest, the changed files and the files whose names match your words, and keeps your language. It never makes up file names. The new text replaces your draft but is not sent: read it, edit it, then press `Enter`. `Cmd/Ctrl+Z` brings your text back in one step, and so does the button (**Undo improvement**). If you type while it works, your new text stays. `Esc` or a second click cancels. It has its own **Model** menu in Settings (default: **Same as the chat's model**). Not for slash commands or a message with a file chip. In Tether, the wand is next to the field. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Screenshot: Improve prompt"></a> |
62
62
  | **Goal check** | <a id="feature-goalcheck"></a>Start a goal with `/goal`. When the agent marks the goal complete in an automatic round, the goal closes only after two checks. First, the project's test command runs in the chat's folder, under the chat's sandbox mode. The command is your own one or the one found in `package.json`, `Makefile`, `Cargo.toml`, `go.mod` or pytest. When the agent's own newest step was a passing run of that test, it does not run again. Then one independent model call, with no tools, reads the goal, this chat, `git status` and the test result. If a check fails, the goal stays active and the agent reads why, then the next round goes on. A row under the goal bar (**Goal check**) shows the test and the last result. **Edit** sets your own test command and a time or token limit; over the limit the goal becomes blocked. **Run now** runs the check without closing the goal. It has its own **Model** menu in Settings (default: **Same as the chat's model**). When you complete the goal yourself, nothing is checked. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Screenshot: Goal check"></a> |
63
63
  | **Allow for this chat** | <a id="feature-allowforchat"></a>When Auto Review asks you, the approval card gets **Allow for this chat**: the same tool in the same chat is allowed from then on, with any arguments, until the time limit ends (1 hour by default; choose it under **Settings → Composer Plus → Allow for this chat**). Then the agent asks again. A header chip lists the grants with their end time and revokes them. Grants survive a restart. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Screenshot: Allow for this chat"></a> |
64
64
  | **Project status** | <a id="feature-projectstatus"></a>A project row in the sidebar shows the same spinner / waiting / done marker as its chats, so a collapsed project still tells you a chat inside is working or needs you. A chat waiting for you shows first, then a finished chat you have not opened yet (the green dot, also while another chat still runs), then the spinner. Hover it for details. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Project status"></a> |
65
- | **Git branch on chat rows** | <a id="feature-sessionbranch"></a>Each chat row in the sidebar shows a small grey pill with the git branch that the chat's project folder was on at the chat's last turn (for example `main` or `feature/login`; a detached HEAD shows its short commit id in parentheses). Two chats of one project on different branches no longer look the same, and you see at once when you are about to continue a chat on the wrong branch. Hover the pill for the full name. The Host half reads the branch (`git branch --show-current`, read-only) when a turn starts and when it ends; a chat with no turn since you installed this, or a folder that is not a git repository, shows no pill. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git branch on chat rows"></a> |
65
+ | **Git branch on chat rows** | <a id="feature-sessionbranch"></a>Each chat row in the sidebar shows a small grey pill with the git branch that the chat's project folder was on at the chat's last turn (for example `main` or `feature/login`; a detached HEAD shows its short commit id in parentheses). Two chats of one project on different branches no longer look the same, and you see at once when you are about to continue a chat on the wrong branch. Hover the pill for the full name. The Host half reads the branch (`git branch --show-current`, read-only) when a turn starts and when it ends; a chat with no turn since you installed this, or a folder that is not a git repository, shows no pill. A chat under a project row with its branch's name (a “Branch per chat” folder) shows no pill, except in “In one list”. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Screenshot: Git branch on chat rows"></a> |
66
66
  | **Mark all as read** | <a id="feature-markprojectread"></a>In the sidebar, click a project's **…** button → **Mark all as read**. Every chat in that project loses its green unread dot at once; other projects keep theirs. The item is greyed out (**No unread chats**) when the project has none. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Screenshot: Mark all as read"></a> |
67
67
  | **Active projects first** | <a id="feature-activeprojectsfirst"></a>When a chat starts running or needs you, its project moves to the top of the sidebar with dsh's own row animation (the same move as dragging it there). Finished projects stay where they are; drag them anywhere as usual. Moves are saved to dsh's project order, so turning this off keeps the current order. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Active projects first"></a> |
68
68
  | **Recent projects filter** | <a id="feature-recentprojects"></a>Sidebar → view options (sliders icon) → **Active in the last 2 hours**. While it is selected, the sidebar shows only projects with a chat that was active in the last 2 hours: a chat updated in that time, a running or waiting chat, the open chat, or a finished chat that you did not open yet (dsh's green “done” dot), also after the 2 hours. Projects without such a chat are hidden, also new and empty ones. Select it again to show all projects. The choice is kept on this device. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Screenshot: Recent projects filter"></a> |
@@ -167,7 +167,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
167
167
  - **No branch pill on a chat row:** 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).
168
168
  - **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.
169
169
  - **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).
170
- - **Install fails right after a release:** add the version (`dsh-composer-plus@1.14.0`), see the install note above.
170
+ - **Install fails right after a release:** add the version (`dsh-composer-plus@1.15.0`), see the install note above.
171
171
 
172
172
  ## Limits
173
173
 
@@ -193,7 +193,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
193
193
  - **This chat** counts only files that dsh's file tools (`write`, `edit`, `str_replace_editor`) wrote. Files that a command (`bash`) changed are not in this view; they show under **Uncommitted**. Without a Turn rollback snapshot of the chat (Turn rollback off, dsh-rewind-plugin installed, or a chat older than the plugin), the view compares with the last commit and says so. Turn rollback keeps the 50 newest snapshots of a chat: in a longer chat, the view compares with the oldest kept one, says from which message, and does not count earlier changes. **Hide whitespace changes** is `git diff -w`: a line that changed only in spaces inside it is hidden too.
194
194
  - **Open GitHub issue** needs the GitHub CLI (`gh`) on the PATH of dsh and a GitHub remote in the chat's folder. It runs at most 60 s; if `gh` takes longer, the issue can exist on GitHub without its link in the list (click again: the list reads the link only from a finished run, so look on GitHub before you open a second one). A folder with more than one GitHub remote uses `gh`'s own default (`gh repo set-default`).
195
195
  - **Chats that changed this file** knows only dsh's file tools (`write`, `edit`, `str_replace_editor`), as **This chat**: a change made by a command (`bash`) is not listed. It reads the newest 300 chats of the repository (by when they were made) and says so when there are more; it shows at most 100 rows. A renamed file is listed under the name that the tool wrote. A chat whose folder is outside the repository (also through another path to the same files) is not counted. The first open after a dsh start reads every chat log of the repository (about 4 s for 275 chats); later opens read only the chats that changed since.
196
- - **Git branch on chat rows** shows the branch of the chat's folder when its last turn started or ended, not the branch now: a branch switch outside a turn shows after the next turn. Chats from before this version show no pill until their next turn. The pill sits in dsh's chat row markup (dsh has no slot there); if a dsh update changes that markup, no pill shows.
196
+ - **Git branch on chat rows** shows the branch of the chat's folder when its last turn started or ended, not the branch now: a branch switch outside a turn shows after the next turn. Chats from before this version show no pill until their next turn. The pill sits in dsh's chat row markup (dsh has no slot there); if a dsh update changes that markup, no pill shows. A chat under a project row with its branch's name (a “Branch per chat” folder) shows no pill, except in “In one list”.
197
197
  - **Find in chat** searches only what the page shows: the messages and replies that are loaded (scroll up or click **Load earlier** for older ones), not tool steps that are closed and not the text inside a tool's output that is folded. It counts at most 2,000 matches (then "2000+"). It uses the browser's highlight API (Chromium 105 and later; the desktop app has it): in an older browser the count and the moves work without the color. `Cmd+F` on a Mac (`Ctrl+F` on Windows and Linux) opens it only while a chat is on screen; elsewhere the browser's own find works as before. On a Mac, `Ctrl+F` keeps its macOS use in text fields (the cursor moves one character forward).
198
198
  - A notification sent before a restart only brings dsh to the front when clicked.
199
199
  - Active projects are moved with dsh's saved project order, so the new order is kept after a restart. Chats outside any project ("Ungrouped") can't be moved; dsh always lists them last.
@@ -269,7 +269,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
269
269
 
270
270
  **How do I make New session always open in the same project?** Settings → Composer Plus → **Default workspace for New session** → **Open New session in** → choose the project. The `+` next to another project still opens that project.
271
271
 
272
- **How do I run several features of one project at the same time, each on its own branch?** With **Branch per chat**: new chat → the ⑂ main button → **New branch**, then send the first message. Each chat gets its own branch and worktree folder, with your `.env` and `node_modules` when `.worktreeinclude` lists them. The chat header shows which branch you are on.
272
+ **How do I run several features of one project at the same time, each on its own branch?** With **Branch per chat**: new chat → the main button with the branch icon → **New branch**, then send the first message. Each chat gets its own branch and worktree folder, with your `.env` and `node_modules` when `.worktreeinclude` lists them. The chat header shows which branch you are on.
273
273
 
274
274
  **Can I send a photo from my iPhone?** Yes. In a Tether chat, tap **+** next to the message field → Camera, Photos (up to 4) or Paste image. The photos go to the chat on the Mac as attachments of your message, so the model sees them.
275
275
 
package/README.pt-BR.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem gerencia esse perfil é o app.)
31
31
 
32
- > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.14.0`.
32
+ > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.15.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -57,14 +57,14 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
57
57
  | **Busca de projetos em um novo chat** | <a id="feature-projectpicker"></a>Novo chat → o botão de projeto acima do editor de mensagens. Os projetos aparecem em ordem A–Z, com uma caixa **Buscar projetos** no topo. Digite parte de um nome (sem diferenciar maiúsculas, minúsculas e acentos) e pressione `Enter` para escolher o primeiro resultado. Quando nada corresponde, aparece **Nenhum projeto corresponde**. A ordem de projetos salva do dsh na barra lateral não muda. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Captura de tela: Busca de projetos em um novo chat"></a> |
58
58
  | **Espaço de trabalho padrão para Nova sessão** | <a id="feature-defaultworkspace"></a>Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em**: escolha um projeto ou **Pasta geral (default-workspace)** (o padrão: a própria pasta do dsh `Documents/deepseek-harness/default-workspace`, criada no primeiro uso). Depois disso, **Nova sessão** no topo da barra lateral (e o atalho dela) sempre abre o novo chat ali, também enquanto um chat de outro projeto está aberto. O `+` ao lado de um projeto continua abrindo esse projeto, e o botão de projeto acima do editor de mensagens do novo chat continua mudando o projeto. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Captura de tela: Espaço de trabalho padrão para Nova sessão"></a> |
59
59
  | **Buscar no chat** | <a id="feature-findinchat"></a>Pressione `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) em um chat: uma caixa de busca se abre sobre ele. Digite uma palavra: todas as ocorrências nas mensagens e respostas na tela ficam destacadas, a atual com uma cor mais forte, e a caixa mostra n / total. `Enter` ou `↓` vai para a próxima ocorrência e `Shift+Enter` ou `↑` para a anterior (os botões de seta também); o chat rola a ocorrência até o meio. Maiúsculas, acentos e o ı sem ponto do turco não fazem diferença. `Esc` fecha a caixa e devolve o cursor para onde ele estava. A busca acompanha o chat enquanto uma resposta chega. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Captura de tela: Buscar no chat"></a> |
60
- | **Um branch por chat** | <a id="feature-worktreechats"></a>Novo chat → o botão ⑂ main ao lado do botão de projeto → **Novo branch**; depois digite a primeira mensagem e envie. A IA dá nome ao branch (`feat/…`, `fix/…`) a partir dessa mensagem, o Composer Plus cria um worktree git para ele em `<project>/.worktrees/`, copia os arquivos ignorados que o `.worktreeinclude` lista (por exemplo `.env` e `node_modules/`) e abre ali um novo chat com a sua mensagem. O cabeçalho do chat aberto mostra ⑂ branch · N alterações · ↑ ↓ (ou **não enviado**); clique nele para abrir **Alterações**. O mesmo menu lista os worktrees abertos: escolha um para iniciar um chat nele. Para ver as pastas dos branches dentro do projeto na barra lateral, escolha no dsh **Opções de exibição** → **Árvore de workspaces**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura de tela: Um branch por chat"></a> |
60
+ | **Um branch por chat** | <a id="feature-worktreechats"></a>Novo chat → o botão main (ícone de branch) entre o botão de projeto e o botão de modo → **Novo branch**; depois digite a primeira mensagem e envie. A primeira mensagem pode levar imagens e arquivos. A IA dá nome ao branch (`feat/…`, `fix/…`) a partir dessa mensagem, o Composer Plus cria um worktree git para ele em `<project>/.worktrees/`, copia os arquivos ignorados que o `.worktreeinclude` lista (por exemplo `.env` e `node_modules/`) e abre ali um novo chat com a sua mensagem. O cabeçalho do chat aberto mostra ⑂ branch · N alterações · ↑ ↓ (ou **não enviado**); clique nele para abrir **Alterações**. O mesmo menu lista os worktrees abertos: escolha um para iniciar um chat nele. Para ver as pastas dos branches dentro do projeto na barra lateral, escolha no dsh **Opções de exibição** → **Árvore de workspaces**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura de tela: Um branch por chat"></a> |
61
61
  | **Previsão da próxima mensagem** | <a id="feature-nextprediction"></a>Ativada por padrão; você pode desativá-la em **Configurações → Composer Plus**. Quando o agente termina um turno (não um turno interrompido ou que falhou), o editor de mensagens vazio mostra em cinza um palpite da sua próxima mensagem, com a dica **Tab para aceitar**. `Tab` coloca o texto no editor, mas não o envia. `Esc` esconde o palpite naquele turno. Começar a digitar também o esconde, e um novo turno o substitui. O menu **Modelo** abaixo da chave lista os próprios modelos do dsh (a mesma lista do menu de modelos do dsh). **Padrão do dsh** vem selecionado por padrão e segue o modelo padrão do dsh. Cada turno concluído custa uma chamada curta ao modelo. No Tether, o palpite aparece acima do editor vazio: toque nele para colocá-lo no campo. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Captura de tela: Previsão da próxima mensagem"></a> |
62
62
  | **Completar ao digitar** | <a id="feature-typingcompletion"></a>Desativado por padrão; você pode ativá-lo em **Configurações → Composer Plus**. Enquanto você digita, um texto cinza logo após o cursor mostra como sua mensagem pode continuar. `Tab` adiciona o texto à mensagem, mas não a envia. `Esc` esconde o texto. Ele sugere só as suas próprias próximas palavras: nunca uma resposta para você, nem textos de erro ou nomes inventados. Se a mensagem parecer completa ou o modelo não tiver certeza, nada aparece. Digitar as próximas letras do texto cinza o mantém, sem nova chamada ao modelo. Tem o próprio menu **Modelo** abaixo da sua chave. A primeira opção, **Igual à previsão da próxima mensagem**, usa o modelo da **Previsão da próxima mensagem** (é o padrão); escolha outro modelo para usar um modelo diferente em cada recurso, por exemplo um modelo mais rápido para os complementos. Faz uma chamada ao modelo a cada pausa enquanto você digita, por isso gasta muito mais tokens que a previsão: escolha um modelo rápido e de baixo custo. Não é executado em um comando de barra, em uma mensagem com um chip de arquivo nem quando o cursor não está no final. No Tether, o restante aparece acima do campo enquanto você digita: toque nele para adicioná-lo. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Captura de tela: Completar ao digitar"></a> |
63
63
  | **Melhorar prompt** | <a id="feature-promptimprove"></a>Digite um pedido aproximado e clique na varinha mágica (**Melhorar prompt**) ao lado do menu de modelos. Uma chamada ao modelo o reescreve como um prompt mais claro: primeiro o objetivo, passos numerados curtos quando há várias partes e a verificação a executar. Ele lê este chat (sem as mensagens revertidas), o README, o AGENTS.md e o manifesto do projeto, os arquivos alterados e os arquivos cujos nomes combinam com as suas palavras, e mantém o seu idioma. Ele nunca inventa nomes de arquivo. O novo texto substitui o seu rascunho, mas não é enviado: leia, edite e depois pressione `Enter`. `Cmd/Ctrl+Z` traz seu texto de volta em um passo, e o botão (**Desfazer melhoria**) também. Se você digitar enquanto ele trabalha, o seu novo texto fica. `Esc` ou um segundo clique cancela. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Não funciona em comandos de barra nem em uma mensagem com um chip de arquivo. No Tether, a varinha fica ao lado do campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura de tela: Melhorar prompt"></a> |
64
64
  | **Verificação da meta** | <a id="feature-goalcheck"></a>Comece uma meta com `/goal`. Quando o agente marca a meta como concluída em uma rodada automática, a meta só é fechada depois de duas verificações. Primeiro, o comando de teste do projeto é executado na pasta do chat, no modo sandbox do chat. O comando é o seu próprio ou o encontrado em `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quando o passo mais recente do próprio agente foi uma execução bem-sucedida desse teste, ele não é executado de novo. Depois, uma chamada independente ao modelo, sem ferramentas, lê a meta, este chat, o `git status` e o resultado do teste. Se uma verificação falhar, a meta continua ativa e o agente lê o motivo; depois, a próxima rodada continua. Uma linha abaixo da barra da meta (**Verificação da meta**) mostra o teste e o último resultado. **Editar** define o seu próprio comando de teste e um limite de tempo ou de tokens; acima do limite, a meta fica bloqueada. **Executar agora** executa a verificação sem fechar a meta. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Quando você mesmo conclui a meta, nada é verificado. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura de tela: Verificação da meta"></a> |
65
65
  | **Permitir neste chat** | <a id="feature-allowforchat"></a>Quando a Revisão automática pergunta, o cartão de aprovação ganha **Permitir neste chat**: a mesma ferramenta no mesmo chat passa a ser permitida daí em diante, com quaisquer argumentos, até o fim do limite de tempo (1 hora por padrão; escolha em **Configurações → Composer Plus → Permitir neste chat**). Depois, o agente pergunta de novo. Um chip no cabeçalho lista as autorizações com o horário de término e as revoga. As autorizações continuam valendo depois de reiniciar. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura de tela: Permitir neste chat"></a> |
66
66
  | **Status do projeto** | <a id="feature-projectstatus"></a>A linha de um projeto na barra lateral mostra o mesmo indicador de em execução / aguardando / concluído dos chats dele, então um projeto recolhido ainda avisa que um chat dentro dele está trabalhando ou precisa de você. Primeiro aparece um chat que está esperando você, depois um chat concluído que você ainda não abriu (o ponto verde, mesmo enquanto outro chat ainda está em execução) e depois o indicador de em execução. Passe o mouse sobre ele para ver os detalhes. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
67
- | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado mostra o ID curto do commit entre parênteses). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
67
+ | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado mostra o ID curto do commit entre parênteses). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
68
68
  | **Marcar tudo como lido** | <a id="feature-markprojectread"></a>Na barra lateral, clique no botão **…** de um projeto → **Marcar tudo como lido**. Todos os chats desse projeto perdem o ponto verde de não lido de uma vez; os outros projetos mantêm os deles. O item fica cinza (**Nenhum chat não lido**) quando o projeto não tem nenhum. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura de tela: Marcar tudo como lido"></a> |
69
69
  | **Projetos ativos primeiro** | <a id="feature-activeprojectsfirst"></a>Quando um chat começa a ser executado ou precisa de você, o projeto dele vai para o topo da barra lateral com a própria animação de linha do dsh (o mesmo movimento de arrastá-lo até lá). Projetos concluídos ficam onde estão; arraste-os para qualquer lugar, como de costume. As movimentações são salvas na ordem de projetos do dsh, então desativar este recurso mantém a ordem atual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Projetos ativos primeiro"></a> |
70
70
  | **Filtro de projetos recentes** | <a id="feature-recentprojects"></a>Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Enquanto essa opção está selecionada, a barra lateral mostra só os projetos com um chat ativo nas últimas 2 horas: um chat atualizado nesse período, um chat em execução ou aguardando, o chat aberto, ou um chat concluído que você ainda não abriu (o ponto verde de “concluído” do dsh), mesmo depois das 2 horas. Projetos sem um chat assim ficam ocultos, inclusive os novos e vazios. Selecione a opção de novo para mostrar todos os projetos. A escolha fica salva neste dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura de tela: Filtro de projetos recentes"></a> |
@@ -169,7 +169,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
169
169
  - **Nenhuma etiqueta de branch em uma linha de chat:** o chat não teve nenhum turno desde que você instalou esta versão, a pasta dele não é um repositório git, ou **Branch do Git nas linhas de chat** está desativado. Depois de uma atualização, reinicie o dsh (a parte Host registra o branch).
170
170
  - **Verificação da meta diz que o teste saiu com o código 127 ou "not found":** o dsh iniciado pelo Finder ou pelo Dock pode ter um PATH mais curto que o do seu terminal, então ele não encontra `npm`, `pnpm` ou `cargo`. Inicie o dsh a partir de um terminal ou defina o seu próprio comando de teste com o caminho completo em **Verificação da meta** → **Editar**. **Executar agora** mostra o resultado na hora.
171
171
  - **A meta não fecha e o agente continua trabalhando:** **Verificação da meta** encontrou um teste com falha ou trabalho faltando; a linha abaixo da meta mostra o motivo (passe o mouse sobre o resultado para ver os detalhes). Corrija a causa ou o comando de teste, ou conclua a meta você mesmo com `/goal` ou com a barra da meta (isso não é verificado).
172
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.14.0`); veja a nota de instalação acima.
172
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.15.0`); veja a nota de instalação acima.
173
173
 
174
174
  ## Limites
175
175
 
@@ -195,7 +195,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
195
195
  - **Este chat** conta só os arquivos que as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`) gravaram. Arquivos que um comando (`bash`) alterou não estão nesta visão; eles aparecem em **Não confirmadas**. Sem um snapshot de Reverter turno do chat (Reverter turno desativado, dsh-rewind-plugin instalado ou um chat mais antigo que o plugin), a visão compara com o último commit e avisa isso. Reverter turno guarda os 50 snapshots mais recentes de um chat: num chat mais longo, a visão compara com o mais antigo guardado, informa a partir de qual mensagem e não conta as alterações anteriores. **Ocultar alterações de espaço em branco** é `git diff -w`: uma linha que mudou só nos espaços dentro dela também fica oculta.
196
196
  - **Abrir issue no GitHub** precisa do GitHub CLI (`gh`) no PATH do dsh e de um remoto do GitHub na pasta do chat. Ele roda no máximo 60 s; se o `gh` demorar mais, a issue pode existir no GitHub sem o link dela na lista (antes de clicar de novo, olhe no GitHub: a lista só lê o link de uma execução concluída, então um novo clique pode abrir uma segunda issue). Uma pasta com mais de um remoto do GitHub usa o padrão do próprio `gh` (`gh repo set-default`).
197
197
  - **Chats que alteraram este arquivo** só conhece as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: uma alteração feita por um comando (`bash`) não aparece na lista. Ele lê os 300 chats mais recentes do repositório (pela data de criação) e avisa quando há mais; mostra no máximo 100 linhas. Um arquivo renomeado aparece com o nome que a ferramenta escreveu. Um chat cuja pasta fica fora do repositório (também por outro caminho para os mesmos arquivos) não é contado. A primeira abertura depois de iniciar o dsh lê todos os registros de chat do repositório (cerca de 4 s para 275 chats); as aberturas seguintes leem só os chats que mudaram desde então.
198
- - **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece.
198
+ - **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra.
199
199
  - **Buscar no chat** busca só no que a página mostra: as mensagens e respostas carregadas (role para cima ou clique em **Carregar anteriores** para ver as mais antigas), não as etapas de ferramenta fechadas nem o texto recolhido dentro da saída de uma ferramenta. Ele conta no máximo 2.000 ocorrências (depois, "2000+"). Ele usa a API de destaque do navegador (Chromium 105 ou mais recente; o app para desktop tem): em um navegador mais antigo, a contagem e os saltos funcionam sem a cor. `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) só o abre enquanto há um chat na tela; em outros lugares, a busca do próprio navegador funciona como antes. No Mac, `Ctrl+F` mantém seu uso do macOS nos campos de texto (o cursor avança um caractere).
200
200
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
201
201
  - Os projetos ativos são movidos com a ordem de projetos salva do dsh, então a nova ordem continua depois de reiniciar. Chats fora de qualquer projeto ("Sem grupo") não podem ser movidos; o dsh sempre os lista por último.
@@ -271,7 +271,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
271
271
 
272
272
  **Como faço Nova sessão abrir sempre no mesmo projeto?** Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em** → escolha o projeto. O `+` ao lado de outro projeto continua abrindo esse projeto.
273
273
 
274
- **Como trabalho em vários recursos de um projeto ao mesmo tempo, cada um no seu próprio branch?** Com **Um branch por chat**: novo chat → o botão ⑂ main → **Novo branch**, depois envie a primeira mensagem. Cada chat ganha o próprio branch e a própria pasta de worktree, com o seu `.env` e o seu `node_modules` quando o `.worktreeinclude` os lista. O cabeçalho do chat mostra em qual branch você está.
274
+ **Como trabalho em vários recursos de um projeto ao mesmo tempo, cada um no seu próprio branch?** Com **Um branch por chat**: novo chat → o botão main com o ícone de branch → **Novo branch**, depois envie a primeira mensagem. Cada chat ganha o próprio branch e a própria pasta de worktree, com o seu `.env` e o seu `node_modules` quando o `.worktreeinclude` os lista. O cabeçalho do chat mostra em qual branch você está.
275
275
 
276
276
  **Posso enviar uma foto do meu iPhone?** Sim. Em um chat do Tether, toque em **+** ao lado do campo de mensagem → Camera, Photos (até 4) ou Paste image. As fotos vão para o chat no Mac como anexos da sua mensagem, então o modelo as vê.
277
277
 
package/README.ru.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Затем перезапустите dsh. (CLI не может устанавливать плагины в профиль настольного приложения: им управляет само приложение.)
31
31
 
32
- > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.14.0`.
32
+ > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.15.0`.
33
33
 
34
34
  ## Функции
35
35
 
@@ -57,14 +57,14 @@ dsh plugin --profile web add dsh-composer-plus
57
57
  | **Поиск проекта в новом чате** | <a id="feature-projectpicker"></a>Новый чат → кнопка проекта над полем ввода. Проекты показаны в порядке A–Z, а сверху есть поле **Поиск проектов**. Введите часть названия (регистр и диакритические знаки не важны) и нажмите `Enter`, чтобы выбрать первое совпадение. Если ничего не подходит, появляется **Нет подходящих проектов**. Сохранённый порядок проектов dsh на боковой панели не меняется. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Снимок экрана: Поиск проекта в новом чате"></a> |
58
58
  | **Рабочая область по умолчанию для нового сеанса** | <a id="feature-defaultworkspace"></a>Настройки → Composer Plus → **Рабочая область по умолчанию для нового сеанса** → **Открывать «Новый сеанс» в**: выберите проект или **Общая папка (default-workspace)** (по умолчанию: собственная папка dsh `Documents/deepseek-harness/default-workspace`, которая создаётся при первом использовании). После этого **Новый сеанс** вверху боковой панели (и его сочетание клавиш) всегда открывает новый чат там, даже когда открыт чат другого проекта. Кнопка `+` рядом с проектом по-прежнему открывает этот проект, а кнопка проекта над полем ввода нового чата по-прежнему меняет проект. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Снимок экрана: Рабочая область по умолчанию для нового сеанса"></a> |
59
59
  | **Поиск в чате** | <a id="feature-findinchat"></a>Нажмите `Cmd+F` на Mac (`Ctrl+F` в Windows и Linux) в чате: над ним откроется поле поиска. Введите слово: все совпадения в сообщениях и ответах на экране выделяются, текущее — более ярким цветом, а поле показывает n / всего. `Enter` или `↓` переходит к следующему совпадению, а `Shift+Enter` или `↑` — к предыдущему (также кнопки со стрелками); чат прокручивает совпадение к середине. Регистр, диакритические знаки и турецкая ı без точки не важны. `Esc` закрывает поле и возвращает курсор туда, где он был. Поиск следует за чатом, пока приходит ответ. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Снимок экрана: Поиск в чате"></a> |
60
- | **Ветка для каждого чата** | <a id="feature-worktreechats"></a>Новый чат → кнопка ⑂ main рядом с кнопкой проекта → **Новая ветка**, затем введите первое сообщение и отправьте его. ИИ называет ветку (`feat/…`, `fix/…`) по этому сообщению, Composer Plus создаёт для неё git worktree в `<project>/.worktrees/`, копирует игнорируемые файлы из списка `.worktreeinclude` (например, `.env` и `node_modules/`) и открывает там новый чат с вашим сообщением. Заголовок открытого чата показывает ⑂ ветка · изменений: N · ↑ ↓ (или **не отправлена**); нажмите на него, чтобы открыть **Изменения**. В том же меню есть список открытых worktree: выберите один, чтобы начать в нём чат. Чтобы видеть папки веток внутри их проекта на боковой панели, выберите в dsh **Параметры просмотра** → **Дерево рабочих областей**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Снимок экрана: Ветка для каждого чата"></a> |
60
+ | **Ветка для каждого чата** | <a id="feature-worktreechats"></a>Новый чат → кнопка main (значок ветки) между кнопкой проекта и кнопкой режима → **Новая ветка**, затем введите первое сообщение и отправьте его. К первому сообщению можно приложить изображения и файлы. ИИ называет ветку (`feat/…`, `fix/…`) по этому сообщению, Composer Plus создаёт для неё git worktree в `<project>/.worktrees/`, копирует игнорируемые файлы из списка `.worktreeinclude` (например, `.env` и `node_modules/`) и открывает там новый чат с вашим сообщением. Заголовок открытого чата показывает ⑂ ветка · изменений: N · ↑ ↓ (или **не отправлена**); нажмите на него, чтобы открыть **Изменения**. В том же меню есть список открытых worktree: выберите один, чтобы начать в нём чат. Чтобы видеть папки веток внутри их проекта на боковой панели, выберите в dsh **Параметры просмотра** → **Дерево рабочих областей**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Снимок экрана: Ветка для каждого чата"></a> |
61
61
  | **Предсказание следующего сообщения** | <a id="feature-nextprediction"></a>По умолчанию включено: выключить функцию можно в **Настройки → Composer Plus**. Когда агент завершает ход (не остановленный и не завершившийся сбоем), пустое поле ввода серым текстом показывает предположение о вашем следующем сообщении и подсказку **Tab — принять**. `Tab` вставляет текст в поле ввода, но не отправляет его. `Esc` скрывает предположение до конца этого хода. Ввод текста тоже скрывает его, а новый ход заменяет его новым. Меню **Модель** под переключателем показывает собственные модели dsh (тот же список, что и в меню моделей dsh). По умолчанию выбран пункт **По умолчанию в dsh**: он следует модели dsh по умолчанию. Каждый завершённый ход стоит один короткий вызов модели. В Tether предположение появляется над пустым полем ввода: коснитесь его, чтобы вставить текст в поле. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Снимок экрана: Предсказание следующего сообщения"></a> |
62
62
  | **Дополнение при вводе** | <a id="feature-typingcompletion"></a>По умолчанию выключено: включить функцию можно в **Настройки → Composer Plus**. Пока вы печатаете, серый текст сразу после курсора показывает, как может продолжиться ваше сообщение. `Tab` добавляет его в сообщение, но не отправляет. `Esc` скрывает его. Функция предлагает только ваши собственные следующие слова: никогда не ответ вам и без выдуманных текстов ошибок или имён. Если сообщение выглядит законченным или модель не уверена, ничего не появляется. Если вы набираете следующие буквы серого текста, он остаётся, без нового вызова модели. Под её переключателем есть своё меню **Модель**. Первый пункт, **Как у предсказания следующего сообщения**, использует модель **Предсказание следующего сообщения** (выбран по умолчанию). Выберите другую модель, чтобы у каждой функции была своя, например более быстрая модель для дополнений. Она делает один вызов модели при каждой паузе в наборе, поэтому расходует намного больше токенов, чем предсказание: выберите быструю и недорогую модель. Она не работает для слеш-команды, для сообщения со значком файла и когда курсор стоит не в конце. В Tether остаток текста появляется над полем, пока вы печатаете: коснитесь его, чтобы добавить. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Снимок экрана: Дополнение при вводе"></a> |
63
63
  | **Улучшить промпт** | <a id="feature-promptimprove"></a>Напишите черновой запрос, затем нажмите волшебную палочку (**Улучшить промпт**) рядом с меню моделей. Один вызов модели переписывает его в более понятный промпт: сначала цель, короткие пронумерованные шаги, если частей несколько, и проверка, которую нужно запустить. Функция читает этот чат (без сообщений, убранных откатом), README, AGENTS.md и манифест проекта, изменённые файлы и файлы, имена которых совпадают с вашими словами, и сохраняет ваш язык. Она никогда не выдумывает имена файлов. Новый текст заменяет ваш черновик, но не отправляется: прочитайте его, отредактируйте, затем нажмите `Enter`. `Cmd/Ctrl+Z` возвращает ваш текст за один шаг, как и кнопка (**Отменить улучшение**). Если вы печатаете, пока она работает, ваш новый текст остаётся. `Esc` или повторное нажатие отменяет. У неё есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Не работает для слеш-команд и для сообщения со значком файла. В Tether палочка находится рядом с полем. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Снимок экрана: Улучшить промпт"></a> |
64
64
  | **Проверка цели** | <a id="feature-goalcheck"></a>Начните цель командой `/goal`. Когда агент в автоматическом раунде отмечает цель как выполненную, цель закрывается только после двух проверок. Сначала тестовая команда проекта запускается в папке чата, в режиме песочницы этого чата. Это ваша собственная команда или команда, найденная в `package.json`, `Makefile`, `Cargo.toml`, `go.mod` или pytest. Если последним шагом самого агента был успешный запуск этого теста, повторно он не запускается. Затем независимый вызов модели без инструментов читает цель, этот чат, `git status` и результат теста. Если проверка не пройдена, цель остаётся активной, агент читает причину, и начинается следующий раунд. Строка под панелью цели (**Проверка цели**) показывает тест и последний результат. **Изменить** задаёт вашу собственную тестовую команду и лимит времени или токенов; при превышении лимита цель становится заблокированной. **Запустить сейчас** запускает проверку, не закрывая цель. У функции есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Когда вы сами завершаете цель, ничего не проверяется. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Снимок экрана: Проверка цели"></a> |
65
65
  | **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами, пока не истечёт лимит времени (по умолчанию 1 час; выберите его в **Настройки → Composer Plus → Разрешить для этого чата**). Затем агент снова спрашивает. Значок в заголовке показывает список разрешений со временем их окончания и позволяет их отозвать. Разрешения сохраняются после перезапуска. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Снимок экрана: Разрешить для этого чата"></a> |
66
66
  | **Статус проекта** | <a id="feature-projectstatus"></a>Строка проекта на боковой панели показывает ту же метку, что и его чаты: индикатор выполнения, ожидание или «готово». Поэтому даже свёрнутый проект сообщает, что чат внутри работает или ждёт вас. Сначала показывается чат, который ждёт вас, затем завершённый чат, который вы ещё не открыли (зелёная точка, даже пока другой чат ещё выполняется), затем индикатор выполнения. Наведите на метку указатель, чтобы увидеть подробности. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Статус проекта"></a> |
67
- | **Ветка Git в строках чатов** | <a id="feature-sessionbranch"></a>Каждая строка чата на боковой панели показывает маленькую серую метку с веткой git, на которой была папка проекта чата в его последнем ходе (например, `main` или `feature/login`; при отсоединённом HEAD в скобках показывается короткий ID коммита). Два чата одного проекта на разных ветках больше не выглядят одинаково, и вы сразу видите, если собираетесь продолжить чат не на той ветке. Наведите указатель на метку, чтобы увидеть полное имя. Host-часть читает ветку (`git branch --show-current`, только чтение), когда ход начинается и когда заканчивается; у чата без хода с момента установки этой функции или у папки, которая не является репозиторием git, метки нет. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Снимок экрана: Ветка Git в строках чатов"></a> |
67
+ | **Ветка Git в строках чатов** | <a id="feature-sessionbranch"></a>Каждая строка чата на боковой панели показывает маленькую серую метку с веткой git, на которой была папка проекта чата в его последнем ходе (например, `main` или `feature/login`; при отсоединённом HEAD в скобках показывается короткий ID коммита). Два чата одного проекта на разных ветках больше не выглядят одинаково, и вы сразу видите, если собираетесь продолжить чат не на той ветке. Наведите указатель на метку, чтобы увидеть полное имя. Host-часть читает ветку (`git branch --show-current`, только чтение), когда ход начинается и когда заканчивается; у чата без хода с момента установки этой функции или у папки, которая не является репозиторием git, метки нет. Если строка проекта над чатом называется так же, как ветка (например, папка «Ветка для каждого чата»), строка чата не показывает метку, но в режиме «Одним списком» метка по-прежнему видна. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Снимок экрана: Ветка Git в строках чатов"></a> |
68
68
  | **Отметить все как прочитанные** | <a id="feature-markprojectread"></a>На боковой панели нажмите кнопку **…** проекта → **Отметить все как прочитанные**. У всех чатов этого проекта сразу пропадает зелёная точка непрочитанного. У других проектов точки остаются. Если в проекте нет непрочитанных чатов, пункт показан серым (**Нет непрочитанных чатов**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Снимок экрана: Отметить все как прочитанные"></a> |
69
69
  | **Активные проекты сверху** | <a id="feature-activeprojectsfirst"></a>Когда чат начинает работать или ждёт вас, его проект перемещается в начало боковой панели со встроенной анимацией строк dsh (так же, как при перетаскивании). Завершённые проекты остаются на месте; их можно перетаскивать как обычно. Перемещения сохраняются в порядке проектов dsh, поэтому при отключении функции текущий порядок остаётся. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Активные проекты сверху"></a> |
70
70
  | **Фильтр недавних проектов** | <a id="feature-recentprojects"></a>Боковая панель → параметры просмотра (значок с ползунками) → **Активные за последние 2 часа**. Пока этот пункт выбран, боковая панель показывает только проекты с чатом, активным за последние 2 часа. Это чат, обновлённый за это время, выполняющийся или ожидающий чат, открытый чат или завершённый чат, который вы ещё не открыли (зелёная точка dsh «готово»), — такой чат оставляет проект на виду и после 2 часов. Проекты без такого чата скрыты, в том числе новые и пустые. Выберите пункт ещё раз, чтобы показать все проекты. Выбор сохраняется на этом устройстве. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Снимок экрана: Фильтр недавних проектов"></a> |
@@ -169,7 +169,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
169
169
  - **На строке чата нет метки ветки:** у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
170
170
  - **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
171
171
  - **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
172
- - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.14.0`), см. примечание об установке выше.
172
+ - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.15.0`), см. примечание об установке выше.
173
173
 
174
174
  ## Ограничения
175
175
 
@@ -195,7 +195,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
195
195
  - **Этот чат** учитывает только файлы, которые записали файловые инструменты dsh (`write`, `edit`, `str_replace_editor`). Файлов, которые изменила команда (`bash`), в этом представлении нет; они показаны в разделе **Незафиксированные**. Без снимка отката хода для чата (откат хода выключен, установлен dsh-rewind-plugin или чат старше плагина) представление сравнивает с последним коммитом и сообщает об этом. Откат хода хранит 50 последних снимков чата: в более длинном чате представление сравнивает с самым старым сохранённым снимком, сообщает, с какого сообщения, и не учитывает более ранние изменения. **Скрыть изменения пробелов** — это `git diff -w`: строка, в которой изменились только пробелы внутри неё, тоже скрывается.
196
196
  - **Открыть issue на GitHub** требует GitHub CLI (`gh`) в PATH dsh и удалённый репозиторий GitHub в папке чата. Команда работает не дольше 60 с; если `gh` работает дольше, issue может уже существовать на GitHub без ссылки в списке (прежде чем нажать ещё раз, проверьте GitHub: список читает ссылку только из завершённого запуска, поэтому новое нажатие может открыть вторую issue). Папка с несколькими удалёнными репозиториями GitHub использует значение по умолчанию самого `gh` (`gh repo set-default`).
197
197
  - **Чаты, которые изменили этот файл**, как и **Этот чат**, знают только файловые инструменты dsh (`write`, `edit`, `str_replace_editor`): изменение, сделанное командой (`bash`), в списке не появляется. Список читает 300 самых новых чатов репозитория (по времени создания) и сообщает, если их больше; он показывает не более 100 строк. Переименованный файл показан под тем именем, которое записал инструмент. Чат, папка которого находится вне репозитория (в том числе через другой путь к тем же файлам), не учитывается. Первое открытие после запуска dsh читает все журналы чатов репозитория (около 4 с для 275 чатов); последующие открытия читают только чаты, изменившиеся с тех пор.
198
- - **Ветка Git в строках чатов** показывает ветку папки чата на момент начала или конца его последнего хода, а не текущую ветку: переключение ветки вне хода появится после следующего хода. У чатов, созданных до этой версии, метки нет до их следующего хода. Метка встроена в разметку строк чатов dsh (в dsh нет для неё отдельного места); если обновление dsh изменит эту разметку, метка не появится.
198
+ - **Ветка Git в строках чатов** показывает ветку папки чата на момент начала или конца его последнего хода, а не текущую ветку: переключение ветки вне хода появится после следующего хода. У чатов, созданных до этой версии, метки нет до их следующего хода. Метка встроена в разметку строк чатов dsh (в dsh нет для неё отдельного места); если обновление dsh изменит эту разметку, метка не появится. Если строка проекта над чатом называется так же, как ветка (например, папка «Ветка для каждого чата»), строка чата не показывает метку, но в режиме «Одним списком» метка по-прежнему видна.
199
199
  - **Поиск в чате** ищет только в том, что показывает страница: в загруженных сообщениях и ответах (для более старых прокрутите вверх или нажмите **Загрузить более ранние**), но не в закрытых шагах инструментов и не в свёрнутом тексте вывода инструмента. Он считает не более 2 000 совпадений (дальше — «2000+»). Он использует API подсветки браузера (Chromium 105 и новее; в настольном приложении он есть): в более старом браузере счётчик и переходы работают без цвета. `Cmd+F` на Mac (`Ctrl+F` в Windows и Linux) открывает его, только пока на экране есть чат; в других местах встроенный поиск браузера работает как раньше. На Mac `Ctrl+F` сохраняет своё действие macOS в текстовых полях (курсор сдвигается на один символ вперёд).
200
200
  - Уведомление, отправленное до перезапуска, при щелчке только выводит dsh на передний план.
201
201
  - Активные проекты перемещаются через сохранённый порядок проектов dsh, поэтому новый порядок сохраняется после перезапуска. Чаты вне проектов («Без группы») перемещать нельзя; dsh всегда показывает их последними.
@@ -271,7 +271,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
271
271
 
272
272
  **Как сделать, чтобы Новый сеанс всегда открывался в одном проекте?** Настройки → Composer Plus → **Рабочая область по умолчанию для нового сеанса** → **Открывать «Новый сеанс» в** → выберите проект. «`+`» рядом с другим проектом по-прежнему открывает этот проект.
273
273
 
274
- **Как работать над несколькими функциями одного проекта одновременно, каждой в своей ветке?** С функцией **Ветка для каждого чата**: новый чат → кнопка ⑂ main → **Новая ветка**, затем отправьте первое сообщение. Каждый чат получает свою ветку и папку worktree, а также ваши `.env` и `node_modules`, если они перечислены в `.worktreeinclude`. Заголовок чата показывает, в какой ветке вы находитесь.
274
+ **Как работать над несколькими функциями одного проекта одновременно, каждой в своей ветке?** С функцией **Ветка для каждого чата**: новый чат → кнопка main со значком ветки → **Новая ветка**, затем отправьте первое сообщение. Каждый чат получает свою ветку и папку worktree, а также ваши `.env` и `node_modules`, если они перечислены в `.worktreeinclude`. Заголовок чата показывает, в какой ветке вы находитесь.
275
275
 
276
276
  **Можно ли отправить фото с iPhone?** Да. В чате Tether коснитесь **+** рядом с полем сообщения → Camera, Photos (до 4) или Paste image. Фотографии попадают в чат на Mac как вложения вашего сообщения, поэтому модель их видит.
277
277