콘텐츠로 이동

권한 모드

ActiveCli.Session.PermissionMode — 세션이 먼저 묻지 않고 할 수 있는 일의 범위. 문자열이 아니라 이름 붙은 모드의 닫힌 집합입니다. 각 모드는 두 번의 번역을 거쳐야 하고 — CLI가 spawn되는 플래그로, 그리고 CLI가 자신에 관해 보고하는 것으로부터 되돌아 — 맨 문자열은 그 둘이 조용히 어긋나게 두기 때문입니다.

class PermissionMode {
static readonly PLAN: PermissionMode;
static readonly ASK_BEFORE_EDIT: PermissionMode;
static readonly AUTO_EDIT: PermissionMode;
static readonly AUTO: PermissionMode;
static readonly BYPASS: PermissionMode;
readonly name: string;
static named(name: string | undefined | null): PermissionMode | null;
toString(): string;
}
모드 name 의미
PLAN plan 계획만: 제안하고, 절대 편집하지 않습니다.
ASK_BEFORE_EDIT ask_before_edit 모든 편집 전에 묻습니다.
AUTO_EDIT auto_edit 편집은 통과하고, 다른 도구는 여전히 묻습니다.
AUTO auto 자율적으로 판단합니다.
BYPASS bypass 아무것도 묻지 않습니다.

생성자가 private이므로, 어댑터가 철자를 알지 못하는 여섯 번째 모드가 등장할 수 없습니다. named()는 집합 밖의 어떤 것에도 null로 답합니다.

PermissionMode.PLAN // 제안하고, 절대 편집하지 않음
PermissionMode.ASK_BEFORE_EDIT // 모든 편집 전에 물음
PermissionMode.AUTO_EDIT // 편집은 통과, 다른 도구는 여전히 물음
PermissionMode.AUTO // 자율적으로 판단
PermissionMode.BYPASS // 아무것도 묻지 않음
PermissionMode.named('plan'); // => PermissionMode.PLAN
PermissionMode.named('nonsense'); // => null

ActiveCli.Adapter.Claude.ClaudePermissionFlagPermissionMode와, 같은 개념에 대해 Claude CLI가 쓰는 플래그 이름 사이를 번역합니다.

class ClaudePermissionFlag {
forMode(mode: PermissionMode): string;
toMode(flag: string | undefined | null): PermissionMode | null;
}
PermissionMode CLI 플래그
PLAN plan
ASK_BEFORE_EDIT default
AUTO_EDIT acceptEdits
AUTO auto
BYPASS bypassPermissions

양방향이 모두 필요하며 서로 일치해야 합니다. 우리는 플래그로 spawn하고, 그러면 CLI는 같은 어휘로 자신의 모드를 알립니다 — spawn 시 system/init에서, 그리고 스스로 모드를 바꿀 때 다시 system/status에서. 역방향 맵은 정방향 맵에서 파생되며, 그것이 둘이 어긋나지 않게 하는 장치입니다.

default가 ask-before-edits 모드를 가리킨다는 점에 유의하십시오. 그것은 “사용자 설정을 따르라”는 뜻이 아니며, 그래서 확립된 모드가 없을 때 ClaudeArgv는 플래그를 아예 생략합니다. --permission-mode default를 전달하면 사용자의 설정을 따르는 것이 아니라 덮어쓰게 됩니다.

ActiveCli.Session.ModeChange — 실행 중인 CLI가 요청을 처리할 수 있는지, 아니면 재시작해야 하는지를 판단합니다.

class ModeChange {
constructor(liveMode: PermissionMode | null);
requiresRestart(requested: PermissionMode | null | undefined): boolean;
}

--permission-mode는 spawn 시점 플래그이고, 실행 중에 그것을 바꾸는 문서화된 명령은 없습니다. 따라서 대화 도중의 모드 변경을 반영한다는 것은 CLI를 죽이고 다시 spawn한다는 뜻입니다.

틀리기 쉬운 두 경우가 있습니다.

경우 이유
요청된 모드가 없음 false 비교할 모드가 없습니다. 재시작한다면 잘 동작하는 프로세스를 허물고 똑같은 것을 다시 spawn하는 셈입니다.
살아 있는 모드를 알 수 없음(null) true 호스트 재시작 후 인계받은 세션에서 발생합니다. 재사용은 아무도 관측하지 않은 모드에 거는 도박이고, 지는 쪽의 대가는 사용자가 고른 것보다 느슨한 권한 아래에서의 편집입니다.

직접 생성하지 말고 Session.requiresRestartFor()를 통해 닿으십시오 — 세션이 이미 살아 있는 모드를 추적하고 있습니다.

if (session.requiresRestartFor(PermissionMode.PLAN)) {
session.stop();
session = Session.start(
new ClaudeAdapter(),
new SpawnOptions({ workingDirectory, sessionId, resume: true, permissionMode: PermissionMode.PLAN }),
);
}

Command를 통하면 이 중 어느 것도 손으로 다룰 필요가 없습니다. setPermissions()가 의도를 기록하고, 다음 send()가 필요하다면 재spawn합니다.