cli-jaw 1.5.0 → 1.6.0

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 (225) hide show
  1. package/README.ko.md +2 -2
  2. package/README.md +21 -2
  3. package/README.zh-CN.md +2 -2
  4. package/dist/bin/cli-jaw.js +5 -1
  5. package/dist/bin/cli-jaw.js.map +1 -1
  6. package/dist/bin/commands/dispatch.js +50 -0
  7. package/dist/bin/commands/dispatch.js.map +1 -0
  8. package/dist/lib/mcp-sync.js +1 -1
  9. package/dist/lib/mcp-sync.js.map +1 -1
  10. package/dist/lib/upload.js +14 -1
  11. package/dist/lib/upload.js.map +1 -1
  12. package/dist/server.js +53 -40
  13. package/dist/server.js.map +1 -1
  14. package/dist/src/agent/events.js +72 -13
  15. package/dist/src/agent/events.js.map +1 -1
  16. package/dist/src/agent/spawn.js +65 -24
  17. package/dist/src/agent/spawn.js.map +1 -1
  18. package/dist/src/cli/commands.js +6 -6
  19. package/dist/src/cli/commands.js.map +1 -1
  20. package/dist/src/cli/handlers.js +11 -9
  21. package/dist/src/cli/handlers.js.map +1 -1
  22. package/dist/src/cli/registry.js +7 -1
  23. package/dist/src/cli/registry.js.map +1 -1
  24. package/dist/src/core/config.js +15 -8
  25. package/dist/src/core/config.js.map +1 -1
  26. package/dist/src/core/db.js +18 -3
  27. package/dist/src/core/db.js.map +1 -1
  28. package/dist/src/core/employees.js +34 -0
  29. package/dist/src/core/employees.js.map +1 -0
  30. package/dist/src/discord/bot.js +72 -9
  31. package/dist/src/discord/bot.js.map +1 -1
  32. package/dist/src/discord/commands.js +12 -8
  33. package/dist/src/discord/commands.js.map +1 -1
  34. package/dist/src/orchestrator/distribute.js +41 -24
  35. package/dist/src/orchestrator/distribute.js.map +1 -1
  36. package/dist/src/orchestrator/gateway.js +3 -1
  37. package/dist/src/orchestrator/gateway.js.map +1 -1
  38. package/dist/src/orchestrator/pipeline.js +93 -27
  39. package/dist/src/orchestrator/pipeline.js.map +1 -1
  40. package/dist/src/orchestrator/research.js +5 -5
  41. package/dist/src/orchestrator/research.js.map +1 -1
  42. package/dist/src/orchestrator/scope.js +55 -0
  43. package/dist/src/orchestrator/scope.js.map +1 -0
  44. package/dist/src/orchestrator/state-machine.js +23 -21
  45. package/dist/src/orchestrator/state-machine.js.map +1 -1
  46. package/dist/src/orchestrator/worker-registry.js +9 -2
  47. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  48. package/dist/src/prompt/builder.js +78 -37
  49. package/dist/src/prompt/builder.js.map +1 -1
  50. package/dist/src/prompt/templates/a1-system.md +40 -0
  51. package/dist/src/prompt/templates/employee.md +10 -1
  52. package/dist/src/prompt/templates/orchestration.md +17 -1
  53. package/dist/src/telegram/bot.js +7 -1
  54. package/dist/src/telegram/bot.js.map +1 -1
  55. package/package.json +4 -2
  56. package/public/assets/fonts/GeistVF.woff2 +0 -0
  57. package/public/assets/fonts/JetBrainsMono-Variable.woff2 +0 -0
  58. package/public/assets/providers/claude-color.svg +1 -0
  59. package/public/assets/providers/claude.svg +1 -0
  60. package/public/assets/providers/copilot-color.svg +1 -0
  61. package/public/assets/providers/copilot.svg +1 -0
  62. package/public/assets/providers/discord.svg +1 -0
  63. package/public/assets/providers/gemini-color.svg +1 -0
  64. package/public/assets/providers/gemini.svg +1 -0
  65. package/public/assets/providers/openai.svg +1 -0
  66. package/public/assets/providers/opencode.svg +1 -0
  67. package/public/assets/providers/telegram.svg +1 -0
  68. package/public/css/chat.css +79 -51
  69. package/public/css/diagram.css +348 -0
  70. package/public/css/layout.css +33 -10
  71. package/public/css/markdown.css +64 -18
  72. package/public/css/modals.css +3 -3
  73. package/public/css/orc-state.css +9 -9
  74. package/public/css/sidebar.css +37 -3
  75. package/public/css/tool-ui.css +46 -11
  76. package/public/css/variables.css +63 -63
  77. package/public/dist/assets/api-Bbmmo0o1.js +1 -0
  78. package/public/dist/assets/architecture-YZFGNWBL-BxiHqtOH.js +1 -0
  79. package/public/dist/assets/architectureDiagram-Q4EWVU46-CJTGDw5p.js +1 -0
  80. package/public/dist/assets/blockDiagram-DXYQGD6D-Btl5Y-Er.js +1 -0
  81. package/public/dist/assets/c4Diagram-AHTNJAMY-sDfjW4ZF.js +1 -0
  82. package/public/dist/assets/classDiagram-6PBFFD2Q-ByCgggL2.js +1 -0
  83. package/public/dist/assets/classDiagram-v2-HSJHXN6E-t1amaXkU.js +1 -0
  84. package/public/dist/assets/constants-C8_0OtK2.js +1 -0
  85. package/public/dist/assets/cose-bilkent-S5V4N54A-eOSFGdaE.js +1 -0
  86. package/public/dist/assets/dagre-KV5264BT-OCB5j8Q6.js +1 -0
  87. package/public/dist/assets/diagram-5BDNPKRD-C-4fgK5P.js +1 -0
  88. package/public/dist/assets/diagram-G4DWMVQ6-C6vmHKDV.js +1 -0
  89. package/public/dist/assets/diagram-MMDJMWI5-BMCo_wmt.js +1 -0
  90. package/public/dist/assets/diagram-TYMM5635-DaCLdttJ.js +1 -0
  91. package/public/dist/assets/employees-D5n7mX5v.js +39 -0
  92. package/public/dist/assets/erDiagram-SMLLAGMA-BiTRdm5s.js +1 -0
  93. package/public/dist/assets/flowDiagram-DWJPFMVM-sv6jVi0d.js +1 -0
  94. package/public/dist/assets/ganttDiagram-T4ZO3ILL-jCP3OW23.js +1 -0
  95. package/public/dist/assets/gitGraph-7Q5UKJZL-BIeKLxpm.js +1 -0
  96. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CokylnbW.js +1 -0
  97. package/public/dist/assets/index-Br2UdKlR.css +1 -0
  98. package/public/dist/assets/index-CmAU0d96.js +49 -0
  99. package/public/dist/assets/info-OMHHGYJF-CIEl5dWF.js +1 -0
  100. package/public/dist/assets/infoDiagram-42DDH7IO-BBnK1Bh2.js +1 -0
  101. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-qXIz0VhS.js +1 -0
  102. package/public/dist/assets/journeyDiagram-VCZTEJTY-BdrOLof3.js +1 -0
  103. package/public/dist/assets/kanban-definition-6JOO6SKY-CcX7CE04.js +1 -0
  104. package/public/dist/assets/mermaid.core-BoxIvw7E.js +1 -0
  105. package/public/dist/assets/mindmap-definition-QFDTVHPH-CdXARskX.js +1 -0
  106. package/public/dist/assets/packet-4T2RLAQJ-Bz4ZwYZ3.js +1 -0
  107. package/public/dist/assets/pie-ZZUOXDRM-AtGL3wZ2.js +1 -0
  108. package/public/dist/assets/pieDiagram-DEJITSTG-B5SOq9Yr.js +1 -0
  109. package/public/dist/assets/quadrantDiagram-34T5L4WZ-D0uNWgpI.js +1 -0
  110. package/public/dist/assets/radar-PYXPWWZC-AbJSfeqB.js +1 -0
  111. package/public/dist/assets/render-C8N0rp4L.js +25 -0
  112. package/public/dist/assets/requirementDiagram-MS252O5E-62td6IQ-.js +1 -0
  113. package/public/dist/assets/sankeyDiagram-XADWPNL6-Crg_02iC.js +1 -0
  114. package/public/dist/assets/sequenceDiagram-FGHM5R23-fbCocZHj.js +1 -0
  115. package/public/dist/assets/settings-BJR-IGM5.js +41 -0
  116. package/public/dist/assets/settings-Dm6OnPmY.js +1 -0
  117. package/public/dist/assets/skills-D6jv9AIs.js +1 -0
  118. package/public/dist/assets/skills-uywskdFh.js +12 -0
  119. package/public/dist/assets/slash-commands-CCDonT40.js +1 -0
  120. package/public/dist/assets/{slash-commands-DMsE88bu.js → slash-commands-DWvL-VDU.js} +1 -1
  121. package/public/dist/assets/stateDiagram-FHFEXIEX-Gy3DhXxQ.js +1 -0
  122. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DJc-FW9O.js +1 -0
  123. package/public/dist/assets/timeline-definition-GMOUNBTQ-B3cA9DgY.js +1 -0
  124. package/public/dist/assets/treeView-SZITEDCU-Cn58DIbB.js +1 -0
  125. package/public/dist/assets/treemap-W4RFUUIX-DPcYjDzH.js +1 -0
  126. package/public/dist/assets/ui-C1daR00l.js +1 -0
  127. package/public/dist/assets/ui-D-oFkXed.js +131 -0
  128. package/public/dist/assets/vendor-icons-1Ec7ZWcT.js +1 -0
  129. package/public/dist/assets/{vendor-mermaid-COidH9HB.js → vendor-mermaid-lvHqQdfg.js} +4 -4
  130. package/public/dist/assets/vennDiagram-DHZGUBPP-DkBfxilo.js +1 -0
  131. package/public/dist/assets/wardley-RL74JXVD-6Dg0PJ4H.js +1 -0
  132. package/public/dist/assets/wardleyDiagram-NUSXRM2D-Dsntl_vy.js +1 -0
  133. package/public/dist/assets/ws-Dnn8HG8B.js +2 -0
  134. package/public/dist/assets/xychartDiagram-5P7HB3ND-B_McB5GE.js +1 -0
  135. package/public/dist/index.html +63 -55
  136. package/public/index.html +62 -53
  137. package/public/js/constants.ts +8 -2
  138. package/public/js/diagram/iframe-renderer.ts +559 -0
  139. package/public/js/diagram/types.ts +129 -0
  140. package/public/js/diagram/widget-validator.ts +82 -0
  141. package/public/js/features/chat.ts +24 -12
  142. package/public/js/features/employees.ts +3 -2
  143. package/public/js/features/heartbeat.ts +4 -3
  144. package/public/js/features/memory.ts +4 -3
  145. package/public/js/features/process-block.ts +12 -11
  146. package/public/js/features/settings-cli-status.ts +10 -7
  147. package/public/js/features/settings-core.ts +13 -3
  148. package/public/js/features/settings-discord.ts +9 -0
  149. package/public/js/features/settings-mcp.ts +8 -7
  150. package/public/js/features/settings-stt.ts +4 -4
  151. package/public/js/features/settings-templates.ts +10 -8
  152. package/public/js/features/settings-types.ts +1 -1
  153. package/public/js/features/settings.ts +1 -1
  154. package/public/js/features/sidebar.ts +4 -2
  155. package/public/js/features/skills.ts +4 -3
  156. package/public/js/features/theme.ts +4 -0
  157. package/public/js/features/tool-ui.ts +6 -5
  158. package/public/js/features/voice-recorder.ts +2 -1
  159. package/public/js/icons.ts +257 -0
  160. package/public/js/main.ts +9 -3
  161. package/public/js/provider-icons.ts +88 -0
  162. package/public/js/render.ts +493 -30
  163. package/public/js/streaming-render.ts +3 -3
  164. package/public/js/ui.ts +38 -18
  165. package/public/js/ws.ts +17 -10
  166. package/public/locales/en.json +89 -88
  167. package/public/locales/ko.json +89 -88
  168. package/scripts/release-preview.sh +1 -1
  169. package/public/dist/assets/api-BlPw3bUI.js +0 -1
  170. package/public/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +0 -1
  171. package/public/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +0 -1
  172. package/public/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +0 -1
  173. package/public/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +0 -1
  174. package/public/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +0 -1
  175. package/public/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +0 -1
  176. package/public/dist/assets/constants-DshMUJbo.js +0 -1
  177. package/public/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +0 -1
  178. package/public/dist/assets/dagre-KV5264BT-BVwNaSwC.js +0 -1
  179. package/public/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +0 -1
  180. package/public/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +0 -1
  181. package/public/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +0 -1
  182. package/public/dist/assets/diagram-TYMM5635-C9xMWPQn.js +0 -1
  183. package/public/dist/assets/employees-CFRlsbHm.js +0 -39
  184. package/public/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +0 -1
  185. package/public/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +0 -1
  186. package/public/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +0 -1
  187. package/public/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +0 -1
  188. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +0 -1
  189. package/public/dist/assets/index-1Gg-6jeC.css +0 -1
  190. package/public/dist/assets/index-CQHqXjrK.js +0 -49
  191. package/public/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +0 -1
  192. package/public/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +0 -1
  193. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +0 -1
  194. package/public/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +0 -1
  195. package/public/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +0 -1
  196. package/public/dist/assets/mermaid.core-CHuluSlD.js +0 -1
  197. package/public/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +0 -1
  198. package/public/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +0 -1
  199. package/public/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +0 -1
  200. package/public/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +0 -1
  201. package/public/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +0 -1
  202. package/public/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +0 -1
  203. package/public/dist/assets/render-YHvL5VM_.js +0 -6
  204. package/public/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +0 -1
  205. package/public/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +0 -1
  206. package/public/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +0 -1
  207. package/public/dist/assets/settings-BQF_u5px.js +0 -37
  208. package/public/dist/assets/settings-C5Q9IPjJ.js +0 -1
  209. package/public/dist/assets/skills-9Pd2rOw-.js +0 -1
  210. package/public/dist/assets/skills-BI7sQAdk.js +0 -12
  211. package/public/dist/assets/slash-commands-FMpJzlDB.js +0 -1
  212. package/public/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +0 -1
  213. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +0 -1
  214. package/public/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +0 -1
  215. package/public/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +0 -1
  216. package/public/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +0 -1
  217. package/public/dist/assets/ui-BukgLHuh.js +0 -29
  218. package/public/dist/assets/ui-Bvz1JfTE.js +0 -1
  219. package/public/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +0 -1
  220. package/public/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +0 -1
  221. package/public/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +0 -1
  222. package/public/dist/assets/ws-S_AZgx7L.js +0 -2
  223. package/public/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +0 -1
  224. /package/public/dist/assets/{api-B8XKQ4OT.js → api-Ci-lgwRp.js} +0 -0
  225. /package/public/dist/assets/{locale-BjoAcbis.js → locale-DIXc-_34.js} +0 -0
package/public/index.html CHANGED
@@ -5,8 +5,9 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
7
7
  <meta name="theme-color" content="#22d3ee">
8
- <meta name="apple-mobile-web-app-capable" content="yes">
8
+ <meta name="mobile-web-app-capable" content="yes">
9
9
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
10
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🦈</text></svg>">
10
11
  <link rel="manifest" href="/manifest.json">
11
12
  <link rel="apple-touch-icon" href="/icons/icon-192.png">
12
13
  <title>CLI-JAW</title>
@@ -23,6 +24,7 @@
23
24
  <link rel="stylesheet" href="/css/modals.css">
24
25
  <link rel="stylesheet" href="/css/markdown.css">
25
26
  <link rel="stylesheet" href="/css/tool-ui.css">
27
+ <link rel="stylesheet" href="/css/diagram.css">
26
28
  <!-- Vite handles module bundling in dev (HMR) and production (build) -->
27
29
  </head>
28
30
 
@@ -40,7 +42,7 @@
40
42
 
41
43
  <div>
42
44
  <div class="section-title" data-i18n="sidebar.memory">메모리</div>
43
- <button class="sidebar-hb-btn" id="memorySidebarBtn" aria-label="Open memory panel">🧠 Memory (0)</button>
45
+ <button class="sidebar-hb-btn" id="memorySidebarBtn" aria-label="Open memory panel"><span data-icon="brain"></span> Memory (0)</button>
44
46
  </div>
45
47
 
46
48
  <div>
@@ -83,15 +85,15 @@
83
85
  <button class="sidebar-hb-btn btn-action-sm w-auto" id="appNameSave">✓</button>
84
86
  </div>
85
87
  <button class="sidebar-hb-btn" id="btnClearChat">/clear</button>
86
- <button class="sidebar-hb-btn" id="hbSidebarBtn">💓 Heartbeat (0)</button>
87
- <button class="sidebar-hb-btn" data-action="openTemplates">📝 프롬프트 템플릿</button>
88
- <button class="sidebar-hb-btn" id="langToggle" title="한국어 ⇄ English">🌐 한국어</button>
88
+ <button class="sidebar-hb-btn" id="hbSidebarBtn"><span data-icon="heartPulse"></span> Heartbeat (0)</button>
89
+ <button class="sidebar-hb-btn" data-action="openTemplates"><span data-icon="plan"></span> 프롬프트 템플릿</button>
90
+ <button class="sidebar-hb-btn" id="langToggle" title="한국어 ⇄ English"><span data-icon="web"></span> 한국어</button>
89
91
  </div>
90
92
  </nav>
91
93
 
92
94
  <!-- Chat Area -->
93
95
  <div class="chat-area">
94
- <div class="drag-overlay" id="dragOverlay" data-i18n="drag.drop">📎 파일을 여기에 드랍하세요</div>
96
+ <div class="drag-overlay" id="dragOverlay" data-i18n="drag.drop"><span data-icon="paperclip"></span> 파일을 여기에 드랍하세요</div>
95
97
  <div class="chat-header">
96
98
  <span>CLI-JAW ● <span id="headerCli">claude</span></span>
97
99
  <button class="theme-switch" id="toggleTheme" title="Toggle Theme" aria-label="Toggle dark/light mode">
@@ -127,7 +129,7 @@
127
129
  </div>
128
130
  <div class="file-preview" id="filePreview">
129
131
  <div class="file-preview-header">
130
- <span class="file-preview-title">📎 Files</span>
132
+ <span class="file-preview-title"><span data-icon="paperclip"></span> Files</span>
131
133
  <button class="file-preview-clear" id="filePreviewClear">✕ Clear all</button>
132
134
  </div>
133
135
  <div class="file-preview-list" id="filePreviewList"></div>
@@ -135,15 +137,15 @@
135
137
  <div class="chat-input-area">
136
138
  <div id="cmdDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.cmdList" aria-label="커맨드 목록"
137
139
  style="display:none"></div>
138
- <button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부">📎</button>
140
+ <button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부"><span data-icon="paperclip"></span></button>
139
141
  <input type="file" id="fileInput" hidden multiple>
140
- <button class="btn-voice" id="btnVoice" data-i18n-title="voice.start" title="음성 녹음">🎤</button>
142
+ <button class="btn-voice" id="btnVoice" data-i18n-title="voice.start" title="음성 녹음"><span data-icon="mic"></span></button>
141
143
  <span class="voice-timer" id="voiceTimer" style="display:none">00:00</span>
142
144
  <button class="btn-voice-cancel" id="btnVoiceCancel" style="display:none" title="취소">✕</button>
143
145
  <textarea class="chat-input" id="chatInput" rows="1" data-i18n-placeholder="input.placeholder"
144
146
  placeholder="메시지 입력..." aria-label="Chat message input" aria-haspopup="listbox" aria-expanded="false"
145
147
  aria-controls="cmdDropdown" aria-autocomplete="list" aria-activedescendant=""></textarea>
146
- <button class="btn-send" id="btnSend" aria-label="Send message">➤</button>
148
+ <button class="btn-send" id="btnSend" aria-label="Send message"><span data-icon="send"></span></button>
147
149
  </div>
148
150
  </div>
149
151
 
@@ -189,7 +191,7 @@
189
191
  <div>
190
192
  <label data-i18n="label.permissions">권한</label>
191
193
  <div class="perm-toggle">
192
- <span class="perm-btn active perm-auto" >⚡ Auto</span>
194
+ <span class="perm-btn active perm-auto" ><span data-icon="exec"></span> Auto</span>
193
195
  </div>
194
196
  </div>
195
197
 
@@ -214,16 +216,16 @@
214
216
  <div id="tabSkills" class="tab-content" role="tabpanel" aria-labelledby="tabBtnSkills">
215
217
  <div class="flex gap-2 flex-wrap">
216
218
  <button class="skill-filter active" data-filter="all" data-i18n="skill.filter.all">전체</button>
217
- <button class="skill-filter" data-filter="installed" data-i18n="skill.filter.installed">📦 설치됨</button>
218
- <button class="skill-filter" data-filter="productivity" data-i18n="skill.filter.productivity">📝
219
+ <button class="skill-filter" data-filter="installed" data-i18n="skill.filter.installed"><span data-icon="compacting"></span> 설치됨</button>
220
+ <button class="skill-filter" data-filter="productivity" data-i18n="skill.filter.productivity"><span data-icon="plan"></span>
219
221
  생산성</button>
220
- <button class="skill-filter" data-filter="communication" data-i18n="skill.filter.communication">📧
222
+ <button class="skill-filter" data-filter="communication" data-i18n="skill.filter.communication"><span data-icon="link"></span>
221
223
  커뮤</button>
222
- <button class="skill-filter" data-filter="devtools" data-i18n="skill.filter.devtools">🔧 개발</button>
223
- <button class="skill-filter" data-filter="ai-media" data-i18n="skill.filter.ai">🤖 AI</button>
224
- <button class="skill-filter" data-filter="utility" data-i18n="skill.filter.utility">🌐 유틸</button>
225
- <button class="skill-filter" data-filter="smarthome" data-i18n="skill.filter.smarthome">🏠 홈</button>
226
- <button class="skill-filter" data-filter="other" data-i18n="skill.filter.other">📂 기타</button>
224
+ <button class="skill-filter" data-filter="devtools" data-i18n="skill.filter.devtools"><span data-icon="tool"></span> 개발</button>
225
+ <button class="skill-filter" data-filter="ai-media" data-i18n="skill.filter.ai"><span data-icon="robot"></span> AI</button>
226
+ <button class="skill-filter" data-filter="utility" data-i18n="skill.filter.utility"><span data-icon="web"></span> 유틸</button>
227
+ <button class="skill-filter" data-filter="smarthome" data-i18n="skill.filter.smarthome"><span data-icon="house"></span> 홈</button>
228
+ <button class="skill-filter" data-filter="other" data-i18n="skill.filter.other"><span data-icon="folder"></span> 기타</button>
227
229
  </div>
228
230
  <div class="text-xs text-dim" id="skillsCount" data-i18n="loading">로딩 중...</div>
229
231
  <div id="skillsList"></div>
@@ -232,11 +234,11 @@
232
234
  <!-- Settings Tab -->
233
235
  <div id="tabSettings" class="tab-content" role="tabpanel" aria-labelledby="tabBtnSettings">
234
236
  <button class="btn-clear btn-action-block" data-action="openPrompt"
235
- data-i18n="btn.editPrompt">✏️
237
+ data-i18n="btn.editPrompt"><span data-icon="pencil"></span>
236
238
  시스템 프롬프트 편집</button>
237
239
  <!-- Active Channel Toggle -->
238
240
  <div class="settings-group">
239
- <h4>📡 Active Channel</h4>
241
+ <h4><span data-icon="radio"></span> Active Channel</h4>
240
242
  <div class="settings-row">
241
243
  <label>Runtime</label>
242
244
  <div>
@@ -248,7 +250,7 @@
248
250
 
249
251
  <!-- Telegram Bot -->
250
252
  <div id="channelTelegramSettings" class="settings-group">
251
- <h4>📬 Telegram</h4>
253
+ <h4><span data-provider="telegram"></span> Telegram</h4>
252
254
  <div class="settings-row">
253
255
  <label data-i18n="label.enabled">활성화</label>
254
256
  <div>
@@ -276,7 +278,7 @@
276
278
 
277
279
  <!-- Discord Bot -->
278
280
  <div id="channelDiscordSettings" class="settings-group" style="display:none">
279
- <h4>🎮 Discord</h4>
281
+ <h4><span data-provider="discord"></span> Discord</h4>
280
282
  <div class="settings-row">
281
283
  <label data-i18n="label.enabled">활성화</label>
282
284
  <div>
@@ -296,6 +298,13 @@
296
298
  <label>Channel IDs</label>
297
299
  <input type="text" id="dcChannelIds" placeholder="콤마 구분 (비워두면 전체 허용)" class="input-sm">
298
300
  </div>
301
+ <div class="settings-row sub-row">
302
+ <label data-i18n="label.mentionOnly">Mention Only</label>
303
+ <div>
304
+ <button id="dcMentionOff" class="perm-btn active" data-i18n="btn.off">끔</button>
305
+ <button id="dcMentionOn" class="perm-btn" data-i18n="btn.on">켬</button>
306
+ </div>
307
+ </div>
299
308
  <div class="settings-row sub-row">
300
309
  <label data-i18n="label.forwardAll">자동 전송</label>
301
310
  <div>
@@ -314,7 +323,7 @@
314
323
 
315
324
  <!-- Per-CLI Models -->
316
325
  <div class="settings-group">
317
- <h4>🟣 Claude</h4>
326
+ <h4><span data-provider="claude"></span> Claude</h4>
318
327
  <div class="settings-row">
319
328
  <label>Model</label>
320
329
  <select id="modelClaude"></select>
@@ -330,7 +339,7 @@
330
339
  </select>
331
340
  </div>
332
341
  <div class="settings-row sub-row">
333
- <label>🧠 1M Context</label>
342
+ <label><span data-icon="brain"></span> 1M Context</label>
334
343
  <div>
335
344
  <button id="claude1mOff" class="perm-btn active">Off</button>
336
345
  <button id="claude1mOn" class="perm-btn">On</button>
@@ -339,7 +348,7 @@
339
348
  </div>
340
349
 
341
350
  <div class="settings-group">
342
- <h4>🟢 Codex</h4>
351
+ <h4><span data-provider="codex"></span> Codex</h4>
343
352
  <div class="settings-row">
344
353
  <label>Model</label>
345
354
  <select id="modelCodex"></select>
@@ -356,14 +365,14 @@
356
365
  </select>
357
366
  </div>
358
367
  <div class="settings-row sub-row">
359
- <label>⚡ Fast Mode</label>
368
+ <label><span data-icon="exec"></span> Fast Mode</label>
360
369
  <div>
361
370
  <button id="codexFastOff" class="perm-btn active" data-i18n="btn.off">끔</button>
362
371
  <button id="codexFastOn" class="perm-btn" data-i18n="btn.on">켬</button>
363
372
  </div>
364
373
  </div>
365
374
  <div class="settings-row sub-row">
366
- <label>🧠 1M Context</label>
375
+ <label><span data-icon="brain"></span> 1M Context</label>
367
376
  <div>
368
377
  <button id="codexCtxOff" class="perm-btn active">Off</button>
369
378
  <button id="codexCtxOn" class="perm-btn">On</button>
@@ -384,7 +393,7 @@
384
393
  </div>
385
394
 
386
395
  <div class="settings-group">
387
- <h4>🔵 Gemini</h4>
396
+ <h4><span data-provider="gemini"></span> Gemini</h4>
388
397
  <div class="settings-row">
389
398
  <label>Model</label>
390
399
  <select id="modelGemini"></select>
@@ -394,7 +403,7 @@
394
403
  </div>
395
404
 
396
405
  <div class="settings-group">
397
- <h4>🟠 OpenCode</h4>
406
+ <h4><span data-provider="opencode"></span> OpenCode</h4>
398
407
  <div class="settings-row">
399
408
  <label>Model</label>
400
409
  <select id="modelOpencode"></select>
@@ -414,7 +423,7 @@
414
423
  </div>
415
424
 
416
425
  <div class="settings-group">
417
- <h4>💙 Copilot</h4>
426
+ <h4><span data-provider="copilot"></span> Copilot</h4>
418
427
  <div class="settings-row">
419
428
  <label>Model</label>
420
429
  <select id="modelCopilot"></select>
@@ -431,7 +440,7 @@
431
440
 
432
441
  <!-- Fallback Order -->
433
442
  <div class="settings-group">
434
- <h4>⚡ Fallback</h4>
443
+ <h4><span data-icon="exec"></span> Fallback</h4>
435
444
  <p class="text-xs text-dim fallback-desc" data-i18n="fallback.desc">CLI 실패 시 자동
436
445
  재시도 순서</p>
437
446
  <div id="fallbackOrderList"></div>
@@ -439,20 +448,20 @@
439
448
 
440
449
  <!-- MCP Servers -->
441
450
  <div class="settings-group">
442
- <h4>🔌 MCP Servers</h4>
451
+ <h4><span data-icon="link"></span> MCP Servers</h4>
443
452
  <div id="mcpServerList" class="text-status py-1">
444
453
  Loading...
445
454
  </div>
446
455
  <button class="btn-clear btn-action-block"
447
- data-action="syncMcp">🔄 Sync to all CLIs</button>
456
+ data-action="syncMcp"><span data-icon="refresh"></span> Sync to all CLIs</button>
448
457
  <button class="btn-clear btn-action-block"
449
- data-action="installMcp">📦 Install Globally (npm i -g)</button>
458
+ data-action="installMcp"><span data-icon="compacting"></span> Install Globally (npm i -g)</button>
450
459
  <div id="mcpSyncResult" class="text-xs text-dim py-1" style="display:none"></div>
451
460
  </div>
452
461
 
453
462
  <!-- STT Settings -->
454
463
  <div class="settings-group">
455
- <h4 data-i18n="stt.title">🎙️ 음성 인식 (STT)</h4>
464
+ <h4 data-i18n="stt.title"><span data-icon="mic"></span> 음성 인식 (STT)</h4>
456
465
  <div class="settings-row">
457
466
  <label data-i18n="stt.engine">엔진</label>
458
467
  <select id="sttEngine">
@@ -474,7 +483,7 @@
474
483
  <option value="gemini-2.5-flash-lite">gemini-2.5-flash-lite (fast)</option>
475
484
  <option value="gemini-2.5-flash">gemini-2.5-flash (balanced)</option>
476
485
  <option value="gemini-2.5-pro">gemini-2.5-pro (accurate)</option>
477
- <option value="__custom__">✏️ 직접 입력...</option>
486
+ <option value="__custom__">직접 입력...</option>
478
487
  </select>
479
488
  <input type="text" id="sttGeminiModelCustom" placeholder="모델명 입력"
480
489
  class="mt-1" style="display:none" />
@@ -503,7 +512,7 @@
503
512
  <input type="text" id="sttWhisperModel" placeholder="mlx-community/..." class="input-sm">
504
513
  </div>
505
514
  <small class="text-shortcut-hint" data-i18n="stt.shortcutHint">
506
- ⌨️ Ctrl+Shift+Space (⌘+Shift+Space on Mac)</small>
515
+ Ctrl+Shift+Space (⌘+Shift+Space on Mac)</small>
507
516
  </div>
508
517
 
509
518
 
@@ -531,7 +540,7 @@
531
540
  <div class="modal-overlay" id="heartbeatModal" role="dialog" aria-modal="true" aria-label="Heartbeat jobs">
532
541
  <div class="modal-box modal-scrollable" >
533
542
  <div class="modal-header">
534
- <span data-i18n="modal.heartbeatTitle">💓 하트비트 작업</span>
543
+ <span data-icon="heartPulse"></span> <span data-i18n="modal.heartbeatTitle">하트비트 작업</span>
535
544
  <button data-action="closeHeartbeat"
536
545
  class="btn-modal-close" aria-label="Close">✕</button>
537
546
  </div>
@@ -546,19 +555,19 @@
546
555
  <div class="modal-overlay" id="memoryModal" role="dialog" aria-modal="true" aria-label="Memory files">
547
556
  <div class="modal-box modal-scrollable" >
548
557
  <div class="modal-header">
549
- <span data-i18n="modal.memoryTitle">🧠 메모리</span>
558
+ <span data-i18n="modal.memoryTitle"><span data-icon="brain"></span> 메모리</span>
550
559
  <button data-action="closeMemory"
551
560
  class="btn-modal-close" aria-label="Close">✕</button>
552
561
  </div>
553
562
  <div class="tab-strip" role="tablist">
554
563
  <button class="mem-tab active mem-tab-btn" id="memTabBtnSettings" role="tab" aria-selected="true" aria-controls="memTabSettings"
555
- >⚙️
564
+ ><span data-icon="settings"></span>
556
565
  Settings</button>
557
566
  <button class="mem-tab mem-tab-btn" id="memTabBtnAdvOps" role="tab" aria-selected="false" aria-controls="memTabAdvOps"
558
- >📊
567
+ ><span data-icon="chart"></span>
559
568
  Status</button>
560
569
  <button class="mem-tab mem-tab-btn" id="memTabBtnFiles" role="tab" aria-selected="false" aria-controls="memTabFiles"
561
- >📂
570
+ ><span data-icon="folder"></span>
562
571
  Files</button>
563
572
  </div>
564
573
  <div id="advStatusBanner" class="adv-status-banner" style="display:none"></div>
@@ -617,7 +626,7 @@
617
626
  </div>
618
627
  <div
619
628
  class="info-box">
620
- 💡 Counter: <span id="memCounter">0</span> / <span id="memThreshold">10</span> responses until next
629
+ <span data-icon="lightbulb"></span> Counter: <span id="memCounter">0</span> / <span id="memThreshold">10</span> responses until next
621
630
  flush
622
631
  </div>
623
632
  </div>
@@ -645,10 +654,10 @@
645
654
  </div>
646
655
  </div>
647
656
  <div class="flex gap-2 flex-wrap mt-3">
648
- <button class="btn-clear" id="advBootstrapBtn">🧩 Bootstrap</button>
649
- <button class="btn-clear" id="advReindexBtn">🔄 Reindex</button>
650
- <button class="btn-clear" id="advReimportBtn">📥 Re-import Legacy</button>
651
- <button class="btn-clear" id="advOpenCorruptedBtn">📂 Open Corrupted Folder</button>
657
+ <button class="btn-clear" id="advBootstrapBtn"><span data-icon="settings"></span> Bootstrap</button>
658
+ <button class="btn-clear" id="advReindexBtn"><span data-icon="refresh"></span> Reindex</button>
659
+ <button class="btn-clear" id="advReimportBtn"><span data-icon="save"></span> Re-import Legacy</button>
660
+ <button class="btn-clear" id="advOpenCorruptedBtn"><span data-icon="folder"></span> Open Corrupted Folder</button>
652
661
  </div>
653
662
  </div>
654
663
  <div id="memTabFiles" class="p-3" style="display:none" role="tabpanel" aria-labelledby="memTabBtnFiles">
@@ -667,14 +676,14 @@
667
676
  <!-- Mobile Navigation -->
668
677
  <div class="mobile-nav">
669
678
  <button id="mobileMenuLeft" aria-label="Open menu">☰ Menu</button>
670
- <button id="mobileMenuRight" aria-label="Open settings">⚙️ Settings</button>
679
+ <button id="mobileMenuRight" aria-label="Open settings"><span data-icon="settings"></span> Settings</button>
671
680
  </div>
672
681
 
673
682
  <!-- Template Editor Modal (Node Map + Editor 2-view) -->
674
683
  <div class="modal-overlay" id="templateModal" role="dialog" aria-modal="true" aria-label="Prompt templates">
675
684
  <div class="modal-box modal-template" >
676
685
  <div class="modal-header">
677
- <span id="templateModalTitle">📝 프롬프트 구조</span>
686
+ <span id="templateModalTitle"><span data-icon="plan"></span> 프롬프트 구조</span>
678
687
  <button data-action="closeTemplate"
679
688
  class="btn-modal-close" aria-label="Close">✕</button>
680
689
  </div>
@@ -682,7 +691,7 @@
682
691
  <div id="templateTreeView" class="template-tree-area">
683
692
  <div id="templateTree"></div>
684
693
  <div class="template-hint">
685
- 🔒 클릭하면 프롬프트 내용 확인 · ⚠️ 개발자 모드에서 편집
694
+ <span data-icon="lock"></span> 클릭하면 프롬프트 내용 확인 · <span data-icon="warning"></span> 개발자 모드에서 편집
686
695
  </div>
687
696
  </div>
688
697
  <!-- View 2: Editor (hidden by default) -->
@@ -694,14 +703,14 @@
694
703
  뒤로</button>
695
704
  <span id="templateEditorLabel" class="flex-1 text-sm text-dim"></span>
696
705
  <button id="templateDevToggle"
697
- class="btn-dev-toggle">🔧
706
+ class="btn-dev-toggle"><span data-icon="tool"></span>
698
707
  개발자 모드</button>
699
708
  </div>
700
709
  <textarea class="modal-textarea template-textarea" id="templateEditor" readonly
701
710
  ></textarea>
702
711
  <div class="modal-footer">
703
712
  <span id="templateVars" class="text-xs text-dim mr-auto"></span>
704
- <button class="btn-save" data-action="saveTemplate" style="display:none" id="templateSaveBtn">💾
713
+ <button class="btn-save" data-action="saveTemplate" style="display:none" id="templateSaveBtn"><span data-icon="save"></span>
705
714
  저장</button>
706
715
  </div>
707
716
  </div>
@@ -38,6 +38,13 @@ const FALLBACK_CLI_REGISTRY: CliRegistry = {
38
38
  'openai/gpt-5.3-codex-xhigh',
39
39
  'openai/gpt-5.3-codex-high',
40
40
  'opencode/big-pickle',
41
+ 'opencode-go/glm-5',
42
+ 'opencode-go/glm-5.1',
43
+ 'opencode-go/kimi-k2.5',
44
+ 'opencode-go/mimo-v2-pro',
45
+ 'opencode-go/mimo-v2-omni',
46
+ 'opencode-go/minimax-m2.5',
47
+ 'opencode-go/minimax-m2.7',
41
48
  'opencode/GLM-5 Free',
42
49
  'opencode/MiniMax M2.5 Free',
43
50
  'opencode/Kimi K2.5 Free',
@@ -48,11 +55,10 @@ const FALLBACK_CLI_REGISTRY: CliRegistry = {
48
55
  copilot: {
49
56
  label: 'Copilot',
50
57
  efforts: ['low', 'medium', 'high'],
51
- effortNote: ' ~/.copilot/config.json',
58
+ effortNote: '-> ~/.copilot/config.json',
52
59
  models: [
53
60
  'claude-sonnet-4.6',
54
61
  'claude-opus-4.6',
55
- 'claude-opus-4.6-fast',
56
62
  'claude-haiku-4.5',
57
63
  'gpt-5.4',
58
64
  'gpt-5.3-codex',