rdsh 0.5.2

Rust port/shim for dsh: fast launcher, token saver, zero behavior breakage via passthrough
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
<img src="assets/icon.png" width="96" alt="rdsh icon">

[English](README.md) · [简体中文](README.zh-CN.md)

# rdsh — `dsh` を速く・安全に起動する Rust 製ランチャー

[![ci](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/ci.yml/badge.svg)](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/ci.yml)
[![dashboard](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/dashboard.yml/badge.svg)](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/dashboard.yml)
[![docs](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/docs.yml/badge.svg)](https://github.com/jimoto-no-llm/rustdsh/actions/workflows/docs.yml)
[![codecov](https://codecov.io/gh/jimoto-no-llm/rustdsh/graph/badge.svg)](https://codecov.io/gh/jimoto-no-llm/rustdsh)
[![release](https://img.shields.io/github/v/release/jimoto-no-llm/rustdsh.svg)](https://github.com/jimoto-no-llm/rustdsh/releases)
[![crates.io](https://img.shields.io/crates/v/rdsh.svg)](https://crates.io/crates/rdsh)
[![license](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![rust](https://img.shields.io/badge/rust-1.85%2B-orange.svg)](https://www.rust-lang.org/)

[English](README.md)

独立したコミュニティプロジェクトです。DeepSeek や DeepSeek Harness の公式ではありません。

`rdsh` は、[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) を高速かつ安全に利用するための Rust 製ランチャーです。
日常的によく使う処理(トークン計算、検索、セッション管理など)をネイティブ化し、エージェントの会話やモデル実行は本家の `dsh` へそのまま透過的に委譲します。今お使いの引数やオプションはそのまま動きます。

## rdsh を選ぶ理由

- ⚡ **超高速・省メモリ起動**: 起動時間は約0.9ms、メモリ消費は約2.9MB。Node.js を立ち上げる本家 `dsh`(約88ms / 約66MB)と比較して圧倒的に軽量です。
- 🔄 **完全な互換性(Drop-in Replacement)**: `rdsh` 独自のサブコマンド以外は本家 `dsh` にそのまま渡すため、既存のスクリプトや使い慣れたオプションがそのまま動作します。
- 🛠 **便利な高速ネイティブコマンド**: トークン見積り、並列コード検索、セッション一覧・圧縮、環境診断(`doctor`)などを Node.js なしで瞬時に実行できます。
- 🛡 **安全設計**: 読み取り系コマンドは元ファイルを一切書き換えず、認証情報の無断外部送信も行いません。Linux 環境では、エージェントツールを明示的に共有したファイルだけに限定できます。

## 目次

- [クイックスタート](#クイックスタート)
- [動作環境](#動作環境)
- [インストール](#インストール)
- [使い方](#使い方)
  - [`dsh` 互換での実行](#dsh-互換での実行)
  - [高速ネイティブコマンド](#高速ネイティブコマンド)
  - [選択した認証情報だけを共有する](#選択した認証情報だけを共有するrdsh-auth)
  - [エージェント実行の安全な隔離](#エージェント実行の安全な隔離)
  - [フック監視](#フック監視-rdsh-guard)
  - [コンテキスト注入](#コンテキスト注入rdsh-context)
  - [依存グラフと変更影響](#依存グラフと変更影響rdsh-deps)
- [低スペック環境向け](#低スペック環境向け)
- [Web UI とダッシュボード](#web-ui-とダッシュボード)
- [Smart-DSH との併用](#smart-dsh-との併用)
- [実測ベンチマーク](#実測ベンチマーク)
- [安全設計](#安全設計)
- [よくある質問](#よくある質問)
- [資料](#資料)
- [コミュニティ](#コミュニティ)
- [謝辞](#謝辞)
- [ライセンス](#ライセンス)

## クイックスタート

**Claude Code/Codex/Cursor/VS Code Copilot/OpenCode/Gemini CLI を利用中の方へ**:
今のエージェントを使いながら、
[MCP でダッシュボードを追加](docs/MCP-CLIENTS.md)できます。
タスク・質問・構造化 UI の共有には Node.js 22 以上が必要です。DSH 本体と Rust は任意です。

### 1. インストール(ビルド済みバイナリ)

**Linux / macOS / WSL**:

```sh
curl -fsSL https://github.com/jimoto-no-llm/rustdsh/releases/latest/download/install.sh | bash -s -- --from-release
```

**Windows (PowerShell)**:

```powershell
$f = Join-Path $env:TEMP 'rdsh-install.ps1'
Invoke-WebRequest -Uri https://github.com/jimoto-no-llm/rustdsh/releases/latest/download/install.ps1 -OutFile $f -UseBasicParsing
& $f -FromRelease
```

crates.io からもインストールできます(Rust 1.85 以上が必要です):

```sh
cargo install rdsh
```

`cargo install` はソースからビルドし、リリースアーカイブと同じバイナリをインストールします。

### 2. 環境確認 & 初期セットアップ

```sh
rdsh --version && rdsh doctor   # 導入と本家 dsh の確認
rdsh setup                      # 対話式セットアップ(または rdsh setup --web でブラウザから設定)
```

※ Codex CLI(ChatGPT OAuth)や opencode のログイン情報がある場合、`rdsh auth --import --provider openai-codex` で簡単に取り込めます。

### 3. 会話を開始する

```sh
rdsh tui                        # TUI プロファイルで起動
# または
rdsh --profile web              # Web プロファイルで起動
```

## 動作環境

| 項目 | 内容 |
| --- | --- |
| OS | Linux、macOS、WSL、Windows(ネイティブ) |
| DSH 本体 | エージェントとの会話実行に必要です(トークン計算や検索などの独立ツールは単体で動作します) |
| Rust | ビルド済みバイナリを利用する場合は不要。ソースからビルドする場合のみ 1.85 以上 |
| 任意 | [Node.js ダッシュボード](dashboard/README.md) には Node.js 22 以上、`search-web` には SearXNG が必要 |

## インストール

### ソースからのビルドと高度なオプション

**Linux / macOS / WSL**:

```sh
git clone https://github.com/jimoto-no-llm/rustdsh.git
cd rustdsh
./install.sh                 # ビルドして ~/.local/bin/rdsh にインストール
./install.sh --as-dsh        # `dsh` コマンド名でも使えるように置き換え(元は dsh-orig に退避)
./install.sh --restore       # 置き換えを元に戻す
./install.sh --prefix=DIR    # インストール先を変更(既定: ~/.local/bin)
```

**Windows (PowerShell)**:

```powershell
git clone https://github.com/jimoto-no-llm/rustdsh.git
cd rustdsh
.\install.ps1              # ビルドして %LOCALAPPDATA%\rdsh\bin にインストール
.\install.ps1 -AsDsh       # `dsh` コマンド名でも使えるように置き換え
.\install.ps1 -Restore     # 置き換えを元に戻す
.\install.ps1 -Wsl         # WSL 側にも連動してインストール
```

| OS | スクリプト | 備考 |
| --- | --- | --- |
| Linux / macOS | `./install.sh` | cargo か curl が必要です(rustup がない場合は自動案内されます)。 |
| WSL | ディストロ内で `./install.sh` | WSL を自動検出します。Windows 側と併用する場合は `install.ps1 -Wsl` も利用可能です。 |
| Windows(ネイティブ) | `.\install.ps1` | Rust および MSVC ビルドツールが必要です(`winget install Rustlang.Rustup`)。 |

## 使い方

### `dsh` 互換での実行

普段使っている `dsh` と同じ引数でそのまま動きます:

```sh
rdsh tui                          # dsh --profile tui と同等
rdsh --profile web --patch x.yml  # 追加設定を重ねて起動
rdsh --dry-run tui -- --resume id # 実行コマンドの内容だけを確認
```

`./install.sh --as-dsh` で導入した場合は、`dsh` コマンドを実行するだけで自動的に `rdsh` の高速起動が適用されます。

### 高速ネイティブコマンド

Node.js を起動せず、Rust ネイティブで高速に処理します:

```sh
rdsh tokens ./README.md             # トークン数の即時見積り(英語:約4文字=1tok、日本語:1文字=1tok)
echo "..." | rdsh prune --max-tokens 4000 # トークン上限に合わせて前後を残して切り詰め
rdsh search TODO --dir . --max 100  # 高速並列テキスト検索
rdsh sessions --limit 20 --tokens   # 過去セッション一覧と展開トークン見積り
rdsh compact ./s.jsonl              # セッション JSONL を圧縮(元ファイルは不変)
rdsh doctor                         # 本家 dsh、環境変数、パスなどの健全性診断
rdsh profiles / rdsh skills         # 利用可能なプロファイル・スキル一覧
rdsh desktop status                 # DeepSeek Harness Desktop アプリとプロファイルの検出
rdsh bench --n 5                    # rdsh と本家 dsh の起動速度比較
```

Windows では親junctionを安全に拒否する読込みを用意できるまで圧縮履歴を開きません。
そのため `sessions --tokens` の合計には一部の履歴が含まれず、正確な値ではありません。

### 選択した認証情報だけを共有する(rdsh auth)

Codex / OpenCode / 環境変数の認証情報を、秘密値なしで一覧にします。
共有元とcredentialを選ぶまでコピーしません。取込先はDSH本来の
$DSH_HOME/.credentials.yamlです。選択は秘密値を含まない
$DSH_HOME/rdsh-auth-sharing.jsonに保存します。

```sh
rdsh auth                                      # 共有元・保存先・選択状態・解除手順
rdsh auth --json                               # 秘密値を含まない機械可読の一覧
rdsh --dry-run auth --select codex:openai-codex --import # previewのみ、ファイル変更なし
rdsh auth --select codex:openai-codex --import    # CodexのOAuthだけ共有
rdsh auth --select opencode:openai-codex --import # OpenCodeのopenaiログインだけ共有
rdsh auth --select codex:OPENAI_API_KEY --import  # CodexのAPIキーは別に選択
rdsh auth --select env:DEEPSEEK_API_KEY --import  # この環境変数だけ永続保存
rdsh auth --unselect codex:openai-codex          # 将来の取込停止、既存コピーは保持
rdsh setup                                    # 選択済みの同期と初回案内
rdsh setup --web                              # 共有元・選択コマンド・個別キー保存
```

--select / --unselectは必要なものだけ個別に繰り返せます。選択すると
boot・dump-config・plugin・dsh名での委譲・setupでも、その共有元から
同期します。--importはすぐに取り込みます。別CLIの未選択トークンが
新しくても採用しません。DSH側の新しいgrantや既存API-key記録・ref、
他のエントリ、コメント、改行形式は保持します。Unixの認証ファイルと
選択ファイルは0600で保存します。

対象はCodexの ~/.codex/auth.json、OpenCodeの
$XDG_DATA_HOME/opencode/auth.json(未設定時はOSのdataディレクトリ)と
旧 ~/.config/opencode/auth.jsonです。OpenCodeのopenaiログインはDSHの
openai-codexへ写すので、選択名はopencode:openai-codexです。
環境変数の保存対象はDEEPSEEK_API_KEY、OPENAI_API_KEY、ANTHROPIC_API_KEYです。
一覧は形式・存在の確認であり、実際の認証成功を意味しません。

すでに渡した環境変数は、DSHとその子プロセスに引き継がれます。
この経路ではrdshはファイルを書かず、JSONにpersistent=false、
共有先、停止・失効手順を表示します。保存するなら別途選択してください。
setup --yesだけでは全環境キーを保存しません。対話setupやWeb画面での
個別の保存は引き続き可能です。

**利用範囲と解除:** 保存した内容は同じDSH_HOMEの全プロファイルで
使えます。選択解除は将来のrdshによる取込を止め、保存済みコピーと
実行中プロセスは残します。コピーの利用を止めるにはDSHを停止して
認証ファイル内の該当record/refを削除します。credential自体の失効は
providerでOAuth grantを取り消すかAPIキーを更新してください。
共有元CLIも使えなくなる場合があります。rdshによるコピーの制御であり、
DSH自身の更新・環境変数の継承・OS sandboxを制御するものではありません。

**従来版からの移行:** 既存のDSH認証情報は残します。選択ファイルが
なければ何も選択せず、従来のauth --importも選択を要求します。
RDSH_AUTH_AUTOSYNC=1で全取込へ戻ることはありません。一覧とpreviewで
確認して必要な共有元を選んでください。RDSH_AUTH_AUTOSYNC=0では
選択を残して自動同期だけを止めます。明示したauth --importは実行できます。
壊れた・読めない選択ファイルでは同期を停止します。

選択変更とrdshの認証書込は共通lockで直列化し、解除完了後に古い選択で
取り込むことを防ぎます。writerの異常終了でlockが残った場合は、
rdsh auth/setupの書込が動いていないことを確認してから
$DSH_HOME/.rdsh-auth-sharing.lockを除去してください。lock中は
launcherが取込をスキップします。

setup --webは毎回アクセス鍵を発行し、#key=...付きURLを表示します。
読み取り・キー保存・終了に同じ鍵が必要です。URLを他人に共有しないでください。
画面では保存前に保存先・利用範囲と、選択解除・コピー削除・provider失効の
違いを確認できます。

一度だけ取り込む場合は `rdsh auth --import --provider openai-codex --source codex` または `rdsh auth --import --ref OPENAI_API_KEY --source codex` を使えます。この指定は継続コピーの選択に保存されず、既存の共有方針を変更しません。継続する場合は別途 `--select` で指定します。

### 追加機能(初期状態では OFF)

サーバー型の機能は有効化するまで動きません。初期状態は高速な dsh として動きます。
設定画面(`rdsh setup --web` の追加機能欄)か CLI で有効にします:

```sh
rdsh settings set extras.enable serve,search-web
rdsh settings get extras.enable
```

| 機能 | コマンド | 備考 |
| --- | --- | --- |
| `serve` | `rdsh serve`(既定 :38080) | 手元の状態ページです。localhost のみ、起動ごとの鍵が必要です。 |
| `search-web` | `rdsh search-web "調べたい語" --limit 5` | SearXNG が必要です。 |

`rdsh serve` は dsh の Web GUI(:3080)と競合しません。`--port 0` で空きポートを使えます。
API とダッシュボードの詳しくは [Web UI](#web-ui) を見てください。

dsh が同梱していない OpenAI 互換エンドポイント(HAI、Sarashina、自宅の llama.cpp / vLLM / LM Studio / Ollama など)は、プロファイルのルートとして追加できます:

```sh
rdsh provider add hai --model deepseek-v4-flash              # 鍵は HAI_API_KEY か --key-stdin
rdsh provider add sarashina                                  # 鍵は SARASHINA_API_KEY。mini と nano は組み込み
rdsh provider add local-openai --base-url http://host:8080/v1 --discover --no-key
rdsh provider list                                           # プリセットと各プロファイルの設定・鍵の状態
```

詳細は [docs/PROVIDERS.md](docs/PROVIDERS.md)(英語)を参照してください。

### モデル一覧の同期 (`rdsh models`)

DeepSeek Harness は「このプロバイダはどのモデルを扱えるか」を、依存パッケージ
`@earendil-works/pi-ai` に同梱されたカタログから答えます。このカタログはパッケージの
公開時に生成されるため、それ以降にプロバイダが変えた内容はモデル選択に出てきません
(例: Codex の `gpt-6.1-sol` が丸ごと欠落、Kimi Code の `kimi-for-coding` が
"K2.8 Preview" に昇格済みなのに古い表示名のまま)。プロファイルが `models:` を
明示していれば、その一覧が同梱カタログを置き換えるため、なおさらです。
`rdsh models` はプロバイダ自身のカタログ(ローカルの Codex CLI、または Kimi Code の
`/v1/models` をプロファイルのAPIキーで取得)を読んでプロファイルへ反映します:

```sh
rdsh models                              # 読み取り専用:不足IDと古い表示名を表示
rdsh models --provider kimi-coding       # プロバイダを限定
rdsh models sync                         # 不足分を追記し、古い表示名を更新
rdsh models sync --profile web --dry-run # 書き込まずに確認
```

削除は行いません。既存エントリは他の行をそのまま保ち、プロバイダの現行名を既に含む
表示名は書き換えません。構造を認識できないプロファイルは書き換えずに拒否します。
反映は次回の設定リロードまたは再起動時です。

### エージェント実行の安全な隔離

委譲したエージェントツールは既定で通常のファイル読み書きができます。`--share-file` で隔離されるのは **`rdsh_inspect` だけ**です。Linux(bubblewrap と prlimit がある環境)では、このツールから見えるのは明示的に共有したファイルだけになります:

```sh
rdsh --share-file README.md --share-file src/main.rs --profile tui
```

`rdsh_inspect` から共有ファイルは読み取り専用で見え、ネットワークアクセスもありません。`rdsh features on agent_tool_sandbox` で常時有効化、`rdsh features off agent_tool_sandbox` で無効化、`RDSH_SECURITY=1` で強制できます。

`bash`・`read`・`write`・`run_code` などその他の DSH ツールは隔離されず、**upstream DSH の権限と承認**に従います。起動時に `[rdsh security] rdsh_inspect is isolated; other DSH tools use upstream permissions` と表示されます。

### フック監視 (`rdsh guard`)

DSH の `hooks.json` と連携し、危険なコマンド実行を瞬時に検知・遮断します:

```sh
echo "$input" | rdsh guard --deny "rm -rf /*" --deny "*token*"
```

対応するファイル操作を構造で判定する場合は、任意でpolicy fileを指定できます。
次の例は、既存のプロジェクトディレクトリ内の `Read` だけを分類上許可します。

```json
{
  "schema": 1,
  "rules": [
    { "id": "project-read", "tool": "Read", "access": "read", "roots": ["/absolute/project/path"] }
  ]
}
```

```sh
echo "$hook_json" | rdsh guard --policy-file ./hook-policy.json --json
```

構造判定が対応するのは `Read`・`Write`・`Edit` のファイルpath schemaです。
作業ディレクトリと対象pathを正規化し、toolとread/write範囲を既存rootに照合して、
秘密を含まない理由とともに `allow`・`deny`・`unknown` を返します。JSONの `allow` は分類結果だけで、
ホストのpermission/approvalを意味しません。そのため `decision` は出力せず、最終的な権限判断はホストに残します。
未知のtool、shell command、壊れた入力、未対応の引数はfail closedです。shell構文解析とnetwork先の判定は未対応です。
path判定後にファイルシステムが変わる競合もあり、このhookはOS sandboxではありません。実際の強制には実行sandboxを使ってください。

```json
{
  "hooks": {
    "PreToolUse": [
      { "matcher": "Bash", "hooks": [{ "type": "command", "command": "rdsh guard --deny \"rm -rf /*\"" }] }
    ]
  }
}
```

### コンテキスト注入(`rdsh context`)

`rdsh context inject` は、そのターンの文脈(goal・constraints・decisions・作業対象ファイル・
Git 状態・検索結果・管理された記憶)を組み立て、DSH の `UserPromptSubmit` フック契約で
出力します。コピペなしでモデルに届きます。

```sh
rdsh features on context_engine        # コンテキストエンジンはオプトイン
rdsh context hook install              # $DSH_HOME/hooks.json に追記(冪等)
rdsh context hook status --json
```

フックは fail-open で、プロンプトを止めず常に exit 0 です。無出力になるのは設定ファイルが読めない場合と
stdin を解釈できない場合だけで、壊れた索引や期限超過では依存グラフやコード検索だけを落として
goal・constraints・記憶は出し続けます。注入には専用の予算(`context.inject_budget`、既定1200トークン)と
期限(`context.inject_deadline_ms`、既定1200ms)があり、期限を過ぎたらコード検索を省略して
記憶・goal・constraints だけを出します。

記憶は会話ログの丸写しではなく、管理された項目です。

```sh
rdsh context remember "APIの互換性を必ず保つ" --kind constraint
rdsh context distill --session ~/.dsh/sessions/<project>/<session>/session.v4.jsonl.zstd --apply
rdsh context memory --json      # active と superseded を区別して表示
rdsh context forget mem_ab12cd34ef56
```

`distill` はユーザー発話だけを読み(zstd 圧縮セッションにも対応)、決定・制約・撤回を
決定的なマーカーで抽出します。重なる古い項目は推測ではなく `superseded_by` で無効化されます。
`rdsh context build --require-stable` は、スナップショットが安定していると証明できないとき
(組み立て中にファイルや git 状態が変わった、または git 状態を読めない)に exit 3 で終了し、
古い・不明なスナップショットを新しいものと誤認させません。

### 依存グラフと変更影響(`rdsh deps`)

```sh
rdsh deps build                    # $DSH_HOME/rdsh-index に増分索引を作る
rdsh deps query engine_score       # シンボルの定義元と参照元
rdsh deps impact src/context.rs    # 直接・推移的な依存元と影響するテスト
```

抽出は Rust・JavaScript/TypeScript・Python・Go に対応し、ファイルごとに import・定義・
静的な呼び出し箇所を記録します。size と mtime が同じファイルは再解析しないため、
繰り返し実行しても速いままです。これは静的近似です。動的 dispatch・間接呼び出し・マクロ・
生成コードは `unknown` として明示し、未解決件数として報告します(推測で埋めません)。
索引が無い場合は「情報が無い」であり「依存が無い」ではありません。

索引があるときは `rdsh context build` と `rdsh context inject` も、検索で当たったファイルの
依存近傍を取り込みます。抜粋が、実際に依存しているファイルと一緒に届きます。
Rust ネイティブ処理のため、呼び出しごとのオーバーヘッドは約1msと非常に軽量です。

## 低スペック環境向け

既定プロファイルは `RDSH_DEFAULT_PROFILE`、rdsh設定の `general.default_profile`、ローカルの `tui`、案内付きエラーの順です。保存する既定値は `rdsh settings set general.default_profile web` で設定できます。明示的な `--profile <name>` が最優先です。

古いx86-64 CPU、古いLinuxディストリビューション、Node.jsを入れていない環境でも使えることを目指しています。

- **Nodeの起動を高速化**:rdshがdshを起動するとき、`NODE_COMPILE_CACHE` に
  `~/.cache/rdsh-node-compile-cache` を設定し、起動をまたいでNodeにコンパイル結果を再利用させます
  (Node 22.1以上。古い版は無視します)。既存の `NODE_COMPILE_CACHE` は尊重します。
  `RDSH_NODE_COMPILE_CACHE=0`、`--passthrough`、`RDSH_PASSTHROUGH=1` で無効にできます。
- **幅広いCPUに対応**:ビルド済みx86-64バイナリはAVX/BMIを必要としません。静的musl版は古いglibcの環境でも使えます。
- **セッションのトークン見積り**:`sessions --tokens` は、サイズが記録されたzstdフレームならヘッダーから展開後サイズを読みます。
  多くのストリーミングフレームでは `zstd -dc` が必要です。結果は
  `~/.cache/rdsh/sessions-tokens.json` に保存し(`$XDG_CACHE_HOME` を優先)、
  `RDSH_TOKENS_CACHE=0` でキャッシュを無効化できます。サイズを読めない場合は `?` を付けます。
- **並列処理を制限**:検索・セッション走査のワーカーは最大8スレッドです。zstd CLIへのフォールバックは8〜32プロセスを並列で使います。
- **Nodeなしでも使えるネイティブコマンド**:`tokens`・`search`・`sessions` などは使えます。会話を委譲するには
  `@deepseek-ai/dsh` を導入するか、`DSH_ORIG_BIN`(または `RDSH_ORIG_BIN`)を指定してください。
- **低優先度の自動更新**:`sync-dsh.sh` はdshとrdshを更新し、リポジトリでレビュー済みの固定digest台帳に対して取得物を検証し、更新に失敗した場合は元に戻します。
  既定では固定digest台帳の `latest` が示す安定版を使います。`RDSH_SYNC_FROM_SOURCE=1` を指定すると、
  `nice -n 19` と(利用可能なら)`ionice -c3` の下で `main` からビルドします。
  systemdユニットも低優先度で実行します。`ExecStart` は各自のcheckoutに合わせてください。

<a id="web-ui"></a>

## Web UI とダッシュボード

### 内蔵 Web UI (`rdsh serve`)

手元で状態確認やトークン見積もりを行える軽量な Web 画面です(既定ポート `:38080`、本家の `:3080` と競合しません):

```sh
rdsh settings set extras.enable serve  # 機能を有効化
rdsh serve                             # 起動(ローカルホスト限定、一時トークンで保護)
```

### 表示言語

rdsh 自身が表示する CLI 診断と内蔵ローカル画面は、英語・簡体字中国語・日本語に対応します。1回だけ指定するには `--language`、保存するには `rdsh.json` を使います。既定の `auto` は最初の空でないロケール環境変数を使い、未設定・未対応なら英語になります。

```sh
rdsh --language ja settings show
rdsh settings set general.language zh-CN
```

優先順は `--language`、`RDSH_LANG`、`general.language`、`LC_ALL`、`LC_MESSAGES`、`LANG` です。明示した `general.language` が不正なら設定を書き換えずに停止します。委譲する `dsh` 引数、モデル出力、JSON フィールド、ファイル、プロトコル識別子は翻訳しません。

`worker-scope validate` と `worker-scope policy` のヘルプ・CLI診断も3言語に対応します。この純粋な処理とそのヘルプは無関係な壊れた設定に依存しません。通常のコマンドとルートのヘルプは設定エラーを報告します。正規JSON・ポリシーコード・渡されたパスは変えません。

### 拡張ダッシュボード (`rdsh-dashboard`)

プロジェクト全体の稼働状況、質問・回答の確認、モバイル端末からの接続などを行える拡張ダッシュボードです(要 Node.js 22+):

```sh
rdsh-dashboard project --project <ディレクトリ>
```

`project --include-project <ディレクトリ>` を追加すると、その起動時に明示したprojectだけの稼働・待ち・要確認件数を横断表示します。詳細は各project専用dashboardに残り、読取不能時は前回観測時刻と不明状態を表示します。

※ Windows ネイティブではタスクトレイに常駐し、タスクバーから簡単に開閉できます(端末起動したい場合は `--no-tray` を指定)。詳細は [dashboard/README.md](dashboard/README.md) をご覧ください。外部エージェント CLI(cursor-agent、devin)を監視付きジョブとして実行できます([docs/AGENT-RUNNERS.md](docs/AGENT-RUNNERS.md)、英語)。

## デスクトップアプリ (Electron)

DeepSeek Harness Desktop は、Web アプリケーション全体を内包した Electron シェルです。CLI と `$DSH_HOME` を共有しますが、**予約済みプロファイル**(`$DSH_HOME/profiles/desktop`)と同梱の独自コマンドランタイムを持つため、npm の `dsh` CLI ではプラグインを管理できません。`rdsh desktop` はこれらを自動検出し、プラグインの組み込みをアプリ自身のコマンドへ転送します。rdsh 側でプロファイルを起動したり直接書き換えたりすることはありません:

```sh
rdsh desktop status                 # アプリ、コマンドランタイム、プロファイル、プラグインの状態(読み取り専用)
rdsh desktop install --plugins-dir .   # rdsh-settings+標準サードパーティ(sound、gitview)を組み込み
rdsh desktop install --plugins-dir . --compute   # 常駐 compute bridge もあわせて追加
rdsh desktop install --plugins-dir . --no-sound --no-gitview  # サードパーティを省く場合
rdsh desktop verify                 # プロファイルに rdsh プラグインがない場合は 0 以外で終了
```

プロファイルインストーラーや各種インストーラーからも同様に利用できます:

```sh
PROFILE=desktop ./plugins/install.sh   # 推奨パッケージをすべて適切に転送して導入
./install.sh --desktop                 # インストール時に rdsh プラグインを組み込み
```

※ プラグインを組み込む前にアプリを終了し、完了後に再起動してください。アプリ内の Plugins 画面からも、コマンドを使わずに同じパッケージをインストールできます。Electron ランタイム自体が置き換わることはなく、アプリ内の処理委譲はオプトインかつフェイルオープンな compute bridge に限定されます。詳細は [DESKTOP-INTEGRATION.md](docs/DESKTOP-INTEGRATION.md) をご覧ください。

## Smart-DSH との併用

[Smart-DSH](https://github.com/hikarioyama/Smart-DSH)(Web プロファイル向けプラグイン集)と問題なく共存できます:

```sh
rdsh doctor                                    # dsh のバージョンと Smart-DSH バンドルを確認
rdsh plugin --profile web add /path/to/bundle  # プラグインの追加(dsh plugin と同等)
rdsh --profile web                             # プラグイン付きで起動
```

ポート番号(DSH Web: `3080`、rdsh serve: `38080`)も競合しません。

DSHの会話GUIに読み取り専用のworkflow進捗ボードを追加する場合は、[対応sourceへの適用・診断ツール](plugins/workflow-board/README.ja.md)を隔離した対応checkoutに使います。boardと共通表示projectionを変更する18ファイルのpatch・fixtureテストを同梱し、patched DSHのbuild・採用は別工程です。

MCP resourceを安全な添付成果物として開き、resource linkを明示操作で読む場合は、[対応sourceへの適用・診断ツール](plugins/mcp-resource-artifacts/README.ja.md)を指定revisionの隔離checkoutに使います。リンクは自動取得せず、binaryをモデル向けテキストに展開しません。patched DSHのbuild・採用は別工程です。

rdsh が同梱するのは Smart-DSH のスマホ幅レイアウトだけです
([`plugins/rdsh-mobile-ui`](plugins/rdsh-mobile-ui/README.md)、MIT・Smart-DSH 由来)。
767px 以下でチャットと入力欄が全幅になり、ロゴを1タップするとセッション一覧が開きます。
Smart-DSH の通知・Esc 停止・タスクハブ・HMR 回避策は上流バンドルのままなので、必要な場合は
上流のバンドルを導入してください。

## 実測ベンチマーク

Linux x86_64 環境での測定値です:

| 項目 | rdsh | 本家 dsh / 従来処理 | 差・倍率 |
| --- | --- | --- | --- |
| `--version` 起動時間 | **約0.90 ms** | 約88 ms | **約98倍高速** |
| `--version` メモリ消費(最大RSS) | **約2.9 MB** | 約66 MB | **約1/23に削減** |
| フック相当処理のメモリ | **約2.7 MB** | 約45 MB (Node相当) | **約1/16に削減** |
| コード検索 (`search`) | **約17 ms** | 約41 ms | **約2.4倍高速** |
| トークン計算 (`tokens`) | **約12 ms** | 約35 ms | **約2.9倍高速** |
| セッション展開 (`sessions --tokens`) | **約0.41 秒** | 約1.65 秒 | **約4.0倍高速** |
| 配布バイナリサイズ | **約1.97 MB** (単一バイナリ) | 約508 MB (Nodeツリー) | **超軽量** |

※ 測定コマンドは `rdsh bench --n 5` など。再現手順や詳細な内訳は [docs/BENCHMARKS.md](docs/BENCHMARKS.md) をご覧ください。

## 安全設計

1. **本家挙動の透過性**: 会話ループやモデル推論は独自実装せず、すべて本家 `dsh` に委譲して互換性を担保します。
2. **非破壊設計**: トークン計算、検索、ログ圧縮などの読み取り系コマンドは、既存のファイルを一切変更しません。
3. **明示的な認証管理**: 他アプリの認証情報を無断で同期・送信せず、利用者が明示的に指定したものだけを取り込みます。
4. **サンドボックス隔離**(オプトイン): Linux 環境では、`--share-file` で共有したファイルだけを読み取り専用・ネットワークなしで `rdsh_inspect` に渡します。その他の DSH ツールは upstream の権限と承認に従います。

## よくある質問

- **Q. 本家 `dsh` は必要ですか?**  
  会話やモデル実行には本家 `dsh` が必要です。トークン計算、ファイル検索、環境診断(`rdsh doctor`)などのユーティリティコマンドは `rdsh` 単体でも動作します。

- **Q. 既存の `dsh` コマンドと置き換えて使えますか?**  
  はい。`./install.sh --as-dsh`(Windows では `.\install.ps1 -AsDsh`)で導入すると、普段の `dsh` コマンドで自動的に高速起動されます。元に戻す場合は `--restore` オプションですぐに復元できます。

- **Q. ポート番号が衝突したときは?**  
  本家 DSH の Web GUI(`:3080`)と `rdsh serve`(`:38080`)は既定ポートが異なります。空きポートを自動選択したい場合は `--port 0` を指定してください。

- **Q. 既存のスクリプトは壊れませんか?**  
  `rdsh` 固有のコマンド以外は、指定したすべての引数をそのまま本家 `dsh` に引き渡すため、既存のスクリプトや CI パイプラインはそのまま動きます。

- **Q. プロファイルを指定しない `rdsh boot` が失敗する場合は?**
  `general.default_profile` または `RDSH_DEFAULT_PROFILE` を設定するか、`--profile <name>` を付けてください。

## 資料

| 資料 | 内容 |
| --- | --- |
| [docs/USER-FLOW.md](docs/USER-FLOW.md) | 導入から設定・利用・復旧までの全体フロー |
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | 委譲の仕組みとアーキテクチャ設計 |
| [docs/BENCHMARKS.md](docs/BENCHMARKS.md) | ベンチマークの詳細と再現手順 |
| [docs/RDSH-SETTINGS.md](docs/RDSH-SETTINGS.md) | 設定画面の機能と CLI キー一覧 |
| [docs/DESKTOP-INTEGRATION.md](docs/DESKTOP-INTEGRATION.md) | デスクトップアプリ (Electron) との連携 |
| [docs/FEDORA.md](docs/FEDORA.md) | Fedora / RHEL 向けパッケージ・任意ツール・Linux でのデスクトップ事情 |
| [docs/ROADMAP.md](docs/ROADMAP.md) | 今後の開発ロードマップ |
| [docs/RELEASING.md](docs/RELEASING.md) | リリース手順 |
| [docs/SERIAL-PROXY.md](docs/SERIAL-PROXY.md) | 同時リクエスト数制限プロキシ |
| [CHANGELOG.md](CHANGELOG.md) | バージョンごとの主な変更履歴 |

## コミュニティ

- コントリビューション:[CONTRIBUTING.md](CONTRIBUTING.md) をご覧ください。
- Rust開発環境:[Rust開発ガイド](docs/RUST-DEVELOPMENT.md) をご覧ください。
- バグ報告・要望:[Issue フォーム](https://github.com/jimoto-no-llm/rustdsh/issues/new/choose)(日本語 OK)へお寄せください。
- セキュリティ脆弱性報告:公開 Issue ではなく [SECURITY.md](SECURITY.md) に記載の手順でご報告ください。
- サポート:[SUPPORT.md](SUPPORT.md) / 行動規範:[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)

## 謝辞

本家 DeepSeek Harness の開発者およびコントリビューターの皆様に感謝します。本家のランタイムが rustdsh の基盤です。

- アイコン制作: [PENTACoXIAN](https://x.com/PENTACoXIAN)
- セキュリティレビュー・脆弱性報告: [GrEarl](https://github.com/GrEarl)、[PENTACoXIAN](https://x.com/PENTACoXIAN)
- 実装・改善・検証協力: [StudioYebisu](https://github.com/yebisu0529-ship-it)、[RNA4219](https://github.com/RNA4219)、[eightman999](https://github.com/eightman999),[cyrne1-7208](https://github.com/cyrne1-7208)
- アイディア・製品提案: [@remydre8](https://x.com/remydre8)
- 標準搭載の Web UI プラグイン(許諾済み、MIT):[cwd514](https://github.com/cwd514) さんの [dsh-sound-notifications](https://github.com/cwd514/dsh-sound-notifications)((c) 2026、効果音・デスクトップ通知)、[yugapor](https://github.com/yugapor) さんの [dsh-gitview](https://github.com/yugapor/dsh-gitview)((c) 2026、差分・履歴・CI付き Git パネル)。どちらもインストール時に上流 GitHub から取得します(詳細は `plugins/recommended.md`)。

rdsh が利用・改変・推薦している第三者製 DSH プラグインです(いずれも MIT、著作権は各作者に帰属します):

- [Smart-DSH](https://github.com/hikarioyama/Smart-DSH)(hikarioyama)—
  [`rdsh-mobile-ui`](plugins/rdsh-mobile-ui/README.md) として同梱するスマホ幅レイアウト
- [dsh-sound-notifications](https://github.com/cwd514/dsh-sound-notifications)(cwd514)—
  オプトインの効果音とデスクトップ通知(`SOUND=1`)
- [dsh-gitview](https://github.com/yugapor/dsh-gitview)(yugapor)— 任意のサイドバー Git パネル

## ライセンス

MIT([LICENSE](LICENSE))です。本家 DeepSeek Harness および依存ライブラリにはそれぞれのライセンスが適用されます。

## 保護付き起動の対応版

明示的な共有ファイルだけを扱う隔離機能は、Linux x86_64 と bubblewrap・prlimit・ユーザー名前空間が必要です。監査済みのDSHとツールランタイムの同一版の組は `0.2.0-rc.2`、`0.2.1-alpha.1`、`0.2.1-alpha.3` です。未知・混在・改変されたランタイムや別の依存先へ解決されたランタイムは拒否します。macOSとWindowsでは保護付き委譲を拒否します。[ダッシュボードの固定更新](docs/STAGED-UPDATES.md)は別の対応版一覧を持ちます。

### 外部エージェントのジョブ

`node dashboard/cli.mjs --language ja agents list`で表示言語を選べます。外部エージェントのヘルプとCLI診断は英語・簡体字中国語・日本語に対応します。ジョブ状態・エラーコード・JSONキー・エージェント出力は原文を保持します。日本語のファイル名と指示文はUTF-8の`--prompt-file`で渡せます。[コマンドと権限の制約](docs/AGENT-RUNNERS.md)を確認してください。実ジョブは外部サービスの料金が発生する場合があります。言語検証はローカルのテスト用実行ファイルで行います。

`budget-admission apply|validate|public --input-file <request-json>`も設定に依存しない純JSONコマンドです。nativeとDashboardのヘルプ・診断を3言語化し、予算コードとJSON出力は保持します。プロバイダーの呼び出しや予算台帳の書き込みは行いません。[予算管理](docs/BUDGET-CONTROL.md)を参照してください。

`question-contracts apply|validate|public`、`answer-applications apply|validate|public|schema`、`instruction-queue validate|context|submit|resolve|control`も`--input-file <request-json>`を受け取り、無関係な設定を読みません。nativeとDashboardのヘルプ・所有する診断は3言語に対応し、エンジンのメッセージ・状態コード・正規JSONは上流の値を保持します。任意の[応答ガード](plugins/rdsh-answer-guard/README.md)も通知要約と設定エラーを3言語化し、モデルへの再出力指示は保持します。