@su-record/vibe 0.1.2 → 0.1.4
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/README.md +13 -6
- package/bin/vibe +20 -2
- package/package.json +5 -6
- package/scripts/install-mcp.js +31 -5
- package/mcp/dist/__tests__/complexity.test.js +0 -126
- package/mcp/dist/__tests__/memory.test.js +0 -120
- package/mcp/dist/__tests__/python-dart-complexity.test.js +0 -146
- package/mcp/dist/index.js +0 -230
- package/mcp/dist/lib/ContextCompressor.js +0 -305
- package/mcp/dist/lib/MemoryManager.js +0 -334
- package/mcp/dist/lib/ProjectCache.js +0 -126
- package/mcp/dist/lib/PythonParser.js +0 -241
- package/mcp/dist/tools/browser/browserPool.js +0 -76
- package/mcp/dist/tools/browser/browserUtils.js +0 -135
- package/mcp/dist/tools/browser/inspectNetworkRequests.js +0 -140
- package/mcp/dist/tools/browser/monitorConsoleLogs.js +0 -97
- package/mcp/dist/tools/convention/analyzeComplexity.js +0 -248
- package/mcp/dist/tools/convention/applyQualityRules.js +0 -102
- package/mcp/dist/tools/convention/checkCouplingCohesion.js +0 -233
- package/mcp/dist/tools/convention/complexityMetrics.js +0 -133
- package/mcp/dist/tools/convention/dartComplexity.js +0 -117
- package/mcp/dist/tools/convention/getCodingGuide.js +0 -64
- package/mcp/dist/tools/convention/languageDetector.js +0 -50
- package/mcp/dist/tools/convention/pythonComplexity.js +0 -109
- package/mcp/dist/tools/convention/suggestImprovements.js +0 -257
- package/mcp/dist/tools/convention/validateCodeQuality.js +0 -177
- package/mcp/dist/tools/memory/autoSaveContext.js +0 -79
- package/mcp/dist/tools/memory/database.js +0 -123
- package/mcp/dist/tools/memory/deleteMemory.js +0 -39
- package/mcp/dist/tools/memory/listMemories.js +0 -38
- package/mcp/dist/tools/memory/memoryConfig.js +0 -27
- package/mcp/dist/tools/memory/memorySQLite.js +0 -138
- package/mcp/dist/tools/memory/memoryUtils.js +0 -34
- package/mcp/dist/tools/memory/migrate.js +0 -113
- package/mcp/dist/tools/memory/prioritizeMemory.js +0 -109
- package/mcp/dist/tools/memory/recallMemory.js +0 -40
- package/mcp/dist/tools/memory/restoreSessionContext.js +0 -69
- package/mcp/dist/tools/memory/saveMemory.js +0 -34
- package/mcp/dist/tools/memory/searchMemories.js +0 -37
- package/mcp/dist/tools/memory/startSession.js +0 -100
- package/mcp/dist/tools/memory/updateMemory.js +0 -46
- package/mcp/dist/tools/planning/analyzeRequirements.js +0 -166
- package/mcp/dist/tools/planning/createUserStories.js +0 -119
- package/mcp/dist/tools/planning/featureRoadmap.js +0 -202
- package/mcp/dist/tools/planning/generatePrd.js +0 -156
- package/mcp/dist/tools/prompt/analyzePrompt.js +0 -145
- package/mcp/dist/tools/prompt/enhancePrompt.js +0 -105
- package/mcp/dist/tools/semantic/findReferences.js +0 -195
- package/mcp/dist/tools/semantic/findSymbol.js +0 -200
- package/mcp/dist/tools/thinking/analyzeProblem.js +0 -50
- package/mcp/dist/tools/thinking/breakDownProblem.js +0 -140
- package/mcp/dist/tools/thinking/createThinkingChain.js +0 -39
- package/mcp/dist/tools/thinking/formatAsPlan.js +0 -73
- package/mcp/dist/tools/thinking/stepByStepAnalysis.js +0 -58
- package/mcp/dist/tools/thinking/thinkAloudProcess.js +0 -75
- package/mcp/dist/tools/time/getCurrentTime.js +0 -61
- package/mcp/dist/tools/ui/previewUiAscii.js +0 -232
- package/mcp/dist/types/tool.js +0 -2
- package/mcp/package.json +0 -53
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// Time utility tool - completely independent
|
|
2
|
-
export const getCurrentTimeDefinition = {
|
|
3
|
-
name: 'get_current_time',
|
|
4
|
-
description: '지금 몇시|현재 시간|몇시야|what time|current time|time now - Get current time',
|
|
5
|
-
inputSchema: {
|
|
6
|
-
type: 'object',
|
|
7
|
-
properties: {
|
|
8
|
-
format: { type: 'string', description: 'Time format', enum: ['iso', 'local', 'utc', 'timestamp', 'human'] },
|
|
9
|
-
timezone: { type: 'string', description: 'Timezone (e.g., America/New_York, Asia/Seoul)' }
|
|
10
|
-
},
|
|
11
|
-
required: []
|
|
12
|
-
},
|
|
13
|
-
annotations: {
|
|
14
|
-
title: 'Get Current Time',
|
|
15
|
-
audience: ['user', 'assistant']
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
export async function getCurrentTime(args) {
|
|
19
|
-
const { format = 'iso', timezone } = args;
|
|
20
|
-
const now = new Date();
|
|
21
|
-
let timeResult;
|
|
22
|
-
switch (format) {
|
|
23
|
-
case 'iso':
|
|
24
|
-
timeResult = now.toISOString();
|
|
25
|
-
break;
|
|
26
|
-
case 'local':
|
|
27
|
-
timeResult = now.toLocaleString();
|
|
28
|
-
break;
|
|
29
|
-
case 'utc':
|
|
30
|
-
timeResult = now.toUTCString();
|
|
31
|
-
break;
|
|
32
|
-
case 'timestamp':
|
|
33
|
-
timeResult = Math.floor(now.getTime() / 1000).toString();
|
|
34
|
-
break;
|
|
35
|
-
case 'human':
|
|
36
|
-
const options = {
|
|
37
|
-
year: 'numeric',
|
|
38
|
-
month: 'long',
|
|
39
|
-
day: 'numeric',
|
|
40
|
-
hour: '2-digit',
|
|
41
|
-
minute: '2-digit',
|
|
42
|
-
second: '2-digit',
|
|
43
|
-
timeZone: timezone
|
|
44
|
-
};
|
|
45
|
-
timeResult = now.toLocaleString('en-US', options);
|
|
46
|
-
break;
|
|
47
|
-
default:
|
|
48
|
-
timeResult = now.toISOString();
|
|
49
|
-
}
|
|
50
|
-
const currentTimeResult = {
|
|
51
|
-
action: 'get_current_time',
|
|
52
|
-
format,
|
|
53
|
-
timezone: timezone || 'local',
|
|
54
|
-
result: timeResult,
|
|
55
|
-
timestamp: now.getTime(),
|
|
56
|
-
status: 'success'
|
|
57
|
-
};
|
|
58
|
-
return {
|
|
59
|
-
content: [{ type: 'text', text: `Time: ${timeResult}\nFormat: ${format}\nTimezone: ${timezone || 'local'}\nTimestamp: ${now.getTime()}` }]
|
|
60
|
-
};
|
|
61
|
-
}
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
// UI Preview tool - ASCII art visualization before development
|
|
2
|
-
export const previewUiAsciiDefinition = {
|
|
3
|
-
name: 'preview_ui_ascii',
|
|
4
|
-
description: 'UI 만들어|페이지 개발|페이지 만들어|컴포넌트 작성|레이아웃|화면 구성|create page|build UI|design component|make page|develop page - Preview UI before coding',
|
|
5
|
-
inputSchema: {
|
|
6
|
-
type: 'object',
|
|
7
|
-
properties: {
|
|
8
|
-
page_name: {
|
|
9
|
-
type: 'string',
|
|
10
|
-
description: 'Name of the page or component (e.g., "Login Page", "Dashboard")'
|
|
11
|
-
},
|
|
12
|
-
layout_type: {
|
|
13
|
-
type: 'string',
|
|
14
|
-
enum: ['sidebar', 'header-footer', 'grid', 'centered', 'split', 'custom'],
|
|
15
|
-
description: 'Layout structure type (default: header-footer)'
|
|
16
|
-
},
|
|
17
|
-
components: {
|
|
18
|
-
type: 'array',
|
|
19
|
-
description: 'List of UI components to include',
|
|
20
|
-
items: {
|
|
21
|
-
type: 'object',
|
|
22
|
-
properties: {
|
|
23
|
-
type: { type: 'string', description: 'Component type (header, sidebar, button, input, card, etc.)' },
|
|
24
|
-
label: { type: 'string', description: 'Component label or text' },
|
|
25
|
-
position: { type: 'string', description: 'Position in layout (top, left, center, right, bottom)' }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
width: {
|
|
30
|
-
type: 'number',
|
|
31
|
-
description: 'Preview width in characters (default: 60)'
|
|
32
|
-
},
|
|
33
|
-
responsive: {
|
|
34
|
-
type: 'boolean',
|
|
35
|
-
description: 'Show mobile view preview (default: false)'
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
required: ['page_name', 'components']
|
|
39
|
-
},
|
|
40
|
-
annotations: {
|
|
41
|
-
title: 'Preview UI (ASCII)',
|
|
42
|
-
audience: ['user', 'assistant']
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
export async function previewUiAscii(args) {
|
|
46
|
-
const { page_name, layout_type = 'header-footer', components, width = 60, responsive = false } = args;
|
|
47
|
-
// ASCII art generation
|
|
48
|
-
const topBorder = '┌' + '─'.repeat(width - 2) + '┐';
|
|
49
|
-
const bottomBorder = '└' + '─'.repeat(width - 2) + '┘';
|
|
50
|
-
const separator = '├' + '─'.repeat(width - 2) + '┤';
|
|
51
|
-
const emptyLine = '│' + ' '.repeat(width - 2) + '│';
|
|
52
|
-
const createLine = (text, align = 'left') => {
|
|
53
|
-
const contentWidth = width - 4;
|
|
54
|
-
let content = text.slice(0, contentWidth);
|
|
55
|
-
if (align === 'center') {
|
|
56
|
-
const padding = Math.floor((contentWidth - content.length) / 2);
|
|
57
|
-
content = ' '.repeat(padding) + content + ' '.repeat(contentWidth - padding - content.length);
|
|
58
|
-
}
|
|
59
|
-
else if (align === 'right') {
|
|
60
|
-
content = ' '.repeat(contentWidth - content.length) + content;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
content = content + ' '.repeat(contentWidth - content.length);
|
|
64
|
-
}
|
|
65
|
-
return '│ ' + content + ' │';
|
|
66
|
-
};
|
|
67
|
-
const createBox = (label, w, h) => {
|
|
68
|
-
const lines = [];
|
|
69
|
-
lines.push('┌' + '─'.repeat(w - 2) + '┐');
|
|
70
|
-
for (let i = 0; i < h - 2; i++) {
|
|
71
|
-
if (i === Math.floor((h - 2) / 2)) {
|
|
72
|
-
const padding = Math.floor((w - 4 - label.length) / 2);
|
|
73
|
-
const text = ' '.repeat(padding) + label + ' '.repeat(w - 4 - padding - label.length);
|
|
74
|
-
lines.push('│ ' + text + ' │');
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
lines.push('│ ' + ' '.repeat(w - 4) + ' │');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
lines.push('└' + '─'.repeat(w - 2) + '┘');
|
|
81
|
-
return lines;
|
|
82
|
-
};
|
|
83
|
-
let preview = [];
|
|
84
|
-
// Generate preview based on layout type
|
|
85
|
-
preview.push(topBorder);
|
|
86
|
-
switch (layout_type) {
|
|
87
|
-
case 'header-footer': {
|
|
88
|
-
// Header
|
|
89
|
-
const header = components.find(c => c.type === 'header' || c.position === 'top');
|
|
90
|
-
if (header) {
|
|
91
|
-
preview.push(createLine(header.label || 'Header', 'left'));
|
|
92
|
-
preview.push(separator);
|
|
93
|
-
}
|
|
94
|
-
// Main content
|
|
95
|
-
const mainComponents = components.filter(c => c.type !== 'header' && c.type !== 'footer' && c.position !== 'top' && c.position !== 'bottom');
|
|
96
|
-
preview.push(emptyLine);
|
|
97
|
-
mainComponents.forEach(comp => {
|
|
98
|
-
const label = comp.label || comp.type.toUpperCase();
|
|
99
|
-
if (comp.type === 'button') {
|
|
100
|
-
preview.push(createLine(` [${label}]`, 'center'));
|
|
101
|
-
}
|
|
102
|
-
else if (comp.type === 'input') {
|
|
103
|
-
preview.push(createLine(` ${label}: [____________]`, 'left'));
|
|
104
|
-
}
|
|
105
|
-
else if (comp.type === 'card') {
|
|
106
|
-
preview.push(createLine(` ┌─ ${label} ─────────────┐`, 'left'));
|
|
107
|
-
preview.push(createLine(` │ Content here... │`, 'left'));
|
|
108
|
-
preview.push(createLine(` └──────────────────────┘`, 'left'));
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
preview.push(createLine(` ${label}`, 'left'));
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
preview.push(emptyLine);
|
|
115
|
-
// Footer
|
|
116
|
-
const footer = components.find(c => c.type === 'footer' || c.position === 'bottom');
|
|
117
|
-
if (footer) {
|
|
118
|
-
preview.push(separator);
|
|
119
|
-
preview.push(createLine(footer.label || 'Footer', 'center'));
|
|
120
|
-
}
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
case 'sidebar': {
|
|
124
|
-
// Header
|
|
125
|
-
const header = components.find(c => c.type === 'header' || c.position === 'top');
|
|
126
|
-
if (header) {
|
|
127
|
-
preview.push(createLine(header.label || 'Header', 'left'));
|
|
128
|
-
preview.push(separator);
|
|
129
|
-
}
|
|
130
|
-
// Sidebar + Content
|
|
131
|
-
const sidebarWidth = Math.floor(width * 0.25);
|
|
132
|
-
const contentWidth = width - sidebarWidth - 5;
|
|
133
|
-
const sidebar = components.find(c => c.type === 'sidebar' || c.position === 'left');
|
|
134
|
-
const mainComponents = components.filter(c => c.type !== 'header' && c.type !== 'footer' && c.type !== 'sidebar' &&
|
|
135
|
-
c.position !== 'top' && c.position !== 'bottom' && c.position !== 'left');
|
|
136
|
-
preview.push('│ ┌' + '─'.repeat(sidebarWidth - 2) + '┐' + ' '.repeat(contentWidth - sidebarWidth + 3) + '│');
|
|
137
|
-
preview.push('│ │' + (sidebar?.label || 'Nav').padEnd(sidebarWidth - 2) + '│ Content Area' + ' '.repeat(contentWidth - 15) + '│');
|
|
138
|
-
const navItems = mainComponents.slice(0, 3);
|
|
139
|
-
navItems.forEach((item, idx) => {
|
|
140
|
-
const navLabel = `${item.label || item.type}`.slice(0, sidebarWidth - 4);
|
|
141
|
-
const contentLabel = idx === 0 ? `┌─ ${mainComponents[0]?.label || 'Main'} ─┐` : '';
|
|
142
|
-
preview.push('│ │ ' + navLabel.padEnd(sidebarWidth - 3) + '│ ' + contentLabel.padEnd(contentWidth - 3) + '│');
|
|
143
|
-
});
|
|
144
|
-
preview.push('│ └' + '─'.repeat(sidebarWidth - 2) + '┘' + ' '.repeat(contentWidth - sidebarWidth + 3) + '│');
|
|
145
|
-
// Footer
|
|
146
|
-
const footer = components.find(c => c.type === 'footer' || c.position === 'bottom');
|
|
147
|
-
if (footer) {
|
|
148
|
-
preview.push(separator);
|
|
149
|
-
preview.push(createLine(footer.label || 'Footer', 'center'));
|
|
150
|
-
}
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
case 'grid': {
|
|
154
|
-
preview.push(createLine('Grid Layout', 'center'));
|
|
155
|
-
preview.push(separator);
|
|
156
|
-
const gridComponents = components.filter(c => c.type !== 'header' && c.type !== 'footer');
|
|
157
|
-
const cols = Math.ceil(Math.sqrt(gridComponents.length));
|
|
158
|
-
const cellWidth = Math.floor((width - 4) / cols) - 2;
|
|
159
|
-
for (let i = 0; i < gridComponents.length; i += cols) {
|
|
160
|
-
const row = gridComponents.slice(i, i + cols);
|
|
161
|
-
preview.push('│ ' + row.map(c => {
|
|
162
|
-
const label = (c.label || c.type).slice(0, cellWidth - 2);
|
|
163
|
-
return '┌' + label.padEnd(cellWidth - 2, '─') + '┐';
|
|
164
|
-
}).join(' ') + ' '.repeat(width - 4 - row.length * (cellWidth + 1)) + ' │');
|
|
165
|
-
preview.push('│ ' + row.map(c => '│' + ' '.repeat(cellWidth - 2) + '│').join(' ') + ' '.repeat(width - 4 - row.length * (cellWidth + 1)) + ' │');
|
|
166
|
-
preview.push('│ ' + row.map(c => '└' + '─'.repeat(cellWidth - 2) + '┘').join(' ') + ' '.repeat(width - 4 - row.length * (cellWidth + 1)) + ' │');
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
case 'centered': {
|
|
171
|
-
const main = components[0];
|
|
172
|
-
preview.push(emptyLine);
|
|
173
|
-
preview.push(emptyLine);
|
|
174
|
-
preview.push(createLine(main?.label || 'Main Content', 'center'));
|
|
175
|
-
components.slice(1).forEach(comp => {
|
|
176
|
-
if (comp.type === 'button') {
|
|
177
|
-
preview.push(createLine(`[${comp.label || 'Button'}]`, 'center'));
|
|
178
|
-
}
|
|
179
|
-
else if (comp.type === 'input') {
|
|
180
|
-
preview.push(createLine(`${comp.label || 'Input'}: [____________]`, 'center'));
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
preview.push(emptyLine);
|
|
184
|
-
preview.push(emptyLine);
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
case 'split': {
|
|
188
|
-
const leftWidth = Math.floor((width - 5) / 2);
|
|
189
|
-
const rightWidth = width - leftWidth - 5;
|
|
190
|
-
preview.push('│ ┌' + '─'.repeat(leftWidth) + '┐ ┌' + '─'.repeat(rightWidth) + '┐ │');
|
|
191
|
-
const left = components.find(c => c.position === 'left') || components[0];
|
|
192
|
-
const right = components.find(c => c.position === 'right') || components[1];
|
|
193
|
-
preview.push('│ │' + (left?.label || 'Left').padEnd(leftWidth) + '│ │' + (right?.label || 'Right').padEnd(rightWidth) + '│ │');
|
|
194
|
-
for (let i = 0; i < 5; i++) {
|
|
195
|
-
preview.push('│ │' + ' '.repeat(leftWidth) + '│ │' + ' '.repeat(rightWidth) + '│ │');
|
|
196
|
-
}
|
|
197
|
-
preview.push('│ └' + '─'.repeat(leftWidth) + '┘ └' + '─'.repeat(rightWidth) + '┘ │');
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
preview.push(bottomBorder);
|
|
202
|
-
// Mobile view if responsive
|
|
203
|
-
let mobilePreview = '';
|
|
204
|
-
if (responsive) {
|
|
205
|
-
const mobileWidth = 30;
|
|
206
|
-
const mobileTop = '┌' + '─'.repeat(mobileWidth - 2) + '┐';
|
|
207
|
-
const mobileBottom = '└' + '─'.repeat(mobileWidth - 2) + '┘';
|
|
208
|
-
mobilePreview = '\n\n📱 Mobile View:\n';
|
|
209
|
-
mobilePreview += mobileTop + '\n';
|
|
210
|
-
components.forEach(comp => {
|
|
211
|
-
const label = (comp.label || comp.type).slice(0, mobileWidth - 4);
|
|
212
|
-
mobilePreview += '│ ' + label.padEnd(mobileWidth - 4) + ' │\n';
|
|
213
|
-
});
|
|
214
|
-
mobilePreview += mobileBottom;
|
|
215
|
-
}
|
|
216
|
-
const result = {
|
|
217
|
-
page_name,
|
|
218
|
-
layout_type,
|
|
219
|
-
ascii_preview: preview.join('\n'),
|
|
220
|
-
mobile_preview: responsive ? mobilePreview : null,
|
|
221
|
-
components_count: components.length,
|
|
222
|
-
message: '✅ 이 레이아웃으로 진행하시겠습니까? 승인하시면 코드 생성을 시작합니다.',
|
|
223
|
-
action: 'preview_ui_ascii',
|
|
224
|
-
status: 'awaiting_confirmation'
|
|
225
|
-
};
|
|
226
|
-
return {
|
|
227
|
-
content: [{
|
|
228
|
-
type: 'text',
|
|
229
|
-
text: `🎨 UI Preview: ${page_name}\n\n${preview.join('\n')}${mobilePreview}\n\n${result.message}`
|
|
230
|
-
}]
|
|
231
|
-
};
|
|
232
|
-
}
|
package/mcp/dist/types/tool.js
DELETED
package/mcp/package.json
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "vide-mcp",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "MCP server for vide framework (based on hi-ai)",
|
|
5
|
-
"private": true,
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"module": "./src/index.ts",
|
|
8
|
-
"type": "module",
|
|
9
|
-
"scripts": {
|
|
10
|
-
"dev": "npm run build && node dist/index.js",
|
|
11
|
-
"build": "tsc",
|
|
12
|
-
"test": "vitest run",
|
|
13
|
-
"test:watch": "vitest",
|
|
14
|
-
"test:ui": "vitest --ui",
|
|
15
|
-
"test:coverage": "vitest run --coverage"
|
|
16
|
-
},
|
|
17
|
-
"keywords": [
|
|
18
|
-
"mcp",
|
|
19
|
-
"model-context-protocol",
|
|
20
|
-
"ai",
|
|
21
|
-
"assistant",
|
|
22
|
-
"development-tools",
|
|
23
|
-
"code-analysis",
|
|
24
|
-
"typescript",
|
|
25
|
-
"javascript",
|
|
26
|
-
"python",
|
|
27
|
-
"semantic-analysis",
|
|
28
|
-
"code-quality",
|
|
29
|
-
"memory-management",
|
|
30
|
-
"project-planning",
|
|
31
|
-
"claude",
|
|
32
|
-
"anthropic"
|
|
33
|
-
],
|
|
34
|
-
"author": "Su",
|
|
35
|
-
"license": "MIT",
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
38
|
-
"@smithery/sdk": "^1.6.8",
|
|
39
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
40
|
-
"@types/glob": "^8.1.0",
|
|
41
|
-
"better-sqlite3": "^12.4.1",
|
|
42
|
-
"chalk": "^5.3.0",
|
|
43
|
-
"glob": "^11.0.3",
|
|
44
|
-
"puppeteer-core": "^22.15.0",
|
|
45
|
-
"ts-morph": "^26.0.0"
|
|
46
|
-
},
|
|
47
|
-
"devDependencies": {
|
|
48
|
-
"@types/node": "^22.0.0",
|
|
49
|
-
"@vitest/ui": "^4.0.9",
|
|
50
|
-
"typescript": "^5.5.4",
|
|
51
|
-
"vitest": "^4.0.9"
|
|
52
|
-
}
|
|
53
|
-
}
|