@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.
Files changed (59) hide show
  1. package/README.md +13 -6
  2. package/bin/vibe +20 -2
  3. package/package.json +5 -6
  4. package/scripts/install-mcp.js +31 -5
  5. package/mcp/dist/__tests__/complexity.test.js +0 -126
  6. package/mcp/dist/__tests__/memory.test.js +0 -120
  7. package/mcp/dist/__tests__/python-dart-complexity.test.js +0 -146
  8. package/mcp/dist/index.js +0 -230
  9. package/mcp/dist/lib/ContextCompressor.js +0 -305
  10. package/mcp/dist/lib/MemoryManager.js +0 -334
  11. package/mcp/dist/lib/ProjectCache.js +0 -126
  12. package/mcp/dist/lib/PythonParser.js +0 -241
  13. package/mcp/dist/tools/browser/browserPool.js +0 -76
  14. package/mcp/dist/tools/browser/browserUtils.js +0 -135
  15. package/mcp/dist/tools/browser/inspectNetworkRequests.js +0 -140
  16. package/mcp/dist/tools/browser/monitorConsoleLogs.js +0 -97
  17. package/mcp/dist/tools/convention/analyzeComplexity.js +0 -248
  18. package/mcp/dist/tools/convention/applyQualityRules.js +0 -102
  19. package/mcp/dist/tools/convention/checkCouplingCohesion.js +0 -233
  20. package/mcp/dist/tools/convention/complexityMetrics.js +0 -133
  21. package/mcp/dist/tools/convention/dartComplexity.js +0 -117
  22. package/mcp/dist/tools/convention/getCodingGuide.js +0 -64
  23. package/mcp/dist/tools/convention/languageDetector.js +0 -50
  24. package/mcp/dist/tools/convention/pythonComplexity.js +0 -109
  25. package/mcp/dist/tools/convention/suggestImprovements.js +0 -257
  26. package/mcp/dist/tools/convention/validateCodeQuality.js +0 -177
  27. package/mcp/dist/tools/memory/autoSaveContext.js +0 -79
  28. package/mcp/dist/tools/memory/database.js +0 -123
  29. package/mcp/dist/tools/memory/deleteMemory.js +0 -39
  30. package/mcp/dist/tools/memory/listMemories.js +0 -38
  31. package/mcp/dist/tools/memory/memoryConfig.js +0 -27
  32. package/mcp/dist/tools/memory/memorySQLite.js +0 -138
  33. package/mcp/dist/tools/memory/memoryUtils.js +0 -34
  34. package/mcp/dist/tools/memory/migrate.js +0 -113
  35. package/mcp/dist/tools/memory/prioritizeMemory.js +0 -109
  36. package/mcp/dist/tools/memory/recallMemory.js +0 -40
  37. package/mcp/dist/tools/memory/restoreSessionContext.js +0 -69
  38. package/mcp/dist/tools/memory/saveMemory.js +0 -34
  39. package/mcp/dist/tools/memory/searchMemories.js +0 -37
  40. package/mcp/dist/tools/memory/startSession.js +0 -100
  41. package/mcp/dist/tools/memory/updateMemory.js +0 -46
  42. package/mcp/dist/tools/planning/analyzeRequirements.js +0 -166
  43. package/mcp/dist/tools/planning/createUserStories.js +0 -119
  44. package/mcp/dist/tools/planning/featureRoadmap.js +0 -202
  45. package/mcp/dist/tools/planning/generatePrd.js +0 -156
  46. package/mcp/dist/tools/prompt/analyzePrompt.js +0 -145
  47. package/mcp/dist/tools/prompt/enhancePrompt.js +0 -105
  48. package/mcp/dist/tools/semantic/findReferences.js +0 -195
  49. package/mcp/dist/tools/semantic/findSymbol.js +0 -200
  50. package/mcp/dist/tools/thinking/analyzeProblem.js +0 -50
  51. package/mcp/dist/tools/thinking/breakDownProblem.js +0 -140
  52. package/mcp/dist/tools/thinking/createThinkingChain.js +0 -39
  53. package/mcp/dist/tools/thinking/formatAsPlan.js +0 -73
  54. package/mcp/dist/tools/thinking/stepByStepAnalysis.js +0 -58
  55. package/mcp/dist/tools/thinking/thinkAloudProcess.js +0 -75
  56. package/mcp/dist/tools/time/getCurrentTime.js +0 -61
  57. package/mcp/dist/tools/ui/previewUiAscii.js +0 -232
  58. package/mcp/dist/types/tool.js +0 -2
  59. 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
- }
@@ -1,2 +0,0 @@
1
- // Common MCP tool type definitions (v1.3)
2
- export {};
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
- }