mycontext-cli 4.2.0 → 4.2.2

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 (92) hide show
  1. package/README.md +128 -133
  2. package/dist/README.md +128 -133
  3. package/dist/cli.js +76 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +18 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +53 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +99 -2
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/core/brain/BrainClient.d.ts +2 -0
  13. package/dist/core/brain/BrainClient.d.ts.map +1 -1
  14. package/dist/core/brain/BrainClient.js +19 -0
  15. package/dist/core/brain/BrainClient.js.map +1 -1
  16. package/dist/doctor/DoctorEngine.d.ts +5 -0
  17. package/dist/doctor/DoctorEngine.d.ts.map +1 -0
  18. package/dist/doctor/DoctorEngine.js +491 -0
  19. package/dist/doctor/DoctorEngine.js.map +1 -0
  20. package/dist/doctor/api.d.ts +4 -0
  21. package/dist/doctor/api.d.ts.map +1 -0
  22. package/dist/doctor/api.js +19 -0
  23. package/dist/doctor/api.js.map +1 -0
  24. package/dist/doctor/rules/dead-code-rules.d.ts +3 -0
  25. package/dist/doctor/rules/dead-code-rules.d.ts.map +1 -0
  26. package/dist/doctor/rules/dead-code-rules.js +269 -0
  27. package/dist/doctor/rules/dead-code-rules.js.map +1 -0
  28. package/dist/doctor/rules/index.d.ts +11 -0
  29. package/dist/doctor/rules/index.d.ts.map +1 -0
  30. package/dist/doctor/rules/index.js +21 -0
  31. package/dist/doctor/rules/index.js.map +1 -0
  32. package/dist/doctor/rules/nextjs-rules.d.ts +3 -0
  33. package/dist/doctor/rules/nextjs-rules.d.ts.map +1 -0
  34. package/dist/doctor/rules/nextjs-rules.js +357 -0
  35. package/dist/doctor/rules/nextjs-rules.js.map +1 -0
  36. package/dist/doctor/rules/node-rules.d.ts +3 -0
  37. package/dist/doctor/rules/node-rules.d.ts.map +1 -0
  38. package/dist/doctor/rules/node-rules.js +290 -0
  39. package/dist/doctor/rules/node-rules.js.map +1 -0
  40. package/dist/doctor/rules/turbo-rules.d.ts +3 -0
  41. package/dist/doctor/rules/turbo-rules.d.ts.map +1 -0
  42. package/dist/doctor/rules/turbo-rules.js +215 -0
  43. package/dist/doctor/rules/turbo-rules.js.map +1 -0
  44. package/dist/doctor/types.d.ts +87 -0
  45. package/dist/doctor/types.d.ts.map +1 -0
  46. package/dist/doctor/types.js +6 -0
  47. package/dist/doctor/types.js.map +1 -0
  48. package/dist/package.json +4 -4
  49. package/dist/services/ContextSyncer.d.ts +40 -0
  50. package/dist/services/ContextSyncer.d.ts.map +1 -0
  51. package/dist/services/ContextSyncer.js +219 -0
  52. package/dist/services/ContextSyncer.js.map +1 -0
  53. package/dist/services/ProjectScanner.d.ts +74 -0
  54. package/dist/services/ProjectScanner.d.ts.map +1 -0
  55. package/dist/services/ProjectScanner.js +343 -0
  56. package/dist/services/ProjectScanner.js.map +1 -0
  57. package/dist/services/ScaffoldAgent.d.ts +35 -0
  58. package/dist/services/ScaffoldAgent.d.ts.map +1 -0
  59. package/dist/services/ScaffoldAgent.js +228 -0
  60. package/dist/services/ScaffoldAgent.js.map +1 -0
  61. package/dist/tui/PlanningMode.d.ts +42 -0
  62. package/dist/tui/PlanningMode.d.ts.map +1 -0
  63. package/dist/tui/PlanningMode.js +401 -0
  64. package/dist/tui/PlanningMode.js.map +1 -0
  65. package/dist/tui/TUIClient.d.ts +20 -0
  66. package/dist/tui/TUIClient.d.ts.map +1 -0
  67. package/dist/tui/TUIClient.js +50 -0
  68. package/dist/tui/TUIClient.js.map +1 -0
  69. package/dist/types/mega-context.d.ts +118 -0
  70. package/dist/types/mega-context.d.ts.map +1 -0
  71. package/dist/types/mega-context.js +3 -0
  72. package/dist/types/mega-context.js.map +1 -0
  73. package/dist/types/tui.d.ts +29 -0
  74. package/dist/types/tui.d.ts.map +1 -0
  75. package/dist/types/tui.js +8 -0
  76. package/dist/types/tui.js.map +1 -0
  77. package/dist/types/unified-context.d.ts +102 -0
  78. package/dist/types/unified-context.d.ts.map +1 -0
  79. package/dist/types/unified-context.js +50 -0
  80. package/dist/types/unified-context.js.map +1 -0
  81. package/dist/utils/FileGenerator.d.ts +5 -0
  82. package/dist/utils/FileGenerator.d.ts.map +1 -1
  83. package/dist/utils/FileGenerator.js +48 -0
  84. package/dist/utils/FileGenerator.js.map +1 -1
  85. package/dist/utils/deepMerge.d.ts +14 -0
  86. package/dist/utils/deepMerge.d.ts.map +1 -0
  87. package/dist/utils/deepMerge.js +87 -0
  88. package/dist/utils/deepMerge.js.map +1 -0
  89. package/dist/utils/fileSystem.d.ts.map +1 -1
  90. package/dist/utils/fileSystem.js +32 -4
  91. package/dist/utils/fileSystem.js.map +1 -1
  92. package/package.json +24 -22
@@ -0,0 +1,401 @@
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.PlanningMode = void 0;
40
+ const uuid_1 = require("uuid");
41
+ const prompts_1 = __importDefault(require("prompts"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const fs = __importStar(require("fs-extra"));
44
+ const path = __importStar(require("path"));
45
+ const AICore_1 = require("../core/ai/AICore");
46
+ const spinner_1 = require("../utils/spinner");
47
+ const ProjectScanner_1 = require("../services/ProjectScanner");
48
+ const ContextSyncer_1 = require("../services/ContextSyncer");
49
+ const unified_context_1 = require("../types/unified-context");
50
+ const deepMerge_1 = require("../utils/deepMerge");
51
+ class PlanningMode {
52
+ constructor(client, projectPath = process.cwd()) {
53
+ this.client = client;
54
+ this.projectPath = projectPath;
55
+ }
56
+ /**
57
+ * Start the AI-driven interview process.
58
+ * If existing context is found, enters refinement mode.
59
+ * Otherwise, starts fresh.
60
+ */
61
+ async start() {
62
+ // 1. Check for existing context (personalization)
63
+ const existingContext = await this.loadExistingContext();
64
+ if (existingContext) {
65
+ return this.startRefinementMode(existingContext);
66
+ }
67
+ return this.startFreshMode();
68
+ }
69
+ /**
70
+ * Load existing context.json if present (schema-agnostic)
71
+ */
72
+ async loadExistingContext() {
73
+ const contextPath = path.join(this.projectPath, ".mycontext", "context.json");
74
+ try {
75
+ if (await fs.pathExists(contextPath)) {
76
+ const context = await fs.readJson(contextPath);
77
+ return context;
78
+ }
79
+ }
80
+ catch (e) {
81
+ // Corrupted or unreadable — treat as fresh
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * REFINEMENT MODE: Schema-agnostic — works with MegaContext OR Brain format
87
+ */
88
+ async startRefinementMode(existingContext) {
89
+ console.log(chalk_1.default.green("🧠 Existing Living Brain detected!\n"));
90
+ // Use unified summary helper — works with any context shape
91
+ const summary = (0, unified_context_1.getContextSummary)(existingContext);
92
+ console.log(chalk_1.default.cyan("┌─────────────────────────────────────────┐"));
93
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.bold.white(` 📋 Current Context: ${summary.name}`) + " ".repeat(Math.max(0, 22 - summary.name.length)) + chalk_1.default.cyan("│"));
94
+ console.log(chalk_1.default.cyan("├─────────────────────────────────────────┤"));
95
+ if (summary.entities.length > 0)
96
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Entities: ${summary.entities.slice(0, 5).join(", ")}${summary.entities.length > 5 ? "..." : ""}`.padEnd(40)) + chalk_1.default.cyan("│"));
97
+ if (summary.routes.length > 0)
98
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Routes: ${summary.routes.slice(0, 4).join(", ")}${summary.routes.length > 4 ? "..." : ""}`.padEnd(40)) + chalk_1.default.cyan("│"));
99
+ if (summary.roles.length > 0)
100
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Roles: ${summary.roles.join(", ")}`.padEnd(40)) + chalk_1.default.cyan("│"));
101
+ if (summary.components.length > 0)
102
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Components: ${summary.components.length} in Lego DB`.padEnd(39)) + chalk_1.default.cyan("│"));
103
+ if (summary.checkpoints.length > 0)
104
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Milestones: ${summary.checkpoints.filter(c => c.status === "complete").length}/${summary.checkpoints.length} complete`.padEnd(39)) + chalk_1.default.cyan("│"));
105
+ if (summary.capabilities.length > 0)
106
+ console.log(chalk_1.default.cyan("│") + chalk_1.default.gray(` Capabilities: ${summary.capabilities.join(", ")}`.padEnd(38)) + chalk_1.default.cyan("│"));
107
+ console.log(chalk_1.default.cyan("└─────────────────────────────────────────┘\n"));
108
+ const { action } = await (0, prompts_1.default)({
109
+ type: "select",
110
+ name: "action",
111
+ message: "What would you like to do?",
112
+ choices: [
113
+ { title: "🔄 Refine & Evolve (describe changes to add)", value: "refine" },
114
+ { title: "📂 Scan & Assess (compare code vs context)", value: "scan" },
115
+ { title: "🔀 Sync (auto-update context.json + README)", value: "sync" },
116
+ { title: "🆕 Start Fresh (wipe and regenerate)", value: "fresh" },
117
+ { title: "❌ Cancel", value: "cancel" },
118
+ ],
119
+ });
120
+ if (action === "cancel")
121
+ process.exit(0);
122
+ if (action === "fresh")
123
+ return this.startFreshMode();
124
+ // Sync mode — autonomous recontextualization
125
+ if (action === "sync") {
126
+ await this.ensureApiKey();
127
+ const syncer = new ContextSyncer_1.ContextSyncer(this.projectPath);
128
+ const result = await syncer.syncAll();
129
+ if (result.contextUpdated || result.readmeUpdated) {
130
+ console.log(chalk_1.default.green("\n✅ Sync complete!"));
131
+ }
132
+ else {
133
+ console.log(chalk_1.default.yellow("\nℹ️ No changes needed."));
134
+ }
135
+ // Reload context and loop back
136
+ const refreshed = await this.loadExistingContext();
137
+ return this.startRefinementMode(refreshed || existingContext);
138
+ }
139
+ // Scan the real project structure
140
+ const scanner = new ProjectScanner_1.ProjectScanner(this.projectPath);
141
+ console.log(chalk_1.default.blue("\n📂 Scanning project structure...\n"));
142
+ const snapshot = await scanner.scan();
143
+ scanner.displaySnapshot(snapshot);
144
+ if (action === "scan") {
145
+ // Pure assessment mode — show diffs then loop back
146
+ await this.ensureApiKey();
147
+ console.log(chalk_1.default.blue("\n🧠 Assessing progress against context...\n"));
148
+ const report = await scanner.assessProgress(snapshot, existingContext);
149
+ scanner.displayReport(report);
150
+ // Ask if they want to merge suggestions
151
+ if (report.diffs.length > 0) {
152
+ const { merge } = await (0, prompts_1.default)({
153
+ type: "confirm",
154
+ name: "merge",
155
+ message: "Apply suggested context merge to evolve the plan?",
156
+ initial: true,
157
+ });
158
+ if (merge && Object.keys(report.suggestedContextMerge).length > 0) {
159
+ // DEEP merge (not shallow spread)
160
+ const merged = (0, deepMerge_1.deepMerge)(existingContext, report.suggestedContextMerge);
161
+ const contextPath = path.join(this.projectPath, ".mycontext", "context.json");
162
+ await fs.writeJson(contextPath, merged, { spaces: 2 });
163
+ console.log(chalk_1.default.green("✅ Context merged (deep) and saved!"));
164
+ }
165
+ }
166
+ // Restart refinement menu
167
+ return this.startRefinementMode(existingContext);
168
+ }
169
+ // Refinement path — include file tree in prompt
170
+ const { refinement } = await (0, prompts_1.default)({
171
+ type: "text",
172
+ name: "refinement",
173
+ message: "Describe what you want to add or change:",
174
+ initial: "Add a notifications system with real-time alerts",
175
+ });
176
+ if (!refinement)
177
+ process.exit(0);
178
+ // Build a compact file tree for the prompt
179
+ const fileTreeCompact = snapshot.fileTree
180
+ .filter(f => f.type === "file")
181
+ .map(f => f.path)
182
+ .slice(0, 100)
183
+ .join("\n");
184
+ const keyFilesCompact = snapshot.keyFiles
185
+ .map(f => `--- ${f.path} ---\n${f.content}`)
186
+ .join("\n\n");
187
+ const spinner = new spinner_1.EnhancedSpinner("Evolving architecture with real project data...");
188
+ spinner.start();
189
+ const prompt = `
190
+ You have an EXISTING Next.js + InstantDB application.
191
+
192
+ PLANNED CONTEXT (context.json):
193
+ ${JSON.stringify(existingContext, null, 2).substring(0, 3000)}
194
+
195
+ ACTUAL FILE STRUCTURE (${snapshot.stats.totalFiles} files):
196
+ ${fileTreeCompact.substring(0, 2000)}
197
+
198
+ KEY FILES:
199
+ ${keyFilesCompact.substring(0, 2000)}
200
+
201
+ The user wants to EVOLVE it with this request:
202
+ "${refinement}"
203
+
204
+ Generate a COMPLETE, UPDATED MegaContext JSON that:
205
+ 1. PRESERVES all existing entities, routes, roles, and components
206
+ 2. REFLECTS what actually exists in the codebase (fix any context drift)
207
+ 3. ADDS the new features requested
208
+ 4. Maintains consistency across the entire context
209
+
210
+ Return a valid MegaContext JSON with these sections:
211
+ - project (keep existing name & metadata)
212
+ - topLevelDesign (colors, fonts, radius)
213
+ - auth (roles, permissions — preserve existing + add new)
214
+ - database (entities, relationships — preserve existing + add new)
215
+ - routing (routes — preserve existing + add new)
216
+ - globalState (stores)
217
+ `;
218
+ try {
219
+ await this.ensureApiKey();
220
+ const ai = this.getAICore();
221
+ const generatedContext = await ai.generateStructuredText(prompt, "MegaContext");
222
+ // Preserve identity fields
223
+ generatedContext.project.id = existingContext.project?.id || (0, uuid_1.v4)();
224
+ generatedContext.project.contextPath = ".mycontext";
225
+ generatedContext.project.createdAt = existingContext.project?.createdAt || new Date().toISOString();
226
+ spinner.success({ text: "Architecture evolved!" });
227
+ return await this.reviewAndRefine(generatedContext);
228
+ }
229
+ catch (error) {
230
+ spinner.error({ text: "AI generation failed." });
231
+ console.error(chalk_1.default.red(error.message));
232
+ this.showApiKeyHelp();
233
+ process.exit(1);
234
+ }
235
+ }
236
+ /**
237
+ * FRESH MODE: Original clean-slate interview
238
+ */
239
+ async startFreshMode() {
240
+ console.log(chalk_1.default.blue("Let's define your Next.js + InstantDB project."));
241
+ console.log(chalk_1.default.gray("I will generate a complete plan based on your description.\n"));
242
+ // 1. Initial Input
243
+ const initialInput = await (0, prompts_1.default)([
244
+ {
245
+ type: "text",
246
+ name: "name",
247
+ message: "Project Name:",
248
+ initial: "my-app",
249
+ },
250
+ {
251
+ type: "text",
252
+ name: "description",
253
+ message: "Describe your app idea:",
254
+ initial: "A task management app where users can create teams and assign tasks.",
255
+ },
256
+ ]);
257
+ if (!initialInput.name)
258
+ process.exit(0);
259
+ // 2. AI Generation
260
+ const spinner = new spinner_1.EnhancedSpinner("Dreaming up the architecture...");
261
+ spinner.start();
262
+ const ALIGN_RULES = `
263
+ [PHILOSOPHY: DETERMINISTIC SCAFFOLDING]:
264
+ - **Next.js + InstantDB First**: We are built for Next.js full-stack projects using InstantDB as the backend.
265
+ - **Mega Context (100% Knowledge)**:
266
+ - Before ANY code is generated, the MegaContext must be 100% populated.
267
+ - Using: Routes, Users/Permissions, Pages, Server Actions, Client Components, Database Schema.
268
+
269
+ [LEGO ASSEMBLY]:
270
+ - **Component Registry**: Every component generated is stored in the Living DB.
271
+ `;
272
+ const prompt = `
273
+ Generate a complete 'MegaContext' JSON for a Next.js + InstantDB application based on this description:
274
+ "${initialInput.description}"
275
+
276
+ Project Name: "${initialInput.name}"
277
+
278
+ The JSON must adhere to the MegaContext structure and the following ALIGNMENT RULES:
279
+ ${ALIGN_RULES}
280
+
281
+ - Uses InstantDB for backend.
282
+ - Uses Tailwind + Shadcn for styling.
283
+ - Define granular roles and permissions.
284
+ - Define a comprehensive database schema (InstantDB graph).
285
+ - Define all necessary routes (Next.js App Router).
286
+
287
+ Return valid JSON with sections: project, topLevelDesign, auth, database, routing, globalState.
288
+ `;
289
+ try {
290
+ await this.ensureApiKey();
291
+ const ai = this.getAICore();
292
+ const generatedContext = await ai.generateStructuredText(prompt, "MegaContext");
293
+ // Ensure critical fields are set
294
+ generatedContext.project.id = (0, uuid_1.v4)();
295
+ generatedContext.project.contextPath = ".mycontext";
296
+ generatedContext.project.createdAt = new Date().toISOString();
297
+ spinner.success({ text: "Architecture plan generated!" });
298
+ // 3. Review & Edit Loop
299
+ return await this.reviewAndRefine(generatedContext);
300
+ }
301
+ catch (error) {
302
+ spinner.error({ text: "AI generation failed." });
303
+ console.error(chalk_1.default.red(error.message));
304
+ this.showApiKeyHelp();
305
+ process.exit(1);
306
+ }
307
+ }
308
+ /**
309
+ * Get or initialize AICore safely
310
+ */
311
+ getAICore() {
312
+ try {
313
+ return AICore_1.AICore.getInstance();
314
+ }
315
+ catch {
316
+ // AICore not yet initialized — initialize with defaults
317
+ return AICore_1.AICore.getInstance({
318
+ fallbackEnabled: true,
319
+ workingDirectory: this.projectPath,
320
+ });
321
+ }
322
+ }
323
+ /**
324
+ * Ensure an API key is available for AI generation
325
+ */
326
+ async ensureApiKey() {
327
+ if (process.env.GEMINI_API_KEY ||
328
+ process.env.GOOGLE_API_KEY ||
329
+ process.env.GITHUB_TOKEN ||
330
+ process.env.MYCONTEXT_GITHUB_TOKEN ||
331
+ process.env.OPENROUTER_API_KEY ||
332
+ process.env.MYCONTEXT_OPENROUTER_API_KEY ||
333
+ process.env.ANTHROPIC_API_KEY ||
334
+ process.env.XAI_API_KEY) {
335
+ return; // At least one key exists
336
+ }
337
+ // No keys — prompt user
338
+ console.log(chalk_1.default.yellow("\n⚠️ No AI API keys found in environment."));
339
+ console.log(chalk_1.default.gray("You need at least one key to generate the architecture plan."));
340
+ this.showApiKeyHelp();
341
+ const response = await (0, prompts_1.default)({
342
+ type: "password",
343
+ name: "apiKey",
344
+ message: "Enter your Gemini API Key (free):",
345
+ });
346
+ if (response.apiKey) {
347
+ process.env.GEMINI_API_KEY = response.apiKey.trim();
348
+ }
349
+ else {
350
+ console.log(chalk_1.default.red("❌ No API key provided. Exiting."));
351
+ process.exit(1);
352
+ }
353
+ }
354
+ /**
355
+ * Show API key help
356
+ */
357
+ showApiKeyHelp() {
358
+ console.log(chalk_1.default.cyan("\n💡 Get a free key:"));
359
+ console.log(chalk_1.default.gray(" Gemini (Free): https://aistudio.google.com/apikey"));
360
+ console.log(chalk_1.default.gray(" OpenRouter: https://openrouter.ai/keys"));
361
+ console.log(chalk_1.default.gray(" GitHub Models: https://github.com/settings/tokens\n"));
362
+ }
363
+ /**
364
+ * Present the context to the user and allow edits
365
+ */
366
+ async reviewAndRefine(context) {
367
+ while (true) {
368
+ console.log(chalk_1.default.cyan("\n--- 📋 Plan Review ---"));
369
+ console.log(`Name: ${chalk_1.default.bold(context.project.name)}`);
370
+ if (context.auth?.roles?.length > 0)
371
+ console.log(`Roles: ${context.auth.roles.map((r) => r.name).join(", ")}`);
372
+ if (context.database?.entities)
373
+ console.log(`Entities: ${Object.keys(context.database.entities).join(", ")}`);
374
+ if (context.routing?.routes)
375
+ console.log(`Routes: ${Object.keys(context.routing.routes).join(", ")}`);
376
+ console.log(chalk_1.default.cyan("----------------------\n"));
377
+ const { action } = await (0, prompts_1.default)({
378
+ type: "select",
379
+ name: "action",
380
+ message: "What would you like to do?",
381
+ choices: [
382
+ { title: "✅ Looks good, build it!", value: "approve" },
383
+ { title: "📝 Edit Description & Regenerate", value: "regenerate" },
384
+ { title: "❌ Cancel", value: "cancel" },
385
+ ],
386
+ });
387
+ if (action === "approve") {
388
+ return context;
389
+ }
390
+ else if (action === "cancel") {
391
+ process.exit(0);
392
+ }
393
+ else if (action === "regenerate") {
394
+ console.log(chalk_1.default.yellow("Restarting generation..."));
395
+ return this.startFreshMode();
396
+ }
397
+ }
398
+ }
399
+ }
400
+ exports.PlanningMode = PlanningMode;
401
+ //# sourceMappingURL=PlanningMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanningMode.js","sourceRoot":"","sources":["../../src/tui/PlanningMode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { TUIMode } from "../types/tui";
2
+ export declare class TUIClient {
3
+ private state;
4
+ private planningMode;
5
+ private projectPath;
6
+ constructor(projectPath?: string);
7
+ /**
8
+ * Start the TUI in Planning Mode (Context Collection)
9
+ */
10
+ startPlanningMode(): Promise<any>;
11
+ /**
12
+ * Switch modes
13
+ */
14
+ updateMode(mode: TUIMode): void;
15
+ /**
16
+ * Display a branded header
17
+ */
18
+ private displayHeader;
19
+ }
20
+ //# sourceMappingURL=TUIClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TUIClient.d.ts","sourceRoot":"","sources":["../../src/tui/TUIClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,OAAO,EAAE,MAAM,cAAc,CAAC;AAGjD,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAsB;IAe/C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC;IAQvC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO;IAKxB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TUIClient = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const PlanningMode_1 = require("./PlanningMode");
9
+ class TUIClient {
10
+ constructor(projectPath = process.cwd()) {
11
+ this.projectPath = projectPath;
12
+ this.state = {
13
+ mode: "PLANNING",
14
+ input: "",
15
+ history: [],
16
+ contextStatus: {
17
+ megaContextComplete: false,
18
+ missingFields: [],
19
+ },
20
+ isProcessing: false,
21
+ };
22
+ this.planningMode = new PlanningMode_1.PlanningMode(this, this.projectPath);
23
+ }
24
+ /**
25
+ * Start the TUI in Planning Mode (Context Collection)
26
+ */
27
+ async startPlanningMode() {
28
+ this.updateMode("PLANNING");
29
+ this.displayHeader("PLANNING MODE: Context Collection");
30
+ // Delegate to PlanningMode handler
31
+ return await this.planningMode.start();
32
+ }
33
+ /**
34
+ * Switch modes
35
+ */
36
+ updateMode(mode) {
37
+ this.state.mode = mode;
38
+ console.clear();
39
+ }
40
+ /**
41
+ * Display a branded header
42
+ */
43
+ displayHeader(title) {
44
+ console.log(chalk_1.default.cyan("========================================"));
45
+ console.log(chalk_1.default.bold.white(` MYCONTEXT | ${title}`));
46
+ console.log(chalk_1.default.cyan("========================================\n"));
47
+ }
48
+ }
49
+ exports.TUIClient = TUIClient;
50
+ //# sourceMappingURL=TUIClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TUIClient.js","sourceRoot":"","sources":["../../src/tui/TUIClient.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,iDAA8C;AAE9C,MAAa,SAAS;IAKpB,YAAY,cAAsB,OAAO,CAAC,GAAG,EAAE;QAC7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,aAAa,EAAE;gBACb,mBAAmB,EAAE,KAAK;gBAC1B,aAAa,EAAE,EAAE;aAClB;YACD,YAAY,EAAE,KAAK;SACpB,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC;QAExD,mCAAmC;QACnC,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAa;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAAa;QACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACxE,CAAC;CACF;AA/CD,8BA+CC"}
@@ -0,0 +1,118 @@
1
+ import { ProjectConfig } from "./index";
2
+ /**
3
+ * MEGA CONTEXT (The Source of Truth)
4
+ *
5
+ * This interface represents the 100% complete state required to
6
+ * deterministically scaffold a Next.js + InstantDB project.
7
+ *
8
+ * "Deterministic" means:
9
+ * - No AI guessing during scaffold.
10
+ * - All routes, components, and data points are known.
11
+ * - If a field is missing, the TUI must prompt for it BEFORE generation.
12
+ */
13
+ export interface MegaContext {
14
+ project: ProjectConfig & {
15
+ framework: "nextjs";
16
+ backend: "instantdb";
17
+ styling: "tailwind-shadcn";
18
+ };
19
+ topLevelDesign: {
20
+ theme: "light" | "dark" | "system";
21
+ colors: {
22
+ primary: string;
23
+ secondary: string;
24
+ accent: string;
25
+ background: string;
26
+ foreground: string;
27
+ };
28
+ fonts: {
29
+ heading: string;
30
+ body: string;
31
+ };
32
+ radius: number;
33
+ };
34
+ auth: {
35
+ provider: "instantdb" | "clerk" | "kinde" | "next-auth";
36
+ userModel: {
37
+ fields: Record<string, string>;
38
+ };
39
+ roles: RoleDefinition[];
40
+ permissions: PermissionRule[];
41
+ };
42
+ database: {
43
+ entities: Record<string, EntityDefinition>;
44
+ relationships: RelationshipDefinition[];
45
+ };
46
+ routing: {
47
+ routes: Record<string, RouteNode>;
48
+ };
49
+ globalState: {
50
+ stores: StoreDefinition[];
51
+ };
52
+ }
53
+ export interface RoleDefinition {
54
+ name: string;
55
+ description: string;
56
+ extends?: string;
57
+ }
58
+ export interface PermissionRule {
59
+ role: string;
60
+ resource: string;
61
+ action: "create" | "read" | "update" | "delete" | "manage";
62
+ condition?: string;
63
+ }
64
+ export interface EntityDefinition {
65
+ name: string;
66
+ fields: Record<string, {
67
+ type: "string" | "number" | "boolean" | "json" | "date" | "ref";
68
+ required: boolean;
69
+ unique?: boolean;
70
+ indexed?: boolean;
71
+ }>;
72
+ }
73
+ export interface RelationshipDefinition {
74
+ from: string;
75
+ to: string;
76
+ type: "one-to-one" | "one-to-many" | "many-to-many";
77
+ inverseName: string;
78
+ }
79
+ export interface RouteNode {
80
+ path: string;
81
+ type: "page" | "layout" | "group";
82
+ isProtected: boolean;
83
+ allowedRoles?: string[];
84
+ ui?: {
85
+ title: string;
86
+ description: string;
87
+ layout?: "default" | "dashboard" | "auth";
88
+ components: ComponentUsage[];
89
+ };
90
+ data?: {
91
+ queries: DataQuery[];
92
+ mutations: DataMutation[];
93
+ };
94
+ }
95
+ export interface ComponentUsage {
96
+ name: string;
97
+ type: "shadcn" | "custom";
98
+ props?: Record<string, any>;
99
+ children?: ComponentUsage[];
100
+ }
101
+ export interface DataQuery {
102
+ name: string;
103
+ entity: string;
104
+ source: "server-component" | "client-hook";
105
+ filter?: Record<string, any>;
106
+ }
107
+ export interface DataMutation {
108
+ name: string;
109
+ description: string;
110
+ args: Record<string, string>;
111
+ inputEntity?: string;
112
+ }
113
+ export interface StoreDefinition {
114
+ name: string;
115
+ state: Record<string, string>;
116
+ actions: string[];
117
+ }
118
+ //# sourceMappingURL=mega-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mega-context.d.ts","sourceRoot":"","sources":["../../src/types/mega-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mega-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mega-context.js","sourceRoot":"","sources":["../../src/types/mega-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * TUI MODES & STATE
3
+ *
4
+ * Defines the state machine for the "Claude Code"-like TUI.
5
+ */
6
+ export type TUIMode = "PLANNING" | "AGENT" | "AUTO_EDIT";
7
+ export interface TUIState {
8
+ mode: TUIMode;
9
+ input: string;
10
+ history: TUIHistoryItem[];
11
+ contextStatus: {
12
+ megaContextComplete: boolean;
13
+ missingFields: string[];
14
+ };
15
+ activeAgent?: string;
16
+ isProcessing: boolean;
17
+ }
18
+ export interface TUIHistoryItem {
19
+ role: "user" | "assistant" | "system";
20
+ content: string;
21
+ timestamp: number;
22
+ metadata?: {
23
+ mode: TUIMode;
24
+ command?: string;
25
+ output?: string;
26
+ };
27
+ }
28
+ export type TUISlashCommand = "/plan" | "/act" | "/edit" | "/review" | "/generate" | "/clear";
29
+ //# sourceMappingURL=tui.d.ts.map