@su-record/vibe 0.1.3 → 0.1.7

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 (73) hide show
  1. package/.claude/commands/vibe.analyze.md +123 -0
  2. package/.claude/commands/vibe.diagram.md +174 -0
  3. package/.claude/commands/vibe.plan.md +75 -0
  4. package/.claude/commands/vibe.run.md +151 -0
  5. package/.claude/commands/vibe.spec.md +273 -0
  6. package/.claude/commands/vibe.tasks.md +77 -0
  7. package/.claude/commands/vibe.ui.md +133 -0
  8. package/.claude/commands/vibe.verify.md +128 -0
  9. package/.claude/settings.local.json +14 -0
  10. package/README.md +170 -108
  11. package/bin/vibe +113 -226
  12. package/package.json +7 -7
  13. package/scripts/install-mcp.js +16 -6
  14. package/skills/quality/bdd-contract-testing.md +388 -0
  15. package/templates/contract-backend-template.md +517 -0
  16. package/templates/contract-frontend-template.md +594 -0
  17. package/templates/feature-template.md +259 -0
  18. package/templates/spec-template.md +60 -3
  19. package/mcp/dist/__tests__/complexity.test.js +0 -126
  20. package/mcp/dist/__tests__/memory.test.js +0 -120
  21. package/mcp/dist/__tests__/python-dart-complexity.test.js +0 -146
  22. package/mcp/dist/index.js +0 -230
  23. package/mcp/dist/lib/ContextCompressor.js +0 -305
  24. package/mcp/dist/lib/MemoryManager.js +0 -334
  25. package/mcp/dist/lib/ProjectCache.js +0 -126
  26. package/mcp/dist/lib/PythonParser.js +0 -241
  27. package/mcp/dist/tools/browser/browserPool.js +0 -76
  28. package/mcp/dist/tools/browser/browserUtils.js +0 -135
  29. package/mcp/dist/tools/browser/inspectNetworkRequests.js +0 -140
  30. package/mcp/dist/tools/browser/monitorConsoleLogs.js +0 -97
  31. package/mcp/dist/tools/convention/analyzeComplexity.js +0 -248
  32. package/mcp/dist/tools/convention/applyQualityRules.js +0 -102
  33. package/mcp/dist/tools/convention/checkCouplingCohesion.js +0 -233
  34. package/mcp/dist/tools/convention/complexityMetrics.js +0 -133
  35. package/mcp/dist/tools/convention/dartComplexity.js +0 -117
  36. package/mcp/dist/tools/convention/getCodingGuide.js +0 -64
  37. package/mcp/dist/tools/convention/languageDetector.js +0 -50
  38. package/mcp/dist/tools/convention/pythonComplexity.js +0 -109
  39. package/mcp/dist/tools/convention/suggestImprovements.js +0 -257
  40. package/mcp/dist/tools/convention/validateCodeQuality.js +0 -177
  41. package/mcp/dist/tools/memory/autoSaveContext.js +0 -79
  42. package/mcp/dist/tools/memory/database.js +0 -123
  43. package/mcp/dist/tools/memory/deleteMemory.js +0 -39
  44. package/mcp/dist/tools/memory/listMemories.js +0 -38
  45. package/mcp/dist/tools/memory/memoryConfig.js +0 -27
  46. package/mcp/dist/tools/memory/memorySQLite.js +0 -138
  47. package/mcp/dist/tools/memory/memoryUtils.js +0 -34
  48. package/mcp/dist/tools/memory/migrate.js +0 -113
  49. package/mcp/dist/tools/memory/prioritizeMemory.js +0 -109
  50. package/mcp/dist/tools/memory/recallMemory.js +0 -40
  51. package/mcp/dist/tools/memory/restoreSessionContext.js +0 -69
  52. package/mcp/dist/tools/memory/saveMemory.js +0 -34
  53. package/mcp/dist/tools/memory/searchMemories.js +0 -37
  54. package/mcp/dist/tools/memory/startSession.js +0 -100
  55. package/mcp/dist/tools/memory/updateMemory.js +0 -46
  56. package/mcp/dist/tools/planning/analyzeRequirements.js +0 -166
  57. package/mcp/dist/tools/planning/createUserStories.js +0 -119
  58. package/mcp/dist/tools/planning/featureRoadmap.js +0 -202
  59. package/mcp/dist/tools/planning/generatePrd.js +0 -156
  60. package/mcp/dist/tools/prompt/analyzePrompt.js +0 -145
  61. package/mcp/dist/tools/prompt/enhancePrompt.js +0 -105
  62. package/mcp/dist/tools/semantic/findReferences.js +0 -195
  63. package/mcp/dist/tools/semantic/findSymbol.js +0 -200
  64. package/mcp/dist/tools/thinking/analyzeProblem.js +0 -50
  65. package/mcp/dist/tools/thinking/breakDownProblem.js +0 -140
  66. package/mcp/dist/tools/thinking/createThinkingChain.js +0 -39
  67. package/mcp/dist/tools/thinking/formatAsPlan.js +0 -73
  68. package/mcp/dist/tools/thinking/stepByStepAnalysis.js +0 -58
  69. package/mcp/dist/tools/thinking/thinkAloudProcess.js +0 -75
  70. package/mcp/dist/tools/time/getCurrentTime.js +0 -61
  71. package/mcp/dist/tools/ui/previewUiAscii.js +0 -232
  72. package/mcp/dist/types/tool.js +0 -2
  73. 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
- }