Dropstone CLI

権限

実行に承認が必要なアクションを制御します。

Dropstone は permission 設定を使用して、特定のアクションを自動実行するか、プロンプトを表示するか、ブロックするかを決定します。

従来の tools ブール設定は非推奨であり、permission に統合されました。古い tools 設定は後方互換性のために引き続きサポートされています。


アクション

各権限ルールは次のいずれかに解決されます:

  • "allow": 承認なしで実行
  • "ask": 承認を求めるプロンプトを表示
  • "deny": アクションをブロック

設定

権限をグローバルに(* を使用して)設定し、特定のツールを上書きできます。

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "*": "ask",
    "bash": "allow",
    "edit": "deny"
  }
}

すべての権限を一度に設定することもできます:

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": "allow"
}

詳細ルール(オブジェクト構文)

ほとんどの権限では、オブジェクトを使用してツール入力に基づいて異なるアクションを適用できます。

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "bash": {
      "*": "ask",
      "git *": "allow",
      "npm *": "allow",
      "rm *": "deny",
      "grep *": "allow"
    },
    "edit": {
      "*": "deny",
      "packages/web/src/content/docs/*.mdx": "allow"
    }
  }
}

ルールはパターンマッチングで評価され、最後に一致したルールが優先されます。一般的なパターンは、catch-all の "*" ルールを最初に置き、その後に特定のルールを置くことです。

ワイルドカード

権限パターンは単純なワイルドカードマッチングを使用します:

  • * は任意の文字の0個以上に一致
  • ? は任意の1文字に一致
  • その他の文字はリテラルに一致

ホームディレクトリの展開

パターンの先頭で ~ または $HOME を使用して、ホームディレクトリを参照できます。これは特に external_directory ルールで役立ちます。

  • ~/projects/* -> /Users/username/projects/*
  • $HOME/projects/* -> /Users/username/projects/*
  • ~ -> /Users/username

外部ディレクトリ

external_directory を使用して、Dropstone が起動された作業ディレクトリの外のパスに触れるツール呼び出しを許可します。これは、パスを入力として受け取る任意のツール(例: readeditglobgrep、および多くの bash コマンド)に適用されます。

ホーム展開(~/... など)はパターンの書き方にのみ影響します。外部パスを現在のワークスペースの一部にするわけではないため、作業ディレクトリ外のパスは引き続き external_directory を介して許可する必要があります。

たとえば、これは ~/projects/personal/ の下のすべてへのアクセスを許可します:

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "external_directory": {
      "~/projects/personal/**": "allow"
    }
  }
}

ここで許可されたディレクトリは、現在のワークスペースと同じデフォルトを継承します。read はデフォルトで allow であるため、external_directory の下のエントリに対する読み取りも、上書きされない限り許可されます。これらのパスでツールを制限する場合(読み取りを維持しながら編集をブロックするなど)は、明示的なルールを追加してください:

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "external_directory": {
      "~/projects/personal/**": "allow"
    },
    "edit": {
      "~/projects/personal/**": "deny"
    }
  }
}

リストを信頼できるパスに絞り込み、必要に応じて他のツール(例: bash)に対して追加の許可または拒否ルールを重ねてください。


利用可能な権限

Dropstone の権限はツール名でキー設定され、さらにいくつかの安全ガードがあります:

  • read: ファイルの読み取り(ファイルパスに一致)
  • edit: すべてのファイル変更(editwritepatch をカバー)
  • glob: ファイルグロブ(グロブパターンに一致)
  • grep: コンテンツ検索(正規表現パターンに一致)
  • bash: シェルコマンドの実行(git status --porcelain などの解析されたコマンドに一致)
  • task: サブエージェントの起動(サブエージェントタイプに一致)
  • skill: スキルの読み込み(スキル名に一致)
  • lsp: LSP クエリの実行(現在は非詳細)
  • question: 実行中にユーザーに質問する
  • webfetch: URL の取得(URL に一致)
  • websearch: ウェブ検索(クエリに一致)
  • external_directory: ツールがプロジェクトの作業ディレクトリ外のパスに触れるときにトリガー
  • doom_loop: 同じツール呼び出しが同一の入力で3回繰り返されたときにトリガー

デフォルト

何も指定しない場合、デフォルトの build エージェントはすべての前に確認を求めます。承認は例外ではなくデフォルトです:

{
  "permission": {
    "*": "ask",
    "read": {
      "*": "ask",
      "*.env": "ask",
      "*.env.*": "ask",
      "*.env.example": "ask"
    },
    "external_directory": { "*": "ask" },
    "question": "deny",
    "plan_enter": "deny",
    "plan_exit": "deny",
    "mode_switch": "deny"
  }
}

すでに承認したディレクトリは、セッションの残りの間 external_directory"allow" として追加されます。

あなたの設定はこれらのデフォルトの上にマージされ、あなたのルールが優先されます。デフォルトを置き換えるわけではありません: edit"allow" に設定しても read"ask" のままなので、変更したいすべての権限を指定してください。

accept all エージェントは代わりに "*": "allow" から始まり、external_directory は完全に許可されます。.env.env.* の読み取りは引き続き確認を求めます。これは、実行の自動承認がシークレットの引き渡しに同意することと同じではないという考えに基づいています。


ヘッドレスモードとサーバーモード

対話的に、"ask" は無害です: プロンプトが表示され、承認します。dropstone serve の下、CI、またはキーボードの前に人がいないその他の場所では、確認を求める相手がいないため、呼び出しは "status": "running" のままになり、リクエストは失敗せずにハングします。タイムアウトもキャッチするエラーもありません。

build エージェントはすべての前に確認を求めるため、これはエッジケースではなくデフォルトの結果です。部分的な設定でも救われません: edit を許可しても read"ask" のままで、エージェントがファイルを開く最初の時点で実行がハングします。

修正方法は2つあります。"*": "allow" から始まる accept all エージェントを実行するか:

curl -X POST ".../session/$SID/message" -d '{ "agent": "accept all", ... }'

または build のままにして完全な許可リストを明示し、デフォルトで拒否して、後のリリースで追加されたツールが静かに実行をハングさせないようにします:

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "*": "deny",
    "read": "allow",
    "edit": "allow",
    "glob": "allow",
    "grep": "allow",
    "bash": "allow"
  }
}

ジョブに実際に必要なものに絞り込みます。読み取りとレポートのみを行うエージェントに editbash を保持する理由はありません。

accept all でも .env.env.* の読み取り前に確認を求めることに注意してください。無人実行でこれらを読み取る必要がある場合は、明示的に許可し、意図的に行ってください。

Note

ヘッドレス実行が出力を停止して戻らない場合は、GET /session/:id/message でセッションの最後のメッセージを確認してください。"status": "running" で停止したツールパートは、遅いモデルではなくこの問題です。


「Ask」の動作

Dropstone が承認を求める場合、UI は3つの結果を提供します:

  • once: このリクエストのみ承認
  • always: 提案されたパターンに一致する将来のリクエストを承認(現在の Dropstone セッションの残り)
  • reject: リクエストを拒否

always が承認するパターンのセットはツールによって提供されます(たとえば、bash の承認は通常 git status* のような安全なコマンドプレフィックスをホワイトリストに登録します)。


エージェント

エージェントごとに権限を上書きできます。エージェントの権限はグローバル設定とマージされ、エージェントのルールが優先されます。エージェントの権限について詳細はこちら

Note

より詳細なパターンマッチングの例については、上記の詳細ルール(オブジェクト構文)セクションを参照してください。

{
  "$schema": "https://dropstone.io/schema/config.json",
  "permission": {
    "bash": {
      "*": "ask",
      "git *": "allow",
      "git commit *": "deny",
      "git push *": "deny",
      "grep *": "allow"
    }
  },
  "agent": {
    "build": {
      "permission": {
        "bash": {
          "*": "ask",
          "git *": "allow",
          "git commit *": "ask",
          "git push *": "deny",
          "grep *": "allow"
        }
      }
    }
  }
}

Markdown でエージェントの権限を設定することもできます:

---
description: Code review without edits
mode: subagent
permission:
  edit: deny
  bash: ask
  webfetch: deny
---

Only analyze code and suggest changes.

Tip

引数付きコマンドにはパターンマッチングを使用してください。"grep *"grep pattern file.txt を許可しますが、"grep" 単独ではブロックされます。git status のようなコマンドはデフォルトの動作で機能しますが、引数が渡される場合は明示的な権限("git status *" など)が必要です。

Ctrl+I