vibe-coding-mcp 2.6.0 → 2.7.0

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 CHANGED
@@ -4,7 +4,7 @@ MCP server that automatically collects, summarizes, documents, and publishes cod
4
4
 
5
5
  ## Features
6
6
 
7
- This MCP server provides 7 tools for managing vibe coding documentation:
7
+ This MCP server provides 10 tools for managing vibe coding documentation:
8
8
 
9
9
  | Tool | Description |
10
10
  |------|-------------|
@@ -16,6 +16,8 @@ This MCP server provides 7 tools for managing vibe coding documentation:
16
16
  | `muse_create_session_log` | Creates daily or session-based vibe coding session logs |
17
17
  | `muse_analyze_code` | AST-based code analysis with Mermaid diagram generation |
18
18
  | `muse_session_history` | Manages session history - save, retrieve, search past sessions |
19
+ | `muse_export_session` | Exports sessions to Markdown, JSON, or HTML formats |
20
+ | `muse_project_profile` | Manages project-specific settings and configurations |
19
21
 
20
22
  ### Additional Features (v2.0)
21
23
  - **AST Parsing**: TypeScript, Python, Go code analysis
@@ -55,6 +57,21 @@ This MCP server provides 7 tools for managing vibe coding documentation:
55
57
  - **Improvement Suggestions**: AI-generated recommendations for better code
56
58
  - **Works with AST**: Combines AI insights with AST-based analysis for comprehensive results
57
59
 
60
+ ### Session History (v2.6)
61
+ - **Persistent Storage**: Save coding sessions to local JSON files
62
+ - **CRUD Operations**: Create, read, update, delete sessions
63
+ - **Search & Filter**: Find past sessions by keyword, tags, or date
64
+ - **Statistics**: Track total sessions, code contexts, and design decisions
65
+
66
+ ### Session Export & Project Profiles (v2.7)
67
+ - **Session Export**: Export sessions to Markdown, JSON, or HTML formats
68
+ - **Multiple Templates**: Default, minimal, detailed, and report templates
69
+ - **Project Profiles**: Manage project-specific settings and configurations
70
+ - **Publishing Config**: Default platforms and settings per project
71
+ - **Code Analysis Config**: Language preferences and diagram types
72
+ - **Documentation Config**: Default document types, language, author info
73
+ - **Team Management**: Store team member information per project
74
+
58
75
  ## Installation
59
76
 
60
77
  ### Claude Code (Recommended)
@@ -162,7 +179,7 @@ src/
162
179
  │ ├── security.ts # Path traversal, SSRF, timeout utilities
163
180
  │ ├── logger.ts # Structured JSON logging
164
181
  │ └── config.ts # Platform configuration validation
165
- ├── tools/ # 7 MCP tools
182
+ ├── tools/ # 10 MCP tools
166
183
  ├── platforms/ # Notion, GitHub Wiki, Obsidian, Confluence, Slack, Discord
167
184
  ├── types/ # TypeScript interfaces
168
185
  └── utils/ # Markdown, AST, diagram utilities
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exportSession.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportSession.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/exportSession.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,180 @@
1
+ import { exportSessionTool } from '../tools/exportSession.js';
2
+ import { sessionHistoryTool } from '../tools/sessionHistory.js';
3
+ import * as sessionStorage from '../core/sessionStorage.js';
4
+ import { promises as fs } from 'fs';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ let testDir;
8
+ beforeAll(async () => {
9
+ testDir = path.join(os.tmpdir(), `vibe-coding-export-test-${Date.now()}`);
10
+ await sessionStorage.initializeStorage(testDir);
11
+ // 테스트용 세션 생성
12
+ await sessionHistoryTool({
13
+ action: 'save',
14
+ title: 'Test Session 1',
15
+ summary: 'First test session for export',
16
+ tags: ['test', 'export'],
17
+ codeContexts: [
18
+ {
19
+ sessionId: 'ctx-1',
20
+ timestamp: new Date().toISOString(),
21
+ codeBlocks: [
22
+ { language: 'typescript', code: 'const x = 1;' }
23
+ ],
24
+ conversationSummary: 'Test code'
25
+ }
26
+ ],
27
+ designDecisions: [
28
+ {
29
+ id: 'dd-1',
30
+ title: 'Test Decision',
31
+ description: 'A test decision',
32
+ rationale: 'For testing',
33
+ category: 'implementation',
34
+ timestamp: new Date().toISOString()
35
+ }
36
+ ]
37
+ });
38
+ await sessionHistoryTool({
39
+ action: 'save',
40
+ title: 'Test Session 2',
41
+ summary: 'Second test session',
42
+ tags: ['test']
43
+ });
44
+ });
45
+ afterAll(async () => {
46
+ try {
47
+ const files = await fs.readdir(testDir);
48
+ for (const file of files) {
49
+ await fs.unlink(path.join(testDir, file));
50
+ }
51
+ await fs.rmdir(testDir);
52
+ }
53
+ catch {
54
+ // Ignore cleanup errors
55
+ }
56
+ });
57
+ describe('exportSessionTool', () => {
58
+ describe('markdown export', () => {
59
+ it('should export all sessions as markdown', async () => {
60
+ const result = await exportSessionTool({
61
+ format: 'markdown'
62
+ });
63
+ expect(result.success).toBe(true);
64
+ expect(result.format).toBe('markdown');
65
+ expect(result.sessionCount).toBe(2);
66
+ expect(result.content).toContain('Test Session 1');
67
+ expect(result.content).toContain('Test Session 2');
68
+ });
69
+ it('should include code blocks in markdown', async () => {
70
+ const result = await exportSessionTool({
71
+ format: 'markdown',
72
+ includeCodeBlocks: true
73
+ });
74
+ expect(result.success).toBe(true);
75
+ expect(result.content).toContain('```typescript');
76
+ expect(result.content).toContain('const x = 1;');
77
+ });
78
+ it('should include design decisions', async () => {
79
+ const result = await exportSessionTool({
80
+ format: 'markdown',
81
+ includeDesignDecisions: true
82
+ });
83
+ expect(result.success).toBe(true);
84
+ expect(result.content).toContain('Test Decision');
85
+ expect(result.content).toContain('Design Decisions');
86
+ });
87
+ it('should use minimal template', async () => {
88
+ const result = await exportSessionTool({
89
+ format: 'markdown',
90
+ template: 'minimal'
91
+ });
92
+ expect(result.success).toBe(true);
93
+ expect(result.content).not.toContain('Table of Contents');
94
+ });
95
+ });
96
+ describe('json export', () => {
97
+ it('should export as valid JSON', async () => {
98
+ const result = await exportSessionTool({
99
+ format: 'json'
100
+ });
101
+ expect(result.success).toBe(true);
102
+ expect(result.format).toBe('json');
103
+ const parsed = JSON.parse(result.content);
104
+ expect(parsed.exportInfo).toBeDefined();
105
+ expect(parsed.sessions).toHaveLength(2);
106
+ });
107
+ it('should include metadata in JSON', async () => {
108
+ const result = await exportSessionTool({
109
+ format: 'json',
110
+ includeMetadata: true
111
+ });
112
+ const parsed = JSON.parse(result.content);
113
+ expect(parsed.sessions[0].createdAt).toBeDefined();
114
+ expect(parsed.sessions[0].tags).toBeDefined();
115
+ });
116
+ });
117
+ describe('html export', () => {
118
+ it('should export as valid HTML', async () => {
119
+ const result = await exportSessionTool({
120
+ format: 'html'
121
+ });
122
+ expect(result.success).toBe(true);
123
+ expect(result.format).toBe('html');
124
+ expect(result.content).toContain('<!DOCTYPE html>');
125
+ expect(result.content).toContain('Test Session 1');
126
+ });
127
+ it('should include styles in HTML', async () => {
128
+ const result = await exportSessionTool({
129
+ format: 'html'
130
+ });
131
+ expect(result.content).toContain('<style>');
132
+ expect(result.content).toContain('font-family');
133
+ });
134
+ });
135
+ describe('file output', () => {
136
+ it('should save to file when outputPath is provided', async () => {
137
+ const outputPath = path.join(testDir, 'export-test.md');
138
+ const result = await exportSessionTool({
139
+ format: 'markdown',
140
+ outputPath
141
+ });
142
+ expect(result.success).toBe(true);
143
+ expect(result.filePath).toBe(outputPath);
144
+ const fileContent = await fs.readFile(outputPath, 'utf-8');
145
+ expect(fileContent).toContain('Test Session');
146
+ });
147
+ });
148
+ describe('custom options', () => {
149
+ it('should use custom title', async () => {
150
+ const result = await exportSessionTool({
151
+ format: 'markdown',
152
+ title: 'My Custom Export'
153
+ });
154
+ expect(result.content).toContain('# My Custom Export');
155
+ });
156
+ it('should exclude code blocks when disabled', async () => {
157
+ const result = await exportSessionTool({
158
+ format: 'markdown',
159
+ includeCodeBlocks: false
160
+ });
161
+ expect(result.content).not.toContain('```typescript');
162
+ });
163
+ });
164
+ describe('error handling', () => {
165
+ it('should handle no sessions gracefully', async () => {
166
+ // 다른 저장소로 테스트
167
+ const emptyDir = path.join(os.tmpdir(), `empty-${Date.now()}`);
168
+ await sessionStorage.initializeStorage(emptyDir);
169
+ const result = await exportSessionTool({
170
+ format: 'markdown',
171
+ sessionIds: ['non-existent-id']
172
+ });
173
+ expect(result.success).toBe(false);
174
+ expect(result.error).toContain('No sessions found');
175
+ // 원래 저장소로 복원
176
+ await sessionStorage.initializeStorage(testDir);
177
+ });
178
+ });
179
+ });
180
+ //# sourceMappingURL=exportSession.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportSession.test.js","sourceRoot":"","sources":["../../src/__tests__/exportSession.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=projectProfile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectProfile.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/projectProfile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,216 @@
1
+ import { projectProfileTool } from '../tools/projectProfile.js';
2
+ import * as profileStorage from '../core/profileStorage.js';
3
+ import { promises as fs } from 'fs';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ let testDir;
7
+ beforeAll(async () => {
8
+ testDir = path.join(os.tmpdir(), `vibe-coding-profile-test-${Date.now()}`);
9
+ await profileStorage.initializeProfileStorage(testDir);
10
+ });
11
+ afterAll(async () => {
12
+ try {
13
+ const files = await fs.readdir(testDir);
14
+ for (const file of files) {
15
+ await fs.unlink(path.join(testDir, file));
16
+ }
17
+ await fs.rmdir(testDir);
18
+ }
19
+ catch {
20
+ // Ignore cleanup errors
21
+ }
22
+ });
23
+ describe('projectProfileTool', () => {
24
+ let createdProfileId;
25
+ describe('create action', () => {
26
+ it('should create a new profile', async () => {
27
+ const result = await projectProfileTool({
28
+ action: 'create',
29
+ name: 'Test Project',
30
+ description: 'A test project profile',
31
+ projectPath: '/path/to/project',
32
+ repository: 'https://github.com/test/repo',
33
+ version: '1.0.0',
34
+ publishing: {
35
+ defaultPlatform: 'notion',
36
+ autoPublish: false
37
+ },
38
+ codeAnalysis: {
39
+ defaultLanguage: 'typescript',
40
+ defaultDiagramTypes: ['class', 'flowchart'],
41
+ useAI: true
42
+ },
43
+ documentation: {
44
+ defaultDocType: 'README',
45
+ language: 'en',
46
+ author: 'Test Author'
47
+ },
48
+ defaultTags: ['project', 'test']
49
+ });
50
+ expect(result.success).toBe(true);
51
+ expect(result.action).toBe('create');
52
+ expect(result.profile).toBeDefined();
53
+ expect(result.profile?.name).toBe('Test Project');
54
+ expect(result.profile?.publishing?.defaultPlatform).toBe('notion');
55
+ createdProfileId = result.profile.id;
56
+ });
57
+ it('should fail without name', async () => {
58
+ const result = await projectProfileTool({
59
+ action: 'create'
60
+ });
61
+ expect(result.success).toBe(false);
62
+ expect(result.error).toContain('name');
63
+ });
64
+ });
65
+ describe('get action', () => {
66
+ it('should retrieve profile by ID', async () => {
67
+ const result = await projectProfileTool({
68
+ action: 'get',
69
+ profileId: createdProfileId
70
+ });
71
+ expect(result.success).toBe(true);
72
+ expect(result.profile?.name).toBe('Test Project');
73
+ });
74
+ it('should retrieve profile by name', async () => {
75
+ const result = await projectProfileTool({
76
+ action: 'get',
77
+ name: 'Test Project'
78
+ });
79
+ expect(result.success).toBe(true);
80
+ expect(result.profile?.id).toBe(createdProfileId);
81
+ });
82
+ it('should fail for non-existent profile', async () => {
83
+ const result = await projectProfileTool({
84
+ action: 'get',
85
+ profileId: 'non-existent'
86
+ });
87
+ expect(result.success).toBe(false);
88
+ expect(result.error).toContain('not found');
89
+ });
90
+ });
91
+ describe('update action', () => {
92
+ it('should update profile settings', async () => {
93
+ const result = await projectProfileTool({
94
+ action: 'update',
95
+ profileId: createdProfileId,
96
+ version: '2.0.0',
97
+ documentation: {
98
+ language: 'ko',
99
+ includeTableOfContents: true
100
+ }
101
+ });
102
+ expect(result.success).toBe(true);
103
+ expect(result.profile?.version).toBe('2.0.0');
104
+ expect(result.profile?.documentation?.language).toBe('ko');
105
+ });
106
+ });
107
+ describe('list action', () => {
108
+ beforeAll(async () => {
109
+ await projectProfileTool({
110
+ action: 'create',
111
+ name: 'Second Project',
112
+ description: 'Another project'
113
+ });
114
+ });
115
+ it('should list all profiles', async () => {
116
+ const result = await projectProfileTool({
117
+ action: 'list'
118
+ });
119
+ expect(result.success).toBe(true);
120
+ expect(result.profiles?.length).toBeGreaterThanOrEqual(2);
121
+ expect(result.total).toBeGreaterThanOrEqual(2);
122
+ });
123
+ it('should support pagination', async () => {
124
+ const result = await projectProfileTool({
125
+ action: 'list',
126
+ limit: 1,
127
+ offset: 0
128
+ });
129
+ expect(result.success).toBe(true);
130
+ expect(result.profiles?.length).toBe(1);
131
+ });
132
+ it('should support sorting', async () => {
133
+ const result = await projectProfileTool({
134
+ action: 'list',
135
+ sortBy: 'name',
136
+ sortOrder: 'asc'
137
+ });
138
+ expect(result.success).toBe(true);
139
+ });
140
+ });
141
+ describe('setActive and getActive actions', () => {
142
+ it('should set active profile', async () => {
143
+ const result = await projectProfileTool({
144
+ action: 'setActive',
145
+ profileId: createdProfileId
146
+ });
147
+ expect(result.success).toBe(true);
148
+ });
149
+ it('should get active profile', async () => {
150
+ const result = await projectProfileTool({
151
+ action: 'getActive'
152
+ });
153
+ expect(result.success).toBe(true);
154
+ expect(result.profile?.id).toBe(createdProfileId);
155
+ });
156
+ it('should clear active profile', async () => {
157
+ await projectProfileTool({
158
+ action: 'setActive',
159
+ profileId: undefined
160
+ });
161
+ const result = await projectProfileTool({
162
+ action: 'getActive'
163
+ });
164
+ expect(result.success).toBe(true);
165
+ expect(result.profile).toBeUndefined();
166
+ });
167
+ });
168
+ describe('clone action', () => {
169
+ it('should clone a profile', async () => {
170
+ const result = await projectProfileTool({
171
+ action: 'clone',
172
+ profileId: createdProfileId,
173
+ newName: 'Cloned Project'
174
+ });
175
+ expect(result.success).toBe(true);
176
+ expect(result.profile?.name).toBe('Cloned Project');
177
+ expect(result.profile?.id).not.toBe(createdProfileId);
178
+ });
179
+ it('should fail without newName', async () => {
180
+ const result = await projectProfileTool({
181
+ action: 'clone',
182
+ profileId: createdProfileId
183
+ });
184
+ expect(result.success).toBe(false);
185
+ expect(result.error).toContain('newName');
186
+ });
187
+ });
188
+ describe('delete action', () => {
189
+ it('should delete a profile', async () => {
190
+ // 삭제할 프로파일 생성
191
+ const createResult = await projectProfileTool({
192
+ action: 'create',
193
+ name: 'To Delete'
194
+ });
195
+ const deleteResult = await projectProfileTool({
196
+ action: 'delete',
197
+ profileId: createResult.profile.id
198
+ });
199
+ expect(deleteResult.success).toBe(true);
200
+ // 삭제 확인
201
+ const getResult = await projectProfileTool({
202
+ action: 'get',
203
+ profileId: createResult.profile.id
204
+ });
205
+ expect(getResult.success).toBe(false);
206
+ });
207
+ it('should fail for non-existent profile', async () => {
208
+ const result = await projectProfileTool({
209
+ action: 'delete',
210
+ profileId: 'non-existent'
211
+ });
212
+ expect(result.success).toBe(false);
213
+ });
214
+ });
215
+ });
216
+ //# sourceMappingURL=projectProfile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectProfile.test.js","sourceRoot":"","sources":["../../src/__tests__/projectProfile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 프로젝트 프로파일 스토리지 모듈
3
+ * 프로젝트별 설정을 저장하고 관리
4
+ * v2.7: Project Profile
5
+ */
6
+ export interface PublishingConfig {
7
+ defaultPlatform?: 'notion' | 'github-wiki' | 'obsidian' | 'confluence' | 'slack' | 'discord';
8
+ platformSettings?: {
9
+ notion?: {
10
+ databaseId?: string;
11
+ };
12
+ obsidian?: {
13
+ vaultPath?: string;
14
+ };
15
+ confluence?: {
16
+ spaceKey?: string;
17
+ };
18
+ };
19
+ autoPublish?: boolean;
20
+ }
21
+ export interface CodeAnalysisConfig {
22
+ defaultLanguage?: 'typescript' | 'javascript' | 'python' | 'go';
23
+ defaultDiagramTypes?: ('class' | 'flowchart' | 'dependency' | 'all')[];
24
+ excludePatterns?: string[];
25
+ useAI?: boolean;
26
+ }
27
+ export interface DocumentationConfig {
28
+ defaultDocType?: 'README' | 'DESIGN' | 'TUTORIAL' | 'CHANGELOG' | 'API' | 'ARCHITECTURE';
29
+ language?: 'en' | 'ko';
30
+ author?: string;
31
+ license?: string;
32
+ includeTableOfContents?: boolean;
33
+ }
34
+ export interface ProjectProfile {
35
+ id: string;
36
+ name: string;
37
+ description?: string;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ projectPath?: string;
41
+ repository?: string;
42
+ version?: string;
43
+ publishing?: PublishingConfig;
44
+ codeAnalysis?: CodeAnalysisConfig;
45
+ documentation?: DocumentationConfig;
46
+ defaultTags?: string[];
47
+ tagCategories?: {
48
+ name: string;
49
+ tags: string[];
50
+ }[];
51
+ team?: {
52
+ name: string;
53
+ members?: {
54
+ name: string;
55
+ role?: string;
56
+ email?: string;
57
+ }[];
58
+ };
59
+ metadata?: Record<string, unknown>;
60
+ }
61
+ export interface StoredProfile {
62
+ id: string;
63
+ name: string;
64
+ description?: string;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ isActive: boolean;
68
+ }
69
+ /**
70
+ * 스토리지 초기화
71
+ */
72
+ export declare function initializeProfileStorage(customDir?: string): Promise<void>;
73
+ /**
74
+ * 프로파일 생성
75
+ */
76
+ export declare function createProfile(data: Omit<ProjectProfile, 'id' | 'createdAt' | 'updatedAt'>): Promise<ProjectProfile>;
77
+ /**
78
+ * 프로파일 조회
79
+ */
80
+ export declare function getProfile(profileId: string): Promise<ProjectProfile | null>;
81
+ /**
82
+ * 프로파일 업데이트
83
+ */
84
+ export declare function updateProfile(profileId: string, updates: Partial<Omit<ProjectProfile, 'id' | 'createdAt'>>): Promise<ProjectProfile>;
85
+ /**
86
+ * 프로파일 삭제
87
+ */
88
+ export declare function deleteProfile(profileId: string): Promise<boolean>;
89
+ /**
90
+ * 모든 프로파일 목록
91
+ */
92
+ export declare function listProfiles(options?: {
93
+ limit?: number;
94
+ offset?: number;
95
+ sortBy?: 'createdAt' | 'updatedAt' | 'name';
96
+ sortOrder?: 'asc' | 'desc';
97
+ }): Promise<{
98
+ profiles: StoredProfile[];
99
+ total: number;
100
+ }>;
101
+ /**
102
+ * 활성 프로파일 설정
103
+ */
104
+ export declare function setActiveProfile(profileId: string | null): Promise<void>;
105
+ /**
106
+ * 활성 프로파일 조회
107
+ */
108
+ export declare function getActiveProfile(): Promise<ProjectProfile | null>;
109
+ /**
110
+ * 이름으로 프로파일 검색
111
+ */
112
+ export declare function findProfileByName(name: string): Promise<ProjectProfile | null>;
113
+ /**
114
+ * 프로파일 복제
115
+ */
116
+ export declare function cloneProfile(profileId: string, newName: string): Promise<ProjectProfile>;
117
+ //# sourceMappingURL=profileStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileStorage.d.ts","sourceRoot":"","sources":["../../src/core/profileStorage.ts"],"names":[],"mappings":"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"}