mulmoclaude 0.3.0 → 0.4.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 (185) hide show
  1. package/bin/mulmoclaude.js +7 -24
  2. package/client/assets/html2canvas-Cx501zZr-Cv5snK9D.js +5 -0
  3. package/client/assets/index-CubzmCVK.css +2 -0
  4. package/client/assets/{index-eHWB79u5.js → index-DtcyExH9.js} +80 -61
  5. package/client/assets/{index.es-D4YyL_Dg-BfRHLTZV.js → index.es-D4YyL_Dg-DnizuhIY.js} +5 -5
  6. package/client/index.html +2 -4
  7. package/package.json +13 -13
  8. package/server/agent/attachmentConverter.ts +2 -2
  9. package/server/agent/index.ts +9 -3
  10. package/server/agent/mcp-tools/index.ts +6 -6
  11. package/server/agent/mcp-tools/x.ts +2 -1
  12. package/server/agent/prompt.ts +187 -26
  13. package/server/agent/resumeFailover.ts +5 -5
  14. package/server/agent/sandboxMounts.ts +3 -3
  15. package/server/api/auth/bearerAuth.ts +3 -3
  16. package/server/api/auth/token.ts +2 -2
  17. package/server/api/routes/agent.ts +21 -3
  18. package/server/api/routes/config.ts +1 -1
  19. package/server/api/routes/files.ts +13 -12
  20. package/server/api/routes/html.ts +2 -2
  21. package/server/api/routes/image.ts +7 -7
  22. package/server/api/routes/mulmo-script.ts +33 -31
  23. package/server/api/routes/pdf.ts +2 -2
  24. package/server/api/routes/plugins.ts +16 -6
  25. package/server/api/routes/roles.ts +2 -2
  26. package/server/api/routes/scheduler.ts +8 -6
  27. package/server/api/routes/schedulerTasks.ts +5 -3
  28. package/server/api/routes/sessions.ts +2 -2
  29. package/server/api/routes/sessionsCursor.ts +4 -4
  30. package/server/api/routes/skills.ts +5 -5
  31. package/server/api/routes/sources.ts +3 -3
  32. package/server/api/routes/todosHandlers.ts +1 -1
  33. package/server/api/routes/todosItemsHandlers.ts +14 -14
  34. package/server/api/routes/wiki.ts +22 -8
  35. package/server/api/sandboxStatus.ts +1 -1
  36. package/server/events/notifications.ts +6 -6
  37. package/server/events/pub-sub/index.ts +3 -3
  38. package/server/events/relay-client.ts +17 -16
  39. package/server/index.ts +40 -46
  40. package/server/system/config.ts +5 -5
  41. package/server/system/credentials.ts +7 -5
  42. package/server/system/env.ts +5 -5
  43. package/server/utils/files/atomic.ts +11 -11
  44. package/server/utils/files/image-store.ts +17 -6
  45. package/server/utils/files/journal-io.ts +2 -2
  46. package/server/utils/files/json.ts +5 -5
  47. package/server/utils/files/markdown-store.ts +4 -4
  48. package/server/utils/files/reference-dirs-io.ts +3 -3
  49. package/server/utils/files/roles-io.ts +4 -4
  50. package/server/utils/files/safe.ts +14 -14
  51. package/server/utils/files/scheduler-overrides-io.ts +2 -2
  52. package/server/utils/files/spreadsheet-store.ts +5 -5
  53. package/server/utils/files/workspace-io.ts +12 -12
  54. package/server/utils/gemini.ts +2 -2
  55. package/server/utils/gitignore.ts +9 -9
  56. package/server/utils/json.ts +5 -5
  57. package/server/utils/logBackgroundError.ts +12 -3
  58. package/server/utils/markdown.ts +5 -5
  59. package/server/utils/port.d.mts +6 -0
  60. package/server/utils/port.mjs +48 -0
  61. package/server/utils/request.ts +12 -6
  62. package/server/utils/spawn.ts +1 -1
  63. package/server/utils/types.ts +2 -2
  64. package/server/workspace/chat-index/summarizer.ts +4 -4
  65. package/server/workspace/custom-dirs.ts +5 -5
  66. package/server/workspace/journal/diff.ts +2 -2
  67. package/server/workspace/journal/index.ts +4 -4
  68. package/server/workspace/journal/optimizationPass.ts +2 -2
  69. package/server/workspace/journal/state.ts +6 -6
  70. package/server/workspace/paths.ts +3 -3
  71. package/server/workspace/reference-dirs.ts +3 -3
  72. package/server/workspace/skills/parser.ts +6 -6
  73. package/server/workspace/skills/scheduler.ts +3 -3
  74. package/server/workspace/skills/writer.ts +3 -3
  75. package/server/workspace/sources/arxivDiscovery.ts +2 -2
  76. package/server/workspace/sources/fetchers/rss.ts +5 -5
  77. package/server/workspace/sources/fetchers/rssParser.ts +4 -4
  78. package/server/workspace/sources/interests.ts +3 -3
  79. package/server/workspace/sources/paths.ts +6 -6
  80. package/server/workspace/sources/pipeline/fetch.ts +36 -13
  81. package/server/workspace/sources/pipeline/index.ts +2 -7
  82. package/server/workspace/sources/pipeline/notify.ts +3 -3
  83. package/server/workspace/sources/pipeline/plan.ts +11 -9
  84. package/server/workspace/sources/pipeline/write.ts +5 -5
  85. package/server/workspace/sources/rateLimiter.ts +1 -1
  86. package/server/workspace/sources/sourceState.ts +9 -4
  87. package/server/workspace/sources/types.ts +9 -0
  88. package/server/workspace/sources/urls.ts +1 -1
  89. package/server/workspace/tool-trace/classify.ts +4 -4
  90. package/server/workspace/workspace.ts +7 -7
  91. package/src/App.vue +286 -112
  92. package/src/components/CanvasViewToggle.vue +10 -7
  93. package/src/components/ChatInput.vue +60 -26
  94. package/src/components/FileContentHeader.vue +7 -4
  95. package/src/components/FileContentRenderer.vue +20 -6
  96. package/src/components/FileTree.vue +6 -3
  97. package/src/components/FileTreePane.vue +11 -8
  98. package/src/components/FilesView.vue +5 -3
  99. package/src/components/LockStatusPopup.vue +15 -12
  100. package/src/components/NotificationBell.vue +14 -5
  101. package/src/components/NotificationToast.vue +4 -1
  102. package/src/components/PluginLauncher.vue +19 -56
  103. package/src/components/RightSidebar.vue +13 -10
  104. package/src/components/SessionHistoryPanel.vue +33 -29
  105. package/src/components/SessionTabBar.vue +8 -10
  106. package/src/components/SettingsMcpTab.vue +43 -30
  107. package/src/components/SettingsModal.vue +21 -19
  108. package/src/components/SettingsReferenceDirsTab.vue +29 -24
  109. package/src/components/SettingsWorkspaceDirsTab.vue +32 -22
  110. package/src/components/SidebarHeader.vue +25 -4
  111. package/src/components/StackView.vue +4 -1
  112. package/src/components/SuggestionsPanel.vue +5 -2
  113. package/src/components/TodoExplorer.vue +26 -15
  114. package/src/components/ToolResultsPanel.vue +27 -13
  115. package/src/components/todo/TodoAddDialog.vue +17 -12
  116. package/src/components/todo/TodoEditDialog.vue +7 -2
  117. package/src/components/todo/TodoEditPanel.vue +15 -10
  118. package/src/components/todo/TodoKanbanView.vue +10 -5
  119. package/src/components/todo/TodoListView.vue +5 -2
  120. package/src/components/todo/TodoTableView.vue +5 -2
  121. package/src/composables/useAppApi.ts +9 -0
  122. package/src/composables/useDynamicFavicon.ts +172 -37
  123. package/src/composables/useEventListeners.ts +7 -8
  124. package/src/composables/useFaviconState.ts +13 -2
  125. package/src/composables/useFileSelection.ts +24 -6
  126. package/src/composables/useLayoutMode.ts +32 -0
  127. package/src/composables/useSessionHistory.ts +7 -17
  128. package/src/composables/useViewLayout.ts +20 -34
  129. package/src/lang/de.ts +536 -0
  130. package/src/lang/en.ts +558 -0
  131. package/src/lang/es.ts +543 -0
  132. package/src/lang/fr.ts +536 -0
  133. package/src/lang/ja.ts +536 -0
  134. package/src/lang/ko.ts +540 -0
  135. package/src/lang/pt-BR.ts +534 -0
  136. package/src/lang/zh.ts +537 -0
  137. package/src/lib/vue-i18n.ts +97 -0
  138. package/src/main.ts +2 -0
  139. package/src/plugins/canvas/View.vue +102 -186
  140. package/src/plugins/canvas/definition.ts +0 -8
  141. package/src/plugins/chart/Preview.vue +1 -1
  142. package/src/plugins/chart/View.vue +9 -4
  143. package/src/plugins/manageRoles/Preview.vue +4 -1
  144. package/src/plugins/manageRoles/View.vue +59 -43
  145. package/src/plugins/manageSkills/Preview.vue +8 -3
  146. package/src/plugins/manageSkills/View.vue +26 -22
  147. package/src/plugins/manageSource/Preview.vue +1 -1
  148. package/src/plugins/manageSource/View.vue +73 -52
  149. package/src/plugins/markdown/Preview.vue +1 -1
  150. package/src/plugins/markdown/View.vue +24 -34
  151. package/src/plugins/presentHtml/Preview.vue +1 -1
  152. package/src/plugins/presentHtml/View.vue +7 -4
  153. package/src/plugins/presentMulmoScript/Preview.vue +1 -1
  154. package/src/plugins/presentMulmoScript/View.vue +36 -26
  155. package/src/plugins/scheduler/Preview.vue +7 -4
  156. package/src/plugins/scheduler/TasksTab.vue +53 -24
  157. package/src/plugins/scheduler/View.vue +28 -19
  158. package/src/plugins/scheduler/formatSchedule.ts +93 -0
  159. package/src/plugins/spreadsheet/Preview.vue +8 -3
  160. package/src/plugins/spreadsheet/View.vue +21 -12
  161. package/src/plugins/textResponse/Preview.vue +15 -58
  162. package/src/plugins/textResponse/View.vue +27 -7
  163. package/src/plugins/todo/Preview.vue +11 -6
  164. package/src/plugins/todo/View.vue +27 -13
  165. package/src/plugins/ui-image/ImagePreview.vue +6 -3
  166. package/src/plugins/ui-image/ImageView.vue +7 -4
  167. package/src/plugins/wiki/Preview.vue +5 -2
  168. package/src/plugins/wiki/View.vue +202 -81
  169. package/src/plugins/wiki/route.ts +112 -0
  170. package/src/router/guards.ts +42 -24
  171. package/src/router/index.ts +41 -26
  172. package/src/types/vue-i18n.d.ts +20 -0
  173. package/src/utils/agent/request.ts +19 -0
  174. package/src/utils/canvas/layoutMode.ts +26 -0
  175. package/src/utils/image/cacheBust.ts +16 -0
  176. package/src/utils/image/resolve.ts +16 -0
  177. package/src/utils/path/workspaceLinkRouter.ts +81 -0
  178. package/src/vite-env.d.ts +9 -0
  179. package/client/assets/chunk-vKJrgz-R-C_I3GbVV.js +0 -1
  180. package/client/assets/html2canvas-Cx501zZr-BF5dYYkY.js +0 -5
  181. package/client/assets/index-Bm70FDU2.css +0 -1
  182. package/client/assets/typeof-DBp4T-Ny-BC0P-2DM.js +0 -1
  183. package/src/composables/useCanvasViewMode.ts +0 -121
  184. package/src/utils/canvas/viewMode.ts +0 -46
  185. /package/client/assets/{purify.es-Fx1Nqyry-PeS5RUhs.js → purify.es-Fx1Nqyry-BwJECkqS.js} +0 -0
package/src/lang/ko.ts ADDED
@@ -0,0 +1,540 @@
1
+ // Korean dictionary. Mirror the shape of src/lang/en.ts —
2
+ // missing keys fall back to English per createI18n's fallbackLocale.
3
+ //
4
+ // ⚠️ `<name>` 같은 꺾쇠 괄호가 들어간 문자열은 vue-i18n 의 XSS
5
+ // 탐지에 걸려 "Detected HTML in '…' message" 경고가 발생하므로
6
+ // 반드시 **함수 형식** 으로 작성한다. 자세한 내용은 en.ts 의
7
+ // 헤더 주석 참고.
8
+
9
+ const koMessages = {
10
+ common: {
11
+ save: "저장",
12
+ cancel: "취소",
13
+ loading: "불러오는 중...",
14
+ close: "닫기",
15
+ dismiss: "닫기",
16
+ add: "추가",
17
+ remove: "삭제",
18
+ saving: "저장 중...",
19
+ saved: "저장됨",
20
+ noResultsYet: "아직 결과가 없습니다",
21
+ noImageYet: "아직 이미지가 없습니다",
22
+ },
23
+ sessionTabBar: {
24
+ newSession: "새 세션",
25
+ sessionHistory: "세션 기록",
26
+ // 한국어는 단·복수 구분이 없어 같은 문자열이지만 vue-i18n 의
27
+ // pluralization 규약에 맞추기 위해 `|` 구분자를 유지합니다.
28
+ activeSessions: "활성 세션 {count}개 (에이전트 실행 중)",
29
+ unreadReplies: "읽지 않은 답장 {count}개",
30
+ },
31
+ chatInput: {
32
+ placeholder: "작업을 입력하거나 파일을 드래그 / 붙여넣기 / 첨부하세요…",
33
+ expandEditor: "에디터 확장",
34
+ composeMessage: "메시지 작성",
35
+ sendHint: "Cmd+Enter 로 전송",
36
+ send: "전송",
37
+ attachFile: "파일 첨부",
38
+ fileTooLarge: "파일이 너무 큽니다 ({sizeMB} MB). 최대 30 MB 까지 가능합니다.",
39
+ unsupportedFileType: "지원되지 않는 파일 형식입니다. 이미지, PDF, DOCX, XLSX, PPTX, 텍스트 파일만 지원됩니다.",
40
+ },
41
+ sessionHistoryPanel: {
42
+ filters: {
43
+ all: "전체",
44
+ unread: "읽지 않음",
45
+ human: "사람",
46
+ scheduler: "스케줄러",
47
+ skill: "스킬",
48
+ bridge: "브리지",
49
+ },
50
+ failedToRefresh: "⚠ 새로고침 실패: {error}",
51
+ showingLastKnown: " — 마지막으로 불러온 목록을 표시하고 있습니다.",
52
+ noSessions: "아직 세션이 없습니다.",
53
+ noMatching: "일치하는 세션이 없습니다.",
54
+ running: "실행 중",
55
+ unread: "읽지 않음",
56
+ noMessages: "(메시지 없음)",
57
+ },
58
+ notificationBell: {
59
+ notifications: "알림",
60
+ markAllRead: "모두 읽음 처리",
61
+ noNotifications: "알림이 없습니다",
62
+ dismiss: "닫기",
63
+ },
64
+ sidebarHeader: {
65
+ home: "최신 채팅으로 이동",
66
+ toolCallHistory: "도구 호출 기록",
67
+ settings: "설정",
68
+ },
69
+ rightSidebar: {
70
+ toggleSystemPrompt: "시스템 프롬프트 토글",
71
+ systemPrompt: "시스템 프롬프트",
72
+ availableTools: "사용 가능한 도구",
73
+ toggleToolDescription: "도구 설명 토글",
74
+ toolCallHistory: "도구 호출 기록",
75
+ noToolCalls: "아직 도구 호출이 없습니다",
76
+ arguments: "인자",
77
+ error: "오류",
78
+ result: "결과",
79
+ running: "실행 중...",
80
+ },
81
+ fileTreePane: {
82
+ sort: "정렬:",
83
+ sortByName: "이름순 정렬",
84
+ name: "이름",
85
+ sortByRecent: "수정일순 정렬 (최신순)",
86
+ recent: "최근",
87
+ reference: "참조",
88
+ // "RO" = Read-Only. 간결한 배지로 표시하기 위해 영문 약어 유지.
89
+ readOnlyBadge: "RO",
90
+ },
91
+ fileTree: {
92
+ workspace: "(워크스페이스)",
93
+ recentlyChanged: "최근 변경됨",
94
+ },
95
+ lockStatusPopup: {
96
+ sandboxEnabledTooltip: "샌드박스 활성화 (Docker)",
97
+ noSandboxTooltip: "샌드박스 없음 (Docker 미발견)",
98
+ sandboxEnabledLabel: "샌드박스 활성화:",
99
+ sandboxEnabledBody: "Docker 가 실행 중입니다. 파일 시스템 접근이 격리됩니다.",
100
+ noSandboxLabel: "샌드박스 없음:",
101
+ noSandboxBodyPrefix: "Claude 가 이 컴퓨터의 모든 파일에 접근할 수 있습니다. 파일 시스템 격리를 활성화하려면",
102
+ noSandboxBodySuffix: "을(를) 설치하세요.",
103
+ dockerDesktop: "Docker Desktop",
104
+ hostCredentials: "연결된 호스트 인증 정보:",
105
+ credsLoading: "불러오는 중…",
106
+ sshAgent: "SSH 에이전트:",
107
+ forwarded: "전달됨",
108
+ notForwarded: "전달되지 않음",
109
+ mountedConfigs: "마운트된 설정:",
110
+ none: "없음",
111
+ testIsolation: "샌드박스 격리 테스트:",
112
+ },
113
+ settingsModal: {
114
+ title: "설정",
115
+ tabs: {
116
+ tools: "허용된 도구",
117
+ mcp: "MCP 서버",
118
+ dirs: "디렉터리",
119
+ refs: "참조 디렉터리",
120
+ },
121
+ toolNamesLabel: "도구 이름",
122
+ invalidToolNamesPrefix: "다음은 비표준으로 보입니다 (예상 접두사",
123
+ invalidToolNamesSuffix: "):",
124
+ mcpToolsError: "⚠ MCP 도구 상태를 가져올 수 없습니다: {error}. 활성화 여부와 무관하게 모든 도구를 표시합니다.",
125
+ changesHint: "변경 사항은 다음 메시지부터 적용됩니다. 재시작은 필요하지 않습니다.",
126
+ cannotSaveTooltip: "설정을 성공적으로 불러오기 전에는 저장할 수 없습니다",
127
+ saving: "저장 중…",
128
+ loadingLabel: "불러오는 중…",
129
+ },
130
+ canvasViewToggle: {
131
+ stackViewTooltip: "스택 보기 · 클릭하여 단일 보기로 전환 (⌘1)",
132
+ singleViewTooltip: "단일 보기 · 클릭하여 스택 보기로 전환 (⌘2)",
133
+ switchToSingle: "단일 보기로 전환",
134
+ switchToStack: "스택 보기로 전환",
135
+ },
136
+ settingsWorkspaceDirs: {
137
+ explanation: "{dataDir} 와 {artifactsDir} 아래에서 파일을 정리하기 위한 커스텀 디렉터리입니다. Claude 는 이를 참조해 파일 저장 위치를 결정합니다.",
138
+ noEntries: "설정된 커스텀 디렉터리가 없습니다.",
139
+ addDirTitle: "디렉터리 추가",
140
+ pathPlaceholder: "data/clients 또는 artifacts/reports",
141
+ descPlaceholder: "설명 (이 폴더에 무엇을 보관할지)",
142
+ errPathRequired: "경로를 입력하세요",
143
+ errMustStartWith: "data/ 또는 artifacts/ 로 시작해야 합니다",
144
+ errAlreadyExists: "이미 존재합니다",
145
+ },
146
+ settingsReferenceDirs: {
147
+ explanation:
148
+ "Claude 가 읽을 수는 있지만 수정할 수 없는 외부 디렉터리입니다. Docker 모드에서는 읽기 전용으로 마운트됩니다. Obsidian 볼트, 프로젝트 코드, 문서 폴더를 참조할 때 유용합니다.",
149
+ noEntries: "설정된 참조 디렉터리가 없습니다.",
150
+ addDirTitle: "참조 디렉터리 추가",
151
+ pathPlaceholder: "/Users/me/ObsidianVault 또는 ~/Documents/notes",
152
+ labelPlaceholder: "라벨 (선택 — 기본값은 폴더 이름)",
153
+ readOnlyBadge: "읽기 전용",
154
+ errPathRequired: "경로를 입력하세요",
155
+ errMustBeAbsolute: "절대 경로이거나 ~/ 로 시작해야 합니다",
156
+ errAlreadyExists: "이미 존재합니다",
157
+ errLabelConflict: '라벨 "{label}" 은(는) 이미 사용 중입니다',
158
+ },
159
+ pluginLauncher: {
160
+ todos: { label: "할 일", title: "할 일 열기 (⌘4)" },
161
+ scheduler: { label: "일정", title: "일정 열기 (⌘5)" },
162
+ wiki: { label: "위키", title: "위키 열기 (⌘6)" },
163
+ skills: { label: "스킬", title: "스킬 열기 (⌘7)" },
164
+ roles: { label: "역할", title: "역할 열기 (⌘8)" },
165
+ files: { label: "파일", title: "워크스페이스 파일 열기 (⌘3)" },
166
+ },
167
+ fileContentHeader: {
168
+ showRendered: "렌더링된 Markdown 표시",
169
+ showRaw: "원본 표시",
170
+ rendered: "렌더링",
171
+ raw: "원본",
172
+ closeFile: "파일 닫기",
173
+ },
174
+ fileContentRenderer: {
175
+ selectFile: "파일을 선택하세요",
176
+ htmlPreview: "HTML 미리보기",
177
+ pdfPreview: "PDF 미리보기",
178
+ parseError: "파싱 오류",
179
+ },
180
+ settingsMcpTab: {
181
+ explanation:
182
+ "외부 MCP 서버를 추가합니다. HTTP 서버는 모든 모드에서 동작합니다. Stdio 서버는 샌드박스 이미지의 {npx} / {node} / {tsx} 를 사용하며, Docker 가 활성화된 경우 경로는 워크스페이스 안에 있어야 합니다.",
183
+ localhostRewrite: "Docker 모드에서는 {localhost} 가 {hostDockerInternal} 로 재작성됩니다.",
184
+ noServers: "아직 구성된 MCP 서버가 없습니다.",
185
+ enabled: "활성화됨",
186
+ urlLabel: "URL:",
187
+ commandLabel: "명령:",
188
+ dockerNonWorkspaceWarning: "⚠ 워크스페이스 외부 경로가 포함되어 있어 Docker 내부에서 해석되지 않습니다.",
189
+ addServerButton: "+ MCP 서버 추가",
190
+ nameLabel: "이름",
191
+ namePlaceholder: "my-server",
192
+ typeHttp: "HTTP",
193
+ typeStdio: "Stdio (명령)",
194
+ urlFieldLabel: "URL",
195
+ urlPlaceholder: "https://example.com/mcp",
196
+ commandFieldLabel: "명령",
197
+ argsLabel: "인자 (한 줄에 하나)",
198
+ // Message function 형태 — vue-i18n 의 메시지 컴파일러를 우회해
199
+ // 리터럴 `@` 가 linked message 참조로 해석되는 것을 막습니다.
200
+ argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path",
201
+ errNoName: "이름을 입력하거나, 이름을 유추할 수 있는 URL / 인자를 입력하세요.",
202
+ errBadName: "이름은 소문자로 시작해야 하며 [a-z0-9_-] 만 포함할 수 있습니다.",
203
+ errIdExists: '서버 id "{id}" 는 이미 존재합니다.',
204
+ errBadHttpUrl: "HTTP URL 은 http:// 또는 https:// 로 시작해야 합니다",
205
+ },
206
+ pluginScheduler: {
207
+ prev: "이전",
208
+ today: "오늘",
209
+ goToday: "오늘로 이동",
210
+ next: "다음",
211
+ deleteItem: "항목 삭제",
212
+ closeEditor: "에디터 닫기",
213
+ apiError: "⚠ 스케줄러 업데이트 실패: {error}",
214
+ tabCalendar: "달력",
215
+ tabTasks: "작업",
216
+ heading: "스케줄러",
217
+ itemCount: "{count}개 항목",
218
+ noScheduled: "예약된 항목이 없습니다",
219
+ unscheduled: "미예약",
220
+ editItem: "항목 편집",
221
+ update: "업데이트",
222
+ editSource: "원본 편집",
223
+ applyChanges: "변경 사항 적용",
224
+ propLabel: "{key}:",
225
+ moreCount: "+{count}개 더",
226
+ previewIcon: "📅",
227
+ previewUpcoming: "예정 {count}개",
228
+ previewMore: "+ {count}개 더…",
229
+ },
230
+ pluginSchedulerTasks: {
231
+ recommendedFrequencies: "권장 주기",
232
+ tableTaskType: "작업 유형",
233
+ tableSuggestedSchedule: "권장 일정",
234
+ noTasks: "예약된 작업이 없습니다",
235
+ runNow: "지금 실행",
236
+ enable: "활성화",
237
+ disable: "비활성화",
238
+ delete: "삭제",
239
+ nextRun: "다음 실행: {time}",
240
+ originSystem: "시스템",
241
+ originUser: "사용자",
242
+ originSkill: "스킬",
243
+ runFailed: "실행 실패: {error}",
244
+ toggleFailed: "토글 실패: {error}",
245
+ deleteFailed: "삭제 실패: {error}",
246
+ },
247
+ pluginCanvas: {
248
+ undo: "실행 취소",
249
+ redo: "다시 실행",
250
+ clear: "지우기",
251
+ styleLabel: "스타일:",
252
+ },
253
+ pluginChart: {
254
+ untitled: "차트",
255
+ chartCount: "{count}개 차트",
256
+ chartTitle: "차트 {num}",
257
+ png: "PNG",
258
+ },
259
+ pluginTodo: {
260
+ clearFilters: "모든 필터 지우기",
261
+ deleteItem: "항목 삭제",
262
+ apiError: "⚠ 할 일 업데이트 실패: {error}",
263
+ heading: "할 일 목록",
264
+ completedRatio: "{done}/{total} 완료",
265
+ filter: "필터:",
266
+ noItems: "아직 할 일이 없습니다",
267
+ noMatchingFilter: "현재 필터와 일치하는 항목이 없습니다",
268
+ update: "업데이트",
269
+ clearCompleted: "완료된 항목 지우기",
270
+ clearButton: "지우기 ✕",
271
+ deleteSymbol: "✕",
272
+ },
273
+ todoExplorer: {
274
+ heading: "할 일",
275
+ doneRatio: "{done}/{total} 완료",
276
+ addButton: "+ 추가",
277
+ addColumnButton: "+ 칼럼",
278
+ labels: "라벨:",
279
+ searchPlaceholder: "검색...",
280
+ clearButton: "지우기 ✕",
281
+ clearFiltersTitle: "라벨 필터 지우기",
282
+ emptyHint: '아직 할 일이 없습니다. "+ 추가" 를 눌러 새로 만드세요.',
283
+ addColumn: "칼럼 추가",
284
+ newColumnLabelField: "라벨",
285
+ newColumnPlaceholder: "Review",
286
+ noMatchingFilter: "현재 필터와 일치하는 항목이 없습니다",
287
+ },
288
+ todoPreview: {
289
+ completedRatio: "{done}/{total} 완료",
290
+ moreItems: "+ {count}개 더…",
291
+ headerIcon: "☑",
292
+ doneIcon: "✓",
293
+ pendingIcon: "○",
294
+ moreLabels: "+{count}",
295
+ },
296
+ todoDialogs: {
297
+ addTitle: "할 일 추가",
298
+ editTitle: "할 일 편집",
299
+ deleteButton: "삭제",
300
+ deleteTitle: "이 항목을 삭제합니다",
301
+ noneOption: "— 없음 —",
302
+ fieldText: "텍스트",
303
+ fieldNote: "메모",
304
+ fieldStatus: "상태",
305
+ fieldPriority: "우선순위",
306
+ fieldDueDate: "마감일",
307
+ fieldLabels: "라벨",
308
+ fieldLabelsCommaSeparated: "라벨 (쉼표로 구분)",
309
+ textPlaceholder: "무엇을 해야 하나요?",
310
+ labelsPlaceholder: "업무, 긴급",
311
+ },
312
+ todoKanban: {
313
+ rename: "이름 바꾸기",
314
+ alreadyDoneColumn: "이미 완료 칼럼",
315
+ markAsDoneColumn: "완료 칼럼으로 설정",
316
+ deleteColumn: "칼럼 삭제",
317
+ columnActions: "칼럼 작업",
318
+ addCard: "+ 카드 추가",
319
+ },
320
+ todoTableList: {
321
+ noMatchingFilter: "현재 필터와 일치하는 항목이 없습니다",
322
+ },
323
+ pluginWiki: {
324
+ backToIndex: "목차로 돌아가기",
325
+ pdf: "PDF",
326
+ pdfFailed: "⚠ PDF 실패",
327
+ tabIndex: "목차",
328
+ tabLog: "로그",
329
+ tabLint: "Lint",
330
+ empty: "Wiki 가 비어 있습니다. Wiki Manager 에게 소스를 수집하도록 요청하세요.",
331
+ previewMore: "+ {count}개 더…",
332
+ chatPlaceholder: "이 페이지에 대해 질문…",
333
+ chatSend: "이 페이지에 대한 새 채팅 시작",
334
+ },
335
+ pluginPresentHtml: {
336
+ saveAsPdf: "PDF 로 저장 (인쇄 대화 상자 열기)",
337
+ pdf: "PDF",
338
+ untitled: "HTML 페이지",
339
+ hideSource: "소스 숨기기 <>",
340
+ showSource: "소스 표시 <>",
341
+ },
342
+ pluginManageSource: {
343
+ titlePlaceholder: "제목 (선택)",
344
+ heading: "정보 소스",
345
+ sourceCount: "{count}개 소스",
346
+ addButton: "추가",
347
+ rebuildNow: "지금 재빌드",
348
+ rebuilding: "재빌드 중…",
349
+ typeField: "유형",
350
+ addingLabel: "추가 중…",
351
+ addAndRebuild: "추가 + 재빌드",
352
+ emptyPickPack: "아직 등록된 소스가 없습니다. 아래 스타터 팩에서 고르거나, 위의 {addBold} 를 누르거나, Claude 에게 등록을 요청하세요.",
353
+ emptyAddStrong: "+ 추가",
354
+ registering: "등록 + 수집 중…",
355
+ removeLabel: "제거",
356
+ removingLabel: "제거 중…",
357
+ todaysBrief: "오늘의 브리프",
358
+ todaysBriefLoading: "오늘의 브리프를 불러오는 중…",
359
+ briefNone: "아직 이 날짜의 브리프가 작성되지 않았습니다. 지금 재빌드 를 눌러주세요.",
360
+ briefEmpty: "오늘의 브리프가 비어 있습니다.",
361
+ briefLoadFailed: "브리프 불러오기 실패",
362
+ lastRebuildSummary: "마지막 재빌드 ({date}): {planned}개 소스에서 {itemCount}개 항목, 중복 {duplicates}개 제거.",
363
+ archiveErrorsSuffix: "(아카이브 오류 {count}건)",
364
+ kindRss: "RSS",
365
+ kindGithubRel: "GitHub 릴리스",
366
+ kindGithubIss: "GitHub 이슈",
367
+ kindArxiv: "arXiv",
368
+ kindGithubReleases: "GitHub 릴리스",
369
+ kindGithubIssues: "GitHub 이슈",
370
+ briefDateLabel: "({date})",
371
+ primaryRssPlaceholder: "https://news.ycombinator.com/rss",
372
+ primaryGithubPlaceholder: "https://github.com/owner/repo (또는 owner/repo)",
373
+ primaryArxivPlaceholder: "cat:cs.CL",
374
+ primaryRssHint: "Feed URL (RSS 2.0 / Atom / RDF)",
375
+ primaryGithubRelHint: "GitHub 저장소 URL 또는 owner/repo — 릴리스를 수집합니다",
376
+ primaryGithubIssHint: "GitHub 저장소 URL 또는 owner/repo — 이슈를 수집합니다",
377
+ primaryArxivHint: "arXiv 검색어 (예: cat:cs.CL 또는 au:hinton)",
378
+ confirmRemove: '소스 "{slug}" 을(를) 제거할까요?',
379
+ flashRegistered: "등록됨. 새 항목을 수집하는 중…",
380
+ flashRebuildReady: "준비 완료: {planned}개 소스에서 {itemCount}개 항목.",
381
+ flashRebuildComplete: "재빌드 완료: {planned}개 소스에서 {itemCount}개 항목.",
382
+ flashRebuildFailed: "재빌드 실패: {error}",
383
+ flashRegisterFailed: "소스 등록 실패",
384
+ flashRegisterSucceededRebuildFailed: "등록은 성공했지만 재빌드 실패: {error}",
385
+ flashRemoved: '"{slug}" 을(를) 제거했습니다.',
386
+ flashRemoveFailed: "제거 실패: {error}",
387
+ flashRefreshListFailed: "소스 새로고침 실패: {error}",
388
+ flashPresetAlreadyRegistered: '"{label}" 의 모든 소스가 이미 등록되어 있습니다.',
389
+ flashPresetRegistered: '"{label}" 에서 {count}개 소스를 등록했습니다. 수집 중…',
390
+ flashPresetPartial: "{ok}/{total} 등록. 오류: {errors}",
391
+ },
392
+ pluginManageSkills: {
393
+ deleteProjectSkill: "이 프로젝트 스킬 삭제",
394
+ heading: "스킬",
395
+ previewCount: "{count}개 스킬",
396
+ previewMore: "+{count}개 더",
397
+ // 함수 형식으로 vue-i18n 의 메시지 컴파일러를 우회한다. 일반
398
+ // 문자열이면 `<name>` 이 HTML 조각으로 간주되어 매번 "Detected
399
+ // HTML in '…' message" 경고가 발생한다.
400
+ subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")}개 사용 가능 · 클릭해서 보기 · "Run" 은 /<name> 형식으로 호출합니다`,
401
+ emptyWithPath: "스킬을 찾을 수 없습니다. {path} 아래에 스킬 폴더를 추가하세요.",
402
+ emptySkillPath: "~/.claude/skills/",
403
+ selectHint: "왼쪽에서 스킬을 선택해 SKILL.md 를 확인하세요.",
404
+ loading: "불러오는 중…",
405
+ fieldDescription: "설명",
406
+ fieldBody: "본문 (Markdown)",
407
+ emptyBody: "(본문 비어 있음)",
408
+ btnEdit: "편집",
409
+ btnDelete: "삭제",
410
+ btnRun: "실행",
411
+ errListFailed: "스킬 목록 불러오기 실패: {error}",
412
+ errDetailFailed: "스킬 상세 불러오기 실패: {error}",
413
+ errSaveFailed: "저장 실패: {error}",
414
+ errDeleteFailed: "삭제 실패",
415
+ confirmDelete: '스킬 "{name}" 을(를) 삭제할까요? ~/mulmoclaude/.claude/skills/{name}/SKILL.md 가 제거됩니다.',
416
+ },
417
+ pluginManageRoles: {
418
+ heading: "커스텀 역할",
419
+ roleCount: "{count}개 역할",
420
+ previewCount: "{count}개 커스텀 역할",
421
+ addButton: "+ 추가",
422
+ createPanel: "새 역할 만들기",
423
+ fieldId: "ID",
424
+ fieldName: "이름",
425
+ fieldIcon: "아이콘",
426
+ fieldPrompt: "프롬프트",
427
+ fieldPlugins: "플러그인",
428
+ fieldStarterQueries: "시작 질문",
429
+ onePerLine: "(한 줄에 하나)",
430
+ helpLink: "?",
431
+ idFormatted: "({id})",
432
+ missingEnv: "({env} 누락)",
433
+ requiresEnv: ".env 에 {env} 가 필요합니다",
434
+ collapse: "접기",
435
+ expand: "펼치기",
436
+ idPlaceholder: "unique-id",
437
+ creating: "생성 중…",
438
+ create: "생성",
439
+ updating: "업데이트 중…",
440
+ update: "업데이트",
441
+ cancel: "취소",
442
+ delete: "삭제",
443
+ emptyHint: '아직 커스텀 역할이 없습니다. "+ 추가" 를 누르거나 Claude 에게 만들어달라고 요청하세요.',
444
+ errIdRequired: "ID 는 필수입니다.",
445
+ errIdInvalid: "ID 는 영문, 숫자, '-', '_' 만 포함할 수 있습니다.",
446
+ errNameRequired: "이름은 필수입니다.",
447
+ errIdDuplicate: "ID 가 '{id}' 인 역할이 이미 존재합니다.",
448
+ errCreateFailed: "생성 실패",
449
+ errSaveFailed: "저장 실패",
450
+ errDeleteFailed: "삭제 실패",
451
+ errNetworkError: "네트워크 오류",
452
+ errServerError: "서버 오류: {status}",
453
+ },
454
+ pluginUiImage: {
455
+ promptLabel: "{label}:",
456
+ },
457
+ pluginMulmoScript: {
458
+ beatCount: "{count}개 비트",
459
+ movie: "영상",
460
+ generating: "생성 중…",
461
+ rendering: "렌더링 중…",
462
+ saving: "저장 중…",
463
+ update: "업데이트",
464
+ characters: "캐릭터",
465
+ drop: "드롭",
466
+ gen: "생성",
467
+ play: "▶ 재생",
468
+ stop: "■ 정지",
469
+ errPrefix: "⚠ 오류",
470
+ noBeats: "스크립트에서 비트를 찾을 수 없습니다",
471
+ editSource: "스크립트 원본 편집",
472
+ applyChanges: "변경 사항 적용",
473
+ generateAll: "전체 생성",
474
+ orDropImage: "또는 이미지 드롭",
475
+ generate: "생성",
476
+ generateAudio: "♪ 생성",
477
+ saveErrorInvalidJson: "⚠ 잘못된 JSON: {error}",
478
+ saveErrorSaveFailed: "⚠ 저장 실패: {error}",
479
+ },
480
+ pluginMarkdown: {
481
+ loading: "문서를 불러오는 중...",
482
+ loadFailed: "⚠ 문서 불러오기 실패: {error}",
483
+ refreshFailed: "⚠ 문서 새로고침 실패: {error} — 마지막으로 성공적으로 불러온 내용을 표시합니다.",
484
+ noContent: "사용 가능한 Markdown 콘텐츠가 없습니다",
485
+ pdf: "PDF",
486
+ pdfFailedShort: "⚠ PDF 실패",
487
+ editSource: "Markdown 원본 편집",
488
+ saving: "저장 중...",
489
+ applyChanges: "변경 사항 적용",
490
+ cancel: "취소",
491
+ saveFailed: "저장 실패: {error}",
492
+ saveError: "⚠ 저장 실패: {error}",
493
+ copyLabel: "복사",
494
+ copiedLabel: "복사됨!",
495
+ },
496
+ pluginTextResponse: {
497
+ pdf: "PDF",
498
+ pdfFailed: "⚠ PDF 실패",
499
+ editContent: "텍스트 내용 편집",
500
+ applyChanges: "변경 사항 적용",
501
+ copyLabel: "복사",
502
+ copiedLabel: "복사됨!",
503
+ cancel: "취소",
504
+ },
505
+ pluginSpreadsheet: {
506
+ previewLabel: "📊 스프레드시트",
507
+ previewUntitled: "스프레드시트",
508
+ previewSheets: "{count}개 시트",
509
+ untitled: "스프레드시트",
510
+ excel: "Excel",
511
+ valuePlaceholder: "값",
512
+ valueOrFormulaPlaceholder: "값 또는 수식 (예: 100 또는 SUM(B2:B11))",
513
+ formatPlaceholder: "형식 (예: $#,##0.00)",
514
+ loading: "스프레드시트를 불러오는 중...",
515
+ noData: "사용 가능한 스프레드시트 데이터가 없습니다",
516
+ editData: "스프레드시트 데이터 편집",
517
+ applyChanges: "변경 사항 적용",
518
+ update: "업데이트",
519
+ stringType: "문자열",
520
+ formulaType: "수식",
521
+ },
522
+ app: {
523
+ // `<i18n-t>` 슬롯 — `envKey` / `envFile` 은 App.vue 에서 인라인
524
+ // `<code>` 로 렌더링되므로 변수명·파일명은 번역하지 않고 남깁니다.
525
+ geminiRequired: "이미지 생성에는 {envKey} 가 필요합니다. {envFile} 에 추가하고 앱을 재시작해주세요.",
526
+ startConversation: "대화 시작",
527
+ },
528
+ suggestionsPanel: {
529
+ suggestions: "추천",
530
+ sendEditHint: "클릭하여 전송 · shift+클릭 으로 편집",
531
+ },
532
+ settingsToolsTab: {
533
+ // <i18n-t> 에서 명명 슬롯 `allowedTools` 와 `claudeMcp` 로 렌더링되므로
534
+ // `<code>` 태그는 스타일을 유지하면서 본문은 번역 가능합니다.
535
+ explanation:
536
+ "{allowedTools} 를 통해 Claude 에 전달할 추가 도구 이름. 한 줄에 하나씩. {claudeMcp} 로 인증을 완료한 후 Claude Code 내장 MCP 서버 (Gmail / Google 캘린더 등) 를 사용할 때 유용합니다.",
537
+ },
538
+ };
539
+
540
+ export default koMessages;