mycontext-cli 4.2.0 → 4.2.1

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 (56) hide show
  1. package/README.md +108 -135
  2. package/dist/README.md +108 -135
  3. package/dist/cli.js +72 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +36 -2
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/core/brain/BrainClient.d.ts +2 -0
  9. package/dist/core/brain/BrainClient.d.ts.map +1 -1
  10. package/dist/core/brain/BrainClient.js +19 -0
  11. package/dist/core/brain/BrainClient.js.map +1 -1
  12. package/dist/package.json +3 -3
  13. package/dist/services/ContextSyncer.d.ts +40 -0
  14. package/dist/services/ContextSyncer.d.ts.map +1 -0
  15. package/dist/services/ContextSyncer.js +219 -0
  16. package/dist/services/ContextSyncer.js.map +1 -0
  17. package/dist/services/ProjectScanner.d.ts +74 -0
  18. package/dist/services/ProjectScanner.d.ts.map +1 -0
  19. package/dist/services/ProjectScanner.js +343 -0
  20. package/dist/services/ProjectScanner.js.map +1 -0
  21. package/dist/services/ScaffoldAgent.d.ts +35 -0
  22. package/dist/services/ScaffoldAgent.d.ts.map +1 -0
  23. package/dist/services/ScaffoldAgent.js +228 -0
  24. package/dist/services/ScaffoldAgent.js.map +1 -0
  25. package/dist/tui/PlanningMode.d.ts +42 -0
  26. package/dist/tui/PlanningMode.d.ts.map +1 -0
  27. package/dist/tui/PlanningMode.js +401 -0
  28. package/dist/tui/PlanningMode.js.map +1 -0
  29. package/dist/tui/TUIClient.d.ts +20 -0
  30. package/dist/tui/TUIClient.d.ts.map +1 -0
  31. package/dist/tui/TUIClient.js +50 -0
  32. package/dist/tui/TUIClient.js.map +1 -0
  33. package/dist/types/mega-context.d.ts +118 -0
  34. package/dist/types/mega-context.d.ts.map +1 -0
  35. package/dist/types/mega-context.js +3 -0
  36. package/dist/types/mega-context.js.map +1 -0
  37. package/dist/types/tui.d.ts +29 -0
  38. package/dist/types/tui.d.ts.map +1 -0
  39. package/dist/types/tui.js +8 -0
  40. package/dist/types/tui.js.map +1 -0
  41. package/dist/types/unified-context.d.ts +102 -0
  42. package/dist/types/unified-context.d.ts.map +1 -0
  43. package/dist/types/unified-context.js +50 -0
  44. package/dist/types/unified-context.js.map +1 -0
  45. package/dist/utils/FileGenerator.d.ts +5 -0
  46. package/dist/utils/FileGenerator.d.ts.map +1 -1
  47. package/dist/utils/FileGenerator.js +48 -0
  48. package/dist/utils/FileGenerator.js.map +1 -1
  49. package/dist/utils/deepMerge.d.ts +14 -0
  50. package/dist/utils/deepMerge.d.ts.map +1 -0
  51. package/dist/utils/deepMerge.js +87 -0
  52. package/dist/utils/deepMerge.js.map +1 -0
  53. package/dist/utils/fileSystem.d.ts.map +1 -1
  54. package/dist/utils/fileSystem.js +32 -4
  55. package/dist/utils/fileSystem.js.map +1 -1
  56. package/package.json +23 -21
@@ -0,0 +1,343 @@
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.ProjectScanner = void 0;
40
+ /**
41
+ * ProjectScanner — Scans the real file structure and compares against context.json
42
+ *
43
+ * This is the "eyes" of the Living Brain:
44
+ * 1. Walks the actual project file tree
45
+ * 2. Reads key files (package.json, route files, components, schemas)
46
+ * 3. Builds a structured ProjectSnapshot
47
+ * 4. Passes snapshot + context.json to LLM for progress assessment
48
+ * 5. Returns a ContextDiffReport with suggested merges/updates
49
+ */
50
+ const fs = __importStar(require("fs-extra"));
51
+ const path = __importStar(require("path"));
52
+ const chalk_1 = __importDefault(require("chalk"));
53
+ const AICore_1 = require("../core/ai/AICore");
54
+ // --- Scanner ---
55
+ const IGNORE_DIRS = new Set([
56
+ "node_modules", ".next", ".git", "dist", "build", ".turbo",
57
+ ".pnpm-store", "coverage", ".cache", ".vercel", "__pycache__",
58
+ ]);
59
+ const IGNORE_EXTENSIONS = new Set([
60
+ ".png", ".jpg", ".jpeg", ".gif", ".svg", ".ico", ".woff", ".woff2",
61
+ ".ttf", ".eot", ".mp4", ".webm", ".mp3", ".wav", ".pdf", ".lock",
62
+ ".map",
63
+ ]);
64
+ const KEY_FILE_PATTERNS = [
65
+ /package\.json$/,
66
+ /tsconfig\.json$/,
67
+ /instant\.schema\.(ts|js)$/,
68
+ /instant\.perms\.(ts|js)$/,
69
+ /\.env\.example$/,
70
+ /layout\.(tsx|jsx|ts|js)$/,
71
+ /page\.(tsx|jsx|ts|js)$/,
72
+ /route\.(tsx|jsx|ts|js)$/,
73
+ /schema\.(ts|js|prisma)$/,
74
+ /globals\.css$/,
75
+ ];
76
+ const MAX_FILE_READ_SIZE = 3000; // chars per file
77
+ const MAX_KEY_FILES = 30; // cap to keep prompt manageable
78
+ const MAX_TREE_DEPTH = 6; // don't go too deep
79
+ class ProjectScanner {
80
+ constructor(projectRoot = process.cwd()) {
81
+ this.ai = null;
82
+ this.projectRoot = projectRoot;
83
+ }
84
+ /**
85
+ * Full scan: walk tree + read key files + build snapshot
86
+ */
87
+ async scan() {
88
+ const fileTree = [];
89
+ const keyFiles = [];
90
+ const stats = {
91
+ totalFiles: 0,
92
+ totalDirs: 0,
93
+ routeFiles: 0,
94
+ componentFiles: 0,
95
+ apiFiles: 0,
96
+ schemaFiles: 0,
97
+ testFiles: 0,
98
+ };
99
+ // Walk the tree
100
+ await this.walkDirectory("", fileTree, stats, 0);
101
+ // Read key files (truncated)
102
+ for (const entry of fileTree) {
103
+ if (entry.type !== "file")
104
+ continue;
105
+ if (keyFiles.length >= MAX_KEY_FILES)
106
+ break;
107
+ const isKeyFile = KEY_FILE_PATTERNS.some((p) => p.test(entry.path));
108
+ if (isKeyFile) {
109
+ const snippet = await this.readFileSnippet(entry.path);
110
+ if (snippet)
111
+ keyFiles.push(snippet);
112
+ }
113
+ }
114
+ return {
115
+ scannedAt: new Date().toISOString(),
116
+ projectRoot: this.projectRoot,
117
+ fileTree,
118
+ keyFiles,
119
+ stats,
120
+ };
121
+ }
122
+ /**
123
+ * Recursively walk a directory
124
+ */
125
+ async walkDirectory(relativePath, entries, stats, depth) {
126
+ if (depth > MAX_TREE_DEPTH)
127
+ return;
128
+ const fullPath = path.join(this.projectRoot, relativePath);
129
+ let items;
130
+ try {
131
+ items = await fs.readdir(fullPath);
132
+ }
133
+ catch {
134
+ return;
135
+ }
136
+ for (const item of items) {
137
+ if (IGNORE_DIRS.has(item) && depth < 2)
138
+ continue; // Allow nested dirs with same name
139
+ if (item.startsWith(".") && item !== ".env.example")
140
+ continue;
141
+ const itemRelPath = relativePath ? `${relativePath}/${item}` : item;
142
+ const itemFullPath = path.join(this.projectRoot, itemRelPath);
143
+ let stat;
144
+ try {
145
+ stat = await fs.stat(itemFullPath);
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ if (stat.isDirectory()) {
151
+ if (IGNORE_DIRS.has(item))
152
+ continue;
153
+ stats.totalDirs++;
154
+ entries.push({ path: itemRelPath, type: "dir" });
155
+ await this.walkDirectory(itemRelPath, entries, stats, depth + 1);
156
+ }
157
+ else if (stat.isFile()) {
158
+ const ext = path.extname(item);
159
+ if (IGNORE_EXTENSIONS.has(ext))
160
+ continue;
161
+ stats.totalFiles++;
162
+ entries.push({
163
+ path: itemRelPath,
164
+ type: "file",
165
+ size: stat.size,
166
+ extension: ext,
167
+ });
168
+ // Categorize
169
+ if (/page\.(tsx|jsx)$/.test(item) || /route\.(tsx|jsx|ts)$/.test(item))
170
+ stats.routeFiles++;
171
+ if (/^[A-Z].*\.(tsx|jsx)$/.test(item))
172
+ stats.componentFiles++;
173
+ if (itemRelPath.includes("/api/"))
174
+ stats.apiFiles++;
175
+ if (/schema|model|entity/i.test(item))
176
+ stats.schemaFiles++;
177
+ if (/\.(test|spec)\.(ts|tsx|js|jsx)$/.test(item))
178
+ stats.testFiles++;
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Read a file, truncated to MAX_FILE_READ_SIZE
184
+ */
185
+ async readFileSnippet(relativePath) {
186
+ try {
187
+ const fullPath = path.join(this.projectRoot, relativePath);
188
+ const content = await fs.readFile(fullPath, "utf-8");
189
+ const lines = content.split("\n").length;
190
+ return {
191
+ path: relativePath,
192
+ content: content.substring(0, MAX_FILE_READ_SIZE),
193
+ lines,
194
+ };
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ /**
201
+ * Compare a snapshot against context.json and get LLM assessment
202
+ */
203
+ async assessProgress(snapshot, existingContext) {
204
+ // Build a compact representation for the LLM
205
+ const treeCompact = snapshot.fileTree
206
+ .filter((f) => f.type === "file")
207
+ .map((f) => f.path)
208
+ .join("\n");
209
+ const keyFilesCompact = snapshot.keyFiles
210
+ .map((f) => `--- ${f.path} (${f.lines} lines) ---\n${f.content}`)
211
+ .join("\n\n");
212
+ const contextStr = JSON.stringify(existingContext, null, 2).substring(0, 5000);
213
+ const prompt = `You are the Living Brain's Assessment Engine for a MyContext-managed project.
214
+
215
+ TASK: Compare the ACTUAL project file structure against the project's PLANNED context (context.json) and provide a progress assessment.
216
+
217
+ ## ACTUAL FILE STRUCTURE (${snapshot.stats.totalFiles} files, ${snapshot.stats.totalDirs} dirs)
218
+ Stats: ${snapshot.stats.routeFiles} route files, ${snapshot.stats.componentFiles} components, ${snapshot.stats.apiFiles} API routes, ${snapshot.stats.schemaFiles} schema files, ${snapshot.stats.testFiles} test files
219
+
220
+ File tree:
221
+ ${treeCompact.substring(0, 3000)}
222
+
223
+ ## KEY FILES CONTENT
224
+ ${keyFilesCompact.substring(0, 4000)}
225
+
226
+ ## PLANNED CONTEXT (context.json)
227
+ ${contextStr}
228
+
229
+ ## INSTRUCTIONS
230
+ Analyze the gap between PLANNED and ACTUAL. Return valid JSON:
231
+ {
232
+ "overallProgress": <0-100 int>,
233
+ "progressSummary": "<2-3 sentence summary of current state>",
234
+ "diffs": [
235
+ {
236
+ "type": "missing_in_context" | "missing_in_code" | "outdated" | "suggestion",
237
+ "category": "route" | "component" | "entity" | "config" | "general",
238
+ "description": "<what's missing/outdated>",
239
+ "suggestion": "<concrete fix>"
240
+ }
241
+ ],
242
+ "suggestedContextMerge": {
243
+ // Partial context.json structure with suggested additions/updates
244
+ // Only include NEW items that should be added to context.json
245
+ }
246
+ }
247
+
248
+ Rules:
249
+ - "missing_in_context": Code exists but context.json doesn't know about it
250
+ - "missing_in_code": context.json plans it but code doesn't have it yet
251
+ - "outdated": Code has evolved beyond what context.json describes
252
+ - Focus on actionable, specific findings. Max 10 diffs.`;
253
+ try {
254
+ const ai = this.getAICore();
255
+ const report = await ai.generateStructuredText(prompt, "ContextDiffReport");
256
+ return {
257
+ assessedAt: new Date().toISOString(),
258
+ overallProgress: report.overallProgress || 0,
259
+ progressSummary: report.progressSummary || "Assessment complete.",
260
+ diffs: report.diffs || [],
261
+ suggestedContextMerge: report.suggestedContextMerge || {},
262
+ };
263
+ }
264
+ catch (error) {
265
+ return {
266
+ assessedAt: new Date().toISOString(),
267
+ overallProgress: -1,
268
+ progressSummary: `LLM assessment failed: ${error.message}`,
269
+ diffs: [],
270
+ suggestedContextMerge: {},
271
+ };
272
+ }
273
+ }
274
+ /**
275
+ * Display the scan results nicely
276
+ */
277
+ displaySnapshot(snapshot) {
278
+ console.log(chalk_1.default.cyan("\n┌──────────────────────────────────────────────┐"));
279
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.bold.white(" 📂 Project Scan Results") + " ".repeat(22) + chalk_1.default.cyan("│"));
280
+ console.log(chalk_1.default.cyan("├──────────────────────────────────────────────┤"));
281
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Files: ${String(snapshot.stats.totalFiles).padEnd(6)} Dirs: ${snapshot.stats.totalDirs}`.padEnd(45)) + chalk_1.default.cyan("│"));
282
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Routes: ${String(snapshot.stats.routeFiles).padEnd(6)} Components: ${snapshot.stats.componentFiles}`.padEnd(45)) + chalk_1.default.cyan("│"));
283
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` API Routes: ${String(snapshot.stats.apiFiles).padEnd(6)} Schemas: ${snapshot.stats.schemaFiles}`.padEnd(45)) + chalk_1.default.cyan("│"));
284
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Tests: ${String(snapshot.stats.testFiles).padEnd(6)}`.padEnd(45)) + chalk_1.default.cyan("│"));
285
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Key Files: ${snapshot.keyFiles.length} read for analysis`.padEnd(45)) + chalk_1.default.cyan("│"));
286
+ console.log(chalk_1.default.cyan("└──────────────────────────────────────────────┘"));
287
+ }
288
+ /**
289
+ * Display the diff report nicely
290
+ */
291
+ displayReport(report) {
292
+ const progressBar = this.makeProgressBar(report.overallProgress, 20);
293
+ console.log(chalk_1.default.cyan("\n┌──────────────────────────────────────────────┐"));
294
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.bold.white(" 🧠 Context Sync Assessment") + " ".repeat(18) + chalk_1.default.cyan("│"));
295
+ console.log(chalk_1.default.cyan("├──────────────────────────────────────────────┤"));
296
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.white(` Progress: ${progressBar} ${report.overallProgress}%`.padEnd(45)) + chalk_1.default.cyan("│"));
297
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` ${report.progressSummary.substring(0, 43)}`.padEnd(45)) + chalk_1.default.cyan("│"));
298
+ console.log(chalk_1.default.cyan("└──────────────────────────────────────────────┘"));
299
+ if (report.diffs.length > 0) {
300
+ console.log(chalk_1.default.yellow(`\n📋 Found ${report.diffs.length} items to sync:\n`));
301
+ for (const diff of report.diffs) {
302
+ const icon = {
303
+ missing_in_context: "🔵",
304
+ missing_in_code: "🔴",
305
+ outdated: "🟡",
306
+ suggestion: "💡",
307
+ }[diff.type];
308
+ console.log(` ${icon} [${diff.category}] ${diff.description}`);
309
+ console.log(chalk_1.default.gray(` → ${diff.suggestion}\n`));
310
+ }
311
+ }
312
+ if (Object.keys(report.suggestedContextMerge).length > 0) {
313
+ console.log(chalk_1.default.green("📦 Suggested context.json merge:"));
314
+ console.log(chalk_1.default.gray(JSON.stringify(report.suggestedContextMerge, null, 2).substring(0, 500)));
315
+ }
316
+ }
317
+ /**
318
+ * Get or initialize AICore safely
319
+ */
320
+ getAICore() {
321
+ if (this.ai)
322
+ return this.ai;
323
+ try {
324
+ this.ai = AICore_1.AICore.getInstance();
325
+ }
326
+ catch {
327
+ this.ai = AICore_1.AICore.getInstance({
328
+ fallbackEnabled: true,
329
+ workingDirectory: this.projectRoot,
330
+ });
331
+ }
332
+ return this.ai;
333
+ }
334
+ makeProgressBar(percent, width) {
335
+ if (percent < 0)
336
+ return "❌".padEnd(width);
337
+ const filled = Math.round((percent / 100) * width);
338
+ const empty = width - filled;
339
+ return "█".repeat(filled) + "░".repeat(empty);
340
+ }
341
+ }
342
+ exports.ProjectScanner = ProjectScanner;
343
+ //# sourceMappingURL=ProjectScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectScanner.js","sourceRoot":"","sources":["../../src/services/ProjectScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { MegaContext } from "../types/mega-context";
2
+ export declare class ScaffoldAgent {
3
+ private fs;
4
+ private spinner;
5
+ constructor();
6
+ /**
7
+ * Deterministically scaffold the project from the MegaContext
8
+ */
9
+ scaffold(context: MegaContext): Promise<void>;
10
+ /**
11
+ * Generate instant.schema.ts
12
+ */
13
+ private generateSchemaFile;
14
+ /**
15
+ * Generate Next.js App Router structure
16
+ */
17
+ private generateRoutes;
18
+ /**
19
+ * Create .env file with API keys
20
+ */
21
+ private createEnvFile;
22
+ /**
23
+ * Save the MegaContext to .mycontext/context.json
24
+ */
25
+ private saveContext;
26
+ /**
27
+ * Create the .mycontext/ALIGN file
28
+ */
29
+ private createAlign;
30
+ /**
31
+ * Generate a README.md based on the context
32
+ */
33
+ private createReadme;
34
+ }
35
+ //# sourceMappingURL=ScaffoldAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScaffoldAgent.d.ts","sourceRoot":"","sources":["../../src/services/ScaffoldAgent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,OAAO,CAAkB;;IAMjC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDnD;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;YACW,cAAc;IA2B5B;;OAEG;YACW,aAAa;IAmB3B;;OAEG;YACW,WAAW;IAMzB;;OAEG;YACW,WAAW;IAqBzB;;OAEG;YACW,YAAY;CA0B3B"}
@@ -0,0 +1,228 @@
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.ScaffoldAgent = void 0;
40
+ const spinner_1 = require("../utils/spinner");
41
+ const fileSystem_1 = require("../utils/fileSystem");
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const child_process_1 = require("child_process");
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs-extra"));
46
+ class ScaffoldAgent {
47
+ constructor() {
48
+ this.fs = new fileSystem_1.FileSystemManager();
49
+ this.spinner = new spinner_1.EnhancedSpinner("Refining architecture...");
50
+ }
51
+ /**
52
+ * Deterministically scaffold the project from the MegaContext
53
+ */
54
+ async scaffold(context) {
55
+ console.log(chalk_1.default.blue(`\n🚀 Scaling up to 100% deterministic scaffold for: ${context.project.name}\n`));
56
+ const projectPath = path.resolve(process.cwd(), context.project.name);
57
+ // 1. Framework Scaffold (Next.js)
58
+ if (!fs.existsSync(projectPath)) {
59
+ this.spinner.updateText("Bootstrapping Next.js + InstantDB...");
60
+ this.spinner.start();
61
+ try {
62
+ // Using a more deterministic install command (pnpm dlx create-next-app)
63
+ // We use --no-eslint --no-tailwind --no-src-dir etc to have full control?
64
+ // For now, let's stick to standard recommended setup but fast
65
+ (0, child_process_1.execSync)(`pnpm dlx create-next-app@latest ${context.project.name} --typescript --tailwind --eslint --app --no-src-dir --import-alias "@/*" --use-pnpm`, {
66
+ stdio: "ignore"
67
+ });
68
+ this.spinner.success({ text: "Next.js shell created." });
69
+ }
70
+ catch (e) {
71
+ this.spinner.error({ text: "Failed to scaffold Next.js app." });
72
+ throw e;
73
+ }
74
+ }
75
+ // 2. Install InstantDB
76
+ this.spinner.updateText("Installing InstantDB SDK...");
77
+ this.spinner.start();
78
+ (0, child_process_1.execSync)("pnpm add @instantdb/react @instantdb/admin", { cwd: projectPath, stdio: "ignore" });
79
+ this.spinner.success({ text: "InstantDB SDK installed." });
80
+ // 3. Generate Schema
81
+ this.spinner.updateText("Generating InstantDB Schema...");
82
+ this.spinner.start();
83
+ await this.generateSchemaFile(projectPath, context);
84
+ this.spinner.success({ text: "Schema generated from MegaContext." });
85
+ // 4. Generate Routes & Pages
86
+ this.spinner.updateText("Generating Route Structure...");
87
+ this.spinner.start();
88
+ await this.generateRoutes(projectPath, context);
89
+ this.spinner.success({ text: "Routes & Layouts generated." });
90
+ // 5. Persist "Living Brain"
91
+ this.spinner.updateText("Initializing Living Brain (.mycontext)...");
92
+ this.spinner.start();
93
+ await this.saveContext(projectPath, context);
94
+ await this.createAlign(projectPath);
95
+ await this.createReadme(projectPath, context);
96
+ await this.createEnvFile(projectPath);
97
+ this.spinner.success({ text: "Context, Utils, & .env saved." });
98
+ console.log(chalk_1.default.green(`\n✅ Project "${context.project.name}" is ready!`));
99
+ console.log(chalk_1.default.gray(` cd ${context.project.name} && pnpm dev`));
100
+ }
101
+ /**
102
+ * Generate instant.schema.ts
103
+ */
104
+ async generateSchemaFile(projectPath, context) {
105
+ // This would actually generate the full TS file content based on context.database.entities
106
+ // For prototype, we generate a stub
107
+ const schemaContent = `
108
+ import { i } from "@instantdb/react";
109
+
110
+ export const graph = i.graph(
111
+ "${context.project.id}",
112
+ {
113
+ ${Object.entries(context.database.entities).map(([name, def]) => `${name}: i.entity({
114
+ ${Object.keys(def.fields).map(f => `${f}: i.string()`).join(",\n ")}
115
+ })`).join(",\n ")}
116
+ }
117
+ );
118
+ `;
119
+ await fs.ensureDir(path.join(projectPath, "lib"));
120
+ await fs.writeFile(path.join(projectPath, "lib", "instant.schema.ts"), schemaContent);
121
+ }
122
+ /**
123
+ * Generate Next.js App Router structure
124
+ */
125
+ async generateRoutes(projectPath, context) {
126
+ const appDir = path.join(projectPath, "app");
127
+ for (const [routePath, routeNode] of Object.entries(context.routing.routes)) {
128
+ if (routeNode.type === "page") {
129
+ const relativePath = routePath === "/" ? "" : routePath.slice(1); // remove leading slash
130
+ const targetDir = path.join(appDir, relativePath);
131
+ await fs.ensureDir(targetDir);
132
+ const pageContent = `
133
+ export default function Page() {
134
+ return (
135
+ <div className="container mx-auto py-10">
136
+ <h1 className="text-4xl font-bold">${routeNode.ui?.title || "Page"}</h1>
137
+ <p className="mt-4 text-muted-foreground">${routeNode.ui?.description || ""}</p>
138
+ {/* Components: ${routeNode.ui?.components?.map(c => c.name).join(", ")} */}
139
+ </div>
140
+ );
141
+ }
142
+ `;
143
+ await fs.writeFile(path.join(targetDir, "page.tsx"), pageContent);
144
+ }
145
+ }
146
+ }
147
+ // ... existing methods ...
148
+ /**
149
+ * Create .env file with API keys
150
+ */
151
+ async createEnvFile(projectPath) {
152
+ // Collect specific keys we care about
153
+ const keys = [];
154
+ if (process.env.GEMINI_API_KEY)
155
+ keys.push(`GEMINI_API_KEY=${process.env.GEMINI_API_KEY}`);
156
+ if (process.env.GOOGLE_API_KEY)
157
+ keys.push(`GOOGLE_API_KEY=${process.env.GOOGLE_API_KEY}`);
158
+ if (process.env.OPENROUTER_API_KEY)
159
+ keys.push(`OPENROUTER_API_KEY=${process.env.OPENROUTER_API_KEY}`);
160
+ // Default InstantDB App ID (Placeholder)
161
+ keys.push(`NEXT_PUBLIC_INSTANT_APP_ID=${process.env.NEXT_PUBLIC_INSTANT_APP_ID || "YOUR_APP_ID_HERE"}`);
162
+ if (keys.length > 0) {
163
+ await fs.writeFile(path.join(projectPath, ".env"), keys.join("\n"));
164
+ }
165
+ }
166
+ /**
167
+ * Save the MegaContext to .mycontext/context.json
168
+ */
169
+ async saveContext(projectPath, context) {
170
+ const contextDir = path.join(projectPath, ".mycontext");
171
+ await fs.ensureDir(contextDir);
172
+ await fs.writeJSON(path.join(contextDir, "context.json"), context, { spaces: 2 });
173
+ }
174
+ /**
175
+ * Create the .mycontext/ALIGN file
176
+ */
177
+ async createAlign(projectPath) {
178
+ const alignContent = `# MyContext Alignment Guard [SYNC]
179
+ Any changes to code, architecture, or features MUST be synchronized with:
180
+ 1. \`.mycontext/context.json\` (Source of Truth / Living Brain)
181
+ 2. \`README.md\` (Human-facing orientation & usage)
182
+
183
+ [PHILOSOPHY: DETERMINISTIC SCAFFOLDING]:
184
+ - **Next.js + InstantDB First**: We are built for Next.js full-stack projects using InstantDB as the backend.
185
+ - **Mega Context (100% Knowledge)**:
186
+ - Before ANY code is generated, the MegaContext must be 100% populated.
187
+
188
+ [PROJECT SCANNER — CONTEXT SYNC]:
189
+ - Run \`mycontext scan --assess\` to compare actual code against planned context.json.
190
+ - Identifies routes/components/entities in code but missing from context, and vice versa.
191
+ - Use during development to keep context.json aligned with reality.
192
+ `;
193
+ const contextDir = path.join(projectPath, ".mycontext");
194
+ await fs.ensureDir(contextDir);
195
+ await fs.writeFile(path.join(contextDir, "ALIGN"), alignContent);
196
+ }
197
+ /**
198
+ * Generate a README.md based on the context
199
+ */
200
+ async createReadme(projectPath, context) {
201
+ const readmeContent = `# ${context.project.name}
202
+
203
+ ${context.project.description}
204
+
205
+ ## Tech Stack
206
+ - **Framework**: Next.js (App Router)
207
+ - **Backend**: InstantDB
208
+ - **Styling**: TailwindCSS + ShadCN
209
+
210
+ ## Computed Architecture
211
+ - **Roles**: ${context.auth.roles.map(r => r.name).join(", ")}
212
+ - **Entities**: ${Object.keys(context.database.entities).join(", ")}
213
+ - **Routes**: ${Object.keys(context.routing.routes).join(", ")}
214
+
215
+ ## Getting Started
216
+
217
+ \`\`\`bash
218
+ pnpm install
219
+ pnpm dev
220
+ \`\`\`
221
+
222
+ Generated by MyContext CLI 🚀
223
+ `;
224
+ await fs.writeFile(path.join(projectPath, "README.md"), readmeContent);
225
+ }
226
+ }
227
+ exports.ScaffoldAgent = ScaffoldAgent;
228
+ //# sourceMappingURL=ScaffoldAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScaffoldAgent.js","sourceRoot":"","sources":["../../src/services/ScaffoldAgent.ts"],"names":[],"mappings":"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"}