DSH-forJP-TUI
Manifest validJapanese-native TUI for DeepSeek Harness (design phase)
DSH-forJP-TUI
DeepSeek Harness (dsh) のための日本語ネイティブ TUI。
状態: 縦切り(v0)完成・UI 改修中(2026-10-21)。 エージェントと対話でき、ツールが動き、 危険な操作は承認でき、実行中のターンは止められる。段階実装 S0〜S12 は S8b(goal)だけ保留で完了した。 いまは画面を作り直している途中(入力欄とコンテキストバーは実装済み、本文の装飾は未着手)。
現在地・動かし方・落とし穴・次の作業は
docs/HANDOFF.mdに集約してある。
これは何か
dsh の TUI サーフェスを、日本語を第一級に扱う形で自作する。 既存の dsh-TUI を参考にしつつ、 コードは共有せず、描画層から自分で設計する。
目的
| # | 目的 | 設計要求 |
|---|---|---|
| P1 | 見た目を自分で設計できる | 描画層を自前で握る。装飾演出を既定で入れない |
| P2 | 日本語ネイティブ | 文言を最初からカタログ化。日本語を言語パックに追い出さない |
| P3 | 上流更新で崩れにくい | 依存する上流の非公開契約を最小化し、その数を常時計測する |
| P4 | UX 研究の土台 | UI 層とハーネス層を分離し、UI の反復試行を安くする |
| P5 | 将来ハーネスごと差し替える(思想として保持) | ハーネス境界を1箇所に閉じ込める |
| P6 | ハーネスチューニング研究 | ハーネスの挙動を外から差し替え可能に保つ |
いまできること
PTY(擬似端末)で起動し、バイト列を復元して実際に出たことを確かめている。
- 応答のストリーミング表示、失敗の表示
- 代替スクリーン(vim 風)とスクロール(
PgUp/PgDn/Home/End/ ホイール) - ツール呼び出しと結果。
terminal/diff/search/readのカード - 承認(
yで許可・nで拒否。答えないと拒否扱い=fail-closed) - 取り消し(実行中の
Ctrl+C/Esc) - バックグラウンドジョブの逐次出力
- エージェントからの質問(選択肢・
Tabで自由入力・前後移動・スキップ) - 思考の表示 / TODO / サブエージェント一覧 /
webカード(モデル依存。出なければ[skip]) - コンテキスト使用量と Cache Hit のバー
- 日本語 IME 対応(変換中の文字が入力欄に出る)
使い方
pnpm install
pnpm build
pnpm profile:install # $DSH_HOME(既定 ~/.dsh)へプロファイルを設置
COMMANDCODE_API_KEY=... dsh --profile forjp-tui
- 入力して
Enterで送信、Alt+Enter/Ctrl+Jで改行(最大5行まで伸びる) Ctrl+CまたはEsc2回で終了- 承認・質問のパネルが出ている間は、キーボードはパネルが持つ
- 動作確認(PTY 上で起動→入力→応答→終了までを実測する):
pnpm test:ui - 別の版の DSH で動くか:
pnpm verify:host --host <dsh のパッケージディレクトリ> - 作業用の隔離環境へ入れる場合:
pnpm profile:install --home .dsh-home
確定している方針
- DSH への載せ方: in-process の Cordis バンドル(
dsh.bundle.patch)。承認・ユーザー質問・モデル切替を 人対話で行うには、これ以外の経路が存在しない(公式 SDK / ACP には承認チャネルが無い) - 起動: 自前のフル host-entry を持つ。ただし失敗時は必ず
dsh --profile子プロセスへフォールバックする - 描画層: upstream の Ink v8.0.0(commit
26d2c3f8)を fork し、src/ink/に置いて自前で拡張する。Ink 本体はマウス選択・ヒットテスト・スクロール固定を持たないため、 これらは自作する - DSH への実行時依存はゼロ。接続は
ctx.get()/ctx.on()の名前だけ(src/host-contract.tsの 2モジュール・2エクスポート)。@deepseek-ai/*をdependenciesに足すとこの性質が壊れる - v0(縦切り)で入れたもの: 入力解析 / 差分描画 / 全角幅 / 入力欄 / ストリーム表示 / ツールカード / 承認パネル / ユーザー質問パネル / セッション結線 / 中断と終了
開発
pnpm install
pnpm build # yoga → ink → main の順。この順でないと壊れる
pnpm typecheck
pnpm test:forjp # 表示ロジックの単体(185 pass)
pnpm test:ui # PTY で起動してバイト列を復元して断定(15シナリオ。実モデルを呼ぶので10〜15分)
pnpm verify:bundle # バンドルの構造検査(A〜D の8項目。鍵があれば E の3項目も)
pnpm verify:ink-forkは差分がある限り終了コード1を返す(added 1 / modified 9が基準)。 「失敗」と読まないことpnpm verify:yoga-diffの既定は自己テスト。移植版の検査はnode --import=tsx scripts/yoga-diff.mjs --candidate=src/yoga- 検証は
$HOME/.dshに一切書き込まない。DSH_HOMEをワークスペース内の.dsh-home/に向けて プロファイルとバンドル解決を完結させる(理由)
入口は lib/bin.js(dsh-forjp)。環境変数で挙動を切り替えられる:
| 変数 | 値 | 意味 |
|---|---|---|
FORJP_ENTRY | auto(既定) | C を試し、失敗したら B へフォールバック |
in-process | C のみ。失敗したら異常終了 | |
child | B を強制 | |
FORJP_PROFILE | 既定 forjp | プロファイル名 |
DSH_FORJP_HOST_PACKAGE | 未設定 | ホスト @deepseek-ai/dsh のパッケージディレクトリを明示 |
ドキュメント
作業を引き継ぐ場合は docs/HANDOFF.md を先に読む。
今の状態・動かし方・アーキテクチャ・DSH の API で実測した落とし穴・既知の穴・次の課題が
そこに集約されている。文書の全体像は同 §8 の一覧にある。
| 文書 | 内容 |
|---|---|
docs/design/0004-vertical-slice-v0.md | 縦切りの計画と層の規則(§10) |
docs/design/0005-frontend-tool-requirements.md | DSH のツールと FE 実装要件の棚卸し |
docs/design/0008-ui-redesign.md | UI 大改修の制約(物理制約・行モデル・D1〜D5) |
docs/design/0009-ui-shell-design.md | UI 構成設計(6場面+オーバーレイ) |
docs/design/0010-chat-screen.md | 対話画面の第1スライス(行の型・色・入力欄・IME・実装の段) |
docs/design/0011-half-row.md | 半行の下縁(▀)の手法。今の画面では使っていない(記録として残す) |
docs/debug.md | デバッグコマンド(/forjp-debug-gauge 80) |
docs/design/0001-architecture-and-roadmap.md | 設計書とロードマップ(決定ログ・Phase -1〜5・リスク) |
調査ノートは docs/research/、作業レポートは docs/reports/ に置いてある。
調査ノートには環境依存のローカル絶対パスをマスクしてある($HOME/<workspace>/...)。
ライセンス
MIT(LICENSE)。
fork 元の Ink も MIT であり、src/ink/ に取り込む時点で
Ink のライセンス表示を同梱する。
Comments
Loading…