mycontext-cli 2.0.25 → 2.0.27

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 (105) hide show
  1. package/README.md +184 -37
  2. package/dist/cli.js +92 -80
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/build-app.d.ts +6 -1
  5. package/dist/commands/build-app.d.ts.map +1 -1
  6. package/dist/commands/build-app.js +97 -9
  7. package/dist/commands/build-app.js.map +1 -1
  8. package/dist/commands/compile-prd.d.ts.map +1 -1
  9. package/dist/commands/compile-prd.js +7 -0
  10. package/dist/commands/compile-prd.js.map +1 -1
  11. package/dist/commands/export-progress.d.ts +34 -0
  12. package/dist/commands/export-progress.d.ts.map +1 -0
  13. package/dist/commands/export-progress.js +552 -0
  14. package/dist/commands/export-progress.js.map +1 -0
  15. package/dist/commands/generate-context-files.d.ts.map +1 -1
  16. package/dist/commands/generate-context-files.js +10 -2
  17. package/dist/commands/generate-context-files.js.map +1 -1
  18. package/dist/commands/generate.d.ts +8 -1
  19. package/dist/commands/generate.d.ts.map +1 -1
  20. package/dist/commands/generate.js +212 -0
  21. package/dist/commands/generate.js.map +1 -1
  22. package/dist/commands/help.d.ts +17 -0
  23. package/dist/commands/help.d.ts.map +1 -0
  24. package/dist/commands/help.js +329 -0
  25. package/dist/commands/help.js.map +1 -0
  26. package/dist/commands/import-project-plan.d.ts +27 -0
  27. package/dist/commands/import-project-plan.d.ts.map +1 -0
  28. package/dist/commands/import-project-plan.js +411 -0
  29. package/dist/commands/import-project-plan.js.map +1 -0
  30. package/dist/commands/pm-integration.d.ts +18 -0
  31. package/dist/commands/pm-integration.d.ts.map +1 -0
  32. package/dist/commands/pm-integration.js +385 -0
  33. package/dist/commands/pm-integration.js.map +1 -0
  34. package/dist/commands/setup-complete.d.ts +16 -0
  35. package/dist/commands/setup-complete.d.ts.map +1 -0
  36. package/dist/commands/setup-complete.js +468 -0
  37. package/dist/commands/setup-complete.js.map +1 -0
  38. package/dist/commands/setup-shadcn.d.ts +20 -0
  39. package/dist/commands/setup-shadcn.d.ts.map +1 -0
  40. package/dist/commands/setup-shadcn.js +241 -0
  41. package/dist/commands/setup-shadcn.js.map +1 -0
  42. package/dist/commands/suggest.d.ts +15 -0
  43. package/dist/commands/suggest.d.ts.map +1 -0
  44. package/dist/commands/suggest.js +288 -0
  45. package/dist/commands/suggest.js.map +1 -0
  46. package/dist/commands/update.d.ts +0 -4
  47. package/dist/commands/update.d.ts.map +1 -1
  48. package/dist/commands/update.js +7 -197
  49. package/dist/commands/update.js.map +1 -1
  50. package/dist/commands/workflow.d.ts +16 -0
  51. package/dist/commands/workflow.d.ts.map +1 -0
  52. package/dist/commands/workflow.js +464 -0
  53. package/dist/commands/workflow.js.map +1 -0
  54. package/dist/package.json +1 -1
  55. package/dist/services/PMIntegrationService.d.ts +46 -0
  56. package/dist/services/PMIntegrationService.d.ts.map +1 -0
  57. package/dist/services/PMIntegrationService.js +363 -0
  58. package/dist/services/PMIntegrationService.js.map +1 -0
  59. package/dist/services/WebhookServer.d.ts +37 -0
  60. package/dist/services/WebhookServer.d.ts.map +1 -0
  61. package/dist/services/WebhookServer.js +231 -0
  62. package/dist/services/WebhookServer.js.map +1 -0
  63. package/dist/types/index.d.ts +1 -0
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/types/index.js +2 -0
  66. package/dist/types/index.js.map +1 -1
  67. package/dist/types/pm-integration.d.ts +241 -0
  68. package/dist/types/pm-integration.d.ts.map +1 -0
  69. package/dist/types/pm-integration.js +24 -0
  70. package/dist/types/pm-integration.js.map +1 -0
  71. package/dist/utils/NextJSProjectValidator.d.ts.map +1 -1
  72. package/dist/utils/NextJSProjectValidator.js +14 -7
  73. package/dist/utils/NextJSProjectValidator.js.map +1 -1
  74. package/dist/utils/ProjectStateAnalyzer.d.ts +46 -0
  75. package/dist/utils/ProjectStateAnalyzer.d.ts.map +1 -0
  76. package/dist/utils/ProjectStateAnalyzer.js +311 -0
  77. package/dist/utils/ProjectStateAnalyzer.js.map +1 -0
  78. package/dist/utils/ProjectStructureValidator.d.ts +12 -0
  79. package/dist/utils/ProjectStructureValidator.d.ts.map +1 -1
  80. package/dist/utils/ProjectStructureValidator.js +111 -14
  81. package/dist/utils/ProjectStructureValidator.js.map +1 -1
  82. package/dist/utils/claudeAgentClient.d.ts +4 -0
  83. package/dist/utils/claudeAgentClient.d.ts.map +1 -1
  84. package/dist/utils/claudeAgentClient.js +90 -20
  85. package/dist/utils/claudeAgentClient.js.map +1 -1
  86. package/dist/utils/errorHandler.d.ts +31 -74
  87. package/dist/utils/errorHandler.d.ts.map +1 -1
  88. package/dist/utils/errorHandler.js +190 -276
  89. package/dist/utils/errorHandler.js.map +1 -1
  90. package/dist/utils/hybridAIClient.js +1 -1
  91. package/dist/utils/hybridAIClient.js.map +1 -1
  92. package/dist/utils/mcpTools.d.ts +9 -9
  93. package/dist/utils/nextStepsSuggester.d.ts +52 -0
  94. package/dist/utils/nextStepsSuggester.d.ts.map +1 -0
  95. package/dist/utils/nextStepsSuggester.js +438 -0
  96. package/dist/utils/nextStepsSuggester.js.map +1 -0
  97. package/dist/utils/progress.d.ts +31 -1
  98. package/dist/utils/progress.d.ts.map +1 -1
  99. package/dist/utils/progress.js +110 -2
  100. package/dist/utils/progress.js.map +1 -1
  101. package/dist/utils/workflowEngine.d.ts +96 -0
  102. package/dist/utils/workflowEngine.d.ts.map +1 -0
  103. package/dist/utils/workflowEngine.js +793 -0
  104. package/dist/utils/workflowEngine.js.map +1 -0
  105. package/package.json +1 -1
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ // PM Integration Service
3
+ // Handles communication between mycontext PM and MyContext CLI
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PMIntegrationService = void 0;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const https_1 = __importDefault(require("https"));
11
+ const http_1 = __importDefault(require("http"));
12
+ const events_1 = require("events");
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const pm_integration_1 = require("../types/pm-integration");
15
+ class PMIntegrationService extends events_1.EventEmitter {
16
+ constructor(config = {}) {
17
+ super();
18
+ this.isConnected = false;
19
+ this.lastSyncTimestamp = "";
20
+ this.config = {
21
+ syncInterval: 60, // 1 hour default
22
+ retryAttempts: 3,
23
+ timeout: 30000, // 30 seconds
24
+ enableRealTimeSync: true,
25
+ ...config,
26
+ };
27
+ this.setupEventHandlers();
28
+ }
29
+ setupEventHandlers() {
30
+ this.on("webhook_received", this.handleWebhookEvent.bind(this));
31
+ this.on("sync_error", this.handleSyncError.bind(this));
32
+ this.on("connection_lost", this.handleConnectionLost.bind(this));
33
+ }
34
+ // Initialize the integration service
35
+ async initialize() {
36
+ try {
37
+ console.log(chalk_1.default.blue("🔗 Initializing mycontext PM Integration..."));
38
+ if (!this.config.pmEndpoint && !this.config.webhookUrl) {
39
+ throw new pm_integration_1.PMIntegrationError("PM endpoint or webhook URL is required", pm_integration_1.PMIntegrationErrorCodes.INVALID_PROJECT_ID);
40
+ }
41
+ // Test connection
42
+ await this.testConnection();
43
+ this.isConnected = true;
44
+ // Start sync timer if enabled
45
+ if (this.config.enableRealTimeSync && this.config.syncInterval) {
46
+ this.startSyncTimer();
47
+ }
48
+ console.log(chalk_1.default.green("✅ PM Integration initialized successfully"));
49
+ this.emit("initialized", this.getStatus());
50
+ }
51
+ catch (error) {
52
+ console.error(chalk_1.default.red("❌ Failed to initialize PM integration:"), error);
53
+ this.emit("initialization_failed", error);
54
+ throw error;
55
+ }
56
+ }
57
+ // Test connection to PM service
58
+ async testConnection() {
59
+ if (!this.config.pmEndpoint)
60
+ return;
61
+ return new Promise((resolve, reject) => {
62
+ const url = new URL(`${this.config.pmEndpoint}/health`);
63
+ const options = {
64
+ method: "GET",
65
+ headers: this.getAuthHeaders(),
66
+ timeout: this.config.timeout,
67
+ };
68
+ const req = (url.protocol === "https:" ? https_1.default : http_1.default).request(url, options, (res) => {
69
+ if (res.statusCode === 200) {
70
+ resolve();
71
+ }
72
+ else {
73
+ reject(new Error(`Health check failed: ${res.statusCode}`));
74
+ }
75
+ });
76
+ req.on("error", reject);
77
+ req.on("timeout", () => {
78
+ req.destroy();
79
+ reject(new Error("Connection timeout"));
80
+ });
81
+ req.end();
82
+ });
83
+ }
84
+ // Import project plan from PM
85
+ async importProjectPlan(planPath) {
86
+ try {
87
+ console.log(chalk_1.default.blue(`📥 Importing project plan from ${planPath}...`));
88
+ if (!fs_1.default.existsSync(planPath)) {
89
+ throw new pm_integration_1.PMIntegrationError(`Project plan file not found: ${planPath}`, pm_integration_1.PMIntegrationErrorCodes.INVALID_PLAN_FORMAT);
90
+ }
91
+ const planData = fs_1.default.readFileSync(planPath, "utf-8");
92
+ const plan = JSON.parse(planData);
93
+ // Validate plan structure
94
+ await this.validateProjectPlan(plan);
95
+ console.log(chalk_1.default.green(`✅ Project plan imported: ${plan.project.name}`));
96
+ this.emit("plan_imported", plan);
97
+ return plan;
98
+ }
99
+ catch (error) {
100
+ console.error(chalk_1.default.red("❌ Failed to import project plan:"), error);
101
+ this.emit("plan_import_failed", error);
102
+ throw error;
103
+ }
104
+ }
105
+ // Export progress to PM
106
+ async exportProgress(output, webhookUrl) {
107
+ const targetUrl = webhookUrl || this.config.webhookUrl;
108
+ if (!targetUrl) {
109
+ throw new pm_integration_1.PMIntegrationError("No webhook URL configured for progress export", pm_integration_1.PMIntegrationErrorCodes.SYNC_FAILED);
110
+ }
111
+ try {
112
+ console.log(chalk_1.default.blue("📤 Exporting progress to mycontext PM..."));
113
+ await this.sendWebhook(targetUrl, {
114
+ type: "progress_update",
115
+ projectId: output.projectId,
116
+ data: output,
117
+ timestamp: new Date().toISOString(),
118
+ });
119
+ this.lastSyncTimestamp = new Date().toISOString();
120
+ console.log(chalk_1.default.green("✅ Progress exported successfully"));
121
+ this.emit("progress_exported", output);
122
+ }
123
+ catch (error) {
124
+ console.error(chalk_1.default.red("❌ Failed to export progress:"), error);
125
+ this.emit("progress_export_failed", error);
126
+ throw error;
127
+ }
128
+ }
129
+ // Sync progress with PM (bidirectional)
130
+ async syncProgress(request) {
131
+ if (!this.config.pmEndpoint) {
132
+ throw new pm_integration_1.PMIntegrationError("PM endpoint not configured", pm_integration_1.PMIntegrationErrorCodes.SYNC_FAILED);
133
+ }
134
+ try {
135
+ console.log(chalk_1.default.blue("🔄 Syncing progress with mycontext PM..."));
136
+ const response = await this.makeAuthenticatedRequest(`${this.config.pmEndpoint}/api/sync`, "POST", request);
137
+ this.lastSyncTimestamp = new Date().toISOString();
138
+ console.log(chalk_1.default.green("✅ Progress sync completed"));
139
+ this.emit("progress_synced", response);
140
+ return response;
141
+ }
142
+ catch (error) {
143
+ console.error(chalk_1.default.red("❌ Progress sync failed:"), error);
144
+ this.emit("progress_sync_failed", error);
145
+ throw error;
146
+ }
147
+ }
148
+ // Send webhook with retry logic
149
+ async sendWebhook(url, event, attempt = 1) {
150
+ return new Promise((resolve, reject) => {
151
+ const payload = JSON.stringify(event);
152
+ const options = {
153
+ method: "POST",
154
+ headers: {
155
+ "Content-Type": "application/json",
156
+ "Content-Length": Buffer.byteLength(payload),
157
+ ...this.getAuthHeaders(),
158
+ },
159
+ timeout: this.config.timeout,
160
+ };
161
+ const req = (url.startsWith("https:") ? https_1.default : http_1.default).request(url, options, (res) => {
162
+ let data = "";
163
+ res.on("data", (chunk) => {
164
+ data += chunk;
165
+ });
166
+ res.on("end", () => {
167
+ if (res.statusCode &&
168
+ res.statusCode >= 200 &&
169
+ res.statusCode < 300) {
170
+ resolve();
171
+ }
172
+ else {
173
+ reject(new Error(`Webhook failed: ${res.statusCode} ${data}`));
174
+ }
175
+ });
176
+ });
177
+ req.on("error", reject);
178
+ req.on("timeout", () => {
179
+ req.destroy();
180
+ reject(new Error("Webhook timeout"));
181
+ });
182
+ req.write(payload);
183
+ req.end();
184
+ });
185
+ }
186
+ // Make authenticated HTTP request
187
+ async makeAuthenticatedRequest(url, method = "GET", data) {
188
+ return new Promise((resolve, reject) => {
189
+ const payload = data ? JSON.stringify(data) : undefined;
190
+ const options = {
191
+ method,
192
+ headers: {
193
+ "Content-Type": "application/json",
194
+ ...this.getAuthHeaders(),
195
+ ...(payload && { "Content-Length": Buffer.byteLength(payload) }),
196
+ },
197
+ timeout: this.config.timeout,
198
+ };
199
+ const req = (url.startsWith("https:") ? https_1.default : http_1.default).request(url, options, (res) => {
200
+ let responseData = "";
201
+ res.on("data", (chunk) => {
202
+ responseData += chunk;
203
+ });
204
+ res.on("end", () => {
205
+ try {
206
+ if (res.statusCode &&
207
+ res.statusCode >= 200 &&
208
+ res.statusCode < 300) {
209
+ const result = responseData ? JSON.parse(responseData) : {};
210
+ resolve(result);
211
+ }
212
+ else {
213
+ reject(new Error(`Request failed: ${res.statusCode} ${responseData}`));
214
+ }
215
+ }
216
+ catch (error) {
217
+ reject(new Error(`Invalid response: ${error}`));
218
+ }
219
+ });
220
+ });
221
+ req.on("error", reject);
222
+ req.on("timeout", () => {
223
+ req.destroy();
224
+ reject(new Error("Request timeout"));
225
+ });
226
+ if (payload) {
227
+ req.write(payload);
228
+ }
229
+ req.end();
230
+ });
231
+ }
232
+ // Get authentication headers
233
+ getAuthHeaders() {
234
+ const headers = {};
235
+ if (this.config.apiKey) {
236
+ headers["Authorization"] = `Bearer ${this.config.apiKey}`;
237
+ }
238
+ return headers;
239
+ }
240
+ // Validate project plan structure
241
+ async validateProjectPlan(plan) {
242
+ if (!plan.project || !plan.project.name || !plan.project.description) {
243
+ throw new pm_integration_1.PMIntegrationError("Invalid project plan: missing required project fields", pm_integration_1.PMIntegrationErrorCodes.PLAN_VALIDATION_FAILED);
244
+ }
245
+ if (!plan.myContext || !plan.myContext.framework) {
246
+ throw new pm_integration_1.PMIntegrationError("Invalid project plan: missing MyContext configuration", pm_integration_1.PMIntegrationErrorCodes.PLAN_VALIDATION_FAILED);
247
+ }
248
+ // Validate framework compatibility
249
+ const supportedFrameworks = ["nextjs", "react", "vue", "angular"];
250
+ if (!supportedFrameworks.includes(plan.myContext.framework)) {
251
+ throw new pm_integration_1.PMIntegrationError(`Unsupported framework: ${plan.myContext.framework}`, pm_integration_1.PMIntegrationErrorCodes.PLAN_VALIDATION_FAILED);
252
+ }
253
+ // Validate architecture compatibility
254
+ const supportedArchitectures = [
255
+ "nextjs-app-router",
256
+ "nextjs-pages",
257
+ "react-spa",
258
+ ];
259
+ if (plan.myContext.architecture &&
260
+ !supportedArchitectures.includes(plan.myContext.architecture)) {
261
+ throw new pm_integration_1.PMIntegrationError(`Unsupported architecture: ${plan.myContext.architecture}`, pm_integration_1.PMIntegrationErrorCodes.PLAN_VALIDATION_FAILED);
262
+ }
263
+ }
264
+ // Start periodic sync timer
265
+ startSyncTimer() {
266
+ if (!this.config.syncInterval)
267
+ return;
268
+ const intervalMs = this.config.syncInterval * 60 * 1000; // Convert minutes to milliseconds
269
+ this.syncTimer = setInterval(async () => {
270
+ try {
271
+ if (this.config.projectId) {
272
+ await this.syncProgress({
273
+ projectId: this.config.projectId,
274
+ syncTimestamp: this.lastSyncTimestamp,
275
+ includeTasks: true,
276
+ includeComponents: true,
277
+ includeMetrics: true,
278
+ });
279
+ }
280
+ }
281
+ catch (error) {
282
+ console.warn(chalk_1.default.yellow("⚠️ Periodic sync failed:"), error);
283
+ }
284
+ }, intervalMs);
285
+ console.log(chalk_1.default.gray(`⏰ Periodic sync enabled (${this.config.syncInterval} minutes)`));
286
+ }
287
+ // Event handlers
288
+ handleWebhookEvent(event) {
289
+ console.log(chalk_1.default.blue(`📨 Received webhook event: ${event.type}`));
290
+ switch (event.type) {
291
+ case "sync_request":
292
+ this.handleSyncRequest(event);
293
+ break;
294
+ case "error":
295
+ this.handleRemoteError(event);
296
+ break;
297
+ default:
298
+ this.emit("webhook_event", event);
299
+ }
300
+ }
301
+ handleSyncRequest(event) {
302
+ // Respond to sync requests from PM
303
+ if (event.data.requestId) {
304
+ this.emit("sync_requested", event);
305
+ }
306
+ }
307
+ handleRemoteError(event) {
308
+ console.error(chalk_1.default.red("🚨 Remote PM error:"), event.data);
309
+ this.emit("remote_error", event.data);
310
+ }
311
+ handleSyncError(error) {
312
+ console.error(chalk_1.default.red("🔄 Sync error:"), error);
313
+ this.isConnected = false;
314
+ this.emit("connection_lost");
315
+ }
316
+ handleConnectionLost() {
317
+ console.warn(chalk_1.default.yellow("⚠️ Connection to PM lost, attempting to reconnect..."));
318
+ // Attempt to reconnect after a delay
319
+ setTimeout(async () => {
320
+ try {
321
+ await this.initialize();
322
+ }
323
+ catch (error) {
324
+ console.error(chalk_1.default.red("❌ Reconnection failed:"), error);
325
+ }
326
+ }, 5000);
327
+ }
328
+ // Public API methods
329
+ getStatus() {
330
+ return {
331
+ connected: this.isConnected,
332
+ lastSync: this.lastSyncTimestamp,
333
+ projectId: this.config.projectId,
334
+ pendingUpdates: 0,
335
+ };
336
+ }
337
+ updateConfig(newConfig) {
338
+ this.config = { ...this.config, ...newConfig };
339
+ // Restart sync timer if interval changed
340
+ if (this.syncTimer) {
341
+ clearInterval(this.syncTimer);
342
+ this.startSyncTimer();
343
+ }
344
+ }
345
+ disconnect() {
346
+ if (this.syncTimer) {
347
+ clearInterval(this.syncTimer);
348
+ }
349
+ this.isConnected = false;
350
+ this.emit("disconnected");
351
+ }
352
+ // Utility method to create integration from config file
353
+ static fromConfigFile(configPath) {
354
+ if (!fs_1.default.existsSync(configPath)) {
355
+ throw new Error(`Config file not found: ${configPath}`);
356
+ }
357
+ const configData = fs_1.default.readFileSync(configPath, "utf-8");
358
+ const config = JSON.parse(configData);
359
+ return new PMIntegrationService(config);
360
+ }
361
+ }
362
+ exports.PMIntegrationService = PMIntegrationService;
363
+ //# sourceMappingURL=PMIntegrationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PMIntegrationService.js","sourceRoot":"","sources":["../../src/services/PMIntegrationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { EventEmitter } from "events";
2
+ export interface WebhookServerConfig {
3
+ port: number;
4
+ host?: string;
5
+ ssl?: {
6
+ key: string;
7
+ cert: string;
8
+ };
9
+ authToken?: string;
10
+ rateLimit?: {
11
+ windowMs: number;
12
+ maxRequests: number;
13
+ };
14
+ }
15
+ export declare class WebhookServer extends EventEmitter {
16
+ private server?;
17
+ private config;
18
+ private requestCounts;
19
+ constructor(config: WebhookServerConfig);
20
+ start(): Promise<void>;
21
+ stop(): Promise<void>;
22
+ private handleRequest;
23
+ private handleHealthCheck;
24
+ private handleWebhook;
25
+ private authenticateRequest;
26
+ private validateWebhookEvent;
27
+ private parseRequestBody;
28
+ private checkRateLimit;
29
+ private getClientIP;
30
+ private sendError;
31
+ getStatus(): {
32
+ running: boolean;
33
+ url?: string;
34
+ connections: number;
35
+ };
36
+ }
37
+ //# sourceMappingURL=WebhookServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookServer.d.ts","sourceRoot":"","sources":["../../src/services/WebhookServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAC,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,aAAa,CACT;gBAEA,MAAM,EAAE,mBAAmB;IAajC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAeb,aAAa;IAmC3B,OAAO,CAAC,iBAAiB;YAaX,aAAa;IAyC3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,SAAS;IAejB,SAAS,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;CAcrE"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ // Webhook Server for mycontext PM Integration
3
+ // Handles incoming webhook requests from mycontext PM
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.WebhookServer = void 0;
9
+ const http_1 = __importDefault(require("http"));
10
+ const https_1 = __importDefault(require("https"));
11
+ const events_1 = require("events");
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ class WebhookServer extends events_1.EventEmitter {
14
+ constructor(config) {
15
+ super();
16
+ this.requestCounts = new Map();
17
+ this.config = {
18
+ host: "localhost",
19
+ rateLimit: {
20
+ windowMs: 15 * 60 * 1000, // 15 minutes
21
+ maxRequests: 100,
22
+ },
23
+ ...config,
24
+ };
25
+ }
26
+ // Start the webhook server
27
+ async start() {
28
+ return new Promise((resolve, reject) => {
29
+ try {
30
+ const serverOptions = this.config.ssl
31
+ ? {
32
+ key: this.config.ssl.key,
33
+ cert: this.config.ssl.cert,
34
+ }
35
+ : {};
36
+ this.server = this.config.ssl
37
+ ? https_1.default.createServer(serverOptions, this.handleRequest.bind(this))
38
+ : http_1.default.createServer(this.handleRequest.bind(this));
39
+ this.server.listen(this.config.port, this.config.host, () => {
40
+ const protocol = this.config.ssl ? "https" : "http";
41
+ const url = `${protocol}://${this.config.host}:${this.config.port}`;
42
+ console.log(chalk_1.default.green(`🚀 Webhook server started at ${url}`));
43
+ console.log(chalk_1.default.gray(` Rate limit: ${this.config.rateLimit?.maxRequests} requests per ${this.config.rateLimit?.windowMs}ms`));
44
+ this.emit("started", url);
45
+ resolve();
46
+ });
47
+ this.server.on("error", (error) => {
48
+ console.error(chalk_1.default.red("❌ Webhook server error:"), error);
49
+ this.emit("error", error);
50
+ reject(error);
51
+ });
52
+ }
53
+ catch (error) {
54
+ reject(error);
55
+ }
56
+ });
57
+ }
58
+ // Stop the webhook server
59
+ async stop() {
60
+ return new Promise((resolve) => {
61
+ if (this.server) {
62
+ this.server.close(() => {
63
+ console.log(chalk_1.default.blue("🛑 Webhook server stopped"));
64
+ this.emit("stopped");
65
+ resolve();
66
+ });
67
+ }
68
+ else {
69
+ resolve();
70
+ }
71
+ });
72
+ }
73
+ // Handle incoming HTTP requests
74
+ async handleRequest(req, res) {
75
+ const clientIP = this.getClientIP(req);
76
+ const now = Date.now();
77
+ try {
78
+ // Rate limiting
79
+ if (!this.checkRateLimit(clientIP, now)) {
80
+ this.sendError(res, 429, "Rate limit exceeded");
81
+ return;
82
+ }
83
+ // Health check endpoint
84
+ if (req.url === "/health" && req.method === "GET") {
85
+ this.handleHealthCheck(res);
86
+ return;
87
+ }
88
+ // Webhook endpoint
89
+ if (req.url === "/webhook" && req.method === "POST") {
90
+ await this.handleWebhook(req, res);
91
+ return;
92
+ }
93
+ // Unknown endpoint
94
+ this.sendError(res, 404, "Endpoint not found");
95
+ }
96
+ catch (error) {
97
+ console.error(chalk_1.default.red("❌ Webhook request error:"), error);
98
+ this.sendError(res, 500, "Internal server error");
99
+ }
100
+ }
101
+ // Handle health check requests
102
+ handleHealthCheck(res) {
103
+ const healthData = {
104
+ status: "healthy",
105
+ timestamp: new Date().toISOString(),
106
+ uptime: process.uptime(),
107
+ version: process.version,
108
+ };
109
+ res.writeHead(200, { "Content-Type": "application/json" });
110
+ res.end(JSON.stringify(healthData));
111
+ }
112
+ // Handle webhook requests
113
+ async handleWebhook(req, res) {
114
+ // Authenticate request
115
+ if (!this.authenticateRequest(req)) {
116
+ this.sendError(res, 401, "Unauthorized");
117
+ return;
118
+ }
119
+ // Parse request body
120
+ const body = await this.parseRequestBody(req);
121
+ const event = body;
122
+ // Validate webhook event
123
+ if (!this.validateWebhookEvent(event)) {
124
+ this.sendError(res, 400, "Invalid webhook event");
125
+ return;
126
+ }
127
+ console.log(chalk_1.default.blue(`📨 Received webhook: ${event.type} for project ${event.projectId}`));
128
+ // Emit event for processing
129
+ this.emit("webhook_received", event);
130
+ // Send success response
131
+ res.writeHead(200, { "Content-Type": "application/json" });
132
+ res.end(JSON.stringify({
133
+ status: "received",
134
+ eventId: event.timestamp,
135
+ timestamp: new Date().toISOString(),
136
+ }));
137
+ }
138
+ // Authenticate incoming requests
139
+ authenticateRequest(req) {
140
+ if (!this.config.authToken) {
141
+ return true; // No auth required
142
+ }
143
+ const authHeader = req.headers.authorization;
144
+ if (!authHeader) {
145
+ return false;
146
+ }
147
+ const token = authHeader.replace("Bearer ", "");
148
+ return token === this.config.authToken;
149
+ }
150
+ // Validate webhook event structure
151
+ validateWebhookEvent(event) {
152
+ return (event &&
153
+ typeof event.type === "string" &&
154
+ typeof event.projectId === "string" &&
155
+ typeof event.timestamp === "string" &&
156
+ event.data !== undefined);
157
+ }
158
+ // Parse JSON request body
159
+ parseRequestBody(req) {
160
+ return new Promise((resolve, reject) => {
161
+ let body = "";
162
+ req.on("data", (chunk) => {
163
+ body += chunk.toString();
164
+ });
165
+ req.on("end", () => {
166
+ try {
167
+ const data = JSON.parse(body);
168
+ resolve(data);
169
+ }
170
+ catch (error) {
171
+ reject(new Error("Invalid JSON"));
172
+ }
173
+ });
174
+ req.on("error", reject);
175
+ });
176
+ }
177
+ // Check rate limiting
178
+ checkRateLimit(clientIP, now) {
179
+ const rateLimit = this.config.rateLimit;
180
+ if (!rateLimit)
181
+ return true;
182
+ const clientData = this.requestCounts.get(clientIP);
183
+ if (!clientData || now > clientData.resetTime) {
184
+ // Reset or new client
185
+ this.requestCounts.set(clientIP, {
186
+ count: 1,
187
+ resetTime: now + rateLimit.windowMs,
188
+ });
189
+ return true;
190
+ }
191
+ if (clientData.count >= rateLimit.maxRequests) {
192
+ return false;
193
+ }
194
+ clientData.count++;
195
+ return true;
196
+ }
197
+ // Get client IP address
198
+ getClientIP(req) {
199
+ const forwarded = req.headers["x-forwarded-for"];
200
+ if (forwarded && typeof forwarded === "string") {
201
+ return forwarded.split(",")[0]?.trim() || "unknown";
202
+ }
203
+ const realIP = req.headers["x-real-ip"];
204
+ if (realIP && typeof realIP === "string") {
205
+ return realIP;
206
+ }
207
+ return req.socket?.remoteAddress || "unknown";
208
+ }
209
+ // Send error response
210
+ sendError(res, statusCode, message) {
211
+ res.writeHead(statusCode, { "Content-Type": "application/json" });
212
+ res.end(JSON.stringify({
213
+ error: message,
214
+ timestamp: new Date().toISOString(),
215
+ }));
216
+ }
217
+ // Get server status
218
+ getStatus() {
219
+ const running = this.server?.listening || false;
220
+ const url = running
221
+ ? `${this.config.ssl ? "https" : "http"}://${this.config.host}:${this.config.port}`
222
+ : undefined;
223
+ return {
224
+ running,
225
+ url,
226
+ connections: this.requestCounts.size,
227
+ };
228
+ }
229
+ }
230
+ exports.WebhookServer = WebhookServer;
231
+ //# sourceMappingURL=WebhookServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookServer.js","sourceRoot":"","sources":["../../src/services/WebhookServer.ts"],"names":[],"mappings":"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"}