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.
- package/README.md +184 -37
- package/dist/cli.js +92 -80
- package/dist/cli.js.map +1 -1
- package/dist/commands/build-app.d.ts +6 -1
- package/dist/commands/build-app.d.ts.map +1 -1
- package/dist/commands/build-app.js +97 -9
- package/dist/commands/build-app.js.map +1 -1
- package/dist/commands/compile-prd.d.ts.map +1 -1
- package/dist/commands/compile-prd.js +7 -0
- package/dist/commands/compile-prd.js.map +1 -1
- package/dist/commands/export-progress.d.ts +34 -0
- package/dist/commands/export-progress.d.ts.map +1 -0
- package/dist/commands/export-progress.js +552 -0
- package/dist/commands/export-progress.js.map +1 -0
- package/dist/commands/generate-context-files.d.ts.map +1 -1
- package/dist/commands/generate-context-files.js +10 -2
- package/dist/commands/generate-context-files.js.map +1 -1
- package/dist/commands/generate.d.ts +8 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +212 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/help.d.ts +17 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +329 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/import-project-plan.d.ts +27 -0
- package/dist/commands/import-project-plan.d.ts.map +1 -0
- package/dist/commands/import-project-plan.js +411 -0
- package/dist/commands/import-project-plan.js.map +1 -0
- package/dist/commands/pm-integration.d.ts +18 -0
- package/dist/commands/pm-integration.d.ts.map +1 -0
- package/dist/commands/pm-integration.js +385 -0
- package/dist/commands/pm-integration.js.map +1 -0
- package/dist/commands/setup-complete.d.ts +16 -0
- package/dist/commands/setup-complete.d.ts.map +1 -0
- package/dist/commands/setup-complete.js +468 -0
- package/dist/commands/setup-complete.js.map +1 -0
- package/dist/commands/setup-shadcn.d.ts +20 -0
- package/dist/commands/setup-shadcn.d.ts.map +1 -0
- package/dist/commands/setup-shadcn.js +241 -0
- package/dist/commands/setup-shadcn.js.map +1 -0
- package/dist/commands/suggest.d.ts +15 -0
- package/dist/commands/suggest.d.ts.map +1 -0
- package/dist/commands/suggest.js +288 -0
- package/dist/commands/suggest.js.map +1 -0
- package/dist/commands/update.d.ts +0 -4
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +7 -197
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/workflow.d.ts +16 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +464 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/services/PMIntegrationService.d.ts +46 -0
- package/dist/services/PMIntegrationService.d.ts.map +1 -0
- package/dist/services/PMIntegrationService.js +363 -0
- package/dist/services/PMIntegrationService.js.map +1 -0
- package/dist/services/WebhookServer.d.ts +37 -0
- package/dist/services/WebhookServer.d.ts.map +1 -0
- package/dist/services/WebhookServer.js +231 -0
- package/dist/services/WebhookServer.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/pm-integration.d.ts +241 -0
- package/dist/types/pm-integration.d.ts.map +1 -0
- package/dist/types/pm-integration.js +24 -0
- package/dist/types/pm-integration.js.map +1 -0
- package/dist/utils/NextJSProjectValidator.d.ts.map +1 -1
- package/dist/utils/NextJSProjectValidator.js +14 -7
- package/dist/utils/NextJSProjectValidator.js.map +1 -1
- package/dist/utils/ProjectStateAnalyzer.d.ts +46 -0
- package/dist/utils/ProjectStateAnalyzer.d.ts.map +1 -0
- package/dist/utils/ProjectStateAnalyzer.js +311 -0
- package/dist/utils/ProjectStateAnalyzer.js.map +1 -0
- package/dist/utils/ProjectStructureValidator.d.ts +12 -0
- package/dist/utils/ProjectStructureValidator.d.ts.map +1 -1
- package/dist/utils/ProjectStructureValidator.js +111 -14
- package/dist/utils/ProjectStructureValidator.js.map +1 -1
- package/dist/utils/claudeAgentClient.d.ts +4 -0
- package/dist/utils/claudeAgentClient.d.ts.map +1 -1
- package/dist/utils/claudeAgentClient.js +90 -20
- package/dist/utils/claudeAgentClient.js.map +1 -1
- package/dist/utils/errorHandler.d.ts +31 -74
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +190 -276
- package/dist/utils/errorHandler.js.map +1 -1
- package/dist/utils/hybridAIClient.js +1 -1
- package/dist/utils/hybridAIClient.js.map +1 -1
- package/dist/utils/mcpTools.d.ts +9 -9
- package/dist/utils/nextStepsSuggester.d.ts +52 -0
- package/dist/utils/nextStepsSuggester.d.ts.map +1 -0
- package/dist/utils/nextStepsSuggester.js +438 -0
- package/dist/utils/nextStepsSuggester.js.map +1 -0
- package/dist/utils/progress.d.ts +31 -1
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +110 -2
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/workflowEngine.d.ts +96 -0
- package/dist/utils/workflowEngine.d.ts.map +1 -0
- package/dist/utils/workflowEngine.js +793 -0
- package/dist/utils/workflowEngine.js.map +1 -0
- 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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"}
|