DSH Plugins Marketplace

DSH Plugins

Plugins

/

DSH-forJP-TUI

D

DSH-forJP-TUI

Manifest valid

Japanese-native TUI for DeepSeek Harness (design phase)

hasBundlePatch

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上流更新で崩れにくい依存する上流の非公開契約を最小化し、その数を常時計測する
P4UX 研究の土台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 または Esc 2回で終了
  • 承認・質問のパネルが出ている間は、キーボードはパネルが持つ
  • 動作確認(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_ENTRYauto(既定)C を試し、失敗したら B へフォールバック
in-processC のみ。失敗したら異常終了
childB を強制
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.mdDSH のツールと FE 実装要件の棚卸し
docs/design/0008-ui-redesign.mdUI 大改修の制約(物理制約・行モデル・D1〜D5)
docs/design/0009-ui-shell-design.mdUI 構成設計(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…