콘텐츠로 이동

권한 모드

세션이 먼저 묻지 않고 할 수 있는 일의 범위는 문자열이 아니라 이름 붙은 모드의 닫힌 집합입니다. 각 모드는 두 번의 번역을 견뎌야 하기 때문입니다 — CLI를 spawn할 때 쓰는 플래그로 한 번, 그리고 CLI가 스스로에 대해 보고하는 것에서 되돌아 나오면서 또 한 번 — 그런데 맨 문자열이라면 이 둘이 조용히 어긋날 수 있습니다.

모드 허용하는 것
plan 계획만: 제안하되 결코 편집하지 않습니다.
ask_before_edit 편집할 때마다 묻습니다.
auto_edit 편집은 통과시키고, 다른 도구는 여전히 묻습니다.
auto 자율적으로 결정합니다.
bypass 아무것도 묻지 않습니다.

--permission-mode는 spawn 시점 플래그이고 실행 중에 바꾸는 방법이 문서화되어 있지 않으므로, 모드 변경은 곧 재spawn입니다. 호스트는 보내기 전에 이를 묻고, true이면 이 세션을 멈춘 뒤 resume: true로 새 세션을 시작합니다.

command.session?.requiresRestartFor(PermissionMode.AUTO_EDIT); // boolean

Command를 통해 구동한다면 이런 것은 필요 없습니다. permissions를 설정하고 send()를 부르면 필요할 때 프로세스가 교체됩니다. send() 전에는 아무것도 실행되지 않는다를 참고하세요.

CLI는 자신이 spawn된 것과 같은 어휘로 모드를 알립니다 — spawn 시점의 system/init에서 한 번, 그리고 CLI가 스스로 모드를 바꿀 때 system/status에서 다시 한 번. 승인된 plan이 plan 모드를 빠져나가는 것을 도구 호출을 들여다보지 않고도 관찰할 수 있는 이유가 이것입니다.

하이픈과 언더스코어를 모두 받습니다

섹션 제목: “하이픈과 언더스코어를 모두 받습니다”

권한 이름은 하이픈과 언더스코어를 모두 받습니다. 정규 표기는 언더스코어를 쓰는데, CLI의 트랜스크립트가 그렇게 싣고 다니기 때문입니다. 하지만 TypeScript를 쓰는 호출자가 손이 가는 쪽은 ask-before-edit이고, 모호할 것 없는 이름의 한쪽 표기를 거절해서 득을 보는 사람은 아무도 없습니다.

command.setPermissions('ask-before-edit'); // ok
command.setPermissions('ask_before_edit'); // ok, 같은 모드
command.setPermissions('yolo'); // throws: Unknown permission mode: yolo

호출자가 요청한 것과 다른 모드로 조용히 실행되는 것은, 아무도 승인하지 않은 편집으로 끝나는 종류의 실수입니다. 마지막 줄이 throw하는 이유가 그것입니다.