yukieiji/dsh-command-permission ↗★ 0

@yukieiji/dsh-command-permission

提供一键授权命令及工作区权限黑白名单管理 适合需要频繁执行终端命令并希望简化审批流程的用户。

包名
@yukieiji/dsh-command-permission
兼容性
待验证
版本
0.2.0
许可证
MIT
最近更新
2026年10月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yukieiji/dsh-command-permission

@yukieiji/dsh-command-permission

DSH の承認(エスカレーション)まわりに、次の2つの機能を足すプラグインです。

機能

1. 承認パネルのワンクリック許可ボタン

pwsh / bash のエスカレーション承認が出ると、コマンド文字列の下に 2列の許可ボタンが並びます(uv run app.py の例):

  • セッション行: このセッション中「uv run app.py」/「uv run *」/「uv *」を許可
  • ワークスペース行: ワークスペース許可リストに「uv run app.py」/「uv run *」/「uv *」を追加

どちらのボタンも、クリックするとパターンを登録して現在の承認にその場で 「許可」を返します(1クリックで完了)。

  • セッション許可は .dsh/command-permissions.json の session セクションに セッションIDごとに保存されます(ホスト再起動でも残る。他のセッションには影響しない)
  • ワークスペース許可はそのワークスペースの全セッションに効きます

2. ワークスペース「…」メニューの許可/ブラックリスト

サイドバーのワークスペース行の 「…」メニュー(名称変更・削除の並ぶメニューの 一番下に追加されます)→「コマンド権限…」で、そのワークスペース専用のリストを 編集できます。

  • 許可リスト: 一致するコマンドのエスカレーションは毎回自動で許可(聞かない)
  • ブラックリスト: 一致するコマンドは毎回自動で拒否(聞かない・許可より優先)

パターン意味

保存先: /.dsh/command-permissions.json

{
  "allow": ["uv run *", "git status"],
  "deny": ["git push", "rm *"],
  "session": {
    "s0123456789abcdef": ["uv run app.py"]
  }
}

1行1パターン。* が無ければ完全一致、* は任意位置で使えるワイルドカードです。

パターン一致する例しない例
uv run app.pyuv run app.py(完全一致のみ)uv run other.py
uv run *uv run app.py、uv run anything deep.pyuv run(末尾スペースが必要)
uv *uv add requestsuvx add x
* --forcegit push --forcegit push
git * origingit push origingit push
  • 空白は正規化して比較するので git push と git push は同じもの扱いです
  • * 以外の特殊文字(. + など)はすべて文字として扱います

判定の順序

エスカレーション → ①ワークスペース拒否リスト → ②ワークスペース許可リスト → ③セッション許可 → どれも不一致なら従来どおりユーザーに質問。

/cmdperm セッションコマンド

コマンド意味
/cmdperm session listこのセッションの許可パターン一覧
/cmdperm session add セッション許可を追加(保存される)
/cmdperm session remove 削除
/cmdperm session clearこのセッション分を全消去
/cmdperm workspace allow add ワークスペース許可リストに追加
/cmdperm workspace deny add ワークスペース拒否リストに追加
/cmdperm workspace listワークスペースのリスト表示
/cmdperm workspace save リスト保存(ダイアログが内部使用)

インストール

A. Git リポジトリから

Plugin Manager の「パス/URL指定」でインストールできます

github:yukieiji/dsh-command-permission

C. ローカルフォルダから

git clone 
cd dsh-command-permission
pnpm install && pnpm build

Plugin Manager → 追加 → パス指定でそのフォルダを指定 → 有効化 → ページリロード。

開発

pnpm install
pnpm build   # tsc -p . → dist/、rolldown で src/client.ts を dist/client.js にバンドル
pnpm lint    # oxlint(curly 必須 = 波括弧なし if はエラー)
pnpm test    # vitest(ホスト30 + クライアント11 = 41 テスト)
pnpm check   # build + lint + test まとめて
  • src/index.ts — ホスト側。approval/request の prepend リスナーと /cmdperm コマンド
  • src/client.ts — クライアント側。承認詳細のスロット(priority -1 で既存表示をシャドウ)と ワークスペース「…」メニュー項目 + 編集ダイアログ
  • scripts/build-client.mjs — クライアント成果物のバンドル。ブラウザのモジュールテーブルは react しか知らないので、実行時依存の zod は rolldown で成果物にインラインする (react だけはファクトリーの require 経由のまま)
  • すべての JSON 境界(設定ファイル・/cmdperm 保存ペイロード・tool 呼び出し引数・ コマンド結果)は zod スキーマでパースし、不正形は空に劣化させる
  • tests/ — vitest。ホストは fake ctx、クライアントは fake React/__ModuleLoader__ で実行

制限事項

  • ワークスペース「…」メニューへの項目追加はDOM注入(ui-workspaceにスロットが 無いための措置)。メニューのDOM構造が変わったら項目が消える可能性があります
  • パターンはシェルコマンド(command 引数を持つツール)にのみ作用。 fs ツールのファイル操作エスカレーションは従来どおり質問されます
  • session セクションはセッションID単位で残ります。不要分は /cmdperm session clear かファイル編集で掃除してください

ライセンス

MIT