meeting-context-hub 1.0.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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/ai/clients/claude.client.d.ts +10 -0
  4. package/dist/ai/clients/claude.client.d.ts.map +1 -0
  5. package/dist/ai/clients/claude.client.js +71 -0
  6. package/dist/ai/clients/claude.client.js.map +1 -0
  7. package/dist/ai/clients/embedding.client.d.ts +8 -0
  8. package/dist/ai/clients/embedding.client.d.ts.map +1 -0
  9. package/dist/ai/clients/embedding.client.js +22 -0
  10. package/dist/ai/clients/embedding.client.js.map +1 -0
  11. package/dist/ai/clients/index.d.ts +4 -0
  12. package/dist/ai/clients/index.d.ts.map +1 -0
  13. package/dist/ai/clients/index.js +4 -0
  14. package/dist/ai/clients/index.js.map +1 -0
  15. package/dist/ai/clients/whisper.client.d.ts +7 -0
  16. package/dist/ai/clients/whisper.client.d.ts.map +1 -0
  17. package/dist/ai/clients/whisper.client.js +17 -0
  18. package/dist/ai/clients/whisper.client.js.map +1 -0
  19. package/dist/ai/index.d.ts +4 -0
  20. package/dist/ai/index.d.ts.map +1 -0
  21. package/dist/ai/index.js +4 -0
  22. package/dist/ai/index.js.map +1 -0
  23. package/dist/ai/interfaces/index.d.ts +25 -0
  24. package/dist/ai/interfaces/index.d.ts.map +1 -0
  25. package/dist/ai/interfaces/index.js +2 -0
  26. package/dist/ai/interfaces/index.js.map +1 -0
  27. package/dist/ai/prompts/index.d.ts +3 -0
  28. package/dist/ai/prompts/index.d.ts.map +1 -0
  29. package/dist/ai/prompts/index.js +3 -0
  30. package/dist/ai/prompts/index.js.map +1 -0
  31. package/dist/ai/prompts/meeting-summary.prompt.d.ts +3 -0
  32. package/dist/ai/prompts/meeting-summary.prompt.d.ts.map +1 -0
  33. package/dist/ai/prompts/meeting-summary.prompt.js +44 -0
  34. package/dist/ai/prompts/meeting-summary.prompt.js.map +1 -0
  35. package/dist/ai/prompts/summarize.prompt.d.ts +4 -0
  36. package/dist/ai/prompts/summarize.prompt.d.ts.map +1 -0
  37. package/dist/ai/prompts/summarize.prompt.js +33 -0
  38. package/dist/ai/prompts/summarize.prompt.js.map +1 -0
  39. package/dist/ai/prompts/tagging.prompt.d.ts +4 -0
  40. package/dist/ai/prompts/tagging.prompt.d.ts.map +1 -0
  41. package/dist/ai/prompts/tagging.prompt.js +42 -0
  42. package/dist/ai/prompts/tagging.prompt.js.map +1 -0
  43. package/dist/cli/commands/add.command.d.ts +3 -0
  44. package/dist/cli/commands/add.command.d.ts.map +1 -0
  45. package/dist/cli/commands/add.command.js +80 -0
  46. package/dist/cli/commands/add.command.js.map +1 -0
  47. package/dist/cli/commands/config.command.d.ts +3 -0
  48. package/dist/cli/commands/config.command.d.ts.map +1 -0
  49. package/dist/cli/commands/config.command.js +75 -0
  50. package/dist/cli/commands/config.command.js.map +1 -0
  51. package/dist/cli/commands/index.d.ts +5 -0
  52. package/dist/cli/commands/index.d.ts.map +1 -0
  53. package/dist/cli/commands/index.js +5 -0
  54. package/dist/cli/commands/index.js.map +1 -0
  55. package/dist/cli/commands/list.command.d.ts +3 -0
  56. package/dist/cli/commands/list.command.d.ts.map +1 -0
  57. package/dist/cli/commands/list.command.js +57 -0
  58. package/dist/cli/commands/list.command.js.map +1 -0
  59. package/dist/cli/commands/search.command.d.ts +3 -0
  60. package/dist/cli/commands/search.command.d.ts.map +1 -0
  61. package/dist/cli/commands/search.command.js +68 -0
  62. package/dist/cli/commands/search.command.js.map +1 -0
  63. package/dist/cli/index.d.ts +3 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +33 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/cli/utils/cli-runner.d.ts +14 -0
  68. package/dist/cli/utils/cli-runner.d.ts.map +1 -0
  69. package/dist/cli/utils/cli-runner.js +28 -0
  70. package/dist/cli/utils/cli-runner.js.map +1 -0
  71. package/dist/cli/utils/formatters.d.ts +19 -0
  72. package/dist/cli/utils/formatters.d.ts.map +1 -0
  73. package/dist/cli/utils/formatters.js +79 -0
  74. package/dist/cli/utils/formatters.js.map +1 -0
  75. package/dist/cli/utils/index.d.ts +3 -0
  76. package/dist/cli/utils/index.d.ts.map +1 -0
  77. package/dist/cli/utils/index.js +3 -0
  78. package/dist/cli/utils/index.js.map +1 -0
  79. package/dist/config/config.d.ts +9 -0
  80. package/dist/config/config.d.ts.map +1 -0
  81. package/dist/config/config.js +25 -0
  82. package/dist/config/config.js.map +1 -0
  83. package/dist/config/env.d.ts +5 -0
  84. package/dist/config/env.d.ts.map +1 -0
  85. package/dist/config/env.js +18 -0
  86. package/dist/config/env.js.map +1 -0
  87. package/dist/config/index.d.ts +4 -0
  88. package/dist/config/index.d.ts.map +1 -0
  89. package/dist/config/index.js +4 -0
  90. package/dist/config/index.js.map +1 -0
  91. package/dist/config/keychain.d.ts +8 -0
  92. package/dist/config/keychain.d.ts.map +1 -0
  93. package/dist/config/keychain.js +33 -0
  94. package/dist/config/keychain.js.map +1 -0
  95. package/dist/core/add-context.usecase.d.ts +11 -0
  96. package/dist/core/add-context.usecase.d.ts.map +1 -0
  97. package/dist/core/add-context.usecase.js +65 -0
  98. package/dist/core/add-context.usecase.js.map +1 -0
  99. package/dist/core/add-context.usecase.test.d.ts +2 -0
  100. package/dist/core/add-context.usecase.test.d.ts.map +1 -0
  101. package/dist/core/add-context.usecase.test.js +99 -0
  102. package/dist/core/add-context.usecase.test.js.map +1 -0
  103. package/dist/core/factories.d.ts +24 -0
  104. package/dist/core/factories.d.ts.map +1 -0
  105. package/dist/core/factories.js +51 -0
  106. package/dist/core/factories.js.map +1 -0
  107. package/dist/core/index.d.ts +4 -0
  108. package/dist/core/index.d.ts.map +1 -0
  109. package/dist/core/index.js +4 -0
  110. package/dist/core/index.js.map +1 -0
  111. package/dist/core/search-context.usecase.d.ts +17 -0
  112. package/dist/core/search-context.usecase.d.ts.map +1 -0
  113. package/dist/core/search-context.usecase.js +45 -0
  114. package/dist/core/search-context.usecase.js.map +1 -0
  115. package/dist/core/search-context.usecase.test.d.ts +2 -0
  116. package/dist/core/search-context.usecase.test.d.ts.map +1 -0
  117. package/dist/core/search-context.usecase.test.js +152 -0
  118. package/dist/core/search-context.usecase.test.js.map +1 -0
  119. package/dist/core/summarize-meeting.usecase.d.ts +17 -0
  120. package/dist/core/summarize-meeting.usecase.d.ts.map +1 -0
  121. package/dist/core/summarize-meeting.usecase.js +126 -0
  122. package/dist/core/summarize-meeting.usecase.js.map +1 -0
  123. package/dist/errors/index.d.ts +41 -0
  124. package/dist/errors/index.d.ts.map +1 -0
  125. package/dist/errors/index.js +65 -0
  126. package/dist/errors/index.js.map +1 -0
  127. package/dist/input/audio.handler.d.ts +8 -0
  128. package/dist/input/audio.handler.d.ts.map +1 -0
  129. package/dist/input/audio.handler.js +20 -0
  130. package/dist/input/audio.handler.js.map +1 -0
  131. package/dist/input/file.handler.d.ts +5 -0
  132. package/dist/input/file.handler.d.ts.map +1 -0
  133. package/dist/input/file.handler.js +17 -0
  134. package/dist/input/file.handler.js.map +1 -0
  135. package/dist/input/image.handler.d.ts +8 -0
  136. package/dist/input/image.handler.d.ts.map +1 -0
  137. package/dist/input/image.handler.js +38 -0
  138. package/dist/input/image.handler.js.map +1 -0
  139. package/dist/input/index.d.ts +5 -0
  140. package/dist/input/index.d.ts.map +1 -0
  141. package/dist/input/index.js +5 -0
  142. package/dist/input/index.js.map +1 -0
  143. package/dist/input/meeting.handler.d.ts +3 -0
  144. package/dist/input/meeting.handler.d.ts.map +1 -0
  145. package/dist/input/meeting.handler.js +16 -0
  146. package/dist/input/meeting.handler.js.map +1 -0
  147. package/dist/input/text.handler.d.ts +5 -0
  148. package/dist/input/text.handler.d.ts.map +1 -0
  149. package/dist/input/text.handler.js +9 -0
  150. package/dist/input/text.handler.js.map +1 -0
  151. package/dist/repositories/context.repository.d.ts +48 -0
  152. package/dist/repositories/context.repository.d.ts.map +1 -0
  153. package/dist/repositories/context.repository.js +2 -0
  154. package/dist/repositories/context.repository.js.map +1 -0
  155. package/dist/repositories/index.d.ts +2 -0
  156. package/dist/repositories/index.d.ts.map +1 -0
  157. package/dist/repositories/index.js +2 -0
  158. package/dist/repositories/index.js.map +1 -0
  159. package/dist/storage/obsidian/context.obsidian.d.ts +36 -0
  160. package/dist/storage/obsidian/context.obsidian.d.ts.map +1 -0
  161. package/dist/storage/obsidian/context.obsidian.js +236 -0
  162. package/dist/storage/obsidian/context.obsidian.js.map +1 -0
  163. package/dist/storage/obsidian/frontmatter.d.ts +17 -0
  164. package/dist/storage/obsidian/frontmatter.d.ts.map +1 -0
  165. package/dist/storage/obsidian/frontmatter.js +48 -0
  166. package/dist/storage/obsidian/frontmatter.js.map +1 -0
  167. package/dist/storage/obsidian/index.d.ts +3 -0
  168. package/dist/storage/obsidian/index.d.ts.map +1 -0
  169. package/dist/storage/obsidian/index.js +3 -0
  170. package/dist/storage/obsidian/index.js.map +1 -0
  171. package/dist/tui/App.d.ts +17 -0
  172. package/dist/tui/App.d.ts.map +1 -0
  173. package/dist/tui/App.js +100 -0
  174. package/dist/tui/App.js.map +1 -0
  175. package/dist/tui/components/ContextCard.d.ts +15 -0
  176. package/dist/tui/components/ContextCard.d.ts.map +1 -0
  177. package/dist/tui/components/ContextCard.js +22 -0
  178. package/dist/tui/components/ContextCard.js.map +1 -0
  179. package/dist/tui/components/ErrorBanner.d.ts +6 -0
  180. package/dist/tui/components/ErrorBanner.d.ts.map +1 -0
  181. package/dist/tui/components/ErrorBanner.js +6 -0
  182. package/dist/tui/components/ErrorBanner.js.map +1 -0
  183. package/dist/tui/components/Header.d.ts +7 -0
  184. package/dist/tui/components/Header.d.ts.map +1 -0
  185. package/dist/tui/components/Header.js +6 -0
  186. package/dist/tui/components/Header.js.map +1 -0
  187. package/dist/tui/components/KeyHint.d.ts +11 -0
  188. package/dist/tui/components/KeyHint.d.ts.map +1 -0
  189. package/dist/tui/components/KeyHint.js +9 -0
  190. package/dist/tui/components/KeyHint.js.map +1 -0
  191. package/dist/tui/components/Menu.d.ts +11 -0
  192. package/dist/tui/components/Menu.d.ts.map +1 -0
  193. package/dist/tui/components/Menu.js +6 -0
  194. package/dist/tui/components/Menu.js.map +1 -0
  195. package/dist/tui/components/Spinner.d.ts +6 -0
  196. package/dist/tui/components/Spinner.d.ts.map +1 -0
  197. package/dist/tui/components/Spinner.js +7 -0
  198. package/dist/tui/components/Spinner.js.map +1 -0
  199. package/dist/tui/components/index.d.ts +7 -0
  200. package/dist/tui/components/index.d.ts.map +1 -0
  201. package/dist/tui/components/index.js +7 -0
  202. package/dist/tui/components/index.js.map +1 -0
  203. package/dist/tui/hooks/index.d.ts +4 -0
  204. package/dist/tui/hooks/index.d.ts.map +1 -0
  205. package/dist/tui/hooks/index.js +4 -0
  206. package/dist/tui/hooks/index.js.map +1 -0
  207. package/dist/tui/hooks/useAsyncAction.d.ts +18 -0
  208. package/dist/tui/hooks/useAsyncAction.d.ts.map +1 -0
  209. package/dist/tui/hooks/useAsyncAction.js +20 -0
  210. package/dist/tui/hooks/useAsyncAction.js.map +1 -0
  211. package/dist/tui/hooks/useNavigation.d.ts +15 -0
  212. package/dist/tui/hooks/useNavigation.d.ts.map +1 -0
  213. package/dist/tui/hooks/useNavigation.js +33 -0
  214. package/dist/tui/hooks/useNavigation.js.map +1 -0
  215. package/dist/tui/hooks/useServices.d.ts +3 -0
  216. package/dist/tui/hooks/useServices.d.ts.map +1 -0
  217. package/dist/tui/hooks/useServices.js +6 -0
  218. package/dist/tui/hooks/useServices.js.map +1 -0
  219. package/dist/tui/index.d.ts +2 -0
  220. package/dist/tui/index.d.ts.map +1 -0
  221. package/dist/tui/index.js +7 -0
  222. package/dist/tui/index.js.map +1 -0
  223. package/dist/tui/screens/AddScreen.d.ts +9 -0
  224. package/dist/tui/screens/AddScreen.d.ts.map +1 -0
  225. package/dist/tui/screens/AddScreen.js +165 -0
  226. package/dist/tui/screens/AddScreen.js.map +1 -0
  227. package/dist/tui/screens/ConfigScreen.d.ts +8 -0
  228. package/dist/tui/screens/ConfigScreen.d.ts.map +1 -0
  229. package/dist/tui/screens/ConfigScreen.js +102 -0
  230. package/dist/tui/screens/ConfigScreen.js.map +1 -0
  231. package/dist/tui/screens/DetailScreen.d.ts +11 -0
  232. package/dist/tui/screens/DetailScreen.d.ts.map +1 -0
  233. package/dist/tui/screens/DetailScreen.js +92 -0
  234. package/dist/tui/screens/DetailScreen.js.map +1 -0
  235. package/dist/tui/screens/ListScreen.d.ts +11 -0
  236. package/dist/tui/screens/ListScreen.d.ts.map +1 -0
  237. package/dist/tui/screens/ListScreen.js +198 -0
  238. package/dist/tui/screens/ListScreen.js.map +1 -0
  239. package/dist/tui/screens/MainMenu.d.ts +8 -0
  240. package/dist/tui/screens/MainMenu.d.ts.map +1 -0
  241. package/dist/tui/screens/MainMenu.js +26 -0
  242. package/dist/tui/screens/MainMenu.js.map +1 -0
  243. package/dist/tui/screens/SearchScreen.d.ts +11 -0
  244. package/dist/tui/screens/SearchScreen.d.ts.map +1 -0
  245. package/dist/tui/screens/SearchScreen.js +130 -0
  246. package/dist/tui/screens/SearchScreen.js.map +1 -0
  247. package/dist/tui/screens/index.d.ts +7 -0
  248. package/dist/tui/screens/index.d.ts.map +1 -0
  249. package/dist/tui/screens/index.js +7 -0
  250. package/dist/tui/screens/index.js.map +1 -0
  251. package/dist/types/config.types.d.ts +19 -0
  252. package/dist/types/config.types.d.ts.map +1 -0
  253. package/dist/types/config.types.js +8 -0
  254. package/dist/types/config.types.js.map +1 -0
  255. package/dist/types/context.schema.d.ts +81 -0
  256. package/dist/types/context.schema.d.ts.map +1 -0
  257. package/dist/types/context.schema.js +33 -0
  258. package/dist/types/context.schema.js.map +1 -0
  259. package/dist/types/context.types.d.ts +37 -0
  260. package/dist/types/context.types.d.ts.map +1 -0
  261. package/dist/types/context.types.js +5 -0
  262. package/dist/types/context.types.js.map +1 -0
  263. package/dist/types/index.d.ts +6 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +6 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/meeting.schema.d.ts +195 -0
  268. package/dist/types/meeting.schema.d.ts.map +1 -0
  269. package/dist/types/meeting.schema.js +33 -0
  270. package/dist/types/meeting.schema.js.map +1 -0
  271. package/dist/types/meeting.types.d.ts +34 -0
  272. package/dist/types/meeting.types.d.ts.map +1 -0
  273. package/dist/types/meeting.types.js +2 -0
  274. package/dist/types/meeting.types.js.map +1 -0
  275. package/dist/types/prompt.types.d.ts +22 -0
  276. package/dist/types/prompt.types.d.ts.map +1 -0
  277. package/dist/types/prompt.types.js +9 -0
  278. package/dist/types/prompt.types.js.map +1 -0
  279. package/dist/types/tag.types.d.ts +9 -0
  280. package/dist/types/tag.types.d.ts.map +1 -0
  281. package/dist/types/tag.types.js +2 -0
  282. package/dist/types/tag.types.js.map +1 -0
  283. package/dist/utils/file-validator.d.ts +14 -0
  284. package/dist/utils/file-validator.d.ts.map +1 -0
  285. package/dist/utils/file-validator.js +35 -0
  286. package/dist/utils/file-validator.js.map +1 -0
  287. package/dist/utils/filter.d.ts +15 -0
  288. package/dist/utils/filter.d.ts.map +1 -0
  289. package/dist/utils/filter.js +40 -0
  290. package/dist/utils/filter.js.map +1 -0
  291. package/dist/utils/filter.test.d.ts +2 -0
  292. package/dist/utils/filter.test.d.ts.map +1 -0
  293. package/dist/utils/filter.test.js +90 -0
  294. package/dist/utils/filter.test.js.map +1 -0
  295. package/dist/utils/index.d.ts +9 -0
  296. package/dist/utils/index.d.ts.map +1 -0
  297. package/dist/utils/index.js +9 -0
  298. package/dist/utils/index.js.map +1 -0
  299. package/dist/utils/json-parser.d.ts +25 -0
  300. package/dist/utils/json-parser.d.ts.map +1 -0
  301. package/dist/utils/json-parser.js +70 -0
  302. package/dist/utils/json-parser.js.map +1 -0
  303. package/dist/utils/json-parser.test.d.ts +2 -0
  304. package/dist/utils/json-parser.test.d.ts.map +1 -0
  305. package/dist/utils/json-parser.test.js +102 -0
  306. package/dist/utils/json-parser.test.js.map +1 -0
  307. package/dist/utils/math.d.ts +8 -0
  308. package/dist/utils/math.d.ts.map +1 -0
  309. package/dist/utils/math.js +22 -0
  310. package/dist/utils/math.js.map +1 -0
  311. package/dist/utils/related-links.d.ts +13 -0
  312. package/dist/utils/related-links.d.ts.map +1 -0
  313. package/dist/utils/related-links.js +28 -0
  314. package/dist/utils/related-links.js.map +1 -0
  315. package/package.json +78 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 mag123c
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,217 @@
1
+ # Meeting Context Hub
2
+
3
+ 멀티모달 입력(텍스트/이미지/음성/파일/회의록)을 AI로 처리하여 Obsidian에 저장하는 CLI 도구.
4
+ 태그 + 임베딩 기반 의미론적 검색으로 연관 컨텍스트를 찾아줍니다.
5
+
6
+ ## Features
7
+
8
+ - 📝 **텍스트** - 메모, 아이디어 저장
9
+ - 🖼️ **이미지** - Claude Vision으로 분석 및 태그 추출
10
+ - 🎤 **음성** - Whisper로 텍스트 변환
11
+ - 📄 **파일** - txt, md, csv, json 지원
12
+ - 📋 **회의록** - PRD 형식 요약 + Action Items 자동 추출
13
+ - 🔍 **의미론적 검색** - 임베딩 기반 유사 문서 검색
14
+ - 🏷️ **자동 태깅** - AI가 관련 태그 자동 생성
15
+ - 📊 **Obsidian 통합** - Graph View, Dataview 쿼리 지원
16
+
17
+ ## Installation
18
+
19
+ ### Prerequisites
20
+
21
+ - Node.js >= 20.0.0
22
+ - [Obsidian](https://obsidian.md/) (선택, 저장소로 사용)
23
+
24
+ ### Install
25
+
26
+ ```bash
27
+ # Clone
28
+ git clone https://github.com/mag123c/meeting-context-hub.git
29
+ cd meeting-context-hub
30
+
31
+ # Install dependencies
32
+ pnpm install
33
+
34
+ # Build
35
+ pnpm build
36
+
37
+ # Global install (optional)
38
+ npm link
39
+ ```
40
+
41
+ ## Configuration
42
+
43
+ ### API Keys 설정
44
+
45
+ **방법 1: macOS 키체인 (권장)**
46
+
47
+ ```bash
48
+ mch config set ANTHROPIC_API_KEY sk-ant-xxx
49
+ mch config set OPENAI_API_KEY sk-xxx
50
+ ```
51
+
52
+ **방법 2: 환경변수**
53
+
54
+ ```bash
55
+ cp .env.local.example .env.local
56
+ # .env.local 파일 편집
57
+ ```
58
+
59
+ ### Obsidian Vault 설정
60
+
61
+ ```bash
62
+ # 기본값: ~/Library/Mobile Documents/iCloud~md~obsidian/Documents
63
+ mch config set OBSIDIAN_VAULT_PATH /path/to/your/vault
64
+
65
+ # 저장 폴더 (기본값: mch)
66
+ mch config set MCH_FOLDER mch
67
+ ```
68
+
69
+ ### 설정 확인
70
+
71
+ ```bash
72
+ mch config show # 현재 설정 확인
73
+ mch config check # API 키 상태 확인
74
+ ```
75
+
76
+ ## Usage
77
+
78
+ ### 컨텍스트 추가
79
+
80
+ ```bash
81
+ # 텍스트
82
+ mch add -t "오늘 회의에서 결정된 사항들..."
83
+
84
+ # 이미지 (Claude Vision 분석)
85
+ mch add -i ./screenshot.png
86
+
87
+ # 음성 (Whisper 변환)
88
+ mch add -a ./recording.m4a
89
+
90
+ # 파일
91
+ mch add -f ./notes.md
92
+
93
+ # 대화형 모드
94
+ mch add
95
+ ```
96
+
97
+ ### 회의록 요약
98
+
99
+ ```bash
100
+ mch add -m ./meeting-transcript.txt
101
+ ```
102
+
103
+ **출력 형식:**
104
+ - 📋 회의 요약
105
+ - 🎯 핵심 결정사항
106
+ - ✅ Action Items (담당자, 기한)
107
+ - 💡 주요 논의 포인트
108
+ - ❓ 미해결 이슈
109
+ - 📅 다음 단계
110
+
111
+ ### 검색
112
+
113
+ ```bash
114
+ # 의미론적 검색 (기본)
115
+ mch search "프로젝트 일정"
116
+
117
+ # 정확한 텍스트 매칭
118
+ mch search "API" --exact
119
+
120
+ # 유사 문서 찾기
121
+ mch search --similar <context-id>
122
+
123
+ # 태그로 필터
124
+ mch search --tag "회의"
125
+ ```
126
+
127
+ ### 목록 조회
128
+
129
+ ```bash
130
+ # 전체 목록
131
+ mch list
132
+
133
+ # 태그 필터
134
+ mch list --tag "회의"
135
+
136
+ # 타입 필터
137
+ mch list --type image
138
+
139
+ # 페이지네이션
140
+ mch list -l 10 -o 20
141
+ ```
142
+
143
+ ## Obsidian Integration
144
+
145
+ ### 파일 구조
146
+
147
+ 컨텍스트는 `{vault}/{mch-folder}/` 에 저장됩니다:
148
+
149
+ ```
150
+ ~/Obsidian/Vault/mch/
151
+ ├── 회의록-요약-시딩캠페인_a1b2c3d4.md
152
+ ├── CLI-테스트-이미지분석_e5f6g7h8.md
153
+ └── 📊 Dataview 쿼리 예시.md
154
+ ```
155
+
156
+ ### Frontmatter
157
+
158
+ ```yaml
159
+ ---
160
+ id: a1b2c3d4-...
161
+ type: text
162
+ summary: 요약 내용
163
+ tags:
164
+ - 회의
165
+ - 프로젝트
166
+ embedding: [0.1, 0.2, ...]
167
+ createdAt: 2024-01-01T00:00:00.000Z
168
+ ---
169
+ ```
170
+
171
+ ### Dataview 쿼리 예시
172
+
173
+ ```dataview
174
+ TABLE type AS "타입", summary AS "요약"
175
+ FROM ""
176
+ WHERE id
177
+ SORT createdAt DESC
178
+ ```
179
+
180
+ ### Graph View
181
+
182
+ 태그 기반으로 연결된 노트들을 시각화할 수 있습니다.
183
+
184
+ ## Supported Formats
185
+
186
+ | 타입 | 확장자 | 처리 방식 |
187
+ |------|--------|-----------|
188
+ | 텍스트 | - | 직접 입력 |
189
+ | 이미지 | jpg, png, gif, webp | Claude Vision |
190
+ | 음성 | mp3, m4a, wav, webm | Whisper API |
191
+ | 파일 | txt, md, csv, json | 텍스트 추출 |
192
+ | 회의록 | txt, md | PRD 요약 |
193
+
194
+ ## Development
195
+
196
+ ```bash
197
+ # 개발 모드
198
+ pnpm dev
199
+
200
+ # 빌드
201
+ pnpm build
202
+
203
+ # 린트
204
+ pnpm lint
205
+ pnpm lint:fix
206
+ ```
207
+
208
+ ## Tech Stack
209
+
210
+ - **CLI**: Commander.js, Inquirer, Chalk, Ora
211
+ - **AI**: Claude API (Anthropic), Whisper & Embedding (OpenAI)
212
+ - **Storage**: Obsidian (gray-matter for frontmatter)
213
+ - **Validation**: Zod
214
+
215
+ ## License
216
+
217
+ MIT
@@ -0,0 +1,10 @@
1
+ import type { Prompt } from "../../types/prompt.types.js";
2
+ import type { ILLMClient } from "../interfaces/index.js";
3
+ export declare class ClaudeClient implements ILLMClient {
4
+ private client;
5
+ constructor(apiKey: string);
6
+ complete(prompt: Prompt, input: string): Promise<string>;
7
+ analyzeImage(prompt: Prompt, imagePath: string): Promise<string>;
8
+ private getMediaType;
9
+ }
10
+ //# sourceMappingURL=claude.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.client.d.ts","sourceRoot":"","sources":["../../../src/ai/clients/claude.client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,qBAAa,YAAa,YAAW,UAAU;IAC7C,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,MAAM;IAIpB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBxD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCtE,OAAO,CAAC,YAAY;CAgBrB"}
@@ -0,0 +1,71 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { readFile } from "fs/promises";
3
+ export class ClaudeClient {
4
+ client;
5
+ constructor(apiKey) {
6
+ this.client = new Anthropic({ apiKey });
7
+ }
8
+ async complete(prompt, input) {
9
+ const message = await this.client.messages.create({
10
+ model: "claude-sonnet-4-20250514",
11
+ max_tokens: 4096,
12
+ system: prompt.system,
13
+ messages: [
14
+ { role: "user", content: prompt.template(input) },
15
+ ],
16
+ });
17
+ const textBlock = message.content.find((block) => block.type === "text");
18
+ if (!textBlock || textBlock.type !== "text") {
19
+ throw new Error("No text response from Claude");
20
+ }
21
+ return textBlock.text;
22
+ }
23
+ async analyzeImage(prompt, imagePath) {
24
+ const imageData = await readFile(imagePath);
25
+ const base64 = imageData.toString("base64");
26
+ const mediaType = this.getMediaType(imagePath);
27
+ const message = await this.client.messages.create({
28
+ model: "claude-sonnet-4-20250514",
29
+ max_tokens: 4096,
30
+ system: prompt.system,
31
+ messages: [
32
+ {
33
+ role: "user",
34
+ content: [
35
+ {
36
+ type: "image",
37
+ source: {
38
+ type: "base64",
39
+ media_type: mediaType,
40
+ data: base64,
41
+ },
42
+ },
43
+ { type: "text", text: prompt.template("") },
44
+ ],
45
+ },
46
+ ],
47
+ });
48
+ const textBlock = message.content.find((block) => block.type === "text");
49
+ if (!textBlock || textBlock.type !== "text") {
50
+ throw new Error("No text response from Claude");
51
+ }
52
+ return textBlock.text;
53
+ }
54
+ getMediaType(path) {
55
+ const ext = path.toLowerCase().split(".").pop();
56
+ switch (ext) {
57
+ case "jpg":
58
+ case "jpeg":
59
+ return "image/jpeg";
60
+ case "png":
61
+ return "image/png";
62
+ case "gif":
63
+ return "image/gif";
64
+ case "webp":
65
+ return "image/webp";
66
+ default:
67
+ return "image/png";
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=claude.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.client.js","sourceRoot":"","sources":["../../../src/ai/clients/claude.client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { IEmbeddingClient } from "../interfaces/index.js";
2
+ export declare class EmbeddingClient implements IEmbeddingClient {
3
+ private client;
4
+ constructor(apiKey: string);
5
+ embed(text: string): Promise<number[]>;
6
+ embedBatch(texts: string[]): Promise<number[][]>;
7
+ }
8
+ //# sourceMappingURL=embedding.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.client.d.ts","sourceRoot":"","sources":["../../../src/ai/clients/embedding.client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAOvD"}
@@ -0,0 +1,22 @@
1
+ import OpenAI from "openai";
2
+ export class EmbeddingClient {
3
+ client;
4
+ constructor(apiKey) {
5
+ this.client = new OpenAI({ apiKey });
6
+ }
7
+ async embed(text) {
8
+ const response = await this.client.embeddings.create({
9
+ model: "text-embedding-3-small",
10
+ input: text,
11
+ });
12
+ return response.data[0].embedding;
13
+ }
14
+ async embedBatch(texts) {
15
+ const response = await this.client.embeddings.create({
16
+ model: "text-embedding-3-small",
17
+ input: texts,
18
+ });
19
+ return response.data.map((d) => d.embedding);
20
+ }
21
+ }
22
+ //# sourceMappingURL=embedding.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.client.js","sourceRoot":"","sources":["../../../src/ai/clients/embedding.client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,OAAO,eAAe;IAClB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YACnD,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YACnD,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { ClaudeClient } from "./claude.client.js";
2
+ export { WhisperClient } from "./whisper.client.js";
3
+ export { EmbeddingClient } from "./embedding.client.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ClaudeClient } from "./claude.client.js";
2
+ export { WhisperClient } from "./whisper.client.js";
3
+ export { EmbeddingClient } from "./embedding.client.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ITranscriptionClient } from "../interfaces/index.js";
2
+ export declare class WhisperClient implements ITranscriptionClient {
3
+ private client;
4
+ constructor(apiKey: string);
5
+ transcribe(audioPath: string): Promise<string>;
6
+ }
7
+ //# sourceMappingURL=whisper.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whisper.client.d.ts","sourceRoot":"","sources":["../../../src/ai/clients/whisper.client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,qBAAa,aAAc,YAAW,oBAAoB;IACxD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQrD"}
@@ -0,0 +1,17 @@
1
+ import OpenAI from "openai";
2
+ import { createReadStream } from "fs";
3
+ export class WhisperClient {
4
+ client;
5
+ constructor(apiKey) {
6
+ this.client = new OpenAI({ apiKey });
7
+ }
8
+ async transcribe(audioPath) {
9
+ const response = await this.client.audio.transcriptions.create({
10
+ file: createReadStream(audioPath),
11
+ model: "whisper-1",
12
+ language: "ko", // 한국어 우선
13
+ });
14
+ return response.text;
15
+ }
16
+ }
17
+ //# sourceMappingURL=whisper.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whisper.client.js","sourceRoot":"","sources":["../../../src/ai/clients/whisper.client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAGtC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;YAC7D,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC;YACjC,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,IAAI,EAAE,SAAS;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from "./clients/index.js";
2
+ export * from "./prompts/index.js";
3
+ export * from "./interfaces/index.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./clients/index.js";
2
+ export * from "./prompts/index.js";
3
+ export * from "./interfaces/index.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Prompt } from "../../types/prompt.types.js";
2
+ /**
3
+ * LLM Client 인터페이스
4
+ * 텍스트 완성 및 이미지 분석 기능 제공
5
+ */
6
+ export interface ILLMClient {
7
+ complete(prompt: Prompt, input: string): Promise<string>;
8
+ analyzeImage(prompt: Prompt, imagePath: string): Promise<string>;
9
+ }
10
+ /**
11
+ * Embedding Client 인터페이스
12
+ * 텍스트를 벡터로 변환
13
+ */
14
+ export interface IEmbeddingClient {
15
+ embed(text: string): Promise<number[]>;
16
+ embedBatch(texts: string[]): Promise<number[][]>;
17
+ }
18
+ /**
19
+ * Transcription Client 인터페이스
20
+ * 음성을 텍스트로 변환
21
+ */
22
+ export interface ITranscriptionClient {
23
+ transcribe(audioPath: string): Promise<string>;
24
+ }
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/interfaces/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { taggingPrompt, imageTaggingPrompt } from "./tagging.prompt.js";
2
+ export { summarizePrompt, imageSummarizePrompt } from "./summarize.prompt.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { taggingPrompt, imageTaggingPrompt } from "./tagging.prompt.js";
2
+ export { summarizePrompt, imageSummarizePrompt } from "./summarize.prompt.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Prompt } from "../../types/prompt.types.js";
2
+ export declare const meetingSummaryPrompt: Prompt;
3
+ //# sourceMappingURL=meeting-summary.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-summary.prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/meeting-summary.prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D,eAAO,MAAM,oBAAoB,EAAE,MA2ClC,CAAC"}
@@ -0,0 +1,44 @@
1
+ export const meetingSummaryPrompt = {
2
+ version: "2.0.0",
3
+ name: "meeting-summary",
4
+ description: "회의 녹취록에서 구조화된 요약 정보를 추출합니다",
5
+ system: `당신은 회의록 분석 전문가입니다.
6
+ 회의 녹취록을 분석하여 핵심 정보를 구조화된 형식으로 추출합니다.
7
+
8
+ 추출 규칙:
9
+ 1. 회의 제목: 회의의 주제나 목적을 간결하게
10
+ 2. 참석자: 언급된 모든 참석자 이름 (역할 포함 시 "이름(역할)" 형식)
11
+ 3. 요약: 2-3문장으로 회의 전체 내용 요약
12
+ 4. 결정사항: 회의에서 확정된 사항들
13
+ 5. Action Items: 구체적인 할 일, 담당자, 기한 (언급된 경우)
14
+ 6. 주요 논의 포인트: 깊이 논의된 주제들
15
+ 7. 미해결 이슈: 결론 없이 남은 문제들
16
+ 8. 다음 단계: 향후 계획이나 후속 조치
17
+ 9. 프로젝트: 명시적으로 언급된 프로젝트명만 추출 (추측 금지)
18
+ 10. 스프린트: 명시적으로 언급된 스프린트/마일스톤만 추출 (추측 금지)
19
+
20
+ 담당자/기한/프로젝트/스프린트가 명시되지 않으면 null로 표시합니다.`,
21
+ template: (transcript) => `다음 회의 녹취록을 분석하고 JSON 형식으로 반환하세요:
22
+
23
+ ${transcript}
24
+
25
+ 응답 형식 (JSON):
26
+ {
27
+ "title": "회의 제목",
28
+ "date": "회의 날짜 (YYYY-MM-DD 또는 null)",
29
+ "participants": ["참석자1(역할)", "참석자2"],
30
+ "summary": "회의 전체 요약 (2-3문장)",
31
+ "decisions": ["결정사항 1", "결정사항 2"],
32
+ "actionItems": [
33
+ {"task": "할 일", "assignee": "담당자 또는 null", "deadline": "기한 또는 null"}
34
+ ],
35
+ "keyPoints": ["주요 논의 포인트 1", "주요 논의 포인트 2"],
36
+ "openIssues": ["미해결 이슈 1"],
37
+ "nextSteps": ["다음 단계 1"],
38
+ "project": "프로젝트명 또는 null",
39
+ "sprint": "스프린트명 또는 null"
40
+ }
41
+
42
+ JSON만 반환하세요.`,
43
+ };
44
+ //# sourceMappingURL=meeting-summary.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-summary.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/meeting-summary.prompt.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAW;IAC1C,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,4BAA4B;IACzC,MAAM,EAAE;;;;;;;;;;;;;;;wCAe8B;IACtC,QAAQ,EAAE,CAAC,UAAkB,EAAE,EAAE,CAC/B;;EAEF,UAAU;;;;;;;;;;;;;;;;;;;aAmBC;CACZ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "../../types/prompt.types.js";
2
+ export declare const summarizePrompt: Prompt;
3
+ export declare const imageSummarizePrompt: Prompt;
4
+ //# sourceMappingURL=summarize.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/summarize.prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D,eAAO,MAAM,eAAe,EAAE,MAe7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAiBlC,CAAC"}
@@ -0,0 +1,33 @@
1
+ export const summarizePrompt = {
2
+ version: "1.0.0",
3
+ name: "context-summarize",
4
+ description: "컨텍스트를 한 줄로 요약합니다",
5
+ system: `당신은 요약 전문가입니다.
6
+ 주어진 내용을 핵심만 담아 한 문장으로 요약하세요.
7
+
8
+ 규칙:
9
+ 1. 50자 이내로 요약
10
+ 2. 핵심 정보만 포함
11
+ 3. 문장으로 끝내기 (마침표 포함)`,
12
+ template: (content) => `다음 내용을 한 문장으로 요약하세요:
13
+
14
+ ${content}`,
15
+ };
16
+ export const imageSummarizePrompt = {
17
+ version: "1.1.0",
18
+ name: "image-analyze",
19
+ description: "이미지를 분석하여 설명과 태그를 추출합니다",
20
+ system: `당신은 이미지 분석 전문가입니다.
21
+ 이미지를 분석하여 설명과 관련 태그를 추출하세요.
22
+
23
+ 규칙:
24
+ 1. description: 이미지의 핵심 내용을 50자 이내 한 문장으로 설명
25
+ 2. tags: 이미지에 보이는 객체, 주제, 키워드를 2-7개 태그로 추출
26
+ 3. 반드시 JSON 형식으로만 응답
27
+
28
+ 응답 형식:
29
+ {"description": "이미지 설명", "tags": ["태그1", "태그2"]}`,
30
+ template: (_) => `이 이미지를 분석하고 JSON 형식으로 응답하세요.
31
+ {"description": "설명", "tags": ["태그1", "태그2"]}`,
32
+ };
33
+ //# sourceMappingURL=summarize.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/summarize.prompt.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,kBAAkB;IAC/B,MAAM,EAAE;;;;;;qBAMW;IACnB,QAAQ,EAAE,CAAC,OAAe,EAAE,EAAE,CAC5B;;EAEF,OAAO,EAAE;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAW;IAC1C,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,yBAAyB;IACtC,MAAM,EAAE;;;;;;;;;kDASwC;IAChD,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CACtB;8CAC0C;CAC7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "../../types/prompt.types.js";
2
+ export declare const taggingPrompt: Prompt;
3
+ export declare const imageTaggingPrompt: Prompt;
4
+ //# sourceMappingURL=tagging.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagging.prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/tagging.prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D,eAAO,MAAM,aAAa,EAAE,MA0B3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAehC,CAAC"}