vibe-coding-mcp 2.3.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.
Files changed (130) hide show
  1. package/README.md +179 -0
  2. package/dist/__tests__/collectCodeContext.test.d.ts +2 -0
  3. package/dist/__tests__/collectCodeContext.test.d.ts.map +1 -0
  4. package/dist/__tests__/collectCodeContext.test.js +139 -0
  5. package/dist/__tests__/collectCodeContext.test.js.map +1 -0
  6. package/dist/__tests__/createSessionLog.test.d.ts +2 -0
  7. package/dist/__tests__/createSessionLog.test.d.ts.map +1 -0
  8. package/dist/__tests__/createSessionLog.test.js +130 -0
  9. package/dist/__tests__/createSessionLog.test.js.map +1 -0
  10. package/dist/__tests__/generateDevDocument.test.d.ts +2 -0
  11. package/dist/__tests__/generateDevDocument.test.d.ts.map +1 -0
  12. package/dist/__tests__/generateDevDocument.test.js +174 -0
  13. package/dist/__tests__/generateDevDocument.test.js.map +1 -0
  14. package/dist/__tests__/normalizeForPlatform.test.d.ts +2 -0
  15. package/dist/__tests__/normalizeForPlatform.test.d.ts.map +1 -0
  16. package/dist/__tests__/normalizeForPlatform.test.js +171 -0
  17. package/dist/__tests__/normalizeForPlatform.test.js.map +1 -0
  18. package/dist/__tests__/publishDocument.test.d.ts +2 -0
  19. package/dist/__tests__/publishDocument.test.d.ts.map +1 -0
  20. package/dist/__tests__/publishDocument.test.js +93 -0
  21. package/dist/__tests__/publishDocument.test.js.map +1 -0
  22. package/dist/__tests__/summarizeDesignDecisions.test.d.ts +2 -0
  23. package/dist/__tests__/summarizeDesignDecisions.test.d.ts.map +1 -0
  24. package/dist/__tests__/summarizeDesignDecisions.test.js +158 -0
  25. package/dist/__tests__/summarizeDesignDecisions.test.js.map +1 -0
  26. package/dist/core/cache.d.ts +39 -0
  27. package/dist/core/cache.d.ts.map +1 -0
  28. package/dist/core/cache.js +112 -0
  29. package/dist/core/cache.js.map +1 -0
  30. package/dist/core/config.d.ts +30 -0
  31. package/dist/core/config.d.ts.map +1 -0
  32. package/dist/core/config.js +90 -0
  33. package/dist/core/config.js.map +1 -0
  34. package/dist/core/errors.d.ts +52 -0
  35. package/dist/core/errors.d.ts.map +1 -0
  36. package/dist/core/errors.js +99 -0
  37. package/dist/core/errors.js.map +1 -0
  38. package/dist/core/logger.d.ts +57 -0
  39. package/dist/core/logger.d.ts.map +1 -0
  40. package/dist/core/logger.js +114 -0
  41. package/dist/core/logger.js.map +1 -0
  42. package/dist/core/schemas.d.ts +690 -0
  43. package/dist/core/schemas.d.ts.map +1 -0
  44. package/dist/core/schemas.js +136 -0
  45. package/dist/core/schemas.js.map +1 -0
  46. package/dist/core/security.d.ts +28 -0
  47. package/dist/core/security.d.ts.map +1 -0
  48. package/dist/core/security.js +103 -0
  49. package/dist/core/security.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +168 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/platforms/confluence.d.ts +13 -0
  55. package/dist/platforms/confluence.d.ts.map +1 -0
  56. package/dist/platforms/confluence.js +178 -0
  57. package/dist/platforms/confluence.js.map +1 -0
  58. package/dist/platforms/discord.d.ts +54 -0
  59. package/dist/platforms/discord.d.ts.map +1 -0
  60. package/dist/platforms/discord.js +176 -0
  61. package/dist/platforms/discord.js.map +1 -0
  62. package/dist/platforms/github-wiki.d.ts +3 -0
  63. package/dist/platforms/github-wiki.d.ts.map +1 -0
  64. package/dist/platforms/github-wiki.js +120 -0
  65. package/dist/platforms/github-wiki.js.map +1 -0
  66. package/dist/platforms/notion.d.ts +3 -0
  67. package/dist/platforms/notion.d.ts.map +1 -0
  68. package/dist/platforms/notion.js +205 -0
  69. package/dist/platforms/notion.js.map +1 -0
  70. package/dist/platforms/obsidian.d.ts +3 -0
  71. package/dist/platforms/obsidian.d.ts.map +1 -0
  72. package/dist/platforms/obsidian.js +43 -0
  73. package/dist/platforms/obsidian.js.map +1 -0
  74. package/dist/platforms/slack.d.ts +21 -0
  75. package/dist/platforms/slack.d.ts.map +1 -0
  76. package/dist/platforms/slack.js +217 -0
  77. package/dist/platforms/slack.js.map +1 -0
  78. package/dist/stdio.d.ts +6 -0
  79. package/dist/stdio.d.ts.map +1 -0
  80. package/dist/stdio.js +98 -0
  81. package/dist/stdio.js.map +1 -0
  82. package/dist/tools/analyzeCode.d.ts +65 -0
  83. package/dist/tools/analyzeCode.d.ts.map +1 -0
  84. package/dist/tools/analyzeCode.js +113 -0
  85. package/dist/tools/analyzeCode.js.map +1 -0
  86. package/dist/tools/collectCodeContext.d.ts +86 -0
  87. package/dist/tools/collectCodeContext.d.ts.map +1 -0
  88. package/dist/tools/collectCodeContext.js +275 -0
  89. package/dist/tools/collectCodeContext.js.map +1 -0
  90. package/dist/tools/createSessionLog.d.ts +79 -0
  91. package/dist/tools/createSessionLog.d.ts.map +1 -0
  92. package/dist/tools/createSessionLog.js +160 -0
  93. package/dist/tools/createSessionLog.js.map +1 -0
  94. package/dist/tools/generateDevDocument.d.ts +216 -0
  95. package/dist/tools/generateDevDocument.d.ts.map +1 -0
  96. package/dist/tools/generateDevDocument.js +659 -0
  97. package/dist/tools/generateDevDocument.js.map +1 -0
  98. package/dist/tools/normalizeForPlatform.d.ts +95 -0
  99. package/dist/tools/normalizeForPlatform.d.ts.map +1 -0
  100. package/dist/tools/normalizeForPlatform.js +340 -0
  101. package/dist/tools/normalizeForPlatform.js.map +1 -0
  102. package/dist/tools/publishDocument.d.ts +60 -0
  103. package/dist/tools/publishDocument.d.ts.map +1 -0
  104. package/dist/tools/publishDocument.js +117 -0
  105. package/dist/tools/publishDocument.js.map +1 -0
  106. package/dist/tools/summarizeDesignDecisions.d.ts +82 -0
  107. package/dist/tools/summarizeDesignDecisions.d.ts.map +1 -0
  108. package/dist/tools/summarizeDesignDecisions.js +361 -0
  109. package/dist/tools/summarizeDesignDecisions.js.map +1 -0
  110. package/dist/types/index.d.ts +63 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +2 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/dist/utils/astParser.d.ts +55 -0
  115. package/dist/utils/astParser.d.ts.map +1 -0
  116. package/dist/utils/astParser.js +333 -0
  117. package/dist/utils/astParser.js.map +1 -0
  118. package/dist/utils/i18n.d.ts +67 -0
  119. package/dist/utils/i18n.d.ts.map +1 -0
  120. package/dist/utils/i18n.js +193 -0
  121. package/dist/utils/i18n.js.map +1 -0
  122. package/dist/utils/markdown.d.ts +9 -0
  123. package/dist/utils/markdown.d.ts.map +1 -0
  124. package/dist/utils/markdown.js +99 -0
  125. package/dist/utils/markdown.js.map +1 -0
  126. package/dist/utils/mermaidGenerator.d.ts +69 -0
  127. package/dist/utils/mermaidGenerator.d.ts.map +1 -0
  128. package/dist/utils/mermaidGenerator.js +315 -0
  129. package/dist/utils/mermaidGenerator.js.map +1 -0
  130. package/package.json +66 -0
@@ -0,0 +1,136 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Zod schemas for input validation
4
+ * Aligned with existing type definitions in types/index.ts
5
+ */
6
+ // Common schemas - matching existing types
7
+ export const CodeBlockSchema = z.object({
8
+ language: z.string().default('text'),
9
+ code: z.string(),
10
+ filename: z.string().optional(),
11
+ description: z.string().optional()
12
+ });
13
+ export const DesignDecisionSchema = z.object({
14
+ id: z.string(),
15
+ title: z.string(),
16
+ description: z.string(),
17
+ rationale: z.string(),
18
+ alternatives: z.array(z.string()).optional(),
19
+ category: z.enum(['architecture', 'library', 'pattern', 'implementation', 'other']).default('other'),
20
+ timestamp: z.string().default(() => new Date().toISOString())
21
+ });
22
+ export const CodeContextSchema = z.object({
23
+ sessionId: z.string(),
24
+ timestamp: z.string(),
25
+ codeBlocks: z.array(CodeBlockSchema),
26
+ conversationSummary: z.string(),
27
+ tags: z.array(z.string()).optional()
28
+ });
29
+ export const SessionLogOptionsSchema = z.object({
30
+ logType: z.enum(['daily', 'session']).default('session'),
31
+ outputPath: z.string().optional(),
32
+ format: z.enum(['markdown', 'json']).optional().default('markdown')
33
+ });
34
+ // Tool input schemas - matching existing tool interfaces
35
+ export const CollectCodeContextSchema = z.object({
36
+ codeBlocks: z.array(CodeBlockSchema).optional(),
37
+ rawText: z.string().optional(),
38
+ conversationSummary: z.string().min(1, 'Conversation summary is required'),
39
+ tags: z.array(z.string()).optional(),
40
+ autoDetectLanguage: z.boolean().optional().default(true),
41
+ removeDuplicates: z.boolean().optional().default(true),
42
+ includeStats: z.boolean().optional().default(false)
43
+ });
44
+ export const SummarizeDesignDecisionsSchema = z.object({
45
+ conversationLog: z.string().min(1, 'Conversation log is required'),
46
+ language: z.enum(['en', 'ko']).optional().default('en')
47
+ });
48
+ export const GenerateDevDocumentSchema = z.object({
49
+ documentType: z.enum(['README', 'DESIGN', 'TUTORIAL', 'CHANGELOG', 'API', 'ARCHITECTURE']),
50
+ title: z.string().optional(),
51
+ description: z.string().optional(),
52
+ projectName: z.string().optional(),
53
+ author: z.string().optional(),
54
+ version: z.string().optional(),
55
+ license: z.string().optional(),
56
+ language: z.enum(['en', 'ko']).optional().default('en'),
57
+ features: z.array(z.string()).optional(),
58
+ installation: z.object({
59
+ requirements: z.array(z.string()).optional(),
60
+ steps: z.array(z.string()).optional()
61
+ }).optional(),
62
+ apiReference: z.array(z.object({
63
+ name: z.string(),
64
+ description: z.string(),
65
+ params: z.array(z.string()).optional(),
66
+ returns: z.string().optional()
67
+ })).optional(),
68
+ designDecisions: z.array(DesignDecisionSchema).optional(),
69
+ codeContexts: z.array(CodeContextSchema).optional(),
70
+ changelog: z.array(z.object({
71
+ version: z.string(),
72
+ date: z.string(),
73
+ changes: z.array(z.string())
74
+ })).optional(),
75
+ includeTableOfContents: z.boolean().optional().default(false),
76
+ faq: z.array(z.object({
77
+ question: z.string(),
78
+ answer: z.string()
79
+ })).optional(),
80
+ contributors: z.array(z.object({
81
+ name: z.string(),
82
+ role: z.string().optional()
83
+ })).optional()
84
+ });
85
+ export const NormalizeForPlatformSchema = z.object({
86
+ document: z.string().min(1, 'Document is required'),
87
+ platform: z.enum(['notion', 'github-wiki', 'obsidian']),
88
+ options: z.object({
89
+ addFrontmatter: z.boolean().optional(),
90
+ addTimestamp: z.boolean().optional(),
91
+ customMetadata: z.record(z.string()).optional()
92
+ }).optional()
93
+ });
94
+ export const PublishDocumentSchema = z.object({
95
+ document: z.string().min(1, 'Document is required'),
96
+ platform: z.enum(['notion', 'github-wiki', 'obsidian', 'confluence', 'slack', 'discord']),
97
+ title: z.string().min(1, 'Title is required'),
98
+ options: z.object({
99
+ filename: z.string().optional(),
100
+ wikiPath: z.string().optional(),
101
+ vaultPath: z.string().optional(),
102
+ tags: z.array(z.string()).optional()
103
+ }).optional()
104
+ });
105
+ export const CreateSessionLogSchema = z.object({
106
+ title: z.string().min(1, 'Title is required'),
107
+ summary: z.string().min(1, 'Summary is required'),
108
+ codeContexts: z.array(CodeContextSchema).optional(),
109
+ designDecisions: z.array(DesignDecisionSchema).optional(),
110
+ duration: z.number().optional(),
111
+ tags: z.array(z.string()).optional(),
112
+ options: SessionLogOptionsSchema.optional()
113
+ });
114
+ export const AnalyzeCodeSchema = z.object({
115
+ code: z.string().min(1, 'Code is required'),
116
+ language: z.enum(['typescript', 'javascript', 'python', 'go']),
117
+ filename: z.string().optional(),
118
+ options: z.object({
119
+ includeComplexity: z.boolean().optional().default(true),
120
+ includeDependencies: z.boolean().optional().default(true),
121
+ generateDiagram: z.boolean().optional().default(true),
122
+ diagramType: z.enum(['class', 'flowchart', 'dependency', 'architecture']).optional().default('class')
123
+ }).optional()
124
+ });
125
+ /**
126
+ * Validates input against schema and returns typed result
127
+ */
128
+ export function validateInput(schema, input) {
129
+ const result = schema.safeParse(input);
130
+ if (!result.success) {
131
+ const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');
132
+ throw new Error(`Validation failed: ${errors}`);
133
+ }
134
+ return result.data;
135
+ }
136
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Security utilities for path validation, network requests, and URL validation
3
+ */
4
+ /**
5
+ * Validates that a file path stays within the allowed directory (prevents path traversal)
6
+ */
7
+ export declare function validatePathWithinDirectory(filePath: string, allowedDir: string): string;
8
+ /**
9
+ * Sanitizes a filename to prevent path traversal and invalid characters
10
+ */
11
+ export declare function sanitizeFilename(filename: string, maxLength?: number): string;
12
+ /**
13
+ * Validates webhook URL for Slack or Discord (SSRF prevention)
14
+ */
15
+ export declare function validateWebhookUrl(url: string, allowedHosts: string[]): void;
16
+ export declare const SLACK_ALLOWED_HOSTS: string[];
17
+ export declare const DISCORD_ALLOWED_HOSTS: string[];
18
+ /**
19
+ * Fetch with timeout and retry support
20
+ */
21
+ export interface FetchWithRetryOptions {
22
+ timeout?: number;
23
+ maxRetries?: number;
24
+ retryDelay?: number;
25
+ retryStatusCodes?: number[];
26
+ }
27
+ export declare function fetchWithRetry(url: string, options?: RequestInit, retryOptions?: FetchWithRetryOptions): Promise<Response>;
28
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAaxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAQlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAiC5E;AAGD,eAAO,MAAM,mBAAmB,UAAsB,CAAC;AACvD,eAAO,MAAM,qBAAqB,UAAoC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,YAAY,GAAE,qBAA0B,GACvC,OAAO,CAAC,QAAQ,CAAC,CA2DnB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Security utilities for path validation, network requests, and URL validation
3
+ */
4
+ import * as path from 'path';
5
+ import { ToolError } from './errors.js';
6
+ /**
7
+ * Validates that a file path stays within the allowed directory (prevents path traversal)
8
+ */
9
+ export function validatePathWithinDirectory(filePath, allowedDir) {
10
+ const resolvedPath = path.resolve(filePath);
11
+ const resolvedAllowedDir = path.resolve(allowedDir);
12
+ if (!resolvedPath.startsWith(resolvedAllowedDir + path.sep) && resolvedPath !== resolvedAllowedDir) {
13
+ throw new ToolError('Path traversal detected: file path escapes allowed directory', 'VALIDATION_ERROR', { filePath, allowedDir });
14
+ }
15
+ return resolvedPath;
16
+ }
17
+ /**
18
+ * Sanitizes a filename to prevent path traversal and invalid characters
19
+ */
20
+ export function sanitizeFilename(filename, maxLength = 200) {
21
+ return filename
22
+ .replace(/\.\./g, '') // Remove parent directory references
23
+ .replace(/[<>:"/\\|?*\x00-\x1f]/g, '-') // Remove invalid characters
24
+ .replace(/\s+/g, '-') // Replace whitespace with dashes
25
+ .replace(/-+/g, '-') // Collapse multiple dashes
26
+ .replace(/^-|-$/g, '') // Remove leading/trailing dashes
27
+ .slice(0, maxLength);
28
+ }
29
+ /**
30
+ * Validates webhook URL for Slack or Discord (SSRF prevention)
31
+ */
32
+ export function validateWebhookUrl(url, allowedHosts) {
33
+ try {
34
+ const parsed = new URL(url);
35
+ // Must be HTTPS
36
+ if (parsed.protocol !== 'https:') {
37
+ throw new ToolError('Webhook URL must use HTTPS protocol', 'VALIDATION_ERROR', { url: url.slice(0, 50) });
38
+ }
39
+ // Must match allowed hosts
40
+ const isAllowed = allowedHosts.some(host => parsed.hostname === host || parsed.hostname.endsWith('.' + host));
41
+ if (!isAllowed) {
42
+ throw new ToolError(`Webhook URL must be from allowed hosts: ${allowedHosts.join(', ')}`, 'VALIDATION_ERROR', { hostname: parsed.hostname });
43
+ }
44
+ }
45
+ catch (error) {
46
+ if (error instanceof ToolError)
47
+ throw error;
48
+ throw new ToolError('Invalid webhook URL format', 'VALIDATION_ERROR', { url: url.slice(0, 50) });
49
+ }
50
+ }
51
+ // Allowed webhook hosts
52
+ export const SLACK_ALLOWED_HOSTS = ['hooks.slack.com'];
53
+ export const DISCORD_ALLOWED_HOSTS = ['discord.com', 'discordapp.com'];
54
+ export async function fetchWithRetry(url, options = {}, retryOptions = {}) {
55
+ const { timeout = 30000, maxRetries = 3, retryDelay = 1000, retryStatusCodes = [429, 500, 502, 503, 504] } = retryOptions;
56
+ let lastError = null;
57
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
58
+ const controller = new AbortController();
59
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
60
+ try {
61
+ const response = await fetch(url, {
62
+ ...options,
63
+ signal: controller.signal
64
+ });
65
+ clearTimeout(timeoutId);
66
+ // Check if we should retry
67
+ if (retryStatusCodes.includes(response.status) && attempt < maxRetries) {
68
+ // Get retry-after header if available
69
+ const retryAfter = response.headers.get('retry-after');
70
+ const delay = retryAfter
71
+ ? parseInt(retryAfter) * 1000
72
+ : retryDelay * Math.pow(2, attempt); // Exponential backoff
73
+ await sleep(delay);
74
+ continue;
75
+ }
76
+ return response;
77
+ }
78
+ catch (error) {
79
+ clearTimeout(timeoutId);
80
+ if (error instanceof Error) {
81
+ if (error.name === 'AbortError') {
82
+ lastError = new ToolError(`Request timed out after ${timeout}ms`, 'TIMEOUT', { url: url.slice(0, 100), attempt });
83
+ }
84
+ else {
85
+ lastError = error;
86
+ }
87
+ }
88
+ // Retry on network errors
89
+ if (attempt < maxRetries) {
90
+ await sleep(retryDelay * Math.pow(2, attempt));
91
+ continue;
92
+ }
93
+ }
94
+ }
95
+ throw lastError || new ToolError('Request failed after retries', 'NETWORK_ERROR');
96
+ }
97
+ /**
98
+ * Sleep utility for retry delays
99
+ */
100
+ function sleep(ms) {
101
+ return new Promise(resolve => setTimeout(resolve, ms));
102
+ }
103
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/core/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB,EAAE,UAAkB;IAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,KAAK,kBAAkB,EAAE,CAAC;QACnG,MAAM,IAAI,SAAS,CACjB,8DAA8D,EAC9D,kBAAkB,EAClB,EAAE,QAAQ,EAAE,UAAU,EAAE,CACzB,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,YAAoB,GAAG;IACxE,OAAO,QAAQ;SACZ,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAW,qCAAqC;SACpE,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAE,4BAA4B;SACpE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAW,iCAAiC;SAChE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAY,2BAA2B;SAC1D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAU,iCAAiC;SAChE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,YAAsB;IACpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,gBAAgB;QAChB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,SAAS,CACjB,qCAAqC,EACrC,kBAAkB,EAClB,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzC,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,CACjE,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CACjB,2CAA2C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpE,kBAAkB,EAClB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,KAAK,CAAC;QAC5C,MAAM,IAAI,SAAS,CACjB,4BAA4B,EAC5B,kBAAkB,EAClB,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAYvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,UAAuB,EAAE,EACzB,eAAsC,EAAE;IAExC,MAAM,EACJ,OAAO,GAAG,KAAK,EACf,UAAU,GAAG,CAAC,EACd,UAAU,GAAG,IAAI,EACjB,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7C,GAAG,YAAY,CAAC;IAEjB,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,GAAG,OAAO;gBACV,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,2BAA2B;YAC3B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACvE,sCAAsC;gBACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,UAAU;oBACtB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI;oBAC7B,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB;gBAE7D,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAChC,SAAS,GAAG,IAAI,SAAS,CACvB,2BAA2B,OAAO,IAAI,EACtC,SAAS,EACT,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CACpC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,SAAS,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAUA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ import express from 'express';
3
+ import cors from 'cors';
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
+ import 'dotenv/config';
8
+ // Core
9
+ import { createErrorResponse, ToolError } from './core/errors.js';
10
+ import { validateInput, CollectCodeContextSchema, SummarizeDesignDecisionsSchema, GenerateDevDocumentSchema, NormalizeForPlatformSchema, PublishDocumentSchema, CreateSessionLogSchema, AnalyzeCodeSchema, } from './core/schemas.js';
11
+ // Tools
12
+ import { collectCodeContext, collectCodeContextSchema } from './tools/collectCodeContext.js';
13
+ import { summarizeDesignDecisions, summarizeDesignDecisionsSchema } from './tools/summarizeDesignDecisions.js';
14
+ import { generateDevDocument, generateDevDocumentSchema } from './tools/generateDevDocument.js';
15
+ import { normalizeForPlatform, normalizeForPlatformSchema } from './tools/normalizeForPlatform.js';
16
+ import { publishDocument, publishDocumentSchema } from './tools/publishDocument.js';
17
+ import { createSessionLog, createSessionLogSchema } from './tools/createSessionLog.js';
18
+ import { analyzeCodeTool, analyzeCodeSchema } from './tools/analyzeCode.js';
19
+ const app = express();
20
+ const PORT = process.env.PORT || 3000;
21
+ // Middleware
22
+ app.use(cors());
23
+ app.use(express.json());
24
+ // Store active transports
25
+ const transports = new Map();
26
+ // Tool handlers with validation
27
+ const toolHandlers = {
28
+ muse_collect_code_context: (args) => {
29
+ const validated = validateInput(CollectCodeContextSchema, args);
30
+ return collectCodeContext(validated);
31
+ },
32
+ muse_summarize_design_decisions: (args) => {
33
+ const validated = validateInput(SummarizeDesignDecisionsSchema, args);
34
+ return summarizeDesignDecisions(validated);
35
+ },
36
+ muse_generate_dev_document: (args) => {
37
+ const validated = validateInput(GenerateDevDocumentSchema, args);
38
+ return generateDevDocument(validated);
39
+ },
40
+ muse_normalize_for_platform: (args) => {
41
+ const validated = validateInput(NormalizeForPlatformSchema, args);
42
+ return normalizeForPlatform(validated);
43
+ },
44
+ muse_publish_document: async (args) => {
45
+ const validated = validateInput(PublishDocumentSchema, args);
46
+ return publishDocument(validated);
47
+ },
48
+ muse_create_session_log: async (args) => {
49
+ const validated = validateInput(CreateSessionLogSchema, args);
50
+ return createSessionLog(validated);
51
+ },
52
+ muse_analyze_code: (args) => {
53
+ const validated = validateInput(AnalyzeCodeSchema, args);
54
+ return analyzeCodeTool(validated);
55
+ },
56
+ };
57
+ function isValidToolName(name) {
58
+ return name in toolHandlers;
59
+ }
60
+ // Create MCP Server instance
61
+ function createMCPServer() {
62
+ const server = new Server({
63
+ name: 'vibe-coding-mcp',
64
+ version: '2.0.0',
65
+ }, {
66
+ capabilities: {
67
+ tools: {},
68
+ },
69
+ });
70
+ // List available tools
71
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
72
+ return {
73
+ tools: [
74
+ collectCodeContextSchema,
75
+ summarizeDesignDecisionsSchema,
76
+ generateDevDocumentSchema,
77
+ normalizeForPlatformSchema,
78
+ publishDocumentSchema,
79
+ createSessionLogSchema,
80
+ analyzeCodeSchema,
81
+ ],
82
+ };
83
+ });
84
+ // Handle tool calls
85
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
86
+ const { name, arguments: args } = request.params;
87
+ try {
88
+ if (!isValidToolName(name)) {
89
+ throw new ToolError(`Unknown tool: ${name}`, 'NOT_FOUND', { tool: name });
90
+ }
91
+ const handler = toolHandlers[name];
92
+ const result = await handler(args);
93
+ return {
94
+ content: [
95
+ {
96
+ type: 'text',
97
+ text: JSON.stringify(result, null, 2),
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ catch (error) {
103
+ return createErrorResponse(error);
104
+ }
105
+ });
106
+ return server;
107
+ }
108
+ // Health check endpoint
109
+ app.get('/', (_req, res) => {
110
+ res.json({
111
+ name: 'vibe-coding-mcp',
112
+ version: '2.0.0',
113
+ description: 'MCP server for vibe coding documentation - Enhanced with AST analysis, Mermaid diagrams, multi-language support',
114
+ status: 'running',
115
+ tools: Object.keys(toolHandlers),
116
+ features: [
117
+ 'AST parsing (TypeScript, Python, Go)',
118
+ 'Mermaid diagram generation',
119
+ 'Multi-language support (Korean/English)',
120
+ 'Multiple document types (README, DESIGN, TUTORIAL, CHANGELOG, API, ARCHITECTURE)',
121
+ 'Multiple platforms (Notion, GitHub Wiki, Obsidian, Confluence, Slack, Discord)',
122
+ 'Input validation with Zod',
123
+ 'Structured error handling'
124
+ ]
125
+ });
126
+ });
127
+ // SSE endpoint for MCP connection
128
+ app.get('/sse', async (_req, res) => {
129
+ console.log('New SSE connection established');
130
+ const transport = new SSEServerTransport('/message', res);
131
+ const sessionId = crypto.randomUUID();
132
+ transports.set(sessionId, transport);
133
+ const server = createMCPServer();
134
+ res.on('close', () => {
135
+ console.log('SSE connection closed');
136
+ transports.delete(sessionId);
137
+ });
138
+ await server.connect(transport);
139
+ });
140
+ // Message endpoint for MCP communication
141
+ app.post('/message', async (req, res) => {
142
+ const sessionId = req.query.sessionId;
143
+ if (!sessionId) {
144
+ // Handle direct message without session
145
+ const transport = Array.from(transports.values())[0];
146
+ if (transport) {
147
+ await transport.handlePostMessage(req, res);
148
+ }
149
+ else {
150
+ res.status(400).json({ error: 'No active session' });
151
+ }
152
+ return;
153
+ }
154
+ const transport = transports.get(sessionId);
155
+ if (transport) {
156
+ await transport.handlePostMessage(req, res);
157
+ }
158
+ else {
159
+ res.status(404).json({ error: 'Session not found' });
160
+ }
161
+ });
162
+ // Start server
163
+ app.listen(PORT, () => {
164
+ console.log(`Vibe Coding MCP Server v2.0.0 running on http://localhost:${PORT}`);
165
+ console.log(`SSE endpoint: http://localhost:${PORT}/sse`);
166
+ console.log(`Message endpoint: http://localhost:${PORT}/message`);
167
+ });
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Confluence 발행 플랫폼
3
+ */
4
+ import { PublishOptions, PublishResult } from '../types/index.js';
5
+ export interface ConfluenceConfig {
6
+ baseUrl: string;
7
+ username: string;
8
+ apiToken: string;
9
+ spaceKey: string;
10
+ }
11
+ export declare function publishToConfluence(document: string, title: string, options?: Partial<PublishOptions>): Promise<PublishResult>;
12
+ export declare function updateConfluencePage(pageId: string, document: string, title: string): Promise<PublishResult>;
13
+ //# sourceMappingURL=confluence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.d.ts","sourceRoot":"","sources":["../../src/platforms/confluence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsFD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAsDxB;AAGD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CA6DxB"}