@su-record/vibe 2.0.0 → 2.0.2
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/.claude/agents/explorer.md +48 -48
- package/.claude/agents/implementer.md +53 -53
- package/.claude/agents/searcher.md +54 -54
- package/.claude/agents/simplifier.md +119 -119
- package/.claude/agents/tester.md +49 -49
- package/.claude/commands/vibe.analyze.md +239 -239
- package/.claude/commands/vibe.continue.md +88 -88
- package/.claude/commands/vibe.diagram.md +178 -178
- package/.claude/commands/vibe.reason.md +306 -306
- package/.claude/commands/vibe.run.md +760 -760
- package/.claude/commands/vibe.spec.md +339 -339
- package/.claude/commands/vibe.tool.md +153 -153
- package/.claude/commands/vibe.ui.md +137 -137
- package/.claude/commands/vibe.verify.md +238 -238
- package/.claude/settings.json +152 -152
- package/.claude/settings.local.json +4 -57
- package/.vibe/config.json +9 -0
- package/.vibe/constitution.md +184 -184
- package/.vibe/rules/core/communication-guide.md +104 -104
- package/.vibe/rules/core/development-philosophy.md +52 -52
- package/.vibe/rules/core/quick-start.md +120 -120
- package/.vibe/rules/quality/bdd-contract-testing.md +388 -388
- package/.vibe/rules/quality/checklist.md +276 -276
- package/.vibe/rules/quality/testing-strategy.md +437 -437
- package/.vibe/rules/standards/anti-patterns.md +369 -369
- package/.vibe/rules/standards/code-structure.md +291 -291
- package/.vibe/rules/standards/complexity-metrics.md +312 -312
- package/.vibe/rules/standards/naming-conventions.md +198 -198
- package/.vibe/rules/tools/mcp-hi-ai-guide.md +665 -665
- package/.vibe/rules/tools/mcp-workflow.md +51 -51
- package/.vibe/setup.sh +31 -31
- package/CLAUDE.md +122 -122
- package/LICENSE +21 -21
- package/README.md +568 -568
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +391 -406
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/MemoryManager.js +92 -92
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/gemini-mcp.js +15 -15
- package/dist/lib/gemini-oauth.d.ts.map +1 -1
- package/dist/lib/gemini-oauth.js +41 -38
- package/dist/lib/gemini-oauth.js.map +1 -1
- package/dist/lib/gpt-mcp.js +17 -17
- package/dist/lib/gpt-oauth.d.ts.map +1 -1
- package/dist/lib/gpt-oauth.js +50 -45
- package/dist/lib/gpt-oauth.js.map +1 -1
- package/dist/tools/analytics/getUsageAnalytics.js +12 -12
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
- package/dist/tools/planning/generatePrd.js +46 -46
- package/dist/tools/prompt/enhancePromptGemini.js +160 -160
- package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/package.json +67 -67
- package/templates/constitution-template.md +184 -184
- package/templates/contract-backend-template.md +517 -517
- package/templates/contract-frontend-template.md +594 -594
- package/templates/feature-template.md +96 -96
- package/templates/hooks-template.json +103 -103
- package/templates/spec-template.md +199 -199
- package/dist/lib/vibe-mcp.d.ts.map +0 -1
- package/dist/lib/vibe-mcp.js.map +0 -1
package/dist/lib/PythonParser.js
CHANGED
|
@@ -35,114 +35,114 @@ function getPythonCommand() {
|
|
|
35
35
|
const PYTHON_CMD = getPythonCommand();
|
|
36
36
|
export class PythonParser {
|
|
37
37
|
static cleanupRegistered = false;
|
|
38
|
-
static pythonScript = `
|
|
39
|
-
import ast
|
|
40
|
-
import sys
|
|
41
|
-
import json
|
|
42
|
-
|
|
43
|
-
def analyze_code(code):
|
|
44
|
-
try:
|
|
45
|
-
tree = ast.parse(code)
|
|
46
|
-
symbols = []
|
|
47
|
-
|
|
48
|
-
for node in ast.walk(tree):
|
|
49
|
-
if isinstance(node, ast.FunctionDef):
|
|
50
|
-
symbols.append({
|
|
51
|
-
'name': node.name,
|
|
52
|
-
'kind': 'function',
|
|
53
|
-
'line': node.lineno,
|
|
54
|
-
'column': node.col_offset,
|
|
55
|
-
'endLine': node.end_lineno,
|
|
56
|
-
'docstring': ast.get_docstring(node)
|
|
57
|
-
})
|
|
58
|
-
elif isinstance(node, ast.ClassDef):
|
|
59
|
-
symbols.append({
|
|
60
|
-
'name': node.name,
|
|
61
|
-
'kind': 'class',
|
|
62
|
-
'line': node.lineno,
|
|
63
|
-
'column': node.col_offset,
|
|
64
|
-
'endLine': node.end_lineno,
|
|
65
|
-
'docstring': ast.get_docstring(node)
|
|
66
|
-
})
|
|
67
|
-
elif isinstance(node, ast.Assign):
|
|
68
|
-
for target in node.targets:
|
|
69
|
-
if isinstance(target, ast.Name):
|
|
70
|
-
symbols.append({
|
|
71
|
-
'name': target.id,
|
|
72
|
-
'kind': 'variable',
|
|
73
|
-
'line': node.lineno,
|
|
74
|
-
'column': node.col_offset
|
|
75
|
-
})
|
|
76
|
-
elif isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
|
|
77
|
-
for alias in node.names:
|
|
78
|
-
symbols.append({
|
|
79
|
-
'name': alias.name,
|
|
80
|
-
'kind': 'import',
|
|
81
|
-
'line': node.lineno,
|
|
82
|
-
'column': node.col_offset
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
return {'success': True, 'symbols': symbols}
|
|
86
|
-
except SyntaxError as e:
|
|
87
|
-
return {'success': False, 'error': str(e)}
|
|
88
|
-
except Exception as e:
|
|
89
|
-
return {'success': False, 'error': str(e)}
|
|
90
|
-
|
|
91
|
-
def calculate_complexity(code):
|
|
92
|
-
try:
|
|
93
|
-
tree = ast.parse(code)
|
|
94
|
-
|
|
95
|
-
def cyclomatic_complexity(node):
|
|
96
|
-
complexity = 1
|
|
97
|
-
for child in ast.walk(node):
|
|
98
|
-
if isinstance(child, (ast.If, ast.For, ast.While, ast.And, ast.Or, ast.ExceptHandler)):
|
|
99
|
-
complexity += 1
|
|
100
|
-
elif isinstance(child, ast.BoolOp):
|
|
101
|
-
complexity += len(child.values) - 1
|
|
102
|
-
return complexity
|
|
103
|
-
|
|
104
|
-
functions = []
|
|
105
|
-
classes = []
|
|
106
|
-
total_complexity = 1
|
|
107
|
-
|
|
108
|
-
for node in ast.walk(tree):
|
|
109
|
-
if isinstance(node, ast.FunctionDef):
|
|
110
|
-
func_complexity = cyclomatic_complexity(node)
|
|
111
|
-
functions.append({
|
|
112
|
-
'name': node.name,
|
|
113
|
-
'complexity': func_complexity,
|
|
114
|
-
'line': node.lineno
|
|
115
|
-
})
|
|
116
|
-
total_complexity += func_complexity
|
|
117
|
-
elif isinstance(node, ast.ClassDef):
|
|
118
|
-
method_count = sum(1 for n in node.body if isinstance(n, ast.FunctionDef))
|
|
119
|
-
classes.append({
|
|
120
|
-
'name': node.name,
|
|
121
|
-
'methods': method_count,
|
|
122
|
-
'line': node.lineno
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
'success': True,
|
|
127
|
-
'cyclomaticComplexity': total_complexity,
|
|
128
|
-
'functions': functions,
|
|
129
|
-
'classes': classes
|
|
130
|
-
}
|
|
131
|
-
except Exception as e:
|
|
132
|
-
return {'success': False, 'error': str(e)}
|
|
133
|
-
|
|
134
|
-
if __name__ == '__main__':
|
|
135
|
-
code = sys.stdin.read()
|
|
136
|
-
action = sys.argv[1] if len(sys.argv) > 1 else 'symbols'
|
|
137
|
-
|
|
138
|
-
if action == 'symbols':
|
|
139
|
-
result = analyze_code(code)
|
|
140
|
-
elif action == 'complexity':
|
|
141
|
-
result = calculate_complexity(code)
|
|
142
|
-
else:
|
|
143
|
-
result = {'success': False, 'error': 'Unknown action'}
|
|
144
|
-
|
|
145
|
-
print(json.dumps(result))
|
|
38
|
+
static pythonScript = `
|
|
39
|
+
import ast
|
|
40
|
+
import sys
|
|
41
|
+
import json
|
|
42
|
+
|
|
43
|
+
def analyze_code(code):
|
|
44
|
+
try:
|
|
45
|
+
tree = ast.parse(code)
|
|
46
|
+
symbols = []
|
|
47
|
+
|
|
48
|
+
for node in ast.walk(tree):
|
|
49
|
+
if isinstance(node, ast.FunctionDef):
|
|
50
|
+
symbols.append({
|
|
51
|
+
'name': node.name,
|
|
52
|
+
'kind': 'function',
|
|
53
|
+
'line': node.lineno,
|
|
54
|
+
'column': node.col_offset,
|
|
55
|
+
'endLine': node.end_lineno,
|
|
56
|
+
'docstring': ast.get_docstring(node)
|
|
57
|
+
})
|
|
58
|
+
elif isinstance(node, ast.ClassDef):
|
|
59
|
+
symbols.append({
|
|
60
|
+
'name': node.name,
|
|
61
|
+
'kind': 'class',
|
|
62
|
+
'line': node.lineno,
|
|
63
|
+
'column': node.col_offset,
|
|
64
|
+
'endLine': node.end_lineno,
|
|
65
|
+
'docstring': ast.get_docstring(node)
|
|
66
|
+
})
|
|
67
|
+
elif isinstance(node, ast.Assign):
|
|
68
|
+
for target in node.targets:
|
|
69
|
+
if isinstance(target, ast.Name):
|
|
70
|
+
symbols.append({
|
|
71
|
+
'name': target.id,
|
|
72
|
+
'kind': 'variable',
|
|
73
|
+
'line': node.lineno,
|
|
74
|
+
'column': node.col_offset
|
|
75
|
+
})
|
|
76
|
+
elif isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
|
|
77
|
+
for alias in node.names:
|
|
78
|
+
symbols.append({
|
|
79
|
+
'name': alias.name,
|
|
80
|
+
'kind': 'import',
|
|
81
|
+
'line': node.lineno,
|
|
82
|
+
'column': node.col_offset
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
return {'success': True, 'symbols': symbols}
|
|
86
|
+
except SyntaxError as e:
|
|
87
|
+
return {'success': False, 'error': str(e)}
|
|
88
|
+
except Exception as e:
|
|
89
|
+
return {'success': False, 'error': str(e)}
|
|
90
|
+
|
|
91
|
+
def calculate_complexity(code):
|
|
92
|
+
try:
|
|
93
|
+
tree = ast.parse(code)
|
|
94
|
+
|
|
95
|
+
def cyclomatic_complexity(node):
|
|
96
|
+
complexity = 1
|
|
97
|
+
for child in ast.walk(node):
|
|
98
|
+
if isinstance(child, (ast.If, ast.For, ast.While, ast.And, ast.Or, ast.ExceptHandler)):
|
|
99
|
+
complexity += 1
|
|
100
|
+
elif isinstance(child, ast.BoolOp):
|
|
101
|
+
complexity += len(child.values) - 1
|
|
102
|
+
return complexity
|
|
103
|
+
|
|
104
|
+
functions = []
|
|
105
|
+
classes = []
|
|
106
|
+
total_complexity = 1
|
|
107
|
+
|
|
108
|
+
for node in ast.walk(tree):
|
|
109
|
+
if isinstance(node, ast.FunctionDef):
|
|
110
|
+
func_complexity = cyclomatic_complexity(node)
|
|
111
|
+
functions.append({
|
|
112
|
+
'name': node.name,
|
|
113
|
+
'complexity': func_complexity,
|
|
114
|
+
'line': node.lineno
|
|
115
|
+
})
|
|
116
|
+
total_complexity += func_complexity
|
|
117
|
+
elif isinstance(node, ast.ClassDef):
|
|
118
|
+
method_count = sum(1 for n in node.body if isinstance(n, ast.FunctionDef))
|
|
119
|
+
classes.append({
|
|
120
|
+
'name': node.name,
|
|
121
|
+
'methods': method_count,
|
|
122
|
+
'line': node.lineno
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
'success': True,
|
|
127
|
+
'cyclomaticComplexity': total_complexity,
|
|
128
|
+
'functions': functions,
|
|
129
|
+
'classes': classes
|
|
130
|
+
}
|
|
131
|
+
except Exception as e:
|
|
132
|
+
return {'success': False, 'error': str(e)}
|
|
133
|
+
|
|
134
|
+
if __name__ == '__main__':
|
|
135
|
+
code = sys.stdin.read()
|
|
136
|
+
action = sys.argv[1] if len(sys.argv) > 1 else 'symbols'
|
|
137
|
+
|
|
138
|
+
if action == 'symbols':
|
|
139
|
+
result = analyze_code(code)
|
|
140
|
+
elif action == 'complexity':
|
|
141
|
+
result = calculate_complexity(code)
|
|
142
|
+
else:
|
|
143
|
+
result = {'success': False, 'error': 'Unknown action'}
|
|
144
|
+
|
|
145
|
+
print(json.dumps(result))
|
|
146
146
|
`;
|
|
147
147
|
// Singleton Python script path to avoid recreating it
|
|
148
148
|
static scriptPath = null;
|
package/dist/lib/gemini-mcp.js
CHANGED
|
@@ -161,12 +161,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
161
161
|
}
|
|
162
162
|
case 'gemini_analyze_code': {
|
|
163
163
|
const { code, language, focus } = args;
|
|
164
|
-
const sysPrompt = `You are an expert code reviewer. Analyze the given ${language || 'code'} and provide detailed feedback focusing on: ${focus || 'all aspects including performance, security, readability, and best practices'}.
|
|
165
|
-
|
|
166
|
-
Respond in Korean and provide:
|
|
167
|
-
1. 코드 요약
|
|
168
|
-
2. 주요 이슈 (있다면)
|
|
169
|
-
3. 개선 제안
|
|
164
|
+
const sysPrompt = `You are an expert code reviewer. Analyze the given ${language || 'code'} and provide detailed feedback focusing on: ${focus || 'all aspects including performance, security, readability, and best practices'}.
|
|
165
|
+
|
|
166
|
+
Respond in Korean and provide:
|
|
167
|
+
1. 코드 요약
|
|
168
|
+
2. 주요 이슈 (있다면)
|
|
169
|
+
3. 개선 제안
|
|
170
170
|
4. 전체 품질 점수 (1-10)`;
|
|
171
171
|
const result = await geminiApi.chat({
|
|
172
172
|
model: 'gemini-2.5-flash',
|
|
@@ -186,15 +186,15 @@ Respond in Korean and provide:
|
|
|
186
186
|
}
|
|
187
187
|
case 'gemini_review_ui': {
|
|
188
188
|
const { description, context } = args;
|
|
189
|
-
const sysPrompt = `You are a UI/UX expert. Review the given UI description and provide detailed feedback.
|
|
190
|
-
|
|
191
|
-
${context ? `Project context: ${context}` : ''}
|
|
192
|
-
|
|
193
|
-
Respond in Korean and provide:
|
|
194
|
-
1. UI 구조 평가
|
|
195
|
-
2. UX 개선점
|
|
196
|
-
3. 접근성 체크
|
|
197
|
-
4. 모범 사례 비교
|
|
189
|
+
const sysPrompt = `You are a UI/UX expert. Review the given UI description and provide detailed feedback.
|
|
190
|
+
|
|
191
|
+
${context ? `Project context: ${context}` : ''}
|
|
192
|
+
|
|
193
|
+
Respond in Korean and provide:
|
|
194
|
+
1. UI 구조 평가
|
|
195
|
+
2. UX 개선점
|
|
196
|
+
3. 접근성 체크
|
|
197
|
+
4. 모범 사례 비교
|
|
198
198
|
5. 구체적인 개선 제안`;
|
|
199
199
|
const result = await geminiApi.chat({
|
|
200
200
|
model: 'gemini-2.5-flash',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/gemini-oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0CD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,MAAW,GAAG,sBAAsB,CAmBrF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoDnG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCzE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"gemini-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/gemini-oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0CD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,MAAW,GAAG,sBAAsB,CAmBrF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoDnG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCzE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA6J3D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAwBrE"}
|
package/dist/lib/gemini-oauth.js
CHANGED
|
@@ -192,12 +192,15 @@ export function startOAuthFlow() {
|
|
|
192
192
|
timeoutId = null;
|
|
193
193
|
}
|
|
194
194
|
if (server) {
|
|
195
|
-
|
|
196
|
-
// 서버 완전히 종료 후 프로세스 종료 허용
|
|
197
|
-
});
|
|
195
|
+
// closeAllConnections 먼저 호출하여 활성 연결 종료
|
|
198
196
|
if ('closeAllConnections' in server) {
|
|
199
197
|
server.closeAllConnections();
|
|
200
198
|
}
|
|
199
|
+
// 약간의 지연 후 서버 종료 (libuv 핸들 충돌 방지)
|
|
200
|
+
setImmediate(() => {
|
|
201
|
+
server?.close(() => { });
|
|
202
|
+
server = null;
|
|
203
|
+
});
|
|
201
204
|
}
|
|
202
205
|
};
|
|
203
206
|
// 콜백 서버 시작
|
|
@@ -209,15 +212,15 @@ export function startOAuthFlow() {
|
|
|
209
212
|
const error = url.searchParams.get('error');
|
|
210
213
|
if (error) {
|
|
211
214
|
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
212
|
-
res.end(`
|
|
213
|
-
<html>
|
|
214
|
-
<head><title>인증 실패</title></head>
|
|
215
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
216
|
-
<h1>인증 실패</h1>
|
|
217
|
-
<p>오류: ${error}</p>
|
|
218
|
-
<p>이 창을 닫고 다시 시도해주세요.</p>
|
|
219
|
-
</body>
|
|
220
|
-
</html>
|
|
215
|
+
res.end(`
|
|
216
|
+
<html>
|
|
217
|
+
<head><title>인증 실패</title></head>
|
|
218
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
219
|
+
<h1>인증 실패</h1>
|
|
220
|
+
<p>오류: ${error}</p>
|
|
221
|
+
<p>이 창을 닫고 다시 시도해주세요.</p>
|
|
222
|
+
</body>
|
|
223
|
+
</html>
|
|
221
224
|
`);
|
|
222
225
|
if (!isResolved) {
|
|
223
226
|
isResolved = true;
|
|
@@ -228,14 +231,14 @@ export function startOAuthFlow() {
|
|
|
228
231
|
}
|
|
229
232
|
if (!code || !state) {
|
|
230
233
|
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
231
|
-
res.end(`
|
|
232
|
-
<html>
|
|
233
|
-
<head><title>인증 실패</title></head>
|
|
234
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
235
|
-
<h1>인증 실패</h1>
|
|
236
|
-
<p>필수 파라미터가 없습니다.</p>
|
|
237
|
-
</body>
|
|
238
|
-
</html>
|
|
234
|
+
res.end(`
|
|
235
|
+
<html>
|
|
236
|
+
<head><title>인증 실패</title></head>
|
|
237
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
238
|
+
<h1>인증 실패</h1>
|
|
239
|
+
<p>필수 파라미터가 없습니다.</p>
|
|
240
|
+
</body>
|
|
241
|
+
</html>
|
|
239
242
|
`);
|
|
240
243
|
if (!isResolved) {
|
|
241
244
|
isResolved = true;
|
|
@@ -247,16 +250,16 @@ export function startOAuthFlow() {
|
|
|
247
250
|
try {
|
|
248
251
|
const tokens = await exchangeCodeForTokens(code, state);
|
|
249
252
|
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
250
|
-
res.end(`
|
|
251
|
-
<html>
|
|
252
|
-
<head><title>인증 성공</title></head>
|
|
253
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
254
|
-
<h1>인증 성공!</h1>
|
|
255
|
-
<p>${tokens.email}로 로그인되었습니다.</p>
|
|
256
|
-
<p>이 창을 닫아도 됩니다.</p>
|
|
257
|
-
<script>setTimeout(() => window.close(), 2000);</script>
|
|
258
|
-
</body>
|
|
259
|
-
</html>
|
|
253
|
+
res.end(`
|
|
254
|
+
<html>
|
|
255
|
+
<head><title>인증 성공</title></head>
|
|
256
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
257
|
+
<h1>인증 성공!</h1>
|
|
258
|
+
<p>${tokens.email}로 로그인되었습니다.</p>
|
|
259
|
+
<p>이 창을 닫아도 됩니다.</p>
|
|
260
|
+
<script>setTimeout(() => window.close(), 2000);</script>
|
|
261
|
+
</body>
|
|
262
|
+
</html>
|
|
260
263
|
`);
|
|
261
264
|
if (!isResolved) {
|
|
262
265
|
isResolved = true;
|
|
@@ -266,14 +269,14 @@ export function startOAuthFlow() {
|
|
|
266
269
|
}
|
|
267
270
|
catch (err) {
|
|
268
271
|
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
269
|
-
res.end(`
|
|
270
|
-
<html>
|
|
271
|
-
<head><title>인증 실패</title></head>
|
|
272
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
273
|
-
<h1>인증 실패</h1>
|
|
274
|
-
<p>${err.message}</p>
|
|
275
|
-
</body>
|
|
276
|
-
</html>
|
|
272
|
+
res.end(`
|
|
273
|
+
<html>
|
|
274
|
+
<head><title>인증 실패</title></head>
|
|
275
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
276
|
+
<h1>인증 실패</h1>
|
|
277
|
+
<p>${err.message}</p>
|
|
278
|
+
</body>
|
|
279
|
+
</html>
|
|
277
280
|
`);
|
|
278
281
|
if (!isResolved) {
|
|
279
282
|
isResolved = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-oauth.js","sourceRoot":"","sources":["../../src/lib/gemini-oauth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gemini-oauth.js","sourceRoot":"","sources":["../../src/lib/gemini-oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/gpt-mcp.js
CHANGED
|
@@ -159,15 +159,15 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
159
159
|
}
|
|
160
160
|
case 'gpt_analyze_architecture': {
|
|
161
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. 개선 제안
|
|
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
171
|
5. 확장성 평가`;
|
|
172
172
|
const result = await gptApi.chat({
|
|
173
173
|
model: 'gpt-5.2',
|
|
@@ -187,14 +187,14 @@ Respond in Korean and provide:
|
|
|
187
187
|
}
|
|
188
188
|
case 'gpt_debug': {
|
|
189
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. 수정된 코드
|
|
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
198
|
4. 예방 방법`;
|
|
199
199
|
const result = await gptApi.chat({
|
|
200
200
|
model: 'gpt-5.2-codex',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/gpt-oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB7D;AASD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,sBAAsB,CAsB/D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwChG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"gpt-oauth.d.ts","sourceRoot":"","sources":["../../src/lib/gpt-oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,UAAU,sBAAsB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB7D;AASD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,sBAAsB,CAsB/D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwChG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAoLrD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA6BrE"}
|
package/dist/lib/gpt-oauth.js
CHANGED
|
@@ -180,10 +180,15 @@ export function startOAuthFlow() {
|
|
|
180
180
|
timeoutId = null;
|
|
181
181
|
}
|
|
182
182
|
if (server) {
|
|
183
|
-
|
|
183
|
+
// closeAllConnections 먼저 호출하여 활성 연결 종료
|
|
184
184
|
if ('closeAllConnections' in server) {
|
|
185
185
|
server.closeAllConnections();
|
|
186
186
|
}
|
|
187
|
+
// 약간의 지연 후 서버 종료 (libuv 핸들 충돌 방지)
|
|
188
|
+
setImmediate(() => {
|
|
189
|
+
server?.close(() => { });
|
|
190
|
+
server = null;
|
|
191
|
+
});
|
|
187
192
|
}
|
|
188
193
|
};
|
|
189
194
|
// 콜백 서버 시작 (포트 1455 - Codex CLI와 동일)
|
|
@@ -196,16 +201,16 @@ export function startOAuthFlow() {
|
|
|
196
201
|
const errorDescription = url.searchParams.get('error_description');
|
|
197
202
|
if (error) {
|
|
198
203
|
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
199
|
-
res.end(`
|
|
200
|
-
<html>
|
|
201
|
-
<head><title>인증 실패</title></head>
|
|
202
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
203
|
-
<h1>인증 실패</h1>
|
|
204
|
-
<p>오류: ${error}</p>
|
|
205
|
-
<p>${errorDescription || ''}</p>
|
|
206
|
-
<p>이 창을 닫고 다시 시도해주세요.</p>
|
|
207
|
-
</body>
|
|
208
|
-
</html>
|
|
204
|
+
res.end(`
|
|
205
|
+
<html>
|
|
206
|
+
<head><title>인증 실패</title></head>
|
|
207
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
208
|
+
<h1>인증 실패</h1>
|
|
209
|
+
<p>오류: ${error}</p>
|
|
210
|
+
<p>${errorDescription || ''}</p>
|
|
211
|
+
<p>이 창을 닫고 다시 시도해주세요.</p>
|
|
212
|
+
</body>
|
|
213
|
+
</html>
|
|
209
214
|
`);
|
|
210
215
|
if (!isResolved) {
|
|
211
216
|
isResolved = true;
|
|
@@ -217,14 +222,14 @@ export function startOAuthFlow() {
|
|
|
217
222
|
// state 검증
|
|
218
223
|
if (state !== auth.state) {
|
|
219
224
|
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
220
|
-
res.end(`
|
|
221
|
-
<html>
|
|
222
|
-
<head><title>인증 실패</title></head>
|
|
223
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
224
|
-
<h1>인증 실패</h1>
|
|
225
|
-
<p>State 불일치 - CSRF 공격 가능성</p>
|
|
226
|
-
</body>
|
|
227
|
-
</html>
|
|
225
|
+
res.end(`
|
|
226
|
+
<html>
|
|
227
|
+
<head><title>인증 실패</title></head>
|
|
228
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
229
|
+
<h1>인증 실패</h1>
|
|
230
|
+
<p>State 불일치 - CSRF 공격 가능성</p>
|
|
231
|
+
</body>
|
|
232
|
+
</html>
|
|
228
233
|
`);
|
|
229
234
|
if (!isResolved) {
|
|
230
235
|
isResolved = true;
|
|
@@ -235,14 +240,14 @@ export function startOAuthFlow() {
|
|
|
235
240
|
}
|
|
236
241
|
if (!code) {
|
|
237
242
|
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
238
|
-
res.end(`
|
|
239
|
-
<html>
|
|
240
|
-
<head><title>인증 실패</title></head>
|
|
241
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
242
|
-
<h1>인증 실패</h1>
|
|
243
|
-
<p>Authorization code가 없습니다.</p>
|
|
244
|
-
</body>
|
|
245
|
-
</html>
|
|
243
|
+
res.end(`
|
|
244
|
+
<html>
|
|
245
|
+
<head><title>인증 실패</title></head>
|
|
246
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
247
|
+
<h1>인증 실패</h1>
|
|
248
|
+
<p>Authorization code가 없습니다.</p>
|
|
249
|
+
</body>
|
|
250
|
+
</html>
|
|
246
251
|
`);
|
|
247
252
|
if (!isResolved) {
|
|
248
253
|
isResolved = true;
|
|
@@ -254,16 +259,16 @@ export function startOAuthFlow() {
|
|
|
254
259
|
try {
|
|
255
260
|
const tokens = await exchangeCodeForTokens(code, auth.verifier);
|
|
256
261
|
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
257
|
-
res.end(`
|
|
258
|
-
<html>
|
|
259
|
-
<head><title>인증 성공</title></head>
|
|
260
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
261
|
-
<h1>인증 성공!</h1>
|
|
262
|
-
<p>${tokens.email}로 로그인되었습니다.</p>
|
|
263
|
-
<p>이 창을 닫아도 됩니다.</p>
|
|
264
|
-
<script>setTimeout(() => window.close(), 2000);</script>
|
|
265
|
-
</body>
|
|
266
|
-
</html>
|
|
262
|
+
res.end(`
|
|
263
|
+
<html>
|
|
264
|
+
<head><title>인증 성공</title></head>
|
|
265
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
266
|
+
<h1>인증 성공!</h1>
|
|
267
|
+
<p>${tokens.email}로 로그인되었습니다.</p>
|
|
268
|
+
<p>이 창을 닫아도 됩니다.</p>
|
|
269
|
+
<script>setTimeout(() => window.close(), 2000);</script>
|
|
270
|
+
</body>
|
|
271
|
+
</html>
|
|
267
272
|
`);
|
|
268
273
|
if (!isResolved) {
|
|
269
274
|
isResolved = true;
|
|
@@ -273,14 +278,14 @@ export function startOAuthFlow() {
|
|
|
273
278
|
}
|
|
274
279
|
catch (err) {
|
|
275
280
|
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
276
|
-
res.end(`
|
|
277
|
-
<html>
|
|
278
|
-
<head><title>인증 실패</title></head>
|
|
279
|
-
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
280
|
-
<h1>인증 실패</h1>
|
|
281
|
-
<p>${err.message}</p>
|
|
282
|
-
</body>
|
|
283
|
-
</html>
|
|
281
|
+
res.end(`
|
|
282
|
+
<html>
|
|
283
|
+
<head><title>인증 실패</title></head>
|
|
284
|
+
<body style="font-family: sans-serif; text-align: center; padding-top: 50px;">
|
|
285
|
+
<h1>인증 실패</h1>
|
|
286
|
+
<p>${err.message}</p>
|
|
287
|
+
</body>
|
|
288
|
+
</html>
|
|
284
289
|
`);
|
|
285
290
|
if (!isResolved) {
|
|
286
291
|
isResolved = true;
|