권한 모드
세션이 먼저 묻지 않고 할 수 있는 일의 범위는 문자열이 아니라 이름 붙은 모드의 닫힌 집합입니다. 각 모드는 두 번의 번역을 견뎌야 하기 때문입니다 — CLI를 spawn할 때 쓰는 플래그로 한 번, 그리고 CLI가 스스로에 대해 보고하는 것에서 되돌아 나오면서 또 한 번 — 그런데 맨 문자열이라면 이 둘이 조용히 어긋날 수 있습니다.
| 모드 | 허용하는 것 |
|---|---|
plan |
계획만: 제안하되 결코 편집하지 않습니다. |
ask_before_edit |
편집할 때마다 묻습니다. |
auto_edit |
편집은 통과시키고, 다른 도구는 여전히 묻습니다. |
auto |
자율적으로 결정합니다. |
bypass |
아무것도 묻지 않습니다. |
spawn 시점에 고정됩니다
섹션 제목: “spawn 시점에 고정됩니다”--permission-mode는 spawn 시점 플래그이고 실행 중에 바꾸는 방법이 문서화되어 있지 않으므로, 모드 변경은 곧 재spawn입니다. 호스트는 보내기 전에 이를 묻고, true이면 이 세션을 멈춘 뒤 resume: true로 새 세션을 시작합니다.
command.session?.requiresRestartFor(PermissionMode.AUTO_EDIT); // booleanCommand를 통해 구동한다면 이런 것은 필요 없습니다. permissions를 설정하고 send()를 부르면 필요할 때 프로세스가 교체됩니다. send() 전에는 아무것도 실행되지 않는다를 참고하세요.
CLI는 자신이 spawn된 것과 같은 어휘로 모드를 알립니다 — spawn 시점의 system/init에서 한 번, 그리고 CLI가 스스로 모드를 바꿀 때 system/status에서 다시 한 번. 승인된 plan이 plan 모드를 빠져나가는 것을 도구 호출을 들여다보지 않고도 관찰할 수 있는 이유가 이것입니다.
하이픈과 언더스코어를 모두 받습니다
섹션 제목: “하이픈과 언더스코어를 모두 받습니다”권한 이름은 하이픈과 언더스코어를 모두 받습니다. 정규 표기는 언더스코어를 쓰는데, CLI의 트랜스크립트가 그렇게 싣고 다니기 때문입니다. 하지만 TypeScript를 쓰는 호출자가 손이 가는 쪽은 ask-before-edit이고, 모호할 것 없는 이름의 한쪽 표기를 거절해서 득을 보는 사람은 아무도 없습니다.
command.setPermissions('ask-before-edit'); // okcommand.setPermissions('ask_before_edit'); // ok, 같은 모드command.setPermissions('yolo'); // throws: Unknown permission mode: yolo모르는 이름이 throw하는 이유
섹션 제목: “모르는 이름이 throw하는 이유”호출자가 요청한 것과 다른 모드로 조용히 실행되는 것은, 아무도 승인하지 않은 편집으로 끝나는 종류의 실수입니다. 마지막 줄이 throw하는 이유가 그것입니다.
다음으로 볼 것
섹션 제목: “다음으로 볼 것”- 권한 요청에 답하기 — 묻는 모드에서 벌어지는 일.
- 레퍼런스: 권한 모드 — 모드-플래그 대응표.