mycontext-cli 2.0.24 → 2.0.26

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 (109) hide show
  1. package/README.md +169 -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 +3 -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 +8 -0
  83. package/dist/utils/claudeAgentClient.d.ts.map +1 -1
  84. package/dist/utils/claudeAgentClient.js +101 -25
  85. package/dist/utils/claudeAgentClient.js.map +1 -1
  86. package/dist/utils/envExampleGenerator.d.ts.map +1 -1
  87. package/dist/utils/envExampleGenerator.js +12 -1
  88. package/dist/utils/envExampleGenerator.js.map +1 -1
  89. package/dist/utils/errorHandler.d.ts +31 -74
  90. package/dist/utils/errorHandler.d.ts.map +1 -1
  91. package/dist/utils/errorHandler.js +190 -276
  92. package/dist/utils/errorHandler.js.map +1 -1
  93. package/dist/utils/hybridAIClient.d.ts.map +1 -1
  94. package/dist/utils/hybridAIClient.js +48 -14
  95. package/dist/utils/hybridAIClient.js.map +1 -1
  96. package/dist/utils/mcpTools.d.ts +9 -9
  97. package/dist/utils/nextStepsSuggester.d.ts +52 -0
  98. package/dist/utils/nextStepsSuggester.d.ts.map +1 -0
  99. package/dist/utils/nextStepsSuggester.js +438 -0
  100. package/dist/utils/nextStepsSuggester.js.map +1 -0
  101. package/dist/utils/progress.d.ts +31 -1
  102. package/dist/utils/progress.d.ts.map +1 -1
  103. package/dist/utils/progress.js +110 -2
  104. package/dist/utils/progress.js.map +1 -1
  105. package/dist/utils/workflowEngine.d.ts +96 -0
  106. package/dist/utils/workflowEngine.d.ts.map +1 -0
  107. package/dist/utils/workflowEngine.js +793 -0
  108. package/dist/utils/workflowEngine.js.map +1 -0
  109. package/package.json +3 -1
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.NextStepsSuggester = void 0;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ class NextStepsSuggester {
42
+ /**
43
+ * Get context-aware next steps based on current project state
44
+ */
45
+ static getNextSteps(context) {
46
+ const suggestions = [];
47
+ // After project initialization
48
+ if (context.lastCommand === "init" || context.isNewProject) {
49
+ suggestions.push({
50
+ description: "Review and update your PRD with project details",
51
+ command: "mycontext compile-prd",
52
+ priority: "high",
53
+ context: "PRD is essential for AI generation",
54
+ }, {
55
+ description: "Set up shadcn/ui components",
56
+ command: "mycontext setup-shadcn --all",
57
+ priority: "high",
58
+ context: "Components are needed for UI development",
59
+ }, {
60
+ description: "Configure AI provider",
61
+ command: "mycontext status --check-health",
62
+ priority: "high",
63
+ context: "AI is required for code generation",
64
+ });
65
+ }
66
+ // After PRD compilation
67
+ else if (context.lastCommand === "compile-prd") {
68
+ if (!context.hasContextFiles) {
69
+ suggestions.push({
70
+ description: "Generate context files from PRD",
71
+ command: "mycontext generate-context-files",
72
+ priority: "high",
73
+ context: "Context files help AI understand your project",
74
+ });
75
+ }
76
+ else {
77
+ suggestions.push({
78
+ description: "Generate project architecture",
79
+ command: "mycontext generate types",
80
+ priority: "high",
81
+ context: "Types define your data structures",
82
+ });
83
+ }
84
+ }
85
+ // After context file generation
86
+ else if (context.lastCommand === "generate-context-files") {
87
+ suggestions.push({
88
+ description: "Generate TypeScript types",
89
+ command: "mycontext generate types",
90
+ priority: "high",
91
+ context: "Types provide type safety",
92
+ }, {
93
+ description: "Generate brand guidelines",
94
+ command: "mycontext generate brand",
95
+ priority: "medium",
96
+ context: "Branding ensures consistent UI",
97
+ });
98
+ }
99
+ // After generating types
100
+ else if (context.lastCommand === "generate-types" ||
101
+ context.lastCommand === "generate") {
102
+ suggestions.push({
103
+ description: "Generate component list",
104
+ command: "mycontext generate component-list",
105
+ priority: "high",
106
+ context: "Component list guides UI development",
107
+ }, {
108
+ description: "Generate project structure",
109
+ command: "mycontext generate project-structure",
110
+ priority: "medium",
111
+ context: "Structure organizes your codebase",
112
+ });
113
+ }
114
+ // After generating component list
115
+ else if (context.lastCommand === "generate-component-list") {
116
+ suggestions.push({
117
+ description: "Generate components automatically",
118
+ command: "mycontext generate-components all --with-tests",
119
+ priority: "high",
120
+ context: "Components build your UI",
121
+ }, {
122
+ description: "Generate project structure",
123
+ command: "mycontext generate project-structure",
124
+ priority: "medium",
125
+ context: "Structure organizes components",
126
+ });
127
+ }
128
+ // After generating components
129
+ else if (context.lastCommand?.includes("generate-components")) {
130
+ suggestions.push({
131
+ description: "Preview components in browser",
132
+ command: "mycontext preview components",
133
+ priority: "medium",
134
+ context: "Preview shows your components",
135
+ }, {
136
+ description: "Validate component quality",
137
+ command: "mycontext validate",
138
+ priority: "medium",
139
+ context: "Validation ensures quality",
140
+ }, {
141
+ description: "Promote to production",
142
+ command: "mycontext promote --all",
143
+ priority: "low",
144
+ context: "Move components to production",
145
+ });
146
+ }
147
+ // After validation
148
+ else if (context.lastCommand === "validate") {
149
+ if (!context.hasComponents) {
150
+ suggestions.push({
151
+ description: "Generate missing components",
152
+ command: "mycontext generate-components all",
153
+ priority: "high",
154
+ context: "Fix validation issues",
155
+ });
156
+ }
157
+ else {
158
+ suggestions.push({
159
+ description: "Run the development server",
160
+ command: "npm run dev",
161
+ priority: "medium",
162
+ context: "Start developing your app",
163
+ });
164
+ }
165
+ }
166
+ // Database-specific suggestions
167
+ if (context.hasInstantDB) {
168
+ if (!context.lastCommand?.includes("setup-instantdb")) {
169
+ suggestions.push({
170
+ description: "Set up InstantDB integration",
171
+ command: "mycontext setup-instantdb",
172
+ priority: "high",
173
+ context: "InstantDB provides real-time database",
174
+ });
175
+ }
176
+ }
177
+ // Always available suggestions
178
+ if (suggestions.length === 0) {
179
+ suggestions.push({
180
+ description: "Check project status",
181
+ command: "mycontext status",
182
+ priority: "low",
183
+ context: "Monitor project progress",
184
+ }, {
185
+ description: "Get help with commands",
186
+ command: "mycontext --help",
187
+ priority: "low",
188
+ context: "Learn available commands",
189
+ });
190
+ }
191
+ // Sort by priority
192
+ return suggestions.sort((a, b) => {
193
+ const priorityOrder = { high: 3, medium: 2, low: 1 };
194
+ return priorityOrder[b.priority] - priorityOrder[a.priority];
195
+ });
196
+ }
197
+ /**
198
+ * Display next steps in a user-friendly format
199
+ */
200
+ static displayNextSteps(suggestions, maxItems = 3) {
201
+ if (suggestions.length === 0)
202
+ return;
203
+ console.log("\n💡 Next Steps:");
204
+ const displaySuggestions = suggestions.slice(0, maxItems);
205
+ displaySuggestions.forEach((step, index) => {
206
+ const priorityColor = step.priority === "high"
207
+ ? chalk_1.default.red
208
+ : step.priority === "medium"
209
+ ? chalk_1.default.yellow
210
+ : chalk_1.default.gray;
211
+ console.log(` ${index + 1}. ${step.description}`);
212
+ console.log(` ${chalk_1.default.cyan(step.command)}`);
213
+ if (step.context) {
214
+ console.log(` ${chalk_1.default.gray(step.context)}`);
215
+ }
216
+ });
217
+ if (suggestions.length > maxItems) {
218
+ console.log(` ${chalk_1.default.gray(`... and ${suggestions.length - maxItems} more suggestions`)}`);
219
+ console.log(` ${chalk_1.default.gray("Run: mycontext suggest")}`);
220
+ }
221
+ console.log();
222
+ }
223
+ /**
224
+ * Get workflow context from project state
225
+ */
226
+ static async getWorkflowContext(projectRoot = process.cwd()) {
227
+ const fs = await Promise.resolve().then(() => __importStar(require("fs-extra")));
228
+ const path = await Promise.resolve().then(() => __importStar(require("path")));
229
+ const context = {
230
+ isNewProject: false,
231
+ hasPRD: false,
232
+ hasContextFiles: false,
233
+ hasComponents: false,
234
+ hasShadcn: false,
235
+ hasInstantDB: false,
236
+ aiProviderConfigured: false,
237
+ };
238
+ try {
239
+ // Check for PRD
240
+ const prdPath = path.join(projectRoot, ".mycontext", "01-prd.md");
241
+ context.hasPRD = await fs.pathExists(prdPath);
242
+ // Check for context files
243
+ const contextDir = path.join(projectRoot, ".mycontext");
244
+ if (await fs.pathExists(contextDir)) {
245
+ const files = await fs.readdir(contextDir);
246
+ context.hasContextFiles = files.some((file) => file.endsWith(".md") && file !== "01-prd.md");
247
+ }
248
+ // Check for components
249
+ const componentsDir = path.join(projectRoot, "components");
250
+ context.hasComponents = await fs.pathExists(componentsDir);
251
+ // Check for shadcn
252
+ const shadcnConfig = path.join(projectRoot, "components.json");
253
+ context.hasShadcn = await fs.pathExists(shadcnConfig);
254
+ // Check for InstantDB
255
+ const packageJsonPath = path.join(projectRoot, "package.json");
256
+ if (await fs.pathExists(packageJsonPath)) {
257
+ const packageJson = await fs.readJson(packageJsonPath);
258
+ context.hasInstantDB = !!(packageJson.dependencies?.["@instantdb/react"] ||
259
+ packageJson.dependencies?.["@instantdb/admin"]);
260
+ }
261
+ // Check for AI provider configuration
262
+ const envFiles = [".env", ".env.local", ".mycontext/.env"];
263
+ for (const envFile of envFiles) {
264
+ const envPath = path.join(projectRoot, envFile);
265
+ if (await fs.pathExists(envPath)) {
266
+ const content = await fs.readFile(envPath, "utf8");
267
+ if (content.includes("ANTHROPIC_API_KEY=") ||
268
+ content.includes("MYCONTEXT_XAI_API_KEY=")) {
269
+ context.aiProviderConfigured = true;
270
+ break;
271
+ }
272
+ }
273
+ }
274
+ // Check if this is a new project (recently initialized)
275
+ const mycontextDir = path.join(projectRoot, ".mycontext");
276
+ if (await fs.pathExists(mycontextDir)) {
277
+ const stats = await fs.stat(mycontextDir);
278
+ const daysSinceCreation = (Date.now() - stats.birthtimeMs) / (1000 * 60 * 60 * 24);
279
+ context.isNewProject = daysSinceCreation < 1; // Less than 1 day old
280
+ }
281
+ // Detect project type from PRD content
282
+ if (context.hasPRD) {
283
+ context.projectType = await this.detectProjectType(projectRoot);
284
+ }
285
+ }
286
+ catch (error) {
287
+ // Ignore errors in context detection
288
+ }
289
+ return context;
290
+ }
291
+ /**
292
+ * Detect project type from PRD content
293
+ */
294
+ static async detectProjectType(projectRoot) {
295
+ try {
296
+ const fs = await Promise.resolve().then(() => __importStar(require("fs-extra")));
297
+ const path = await Promise.resolve().then(() => __importStar(require("path")));
298
+ const prdPath = path.join(projectRoot, ".mycontext", "01-prd.md");
299
+ const content = await fs.readFile(prdPath, "utf8");
300
+ const lowerContent = content.toLowerCase();
301
+ // Detect project types based on keywords
302
+ if (lowerContent.includes("e-commerce") ||
303
+ lowerContent.includes("shopping") ||
304
+ lowerContent.includes("store")) {
305
+ return "ecommerce";
306
+ }
307
+ if (lowerContent.includes("dashboard") ||
308
+ lowerContent.includes("analytics") ||
309
+ lowerContent.includes("metrics")) {
310
+ return "dashboard";
311
+ }
312
+ if (lowerContent.includes("blog") ||
313
+ lowerContent.includes("content") ||
314
+ lowerContent.includes("cms")) {
315
+ return "content";
316
+ }
317
+ if (lowerContent.includes("social") ||
318
+ lowerContent.includes("feed") ||
319
+ lowerContent.includes("network")) {
320
+ return "social";
321
+ }
322
+ if (lowerContent.includes("game") || lowerContent.includes("gaming")) {
323
+ return "game";
324
+ }
325
+ if (lowerContent.includes("weather")) {
326
+ return "weather";
327
+ }
328
+ if (lowerContent.includes("finance") ||
329
+ lowerContent.includes("banking") ||
330
+ lowerContent.includes("money")) {
331
+ return "finance";
332
+ }
333
+ return "general";
334
+ }
335
+ catch (error) {
336
+ return "general";
337
+ }
338
+ }
339
+ /**
340
+ * Get intelligent workflow suggestions based on project analysis
341
+ */
342
+ static async getIntelligentSuggestions(projectRoot = process.cwd()) {
343
+ const context = await this.getWorkflowContext(projectRoot);
344
+ // Base suggestions
345
+ const suggestions = this.getNextSteps(context);
346
+ // Add project-type specific suggestions
347
+ const typeSpecificSuggestions = this.getProjectTypeSuggestions(context);
348
+ suggestions.push(...typeSpecificSuggestions);
349
+ // Add workflow suggestions
350
+ const workflowSuggestions = this.getWorkflowSuggestions(context);
351
+ suggestions.unshift(...workflowSuggestions); // Add to beginning
352
+ // Remove duplicates and sort by priority
353
+ const uniqueSuggestions = this.deduplicateSuggestions(suggestions);
354
+ return uniqueSuggestions.sort((a, b) => {
355
+ const priorityOrder = { high: 3, medium: 2, low: 1 };
356
+ return priorityOrder[b.priority] - priorityOrder[a.priority];
357
+ });
358
+ }
359
+ /**
360
+ * Get suggestions based on detected project type
361
+ */
362
+ static getProjectTypeSuggestions(context) {
363
+ const suggestions = [];
364
+ if (!context.projectType || context.projectType === "general")
365
+ return suggestions;
366
+ switch (context.projectType) {
367
+ case "ecommerce":
368
+ if (!context.hasComponents) {
369
+ suggestions.push({
370
+ description: "Generate e-commerce specific components",
371
+ command: "mycontext generate-components all --category ecommerce",
372
+ priority: "medium",
373
+ context: "Tailored for shopping cart, product display, checkout flow",
374
+ });
375
+ }
376
+ break;
377
+ case "dashboard":
378
+ if (!context.hasComponents) {
379
+ suggestions.push({
380
+ description: "Generate dashboard components",
381
+ command: "mycontext generate-components all --category dashboard",
382
+ priority: "medium",
383
+ context: "Charts, metrics cards, data tables for analytics",
384
+ });
385
+ }
386
+ break;
387
+ case "content":
388
+ if (!context.hasComponents) {
389
+ suggestions.push({
390
+ description: "Generate content/blog components",
391
+ command: "mycontext generate-components all --category content",
392
+ priority: "medium",
393
+ context: "Articles, comments, content management interface",
394
+ });
395
+ }
396
+ break;
397
+ }
398
+ return suggestions;
399
+ }
400
+ /**
401
+ * Get workflow-level suggestions
402
+ */
403
+ static getWorkflowSuggestions(context) {
404
+ const suggestions = [];
405
+ // Suggest complete workflow for new projects
406
+ if (context.isNewProject && !context.hasComponents) {
407
+ suggestions.push({
408
+ description: "Run complete project setup workflow",
409
+ command: "mycontext workflow start complete-setup --auto-continue",
410
+ priority: "high",
411
+ context: "Automated end-to-end project setup",
412
+ });
413
+ }
414
+ // Suggest workflow status check
415
+ suggestions.push({
416
+ description: "Check current workflow status",
417
+ command: "mycontext workflow status",
418
+ priority: "low",
419
+ context: "See progress and next steps",
420
+ });
421
+ return suggestions;
422
+ }
423
+ /**
424
+ * Remove duplicate suggestions
425
+ */
426
+ static deduplicateSuggestions(suggestions) {
427
+ const seen = new Set();
428
+ return suggestions.filter((suggestion) => {
429
+ const key = `${suggestion.command}:${suggestion.description}`;
430
+ if (seen.has(key))
431
+ return false;
432
+ seen.add(key);
433
+ return true;
434
+ });
435
+ }
436
+ }
437
+ exports.NextStepsSuggester = NextStepsSuggester;
438
+ //# sourceMappingURL=nextStepsSuggester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextStepsSuggester.js","sourceRoot":"","sources":["../../src/utils/nextStepsSuggester.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAqB1B,MAAa,kBAAkB;IAC7B;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAwB;QAC1C,MAAM,WAAW,GAAe,EAAE,CAAC;QAEnC,+BAA+B;QAC/B,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3D,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,iDAAiD;gBAC9D,OAAO,EAAE,uBAAuB;gBAChC,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,oCAAoC;aAC9C,EACD;gBACE,WAAW,EAAE,6BAA6B;gBAC1C,OAAO,EAAE,8BAA8B;gBACvC,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,0CAA0C;aACpD,EACD;gBACE,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,iCAAiC;gBAC1C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,oCAAoC;aAC9C,CACF,CAAC;QACJ,CAAC;QAED,wBAAwB;aACnB,IAAI,OAAO,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC7B,WAAW,CAAC,IAAI,CAAC;oBACf,WAAW,EAAE,iCAAiC;oBAC9C,OAAO,EAAE,kCAAkC;oBAC3C,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,+CAA+C;iBACzD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC;oBACf,WAAW,EAAE,+BAA+B;oBAC5C,OAAO,EAAE,0BAA0B;oBACnC,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,mCAAmC;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gCAAgC;aAC3B,IAAI,OAAO,CAAC,WAAW,KAAK,wBAAwB,EAAE,CAAC;YAC1D,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,2BAA2B;gBACxC,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,2BAA2B;aACrC,EACD;gBACE,WAAW,EAAE,2BAA2B;gBACxC,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,gCAAgC;aAC1C,CACF,CAAC;QACJ,CAAC;QAED,yBAAyB;aACpB,IACH,OAAO,CAAC,WAAW,KAAK,gBAAgB;YACxC,OAAO,CAAC,WAAW,KAAK,UAAU,EAClC,CAAC;YACD,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,yBAAyB;gBACtC,OAAO,EAAE,mCAAmC;gBAC5C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,sCAAsC;aAChD,EACD;gBACE,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE,sCAAsC;gBAC/C,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,mCAAmC;aAC7C,CACF,CAAC;QACJ,CAAC;QAED,kCAAkC;aAC7B,IAAI,OAAO,CAAC,WAAW,KAAK,yBAAyB,EAAE,CAAC;YAC3D,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,mCAAmC;gBAChD,OAAO,EAAE,gDAAgD;gBACzD,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,0BAA0B;aACpC,EACD;gBACE,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE,sCAAsC;gBAC/C,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,gCAAgC;aAC1C,CACF,CAAC;QACJ,CAAC;QAED,8BAA8B;aACzB,IAAI,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC9D,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,+BAA+B;gBAC5C,OAAO,EAAE,8BAA8B;gBACvC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,+BAA+B;aACzC,EACD;gBACE,WAAW,EAAE,4BAA4B;gBACzC,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,4BAA4B;aACtC,EACD;gBACE,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,yBAAyB;gBAClC,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,+BAA+B;aACzC,CACF,CAAC;QACJ,CAAC;QAED,mBAAmB;aACd,IAAI,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3B,WAAW,CAAC,IAAI,CAAC;oBACf,WAAW,EAAE,6BAA6B;oBAC1C,OAAO,EAAE,mCAAmC;oBAC5C,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,uBAAuB;iBACjC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC;oBACf,WAAW,EAAE,4BAA4B;oBACzC,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,2BAA2B;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACtD,WAAW,CAAC,IAAI,CAAC;oBACf,WAAW,EAAE,8BAA8B;oBAC3C,OAAO,EAAE,2BAA2B;oBACpC,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,uCAAuC;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CACd;gBACE,WAAW,EAAE,sBAAsB;gBACnC,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,0BAA0B;aACpC,EACD;gBACE,WAAW,EAAE,wBAAwB;gBACrC,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,0BAA0B;aACpC,CACF,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACrD,OAAO,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAuB,EAAE,WAAmB,CAAC;QACnE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEhC,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE1D,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,aAAa,GACjB,IAAI,CAAC,QAAQ,KAAK,MAAM;gBACtB,CAAC,CAAC,eAAK,CAAC,GAAG;gBACX,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBAC5B,CAAC,CAAC,eAAK,CAAC,MAAM;oBACd,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC;YAEjB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CACT,KAAK,eAAK,CAAC,IAAI,CACb,WAAW,WAAW,CAAC,MAAM,GAAG,QAAQ,mBAAmB,CAC5D,EAAE,CACJ,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAC7B,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QACpC,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;QAElC,MAAM,OAAO,GAAoB;YAC/B,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,KAAK;YACb,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,KAAK;YACpB,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,KAAK;YACnB,oBAAoB,EAAE,KAAK;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,gBAAgB;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAClE,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE9C,0BAA0B;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACxD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC3C,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,WAAW,CACvD,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3D,OAAO,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAE3D,mBAAmB;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC/D,OAAO,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAEtD,sBAAsB;YACtB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC/D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBACvD,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CACvB,WAAW,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC;oBAC9C,WAAW,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC,CAC/C,CAAC;YACJ,CAAC;YAED,sCAAsC;YACtC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;YAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACnD,IACE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;wBACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAC1C,CAAC;wBACD,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;wBACpC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,wDAAwD;YACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC1D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC1C,MAAM,iBAAiB,GACrB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,YAAY,GAAG,iBAAiB,GAAG,CAAC,CAAC,CAAC,sBAAsB;YACtE,CAAC;YAED,uCAAuC;YACvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qCAAqC;QACvC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;YACpC,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;YAElC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAE3C,yCAAyC;YACzC,IACE,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACnC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACjC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC9B,CAAC;gBACD,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IACE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAChC,CAAC;gBACD,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IACE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC7B,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAChC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC5B,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IACE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC/B,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC7B,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAChC,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrE,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IACE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAChC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAChC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC9B,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,yBAAyB,CACpC,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAE3D,mBAAmB;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE/C,wCAAwC;QACxC,MAAM,uBAAuB,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACxE,WAAW,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,CAAC;QAE7C,2BAA2B;QAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACjE,WAAW,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;QAEhE,yCAAyC;QACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACnE,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACrD,OAAO,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,yBAAyB,CACtC,OAAwB;QAExB,MAAM,WAAW,GAAe,EAAE,CAAC;QAEnC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAC3D,OAAO,WAAW,CAAC;QAErB,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5B,KAAK,WAAW;gBACd,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC3B,WAAW,CAAC,IAAI,CAAC;wBACf,WAAW,EAAE,yCAAyC;wBACtD,OAAO,EAAE,wDAAwD;wBACjE,QAAQ,EAAE,QAAQ;wBAClB,OAAO,EACL,4DAA4D;qBAC/D,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YAER,KAAK,WAAW;gBACd,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC3B,WAAW,CAAC,IAAI,CAAC;wBACf,WAAW,EAAE,+BAA+B;wBAC5C,OAAO,EAAE,wDAAwD;wBACjE,QAAQ,EAAE,QAAQ;wBAClB,OAAO,EAAE,kDAAkD;qBAC5D,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC3B,WAAW,CAAC,IAAI,CAAC;wBACf,WAAW,EAAE,kCAAkC;wBAC/C,OAAO,EAAE,sDAAsD;wBAC/D,QAAQ,EAAE,QAAQ;wBAClB,OAAO,EAAE,kDAAkD;qBAC5D,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;QACV,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,sBAAsB,CAAC,OAAwB;QAC5D,MAAM,WAAW,GAAe,EAAE,CAAC;QAEnC,6CAA6C;QAC7C,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACnD,WAAW,CAAC,IAAI,CAAC;gBACf,WAAW,EAAE,qCAAqC;gBAClD,OAAO,EAAE,yDAAyD;gBAClE,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,oCAAoC;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,WAAW,CAAC,IAAI,CAAC;YACf,WAAW,EAAE,+BAA+B;YAC5C,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,6BAA6B;SACvC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,sBAAsB,CAAC,WAAuB;QAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzeD,gDAyeC"}
@@ -4,6 +4,8 @@ export interface ProgressStep {
4
4
  status: "pending" | "running" | "completed" | "failed";
5
5
  startTime?: number;
6
6
  endTime?: number;
7
+ estimatedDuration?: number;
8
+ actualDuration?: number;
7
9
  }
8
10
  export declare class ProgressTracker {
9
11
  private title;
@@ -11,11 +13,39 @@ export declare class ProgressTracker {
11
13
  private currentStep;
12
14
  private startTime;
13
15
  constructor(title?: string);
14
- addStep(id: string, label: string): this;
16
+ addStep(id: string, label: string, estimatedDuration?: number): this;
15
17
  startStep(id: string): this;
16
18
  completeStep(id: string, message?: string): this;
17
19
  failStep(id: string, error?: string): this;
18
20
  getSummary(): string;
21
+ /**
22
+ * Get estimated time remaining for pending steps
23
+ */
24
+ getEstimatedTimeRemaining(): number;
25
+ /**
26
+ * Get estimated completion time
27
+ */
28
+ getEstimatedCompletionTime(): Date;
29
+ /**
30
+ * Format time duration for display
31
+ */
32
+ private formatDuration;
33
+ /**
34
+ * Get detailed progress with time estimates and visual progress bar
35
+ */
36
+ getDetailedProgress(): string;
37
+ /**
38
+ * Create a visual progress bar
39
+ */
40
+ private createProgressBar;
41
+ /**
42
+ * Show current step status with time remaining
43
+ */
44
+ showCurrentStep(): void;
45
+ /**
46
+ * Start periodic progress updates
47
+ */
48
+ startProgressUpdates(intervalMs?: number): NodeJS.Timeout;
19
49
  showSummary(): void;
20
50
  static runTask<T>(label: string, task: () => Promise<T>, options?: {
21
51
  showTiming?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAKd,OAAO,CAAC,KAAK;IAJzB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAsB;gBAEnB,KAAK,GAAE,MAAmB;IAE9C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASxC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAW3B,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAahD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAU1C,UAAU,IAAI,MAAM;IASpB,WAAW,IAAI,IAAI;WAUN,OAAO,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACrC,OAAO,CAAC,CAAC,CAAC;IAqBb,MAAM,CAAC,kBAAkB,IAAI,eAAe;CAQ7C;AAGD,eAAO,MAAM,QAAQ;;;CAGpB,CAAC"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,eAAe;IAKd,OAAO,CAAC,KAAK;IAJzB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAsB;gBAEnB,KAAK,GAAE,MAAmB;IAE9C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI;IAUpE,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAW3B,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAchD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAU1C,UAAU,IAAI,MAAM;IAWpB;;OAEG;IACH,yBAAyB,IAAI,MAAM;IA0BnC;;OAEG;IACH,0BAA0B,IAAI,IAAI;IAKlC;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAuB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,eAAe,IAAI,IAAI;IAuBvB;;OAEG;IACH,oBAAoB,CAAC,UAAU,GAAE,MAAa,GAAG,MAAM,CAAC,OAAO;IAM/D,WAAW,IAAI,IAAI;WAUN,OAAO,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACrC,OAAO,CAAC,CAAC,CAAC;IA2Bb,MAAM,CAAC,kBAAkB,IAAI,eAAe;CAQ7C;AAGD,eAAO,MAAM,QAAQ;;;CAGpB,CAAC"}
@@ -9,11 +9,12 @@ class ProgressTracker {
9
9
  this.currentStep = null;
10
10
  this.startTime = Date.now();
11
11
  }
12
- addStep(id, label) {
12
+ addStep(id, label, estimatedDuration) {
13
13
  this.steps.push({
14
14
  id,
15
15
  label,
16
16
  status: "pending",
17
+ estimatedDuration,
17
18
  });
18
19
  return this;
19
20
  }
@@ -33,6 +34,7 @@ class ProgressTracker {
33
34
  step.status = "completed";
34
35
  step.endTime = Date.now();
35
36
  const duration = step.endTime - (step.startTime || 0);
37
+ step.actualDuration = duration;
36
38
  const durationText = duration > 1000 ? `${(duration / 1000).toFixed(1)}s` : `${duration}ms`;
37
39
  logger_1.logger.success(`${message || step.label} (${durationText})`);
38
40
  }
@@ -54,6 +56,110 @@ class ProgressTracker {
54
56
  const total = this.steps.length;
55
57
  return `${completed}/${total} steps completed${failed > 0 ? `, ${failed} failed` : ""} (${(totalTime / 1000).toFixed(1)}s)`;
56
58
  }
59
+ /**
60
+ * Get estimated time remaining for pending steps
61
+ */
62
+ getEstimatedTimeRemaining() {
63
+ const pendingSteps = this.steps.filter((s) => s.status === "pending");
64
+ const runningStep = this.steps.find((s) => s.status === "running");
65
+ let remainingTime = 0;
66
+ // Add estimated time for pending steps
67
+ pendingSteps.forEach((step) => {
68
+ if (step.estimatedDuration) {
69
+ remainingTime += step.estimatedDuration;
70
+ }
71
+ else {
72
+ // Default estimate of 10 seconds per step if no estimate provided
73
+ remainingTime += 10000;
74
+ }
75
+ });
76
+ // Add remaining time for running step
77
+ if (runningStep && runningStep.estimatedDuration && runningStep.startTime) {
78
+ const elapsed = Date.now() - runningStep.startTime;
79
+ const remaining = Math.max(0, runningStep.estimatedDuration - elapsed);
80
+ remainingTime += remaining;
81
+ }
82
+ return remainingTime;
83
+ }
84
+ /**
85
+ * Get estimated completion time
86
+ */
87
+ getEstimatedCompletionTime() {
88
+ const remainingTime = this.getEstimatedTimeRemaining();
89
+ return new Date(Date.now() + remainingTime);
90
+ }
91
+ /**
92
+ * Format time duration for display
93
+ */
94
+ formatDuration(ms) {
95
+ if (ms < 1000)
96
+ return `${ms}ms`;
97
+ if (ms < 60000)
98
+ return `${(ms / 1000).toFixed(1)}s`;
99
+ if (ms < 3600000)
100
+ return `${(ms / 60000).toFixed(1)}m`;
101
+ return `${(ms / 3600000).toFixed(1)}h`;
102
+ }
103
+ /**
104
+ * Get detailed progress with time estimates and visual progress bar
105
+ */
106
+ getDetailedProgress() {
107
+ const completed = this.steps.filter((s) => s.status === "completed").length;
108
+ const total = this.steps.length;
109
+ const totalTime = Date.now() - this.startTime;
110
+ const eta = this.getEstimatedCompletionTime();
111
+ const etaFormatted = eta.toLocaleTimeString();
112
+ // Create visual progress bar
113
+ const progressBar = this.createProgressBar(completed, total);
114
+ let progress = `${completed}/${total} steps completed ${progressBar}`;
115
+ if (completed < total) {
116
+ const remaining = this.getEstimatedTimeRemaining();
117
+ const remainingFormatted = this.formatDuration(remaining);
118
+ progress += ` • ETA: ${etaFormatted} (${remainingFormatted} remaining)`;
119
+ }
120
+ progress += ` • Total: ${this.formatDuration(totalTime)}`;
121
+ return progress;
122
+ }
123
+ /**
124
+ * Create a visual progress bar
125
+ */
126
+ createProgressBar(completed, total, width = 20) {
127
+ const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
128
+ const filled = Math.round((completed / total) * width);
129
+ const empty = width - filled;
130
+ const bar = "█".repeat(filled) + "░".repeat(empty);
131
+ return `[${bar}] ${percentage}%`;
132
+ }
133
+ /**
134
+ * Show current step status with time remaining
135
+ */
136
+ showCurrentStep() {
137
+ const currentStep = this.steps.find((s) => s.status === "running");
138
+ if (!currentStep)
139
+ return;
140
+ const elapsed = Date.now() - (currentStep.startTime || 0);
141
+ const elapsedFormatted = this.formatDuration(elapsed);
142
+ let message = `${currentStep.label}... (${elapsedFormatted})`;
143
+ if (currentStep.estimatedDuration) {
144
+ const remaining = Math.max(0, currentStep.estimatedDuration - elapsed);
145
+ const remainingFormatted = this.formatDuration(remaining);
146
+ if (remaining > 0) {
147
+ message += ` • ${remainingFormatted} remaining`;
148
+ }
149
+ else {
150
+ message += ` • Overdue by ${this.formatDuration(-remaining)}`;
151
+ }
152
+ }
153
+ logger_1.logger.progress(message);
154
+ }
155
+ /**
156
+ * Start periodic progress updates
157
+ */
158
+ startProgressUpdates(intervalMs = 2000) {
159
+ return setInterval(() => {
160
+ this.showCurrentStep();
161
+ }, intervalMs);
162
+ }
57
163
  showSummary() {
58
164
  const summary = this.getSummary();
59
165
  if (this.steps.some((s) => s.status === "failed")) {
@@ -71,7 +177,9 @@ class ProgressTracker {
71
177
  const result = await task();
72
178
  const duration = Date.now() - startTime;
73
179
  const timing = options.showTiming && duration > 500
74
- ? ` (${duration > 1000 ? `${(duration / 1000).toFixed(1)}s` : `${duration}ms`})`
180
+ ? ` (${duration > 1000
181
+ ? `${(duration / 1000).toFixed(1)}s`
182
+ : `${duration}ms`})`
75
183
  : "";
76
184
  logger_1.logger.success(`${label}${timing}`);
77
185
  return result;