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.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/ai/clients/claude.client.d.ts +10 -0
- package/dist/ai/clients/claude.client.d.ts.map +1 -0
- package/dist/ai/clients/claude.client.js +71 -0
- package/dist/ai/clients/claude.client.js.map +1 -0
- package/dist/ai/clients/embedding.client.d.ts +8 -0
- package/dist/ai/clients/embedding.client.d.ts.map +1 -0
- package/dist/ai/clients/embedding.client.js +22 -0
- package/dist/ai/clients/embedding.client.js.map +1 -0
- package/dist/ai/clients/index.d.ts +4 -0
- package/dist/ai/clients/index.d.ts.map +1 -0
- package/dist/ai/clients/index.js +4 -0
- package/dist/ai/clients/index.js.map +1 -0
- package/dist/ai/clients/whisper.client.d.ts +7 -0
- package/dist/ai/clients/whisper.client.d.ts.map +1 -0
- package/dist/ai/clients/whisper.client.js +17 -0
- package/dist/ai/clients/whisper.client.js.map +1 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +4 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/interfaces/index.d.ts +25 -0
- package/dist/ai/interfaces/index.d.ts.map +1 -0
- package/dist/ai/interfaces/index.js +2 -0
- package/dist/ai/interfaces/index.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +3 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +3 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/meeting-summary.prompt.d.ts +3 -0
- package/dist/ai/prompts/meeting-summary.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/meeting-summary.prompt.js +44 -0
- package/dist/ai/prompts/meeting-summary.prompt.js.map +1 -0
- package/dist/ai/prompts/summarize.prompt.d.ts +4 -0
- package/dist/ai/prompts/summarize.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/summarize.prompt.js +33 -0
- package/dist/ai/prompts/summarize.prompt.js.map +1 -0
- package/dist/ai/prompts/tagging.prompt.d.ts +4 -0
- package/dist/ai/prompts/tagging.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/tagging.prompt.js +42 -0
- package/dist/ai/prompts/tagging.prompt.js.map +1 -0
- package/dist/cli/commands/add.command.d.ts +3 -0
- package/dist/cli/commands/add.command.d.ts.map +1 -0
- package/dist/cli/commands/add.command.js +80 -0
- package/dist/cli/commands/add.command.js.map +1 -0
- package/dist/cli/commands/config.command.d.ts +3 -0
- package/dist/cli/commands/config.command.d.ts.map +1 -0
- package/dist/cli/commands/config.command.js +75 -0
- package/dist/cli/commands/config.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +5 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +5 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/list.command.d.ts +3 -0
- package/dist/cli/commands/list.command.d.ts.map +1 -0
- package/dist/cli/commands/list.command.js +57 -0
- package/dist/cli/commands/list.command.js.map +1 -0
- package/dist/cli/commands/search.command.d.ts +3 -0
- package/dist/cli/commands/search.command.d.ts.map +1 -0
- package/dist/cli/commands/search.command.js +68 -0
- package/dist/cli/commands/search.command.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/cli-runner.d.ts +14 -0
- package/dist/cli/utils/cli-runner.d.ts.map +1 -0
- package/dist/cli/utils/cli-runner.js +28 -0
- package/dist/cli/utils/cli-runner.js.map +1 -0
- package/dist/cli/utils/formatters.d.ts +19 -0
- package/dist/cli/utils/formatters.d.ts.map +1 -0
- package/dist/cli/utils/formatters.js +79 -0
- package/dist/cli/utils/formatters.js.map +1 -0
- package/dist/cli/utils/index.d.ts +3 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +3 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/config/config.d.ts +9 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +25 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/env.d.ts +5 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +18 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/keychain.d.ts +8 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +33 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/core/add-context.usecase.d.ts +11 -0
- package/dist/core/add-context.usecase.d.ts.map +1 -0
- package/dist/core/add-context.usecase.js +65 -0
- package/dist/core/add-context.usecase.js.map +1 -0
- package/dist/core/add-context.usecase.test.d.ts +2 -0
- package/dist/core/add-context.usecase.test.d.ts.map +1 -0
- package/dist/core/add-context.usecase.test.js +99 -0
- package/dist/core/add-context.usecase.test.js.map +1 -0
- package/dist/core/factories.d.ts +24 -0
- package/dist/core/factories.d.ts.map +1 -0
- package/dist/core/factories.js +51 -0
- package/dist/core/factories.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/search-context.usecase.d.ts +17 -0
- package/dist/core/search-context.usecase.d.ts.map +1 -0
- package/dist/core/search-context.usecase.js +45 -0
- package/dist/core/search-context.usecase.js.map +1 -0
- package/dist/core/search-context.usecase.test.d.ts +2 -0
- package/dist/core/search-context.usecase.test.d.ts.map +1 -0
- package/dist/core/search-context.usecase.test.js +152 -0
- package/dist/core/search-context.usecase.test.js.map +1 -0
- package/dist/core/summarize-meeting.usecase.d.ts +17 -0
- package/dist/core/summarize-meeting.usecase.d.ts.map +1 -0
- package/dist/core/summarize-meeting.usecase.js +126 -0
- package/dist/core/summarize-meeting.usecase.js.map +1 -0
- package/dist/errors/index.d.ts +41 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +65 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/input/audio.handler.d.ts +8 -0
- package/dist/input/audio.handler.d.ts.map +1 -0
- package/dist/input/audio.handler.js +20 -0
- package/dist/input/audio.handler.js.map +1 -0
- package/dist/input/file.handler.d.ts +5 -0
- package/dist/input/file.handler.d.ts.map +1 -0
- package/dist/input/file.handler.js +17 -0
- package/dist/input/file.handler.js.map +1 -0
- package/dist/input/image.handler.d.ts +8 -0
- package/dist/input/image.handler.d.ts.map +1 -0
- package/dist/input/image.handler.js +38 -0
- package/dist/input/image.handler.js.map +1 -0
- package/dist/input/index.d.ts +5 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +5 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/meeting.handler.d.ts +3 -0
- package/dist/input/meeting.handler.d.ts.map +1 -0
- package/dist/input/meeting.handler.js +16 -0
- package/dist/input/meeting.handler.js.map +1 -0
- package/dist/input/text.handler.d.ts +5 -0
- package/dist/input/text.handler.d.ts.map +1 -0
- package/dist/input/text.handler.js +9 -0
- package/dist/input/text.handler.js.map +1 -0
- package/dist/repositories/context.repository.d.ts +48 -0
- package/dist/repositories/context.repository.d.ts.map +1 -0
- package/dist/repositories/context.repository.js +2 -0
- package/dist/repositories/context.repository.js.map +1 -0
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +2 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/storage/obsidian/context.obsidian.d.ts +36 -0
- package/dist/storage/obsidian/context.obsidian.d.ts.map +1 -0
- package/dist/storage/obsidian/context.obsidian.js +236 -0
- package/dist/storage/obsidian/context.obsidian.js.map +1 -0
- package/dist/storage/obsidian/frontmatter.d.ts +17 -0
- package/dist/storage/obsidian/frontmatter.d.ts.map +1 -0
- package/dist/storage/obsidian/frontmatter.js +48 -0
- package/dist/storage/obsidian/frontmatter.js.map +1 -0
- package/dist/storage/obsidian/index.d.ts +3 -0
- package/dist/storage/obsidian/index.d.ts.map +1 -0
- package/dist/storage/obsidian/index.js +3 -0
- package/dist/storage/obsidian/index.js.map +1 -0
- package/dist/tui/App.d.ts +17 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +100 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/ContextCard.d.ts +15 -0
- package/dist/tui/components/ContextCard.d.ts.map +1 -0
- package/dist/tui/components/ContextCard.js +22 -0
- package/dist/tui/components/ContextCard.js.map +1 -0
- package/dist/tui/components/ErrorBanner.d.ts +6 -0
- package/dist/tui/components/ErrorBanner.d.ts.map +1 -0
- package/dist/tui/components/ErrorBanner.js +6 -0
- package/dist/tui/components/ErrorBanner.js.map +1 -0
- package/dist/tui/components/Header.d.ts +7 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +6 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/KeyHint.d.ts +11 -0
- package/dist/tui/components/KeyHint.d.ts.map +1 -0
- package/dist/tui/components/KeyHint.js +9 -0
- package/dist/tui/components/KeyHint.js.map +1 -0
- package/dist/tui/components/Menu.d.ts +11 -0
- package/dist/tui/components/Menu.d.ts.map +1 -0
- package/dist/tui/components/Menu.js +6 -0
- package/dist/tui/components/Menu.js.map +1 -0
- package/dist/tui/components/Spinner.d.ts +6 -0
- package/dist/tui/components/Spinner.d.ts.map +1 -0
- package/dist/tui/components/Spinner.js +7 -0
- package/dist/tui/components/Spinner.js.map +1 -0
- package/dist/tui/components/index.d.ts +7 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +7 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/hooks/index.d.ts +4 -0
- package/dist/tui/hooks/index.d.ts.map +1 -0
- package/dist/tui/hooks/index.js +4 -0
- package/dist/tui/hooks/index.js.map +1 -0
- package/dist/tui/hooks/useAsyncAction.d.ts +18 -0
- package/dist/tui/hooks/useAsyncAction.d.ts.map +1 -0
- package/dist/tui/hooks/useAsyncAction.js +20 -0
- package/dist/tui/hooks/useAsyncAction.js.map +1 -0
- package/dist/tui/hooks/useNavigation.d.ts +15 -0
- package/dist/tui/hooks/useNavigation.d.ts.map +1 -0
- package/dist/tui/hooks/useNavigation.js +33 -0
- package/dist/tui/hooks/useNavigation.js.map +1 -0
- package/dist/tui/hooks/useServices.d.ts +3 -0
- package/dist/tui/hooks/useServices.d.ts.map +1 -0
- package/dist/tui/hooks/useServices.js +6 -0
- package/dist/tui/hooks/useServices.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +7 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/screens/AddScreen.d.ts +9 -0
- package/dist/tui/screens/AddScreen.d.ts.map +1 -0
- package/dist/tui/screens/AddScreen.js +165 -0
- package/dist/tui/screens/AddScreen.js.map +1 -0
- package/dist/tui/screens/ConfigScreen.d.ts +8 -0
- package/dist/tui/screens/ConfigScreen.d.ts.map +1 -0
- package/dist/tui/screens/ConfigScreen.js +102 -0
- package/dist/tui/screens/ConfigScreen.js.map +1 -0
- package/dist/tui/screens/DetailScreen.d.ts +11 -0
- package/dist/tui/screens/DetailScreen.d.ts.map +1 -0
- package/dist/tui/screens/DetailScreen.js +92 -0
- package/dist/tui/screens/DetailScreen.js.map +1 -0
- package/dist/tui/screens/ListScreen.d.ts +11 -0
- package/dist/tui/screens/ListScreen.d.ts.map +1 -0
- package/dist/tui/screens/ListScreen.js +198 -0
- package/dist/tui/screens/ListScreen.js.map +1 -0
- package/dist/tui/screens/MainMenu.d.ts +8 -0
- package/dist/tui/screens/MainMenu.d.ts.map +1 -0
- package/dist/tui/screens/MainMenu.js +26 -0
- package/dist/tui/screens/MainMenu.js.map +1 -0
- package/dist/tui/screens/SearchScreen.d.ts +11 -0
- package/dist/tui/screens/SearchScreen.d.ts.map +1 -0
- package/dist/tui/screens/SearchScreen.js +130 -0
- package/dist/tui/screens/SearchScreen.js.map +1 -0
- package/dist/tui/screens/index.d.ts +7 -0
- package/dist/tui/screens/index.d.ts.map +1 -0
- package/dist/tui/screens/index.js +7 -0
- package/dist/tui/screens/index.js.map +1 -0
- package/dist/types/config.types.d.ts +19 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +8 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/context.schema.d.ts +81 -0
- package/dist/types/context.schema.d.ts.map +1 -0
- package/dist/types/context.schema.js +33 -0
- package/dist/types/context.schema.js.map +1 -0
- package/dist/types/context.types.d.ts +37 -0
- package/dist/types/context.types.d.ts.map +1 -0
- package/dist/types/context.types.js +5 -0
- package/dist/types/context.types.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/meeting.schema.d.ts +195 -0
- package/dist/types/meeting.schema.d.ts.map +1 -0
- package/dist/types/meeting.schema.js +33 -0
- package/dist/types/meeting.schema.js.map +1 -0
- package/dist/types/meeting.types.d.ts +34 -0
- package/dist/types/meeting.types.d.ts.map +1 -0
- package/dist/types/meeting.types.js +2 -0
- package/dist/types/meeting.types.js.map +1 -0
- package/dist/types/prompt.types.d.ts +22 -0
- package/dist/types/prompt.types.d.ts.map +1 -0
- package/dist/types/prompt.types.js +9 -0
- package/dist/types/prompt.types.js.map +1 -0
- package/dist/types/tag.types.d.ts +9 -0
- package/dist/types/tag.types.d.ts.map +1 -0
- package/dist/types/tag.types.js +2 -0
- package/dist/types/tag.types.js.map +1 -0
- package/dist/utils/file-validator.d.ts +14 -0
- package/dist/utils/file-validator.d.ts.map +1 -0
- package/dist/utils/file-validator.js +35 -0
- package/dist/utils/file-validator.js.map +1 -0
- package/dist/utils/filter.d.ts +15 -0
- package/dist/utils/filter.d.ts.map +1 -0
- package/dist/utils/filter.js +40 -0
- package/dist/utils/filter.js.map +1 -0
- package/dist/utils/filter.test.d.ts +2 -0
- package/dist/utils/filter.test.d.ts.map +1 -0
- package/dist/utils/filter.test.js +90 -0
- package/dist/utils/filter.test.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-parser.d.ts +25 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +70 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/json-parser.test.d.ts +2 -0
- package/dist/utils/json-parser.test.d.ts.map +1 -0
- package/dist/utils/json-parser.test.js +102 -0
- package/dist/utils/json-parser.test.js.map +1 -0
- package/dist/utils/math.d.ts +8 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +22 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/related-links.d.ts +13 -0
- package/dist/utils/related-links.d.ts.map +1 -0
- package/dist/utils/related-links.js +28 -0
- package/dist/utils/related-links.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/ai/index.js
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/interfaces/index.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|