mycontext-cli 2.0.34 → 2.0.36
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 +196 -70
- package/dist/cli.js +22 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate-design-prompt.d.ts +17 -0
- package/dist/commands/generate-design-prompt.d.ts.map +1 -0
- package/dist/commands/generate-design-prompt.js +233 -0
- package/dist/commands/generate-design-prompt.js.map +1 -0
- package/dist/commands/generate-sample-data.d.ts +43 -0
- package/dist/commands/generate-sample-data.d.ts.map +1 -0
- package/dist/commands/generate-sample-data.js +268 -0
- package/dist/commands/generate-sample-data.js.map +1 -0
- package/dist/commands/generate-screens.d.ts +51 -0
- package/dist/commands/generate-screens.d.ts.map +1 -0
- package/dist/commands/generate-screens.js +323 -0
- package/dist/commands/generate-screens.js.map +1 -0
- package/dist/config/ai-providers.json +94 -0
- package/dist/package.json +2 -2
- package/dist/utils/geminiClient.d.ts +92 -0
- package/dist/utils/geminiClient.d.ts.map +1 -0
- package/dist/utils/geminiClient.js +254 -0
- package/dist/utils/geminiClient.js.map +1 -0
- package/dist/utils/hybridAIClient.d.ts.map +1 -1
- package/dist/utils/hybridAIClient.js +18 -1
- package/dist/utils/hybridAIClient.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,233 @@
|
|
|
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.GenerateDesignPromptCommand = void 0;
|
|
40
|
+
exports.registerGenerateDesignPromptCommand = registerGenerateDesignPromptCommand;
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs-extra"));
|
|
43
|
+
const path_1 = __importDefault(require("path"));
|
|
44
|
+
const fileNames_1 = require("../constants/fileNames");
|
|
45
|
+
const spinner_1 = require("../utils/spinner");
|
|
46
|
+
const logger_1 = require("../utils/logger");
|
|
47
|
+
class GenerateDesignPromptCommand {
|
|
48
|
+
constructor() {
|
|
49
|
+
this.spinner = new spinner_1.EnhancedSpinner("Generating design prompt...");
|
|
50
|
+
}
|
|
51
|
+
async execute(options) {
|
|
52
|
+
const projectPath = process.cwd();
|
|
53
|
+
const contextDir = path_1.default.join(projectPath, ".mycontext");
|
|
54
|
+
this.spinner.start();
|
|
55
|
+
// Check if .mycontext directory exists
|
|
56
|
+
if (!fs.existsSync(contextDir)) {
|
|
57
|
+
this.spinner.fail("No .mycontext directory found");
|
|
58
|
+
console.log(chalk_1.default.red("\n❌ No .mycontext directory found. Run 'mycontext generate context' first."));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Load all context files
|
|
62
|
+
const context = await this.loadContextFiles(contextDir);
|
|
63
|
+
// Generate the design prompt
|
|
64
|
+
const prompt = this.generateDesignPrompt(context, options.format || "general");
|
|
65
|
+
// Determine output path
|
|
66
|
+
const outputPath = options.output
|
|
67
|
+
? path_1.default.resolve(options.output)
|
|
68
|
+
: path_1.default.join(contextDir, "design-prompt.txt");
|
|
69
|
+
// Write the prompt
|
|
70
|
+
await fs.writeFile(outputPath, prompt, "utf8");
|
|
71
|
+
this.spinner.succeed("Design prompt generated");
|
|
72
|
+
console.log(chalk_1.default.green(`\n✅ Design prompt saved to: ${outputPath}`));
|
|
73
|
+
console.log(chalk_1.default.blue("\n💡 Copy this prompt and paste it into your AI design tool (Stitch, etc.)"));
|
|
74
|
+
console.log(chalk_1.default.gray(`\n📋 Prompt length: ${prompt.length} characters (${Math.ceil(prompt.length / 1000)}k)`));
|
|
75
|
+
// Also output to console if requested
|
|
76
|
+
if (options.format === "api") {
|
|
77
|
+
console.log(chalk_1.default.yellow("\n📡 API JSON format:"));
|
|
78
|
+
console.log(JSON.stringify({
|
|
79
|
+
prompt,
|
|
80
|
+
metadata: {
|
|
81
|
+
generatedAt: new Date().toISOString(),
|
|
82
|
+
format: options.format,
|
|
83
|
+
contextFiles: Object.keys(context).filter((key) => context[key]),
|
|
84
|
+
},
|
|
85
|
+
}, null, 2));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async loadContextFiles(contextDir) {
|
|
89
|
+
const context = {};
|
|
90
|
+
const files = [
|
|
91
|
+
{ key: "prd", file: fileNames_1.CONTEXT_FILES.PRD },
|
|
92
|
+
{ key: "features", file: fileNames_1.CONTEXT_FILES.FEATURES },
|
|
93
|
+
{ key: "userFlows", file: fileNames_1.CONTEXT_FILES.USER_FLOWS },
|
|
94
|
+
{ key: "edgeCases", file: fileNames_1.CONTEXT_FILES.EDGE_CASES },
|
|
95
|
+
{ key: "technicalSpecs", file: fileNames_1.CONTEXT_FILES.TECHNICAL_SPECS },
|
|
96
|
+
{ key: "branding", file: fileNames_1.CONTEXT_FILES.BRANDING },
|
|
97
|
+
{ key: "projectStructure", file: fileNames_1.CONTEXT_FILES.PROJECT_STRUCTURE },
|
|
98
|
+
];
|
|
99
|
+
for (const { key, file } of files) {
|
|
100
|
+
const filePath = path_1.default.join(contextDir, file);
|
|
101
|
+
if (fs.existsSync(filePath)) {
|
|
102
|
+
try {
|
|
103
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
104
|
+
// Clean up markdown headers and metadata for cleaner prompt
|
|
105
|
+
const cleaned = this.cleanContent(content);
|
|
106
|
+
if (cleaned.trim()) {
|
|
107
|
+
context[key] = cleaned;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
logger_1.logger.warn(`Could not load ${file}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Load component list if exists
|
|
116
|
+
const componentListPath = path_1.default.join(contextDir, fileNames_1.CONTEXT_FILES.COMPONENT_LIST);
|
|
117
|
+
if (fs.existsSync(componentListPath)) {
|
|
118
|
+
try {
|
|
119
|
+
const componentList = JSON.parse(fs.readFileSync(componentListPath, "utf8"));
|
|
120
|
+
context.componentList = JSON.stringify(componentList, null, 2);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger_1.logger.warn("Could not load component list");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return context;
|
|
127
|
+
}
|
|
128
|
+
cleanContent(content) {
|
|
129
|
+
// Remove metadata footers
|
|
130
|
+
return content
|
|
131
|
+
.replace(/---\s*\n[\s\S]*?Generated by:.*?\n[\s\S]*?---/g, "")
|
|
132
|
+
.replace(/\*\*Generated\*\*:.*?\n/g, "")
|
|
133
|
+
.replace(/\*\*Source Context Files\*\*:.*?\n/g, "")
|
|
134
|
+
.replace(/## Document Information[\s\S]*?$/g, "")
|
|
135
|
+
.replace(/## Context File References[\s\S]*?$/g, "")
|
|
136
|
+
.trim();
|
|
137
|
+
}
|
|
138
|
+
generateDesignPrompt(context, format) {
|
|
139
|
+
const sections = [];
|
|
140
|
+
// Header
|
|
141
|
+
sections.push("# App Design Context");
|
|
142
|
+
sections.push("This document contains all the context needed to design beautiful, production-ready UI screens for this application.");
|
|
143
|
+
sections.push("");
|
|
144
|
+
// PRD Section (most important)
|
|
145
|
+
if (context.prd) {
|
|
146
|
+
sections.push("## Product Requirements Document (PRD)");
|
|
147
|
+
sections.push(context.prd);
|
|
148
|
+
sections.push("");
|
|
149
|
+
}
|
|
150
|
+
// Features Section
|
|
151
|
+
if (context.features) {
|
|
152
|
+
sections.push("## Features & User Actions");
|
|
153
|
+
sections.push(context.features);
|
|
154
|
+
sections.push("");
|
|
155
|
+
}
|
|
156
|
+
// User Flows Section
|
|
157
|
+
if (context.userFlows) {
|
|
158
|
+
sections.push("## User Flows");
|
|
159
|
+
sections.push(context.userFlows);
|
|
160
|
+
sections.push("");
|
|
161
|
+
}
|
|
162
|
+
// Branding Section (critical for design)
|
|
163
|
+
if (context.branding) {
|
|
164
|
+
sections.push("## Brand Guidelines & Design System");
|
|
165
|
+
sections.push(context.branding);
|
|
166
|
+
sections.push("");
|
|
167
|
+
}
|
|
168
|
+
// Technical Specs (for understanding constraints)
|
|
169
|
+
if (context.technicalSpecs) {
|
|
170
|
+
sections.push("## Technical Specifications");
|
|
171
|
+
sections.push(context.technicalSpecs);
|
|
172
|
+
sections.push("");
|
|
173
|
+
}
|
|
174
|
+
// Edge Cases (for comprehensive design)
|
|
175
|
+
if (context.edgeCases) {
|
|
176
|
+
sections.push("## Edge Cases & Error States");
|
|
177
|
+
sections.push(context.edgeCases);
|
|
178
|
+
sections.push("");
|
|
179
|
+
}
|
|
180
|
+
// Component List (if exists)
|
|
181
|
+
if (context.componentList) {
|
|
182
|
+
sections.push("## Required Components");
|
|
183
|
+
sections.push("The following components should be included in the design:");
|
|
184
|
+
sections.push("```json");
|
|
185
|
+
sections.push(context.componentList);
|
|
186
|
+
sections.push("```");
|
|
187
|
+
sections.push("");
|
|
188
|
+
}
|
|
189
|
+
// Project Structure (for context)
|
|
190
|
+
if (context.projectStructure) {
|
|
191
|
+
sections.push("## Project Structure");
|
|
192
|
+
sections.push(context.projectStructure);
|
|
193
|
+
sections.push("");
|
|
194
|
+
}
|
|
195
|
+
// Format-specific instructions
|
|
196
|
+
if (format === "stitch") {
|
|
197
|
+
sections.push("---");
|
|
198
|
+
sections.push("");
|
|
199
|
+
sections.push("## Design Instructions for Stitch");
|
|
200
|
+
sections.push("");
|
|
201
|
+
sections.push("Please create beautiful, modern UI designs for this application based on the context above.");
|
|
202
|
+
sections.push("");
|
|
203
|
+
sections.push("Design Requirements:");
|
|
204
|
+
sections.push("- Follow the brand guidelines and design system specified above");
|
|
205
|
+
sections.push("- Create designs for all user flows and features mentioned");
|
|
206
|
+
sections.push("- Include all required components from the component list");
|
|
207
|
+
sections.push("- Consider edge cases and error states in your designs");
|
|
208
|
+
sections.push("- Ensure designs are mobile-first and responsive");
|
|
209
|
+
sections.push("- Use modern UI/UX best practices and accessibility standards");
|
|
210
|
+
}
|
|
211
|
+
else if (format === "general") {
|
|
212
|
+
sections.push("---");
|
|
213
|
+
sections.push("");
|
|
214
|
+
sections.push("Use this context to design beautiful UI screens for this application.");
|
|
215
|
+
sections.push("Focus on the user flows, features, and brand guidelines provided above.");
|
|
216
|
+
}
|
|
217
|
+
return sections.join("\n");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.GenerateDesignPromptCommand = GenerateDesignPromptCommand;
|
|
221
|
+
function registerGenerateDesignPromptCommand(program) {
|
|
222
|
+
program
|
|
223
|
+
.command("generate:design-prompt")
|
|
224
|
+
.alias("gdp")
|
|
225
|
+
.description("Generate a design prompt optimized for AI design tools (Stitch, etc.)")
|
|
226
|
+
.option("-o, --output <path>", "Output file path (default: .mycontext/design-prompt.txt)")
|
|
227
|
+
.option("-f, --format <format>", "Output format: stitch, general, or api (default: general)")
|
|
228
|
+
.action(async (options) => {
|
|
229
|
+
const command = new GenerateDesignPromptCommand();
|
|
230
|
+
await command.execute(options);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=generate-design-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-design-prompt.js","sourceRoot":"","sources":["../../src/commands/generate-design-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
interface SampleDataOptions {
|
|
3
|
+
count?: number;
|
|
4
|
+
types?: string;
|
|
5
|
+
output?: string;
|
|
6
|
+
verbose?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate realistic sample data based on project types and schema
|
|
10
|
+
* Uses AI to create contextual, realistic test data for screens and previews
|
|
11
|
+
*/
|
|
12
|
+
export declare class GenerateSampleDataCommand {
|
|
13
|
+
private spinner;
|
|
14
|
+
private aiClient;
|
|
15
|
+
constructor();
|
|
16
|
+
execute(options: SampleDataOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Load context files to understand what sample data to generate
|
|
19
|
+
*/
|
|
20
|
+
private loadContext;
|
|
21
|
+
/**
|
|
22
|
+
* Generate sample data using AI based on project context
|
|
23
|
+
*/
|
|
24
|
+
private generateSampleData;
|
|
25
|
+
/**
|
|
26
|
+
* Build comprehensive prompt for sample data generation
|
|
27
|
+
*/
|
|
28
|
+
private buildSampleDataPrompt;
|
|
29
|
+
/**
|
|
30
|
+
* Generate fallback sample data when AI fails
|
|
31
|
+
*/
|
|
32
|
+
private generateFallbackData;
|
|
33
|
+
/**
|
|
34
|
+
* Show summary of generated data
|
|
35
|
+
*/
|
|
36
|
+
private showSummary;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register the generate:sample-data command
|
|
40
|
+
*/
|
|
41
|
+
export declare function registerGenerateSampleDataCommand(program: Command): void;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=generate-sample-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-sample-data.d.ts","sourceRoot":"","sources":["../../src/commands/generate-sample-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAOD;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAiB;;IAO3B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDxD;;OAEG;YACW,WAAW;IAsCzB;;OAEG;YACW,kBAAkB;IAoChC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiD5B;;OAEG;IACH,OAAO,CAAC,WAAW;CAkBpB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBxE"}
|
|
@@ -0,0 +1,268 @@
|
|
|
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.GenerateSampleDataCommand = void 0;
|
|
40
|
+
exports.registerGenerateSampleDataCommand = registerGenerateSampleDataCommand;
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs-extra"));
|
|
43
|
+
const path_1 = __importDefault(require("path"));
|
|
44
|
+
const fileNames_1 = require("../constants/fileNames");
|
|
45
|
+
const spinner_1 = require("../utils/spinner");
|
|
46
|
+
const logger_1 = require("../utils/logger");
|
|
47
|
+
const hybridAIClient_1 = require("../utils/hybridAIClient");
|
|
48
|
+
/**
|
|
49
|
+
* Generate realistic sample data based on project types and schema
|
|
50
|
+
* Uses AI to create contextual, realistic test data for screens and previews
|
|
51
|
+
*/
|
|
52
|
+
class GenerateSampleDataCommand {
|
|
53
|
+
constructor() {
|
|
54
|
+
this.spinner = new spinner_1.EnhancedSpinner("Generating sample data...");
|
|
55
|
+
this.aiClient = new hybridAIClient_1.HybridAIClient();
|
|
56
|
+
}
|
|
57
|
+
async execute(options) {
|
|
58
|
+
const projectPath = process.cwd();
|
|
59
|
+
const contextDir = path_1.default.join(projectPath, ".mycontext");
|
|
60
|
+
this.spinner.start();
|
|
61
|
+
// Check if .mycontext directory exists
|
|
62
|
+
if (!fs.existsSync(contextDir)) {
|
|
63
|
+
this.spinner.fail("No .mycontext directory found");
|
|
64
|
+
console.log(chalk_1.default.red("\n❌ No .mycontext directory found. Run 'mycontext init' first."));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
// Load context files for understanding what data to generate
|
|
69
|
+
const context = await this.loadContext(contextDir, projectPath);
|
|
70
|
+
// Generate sample data using AI
|
|
71
|
+
const sampleData = await this.generateSampleData(context, options);
|
|
72
|
+
// Determine output path
|
|
73
|
+
const outputPath = options.output
|
|
74
|
+
? path_1.default.resolve(options.output)
|
|
75
|
+
: path_1.default.join(contextDir, "sample-data.json");
|
|
76
|
+
// Write sample data
|
|
77
|
+
await fs.writeFile(outputPath, JSON.stringify(sampleData, null, 2), "utf8");
|
|
78
|
+
this.spinner.succeed("Sample data generated");
|
|
79
|
+
console.log(chalk_1.default.green(`\n✅ Sample data saved to: ${outputPath}`));
|
|
80
|
+
console.log(chalk_1.default.blue("\n💡 This data will be used for realistic screen previews and testing"));
|
|
81
|
+
// Show summary
|
|
82
|
+
this.showSummary(sampleData);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
this.spinner.fail("Sample data generation failed");
|
|
86
|
+
logger_1.logger.error("Error generating sample data:", error.message);
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Load context files to understand what sample data to generate
|
|
92
|
+
*/
|
|
93
|
+
async loadContext(contextDir, projectPath) {
|
|
94
|
+
const context = {};
|
|
95
|
+
// Load PRD for project understanding
|
|
96
|
+
const prdPath = path_1.default.join(contextDir, fileNames_1.CONTEXT_FILES.PRD);
|
|
97
|
+
if (fs.existsSync(prdPath)) {
|
|
98
|
+
context.prd = fs.readFileSync(prdPath, "utf8");
|
|
99
|
+
}
|
|
100
|
+
// Load types definition
|
|
101
|
+
const typesPath = path_1.default.join(contextDir, fileNames_1.CONTEXT_FILES.TYPES);
|
|
102
|
+
if (fs.existsSync(typesPath)) {
|
|
103
|
+
context.types = fs.readFileSync(typesPath, "utf8");
|
|
104
|
+
}
|
|
105
|
+
// Load InstantDB schema if exists
|
|
106
|
+
const schemaPath = path_1.default.join(projectPath, "instant.schema.ts");
|
|
107
|
+
if (fs.existsSync(schemaPath)) {
|
|
108
|
+
context.schema = fs.readFileSync(schemaPath, "utf8");
|
|
109
|
+
}
|
|
110
|
+
// Load features for understanding use cases
|
|
111
|
+
const featuresPath = path_1.default.join(contextDir, fileNames_1.CONTEXT_FILES.FEATURES);
|
|
112
|
+
if (fs.existsSync(featuresPath)) {
|
|
113
|
+
context.features = fs.readFileSync(featuresPath, "utf8");
|
|
114
|
+
}
|
|
115
|
+
return context;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate sample data using AI based on project context
|
|
119
|
+
*/
|
|
120
|
+
async generateSampleData(context, options) {
|
|
121
|
+
const count = options.count || 10;
|
|
122
|
+
// Build prompt for AI
|
|
123
|
+
const prompt = this.buildSampleDataPrompt(context, count, options.types);
|
|
124
|
+
if (options.verbose) {
|
|
125
|
+
logger_1.logger.info("Generating sample data with AI...");
|
|
126
|
+
}
|
|
127
|
+
// Use AI to generate sample data
|
|
128
|
+
const response = await this.aiClient.generateText(prompt, {
|
|
129
|
+
temperature: 0.8, // Higher temperature for more variety in sample data
|
|
130
|
+
maxTokens: 4000,
|
|
131
|
+
});
|
|
132
|
+
// Parse response (AI should return JSON)
|
|
133
|
+
try {
|
|
134
|
+
const responseText = response.text;
|
|
135
|
+
// Extract JSON from response
|
|
136
|
+
const jsonMatch = responseText.match(/```json\n([\s\S]*?)\n```/);
|
|
137
|
+
if (jsonMatch && jsonMatch[1]) {
|
|
138
|
+
return JSON.parse(jsonMatch[1]);
|
|
139
|
+
}
|
|
140
|
+
// Try to parse as direct JSON
|
|
141
|
+
return JSON.parse(responseText);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger_1.logger.warn("Could not parse AI response as JSON, using fallback data");
|
|
145
|
+
return this.generateFallbackData(context, count);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build comprehensive prompt for sample data generation
|
|
150
|
+
*/
|
|
151
|
+
buildSampleDataPrompt(context, count, types) {
|
|
152
|
+
let prompt = `You are a data generator. Generate realistic, production-quality sample data for testing and previews.
|
|
153
|
+
|
|
154
|
+
IMPORTANT:
|
|
155
|
+
- Generate VALID JSON only
|
|
156
|
+
- Use realistic, varied data (names, emails, dates, etc.)
|
|
157
|
+
- Match the data types and schema provided
|
|
158
|
+
- Include ${count} items for each data type
|
|
159
|
+
- Make data contextually relevant to the project
|
|
160
|
+
- Output ONLY JSON, wrapped in \`\`\`json code blocks
|
|
161
|
+
|
|
162
|
+
`;
|
|
163
|
+
if (context.prd) {
|
|
164
|
+
prompt += `\n## PROJECT CONTEXT:\n${context.prd.substring(0, 2000)}\n`;
|
|
165
|
+
}
|
|
166
|
+
if (context.types) {
|
|
167
|
+
prompt += `\n## TYPE DEFINITIONS:\n${context.types}\n`;
|
|
168
|
+
}
|
|
169
|
+
if (context.schema) {
|
|
170
|
+
prompt += `\n## DATABASE SCHEMA:\n${context.schema}\n`;
|
|
171
|
+
}
|
|
172
|
+
if (context.features) {
|
|
173
|
+
prompt += `\n## FEATURES (for context):\n${context.features.substring(0, 1000)}\n`;
|
|
174
|
+
}
|
|
175
|
+
if (types) {
|
|
176
|
+
prompt += `\n## SPECIFIC TYPES TO GENERATE:\n${types}\n`;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
prompt += `\n## GENERATE DATA FOR:\n- users (with realistic names, emails, avatars, roles)\n- Any other entities defined in the schema/types\n`;
|
|
180
|
+
}
|
|
181
|
+
prompt += `\nGenerate realistic sample data matching the above context. Return as JSON with keys for each entity type.`;
|
|
182
|
+
return prompt;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate fallback sample data when AI fails
|
|
186
|
+
*/
|
|
187
|
+
generateFallbackData(context, count) {
|
|
188
|
+
const data = {
|
|
189
|
+
users: [],
|
|
190
|
+
};
|
|
191
|
+
// Generate basic user data
|
|
192
|
+
const firstNames = [
|
|
193
|
+
"Alice",
|
|
194
|
+
"Bob",
|
|
195
|
+
"Charlie",
|
|
196
|
+
"Diana",
|
|
197
|
+
"Eve",
|
|
198
|
+
"Frank",
|
|
199
|
+
"Grace",
|
|
200
|
+
"Henry",
|
|
201
|
+
"Ivy",
|
|
202
|
+
"Jack",
|
|
203
|
+
];
|
|
204
|
+
const lastNames = [
|
|
205
|
+
"Smith",
|
|
206
|
+
"Johnson",
|
|
207
|
+
"Williams",
|
|
208
|
+
"Brown",
|
|
209
|
+
"Jones",
|
|
210
|
+
"Garcia",
|
|
211
|
+
"Miller",
|
|
212
|
+
"Davis",
|
|
213
|
+
"Rodriguez",
|
|
214
|
+
"Martinez",
|
|
215
|
+
];
|
|
216
|
+
for (let i = 0; i < Math.min(count, 10); i++) {
|
|
217
|
+
const firstName = firstNames[i % firstNames.length];
|
|
218
|
+
const lastName = lastNames[i % lastNames.length];
|
|
219
|
+
data.users.push({
|
|
220
|
+
id: `user-${i + 1}`,
|
|
221
|
+
name: `${firstName} ${lastName}`,
|
|
222
|
+
email: `${firstName.toLowerCase()}.${lastName.toLowerCase()}@example.com`,
|
|
223
|
+
avatar: `https://i.pravatar.cc/150?img=${i + 1}`,
|
|
224
|
+
role: i === 0 ? "admin" : "user",
|
|
225
|
+
createdAt: new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000).toISOString(),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return data;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Show summary of generated data
|
|
232
|
+
*/
|
|
233
|
+
showSummary(data) {
|
|
234
|
+
console.log(chalk_1.default.yellow("\n📊 Generated Sample Data:"));
|
|
235
|
+
Object.keys(data).forEach((key) => {
|
|
236
|
+
const items = data[key];
|
|
237
|
+
if (Array.isArray(items)) {
|
|
238
|
+
console.log(chalk_1.default.gray(` ${key}: ${items.length} items`));
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
console.log(chalk_1.default.gray(` ${key}: ${typeof items}`));
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
console.log(chalk_1.default.gray("\n💡 Use this data with 'mycontext generate:screens' for realistic previews"));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.GenerateSampleDataCommand = GenerateSampleDataCommand;
|
|
248
|
+
/**
|
|
249
|
+
* Register the generate:sample-data command
|
|
250
|
+
*/
|
|
251
|
+
function registerGenerateSampleDataCommand(program) {
|
|
252
|
+
program
|
|
253
|
+
.command("generate:sample-data")
|
|
254
|
+
.alias("gsd")
|
|
255
|
+
.description("Generate realistic sample data based on types and schema for screen previews")
|
|
256
|
+
.option("-c, --count <number>", "Number of items per type", "10")
|
|
257
|
+
.option("-t, --types <types>", "Comma-separated list of data types to generate")
|
|
258
|
+
.option("-o, --output <path>", "Output file path (default: .mycontext/sample-data.json)")
|
|
259
|
+
.option("-v, --verbose", "Show detailed output")
|
|
260
|
+
.action(async (options) => {
|
|
261
|
+
const command = new GenerateSampleDataCommand();
|
|
262
|
+
await command.execute({
|
|
263
|
+
...options,
|
|
264
|
+
count: options.count ? parseInt(options.count) : 10,
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=generate-sample-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-sample-data.js","sourceRoot":"","sources":["../../src/commands/generate-sample-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
interface ScreenGenerationOptions {
|
|
3
|
+
format?: string;
|
|
4
|
+
output?: string;
|
|
5
|
+
screen?: string;
|
|
6
|
+
all?: boolean;
|
|
7
|
+
includeScreenshot?: boolean;
|
|
8
|
+
screenshot?: boolean;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
open?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate visual screens (HTML/PNG) using Gemini API + nanobanana-style generation
|
|
14
|
+
* Reads context from .mycontext/ and generates screens with realistic previews
|
|
15
|
+
*/
|
|
16
|
+
export declare class GenerateScreensCommand {
|
|
17
|
+
private spinner;
|
|
18
|
+
private geminiClient;
|
|
19
|
+
constructor();
|
|
20
|
+
execute(screenName?: string, options?: ScreenGenerationOptions): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Load context files for screen generation
|
|
23
|
+
*/
|
|
24
|
+
private loadContext;
|
|
25
|
+
/**
|
|
26
|
+
* Determine which screens to generate based on options and context
|
|
27
|
+
*/
|
|
28
|
+
private determineScreens;
|
|
29
|
+
/**
|
|
30
|
+
* Extract screen names from user flows
|
|
31
|
+
*/
|
|
32
|
+
private extractScreenNamesFromFlows;
|
|
33
|
+
/**
|
|
34
|
+
* Generate a single screen
|
|
35
|
+
*/
|
|
36
|
+
private generateScreen;
|
|
37
|
+
/**
|
|
38
|
+
* Update screens manifest file
|
|
39
|
+
*/
|
|
40
|
+
private updateScreensManifest;
|
|
41
|
+
/**
|
|
42
|
+
* Open generated screen in browser
|
|
43
|
+
*/
|
|
44
|
+
private openInBrowser;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register the generate:screens command
|
|
48
|
+
*/
|
|
49
|
+
export declare function registerGenerateScreensCommand(program: Command): void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=generate-screens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-screens.d.ts","sourceRoot":"","sources":["../../src/commands/generate-screens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,UAAU,uBAAuB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAAe;;IAO7B,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IA8FxF;;OAEG;YACW,WAAW;IAgDzB;;OAEG;YACW,gBAAgB;IAkC9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAqBnC;;OAEG;YACW,cAAc;IA+D5B;;OAEG;YACW,qBAAqB;IAsCnC;;OAEG;YACW,aAAa;CA4B5B;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2BrE"}
|