@su-record/vibe 2.6.13 → 2.6.15
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 -21
- package/README.md +497 -497
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/e2e-tester.md +266 -266
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui-previewer.md +268 -268
- package/commands/vibe.analyze.md +356 -356
- package/commands/vibe.reason.md +329 -329
- package/commands/vibe.review.md +412 -412
- package/commands/vibe.run.md +1266 -1266
- package/commands/vibe.spec.md +1054 -1054
- package/commands/vibe.spec.review.md +319 -319
- package/commands/vibe.trace.md +161 -161
- package/commands/vibe.utils.md +376 -376
- package/commands/vibe.verify.md +375 -375
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/detect.d.ts.map +1 -1
- package/dist/cli/detect.js +118 -44
- package/dist/cli/detect.js.map +1 -1
- package/dist/cli/hud.js +20 -20
- package/dist/cli/index.js +118 -118
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm.js +144 -144
- package/dist/cli/mcp.d.ts +49 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +169 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/postinstall.js +858 -858
- package/dist/cli/setup/ProjectSetup.d.ts +3 -0
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +28 -6
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/lib/DeepInit.js +24 -24
- package/dist/lib/IterationTracker.js +11 -11
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/ReviewRace.js +96 -96
- package/dist/lib/SkillFrontmatter.js +28 -28
- package/dist/lib/SkillQualityGate.js +9 -9
- package/dist/lib/SkillRepository.js +159 -159
- package/dist/lib/UltraQA.js +77 -77
- package/dist/lib/gemini-api.js +5 -5
- package/dist/lib/gemini-mcp.d.ts +10 -0
- package/dist/lib/gemini-mcp.d.ts.map +1 -0
- package/dist/lib/gemini-mcp.js +353 -0
- package/dist/lib/gemini-mcp.js.map +1 -0
- package/dist/lib/gpt-api.js +4 -4
- package/dist/lib/gpt-mcp.d.ts +10 -0
- package/dist/lib/gpt-mcp.d.ts.map +1 -0
- package/dist/lib/gpt-mcp.js +352 -0
- package/dist/lib/gpt-mcp.js.map +1 -0
- package/dist/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/lib/memory/MemorySearch.js +20 -20
- package/dist/lib/memory/MemoryStorage.js +64 -64
- package/dist/orchestrator/AgentManager.js +12 -12
- package/dist/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/orchestrator/SmartRouter.js +11 -11
- package/dist/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/analytics/getUsageAnalytics.d.ts +10 -0
- package/dist/tools/analytics/getUsageAnalytics.d.ts.map +1 -0
- package/dist/tools/analytics/getUsageAnalytics.js +246 -0
- package/dist/tools/analytics/getUsageAnalytics.js.map +1 -0
- package/dist/tools/analytics/index.d.ts +5 -0
- package/dist/tools/analytics/index.d.ts.map +1 -0
- package/dist/tools/analytics/index.js +5 -0
- package/dist/tools/analytics/index.js.map +1 -0
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/getCodingGuide.d.ts +7 -0
- package/dist/tools/convention/getCodingGuide.d.ts.map +1 -0
- package/dist/tools/convention/getCodingGuide.js +69 -0
- package/dist/tools/convention/getCodingGuide.js.map +1 -0
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/planning/analyzeRequirements.d.ts +9 -0
- package/dist/tools/planning/analyzeRequirements.d.ts.map +1 -0
- package/dist/tools/planning/analyzeRequirements.js +171 -0
- package/dist/tools/planning/analyzeRequirements.js.map +1 -0
- package/dist/tools/planning/createUserStories.d.ts +9 -0
- package/dist/tools/planning/createUserStories.d.ts.map +1 -0
- package/dist/tools/planning/createUserStories.js +124 -0
- package/dist/tools/planning/createUserStories.js.map +1 -0
- package/dist/tools/planning/featureRoadmap.d.ts +10 -0
- package/dist/tools/planning/featureRoadmap.d.ts.map +1 -0
- package/dist/tools/planning/featureRoadmap.js +207 -0
- package/dist/tools/planning/featureRoadmap.js.map +1 -0
- package/dist/tools/planning/generatePrd.d.ts +11 -0
- package/dist/tools/planning/generatePrd.d.ts.map +1 -0
- package/dist/tools/planning/generatePrd.js +161 -0
- package/dist/tools/planning/generatePrd.js.map +1 -0
- package/dist/tools/planning/index.d.ts +8 -0
- package/dist/tools/planning/index.d.ts.map +1 -0
- package/dist/tools/planning/index.js +8 -0
- package/dist/tools/planning/index.js.map +1 -0
- package/dist/tools/prompt/analyzePrompt.d.ts +7 -0
- package/dist/tools/prompt/analyzePrompt.d.ts.map +1 -0
- package/dist/tools/prompt/analyzePrompt.js +150 -0
- package/dist/tools/prompt/analyzePrompt.js.map +1 -0
- package/dist/tools/prompt/enhancePrompt.d.ts +8 -0
- package/dist/tools/prompt/enhancePrompt.d.ts.map +1 -0
- package/dist/tools/prompt/enhancePrompt.js +110 -0
- package/dist/tools/prompt/enhancePrompt.js.map +1 -0
- package/dist/tools/prompt/enhancePromptGemini.d.ts +8 -0
- package/dist/tools/prompt/enhancePromptGemini.d.ts.map +1 -0
- package/dist/tools/prompt/enhancePromptGemini.js +332 -0
- package/dist/tools/prompt/enhancePromptGemini.js.map +1 -0
- package/dist/tools/prompt/index.d.ts +7 -0
- package/dist/tools/prompt/index.d.ts.map +1 -0
- package/dist/tools/prompt/index.js +7 -0
- package/dist/tools/prompt/index.js.map +1 -0
- package/dist/tools/reasoning/applyReasoningFramework.d.ts +8 -0
- package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +1 -0
- package/dist/tools/reasoning/applyReasoningFramework.js +266 -0
- package/dist/tools/reasoning/applyReasoningFramework.js.map +1 -0
- package/dist/tools/reasoning/index.d.ts +5 -0
- package/dist/tools/reasoning/index.d.ts.map +1 -0
- package/dist/tools/reasoning/index.js +5 -0
- package/dist/tools/reasoning/index.js.map +1 -0
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/dist/tools/thinking/analyzeProblem.d.ts +7 -0
- package/dist/tools/thinking/analyzeProblem.d.ts.map +1 -0
- package/dist/tools/thinking/analyzeProblem.js +55 -0
- package/dist/tools/thinking/analyzeProblem.js.map +1 -0
- package/dist/tools/thinking/breakDownProblem.d.ts +8 -0
- package/dist/tools/thinking/breakDownProblem.d.ts.map +1 -0
- package/dist/tools/thinking/breakDownProblem.js +145 -0
- package/dist/tools/thinking/breakDownProblem.js.map +1 -0
- package/dist/tools/thinking/createThinkingChain.d.ts +7 -0
- package/dist/tools/thinking/createThinkingChain.d.ts.map +1 -0
- package/dist/tools/thinking/createThinkingChain.js +44 -0
- package/dist/tools/thinking/createThinkingChain.js.map +1 -0
- package/dist/tools/thinking/formatAsPlan.d.ts +9 -0
- package/dist/tools/thinking/formatAsPlan.d.ts.map +1 -0
- package/dist/tools/thinking/formatAsPlan.js +78 -0
- package/dist/tools/thinking/formatAsPlan.js.map +1 -0
- package/dist/tools/thinking/index.d.ts +10 -0
- package/dist/tools/thinking/index.d.ts.map +1 -0
- package/dist/tools/thinking/index.js +10 -0
- package/dist/tools/thinking/index.js.map +1 -0
- package/dist/tools/thinking/stepByStepAnalysis.d.ts +8 -0
- package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +1 -0
- package/dist/tools/thinking/stepByStepAnalysis.js +63 -0
- package/dist/tools/thinking/stepByStepAnalysis.js.map +1 -0
- package/dist/tools/thinking/thinkAloudProcess.d.ts +8 -0
- package/dist/tools/thinking/thinkAloudProcess.d.ts.map +1 -0
- package/dist/tools/thinking/thinkAloudProcess.js +80 -0
- package/dist/tools/thinking/thinkAloudProcess.js.map +1 -0
- package/hooks/hooks.json +222 -222
- package/hooks/scripts/code-check.js +22 -22
- package/hooks/scripts/code-review.js +22 -22
- package/hooks/scripts/complexity.js +22 -22
- package/hooks/scripts/compound.js +23 -23
- package/hooks/scripts/context-save.js +33 -33
- package/hooks/scripts/gemini-ui-gen.js +281 -281
- package/hooks/scripts/generate-brand-assets.js +474 -474
- package/hooks/scripts/hud-multiline.js +262 -262
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +171 -171
- package/hooks/scripts/post-edit.js +97 -97
- package/hooks/scripts/post-tool-verify.js +210 -210
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/recall.js +22 -22
- package/hooks/scripts/session-start.js +30 -30
- package/hooks/scripts/skill-injector.js +191 -191
- package/hooks/scripts/utils.js +97 -97
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +84 -84
- package/skills/brand-assets.md +141 -141
- package/skills/commerce-patterns.md +361 -361
- package/skills/context7-usage.md +102 -102
- package/skills/e2e-commerce.md +304 -304
- package/skills/frontend-design.md +92 -92
- package/skills/git-worktree.md +181 -181
- package/skills/parallel-research.md +77 -77
- package/skills/priority-todos.md +239 -239
- package/skills/seo-checklist.md +244 -244
- package/skills/tool-fallback.md +190 -190
- package/skills/vibe-capabilities.md +161 -161
- package/vibe/constitution.md +227 -227
- package/vibe/rules/core/communication-guide.md +98 -98
- package/vibe/rules/core/development-philosophy.md +52 -52
- package/vibe/rules/core/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* vibe-gpt MCP Server
|
|
4
|
+
* GPT API를 MCP 도구로 제공하여 Claude Code에서 서브에이전트로 활용
|
|
5
|
+
*
|
|
6
|
+
* 사용법:
|
|
7
|
+
* claude mcp add vibe-gpt node /path/to/vibe/dist/lib/gpt-mcp.js -s user
|
|
8
|
+
*/
|
|
9
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
10
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
11
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
// GPT API 모듈 로드
|
|
13
|
+
import * as gptApi from './gpt-api.js';
|
|
14
|
+
import * as gptStorage from './gpt-storage.js';
|
|
15
|
+
// MCP 서버 생성
|
|
16
|
+
const server = new Server({
|
|
17
|
+
name: 'vibe-gpt',
|
|
18
|
+
version: '1.0.0',
|
|
19
|
+
}, {
|
|
20
|
+
capabilities: {
|
|
21
|
+
tools: {},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
// 도구 목록 정의
|
|
25
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
26
|
+
return {
|
|
27
|
+
tools: [
|
|
28
|
+
{
|
|
29
|
+
name: 'gpt_chat',
|
|
30
|
+
description: 'GPT-5.2 모델에 질문하기. 아키텍처 분석, 디버깅, 복잡한 문제 해결에 활용. 서브에이전트로 사용 가능.',
|
|
31
|
+
inputSchema: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {
|
|
34
|
+
prompt: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: '질문 또는 요청 내용',
|
|
37
|
+
},
|
|
38
|
+
model: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: '사용할 모델 (gpt-5.2, gpt-5.2-codex, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-codex-max)',
|
|
41
|
+
default: 'gpt-5.2',
|
|
42
|
+
},
|
|
43
|
+
systemPrompt: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: '시스템 프롬프트 (선택)',
|
|
46
|
+
},
|
|
47
|
+
maxTokens: {
|
|
48
|
+
type: 'number',
|
|
49
|
+
description: '최대 토큰 수',
|
|
50
|
+
default: 4096,
|
|
51
|
+
},
|
|
52
|
+
temperature: {
|
|
53
|
+
type: 'number',
|
|
54
|
+
description: '온도 (0-1)',
|
|
55
|
+
default: 0.7,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ['prompt'],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'gpt_analyze_architecture',
|
|
63
|
+
description: '아키텍처 분석 요청. GPT-5.2가 코드 구조와 설계를 분석하고 개선점을 제안.',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
code: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
description: '분석할 코드 또는 아키텍처 설명',
|
|
70
|
+
},
|
|
71
|
+
context: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: '프로젝트 컨텍스트 (선택)',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
required: ['code'],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'gpt_debug',
|
|
81
|
+
description: '디버깅 요청. GPT-5.2 Codex가 버그를 찾고 수정 방법을 제안.',
|
|
82
|
+
inputSchema: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
properties: {
|
|
85
|
+
code: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: '디버깅할 코드',
|
|
88
|
+
},
|
|
89
|
+
error: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
description: '에러 메시지 또는 증상 (선택)',
|
|
92
|
+
},
|
|
93
|
+
language: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: '프로그래밍 언어 (선택)',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ['code'],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'gpt_quick_ask',
|
|
103
|
+
description: '빠른 질문. 간단한 질문에 최적화 (GPT-5.1 Codex Mini 사용).',
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: 'object',
|
|
106
|
+
properties: {
|
|
107
|
+
prompt: {
|
|
108
|
+
type: 'string',
|
|
109
|
+
description: '질문 내용',
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
required: ['prompt'],
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'gpt_auth_status',
|
|
117
|
+
description: 'GPT OAuth 인증 상태 확인',
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: 'object',
|
|
120
|
+
properties: {},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'gpt_list_models',
|
|
125
|
+
description: '사용 가능한 GPT 모델 목록',
|
|
126
|
+
inputSchema: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
properties: {},
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
// 도구 실행 핸들러
|
|
135
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
136
|
+
const { name, arguments: args } = request.params;
|
|
137
|
+
try {
|
|
138
|
+
switch (name) {
|
|
139
|
+
case 'gpt_chat': {
|
|
140
|
+
const { prompt, model, systemPrompt, maxTokens, temperature } = args;
|
|
141
|
+
const result = await gptApi.chat({
|
|
142
|
+
model: model || 'gpt-5.2',
|
|
143
|
+
messages: [{ role: 'user', content: prompt }],
|
|
144
|
+
systemPrompt: systemPrompt || '',
|
|
145
|
+
maxTokens: maxTokens || 4096,
|
|
146
|
+
temperature: temperature || 0.7,
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: 'text',
|
|
152
|
+
text: JSON.stringify({
|
|
153
|
+
response: result.content,
|
|
154
|
+
model: result.model,
|
|
155
|
+
}, null, 2),
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
case 'gpt_analyze_architecture': {
|
|
161
|
+
const { code, context } = args;
|
|
162
|
+
const sysPrompt = `You are a senior software architect. Analyze the given code or architecture and provide detailed insights.
|
|
163
|
+
|
|
164
|
+
${context ? `Project context: ${context}` : ''}
|
|
165
|
+
|
|
166
|
+
Respond in Korean and provide:
|
|
167
|
+
1. 아키텍처 요약
|
|
168
|
+
2. 강점
|
|
169
|
+
3. 잠재적 문제점
|
|
170
|
+
4. 개선 제안
|
|
171
|
+
5. 확장성 평가`;
|
|
172
|
+
const result = await gptApi.chat({
|
|
173
|
+
model: 'gpt-5.2',
|
|
174
|
+
messages: [{ role: 'user', content: code }],
|
|
175
|
+
systemPrompt: sysPrompt,
|
|
176
|
+
maxTokens: 8192,
|
|
177
|
+
temperature: 0.5,
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
content: [
|
|
181
|
+
{
|
|
182
|
+
type: 'text',
|
|
183
|
+
text: result.content,
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
case 'gpt_debug': {
|
|
189
|
+
const { code, error, language } = args;
|
|
190
|
+
const sysPrompt = `You are an expert debugger. Analyze the given ${language || 'code'} and identify bugs.
|
|
191
|
+
|
|
192
|
+
${error ? `Error/Symptom: ${error}` : ''}
|
|
193
|
+
|
|
194
|
+
Respond in Korean and provide:
|
|
195
|
+
1. 버그 식별
|
|
196
|
+
2. 원인 분석
|
|
197
|
+
3. 수정된 코드
|
|
198
|
+
4. 예방 방법`;
|
|
199
|
+
const result = await gptApi.chat({
|
|
200
|
+
model: 'gpt-5.2-codex',
|
|
201
|
+
messages: [{ role: 'user', content: code }],
|
|
202
|
+
systemPrompt: sysPrompt,
|
|
203
|
+
maxTokens: 4096,
|
|
204
|
+
temperature: 0.3,
|
|
205
|
+
});
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: 'text',
|
|
210
|
+
text: result.content,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
case 'gpt_quick_ask': {
|
|
216
|
+
const { prompt } = args;
|
|
217
|
+
const response = await gptApi.quickAsk(prompt);
|
|
218
|
+
return {
|
|
219
|
+
content: [
|
|
220
|
+
{
|
|
221
|
+
type: 'text',
|
|
222
|
+
text: response,
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
case 'gpt_auth_status': {
|
|
228
|
+
try {
|
|
229
|
+
const account = gptStorage.getActiveAccount();
|
|
230
|
+
if (account) {
|
|
231
|
+
const isExpired = gptStorage.isTokenExpired(account);
|
|
232
|
+
return {
|
|
233
|
+
content: [
|
|
234
|
+
{
|
|
235
|
+
type: 'text',
|
|
236
|
+
text: JSON.stringify({
|
|
237
|
+
authenticated: true,
|
|
238
|
+
email: account.email,
|
|
239
|
+
tokenValid: !isExpired,
|
|
240
|
+
expires: new Date(account.expires).toISOString(),
|
|
241
|
+
}, null, 2),
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
return {
|
|
248
|
+
content: [
|
|
249
|
+
{
|
|
250
|
+
type: 'text',
|
|
251
|
+
text: JSON.stringify({
|
|
252
|
+
authenticated: false,
|
|
253
|
+
message: 'vibe gpt --auth 명령으로 인증하세요.',
|
|
254
|
+
}, null, 2),
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
return {
|
|
262
|
+
content: [
|
|
263
|
+
{
|
|
264
|
+
type: 'text',
|
|
265
|
+
text: JSON.stringify({
|
|
266
|
+
authenticated: false,
|
|
267
|
+
error: error.message,
|
|
268
|
+
}, null, 2),
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
case 'gpt_list_models': {
|
|
275
|
+
const models = gptApi.getAvailableModels();
|
|
276
|
+
return {
|
|
277
|
+
content: [
|
|
278
|
+
{
|
|
279
|
+
type: 'text',
|
|
280
|
+
text: JSON.stringify(models, null, 2),
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
default:
|
|
286
|
+
return {
|
|
287
|
+
content: [
|
|
288
|
+
{
|
|
289
|
+
type: 'text',
|
|
290
|
+
text: `Unknown tool: ${name}`,
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
isError: true,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
const errorMessage = error.message;
|
|
299
|
+
// 429 Rate Limit 또는 구독 에러 시 Claude fallback 안내
|
|
300
|
+
if (errorMessage.includes('429') || errorMessage.includes('plan_type') || errorMessage.includes('usage_not_included')) {
|
|
301
|
+
return {
|
|
302
|
+
content: [
|
|
303
|
+
{
|
|
304
|
+
type: 'text',
|
|
305
|
+
text: JSON.stringify({
|
|
306
|
+
status: 'fallback',
|
|
307
|
+
reason: 'subscription_required',
|
|
308
|
+
message: 'GPT API 접근 불가. ChatGPT Plus/Pro 구독이 필요합니다. Claude가 직접 처리해주세요.',
|
|
309
|
+
original_error: errorMessage,
|
|
310
|
+
}, null, 2),
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
isError: false, // fallback은 에러가 아님
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// 인증 에러 시 fallback 안내
|
|
317
|
+
if (errorMessage.includes('401') || errorMessage.includes('403') || errorMessage.includes('인증')) {
|
|
318
|
+
return {
|
|
319
|
+
content: [
|
|
320
|
+
{
|
|
321
|
+
type: 'text',
|
|
322
|
+
text: JSON.stringify({
|
|
323
|
+
status: 'fallback',
|
|
324
|
+
reason: 'auth_error',
|
|
325
|
+
message: 'GPT 인증 만료. Claude가 직접 처리해주세요. (vibe gpt --auth로 재인증 가능)',
|
|
326
|
+
original_error: errorMessage,
|
|
327
|
+
}, null, 2),
|
|
328
|
+
},
|
|
329
|
+
],
|
|
330
|
+
isError: false,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
// 기타 에러
|
|
334
|
+
return {
|
|
335
|
+
content: [
|
|
336
|
+
{
|
|
337
|
+
type: 'text',
|
|
338
|
+
text: `Error: ${errorMessage}`,
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
isError: true,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
// 서버 시작
|
|
346
|
+
async function main() {
|
|
347
|
+
const transport = new StdioServerTransport();
|
|
348
|
+
await server.connect(transport);
|
|
349
|
+
console.error('vibe-gpt MCP server running');
|
|
350
|
+
}
|
|
351
|
+
main().catch(console.error);
|
|
352
|
+
//# sourceMappingURL=gpt-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpt-mcp.js","sourceRoot":"","sources":["../../src/lib/gpt-mcp.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,gBAAgB;AAChB,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,YAAY;AACZ,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,+DAA+D;gBAC5E,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,aAAa;yBAC3B;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uFAAuF;4BACpG,OAAO,EAAE,SAAS;yBACnB;wBACD,YAAY,EAAE;4BACZ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,eAAe;yBAC7B;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,SAAS;4BACtB,OAAO,EAAE,IAAI;yBACd;wBACD,WAAW,EAAE;4BACX,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,UAAU;4BACvB,OAAO,EAAE,GAAG;yBACb;qBACF;oBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;iBACrB;aACF;YACD;gBACE,IAAI,EAAE,0BAA0B;gBAChC,WAAW,EAAE,+CAA+C;gBAC5D,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mBAAmB;yBACjC;wBACD,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,gBAAgB;yBAC9B;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,0CAA0C;gBACvD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,SAAS;yBACvB;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mBAAmB;yBACjC;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,eAAe;yBAC7B;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,6CAA6C;gBAC1D,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,OAAO;yBACrB;qBACF;oBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;iBACrB;aACF;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,oBAAoB;gBACjC,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf;aACF;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,kBAAkB;gBAC/B,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AA0BH,YAAY;AACZ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAA2B,CAAC;gBAC5F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;oBAC/B,KAAK,EAAE,KAAK,IAAI,SAAS;oBACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC7C,YAAY,EAAE,YAAY,IAAI,EAAE;oBAChC,SAAS,EAAE,SAAS,IAAI,IAAI;oBAC5B,WAAW,EAAE,WAAW,IAAI,GAAG;iBAChC,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,QAAQ,EAAE,MAAM,CAAC,OAAO;gCACxB,KAAK,EAAE,MAAM,CAAC,KAAK;6BACpB,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,0BAA0B,CAAC,CAAC,CAAC;gBAChC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAA8B,CAAC;gBACzD,MAAM,SAAS,GAAG;;EAExB,OAAO,CAAC,CAAC,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;UAOpC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;oBAC/B,KAAK,EAAE,SAAS;oBAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3C,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,GAAG;iBACjB,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,MAAM,CAAC,OAAO;yBACrB;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAA4B,CAAC;gBAC/D,MAAM,SAAS,GAAG,iDAAiD,QAAQ,IAAI,MAAM;;EAE3F,KAAK,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;SAM/B,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;oBAC/B,KAAK,EAAE,eAAe;oBACtB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3C,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,GAAG;iBACjB,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,MAAM,CAAC,OAAO;yBACrB;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,EAAE,MAAM,EAAE,GAAG,IAA+B,CAAC;gBACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,QAAQ;yBACf;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;oBAC9C,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;wBACrD,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wCACnB,aAAa,EAAE,IAAI;wCACnB,KAAK,EAAE,OAAO,CAAC,KAAK;wCACpB,UAAU,EAAE,CAAC,SAAS;wCACtB,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;qCACjD,EAAE,IAAI,EAAE,CAAC,CAAC;iCACZ;6BACF;yBACF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wCACnB,aAAa,EAAE,KAAK;wCACpB,OAAO,EAAE,6BAA6B;qCACvC,EAAE,IAAI,EAAE,CAAC,CAAC;iCACZ;6BACF;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,aAAa,EAAE,KAAK;oCACpB,KAAK,EAAG,KAAe,CAAC,OAAO;iCAChC,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAED;gBACE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iBAAiB,IAAI,EAAE;yBAC9B;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;QAE9C,+CAA+C;QAC/C,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,UAAU;4BAClB,MAAM,EAAE,uBAAuB;4BAC/B,OAAO,EAAE,+DAA+D;4BACxE,cAAc,EAAE,YAAY;yBAC7B,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,KAAK,EAAE,mBAAmB;aACpC,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChG,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,UAAU;4BAClB,MAAM,EAAE,YAAY;4BACpB,OAAO,EAAE,yDAAyD;4BAClE,cAAc,EAAE,YAAY;yBAC7B,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAED,QAAQ;QACR,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU,YAAY,EAAE;iBAC/B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -14,10 +14,10 @@ export class KnowledgeGraph {
|
|
|
14
14
|
const timestamp = new Date().toISOString();
|
|
15
15
|
const metadataJson = metadata ? JSON.stringify(metadata) : null;
|
|
16
16
|
try {
|
|
17
|
-
const stmt = this.db.prepare(`
|
|
18
|
-
INSERT OR REPLACE INTO memory_relations
|
|
19
|
-
(sourceKey, targetKey, relationType, strength, metadata, timestamp)
|
|
20
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
17
|
+
const stmt = this.db.prepare(`
|
|
18
|
+
INSERT OR REPLACE INTO memory_relations
|
|
19
|
+
(sourceKey, targetKey, relationType, strength, metadata, timestamp)
|
|
20
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
21
21
|
`);
|
|
22
22
|
stmt.run(sourceKey, targetKey, relationType, strength, metadataJson, timestamp);
|
|
23
23
|
return true;
|
|
@@ -32,9 +32,9 @@ export class MemorySearch {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
searchKeyword(query, limit, category) {
|
|
35
|
-
let sql = `
|
|
36
|
-
SELECT * FROM memories
|
|
37
|
-
WHERE (key LIKE ? OR value LIKE ?)
|
|
35
|
+
let sql = `
|
|
36
|
+
SELECT * FROM memories
|
|
37
|
+
WHERE (key LIKE ? OR value LIKE ?)
|
|
38
38
|
`;
|
|
39
39
|
const params = [`%${query}%`, `%${query}%`];
|
|
40
40
|
if (category) {
|
|
@@ -46,31 +46,31 @@ export class MemorySearch {
|
|
|
46
46
|
return this.db.prepare(sql).all(...params);
|
|
47
47
|
}
|
|
48
48
|
searchTemporal(query, limit) {
|
|
49
|
-
const sql = `
|
|
50
|
-
SELECT * FROM memories
|
|
51
|
-
WHERE key LIKE ? OR value LIKE ?
|
|
52
|
-
ORDER BY timestamp DESC
|
|
53
|
-
LIMIT ?
|
|
49
|
+
const sql = `
|
|
50
|
+
SELECT * FROM memories
|
|
51
|
+
WHERE key LIKE ? OR value LIKE ?
|
|
52
|
+
ORDER BY timestamp DESC
|
|
53
|
+
LIMIT ?
|
|
54
54
|
`;
|
|
55
55
|
return this.db.prepare(sql).all(`%${query}%`, `%${query}%`, limit);
|
|
56
56
|
}
|
|
57
57
|
searchByPriority(query, limit) {
|
|
58
|
-
const sql = `
|
|
59
|
-
SELECT * FROM memories
|
|
60
|
-
WHERE key LIKE ? OR value LIKE ?
|
|
61
|
-
ORDER BY priority DESC, lastAccessed DESC
|
|
62
|
-
LIMIT ?
|
|
58
|
+
const sql = `
|
|
59
|
+
SELECT * FROM memories
|
|
60
|
+
WHERE key LIKE ? OR value LIKE ?
|
|
61
|
+
ORDER BY priority DESC, lastAccessed DESC
|
|
62
|
+
LIMIT ?
|
|
63
63
|
`;
|
|
64
64
|
return this.db.prepare(sql).all(`%${query}%`, `%${query}%`, limit);
|
|
65
65
|
}
|
|
66
66
|
searchContextAware(query, limit, category) {
|
|
67
|
-
let sql = `
|
|
68
|
-
SELECT *,
|
|
69
|
-
(CASE WHEN key LIKE ? THEN 3 ELSE 0 END +
|
|
70
|
-
CASE WHEN value LIKE ? THEN 2 ELSE 0 END +
|
|
71
|
-
priority * 0.5) as relevance_score
|
|
72
|
-
FROM memories
|
|
73
|
-
WHERE key LIKE ? OR value LIKE ?
|
|
67
|
+
let sql = `
|
|
68
|
+
SELECT *,
|
|
69
|
+
(CASE WHEN key LIKE ? THEN 3 ELSE 0 END +
|
|
70
|
+
CASE WHEN value LIKE ? THEN 2 ELSE 0 END +
|
|
71
|
+
priority * 0.5) as relevance_score
|
|
72
|
+
FROM memories
|
|
73
|
+
WHERE key LIKE ? OR value LIKE ?
|
|
74
74
|
`;
|
|
75
75
|
const params = [`%${query}%`, `%${query}%`, `%${query}%`, `%${query}%`];
|
|
76
76
|
if (category) {
|
|
@@ -31,37 +31,37 @@ export class MemoryStorage {
|
|
|
31
31
|
}
|
|
32
32
|
initializeDatabase() {
|
|
33
33
|
// Create memories table
|
|
34
|
-
this.db.exec(`
|
|
35
|
-
CREATE TABLE IF NOT EXISTS memories (
|
|
36
|
-
key TEXT PRIMARY KEY,
|
|
37
|
-
value TEXT NOT NULL,
|
|
38
|
-
category TEXT NOT NULL DEFAULT 'general',
|
|
39
|
-
timestamp TEXT NOT NULL,
|
|
40
|
-
lastAccessed TEXT NOT NULL,
|
|
41
|
-
priority INTEGER DEFAULT 0
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_category ON memories(category);
|
|
45
|
-
CREATE INDEX IF NOT EXISTS idx_timestamp ON memories(timestamp);
|
|
46
|
-
CREATE INDEX IF NOT EXISTS idx_priority ON memories(priority);
|
|
47
|
-
CREATE INDEX IF NOT EXISTS idx_lastAccessed ON memories(lastAccessed);
|
|
34
|
+
this.db.exec(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
36
|
+
key TEXT PRIMARY KEY,
|
|
37
|
+
value TEXT NOT NULL,
|
|
38
|
+
category TEXT NOT NULL DEFAULT 'general',
|
|
39
|
+
timestamp TEXT NOT NULL,
|
|
40
|
+
lastAccessed TEXT NOT NULL,
|
|
41
|
+
priority INTEGER DEFAULT 0
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_category ON memories(category);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_timestamp ON memories(timestamp);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_priority ON memories(priority);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_lastAccessed ON memories(lastAccessed);
|
|
48
48
|
`);
|
|
49
49
|
// Create memory_relations table for Knowledge Graph
|
|
50
|
-
this.db.exec(`
|
|
51
|
-
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
52
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
53
|
-
sourceKey TEXT NOT NULL,
|
|
54
|
-
targetKey TEXT NOT NULL,
|
|
55
|
-
relationType TEXT NOT NULL,
|
|
56
|
-
strength REAL DEFAULT 1.0,
|
|
57
|
-
metadata TEXT,
|
|
58
|
-
timestamp TEXT NOT NULL,
|
|
59
|
-
UNIQUE(sourceKey, targetKey, relationType)
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
|
|
63
|
-
CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
|
|
64
|
-
CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
|
|
50
|
+
this.db.exec(`
|
|
51
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
52
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
53
|
+
sourceKey TEXT NOT NULL,
|
|
54
|
+
targetKey TEXT NOT NULL,
|
|
55
|
+
relationType TEXT NOT NULL,
|
|
56
|
+
strength REAL DEFAULT 1.0,
|
|
57
|
+
metadata TEXT,
|
|
58
|
+
timestamp TEXT NOT NULL,
|
|
59
|
+
UNIQUE(sourceKey, targetKey, relationType)
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
|
|
65
65
|
`);
|
|
66
66
|
// Enable WAL mode for better concurrency
|
|
67
67
|
this.db.pragma('journal_mode = WAL');
|
|
@@ -70,10 +70,10 @@ export class MemoryStorage {
|
|
|
70
70
|
}
|
|
71
71
|
initializePreparedStatements() {
|
|
72
72
|
try {
|
|
73
|
-
this.recallStmt = this.db.prepare(`
|
|
74
|
-
UPDATE memories SET lastAccessed = ?
|
|
75
|
-
WHERE key = ?
|
|
76
|
-
RETURNING *
|
|
73
|
+
this.recallStmt = this.db.prepare(`
|
|
74
|
+
UPDATE memories SET lastAccessed = ?
|
|
75
|
+
WHERE key = ?
|
|
76
|
+
RETURNING *
|
|
77
77
|
`);
|
|
78
78
|
}
|
|
79
79
|
catch {
|
|
@@ -82,9 +82,9 @@ export class MemoryStorage {
|
|
|
82
82
|
this.recallSelectStmt = this.db.prepare(`SELECT * FROM memories WHERE key = ?`);
|
|
83
83
|
this.recallUpdateStmt = this.db.prepare(`UPDATE memories SET lastAccessed = ? WHERE key = ?`);
|
|
84
84
|
}
|
|
85
|
-
this.saveStmt = this.db.prepare(`
|
|
86
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
87
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
85
|
+
this.saveStmt = this.db.prepare(`
|
|
86
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
88
88
|
`);
|
|
89
89
|
}
|
|
90
90
|
migrateFromJSON() {
|
|
@@ -96,9 +96,9 @@ export class MemoryStorage {
|
|
|
96
96
|
const memories = JSON.parse(jsonData);
|
|
97
97
|
if (memories.length === 0)
|
|
98
98
|
return;
|
|
99
|
-
const insert = this.db.prepare(`
|
|
100
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
101
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
99
|
+
const insert = this.db.prepare(`
|
|
100
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
101
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
102
102
|
`);
|
|
103
103
|
const insertMany = this.db.transaction((items) => {
|
|
104
104
|
for (const item of items) {
|
|
@@ -121,9 +121,9 @@ export class MemoryStorage {
|
|
|
121
121
|
this.saveStmt.run(key, value, category, timestamp, timestamp, priority);
|
|
122
122
|
}
|
|
123
123
|
else {
|
|
124
|
-
const stmt = this.db.prepare(`
|
|
125
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
126
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
124
|
+
const stmt = this.db.prepare(`
|
|
125
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
126
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
127
127
|
`);
|
|
128
128
|
stmt.run(key, value, category, timestamp, timestamp, priority);
|
|
129
129
|
}
|
|
@@ -161,10 +161,10 @@ export class MemoryStorage {
|
|
|
161
161
|
*/
|
|
162
162
|
update(key, value) {
|
|
163
163
|
const timestamp = new Date().toISOString();
|
|
164
|
-
const stmt = this.db.prepare(`
|
|
165
|
-
UPDATE memories
|
|
166
|
-
SET value = ?, timestamp = ?, lastAccessed = ?
|
|
167
|
-
WHERE key = ?
|
|
164
|
+
const stmt = this.db.prepare(`
|
|
165
|
+
UPDATE memories
|
|
166
|
+
SET value = ?, timestamp = ?, lastAccessed = ?
|
|
167
|
+
WHERE key = ?
|
|
168
168
|
`);
|
|
169
169
|
const result = stmt.run(value, timestamp, timestamp, key);
|
|
170
170
|
return result.changes > 0;
|
|
@@ -174,16 +174,16 @@ export class MemoryStorage {
|
|
|
174
174
|
*/
|
|
175
175
|
list(category) {
|
|
176
176
|
if (category) {
|
|
177
|
-
const stmt = this.db.prepare(`
|
|
178
|
-
SELECT * FROM memories WHERE category = ?
|
|
179
|
-
ORDER BY priority DESC, timestamp DESC
|
|
177
|
+
const stmt = this.db.prepare(`
|
|
178
|
+
SELECT * FROM memories WHERE category = ?
|
|
179
|
+
ORDER BY priority DESC, timestamp DESC
|
|
180
180
|
`);
|
|
181
181
|
return stmt.all(category);
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
const stmt = this.db.prepare(`
|
|
185
|
-
SELECT * FROM memories
|
|
186
|
-
ORDER BY priority DESC, timestamp DESC
|
|
184
|
+
const stmt = this.db.prepare(`
|
|
185
|
+
SELECT * FROM memories
|
|
186
|
+
ORDER BY priority DESC, timestamp DESC
|
|
187
187
|
`);
|
|
188
188
|
return stmt.all();
|
|
189
189
|
}
|
|
@@ -192,10 +192,10 @@ export class MemoryStorage {
|
|
|
192
192
|
* Search memories by keyword
|
|
193
193
|
*/
|
|
194
194
|
search(query) {
|
|
195
|
-
const stmt = this.db.prepare(`
|
|
196
|
-
SELECT * FROM memories
|
|
197
|
-
WHERE key LIKE ? OR value LIKE ?
|
|
198
|
-
ORDER BY priority DESC, timestamp DESC
|
|
195
|
+
const stmt = this.db.prepare(`
|
|
196
|
+
SELECT * FROM memories
|
|
197
|
+
WHERE key LIKE ? OR value LIKE ?
|
|
198
|
+
ORDER BY priority DESC, timestamp DESC
|
|
199
199
|
`);
|
|
200
200
|
const pattern = `%${query}%`;
|
|
201
201
|
return stmt.all(pattern, pattern);
|
|
@@ -204,10 +204,10 @@ export class MemoryStorage {
|
|
|
204
204
|
* Get memories by priority level
|
|
205
205
|
*/
|
|
206
206
|
getByPriority(priority) {
|
|
207
|
-
const stmt = this.db.prepare(`
|
|
208
|
-
SELECT * FROM memories
|
|
209
|
-
WHERE priority = ?
|
|
210
|
-
ORDER BY timestamp DESC
|
|
207
|
+
const stmt = this.db.prepare(`
|
|
208
|
+
SELECT * FROM memories
|
|
209
|
+
WHERE priority = ?
|
|
210
|
+
ORDER BY timestamp DESC
|
|
211
211
|
`);
|
|
212
212
|
return stmt.all(priority);
|
|
213
213
|
}
|
|
@@ -223,10 +223,10 @@ export class MemoryStorage {
|
|
|
223
223
|
* Get memory statistics
|
|
224
224
|
*/
|
|
225
225
|
getStats() {
|
|
226
|
-
const categories = this.db.prepare(`
|
|
227
|
-
SELECT category, COUNT(*) as count
|
|
228
|
-
FROM memories
|
|
229
|
-
GROUP BY category
|
|
226
|
+
const categories = this.db.prepare(`
|
|
227
|
+
SELECT category, COUNT(*) as count
|
|
228
|
+
FROM memories
|
|
229
|
+
GROUP BY category
|
|
230
230
|
`).all();
|
|
231
231
|
const byCategory = {};
|
|
232
232
|
let total = 0;
|
|
@@ -152,18 +152,18 @@ export class AgentManager {
|
|
|
152
152
|
* 리뷰 프롬프트 생성
|
|
153
153
|
*/
|
|
154
154
|
buildReviewPrompt(agent, filePaths) {
|
|
155
|
-
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
156
|
-
|
|
157
|
-
Files to review:
|
|
158
|
-
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
159
|
-
|
|
160
|
-
${agent.content}
|
|
161
|
-
|
|
162
|
-
Provide findings in this format:
|
|
163
|
-
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
164
|
-
- Category: Your specialty area
|
|
165
|
-
- Location: file:line
|
|
166
|
-
- Issue: Description
|
|
155
|
+
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
156
|
+
|
|
157
|
+
Files to review:
|
|
158
|
+
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
159
|
+
|
|
160
|
+
${agent.content}
|
|
161
|
+
|
|
162
|
+
Provide findings in this format:
|
|
163
|
+
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
164
|
+
- Category: Your specialty area
|
|
165
|
+
- Location: file:line
|
|
166
|
+
- Issue: Description
|
|
167
167
|
- Fix: Recommendation`;
|
|
168
168
|
}
|
|
169
169
|
/**
|