zigmini 0.9.0-beta.3 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.ko.md +36 -4
  2. package/README.md +36 -4
  3. package/assets/agent/gateway-rules.md +29 -19
  4. package/assets/android/zigmini.apk +0 -0
  5. package/assets/android/zigmini.apk.json +3 -3
  6. package/assets/build.json +1 -1
  7. package/docs/manual.ko.md +60 -11
  8. package/docs/manual.md +61 -12
  9. package/host/omo-bridge/agent-control.ts +274 -0
  10. package/host/omo-bridge/bridge.ts +1 -1
  11. package/host/omo-bridge/continuity-control.ts +1 -1
  12. package/host/omo-bridge/task-control.ts +26 -16
  13. package/host/omo-check/patches/omo-5.1.51-compaction-long-context.patch +92 -0
  14. package/host/omo-check/patches/omo-5.1.51-compaction-port.patch +2635 -0
  15. package/host/omo-check/patches/omo-5.1.51-compaction-recovery.patch +911 -0
  16. package/host/omo-check/patches/omo-5.1.51-gateway-port.manifest.json +363 -0
  17. package/host/omo-check/patches/omo-5.1.51-provider-failover.patch +50 -0
  18. package/host/omo-check/patches/omo-5.1.51-provider-port.patch +441 -0
  19. package/host/omo-check/patches/omo-5.1.51-rpc-port.patch +799 -0
  20. package/host/omo-check/patches/omo-5.1.51-runtime-compat.patch +31 -0
  21. package/package.json +3 -2
  22. package/src/agent/api.ts +215 -0
  23. package/src/agent/definition.ts +177 -0
  24. package/src/agent/fields.ts +42 -0
  25. package/src/agent/files.ts +192 -0
  26. package/src/agent/legacy-files.ts +46 -0
  27. package/src/agent/list.ts +21 -0
  28. package/src/agent-rules.ts +97 -13
  29. package/src/approvals.ts +6 -1
  30. package/src/cli/doctor.ts +7 -0
  31. package/src/cli/main.ts +38 -0
  32. package/src/cli/messages.ts +10 -2
  33. package/src/cli/rotate-main.ts +2 -1
  34. package/src/cli/rules.ts +70 -0
  35. package/src/cli/scan.ts +414 -0
  36. package/src/cli/security-import.ts +155 -0
  37. package/src/compact.ts +22 -0
  38. package/src/decisions.ts +6 -4
  39. package/src/engine/compat.json +3 -3
  40. package/src/engine/index.ts +1 -0
  41. package/src/engine/schema-guard.ts +12 -4
  42. package/src/engine/sdk.ts +8 -0
  43. package/src/formal-verification.ts +366 -0
  44. package/src/gc.ts +37 -6
  45. package/src/hub.ts +339 -79
  46. package/src/main.ts +95 -9
  47. package/src/maintenance.ts +1 -1
  48. package/src/manual.ts +9 -2
  49. package/src/profile-prompt.ts +73 -0
  50. package/src/profile.ts +33 -10
  51. package/src/protocol.ts +11 -2
  52. package/src/question-notifications.ts +4 -1
  53. package/src/reply-notifications.ts +7 -1
  54. package/src/repo-security-setting.ts +33 -0
  55. package/src/runtime/paths.ts +16 -0
  56. package/src/security/baseline.ts +172 -0
  57. package/src/security/dex-strings.ts +242 -0
  58. package/src/security/repo-scan.ts +369 -0
  59. package/src/security/revision-probe.ts +144 -0
  60. package/src/security/terms.ts +97 -0
  61. package/src/security-allow.ts +1 -0
  62. package/src/security-baseline.ts +113 -0
  63. package/src/security-check.ts +91 -16
  64. package/src/server-text.ts +38 -0
  65. package/src/store.ts +142 -16
  66. package/src/transcript.ts +7 -1
  67. package/src/ui-language.ts +33 -0
  68. package/src/update/check.ts +7 -3
  69. package/src/update/handoff-system.ts +24 -16
  70. package/src/update/handoff.ts +23 -12
  71. package/src/update/helper.ts +72 -36
  72. package/src/update/request.ts +46 -30
  73. package/src/update/state.ts +21 -11
  74. package/src/update/strategy.ts +12 -5
  75. package/src/update/target.ts +32 -15
  76. package/src/usage.ts +43 -20
  77. package/src/version.ts +39 -16
  78. package/src/voice/agents.ts +8 -3
  79. package/src/voice/install.ts +29 -18
  80. package/src/work-watch.ts +40 -18
  81. package/web/agent-icon.js +15 -9
  82. package/web/agents.d.ts +201 -0
  83. package/web/agents.js +813 -0
  84. package/web/app-download.js +32 -19
  85. package/web/app.js +1407 -278
  86. package/web/autocopy.js +6 -1
  87. package/web/boot.js +27 -8
  88. package/web/commands.js +20 -11
  89. package/web/decisions.js +70 -49
  90. package/web/devlog.js +25 -19
  91. package/web/diagram.js +8 -3
  92. package/web/enroll.js +43 -22
  93. package/web/gc.js +32 -19
  94. package/web/i18n/agent-icon.js +24 -0
  95. package/web/i18n/agents.js +48 -0
  96. package/web/i18n/app-download.js +26 -0
  97. package/web/i18n/autocopy.js +5 -0
  98. package/web/i18n/boot.js +24 -0
  99. package/web/i18n/commands.js +34 -0
  100. package/web/i18n/decisions.js +24 -0
  101. package/web/i18n/devlog.js +60 -0
  102. package/web/i18n/diagram.js +12 -0
  103. package/web/i18n/enroll.js +22 -0
  104. package/web/i18n/gc.js +38 -0
  105. package/web/i18n/lastsent.js +10 -0
  106. package/web/i18n/main.d.ts +4 -0
  107. package/web/i18n/main.js +527 -0
  108. package/web/i18n/manual.d.ts +4 -0
  109. package/web/i18n/manual.js +14 -0
  110. package/web/i18n/memo.js +30 -0
  111. package/web/i18n/notifications.js +16 -0
  112. package/web/i18n/profile.js +13 -0
  113. package/web/i18n/reference.js +26 -0
  114. package/web/i18n/security-inbox.js +40 -0
  115. package/web/i18n/slash.js +38 -0
  116. package/web/i18n/turn-stats.js +5 -0
  117. package/web/i18n/update.js +42 -0
  118. package/web/i18n/voice.js +28 -0
  119. package/web/i18n/wake.js +16 -0
  120. package/web/i18n/workid.js +10 -0
  121. package/web/i18n/workstatus.js +20 -0
  122. package/web/i18n.d.ts +20 -0
  123. package/web/i18n.js +63 -0
  124. package/web/index.html +156 -96
  125. package/web/lastsent.js +9 -4
  126. package/web/manual.d.ts +1 -1
  127. package/web/manual.js +11 -5
  128. package/web/memo.js +18 -13
  129. package/web/notifications.js +12 -7
  130. package/web/profile.js +42 -17
  131. package/web/reference.js +20 -15
  132. package/web/security-inbox.d.ts +18 -1
  133. package/web/security-inbox.js +173 -4
  134. package/web/slash.js +23 -13
  135. package/web/style.css +132 -3
  136. package/web/tooltip.js +5 -2
  137. package/web/turn-stats.js +6 -2
  138. package/web/update.js +31 -23
  139. package/web/voice.js +18 -8
  140. package/web/wake.d.ts +4 -0
  141. package/web/wake.js +7 -3
  142. package/web/workid.js +12 -2
  143. package/web/workstatus.js +36 -32
package/README.ko.md CHANGED
@@ -97,7 +97,7 @@ zigmini는 에이전트를 권한 프리셋 `full-access`로 실행합니다.
97
97
  - 결과가 여전히 `zsh: command not found: zigmini`이면 설치를 멈춥니다. `ls "$(bun pm bin -g)"`를 실행합니다. 결과에 `zigmini`가 없으면 8번의 `bun add -g zigmini` 출력에서 `error:`로 시작하는 줄을 확인합니다.
98
98
  15. 에이전트 엔진 `omo-ai`를 전역 설치합니다. 필수 단계입니다. `omo-ai` 설치와 모델 계정 로그인이 없으면 게이트웨이가 동작하지 않습니다. 15~18번을 건너뛰면 `zigmini setup`이 전역 `omo`를 직접 설치하고 로그인 단계에서 기다리지만, 로그인은 직접 해야 합니다. 그래도 여기의 단계를 먼저 합니다. 버전은 게이트웨이가 고정한 stock 버전에 맞춥니다(`src/engine/compat.json`의 `omo`, 0.9.0-beta.3은 5.1.48이며 설치된 릴리스는 자체 고정값을 유지합니다).
99
99
  ```sh
100
- bun add -g omo-ai@5.1.48
100
+ bun add -g omo-ai@5.1.51
101
101
  ```
102
102
  16. 셸이 `omo` 명령을 찾는지 확인합니다. 결과는 버전 한 줄이어야 합니다.
103
103
  ```sh
@@ -118,7 +118,7 @@ zigmini는 에이전트를 권한 프리셋 `full-access`로 실행합니다.
118
118
  1. 언어를 묻습니다: `Language / 언어 [1] English [2] 한국어`. 그 뒤의 안내는 모두 고른 언어로 나옵니다. 고른 언어는 `~/.zigmini/language`에 저장되고 `zigmini setup --access`, `zigmini pair`, `zigmini start`·`restart`의 준비 대기도 이 언어를 씁니다. `--lang en|ko`로 묻지 않고 정할 수 있습니다. 묻지 않는 설치(`--non-interactive`)는 저장된 언어, 없으면 시스템 언어(`LANG`이 `ko…`이면 한국어), 그것도 없으면 영어를 씁니다.
119
119
  2. 권한 안내를 보여 주고 동의를 받습니다.
120
120
  3. 홈 폴더 `~/.zigmini`를 만듭니다. 이 설치의 규칙 파일(`~/.zigmini/rules.md`)이 없으면 빈 파일을 만듭니다. 아래 "에이전트 규칙"을 보세요.
121
- 4. 에이전트 엔진(omo-ai)의 고정 버전을 내려받아 해시를 확인하고 패치합니다. 버전은 패키지가 정합니다(`src/engine/compat.json`, 이 문서를 쓸 때 엔진 5.1.48). 엔진 라이선스 요약을 보여 주고 동의(`y`)를 받습니다.
121
+ 4. 에이전트 엔진(omo-ai)의 고정 버전을 내려받아 해시를 확인하고 패치합니다. 버전은 패키지가 정합니다(`src/engine/compat.json`, 이 문서를 쓸 때 엔진 5.1.51). 엔진 라이선스 요약을 보여 주고 동의(`y`)를 받습니다.
122
122
  5. 전역 `omo` 명령을 `bun add -g omo-ai@<버전>`으로 설치합니다. 버전은 고정 엔진과 같은 stock 버전입니다. 전역 `omo`가 이미 그 버전이면 설치를 건너뜁니다. 다른 버전이면 `<버전>으로 덮어쓸까요? (y/N)`를 묻습니다. 묻지 않는 설치는 있는 버전을 유지합니다. 설치에 실패하면 고정 엔진의 긴 명령을 로그인 명령으로 보여 줍니다.
123
123
  6. 에이전트 폴더와 모델 계정 로그인 상태를 확인합니다. 기본 에이전트 폴더는 `~/.omo/agent`이고, 같은 폴더를 쓰는 다른 OMO와 로그인 정보를 같이 씁니다. 로그인하지 않았으면 아래 상자를 보이고 기다립니다.
124
124
  ```text
@@ -195,6 +195,24 @@ F0:AB:B3:B2:DC:70:1A:45:19:85:69:7D:58:68:F5:FB:4F:AC:33:4F:D8:6A:68:DD:04:5C:53
195
195
 
196
196
  사용자 매뉴얼([한국어](docs/manual.ko.md), [English](docs/manual.md))은 웹 설정 창 위쪽의 "매뉴얼" 버튼과, 앱 헤더의 상태 태그를 짧게 눌러 여는 연결 화면의 "매뉴얼" 버튼으로 봅니다.
197
197
 
198
+ ## 1.0.0-beta.2의 새 기능
199
+
200
+ 1.0.0-beta.2(2026-11-03 KST, Android `versionCode` 31)는 핫픽스입니다. 엔진은 바뀌지 않습니다(`5.1.51-zgw.3`). 전체 노트: [docs/releases/1.0.0-beta.2.ko.md](docs/releases/1.0.0-beta.2.ko.md).
201
+
202
+ - **보안검사:** 보안 기준에 용어를 추가하지 않아도 `zigmini scan`이 동작합니다(버그 268).
203
+ - **에이전트 규칙:** 공통 규칙 항목마다 고정 ID가 있습니다. `~/.zigmini/rules.md`의 항목에 `<!--replaces:<id>-->`를 붙이면 그 공통 항목을 대신합니다. `zigmini rules check`로 파일을 확인합니다.
204
+
205
+ ## 1.0.0-beta.1의 새 기능
206
+
207
+ 1.0.0-beta.1(2026-11-02 KST, Android `versionCode` 30)은 1.0.0의 첫 후보입니다. 엔진 `5.1.51-zgw` 개정 3(OMO 5.1.51, 불변 빌드 `5.1.51-zgw.3`, senpi 2026.10.27-1, 대화 스키마 10)을 선택합니다. 전체 노트는 [docs/releases/1.0.0-beta.1.ko.md](docs/releases/1.0.0-beta.1.ko.md)에 있습니다.
208
+
209
+ - **에이전트:** 웹에서 특화 대화를 만듭니다. 대화마다 세션, 모델, 지식 폴더가 따로 있습니다.
210
+ - **보안 기준:** 설정 > 보안검사에 기준 하나를 두고, `zigmini scan`으로 어느 저장소든 검사합니다.
211
+ - **설정:** 검사와 형식 검증 스위치, 도구별 설치 버튼, 화면 언어(영어 또는 한국어) 하나.
212
+ - **채팅:** `/compact`가 생기고, 모든 세션이 프로필 닉네임을 압니다.
213
+ - **엔진 5.1.51:** 큰 요약이 1M 문맥 크레딧 거부로 실패하지 않습니다.
214
+ - **앱:** 스위치, 설치 버튼, 쪽지 화면에 새 APK가 필요합니다.
215
+
198
216
  ## 0.9.0-beta.3의 새 기능
199
217
 
200
218
  0.9.0-beta.3(2026-10-29 KST, Android `versionCode` 29)은 압축 실패로 main이 멈추는 문제를 고칩니다. 엔진 `5.1.48-zgw` 개정 3(OMO 5.1.48, 불변 빌드 `5.1.48-zgw.3`, senpi 2026.10.25-2, 대화 스키마 10)을 선택합니다. 전체 노트는 [docs/releases/0.9.0-beta.3.ko.md](docs/releases/0.9.0-beta.3.ko.md)에 있습니다.
@@ -247,7 +265,11 @@ F0:AB:B3:B2:DC:70:1A:45:19:85:69:7D:58:68:F5:FB:4F:AC:33:4F:D8:6A:68:DD:04:5C:53
247
265
 
248
266
  값이 나오면 게이트웨이가 메시지를 보류하고 보내지 않습니다. 엔진이 아니라 게이트웨이가 웹과 앱에 "보안검사 결과" 카드를 직접 보여 줍니다. 카드에는 걸린 값마다 종류, 실제 값, 메시지 안의 줄과 칸이 보이고 "이 값들을 노출해도 되겠습니까?"라고 묻습니다. "보내기"를 누르면 원래 메시지를 그대로 엔진에 보냅니다. "보내지 않기"를 누르면 메시지를 버리고, 웹은 글을 입력창에 되돌려 고칠 수 있게 합니다. 걸린 값은 엔진, 엔진 세션 파일, 대화 기록, 로그에 들어가지 않습니다. 보류한 메시지는 게이트웨이 메모리에만 있습니다. 게이트웨이가 다시 시작하면 보내지 않고 버리며, 웹 카드에 그렇게 표시됩니다.
249
267
 
250
- 보안검사는 기본으로 켜져 있습니다. 웹 설정의 "보안검사 켜짐/꺼짐" 버튼으로 끄고 켭니다. 설정은 `~/.zigmini/data/security-check`에 저장되어 재시작 뒤에도 유지됩니다. 끄면 검사 없이 바로 엔진에 보냅니다. 검사가 찾는 종류의 목록은 [docs/security-check.md](docs/security-check.md)에 있습니다.
268
+ 보안검사는 기본으로 켜져 있습니다. 웹이나 앱 설정의 "엔진으로 가는 메시지 검사" 스위치로 끄고 켭니다. 설정은 `~/.zigmini/data/security-check`에 저장되어 재시작 뒤에도 유지됩니다. 끄면 검사 없이 바로 엔진에 보냅니다. 검사가 찾는 종류의 목록은 [docs/security-check.md](docs/security-check.md)에 있습니다. 설정 항목마다 짧은 요약이 보이고, 정보 아이콘으로 상세 설명을 봅니다(웹은 툴팁, 앱은 창). 설정 문구는 설정의 "언어"에서 고른 화면 언어를 따릅니다(기본 영어).
269
+
270
+ 웹 설정에는 스위치가 두 개 더 있습니다(개선 250). 보안검사 묶음의 "결과물 검사"(기본 켜짐)은 작업 결과물 검사를 켜고 끕니다. `zigmini scan`이 비밀값처럼 보인 값과 보안 기준에 지정한 값을 찾아 GitHub 같은 외부로 나가지 않게 합니다. 켜져 있으면 새 main·작업·에이전트 세션의 규칙에 "머지 전에 검사한다"는 의무도 들어갑니다. 끄면 `zigmini scan`이 검사하지 않고 종료 코드 4로 끝나며, 새 세션 규칙에서 그 의무가 빠집니다. 엔진으로 가는 메시지 검사는 따로 켜고 끕니다. "dev 머지 전 보안검사 필수"는 운영자의 운영 규칙이고 게이트웨이 기능이 아닙니다. 이 저장소의 `test:all` 보안검사는 이 스위치와 관계없이 돕니다. "형식 검증"은 설정 묶음 제목이고, 그 아래에 도구마다 한 줄이 있습니다(지금은 TLA+/TLC 1.7.4). 도구 스위치는 그 도구가 설치된 뒤 검사(`bun run formal:check`)에 쓸지만 정합니다. 스위치를 켜도 설치하지 않습니다. 설치되지 않은 도구는 "설치 안 됨"과 "설치" 버튼을 보입니다. "설치"를 누르면 게이트웨이가 그 도구만 설치합니다. Homebrew로 `openjdk@21`을 설치하고(`brew link` 없음, 시스템 java 그대로) tla2tools.jar 1.7.4를 크기와 SHA-256으로 확인해 `~/.zigmini/formal-tools`에 받습니다. 설치하는 동안 그 줄에는 "설치 중…"이 보입니다. 설치가 실패하면 "설치 실패"와 원인이 보이고 "설치" 버튼이 다시 나타납니다. Homebrew가 없으면 원인에 https://brew.sh 에서 Homebrew를 설치한 뒤 설치를 다시 누르라는 안내가 나옵니다. "설치"를 누르기 전에는 아무것도 설치하지 않습니다. 업데이트 전에 형식 검증 전체 설정이 꺼져 있었다면 업데이트 뒤에도 모든 도구 스위치가 꺼진 채로 남습니다.
271
+
272
+ 같은 규칙으로 저장소도 검사합니다. 게이트웨이는 보안 기준 하나를 갖습니다. 웹 설정의 "보안 기준"에 넣은 용어와, 게이트웨이가 스스로 더하는 이 맥의 홈 경로와 계정 이름입니다. 게이트웨이는 기준을 `~/.zigmini/secrets/security-baseline.json`으로 내보냅니다. Git 저장소에서 `zigmini scan`(또는 `zigmini scan <저장소>`)을 실행하면 추적 파일과 작업 브랜치·`dev`의 Git 객체를 검사합니다. 종료 코드는 0 발견 없음, 1 발견 있음, 2 입력·실행 오류, 3 기준 없음·비어 있음·낡음입니다. 기억한 값은 "저장소 검사에도 허용"을 켜야만 저장소 검사를 통과합니다. 옛 평문 목록은 게이트웨이가 켜진 상태에서 `zigmini security import-baseline`으로 기준에 가져옵니다. 자세한 내용은 [docs/security-check.md](docs/security-check.md#보안-기준과-zigmini-scan)에 있습니다.
251
273
 
252
274
  ## 업데이트
253
275
 
@@ -290,10 +312,13 @@ zigmini update <버전> # 지정한 버전으로 업데이트
290
312
  | `zigmini rotate-main [--restart] [--wait <초>] [--foreground]` | main 대화를 새 엔진 세션으로 교체합니다. 웹의 "새 세션"과 같은 요청입니다. 분리 실행하고 결과는 `~/.zigmini/logs/rotate-main.log`에 남깁니다. `--restart`는 게이트웨이를 먼저 멈추고 다시 켭니다 |
291
313
  | `zigmini migrate` | 옛 Docker 설치(`~/.zigmini-gateway`)를 새 구조로 복사합니다. 옛 폴더는 바꾸지 않습니다 |
292
314
  | `zigmini migrate-run` | 유휴를 기다리고, 옛 실행을 멈추고, 백업하고, migrate와 setup을 실행한 뒤 확인합니다. 실패하면 옛 실행으로 되돌립니다 |
315
+ | `zigmini scan [<저장소>] [--scope all\|tracked\|git] [--json] [--out <파일>]` | 보안 기준으로 저장소를 검사합니다(종료 코드 0 깨끗함, 1 발견, 2 오류, 3 기준 사용 불가) |
316
+ | `zigmini security import-baseline [--from <파일>] [--dry-run]` | 평문 목록의 값을 켜진 게이트웨이를 통해 보안 기준에 더합니다. 건수만 출력합니다 |
293
317
  | `zigmini --version` | 설치된 버전을 출력합니다 |
294
318
  | `zigmini --help` | 도움말을 출력합니다 |
295
319
 
296
320
  채팅에서 `/usage`를 보내면 게이트웨이가 로그인한 모델 계정의 사용량을 바로 답합니다.
321
+ 게이트웨이 채팅에서 `/compact`를 보내면 게이트웨이가 대화 요약을 바로 시작합니다. `/compact 결정 사항 위주로`처럼 뒤에 쓴 글은 요약의 추가 지시가 됩니다. 답변, 다른 요약, 모델 요청 재시도, 세션 교체가 진행 중이거나 엔진 연결이 끊겨 있으면 게이트웨이가 요청을 거부하고 짧은 안내를 보입니다. 거부한 요청은 대기열에 넣지 않습니다.
297
322
 
298
323
  ## 에이전트 규칙
299
324
 
@@ -302,8 +327,15 @@ zigmini update <버전> # 지정한 버전으로 업데이트
302
327
  - 패키지의 `assets/agent/gateway-rules.md`: 모든 설치에 공통인 규칙입니다. 업데이트가 바꿉니다.
303
328
  - `~/.zigmini/rules.md`: 이 설치에만 쓰는 규칙(예: 호칭, 언어, 계정)입니다. 사용자가 직접 고칩니다. 두 파일이 부딪치면 이 파일이 이깁니다.
304
329
 
330
+ 공통 규칙 항목 바꾸기: 공통 규칙 파일의 각 항목에는 주석으로 고정 ID가 있습니다(예: `<!--id:f2468e-->`). ID는 항목을 만들 때 한 번 정하고, 문장을 고쳐도 바뀌지 않습니다. 항목 번호는 읽는 순서일 뿐이고 우선순위가 아닙니다. 공통 항목 하나를 통째로 바꾸려면 `rules.md`의 항목 안에 `<!--replaces:<ID>-->`를 적습니다. 그러면 게이트웨이는 그 공통 항목을 빼고 `rules.md`의 항목을 씁니다. `replaces`가 없는 항목은 지금처럼 새 규칙으로 공통 규칙 뒤에 붙고, 부딪치면 `rules.md`가 이깁니다. 적은 ID가 공통 규칙에 없으면(예: 업데이트로 사라짐) 그 항목은 새 규칙으로 붙고 `zigmini doctor`가 경고를 보여 줍니다.
331
+
332
+ - `zigmini rules`: 공통 항목의 번호, ID, 첫 줄을 보여 줍니다.
333
+ - `zigmini rules check`: `rules.md`의 각 항목이 "공통 N번을 대체", "신규 규칙", "없는 ID" 중 무엇인지 보여 줍니다(없는 ID가 있으면 종료 코드 1).
334
+
305
335
  바꾼 뒤에 열리는 세션부터 새 내용을 씁니다. 바로 적용하려면 쉬는 때 `zigmini restart bridge`를 실행합니다.
306
336
 
337
+ 브리지는 차례마다 모든 세션에 프로필 닉네임도 알려 줍니다. 그래서 닉네임을 위한 규칙은 필요하지 않습니다. main, 작업, 에이전트 세션이 모두 받습니다. main은 기본 에이전트 이름도 받고, 각 에이전트는 만들거나 편집할 때 정한 자기 이름을 받습니다. 바꾼 닉네임과 이름은 다음 차례부터 적용됩니다. 닉네임이 기본값("Me" 또는 "나")이면 세션은 닉네임이 없다는 안내를 받습니다.
338
+
307
339
  ## 문제 해결
308
340
 
309
341
  1. 상태를 봅니다.
@@ -331,7 +363,7 @@ zigmini update <버전> # 지정한 버전으로 업데이트
331
363
  ```sh
332
364
  zigmini setup --access lan # 또는 tailscale, domain --domain https://<도메인>
333
365
  ```
334
- - **설치 뒤 에이전트가 답하지 않습니다.** 모델 계정에 로그인하지 않았습니다(예: 로그인 단계에서 `s`를 입력함). 설치 15~18번(`bun add -g omo-ai@5.1.48`, `omo`, `/login`)을 합니다. 그 뒤 `zigmini setup`을 다시 실행합니다. "모델 계정: 로그인됨"이 나오고, 이미 끝난 단계는 유지됩니다. `--agent-dir`을 쓰면 `OMO_CODING_AGENT_DIR=<경로> omo`로 실행해야 그 폴더에 로그인됩니다.
366
+ - **설치 뒤 에이전트가 답하지 않습니다.** 모델 계정에 로그인하지 않았습니다(예: 로그인 단계에서 `s`를 입력함). 설치 15~18번(`bun add -g omo-ai@5.1.51`, `omo`, `/login`)을 합니다. 그 뒤 `zigmini setup`을 다시 실행합니다. "모델 계정: 로그인됨"이 나오고, 이미 끝난 단계는 유지됩니다. `--agent-dir`을 쓰면 `OMO_CODING_AGENT_DIR=<경로> omo`로 실행해야 그 폴더에 로그인됩니다.
335
367
  - 오래된 DB 백업, 쓰지 않는 엔진 버전, 업데이트에서 남은 파일은 웹 화면 설정의 "정리"에서 확인하고, 고른 항목만 지웁니다.
336
368
 
337
369
  ## 제거
package/README.md CHANGED
@@ -97,7 +97,7 @@ The gateway runs the agent with the permission preset `full-access`. The agent d
97
97
  - If the result is still `zsh: command not found: zigmini`, stop the installation. Run `ls "$(bun pm bin -g)"`. If the result does not contain `zigmini`, look for lines that start with `error:` in the output of `bun add -g zigmini` in step 8.
98
98
  15. Install the agent engine `omo-ai` globally. This step is required: without the `omo-ai` installation and the model account login, the gateway does not work. If you skip steps 15 to 18, `zigmini setup` installs the global `omo` itself and stops at the login step, but you must still log in. Do the steps here anyway. Use the stock version that the gateway pins (`omo` in `src/engine/compat.json`; 5.1.48 in 0.9.0-beta.3; installed releases keep their own pin).
99
99
  ```sh
100
- bun add -g omo-ai@5.1.48
100
+ bun add -g omo-ai@5.1.51
101
101
  ```
102
102
  16. Check that the shell finds the `omo` command. The result must be one version line.
103
103
  ```sh
@@ -118,7 +118,7 @@ The gateway runs the agent with the permission preset `full-access`. The agent d
118
118
  1. It asks for the language: `Language / 언어 [1] English [2] 한국어`. All later messages use this language. The choice is saved in `~/.zigmini/language` and used by `zigmini setup --access`, `zigmini pair` and the ready wait of `zigmini start` and `restart`. `--lang en|ko` picks it without the question. Without a question (`--non-interactive`) the saved language is used, else the system language (`LANG`, `ko…` means Korean), else English.
119
119
  2. It shows the permission notice and asks for your consent.
120
120
  3. It creates the home folder `~/.zigmini`. If the rules file of this installation (`~/.zigmini/rules.md`) does not exist, it creates an empty one. See "Agent rules" below.
121
- 4. It downloads the pinned version of the agent engine (omo-ai), checks its hash and patches it. The package decides the version (`src/engine/compat.json`; engine 5.1.48 at the time of writing). It shows a summary of the engine license and asks for your consent (`y`).
121
+ 4. It downloads the pinned version of the agent engine (omo-ai), checks its hash and patches it. The package decides the version (`src/engine/compat.json`; engine 5.1.51 at the time of writing). It shows a summary of the engine license and asks for your consent (`y`).
122
122
  5. It installs the global `omo` command with `bun add -g omo-ai@<version>`, the same stock version as the pinned engine. If the global `omo` already has this version, it skips the installation. If it has another version, it asks `Replace it with <version>? (y/N)`; without a question it keeps the installed one. If the installation fails, it shows the long command of the pinned engine for the login instead.
123
123
  6. It checks the agent folder and the login state of the model account. The default agent folder is `~/.omo/agent`. Other OMO installations that use the same folder share the login data. If you are not logged in, it shows this box and waits:
124
124
  ```text
@@ -195,6 +195,24 @@ F0:AB:B3:B2:DC:70:1A:45:19:85:69:7D:58:68:F5:FB:4F:AC:33:4F:D8:6A:68:DD:04:5C:53
195
195
 
196
196
  The user manual ([English](docs/manual.md), [한국어](docs/manual.ko.md)) opens from the "매뉴얼" (Manual) button at the top of the web settings dialog, and in the app from the "매뉴얼" button on the connection screen that a short press on the header status tag opens.
197
197
 
198
+ ## What's new in 1.0.0-beta.2
199
+
200
+ Release 1.0.0-beta.2 (2026-11-03 KST, Android `versionCode` 31) is a hotfix. The engine is unchanged (`5.1.51-zgw.3`). Full notes: [docs/releases/1.0.0-beta.2.md](docs/releases/1.0.0-beta.2.md).
201
+
202
+ - **Security check:** `zigmini scan` now works when you have not added any baseline terms (bug 268).
203
+ - **Agent rules:** common rules have fixed ids; an item in `~/.zigmini/rules.md` can replace one with `<!--replaces:<id>-->`. Check your file with `zigmini rules check`.
204
+
205
+ ## What's new in 1.0.0-beta.1
206
+
207
+ Release 1.0.0-beta.1 (2026-11-02 KST, Android `versionCode` 30) is the first candidate for 1.0.0. It selects engine `5.1.51-zgw` revision 3 (OMO 5.1.51, immutable build `5.1.51-zgw.3`, senpi 2026.10.27-1, thread schema 10). Full notes: [docs/releases/1.0.0-beta.1.md](docs/releases/1.0.0-beta.1.md).
208
+
209
+ - **Agents:** make your own specialist chats on the web, each with its own session, model and knowledge folder.
210
+ - **Security baseline:** one baseline in Settings > Security check, and `zigmini scan` for any repository.
211
+ - **Settings:** switches for checks and formal verification, per-tool Install buttons, and one UI language (English or Korean).
212
+ - **Chat:** `/compact`, and every session knows your profile nickname.
213
+ - **Engine 5.1.51:** large summaries no longer fail on the 1M-context credit refusal.
214
+ - **App:** new APK for switches, Install buttons and the memo layout.
215
+
198
216
  ## What's new in 0.9.0-beta.3
199
217
 
200
218
  Release 0.9.0-beta.3 (2026-10-29 KST, Android `versionCode` 29) fixes failed compactions that could leave main stuck. It selects engine `5.1.48-zgw` revision 3 (OMO 5.1.48, immutable build `5.1.48-zgw.3`, senpi 2026.10.25-2, thread schema 10). Full notes: [docs/releases/0.9.0-beta.3.md](docs/releases/0.9.0-beta.3.md).
@@ -248,7 +266,11 @@ Before the gateway hands a message to the engine, it checks the message for valu
248
266
 
249
267
  When it finds something, the gateway holds the message and does not send it. The gateway itself (not the engine) shows a "보안검사 결과" (security check result) card on the web and in the app. The card lists each value with its kind and its line and column in the message, and asks whether these values may be exposed. "보내기" (send) sends the original message to the engine unchanged. "보내지 않기" (don't send) drops it, and the web puts the text back into the input box so you can fix it. The values never reach the engine, its session files, the conversation history or the logs. Held messages live only in gateway memory: a gateway restart drops them without sending them, and the web card then says so.
250
268
 
251
- The check is on by default. Turn it off or on with "보안검사 켜짐/꺼짐" (Security check on/off) in the web settings. The setting is stored in `~/.zigmini/data/security-check` and survives a restart. With the check off, messages go to the engine without a check. The list of kinds that the check finds is in [docs/security-check.md](docs/security-check.md).
269
+ The check is on by default. Turn it off or on with the "Message check before the engine" switch in the web or app settings. The setting is stored in `~/.zigmini/data/security-check` and survives a restart. With the check off, messages go to the engine without a check. The list of kinds that the check finds is in [docs/security-check.md](docs/security-check.md). Each setting shows a short summary; the info icon shows the full description (a tooltip on the web, a dialog in the app). Settings text follows the screen language picked under "Language" in settings (English by default).
270
+
271
+ Two more switches sit in the web settings (improvement 250). In the security check group, "Output check" (on by default) controls the check of work output: `zigmini scan` finds secret-like values and the values in the security baseline so they do not leak to GitHub or other outside places, and new main, work and agent sessions get the rule to run it before a merge. Off makes `zigmini scan` stop without scanning (exit code 4) and removes that rule from new sessions. The check of messages to the engine has its own switch. A "pass the security check before a dev merge" duty is an operator rule, not a gateway feature: this repository's `test:all` security checks run regardless of this switch. "Formal verification" is a settings group title with one row per tool (TLA+/TLC 1.7.4 today). Each tool's switch chooses whether checks (`bun run formal:check`) use that tool once it's installed; the switch never installs anything. A tool that isn't installed shows "Not installed" and an "Install" button. Pressing Install installs only that tool: `openjdk@21` with Homebrew (no `brew link`, the system java stays) and tla2tools.jar 1.7.4, checked by size and SHA-256, into `~/.zigmini/formal-tools`. While it runs, the row shows "Installing…". A failed install shows "Install failed", the cause and the Install button again. Without Homebrew, the cause tells you to install Homebrew from https://brew.sh and press Install again. Nothing is installed until you press Install. If your old overall formal verification switch was off, every tool switch stays off after the update.
272
+
273
+ The same rules also check repositories. The gateway keeps one security baseline: terms you add under "보안 기준" (security baseline) in the web settings, plus this Mac's home path and account name, which it adds by itself. It exports the baseline to `~/.zigmini/secrets/security-baseline.json`. Run `zigmini scan` in a Git repository (or `zigmini scan <repo>`) to check its tracked files and the Git objects of the work branch and `dev`. Exit codes: 0 no findings, 1 findings, 2 input or run error, 3 baseline missing, empty or out of date. A remembered value passes the repository scan only when "저장소 검사에도 허용" (also allow in repository scan) is on for it. To move an old plain-text list into the baseline, run `zigmini security import-baseline` while the gateway runs. Details: [docs/security-check.md](docs/security-check.md#보안-기준과-zigmini-scan).
252
274
 
253
275
  ## Update
254
276
 
@@ -291,10 +313,13 @@ An update to a version that does not support the zero-downtime switch (including
291
313
  | `zigmini rotate-main [--restart] [--wait <초>] [--foreground]` | Moves the main conversation to a fresh engine session, like "새 세션" (New session) in the web. Runs detached and logs to `~/.zigmini/logs/rotate-main.log`. `--restart` stops and starts the gateway first (`<초>`: seconds) |
292
314
  | `zigmini migrate` | Copies an old Docker installation (`~/.zigmini-gateway`) to the new layout. The old folder is not changed |
293
315
  | `zigmini migrate-run` | Waits until idle, stops the old runtime, backs up, runs migrate and setup, then checks. If this fails, it goes back to the old runtime |
316
+ | `zigmini scan [<repo>] [--scope all\|tracked\|git] [--json] [--out <file>]` | Checks a repository against the security baseline (exit 0 clean, 1 findings, 2 error, 3 baseline unusable) |
317
+ | `zigmini security import-baseline [--from <file>] [--dry-run]` | Adds the values of a plain-text list to the security baseline through the running gateway. Prints counts only |
294
318
  | `zigmini --version` | Prints the installed version |
295
319
  | `zigmini --help` | Prints the help |
296
320
 
297
321
  When you send `/usage` in the chat, the gateway replies at once with the usage of the logged-in model account.
322
+ Send `/compact` in a gateway chat to summarize the conversation right away. Text after it, like `/compact focus on decisions`, becomes extra instructions for the summary. It's refused with a short notice, and not queued, while an answer, another summary, a model retry or a session replacement is running, or while the engine is disconnected.
298
323
 
299
324
  ## Agent rules
300
325
 
@@ -303,8 +328,15 @@ The bridge appends two rule files after the instructions of each agent session.
303
328
  - `assets/agent/gateway-rules.md` in the package: rules common to all installations. An update changes it.
304
329
  - `~/.zigmini/rules.md`: rules only for this installation (for example the form of address, the language, accounts). You edit it yourself. When the two files conflict, this file wins.
305
330
 
331
+ Replacing a common rule item: each item in the common rules file has a fixed id in a comment (for example `<!--id:f2468e-->`). The id is set once when the item is made and stays the same when its text changes. The item numbers are only a reading order, not a priority. To replace a whole common item, put `<!--replaces:<id>-->` inside an item of `rules.md`. The gateway then leaves out that common item and uses your item. An item without `replaces` is a new rule and goes after the common rules, as before; `rules.md` still wins on a conflict. If an id no longer exists in the common rules (for example after an update), the item is added as a new rule and `zigmini doctor` shows a warning.
332
+
333
+ - `zigmini rules`: lists the common items with number, id and first line.
334
+ - `zigmini rules check`: shows each `rules.md` item as "replaces common N", "new rule" or "unknown id" (exit code 1 when an unknown id exists).
335
+
306
336
  Sessions that open after a change use the new content. To apply it at once, run `zigmini restart bridge` while nothing is running.
307
337
 
338
+ The bridge also tells every session your profile nickname at each turn, so you don't need a rule for it. Main, work and agent sessions get it. Main also gets the default agent name, and each agent gets the name you gave it when you created or edited it. A changed nickname or name applies from the next turn. While the nickname is the default ("Me" or "나"), sessions are told that no nickname is set.
339
+
308
340
  ## Troubleshooting
309
341
 
310
342
  1. Look at the state.
@@ -332,7 +364,7 @@ Use these workarounds.
332
364
  ```sh
333
365
  zigmini setup --access lan # or tailscale, or domain --domain https://<도메인>
334
366
  ```
335
- - **After the installation the agent does not answer.** The model account is not logged in (for example you typed `s` at the login step). Do install steps 15 to 18 (`bun add -g omo-ai@5.1.48`, `omo`, `/login`). Then run `zigmini setup` again. It shows "Model accounts: logged in" and keeps the steps that are already done. If you use `--agent-dir`, start `omo` with `OMO_CODING_AGENT_DIR=<경로> omo` so that it logs in to that folder.
367
+ - **After the installation the agent does not answer.** The model account is not logged in (for example you typed `s` at the login step). Do install steps 15 to 18 (`bun add -g omo-ai@5.1.51`, `omo`, `/login`). Then run `zigmini setup` again. It shows "Model accounts: logged in" and keeps the steps that are already done. If you use `--agent-dir`, start `omo` with `OMO_CODING_AGENT_DIR=<경로> omo` so that it logs in to that folder.
336
368
  - Old DB backups, unused engine versions and files left by updates appear in "정리" (Clean up) in the web screen settings. Only the items you select are deleted.
337
369
 
338
370
  ## Uninstall
@@ -1,27 +1,37 @@
1
1
  <!--
2
2
  zigmini 패키지 공통 에이전트 규칙입니다. 게이트웨이 브리지가 main과 작업 세션의 지시문 뒤에 붙입니다.
3
3
  업데이트하면 이 파일도 바뀝니다. 설치마다 다른 규칙은 홈 폴더의 rules.md에 씁니다.
4
+ 각 항목의 번호는 사람이 읽기 위한 순서일 뿐이고 우선순위가 아닙니다.
5
+ 각 항목 첫 줄의 id 주석(6자리 16진수)은 그 항목의 고정 ID입니다. 항목을 만들 때 한 번 정하고, 문장을 고쳐도 바꾸지 않습니다.
6
+ 새 항목에는 겹치지 않는 새 ID를 붙이고, 지운 항목의 ID는 다시 쓰지 않습니다.
7
+ 홈 폴더의 rules.md 항목에 replaces:<ID> 주석을 적으면 게이트웨이는 그 ID의 공통 항목을 통째로 빼고 rules.md 항목만 씁니다.
8
+ 목록은 zigmini rules, 대체 상태는 zigmini rules check로 봅니다.
4
9
  이 주석은 지시문에 붙지 않습니다.
5
10
  -->
6
- 1. 사용자의 답이나 허가가 필요하면 확인함 질문(ask_user_question)으로 묻습니다. 허가 질문과 필수 질문은 required를 true로 합니다. main은 질문을 올린 뒤에도 다음 메시지를 처리합니다. main에서는 waitForAnswer가 true여도 게이트웨이가 차례를 멈추지 않고 질문을 확인함에 열어 둡니다. 답은 나중에 사용자 메시지(ZGW_DECISION_COMMAND)로 옵니다. main은 필수 질문의 답이 올 때까지 그 질문에 걸린 일만 하지 않습니다. 작업 세션의 필수 질문은 waitForAnswer도 true로 해서, 답이 올 때까지 그 작업만 멈춥니다.
7
- 2. 질문은 사용자만 답할 수 있고 결과를 바꾸는 것만 남깁니다. 규칙, 기억, 이미 아는 사실로 답할 수 있거나 안전한 기본값이 있으면 묻지 않고 그 기본값을 적습니다. 여러 항목을 물을 때는 각 항목이 따로 정하는 결정인지, 하나를 고르는 것인지 먼저 밝힙니다. 선택지마다 결과를 적습니다.
8
- 3. 필수 확인 질문을 하면 답이 올 때까지 그 질문에 걸린 일을 멈춥니다. 필수가 아닌 질문은 시간이 지나면 판단대로 진행합니다.
9
- 4. 사용자의 질문은 정보 요청입니다. 확인해서 답만 하고, 진행 중인 작업 방식을 바꾸지 않습니다. 작업 방식은 명시적인 지시가 있을 때만 바꿉니다.
10
- 5. 기억이나 예정 메모만 보고 작업을 시작하지 않습니다. "이야기하고 있었다"는 대화를 이어 가라는 뜻입니다. 작업은 지금 대화의 명시적인 지시가 있을 때만 시작합니다.
11
- 6. 바로 답하지 못하는 차례에서는 첫 도구 호출 전에 프리코멘트를 한 번 보냅니다.
12
- 7. main의 할 일 목록에 위임한 작업의 할 일을 옮겨 적지 않습니다. 새 결과가 없는 관찰 알림(시작, 대기, 연결 상태 등)은 채팅에 올리지 않습니다. 같은 보고가 다시 오면 한 줄로만 알립니다.
13
- 8. 시험, 계약 테스트, 끝에서 끝 확인으로 띄운 게이트웨이, 브리지, OMO 자식 프로세스와 임시 폴더는 성공, 실패, 중단 모두에서 정리합니다. 코드 변경, 산출물, 검증 증거는 지우지 않습니다.
14
- 9. 웹 화면 확인에는 Bun.WebView와 WebKit을 쓰지 않습니다. 작업이 띄운 headless Chrome을 마이크·카메라 가짜 장치 옵션으로 쓰고, 끝나면 종료합니다. 사용자 브라우저를 쓸 때는 작업이 연 백그라운드 탭만 씁니다. 화면 흉내, 뷰포트 같은 설정은 작업 탭에만 걸고 탭을 닫기 전에 지웁니다.
15
- 10. 게이트웨이가 떠 있는 동안 운영 DB를 다른 프로세스로 열지 않습니다. 조회는 게이트웨이 API와 로그로 합니다.
16
- 11. 보고에는 증거가 있는 것만 씁니다. 확인된 것과 추정을 나눕니다. 코드 검토, 테스트 통과, dev 머지, 운영 배포, OMO 교체, 앱 설치를 구분하고 각각의 주체와 대상을 적습니다. 다시 시작한 뒤에는 짧은 "재시작 완료" 알림을 먼저 보냅니다.
17
- 12. 로컬 파일 경로를 웹 링크처럼 보여 주지 않습니다.
18
- 13. 사용자의 시간 표현은 사용자의 현지 시간으로 해석합니다. 보고하는 시각도 현지 시간으로 씁니다.
19
- 14. 사용자는 게이트웨이 프로필의 닉네임으로 부릅니다.
20
- 15. main은 오래 기다리거나 오래 실행하는 작업(배포, 전체 테스트, 뮤테이션 테스트, 다른 작업 기다리기)을 맡기면, 그 작업의 세션 기록이 30분 넘게 바뀌지 않을 때 main을 깨우는 감시를 직접 겁니다. 작업이 끝나면 감시를 끕니다. 작업의 "기다리는 중"·"진행 중" 보고만 믿지 않습니다. 사용자에게 그렇게 말하기 전에 그 작업의 마지막 기록 시각과 실행 중인 프로세스를 확인합니다. 작업이 멈췄으면 바로 그 작업에 조치를 보내고 사용자에게 알립니다. 작업은 긴 명령을 세션과 분리해 실행하고, 결과 파일을 직접 확인하며, 시간 상한을 겁니다.
21
- 16. 작업 하나에 나눌 수 있는 항목이 여럿이거나(예: 버그 여러 개, 구현·검증·문서 단계) 앞 단계를 기다려야 하는 단계가 있으면, 작업 세션은 mass-ulw 스킬을 씁니다. 작업 세션은 처음에 단계와 하위 작업을 정합니다. 서로 기다릴 필요가 없는 하위 작업은 최대한 병렬로 돌립니다. main은 이런 작업을 맡길 때 작업 지시문에 mass-ulw를 쓰라고 적습니다. 파일 하나 고침, 문서 한 줄 같은 작은 작업에는 mass-ulw를 쓰지 않습니다. 같은 파일을 고치는 하위 작업은 같은 단계에서 함께 돌리지 않습니다. 이런 하위 작업은 각자 worktree를 쓰거나 순서대로 돌립니다. 하위 작업을 병렬로 돌려도 무거운 명령(전체 테스트, 뮤테이션 테스트, 빌드 등)은 그 프로젝트나 설치 규칙이 정한 동시 실행 상한을 지킵니다. 규칙 8의 정리와 규칙 15의 감시는 하위 작업에도 적용합니다. 사용자가 질문만 하면 진행 중인 작업을 mass-ulw로 바꾸지 않습니다(규칙 4).
22
- 17. 모든 사용자용 글(main 답변, 작업 보고, 프리코멘트, 확인함 질문)에 ASD-STE100의 명확한 기술 글쓰기 원칙을 적용합니다.
11
+ 1. <!--id:3f9a21--> 사용자의 답이나 허가가 필요하면 확인함 질문(ask_user_question)으로 묻습니다. 허가 질문과 필수 질문은 required를 true로 합니다. main은 질문을 올린 뒤에도 다음 메시지를 처리합니다. main에서는 waitForAnswer가 true여도 게이트웨이가 차례를 멈추지 않고 질문을 확인함에 열어 둡니다. 답은 나중에 사용자 메시지(ZGW_DECISION_COMMAND)로 옵니다. main은 필수 질문의 답이 올 때까지 그 질문에 걸린 일만 하지 않습니다. 작업 세션의 필수 질문은 waitForAnswer도 true로 해서, 답이 올 때까지 그 작업만 멈춥니다.
12
+ 2. <!--id:b70c5e--> 질문은 사용자만 답할 수 있고 결과를 바꾸는 것만 남깁니다. 규칙, 기억, 이미 아는 사실로 답할 수 있거나 안전한 기본값이 있으면 묻지 않고 그 기본값을 적습니다. 여러 항목을 물을 때는 각 항목이 따로 정하는 결정인지, 하나를 고르는 것인지 먼저 밝힙니다. 선택지마다 결과를 적습니다.
13
+ 3. <!--id:4d28e6--> 필수 확인 질문을 하면 답이 올 때까지 그 질문에 걸린 일을 멈춥니다. 필수가 아닌 질문은 시간이 지나면 판단대로 진행합니다.
14
+ 4. <!--id:91ae07--> 사용자의 질문은 정보 요청입니다. 확인해서 답만 하고, 진행 중인 작업 방식을 바꾸지 않습니다. 작업 방식은 명시적인 지시가 있을 때만 바꿉니다.
15
+ 5. <!--id:c5f312--> 기억이나 예정 메모만 보고 작업을 시작하지 않습니다. "이야기하고 있었다"는 대화를 이어 가라는 뜻입니다. 작업은 지금 대화의 명시적인 지시가 있을 때만 시작합니다.
16
+ 6. <!--id:6be490--> 바로 답하지 못하는 차례에서는 첫 도구 호출 전에 프리코멘트를 한 번 보냅니다. main은 도구를 쓰는 모든 차례에서 프리코멘트(zgw_precomment)를 첫 번째 도구 호출로 보냅니다. 코드·파일 확인, 기억 저장, 작업 시작·지시·게시, 작업 알림 처리 차례도 예외가 아닙니다.
17
+ 7. <!--id:e0d71b--> main의 할 일 목록에 위임한 작업의 할 일을 옮겨 적지 않습니다. 새 결과가 없는 관찰 알림(시작, 대기, 연결 상태 등)은 채팅에 올리지 않습니다. 같은 보고가 다시 오면 한 줄로만 알립니다.
18
+ 8. <!--id:2a6c9f--> 시험, 계약 테스트, 끝에서 끝 확인으로 띄운 게이트웨이, 브리지, OMO 자식 프로세스와 임시 폴더는 성공, 실패, 중단 모두에서 정리합니다. 코드 변경, 산출물, 검증 증거는 지우지 않습니다.
19
+ 9. <!--id:8f15d4--> 브라우저 작업은 다음 순서로 방식을 고릅니다. 아래 순위를 쓰면 위 순위가 안 된 이유를 보고에 적습니다. 작업 지시문에도 이 순서를 적습니다.
20
+ - 1순위: Aside 공식 CLI. 일을 맡길 때는 `aside exec`, 탭·화면·DOM을 직접 다룰 때는 `aside repl`을 씁니다. repl을 쓰기 전에 `aside guide repl` 설명을 따릅니다. `aside help`는 빈 에이전트 세션을 만들므로 실행하지 않습니다. 도움말은 `aside --help`, `aside <명령> --help`로 봅니다.
21
+ - 2순위: BrowserSkill 확장 프로그램(`bsk`, browser 스킬의 attached 엔진). 1순위로 해결되지 않을 때만 씁니다.
22
+ - 3순위: 작업이 띄운 headless Chrome. 마이크·카메라 가짜 장치 옵션으로 띄우고, 끝나면 종료합니다.
23
+ - 웹 화면 확인에는 Bun.WebView와 WebKit을 쓰지 않습니다.
24
+ - 어느 방식이든 작업이 연 백그라운드 탭만 쓰고, 끝나면 닫습니다. 사용자 탭, 쿠키, 설정, 화면 포커스는 건드리지 않습니다. 화면 흉내, 뷰포트 같은 설정은 작업 탭에만 걸고 탭을 닫기 전에 지웁니다.
25
+ 10. <!--id:d34b70--> 게이트웨이가 떠 있는 동안 운영 DB를 다른 프로세스로 열지 않습니다. 조회는 게이트웨이 API와 로그로 합니다. <!--repo-security-check-->저장소 보안검사는 `zigmini scan <저장소>`로 하고 종료 코드를 그대로 보고합니다(0 깨끗함, 1 발견, 2 오류, 3 기준 사용 불가, 4 설정에서 결과물 검사 꺼짐). 이 명령이 보내는 읽기 전용 `GET /api/settings/security-check/baseline/revision`은 허용됩니다. 종료 코드 3이나 4이면 기준 파일을 직접 만들거나 고치지 않고 사용자에게 알립니다. 보고에는 규칙·위치·건수만 쓰고 값은 쓰지 않습니다.<!--/repo-security-check-->
26
+ 11. <!--id:57e2a8--> 보고에는 증거가 있는 것만 씁니다. 확인된 것과 추정을 나눕니다. 코드 검토, 테스트 통과, dev 머지, 운영 배포, OMO 교체, 앱 설치를 구분하고 각각의 주체와 대상을 적습니다. 다시 시작한 뒤에는 짧은 "재시작 완료" 알림을 먼저 보냅니다.
27
+ 12. <!--id:a90f63--> 로컬 파일 경로를 웹 링크처럼 보여 주지 않습니다.
28
+ 13. <!--id:1c7b5d--> 사용자의 시간 표현은 사용자의 현지 시간으로 해석합니다. 보고하는 시각도 현지 시간으로 씁니다.
29
+ 14. <!--id:f2468e--> 사용자는 게이트웨이 프로필의 닉네임으로 부릅니다.
30
+ 15. <!--id:7d903c--> main은 오래 기다리거나 오래 실행하는 작업(배포, 전체 테스트, 뮤테이션 테스트, 다른 작업 기다리기)을 맡기면, 그 작업의 세션 기록이 30분 넘게 바뀌지 않을 때 main을 깨우는 감시를 직접 겁니다. 작업이 끝나면 감시를 끕니다. 작업의 "기다리는 중"·"진행 중" 보고만 믿지 않습니다. 사용자에게 그렇게 말하기 전에 그 작업의 마지막 기록 시각과 실행 중인 프로세스(살아 있는지, CPU를 계속 100% 쓰는지)를 확인합니다. 작업이 멈췄으면 바로 그 작업에 조치를 보내고 사용자에게 알립니다. 작업은 긴 명령을 세션과 분리해(nohup, setsid 등) 실행하고, 결과 파일을 직접 확인하며, 시간 상한을 겁니다.
31
+ 16. <!--id:0e5fa9--> 작업 하나에 나눌 수 있는 항목이 여럿이거나(예: 버그 여러 개, 구현·검증·문서 단계) 앞 단계를 기다려야 하는 단계가 있으면, 작업 세션은 mass-ulw 스킬을 씁니다. 작업 세션은 처음에 단계와 하위 작업을 정합니다. 서로 기다릴 필요가 없는 하위 작업은 최대한 병렬로 돌립니다. main은 이런 작업을 맡길 때 작업 지시문에 mass-ulw를 쓰라고 적습니다. 파일 하나 고침, 문서 한 줄 같은 작은 작업에는 mass-ulw를 쓰지 않습니다. 같은 파일을 고치는 하위 작업은 같은 단계에서 함께 돌리지 않습니다. 이런 하위 작업은 각자 worktree를 쓰거나 순서대로 돌립니다. 하위 작업을 병렬로 돌려도 무거운 명령(전체 테스트, 뮤테이션 테스트, 빌드 등)은 그 프로젝트나 설치 규칙이 정한 동시 실행 상한을 지킵니다. 규칙 8의 정리와 규칙 15의 감시는 하위 작업에도 적용합니다. 사용자가 질문만 하면 진행 중인 작업을 mass-ulw로 바꾸지 않습니다(규칙 4).
32
+ 17. <!--id:b8c1e4--> 모든 사용자용 글(main 답변, 작업 보고, 프리코멘트, 확인함 질문)에 ASD-STE100의 명확한 기술 글쓰기 원칙을 적용합니다.
23
33
  - 사용자가 요청하거나 설정한 언어로 씁니다. 특정 언어를 강제하거나 영어 통제 어휘를 다른 언어에 그대로 적용하지 않습니다.
24
34
  - 짧은 능동문을 씁니다. 한 문장에는 하나의 핵심 사실이나 행동을 담습니다. 수행 주체, 작업 대상, 행동을 명확히 씁니다.
25
- - 같은 대상에는 같은 명칭을 씁니다. 필요한 전문 용어와 약어는 처음에 뜻을 설명합니다. 불필요한 표현은 줄이되 대상, 조건, 결과를 이해하는 데 필요한 정보는 남깁니다.
35
+ - 같은 대상에는 같은 명칭을 씁니다. 불필요한 동의어, 전문 용어, 약어와 대상이 불명확한 대명사를 피합니다. 필요한 전문 용어와 약어는 처음에 뜻을 설명합니다. 불필요한 표현은 줄이되 대상, 조건, 결과를 이해하는 데 필요한 정보는 남깁니다.
26
36
  - 절차는 실행 순서대로 씁니다. 각 단계에는 행동 하나를 적습니다. 필요한 선행 조건은 해당 행동 앞에 적습니다.
27
- - 결과와 계획을 구분합니다. 상태 보고는 완료된 일, 미완료된 일과 차단 원인, 다음 행동을 구분해 씁니다. 확인된 사실과 추정을 나누고 근거 없는 확신을 쓰지 않습니다. "승인", "검증", "반영", "배포"만 단독으로 쓰지 말고 누가 무엇을 허가하거나 확인하거나 바꾸었는지 명시합니다.
37
+ - 결과와 계획을 구분합니다. 상태 보고는 완료된 일, 미완료된 일과 차단 원인, 다음 행동을 구분해 씁니다. 확인된 사실과 추정을 나누고 근거 없는 확신을 쓰지 않습니다. "승인", "검증", "반영", "배포", "진행"만 단독으로 쓰지 말고 누가 무엇을 허가하거나 확인하거나 바꾸었는지 명시합니다. 예: 사용자 실행 허가, 코드 검토 통과, 대상 테스트 통과, dev 머지 완료, 게이트웨이 운영 배포, OMO 프로그램 교체.
Binary file
@@ -1,5 +1,5 @@
1
1
  {
2
- "versionCode": 29,
3
- "versionName": "0.9.0-beta.3",
4
- "sha256": "72d0d7e270137e2afd26c76e6bd725fca0ee7d2acbccab2e08769911554e0113"
2
+ "versionCode": 31,
3
+ "versionName": "1.0.0-beta.2",
4
+ "sha256": "2639dd1d6e47e1a50b8a6f73f191cf27230e48cd5a3ac7bb2e40c219f6d0d6bd"
5
5
  }
package/assets/build.json CHANGED
@@ -1 +1 @@
1
- {"commit":"2c3b0d6a5aa6078593122d32cb19f0cacc4d178d"}
1
+ {"commit":"b9764a41f74f2021ac73e5e3f633c9e18bd07f8e"}
package/docs/manual.ko.md CHANGED
@@ -19,7 +19,7 @@ zigmini는 화면 두 개를 제공합니다.
19
19
 
20
20
  웹 화면은 세 부분으로 나뉩니다.
21
21
 
22
- - 왼쪽 사이드바: 대화 목록, 새 대화 버튼(+), 작업 상태 영역, 내 프로필, 에이전트 프로필이 있습니다. 사이드바 맨 위의 "엔진" 배지는 엔진 연결 상태를 보여 줍니다.
22
+ - 왼쪽 사이드바: 기본 에이전트(main) 대화, 에이전트마다 대화 하나씩인 에이전트 묶음, 작업 상태 영역, 내 프로필, 기본 에이전트 프로필이 있습니다. 사이드바 맨 위의 "엔진" 배지는 엔진 연결 상태를 보여 줍니다.
23
23
  - 가운데 채팅: 헤더, 메시지 목록, 입력창이 있습니다.
24
24
  - 오른쪽 패널: 확인함, 설정, 이벤트 패널이 열립니다.
25
25
 
@@ -65,9 +65,11 @@ Shift+Enter는 줄을 바꿉니다. 한글 조합 중에 누른 Enter는 메시
65
65
 
66
66
  요약에 실패하면 엔진은 이전 작업 문맥을 유지하고 멈춥니다. 비상 축약본을 대신 적용하지 않습니다. 안내에 따라 모델 설정을 확인하거나 요약 제공자에 다시 로그인해 주세요. 사용 한도가 복구되기를 기다리거나 계정·조직 권한을 확인해야 할 수도 있습니다. 다른 실패도 원인을 해결한 뒤 계속할 지시를 보내거나 명시적으로 다시 시도해 주세요. 게이트웨이는 이전 입력을 다시 보내거나 새 세션을 시작하지 않습니다. 취소는 실패와 구분해서 표시합니다. 정상 요약도 모든 세부 정보의 보존을 보증하지 않습니다. 계속할 때 중요한 조건을 확인해 주세요.
67
67
 
68
+ 원할 때 요약하려면 게이트웨이 대화(메인 또는 웹·앱의 다른 대화)에서 `/compact`를 보냅니다. 게이트웨이는 그 대화의 세션 요약을 엔진에 바로 요청합니다. 이 글은 모델에 프롬프트로 가지 않습니다. 명령 뒤에 글을 붙이면 요약의 추가 지시가 됩니다. 예: `/compact 결정 사항 위주로`. 게이트웨이는 다음 경우에 `/compact`를 거절합니다. 답변이 진행 중일 때, 요약이 이미 진행 중일 때, 엔진이 모델 요청을 다시 시도하는 중일 때, 세션을 교체하는 중일 때, 엔진 연결이 끊겼을 때입니다. 채팅에 한 줄 경고가 거절 이유와 할 일을 알려 줍니다. 거절한 `/compact`는 대기열에 넣지 않습니다. 나중에 다시 보내 주세요. 요약 안내는 위와 같이 시작 안내 한 개와 완료·취소·실패 안내 한 개입니다. 요약 시작 전에 엔진이 거절하면(예: 모델을 고르지 않음) 채팅에 오류 한 개가 나타납니다. 이때 이전 내용은 유지합니다. 아주 짧거나 이미 요약한 세션은 보통 실패 안내를 표시합니다. 실패한 `/compact`는 '요약이 두 번 연속 실패하면 새 세션을 연다'는 규칙의 횟수에 들어가지 않습니다. 자동 압축이 꺼져 있어도 `/compact`는 동작합니다. 작업 세션에는 `/compact`가 없습니다. 인용한 메시지나 이미지를 붙이면 `/compact`는 일반 입력입니다.
69
+
68
70
  게이트웨이는 메인과 작업 세션을 엔진의 기존 앱 모드로 엽니다. 그래서 응답은 터미널이 아니라 채팅 화면에 맞춰집니다. 바꿀 설정은 없습니다. 앱 모드는 모든 모델 응답이 유효한 JSON 같은 요청 형식을 지킨다고 보장하지 않으며, 위의 요약 실패 복구도 바꾸지 않습니다.
69
71
 
70
- 새 대화를 만들려면 사이드바의 + 버튼을 누릅니다. 대화 이름을 묻는 창이 뜹니다.
72
+ 사이드바에는 main 대화와 에이전트마다 대화 하나만 보입니다. 다른 역할의 대화가 필요하면 에이전트를 만듭니다(에이전트 절 참고). 이전 버전의 "+" 버튼으로 만든 대화는 화면에 보이지 않습니다. 게이트웨이는 그 데이터를 그대로 가지고 있습니다.
71
73
 
72
74
  #### 슬래시 명령 메뉴
73
75
 
@@ -90,6 +92,8 @@ Shift+Enter는 줄을 바꿉니다. 한글 조합 중에 누른 Enter는 메시
90
92
 
91
93
  README의 '명령' 절에 따르면 채팅에서 `/usage`를 보내면 게이트웨이가 모델 계정의 사용량을 답합니다.
92
94
 
95
+ 메뉴에는 게이트웨이 명령 `/compact`도 있습니다. 이 명령은 원할 때 대화를 요약합니다. 자세한 내용은 위의 '대화 요약'을 참고해 주세요.
96
+
93
97
  ### 2.3 첨부와 참조
94
98
 
95
99
  #### 흐름도와 구조도
@@ -199,21 +203,34 @@ README의 '명령' 절에 따르면 채팅에서 `/usage`를 보내면 게이트
199
203
 
200
204
  헤더의 "설정" 버튼으로 엽니다. Esc, 닫기 버튼(×), 창 바깥 누르기로 닫습니다.
201
205
 
206
+ #### 언어
207
+
208
+ 언어 선택기는 게이트웨이 전체의 화면 언어를 English(영어)나 한국어로 정합니다. 기본은 영어입니다. 선택한 언어로 웹 화면 문구와 툴팁, 앱 화면 문구가 바뀌며 웹과 앱이 함께 바뀝니다. 매뉴얼은 선택한 언어 판으로 열립니다. 게이트웨이가 보내는 고정 문구(채팅 안내와 오류, 업데이트 안내, `/version`·`/usage` 답, 알림 제목)도 다음 문구부터 이 언어를 씁니다. 이미 채팅에 있는 문구는 그때 언어를 유지합니다. 에이전트 답변과 사용자가 쓴 내용은 번역하지 않습니다.
209
+
202
210
  #### 프로필
203
211
 
204
212
  프로필은 사이드바 아래에 있습니다.
205
213
 
206
214
  | 대상 | 방법 | 규칙 |
207
215
  | --- | --- | --- |
208
- | 내 닉네임 | 내 프로필을 두 번 누릅니다. | 20자까지입니다. 비우면 "나"가 됩니다. |
209
- | 에이전트 이름 | 에이전트 프로필을 두 번 누릅니다. | 한글 10자, 영문 20자까지입니다. 너무 길면 바꾸지 않습니다. 비우면 "지그"가 됩니다. |
210
- | 에이전트 아이콘 | 에이전트 아이콘을 두 번 누릅니다. | PNG, JPEG, WebP, 1MB 이하입니다. 가운데를 정사각형으로 자릅니다. 기본 아이콘으로 되돌릴 수 있습니다. |
216
+ | 내 닉네임 | 내 프로필을 두 번 누릅니다. | 20자까지입니다. 비우면 화면 언어의 기본값(영어 "Me", 한국어 "나")이 보입니다. |
217
+ | 기본 에이전트 이름 | 기본 에이전트 프로필을 두 번 누릅니다. | 한글 10자, 영문 20자까지입니다. 너무 길면 바꾸지 않습니다. 비우면 화면 언어의 기본값(영어 "Zig", 한국어 "지그")이 보입니다. 직접 정한 이름은 두 언어에서 그대로 보입니다. |
218
+ | 기본 에이전트 아이콘 | 기본 에이전트 아이콘을 두 번 누릅니다. | PNG, JPEG, WebP, 1MB 이하입니다. 가운데를 정사각형으로 자릅니다. 기본 아이콘으로 되돌릴 수 있습니다. |
211
219
 
212
220
  이름 입력란에서 Enter는 저장하고 Esc는 취소합니다. 입력란을 벗어나도 저장합니다. 이름은 게이트웨이에 저장됩니다. 저장에 실패하면 이 브라우저에만 바뀐 이름이 보입니다.
213
221
 
222
+ 게이트웨이는 차례마다 main, 작업, 에이전트 세션에 내 닉네임을 알려 줍니다. 그래서 모든 세션이 다음 차례부터 그 닉네임으로 부릅니다. main은 기본 에이전트 이름도 받고, 각 에이전트는 에이전트 화면에서 정한 자기 이름을 받습니다.
223
+
214
224
  #### 보안검사
215
225
 
216
- - "보안검사 켜짐/꺼짐"은 보내는 메시지의 검사를 켜고 끕니다. 기본은 켜짐이고 게이트웨이가 설정을 기억합니다.
226
+ 엔진으로 가는 메시지 검사, 결과물 검사, "형식 검증" 묶음 아래의 도구별 줄은 모두 스위치입니다. 항목마다 1~2줄 요약이 보입니다. 상세 설명은 웹에서는 정보 아이콘(i)에 마우스를 올리거나 키보드로 포커스하면 툴팁으로 보이고, 앱에서는 정보 아이콘을 누르면 창으로 열립니다. Android 설정 화면에도 같은 스위치가 있습니다.
227
+
228
+ - "엔진으로 가는 메시지 검사"는 보내는 메시지의 검사를 켜고 끕니다. 기본은 켜짐이고 게이트웨이가 설정을 기억합니다.
229
+ - "결과물 검사"는 작업 결과물 검사를 켜고 끕니다. 기본은 켜짐입니다. 켜지면 `zigmini scan`이 비밀값처럼 보인 값과 보안 기준의 값을 찾고, 새 세션 규칙에 "머지 전에 검사한다"는 의무가 들어갑니다. 끄면 `zigmini scan`이 검사하지 않고 종료 코드 4로 끝나며 그 의무가 빠집니다. 메시지 검사는 따로 켜고 끕니다.
230
+ - "형식 검증"은 묶음 제목이고, 그 아래에 도구마다 한 줄이 있습니다(지금은 TLA+). 줄마다 도구 이름과 상태, 정보 아이콘, 그 도구의 스위치가 있습니다. 스위치는 도구가 설치된 뒤 검사(`bun run formal:check`)에 쓸지만 정합니다. 스위치를 켜도 설치하지 않습니다.
231
+ - 설치되지 않은 도구는 "설치 안 됨"과 "설치" 버튼을 보입니다. "설치"를 누르면 그 도구만 Homebrew로 설치합니다(`brew link` 없이 `openjdk@21`, 크기와 SHA-256으로 확인한 tla2tools.jar 1.7.4). 설치하는 동안 그 줄에는 "설치 중…"이 보이고 버튼은 숨겨집니다. 설치가 끝나면 버튼이 사라집니다. "설치"를 누르기 전에는 아무것도 설치하지 않습니다.
232
+ - 설치가 실패하면 "설치 실패"와 줄 아래의 "실패 원인: …"이 보이고 "설치" 버튼이 다시 나타납니다. Homebrew가 없으면 원인에 https://brew.sh 에서 Homebrew를 설치한 뒤 설치를 다시 누르라는 안내가 나옵니다. 설치가 실패해도 스위치 값은 그대로입니다.
233
+ - 업데이트 전에 형식 검증 전체 설정이 꺼져 있었다면 업데이트 뒤에도 모든 도구 스위치가 꺼진 채로 남습니다.
217
234
  - 메시지나 확인함 답에 허용하지 않은 값이 탐지되면 게이트웨이가 에이전트에 보내기 전에 보류합니다. 확인함과 채팅에는 같은 보안 항목이 보입니다. 항목은 기억할 전체 값과 종류를 보여 줍니다.
218
235
  - 보내기를 선택하면 원래 메시지를 전송하고 표시한 정확한 값을 이 게이트웨이에 기억합니다. 다음부터 같은 값은 다시 묻지 않습니다. 다른 값은 계속 확인합니다. 이미 보류한 메시지를 자동으로 보내지는 않습니다.
219
236
  - 취소는 이번 전송만 중단합니다. 기존 작업은 중단하지 않습니다. 보류한 내용이 확인함 답이면 원래 질문은 답하지 않은 상태로 남고 답변 입력란도 유지합니다.
@@ -223,7 +240,8 @@ README의 '명령' 절에 따르면 채팅에서 `/usage`를 보내면 게이트
223
240
  - 허용 목록은 이 설치에만 비공개로 저장하며 게이트웨이를 다시 시작해도 유지합니다. 웹 설정의 보안검사 구역에서 목록을 봅니다. Android는 매뉴얼 버튼이 있는 게이트웨이 설정 화면에서 허용 값 목록을 엽니다.
224
241
  - 항목마다 전체 값, 종류, 승인 시각, 승인한 클라이언트를 보여 줍니다. 개별 삭제나 전체 삭제를 하면 다음 전송부터 해당 값을 다시 검사합니다. 삭제는 이미 승인한 전송을 취소하거나 보낸 메시지를 지우지 않습니다.
225
242
  - 구형 앱의 보내기는 한 번만 전송하며 값을 기억하지 않습니다. 값을 기억하려면 새 화면의 전송·기억 선택이 필요합니다. 미승인 원문은 일반 질문 기록이나 대화 이력에 저장하지 않습니다. 게이트웨이를 다시 시작하면 보류 원문은 사라집니다.
226
- - 이 목록은 메시지와 답변의 전송 검사에만 적용합니다. 저장소와 릴리스 보안검사는 바꾸지 않습니다.
243
+ - 기억한 값은 기본으로 전송에만 허용합니다. 항목마다 "저장소 검사에도 허용" 스위치가 있습니다. 스위치를 켠 값만 `zigmini scan`을 통과합니다. 이 맥의 홈 경로나 계정 이름과 같은 값은 켤 수 없습니다.
244
+ - "보안 기준"은 저장소 검사가 항상 찾는 용어 목록입니다. 용어는 웹에서 더합니다. 웹과 Android에서 확인을 거쳐 지울 수 있습니다. 이 맥의 홈 경로와 계정 이름 행은 자동 항목이며 고칠 수 없습니다. 상태 줄에 게이트웨이가 기준 파일을 마지막으로 내보낸 시각이 보입니다.
227
245
 
228
246
  #### 업데이트
229
247
 
@@ -296,10 +314,39 @@ Android 앱(APK)을 받는 QR이 보입니다. 폰 카메라로 QR을 찍어 APK
296
314
 
297
315
  ### 2.10 매뉴얼 보기
298
316
 
299
- - 웹: 설정 창 위쪽의 "매뉴얼" 버튼을 누릅니다. 한국어 판이 먼저 보입니다. "English" 버튼이나 문서 첫 줄의 링크는 영어 판으로 바꿉니다. Esc, 닫기 버튼(×), 창 바깥 누르기로 닫습니다.
317
+ - 웹: 설정 창 위쪽의 "매뉴얼" 버튼을 누릅니다. 선택한 화면 언어 판이 먼저 보입니다. "English" 버튼이나 문서 첫 줄의 링크는 영어 판으로 바꿉니다. Esc, 닫기 버튼(×), 창 바깥 누르기로 닫습니다.
300
318
  - 앱: 헤더의 상태 태그(예: "작업 상태 확인 중")를 짧게 눌러 게이트웨이 연결 화면을 엽니다. 그 화면의 "매뉴얼" 버튼을 누릅니다. "English" 버튼은 영어 판으로 바꿉니다. "닫기"나 뒤로 가기는 연결 화면으로 돌아갑니다.
301
319
  - 게이트웨이가 매뉴얼을 주지 않으면 "이 게이트웨이 버전에는 매뉴얼이 없습니다" 안내가 보입니다. 게이트웨이를 업데이트하면 볼 수 있습니다.
302
320
 
321
+ ### 2.11 에이전트
322
+
323
+ 에이전트는 사용자가 웹에서 만드는 역할이 붙은 대화입니다. 에이전트마다 대화, 대화 기록, 엔진 세션, 지식 폴더가 따로 있습니다. 에이전트는 기본 에이전트(main, 지그)와 분리됩니다. 기본 에이전트는 그대로 사용자의 비서이고 작업과 확인함을 관리합니다. 에이전트는 면접 연습 같은 일 하나를 맡고, 작업이나 다른 세션을 관리하지 않습니다. 기본으로 들어 있는 에이전트는 없습니다.
324
+
325
+ 용어: 기본 에이전트(main, 지그)는 게이트웨이에 처음부터 있는 대화입니다. 에이전트는 사용자가 만드는 역할 대화입니다. 작업 세션과 하위 작업은 일 하나를 실행하는 별도 엔진 세션이며, 에이전트가 아닙니다.
326
+
327
+ ```zigmini-diagram
328
+ {"version":1,"title":"기본 에이전트, 에이전트, 작업 세션","nodes":[{"id":"user","label":"사용자"},{"id":"main","label":"기본 에이전트 (main, 지그)"},{"id":"agent","label":"에이전트 대화"},{"id":"work","label":"작업"},{"id":"knowledge","label":"에이전트 지식 폴더"}],"edges":[{"from":"user","to":"main"},{"from":"user","to":"agent"},{"from":"main","to":"work"},{"from":"agent","to":"knowledge"}]}
329
+ ```
330
+
331
+ - **사이드바.** 에이전트는 별도 묶음에 보입니다. 묶음 이름 옆 **⋯** 버튼(또는 대화창 위쪽 **에이전트** 버튼)은 에이전트 화면을 엽니다. 이 화면에는 목록, 공통 기본값, 보관함이 있습니다. 에이전트 추가와 편집은 이 화면에서만 합니다. 목록의 **+ 에이전트**는 새 에이전트를 만듭니다. 줄마다 있는 **편집**은 그 에이전트의 편집 화면을 엽니다. 사이드바와 대화창 머리에는 추가·편집 버튼이 없습니다. 에이전트마다 대화는 정확히 하나입니다.
332
+ - **편집 화면.** 이름과 목적 한 줄은 꼭 채웁니다. 선택 항목은 아이콘, 모델(제공자와 모델 ID를 둘 다 채우거나 둘 다 비움, 비우면 게이트웨이의 현재 모델), 사고 수준, 스킬 허용 목록, 웹 리서치(web_search, webfetch), 답이 끝나면 앱 알림, 게이트웨이 규칙·설치 규칙 붙이기, MEMORY.md 상한(0부터 32768바이트)입니다. 셸과 코드 실행은 늘 꺼져 있습니다. 항목마다 값의 출처(패키지 기본값, 공통 기본값, 이 에이전트)가 보입니다. 본문은 역할 지시문입니다.
333
+ - **바꾼 정의는 새 세션부터 적용합니다.** 정의를 고치면 대화 머리줄에 "정의 바뀜 · 새 세션부터 적용"이 보입니다. 열린 세션은 이전 정의를 씁니다. 이 표시를 누르면 새 세션을 시작해 바뀐 정의를 적용합니다.
334
+ - **스킬.** 에이전트 대화의 "/" 메뉴에는 허용 목록 밖의 스킬이 보이지 않습니다.
335
+ - **지식.** 에이전트의 파일 도구는 자기 지식 폴더 안에서만 동작합니다. 자료 파일은 에이전트 화면의 목록에서 **편집**을 눌러 연 편집 화면에서 올립니다. 웹 리서치를 켜면 조사 결과를 `knowledge/notes/` 아래에 쓰고, 사실마다 출처 URL을 같은 줄에 적습니다. 에이전트는 자기 대화 기록만 검색합니다.
336
+ - **복제.** 복제하면 정의, 자료 파일, MEMORY.md를 "<이름> 사본"이라는 새 에이전트로 복사합니다. 대화는 복사하지 않습니다.
337
+ - **삭제와 되살리기.** 삭제하려면 에이전트 이름을 똑같이 입력합니다. 대화는 숨기고, 정의와 지식은 보관함에 30일 둡니다. 진행 중인 턴이나 열린 질문이 있으면 삭제할 수 없습니다. 보관함에서 되살리면 대화가 다시 보입니다.
338
+ - **기본 에이전트.** 지그는 에이전트 목록(이름, 목적, 링크)을 볼 수 있지만 에이전트와 대화하지 않습니다. 보관함의 에이전트는 목록에 나오지 않습니다.
339
+ - **Android.** 앱은 기본 에이전트(main) 대화만 씁니다. 에이전트 대화는 지금은 웹에서만 씁니다.
340
+
341
+ ### 2.12 에이전트 규칙
342
+
343
+ 게이트웨이는 패키지의 공통 규칙과 이 설치의 `~/.zigmini/rules.md`를 main과 작업 세션마다 붙입니다.
344
+
345
+ 공통 규칙 항목 바꾸기: 공통 규칙 파일의 각 항목에는 주석으로 고정 ID가 있습니다(예: `<!--id:f2468e-->`). ID는 항목을 만들 때 한 번 정하고, 문장을 고쳐도 바뀌지 않습니다. 항목 번호는 읽는 순서일 뿐이고 우선순위가 아닙니다. 공통 항목 하나를 통째로 바꾸려면 `rules.md`의 항목 안에 `<!--replaces:<ID>-->`를 적습니다. 그러면 게이트웨이는 그 공통 항목을 빼고 `rules.md`의 항목을 씁니다. `replaces`가 없는 항목은 지금처럼 새 규칙으로 공통 규칙 뒤에 붙고, 부딪치면 `rules.md`가 이깁니다. 적은 ID가 공통 규칙에 없으면(예: 업데이트로 사라짐) 그 항목은 새 규칙으로 붙고 `zigmini doctor`가 경고를 보여 줍니다.
346
+
347
+ - `zigmini rules`: 공통 항목의 번호, ID, 첫 줄을 보여 줍니다.
348
+ - `zigmini rules check`: `rules.md`의 각 항목이 "공통 N번을 대체", "신규 규칙", "없는 ID" 중 무엇인지 보여 줍니다(없는 ID가 있으면 종료 코드 1).
349
+
303
350
  ## 3. 키보드 단축키
304
351
 
305
352
  | 키 | 위치(어디서) | 동작 |
@@ -324,9 +371,9 @@ Android 앱(APK)을 받는 QR이 보입니다. 폰 카메라로 QR을 찍어 APK
324
371
  | Tab, Shift+Tab | 설정 | 초점이 설정 안에서만 돕니다. |
325
372
  | Esc | 매뉴얼 | 매뉴얼을 닫고 설정으로 돌아갑니다. |
326
373
  | Tab, Shift+Tab | 매뉴얼 | 초점이 매뉴얼 안에서만 돕니다. |
327
- | Enter | 닉네임, 에이전트 이름 입력란 | 저장합니다. |
328
- | Esc | 닉네임, 에이전트 이름 입력란 | 바꾸지 않고 닫습니다. |
329
- | Esc | 에이전트 아이콘 편집 창 | 바꾸지 않고 닫습니다. |
374
+ | Enter | 닉네임, 기본 에이전트 이름 입력란 | 저장합니다. |
375
+ | Esc | 닉네임, 기본 에이전트 이름 입력란 | 바꾸지 않고 닫습니다. |
376
+ | Esc | 기본 에이전트 아이콘 편집 창 | 바꾸지 않고 닫습니다. |
330
377
 
331
378
  Ctrl 단축키는 Cmd, Alt, Shift와 함께 누르면 동작하지 않습니다. 한글 자판에서도 같은 키 위치로 동작합니다.
332
379
 
@@ -453,6 +500,8 @@ Ctrl 단축키는 Cmd, Alt, Shift와 함께 누르면 동작하지 않습니다.
453
500
  - `zigmini pair [--apk]`: 폰 등록 QR이나 앱 내려받기 QR을 보여 줍니다.
454
501
  - `zigmini consent`: 권한 안내를 보이고 동의를 기록합니다.
455
502
  - `zigmini update [버전]`: 업데이트합니다.
503
+ - `zigmini scan [<저장소>]`: 보안 기준으로 저장소를 검사합니다. 종료 코드 0 깨끗함, 1 발견, 2 오류, 3 기준 없음·비어 있음·낡음.
504
+ - `zigmini security import-baseline [--dry-run]`: 게이트웨이가 켜진 상태에서 옛 평문 목록을 보안 기준에 더합니다.
456
505
  - `zigmini rotate-main [--restart]`: main 대화를 새 세션으로 교체합니다. "새 세션"과 같습니다. 먼저 운영자 허가를 받습니다. 자세한 내용은 운영 문서를 보세요.
457
506
 
458
507
  전체 목록은 README의 '명령' 절을 보세요.