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.
- package/README.md +169 -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 +3 -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 +8 -0
- package/dist/utils/claudeAgentClient.d.ts.map +1 -1
- package/dist/utils/claudeAgentClient.js +101 -25
- package/dist/utils/claudeAgentClient.js.map +1 -1
- package/dist/utils/envExampleGenerator.d.ts.map +1 -1
- package/dist/utils/envExampleGenerator.js +12 -1
- package/dist/utils/envExampleGenerator.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.d.ts.map +1 -1
- package/dist/utils/hybridAIClient.js +48 -14
- 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 +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":"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"}
|
package/dist/utils/progress.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/utils/progress.js
CHANGED
|
@@ -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
|
|
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;
|