Dropstone Docs

权限

控制哪些操作需要批准才能运行。

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"
    }
  }
}

规则通过模式匹配进行评估,最后匹配的规则获胜。常见的模式是首先放置通用 "*" 规则,然后是更具体的规则。

通配符

权限模式使用简单的通配符匹配:

  • * 匹配零个或多个任意字符
  • ? 匹配恰好一个字符
  • 所有其他字符按字面意思匹配

主目录扩展

你可以在模式的开头使用 ~$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:文件 globbing(匹配 glob 模式)
  • grep:内容搜索(匹配正则表达式模式)
  • bash:运行 shell 命令(匹配解析的命令,如 git status --porcelain
  • task:启动子代理(匹配子代理类型)
  • skill:加载技能(匹配技能名称)
  • lsp:运行 LSP 查询(目前非细粒度)
  • question:在执行期间向用户提问
  • webfetch:获取 URL(匹配 URL)
  • websearch:网络搜索(匹配查询)
  • external_directory:当工具接触项目工作目录之外的路径时触发
  • doom_loop:当相同的工具调用以相同输入重复 3 次时触发

默认值

如果你没有指定任何内容,Dropstone 从宽松的默认值开始:

  • 大多数权限默认为 "allow"
  • doom_loopexternal_directory 默认为 "ask"
  • read"allow",但 .env 文件默认被拒绝:
{
  "permission": {
    "read": {
      "*": "allow",
      "*.env": "deny",
      "*.env.*": "deny",
      "*.env.example": "allow"
    }
  }
}

"Ask"的作用

当 Dropstone 提示批准时,UI 提供三个结果:

  • 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