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개 이상과 일치
  • ?는 정확히 한 문자와 일치
  • 다른 모든 문자는 문자 그대로 일치

홈 디렉터리 확장

패턴 시작 부분에 ~ 또는 $HOME을 사용하여 홈 디렉터리를 참조할 수 있습니다. 이는 external_directory 규칙에 특히 유용합니다.

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

외부 디렉터리

external_directory를 사용하여 Dropstone이 시작된 작업 디렉터리 외부의 경로를 건드리는 도구 호출을 허용합니다. 이는 경로를 입력으로 받는 모든 도구(예: read, edit, glob, grep 및 많은 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: 모든 파일 수정(edit, write, patch 포함)
  • 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"로 남고 에이전트가 파일을 처음 열 때 실행이 중단됩니다.

두 가지 해결 방법이 있습니다. "*": "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는 세 가지 결과를 제공합니다:

  • 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: 편집 없는 코드 리뷰
mode: subagent
permission:
  edit: deny
  bash: ask
  webfetch: deny
---

코드만 분석하고 변경 사항을 제안하세요.

Tip

인수가 있는 명령에는 패턴 일치를 사용하세요. "grep *"grep pattern file.txt를 허용하지만 "grep"만으로는 차단합니다. git status와 같은 명령은 기본 동작에 작동하지만 인수가 전달될 때는 명시적 권한("git status *" 등)이 필요합니다.

Ctrl+I