Bundle
@yukieiji/dsh-command-permission
DSH plugin: one-click session/workspace command allow patterns on approval prompts, plus per-workspace allow/deny lists edited from the sidebar right-click menu.
- Source
- yukieiji
- License
- MIT
- Updated
- Updated 8 days ago
Readme
# @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`
```json
{
"allow": ["uv run *", "git status"],
"deny": ["git push", "rm *"],
"session": {
"s0123456789abcdef": ["uv run app.py"]
}
}
```
1行1パターン。**`*` が無ければ完全一致**、**`*` は任意位置で使えるワイルドカード**です。
| パターン | 一致する例 | しない例 |
| --- | --- | --- |
| `uv run app.py` | `uv run app.py`(完全一致のみ) | `uv run other.py` |
| `uv run *` | `uv run app.py`、`uv run anything deep.py` | `uv run`(末尾スペースが必要) |
| `uv *` | `uv add requests` | `uvx add x` |
| `* --force` | `git push --force` | `git push` |
| `git * origin` | `git push origin` | `git 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 <id> list` | ワークスペースのリスト表示 |
| `/cmdperm workspace <id> save <json>` | リスト保存(ダイアログが内部使用) |
## インストール
### A. Git リポジトリから
Plugin Manager の「パス/URL指定」でインストールできます
```
github:yukieiji/dsh-command-permission
```
### C. ローカルフォルダから
```bash
git clone <このリポジトリ>
cd dsh-command-permission
pnpm install && pnpm build
```
Plugin Manager → 追加 → **パス指定**でそのフォルダを指定 → 有効化 → ページリロード。
## 開発
```bash
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
Install
dsh plugin --profile web add github:yukieiji/dsh-command-permission
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install yukieiji-dsh-command-permission from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.