gori에 저장되는 모든 환경설정은 하나의 화면, Preferences 모달에서 편집합니다. 앱 안에서든 프로젝트 선택기에서든 같은 모달이므로 익힐 곳은 한 군데뿐입니다.
Preferences 열기
| 여는 방법 | 도착 지점 |
|---|---|
어디서나 Ctrl-, |
그룹 스트립. 그룹을 먼저 고릅니다 |
상단 바의 ⚙ 칩 |
Ctrl-,와 동일 |
Ctrl-P → Settings: … 항목 |
해당 섹션의 필드로 바로 |
팔레트 항목과 모달의 섹션은 같은 목록에서 나오므로, 한쪽에서 닿는 것은 다른 쪽에서도 닿습니다.
이동하기
모달 위쪽에는 그룹 스트립(다섯 개 그룹)이 있고, 그 아래에 포커스된 그룹의 섹션이 놓입니다. Ctrl-,로 열면 스트립에서 시작하고, 팔레트로 바로 들어가면 필드에서 시작합니다.
| 키 | 동작 |
|---|---|
← / → |
그룹 전환(스트립에 포커스가 있을 때) |
↓ / ↵ |
스트립에서 필드로 내려가기 |
↑ / ↓ |
필드 이동. 첫 필드에서 ↑는 스트립으로 돌아갑니다 |
↵ |
현재 섹션 저장, 또는 섹션의 편집기 열기 |
Ctrl-R |
포커스한 섹션을 기본값으로 되돌리기 |
Esc |
닫기. 저장하지 않은 편집이 있으면 첫 번째는 경고하고, 두 번째에 버림 |
편집 내용은 작업 사본입니다. ↵를 누르기 전에는 아무것도 기록되지 않고, Esc를 두 번 누르면 버립니다(첫 번째는 저장하지 않은 섹션을 알려줍니다). 저장은 재시작 없이 즉시 적용됩니다.
필드 행에서의 Ctrl-R도 같은 규칙을 따릅니다. 해당 섹션의 기본값을 작업 사본에 되돌려 놓을 뿐이라 ↵로 저장해야 합니다. 오프너 행에는 되돌릴 작업 사본이 없으므로 확인을 물은 뒤 바로 기록합니다. 탭 바, 테마, 단축키를 그렇게 되돌릴 수 있습니다. Env, User-Agents, 호스트네임 오버라이드는 설정이 아니라 직접 입력한 항목이라, 그곳의 Ctrl-R은 조용히 비우는 대신 그렇다고 알려 줍니다. 그것들을 지우는 것은 아래의 공장 초기화이며, 초기화는 먼저 경고합니다.
필드 종류
| 종류 | 편집 방법 |
|---|---|
| 텍스트 | 그대로 입력(바인드 주소, 에디터 명령, 스테이터스라인 명령) |
| 토글 | Space, ←, →로 on/off 전환 |
| 선택지 | ← / →로 순환 |
| 오프너 | ↵로 해당 섹션의 전용 편집기 열기 |
오프너는 한 줄짜리 필드로는 부족한 섹션에 쓰입니다. 테마 목록, 탭 바, 환경 변수, 단축키, 키셋 연습장(Keyset playground), 호스트네임 오버라이드, User-Agent 목록이 여기에 해당합니다.
섹션
General
| 섹션 | 필드 |
|---|---|
| General | Clipboard (OSC 52), Confirm before quit, Update check, History retention (flows), Record Repeater sends |
| Notifications | Bell on result, Toast on result, Retention (count) |
| Statusline | Statusline on/off, Command, Interval (s), Timeout (s) |
| Reset | 액션: 모든 설정을 공장 기본값으로 되돌리기 |
알림은 Miner, Fuzzer, Probe, Discover의 백그라운드 결과에서 발생합니다. Statusline은 셸 명령을 일정 간격으로 실행해 그 stdout를 맨 아래 줄에 표시합니다. 명령은 라이브 세션을 설명하는 JSON 컨텍스트를 stdin으로 받으며, 그대로 붙여 넣을 수 있는 프리셋도 있습니다.
Reset은 한 섹션이 아니라 파일 전체입니다. ↵(또는 Ctrl-P → Settings: Reset)로 확인을 거치면 settings.json이 갓 설치한 상태로 돌아가고, 테마·키맵·탭 바·목록과 미리보기 설정·프록시 바인드까지 즉시 반영됩니다. 같은 파일에 들어 있는 데이터도 함께 사라집니다. 전역 env 값, 호스트네임 오버라이드, 전역 OAST 프로바이더, 저장한 디코더 체인, 전역 Rewriter·Colormarker·Probe 규칙, 저장한 뷰, 리댁션 프로필, 업스트림 규칙, 아웃바운드 TLS 설정, 추가 리스너, User-Agent 목록이 그렇습니다. 프로젝트와 캡처, 그리고 프로젝트가 고정한 바인드와 env는 그대로 남습니다.
의도적으로 두 가지가 남습니다. 리댁션 salt는 버리면 이미 쓴 산출물의 자리표시자가 모두 깨지므로 유지됩니다. 그리고 전역 규칙 id 카운터도 남습니다. 프로젝트는 전역 Rewriter·Colormarker 규칙을 id로 오버라이드할 수 있고, 그 오버라이드는 설정 초기화가 열지 않는 프로젝트 DB에 남습니다. 카운터를 1로 되돌리면 새로 만든 규칙이 옛 오버라이드가 가리키던 id를 받게 되므로, 카운터는 계속 올라가고 settings.json에는 규칙 없는 블록만 그 숫자를 기억하려고 남습니다.
Appearance
| 섹션 | 필드 |
|---|---|
| Theme | 오프너: 테마 선택기(내장 테마와 직접 만든 테마) |
| Display | Default detail pane, History list time, Line numbers, Wrap long lines, Preview body limit (KiB), Resource meter, Terminal title |
| Layout | History Req/Res preview, Probe issue preview, Issues preview, History list order, Sitemap expand depth, Tab numbers, Tab bar slots |
| Companion | Companion (Miss Ring), Placement, Motion, Notices, Agent replies |
Theme 행은 현재 테마를 인라인으로 미리 보여줍니다. 이름과 팔레트 스와치가 함께 표시됩니다. 테마 가이드를 참고하세요.
Companion은 기본값이 on입니다. 아예 끄려면 Companion → off고, 그 전에 고를 수 있는 것이 둘 있습니다. Motion still은 Miss Ring이 스스로 시작하는 다시 그리기를 전부 없애고 얼굴만 남기며, Placement bar는 Miss Ring을 두되 본문 세 줄을 돌려줍니다. 금빛 고리 마스코트 Miss Ring은 처음 나타나는 프레임에서 인사를 건네고, 이후 스스로 눈을 깜빡이고 윙크하며 백그라운드 작업 결과에 반응하다가, 90초간 아무 입력이 없으면 잠들어 애니메이션을 완전히 멈춥니다. 25초에 한 번쯤은 일곱 가지 idle 제스처 중 하나를 무작위로 꺼내기도 합니다: 하품, 미소, 실눈, 뚱한 표정, 알겠다는 듯 바뀌는 궁금한 표정, 눈을 깜빡여 털어 내는 작은 콧방귀, 그리고 눈을 가늘게 뜬 "흠". 이 표정들은 눈만큼이나 눈썹이 만듭니다. 편안하게 열린 얼굴에서는 두 속눈썹이 함께 올라가고, 찌푸린 얼굴에서는 뒤집히며, 갸웃하는 얼굴에서는 한 번에 하나씩 움직입니다. 결과에 대한 반응도 표정 하나가 아니라 호를 그립니다. 결과가 도착하면 정점을 찍고(활짝 웃거나, 긴장하거나, 움찔하거나), 1.5초 뒤에 그것의 조용한 버전으로 가라앉아 반응이 끝날 때까지 머뭅니다. Motion을 calm으로 두면 눈 깜빡임 주기가 절반이 되고 제스처는 꺼집니다. SSH나 배터리 환경용입니다. still은 깜빡임까지 꺼서 Miss Ring이 스스로 하는 움직임이 하나도 남지 않고, 다시 그리는 일도 없습니다. 90초를 기다리지 않은 잠든 상태와 같은 비용이며, asciinema 녹화나 스크린 리더, 공유 tmux 팬을 위한 모드입니다. 반응은 세 모드 모두에서 그대로 남습니다. still은 그중 말 그대로 '움직임'인 부분, 즉 오류에 움찔하는 동작만 끄고 표정은 유지합니다. 백그라운드 작업이 도는 동안(fuzz, discover, mine, 전송 중인 repeater) Miss Ring은 배지 칸에서 점이 위아래로 움직이는 표시를 답니다. 상태 줄의 활동 스피너와 같은 카운터로 움직이므로 둘의 박자가 어긋나지 않습니다. 이게 가장 유용한 곳은 body 배치입니다. 그 화면에서는 활동 칩이 보이지 않으므로, 작업이 아직 돌고 있다는 사실을 알려 주는 것은 본문 구석의 Miss Ring뿐입니다. 반응이 이 배지보다 우선하므로 작업 도중 실패는 여전히 ×로 나타납니다. 작업이 도는 동안에는 잠들지 않으며, 에이전트가 MCP로 시작한 작업도 Miss Ring을 깨웁니다. 세션에서 Miss Ring이 먼저 꺼내는 말은 이 인사뿐이고, gori 실행당 한 번만 나옵니다. Notices를 끄면 아무 말도 하지 않습니다.
프로젝트 선택 화면에도 Miss Ring이 서 있습니다. 카드 옆 우하단 구석이며, 인사도 이제 이 화면에서 나옵니다. 인사는 gori 실행당 한 번, 처음 나타난 화면에서만 나옵니다. 릴리스당 한 번 뜨는 update available 알림도 Miss Ring 몫입니다. 먼저 인사를 건네고, 한 박자 뒤에 새 버전이 나왔다는 사실과 설치 방법을 알려줍니다. 말하는 방식은 세션과 같습니다. 머리 위 말풍선이 뜨고, 말하는 몇 초 동안 카드 오른쪽 가장자리 위로 떠 있습니다. 카드 옆에 앉힐 수 없을 만큼 좁은 터미널에서는 아예 나타나지 않으며, 알림도 Companion이 꺼져 있을 때와 똑같이 가운데 정렬된 한 줄로 돌아갑니다.
독립 실행 화면 두 곳에도 Miss Ring이 나옵니다. 설정 마법사에는 COMPANION 단계가 있습니다. 켜기/끄기 선택과 모션 옆에 정지 이미지가 놓이므로, 처음 실행하는 사용자가 Miss Ring을 만나기 전에 원하는지 먼저 정할 수 있습니다. 마칠 때까지 아무것도 기록되지 않으므로 Esc로 빠져나가면 설정은 원래대로 남습니다. 가이드 투어(gori tutorial)는 Miss Ring이 안내에 실제로 참여하는 유일한 곳입니다. 카드 오른쪽에 서서 탭 전환, 팔레트 열기, 액션 메뉴, INS 모드를 각각 한 번씩 해낼 때마다 확인해 주고, 마지막에 인사하고 물러납니다. 투어 카드가 옆에서 원래 폭을 유지할 수 있을 때(대략 94칸 이상)에만 서 있고, 말풍선도 카드 밖에 들어갈 때만 띄우므로, 80칸 터미널에서는 Companion을 끈 것과 똑같이 그려집니다. 수업 내용 자체는 카드에 있고 Miss Ring은 반응만 하므로, Notices를 꺼도 잃는 것은 그 격려뿐이고 투어 내용은 그대로입니다.
Placement는 세션에서의 비용을 결정합니다 (선택 화면에는 자리가 하나뿐입니다). body는 탭 본문 우하단에 8×3 스프라이트를 두며, 세 줄을 가리고 결과를 말풍선으로 알립니다. bar는 상태 줄 맨 오른쪽, 시계보다 더 바깥에 여덟 칸짜리 칩을 둡니다. 고리의 위아래를 뺀 얼굴과 기분 배지가 들어갑니다. 아무것도 가리지 않고 말풍선도 사라집니다. 대사가 상태 줄의 텍스트 슬롯을 통해 나가기 때문입니다. 반응을 칩에서 읽을 수 있게 해 주는 것이 이 배지입니다. 배지가 없으면 칩은 "뭔가 잘못됐다"를 금색이 조금 붉어지는 것만으로 말하게 되는데, 색이 바랜 터미널에서 가장 먼저 사라지는 신호가 그것입니다. 이렇게 가장자리에 앉을 수 있는 건 어떤 표정에서도 폭이 같기 때문입니다. 눈을 깜빡여도 시계나 CPU/MEM 표시가 밀리지 않습니다. 그 슬롯은 메시지를 하나만 담으므로, 토스트와 Miss Ring의 알림은 더 최신인 쪽이 이깁니다. Notices는 어느 쪽이든 하단 상태바 토스트와 독립적으로 동작합니다. 두 배치 모두에서 Miss Ring을 클릭할 수 있습니다. 누르면 알림 목록이 열립니다. Miss Ring이 그 목록의 얼굴이고, 방금 말한 그 줄이 목록의 가장 최신 항목입니다.
Agent replies는 에이전트가 MCP reply_to_operator 도구로 보낸 말을 Miss Ring이 얼마나 오래 들고 있을지 정합니다. 기본값 hold에서는 답장이 다음 키 입력이나 클릭까지 말풍선(bar에서는 상태 줄)에 남습니다. 그 뒤에 도착한 작업 결과는 표정만 바꾸고 대사는 바꾸지 못하며, 더 새 답장만 그 자리를 차지합니다. 답장이 도착할 때 이미 누르던 키가 그것을 지우지는 못합니다. 다른 알림이 받는 몇 초는 여전히 떠 있습니다. timed는 답장도 다른 알림처럼 그 몇 초 뒤에 내립니다. 어느 쪽이든 열려 있는 창의 알림이지 우편함이 아닙니다. 프로젝트에 gori TUI가 열려 있지 않을 때 온 답장은 하나씩 다시 띄우지 않지만, 다음에 여는 창이 노트 하나로 요약해 같은 방식으로 들고 있으며, 에이전트도 그 사실을 전달받습니다.
Editor & Keys
| 섹션 | 필드 |
|---|---|
| Editor | External editor, Markdown highlight, Pretty-print bodies |
| Mouse | Mouse, Drag release |
| Keys | Command modifier, Editor keyset, Keyset playground(오프너) |
| Env | 오프너: 아웃바운드 요청에 쓰는 전역 $ENV.KEY 변수. 적용 중인 토큰 문법도 함께 보여 주지만, 바꾸는 것은 gori settings env-syntax입니다. 이미 저장된 토큰을 다시 적어 주기 때문입니다 |
| User-Agents | 오프너: $GEN.USER_AGENT가 쓰는 직접 만든 목록(한 줄에 하나). 내장 브라우저 목록을 대체하며, 비워 두면 내장 목록을 씁니다 |
| Hotkeys | 오프너: 단축키 재지정, OS 기본 프로파일 선택 |
External editor는 편집 가능한 필드에서 ^E가 여는 프로그램입니다. 비워 두면 $VISUAL / $EDITOR / vi 순으로 넘어갑니다.
Mouse는 포인터 전반을 다룹니다. 끄면 gori가 클릭·휠·드래그를 아예 가져가지 않으므로 터미널 고유의 텍스트 선택이 돌아옵니다. Drag release는 텍스트 패널 위에서 드래그를 놓았을 때 무엇을 할지 정합니다. select only는 선택 영역만 남기고 복사 키(READ에서는 y, 입력 중에는 ^Y)를 기다립니다. 지금까지의 동작입니다. select + copy는 놓는 순간 클립보드에도 넣습니다. 터미널의 기본 선택 동작과 같은 방식입니다. 그냥 클릭하면 선택되는 것이 없으므로 select + copy에서도 아무것도 복사되지 않습니다. 이 모드는 드래그가 실제로 만든 영역에만 작동하고, 복사 키와 완전히 같은 경로를 지나므로 토스트 문구와 탭별 "복사"의 의미가 양쪽에서 동일합니다.
Keys와 Hotkeys는 한 쌍입니다. Keys는 gori 내장 키 조합 패밀리(^P ^N ^W ^1-9)를 어떤 모디파이어로 열지 고르고(Option (⌥)은 Ctrl을 포기하지 않고 ⌥ 별칭을 추가하며, Ctrl 형태가 전달되지 않는 터미널에 유용), Hotkeys는 개별 동작을 재지정합니다. Keys에서는 텍스트 패널의 READ 모드 키 표기를 바꾸는 Editor keyset(helix 또는 vim)도 고릅니다. 에디터 키셋을 참고하세요. 커맨드 모디파이어, 단축키, 환경 변수를 참고하세요.
Network & Tabs
| 섹션 | 필드 |
|---|---|
| Network | Bind IP, Bind Port, Proxy protocol, Proxy host, Proxy port, Proxy TLS CA, Verify proxy TLS, Verify upstream TLS, Info page and CA download, Connect timeout (s), Idle timeout (s), Capture body limit (MiB), HTTP/2, Strip HTTP/3 Alt-Svc, TLS passthrough, Upstream rules(읽기 전용), Environment proxy(읽기 전용), Outbound TLS(읽기 전용), Hostname overrides(오프너) |
| Tabs | 오프너: 하나로 이어진 목록이며, 경계선 위의 행이 탭 바의 번호 슬롯입니다. ⇧K / ⇧J로 행을 옮기고 space로 경계선 너머로 보냅니다. Tab bar slots가 켜져 있으면 열 번째는 거부됩니다(대신 ⇧K로 행을 맞바꿔 올립니다). 바 밖의 탭도 0으로 계속 접근할 수 있습니다 |
여기의 Network는 전역 기본값입니다. 프로젝트는 Project 탭에서 자체 바인드 주소, 포트, 업스트림을 고정할 수 있고 그 프로젝트에서는 그쪽이 우선합니다. 전체 우선순위는 설정을 참고하세요.
AI
| 섹션 | 필드 |
|---|---|
| Agent messaging | Channel delivery (off) |
| MCP permissions | Send traffic, Intercept control, Edit project data, Change scope & sandbox, Manage projects, Run local commands (all on) |
gori mcp가 "Tell the agent…" 메시지를 붙어 있는 에이전트에게 전달하는 방식입니다. inbox socket, Codex queue, tool-result, operator_messages poll 계층은 항상 동작하고, Channel delivery는 그 뒤에 claude/channel push를 놓습니다. 전달을 확인할 수 있는 경로가 하나도 답하지 않았을 때에만 시도합니다. 개발 채널 플래그로 Claude Code를 띄워야 하는 research preview라 기본은 off입니다. 이 값은 gori mcp 프로세스가 시작할 때 읽으므로, 이미 떠 있는 에이전트는 받았던 답을 그대로 유지합니다. gori가 보내는 메시지를 참고하세요.
MCP permissions는 gori mcp로 붙은 에이전트가 무엇을 할 수 있는지 묶음 단위로 정합니다. 캡처를 읽는 것은 항상 허용되고, Channel delivery처럼 서버가 시작할 때 읽습니다. Preferences에서 권한 정하기를 참고하세요.
프로젝트 선택기에서
Ctrl-,는 프로젝트를 열기 전, 프로젝트 선택기에서도 같은 모달을 엽니다. 첫 실행에서 테마를 정할 수 있습니다. 폼 섹션은 모두 그곳에서도 편집할 수 있고, 오프너 중에서는 Theme만 동작합니다. 실행 중인 프로젝트가 필요한 섹션(Tabs, Env, Hotkeys, 키셋 연습장, 호스트네임 오버라이드, User-Agents)은 숨겨지거나 프로젝트를 먼저 열라고 안내합니다. Reset도 마찬가지입니다. 공장 초기화는 실행 중인 세션에 적용되어야 하기 때문입니다.
설정이 저장되는 곳
여기서 저장한 내용은 모두 gori 홈 디렉터리의 settings.json에 기록됩니다. 경로를 출력하거나 바로 열려면:
gori settings # print the settings.json path
gori settings --edit # open it in your editor
프로젝트별 재정의는 이 파일에 없습니다. 프로젝트 데이터베이스에 저장되며 Project 탭에서 편집합니다.