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.
- package/README.md +108 -135
- package/dist/README.md +108 -135
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +36 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/core/brain/BrainClient.d.ts +2 -0
- package/dist/core/brain/BrainClient.d.ts.map +1 -1
- package/dist/core/brain/BrainClient.js +19 -0
- package/dist/core/brain/BrainClient.js.map +1 -1
- package/dist/package.json +3 -3
- package/dist/services/ContextSyncer.d.ts +40 -0
- package/dist/services/ContextSyncer.d.ts.map +1 -0
- package/dist/services/ContextSyncer.js +219 -0
- package/dist/services/ContextSyncer.js.map +1 -0
- package/dist/services/ProjectScanner.d.ts +74 -0
- package/dist/services/ProjectScanner.d.ts.map +1 -0
- package/dist/services/ProjectScanner.js +343 -0
- package/dist/services/ProjectScanner.js.map +1 -0
- package/dist/services/ScaffoldAgent.d.ts +35 -0
- package/dist/services/ScaffoldAgent.d.ts.map +1 -0
- package/dist/services/ScaffoldAgent.js +228 -0
- package/dist/services/ScaffoldAgent.js.map +1 -0
- package/dist/tui/PlanningMode.d.ts +42 -0
- package/dist/tui/PlanningMode.d.ts.map +1 -0
- package/dist/tui/PlanningMode.js +401 -0
- package/dist/tui/PlanningMode.js.map +1 -0
- package/dist/tui/TUIClient.d.ts +20 -0
- package/dist/tui/TUIClient.d.ts.map +1 -0
- package/dist/tui/TUIClient.js +50 -0
- package/dist/tui/TUIClient.js.map +1 -0
- package/dist/types/mega-context.d.ts +118 -0
- package/dist/types/mega-context.d.ts.map +1 -0
- package/dist/types/mega-context.js +3 -0
- package/dist/types/mega-context.js.map +1 -0
- package/dist/types/tui.d.ts +29 -0
- package/dist/types/tui.d.ts.map +1 -0
- package/dist/types/tui.js +8 -0
- package/dist/types/tui.js.map +1 -0
- package/dist/types/unified-context.d.ts +102 -0
- package/dist/types/unified-context.d.ts.map +1 -0
- package/dist/types/unified-context.js +50 -0
- package/dist/types/unified-context.js.map +1 -0
- package/dist/utils/FileGenerator.d.ts +5 -0
- package/dist/utils/FileGenerator.d.ts.map +1 -1
- package/dist/utils/FileGenerator.js +48 -0
- package/dist/utils/FileGenerator.js.map +1 -1
- package/dist/utils/deepMerge.d.ts +14 -0
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/deepMerge.js +87 -0
- package/dist/utils/deepMerge.js.map +1 -0
- package/dist/utils/fileSystem.d.ts.map +1 -1
- package/dist/utils/fileSystem.js +32 -4
- package/dist/utils/fileSystem.js.map +1 -1
- 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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"}
|