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,178 @@
1
+ /**
2
+ * Confluence 발행 플랫폼
3
+ */
4
+ import { fetchWithRetry } from '../core/security.js';
5
+ function getConfluenceConfig() {
6
+ const baseUrl = process.env.CONFLUENCE_BASE_URL;
7
+ const username = process.env.CONFLUENCE_USERNAME;
8
+ const apiToken = process.env.CONFLUENCE_API_TOKEN;
9
+ const spaceKey = process.env.CONFLUENCE_SPACE_KEY;
10
+ if (!baseUrl || !username || !apiToken || !spaceKey) {
11
+ throw new Error('Confluence configuration incomplete. Required: CONFLUENCE_BASE_URL, CONFLUENCE_USERNAME, CONFLUENCE_API_TOKEN, CONFLUENCE_SPACE_KEY');
12
+ }
13
+ return { baseUrl, username, apiToken, spaceKey };
14
+ }
15
+ // 마크다운을 Confluence Storage Format으로 변환
16
+ function markdownToConfluenceStorage(markdown) {
17
+ let storage = markdown;
18
+ // 헤딩
19
+ storage = storage.replace(/^######\s+(.+)$/gm, '<h6>$1</h6>');
20
+ storage = storage.replace(/^#####\s+(.+)$/gm, '<h5>$1</h5>');
21
+ storage = storage.replace(/^####\s+(.+)$/gm, '<h4>$1</h4>');
22
+ storage = storage.replace(/^###\s+(.+)$/gm, '<h3>$1</h3>');
23
+ storage = storage.replace(/^##\s+(.+)$/gm, '<h2>$1</h2>');
24
+ storage = storage.replace(/^#\s+(.+)$/gm, '<h1>$1</h1>');
25
+ // 코드 블록
26
+ storage = storage.replace(/```(\w+)?\n([\s\S]*?)```/g, (_, lang, code) => {
27
+ const language = lang || 'none';
28
+ return `<ac:structured-macro ac:name="code"><ac:parameter ac:name="language">${language}</ac:parameter><ac:plain-text-body><![CDATA[${code.trim()}]]></ac:plain-text-body></ac:structured-macro>`;
29
+ });
30
+ // 인라인 코드
31
+ storage = storage.replace(/`([^`]+)`/g, '<code>$1</code>');
32
+ // 볼드
33
+ storage = storage.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
34
+ // 이탤릭
35
+ storage = storage.replace(/\*([^*]+)\*/g, '<em>$1</em>');
36
+ // 링크
37
+ storage = storage.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
38
+ // 불릿 리스트
39
+ const bulletListRegex = /^[-*]\s+(.+)$/gm;
40
+ let hasOpenUl = false;
41
+ storage = storage.replace(bulletListRegex, (match, content) => {
42
+ if (!hasOpenUl) {
43
+ hasOpenUl = true;
44
+ return `<ul><li>${content}</li>`;
45
+ }
46
+ return `<li>${content}</li>`;
47
+ });
48
+ if (hasOpenUl) {
49
+ storage += '</ul>';
50
+ }
51
+ // 번호 리스트
52
+ const numberedListRegex = /^\d+\.\s+(.+)$/gm;
53
+ let hasOpenOl = false;
54
+ storage = storage.replace(numberedListRegex, (match, content) => {
55
+ if (!hasOpenOl) {
56
+ hasOpenOl = true;
57
+ return `<ol><li>${content}</li>`;
58
+ }
59
+ return `<li>${content}</li>`;
60
+ });
61
+ if (hasOpenOl) {
62
+ storage += '</ol>';
63
+ }
64
+ // 인용
65
+ storage = storage.replace(/^>\s+(.+)$/gm, '<blockquote>$1</blockquote>');
66
+ // 구분선
67
+ storage = storage.replace(/^---+$/gm, '<hr />');
68
+ // 줄바꿈
69
+ storage = storage.replace(/\n\n/g, '</p><p>');
70
+ storage = `<p>${storage}</p>`;
71
+ return storage;
72
+ }
73
+ export async function publishToConfluence(document, title, options) {
74
+ try {
75
+ const config = getConfluenceConfig();
76
+ const storage = markdownToConfluenceStorage(document);
77
+ const auth = Buffer.from(`${config.username}:${config.apiToken}`).toString('base64');
78
+ const parentId = options?.parentPageId;
79
+ const body = {
80
+ type: 'page',
81
+ title,
82
+ space: { key: config.spaceKey },
83
+ body: {
84
+ storage: {
85
+ value: storage,
86
+ representation: 'storage'
87
+ }
88
+ }
89
+ };
90
+ if (parentId) {
91
+ body.ancestors = [{ id: parentId }];
92
+ }
93
+ const response = await fetchWithRetry(`${config.baseUrl}/wiki/rest/api/content`, {
94
+ method: 'POST',
95
+ headers: {
96
+ 'Authorization': `Basic ${auth}`,
97
+ 'Content-Type': 'application/json',
98
+ 'Accept': 'application/json'
99
+ },
100
+ body: JSON.stringify(body)
101
+ }, { timeout: 30000, maxRetries: 3 });
102
+ if (!response.ok) {
103
+ const error = await response.text();
104
+ throw new Error(`Confluence API error: ${response.status} - ${error}`);
105
+ }
106
+ const result = await response.json();
107
+ return {
108
+ success: true,
109
+ platform: 'confluence',
110
+ url: `${config.baseUrl}/wiki${result._links.webui}`
111
+ };
112
+ }
113
+ catch (error) {
114
+ return {
115
+ success: false,
116
+ platform: 'confluence',
117
+ error: error instanceof Error ? error.message : 'Failed to publish to Confluence'
118
+ };
119
+ }
120
+ }
121
+ // 기존 페이지 업데이트
122
+ export async function updateConfluencePage(pageId, document, title) {
123
+ try {
124
+ const config = getConfluenceConfig();
125
+ const storage = markdownToConfluenceStorage(document);
126
+ const auth = Buffer.from(`${config.username}:${config.apiToken}`).toString('base64');
127
+ // 현재 버전 가져오기
128
+ const currentResponse = await fetchWithRetry(`${config.baseUrl}/wiki/rest/api/content/${pageId}`, {
129
+ headers: {
130
+ 'Authorization': `Basic ${auth}`,
131
+ 'Accept': 'application/json'
132
+ }
133
+ }, { timeout: 30000, maxRetries: 3 });
134
+ if (!currentResponse.ok) {
135
+ throw new Error('Failed to get current page');
136
+ }
137
+ const currentPage = await currentResponse.json();
138
+ const newVersion = currentPage.version.number + 1;
139
+ // 업데이트
140
+ const response = await fetchWithRetry(`${config.baseUrl}/wiki/rest/api/content/${pageId}`, {
141
+ method: 'PUT',
142
+ headers: {
143
+ 'Authorization': `Basic ${auth}`,
144
+ 'Content-Type': 'application/json',
145
+ 'Accept': 'application/json'
146
+ },
147
+ body: JSON.stringify({
148
+ type: 'page',
149
+ title,
150
+ body: {
151
+ storage: {
152
+ value: storage,
153
+ representation: 'storage'
154
+ }
155
+ },
156
+ version: { number: newVersion }
157
+ })
158
+ }, { timeout: 30000, maxRetries: 3 });
159
+ if (!response.ok) {
160
+ const error = await response.text();
161
+ throw new Error(`Confluence API error: ${response.status} - ${error}`);
162
+ }
163
+ const result = await response.json();
164
+ return {
165
+ success: true,
166
+ platform: 'confluence',
167
+ url: `${config.baseUrl}/wiki${result._links.webui}`
168
+ };
169
+ }
170
+ catch (error) {
171
+ return {
172
+ success: false,
173
+ platform: 'confluence',
174
+ error: error instanceof Error ? error.message : 'Failed to update Confluence page'
175
+ };
176
+ }
177
+ }
178
+ //# sourceMappingURL=confluence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../src/platforms/confluence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Discord 웹훅 알림
3
+ */
4
+ export interface DiscordNotificationOptions {
5
+ webhookUrl?: string;
6
+ username?: string;
7
+ avatarUrl?: string;
8
+ }
9
+ export interface DiscordNotificationResult {
10
+ success: boolean;
11
+ error?: string;
12
+ }
13
+ export interface DiscordEmbed {
14
+ title?: string;
15
+ description?: string;
16
+ url?: string;
17
+ color?: number;
18
+ fields?: {
19
+ name: string;
20
+ value: string;
21
+ inline?: boolean;
22
+ }[];
23
+ footer?: {
24
+ text: string;
25
+ icon_url?: string;
26
+ };
27
+ timestamp?: string;
28
+ thumbnail?: {
29
+ url: string;
30
+ };
31
+ author?: {
32
+ name: string;
33
+ url?: string;
34
+ icon_url?: string;
35
+ };
36
+ }
37
+ export declare function sendDiscordNotification(message: string, options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
38
+ export declare function sendDiscordEmbed(embeds: DiscordEmbed[], options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
39
+ export declare function sendDocumentPublishedNotificationDiscord(title: string, url: string, platform: string, description?: string, options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
40
+ export declare function sendSessionSummaryNotificationDiscord(sessionId: string, summary: string, stats: {
41
+ files: number;
42
+ functions: number;
43
+ classes: number;
44
+ complexity?: number;
45
+ }, options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
46
+ export declare function sendErrorNotificationDiscord(errorTitle: string, errorMessage: string, context?: string, options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
47
+ export declare function sendCodeAnalysisNotificationDiscord(filename: string, analysis: {
48
+ functions: number;
49
+ classes: number;
50
+ imports: number;
51
+ complexity: number;
52
+ insights: string[];
53
+ }, options?: DiscordNotificationOptions): Promise<DiscordNotificationResult>;
54
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../src/platforms/discord.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC7D,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAWD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CA2CpC;AAGD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CA2CpC;AAGD,wBAAsB,wCAAwC,CAC5D,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAoBpC;AAGD,wBAAsB,qCAAqC,CACzD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACjF,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAwBpC;AAGD,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAgBpC;AAGD,wBAAsB,mCAAmC,CACvD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,EACD,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CA2BpC"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Discord 웹훅 알림
3
+ */
4
+ import { fetchWithRetry, validateWebhookUrl, DISCORD_ALLOWED_HOSTS } from '../core/security.js';
5
+ // 색상 상수
6
+ const COLORS = {
7
+ success: 0x00ff00, // 녹색
8
+ info: 0x0099ff, // 파랑
9
+ warning: 0xffcc00, // 노랑
10
+ error: 0xff0000, // 빨강
11
+ primary: 0x5865f2 // Discord 블루
12
+ };
13
+ export async function sendDiscordNotification(message, options = {}) {
14
+ try {
15
+ const webhookUrl = options.webhookUrl || process.env.DISCORD_WEBHOOK_URL;
16
+ if (!webhookUrl) {
17
+ throw new Error('DISCORD_WEBHOOK_URL is not set');
18
+ }
19
+ // Validate webhook URL (SSRF prevention)
20
+ validateWebhookUrl(webhookUrl, DISCORD_ALLOWED_HOSTS);
21
+ const payload = {
22
+ content: message
23
+ };
24
+ if (options.username) {
25
+ payload.username = options.username;
26
+ }
27
+ if (options.avatarUrl) {
28
+ payload.avatar_url = options.avatarUrl;
29
+ }
30
+ // Use fetchWithRetry for timeout and retry support
31
+ const response = await fetchWithRetry(webhookUrl, {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Content-Type': 'application/json'
35
+ },
36
+ body: JSON.stringify(payload)
37
+ }, { timeout: 30000, maxRetries: 3 });
38
+ if (!response.ok) {
39
+ throw new Error(`Discord webhook error: ${response.status}`);
40
+ }
41
+ return { success: true };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ error: error instanceof Error ? error.message : 'Failed to send Discord notification'
47
+ };
48
+ }
49
+ }
50
+ // 임베드 메시지 전송
51
+ export async function sendDiscordEmbed(embeds, options = {}) {
52
+ try {
53
+ const webhookUrl = options.webhookUrl || process.env.DISCORD_WEBHOOK_URL;
54
+ if (!webhookUrl) {
55
+ throw new Error('DISCORD_WEBHOOK_URL is not set');
56
+ }
57
+ // Validate webhook URL (SSRF prevention)
58
+ validateWebhookUrl(webhookUrl, DISCORD_ALLOWED_HOSTS);
59
+ const payload = {
60
+ embeds
61
+ };
62
+ if (options.username) {
63
+ payload.username = options.username;
64
+ }
65
+ if (options.avatarUrl) {
66
+ payload.avatar_url = options.avatarUrl;
67
+ }
68
+ // Use fetchWithRetry for timeout and retry support
69
+ const response = await fetchWithRetry(webhookUrl, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Content-Type': 'application/json'
73
+ },
74
+ body: JSON.stringify(payload)
75
+ }, { timeout: 30000, maxRetries: 3 });
76
+ if (!response.ok) {
77
+ throw new Error(`Discord webhook error: ${response.status}`);
78
+ }
79
+ return { success: true };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ success: false,
84
+ error: error instanceof Error ? error.message : 'Failed to send Discord embed'
85
+ };
86
+ }
87
+ }
88
+ // 문서 발행 알림
89
+ export async function sendDocumentPublishedNotificationDiscord(title, url, platform, description, options = {}) {
90
+ const embed = {
91
+ title: '📄 새 문서가 발행되었습니다',
92
+ description: description || `**${title}**가 ${platform}에 발행되었습니다.`,
93
+ url,
94
+ color: COLORS.success,
95
+ fields: [
96
+ { name: '제목', value: title, inline: true },
97
+ { name: '플랫폼', value: platform, inline: true }
98
+ ],
99
+ footer: {
100
+ text: '🤖 Vibe Coding MCP'
101
+ },
102
+ timestamp: new Date().toISOString()
103
+ };
104
+ return sendDiscordEmbed([embed], {
105
+ ...options,
106
+ username: options.username || 'Vibe Coding MCP'
107
+ });
108
+ }
109
+ // 세션 요약 알림
110
+ export async function sendSessionSummaryNotificationDiscord(sessionId, summary, stats, options = {}) {
111
+ const embed = {
112
+ title: '🎯 코딩 세션 요약',
113
+ description: summary,
114
+ color: COLORS.info,
115
+ fields: [
116
+ { name: '📁 파일', value: `${stats.files}`, inline: true },
117
+ { name: '⚡ 함수', value: `${stats.functions}`, inline: true },
118
+ { name: '🏗️ 클래스', value: `${stats.classes}`, inline: true }
119
+ ],
120
+ footer: {
121
+ text: `세션 ID: ${sessionId.slice(0, 8)}... | 🤖 Vibe Coding MCP`
122
+ },
123
+ timestamp: new Date().toISOString()
124
+ };
125
+ if (stats.complexity !== undefined) {
126
+ embed.fields?.push({ name: '🔄 복잡도', value: `${stats.complexity}`, inline: true });
127
+ }
128
+ return sendDiscordEmbed([embed], {
129
+ ...options,
130
+ username: options.username || 'Vibe Coding MCP'
131
+ });
132
+ }
133
+ // 에러 알림
134
+ export async function sendErrorNotificationDiscord(errorTitle, errorMessage, context, options = {}) {
135
+ const embed = {
136
+ title: `❌ ${errorTitle}`,
137
+ description: errorMessage,
138
+ color: COLORS.error,
139
+ fields: context ? [{ name: '컨텍스트', value: context }] : undefined,
140
+ footer: {
141
+ text: '🤖 Vibe Coding MCP'
142
+ },
143
+ timestamp: new Date().toISOString()
144
+ };
145
+ return sendDiscordEmbed([embed], {
146
+ ...options,
147
+ username: options.username || 'Vibe Coding MCP'
148
+ });
149
+ }
150
+ // 코드 분석 결과 알림
151
+ export async function sendCodeAnalysisNotificationDiscord(filename, analysis, options = {}) {
152
+ const complexityColor = analysis.complexity > 20 ? COLORS.error :
153
+ analysis.complexity > 10 ? COLORS.warning : COLORS.success;
154
+ const embed = {
155
+ title: `🔍 코드 분석: ${filename}`,
156
+ color: complexityColor,
157
+ fields: [
158
+ { name: '⚡ 함수', value: `${analysis.functions}`, inline: true },
159
+ { name: '🏗️ 클래스', value: `${analysis.classes}`, inline: true },
160
+ { name: '📦 임포트', value: `${analysis.imports}`, inline: true },
161
+ { name: '🔄 복잡도', value: `${analysis.complexity}`, inline: true }
162
+ ],
163
+ footer: {
164
+ text: '🤖 Vibe Coding MCP'
165
+ },
166
+ timestamp: new Date().toISOString()
167
+ };
168
+ if (analysis.insights.length > 0) {
169
+ embed.description = analysis.insights.map(i => `• ${i}`).join('\n');
170
+ }
171
+ return sendDiscordEmbed([embed], {
172
+ ...options,
173
+ username: options.username || 'Vibe Coding MCP'
174
+ });
175
+ }
176
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/platforms/discord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PublishOptions, PublishResult } from '../types/index.js';
2
+ export declare function publishToGitHubWiki(document: string, title: string, options?: Partial<PublishOptions>): Promise<PublishResult>;
3
+ //# sourceMappingURL=github-wiki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-wiki.d.ts","sourceRoot":"","sources":["../../src/platforms/github-wiki.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAoDlE,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAqFxB"}
@@ -0,0 +1,120 @@
1
+ import { spawn } from 'child_process';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ /**
6
+ * Executes a git command safely using spawn (no shell injection risk)
7
+ */
8
+ function execGit(args, cwd) {
9
+ return new Promise((resolve, reject) => {
10
+ const proc = spawn('git', args, {
11
+ cwd,
12
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }
13
+ });
14
+ let stdout = '';
15
+ let stderr = '';
16
+ proc.stdout.on('data', (data) => {
17
+ stdout += data.toString();
18
+ });
19
+ proc.stderr.on('data', (data) => {
20
+ stderr += data.toString();
21
+ });
22
+ proc.on('close', (code) => {
23
+ if (code === 0) {
24
+ resolve({ stdout, stderr });
25
+ }
26
+ else {
27
+ reject(new Error(`Git command failed (code ${code}): ${stderr || stdout}`));
28
+ }
29
+ });
30
+ proc.on('error', (err) => {
31
+ reject(new Error(`Failed to spawn git: ${err.message}`));
32
+ });
33
+ });
34
+ }
35
+ /**
36
+ * Sanitizes filename to prevent path traversal
37
+ */
38
+ function sanitizeFilename(filename) {
39
+ return filename
40
+ .replace(/\.\./g, '')
41
+ .replace(/[<>:"/\\|?*]/g, '-')
42
+ .replace(/\s+/g, '-')
43
+ .slice(0, 200);
44
+ }
45
+ export async function publishToGitHubWiki(document, title, options) {
46
+ const tempDir = path.join(os.tmpdir(), `wiki-${Date.now()}-${Math.random().toString(36).slice(2)}`);
47
+ try {
48
+ const githubToken = process.env.GITHUB_TOKEN;
49
+ const githubRepo = process.env.GITHUB_REPO;
50
+ if (!githubToken) {
51
+ throw new Error('GITHUB_TOKEN environment variable is not set');
52
+ }
53
+ if (!githubRepo) {
54
+ throw new Error('GITHUB_REPO environment variable is not set (format: owner/repo)');
55
+ }
56
+ // Validate repo format
57
+ const repoMatch = githubRepo.match(/^([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_.-]+)$/);
58
+ if (!repoMatch) {
59
+ throw new Error('Invalid GITHUB_REPO format. Expected: owner/repo');
60
+ }
61
+ const [, owner, repo] = repoMatch;
62
+ // Sanitize filename
63
+ const safeTitle = sanitizeFilename(title);
64
+ const filename = options?.filename || `${safeTitle}.md`;
65
+ const wikiPath = options?.wikiPath ? sanitizeFilename(options.wikiPath) : '';
66
+ // Clone wiki repo
67
+ const wikiUrl = `https://${githubToken}@github.com/${owner}/${repo}.wiki.git`;
68
+ await execGit(['clone', '--depth', '1', wikiUrl, tempDir]);
69
+ // Set file path
70
+ const filePath = wikiPath
71
+ ? path.join(tempDir, wikiPath, filename)
72
+ : path.join(tempDir, filename);
73
+ // Ensure path is within tempDir (prevent path traversal)
74
+ const resolvedPath = path.resolve(filePath);
75
+ if (!resolvedPath.startsWith(path.resolve(tempDir))) {
76
+ throw new Error('Invalid file path: path traversal detected');
77
+ }
78
+ // Create directory if needed
79
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
80
+ // Write file
81
+ await fs.writeFile(filePath, document, 'utf-8');
82
+ // Git operations
83
+ await execGit(['add', '-A'], tempDir);
84
+ await execGit(['config', 'user.email', 'mcp@vibe-coding.local'], tempDir);
85
+ await execGit(['config', 'user.name', 'Vibe Coding MCP'], tempDir);
86
+ await execGit(['commit', '-m', `Update: ${safeTitle}`, '--allow-empty'], tempDir);
87
+ // Try pushing to master, then main
88
+ try {
89
+ await execGit(['push', 'origin', 'master'], tempDir);
90
+ }
91
+ catch {
92
+ await execGit(['push', 'origin', 'main'], tempDir);
93
+ }
94
+ // Generate wiki URL
95
+ const wikiPageName = filename.replace('.md', '');
96
+ const wikiViewUrl = `https://github.com/${owner}/${repo}/wiki/${encodeURIComponent(wikiPageName)}`;
97
+ return {
98
+ success: true,
99
+ platform: 'github-wiki',
100
+ url: wikiViewUrl
101
+ };
102
+ }
103
+ catch (error) {
104
+ return {
105
+ success: false,
106
+ platform: 'github-wiki',
107
+ error: error instanceof Error ? error.message : 'Failed to publish to GitHub Wiki'
108
+ };
109
+ }
110
+ finally {
111
+ // Always cleanup temp directory
112
+ try {
113
+ await fs.rm(tempDir, { recursive: true, force: true });
114
+ }
115
+ catch {
116
+ // Ignore cleanup errors
117
+ }
118
+ }
119
+ }
120
+ //# sourceMappingURL=github-wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-wiki.js","sourceRoot":"","sources":["../../src/platforms/github-wiki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PublishOptions, PublishResult } from '../types/index.js';
2
+ export declare function publishToNotion(document: string, title: string, options?: Partial<PublishOptions>): Promise<PublishResult>;
3
+ //# sourceMappingURL=notion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/platforms/notion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAuKlE,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAqDxB"}