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,491 @@
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.detectProject = detectProject;
40
+ exports.runDoctor = runDoctor;
41
+ exports.displayResult = displayResult;
42
+ /**
43
+ * DoctorEngine — Main orchestrator for mycontext doctor
44
+ *
45
+ * 1. Detects project type (Next.js / Turborepo / Node.js)
46
+ * 2. Loads applicable rules
47
+ * 3. Runs checks, collects diagnostics
48
+ * 4. Computes score and grade
49
+ * 5. Optionally auto-fixes
50
+ */
51
+ const fs = __importStar(require("fs-extra"));
52
+ const path = __importStar(require("path"));
53
+ const chalk_1 = __importDefault(require("chalk"));
54
+ const index_1 = require("./rules/index");
55
+ // ─── Project Detection ────────────────────────────────────────────
56
+ async function detectProject(root) {
57
+ const absRoot = path.resolve(root);
58
+ const pkgPath = path.join(absRoot, "package.json");
59
+ let pkg = {};
60
+ if (await fs.pathExists(pkgPath)) {
61
+ try {
62
+ pkg = await fs.readJson(pkgPath);
63
+ }
64
+ catch { /* ignore */ }
65
+ }
66
+ // Detect package manager
67
+ const packageManager = await detectPackageManager(absRoot);
68
+ // Detect monorepo / Turborepo
69
+ const turboJson = path.join(absRoot, "turbo.json");
70
+ const hasTurbo = await fs.pathExists(turboJson);
71
+ const isMonorepo = hasTurbo || !!pkg.workspaces || await fs.pathExists(path.join(absRoot, "pnpm-workspace.yaml"));
72
+ // Detect Next.js
73
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
74
+ const hasNext = !!deps?.next;
75
+ // Detect TypeScript
76
+ const hasTs = await fs.pathExists(path.join(absRoot, "tsconfig.json"));
77
+ // Determine project type
78
+ let type = "node";
79
+ if (hasTurbo || (isMonorepo && hasTurbo)) {
80
+ type = "turbo";
81
+ }
82
+ else if (hasNext) {
83
+ type = "nextjs";
84
+ }
85
+ // Detect workspaces
86
+ let workspaces;
87
+ if (isMonorepo) {
88
+ workspaces = await detectWorkspaces(absRoot, pkg);
89
+ }
90
+ return {
91
+ type,
92
+ name: pkg.name || path.basename(absRoot),
93
+ root: absRoot,
94
+ version: pkg.version,
95
+ packageManager,
96
+ isMonorepo,
97
+ workspaces,
98
+ typescript: hasTs,
99
+ nextVersion: deps?.next,
100
+ reactVersion: deps?.react,
101
+ turboVersion: deps?.turbo,
102
+ };
103
+ }
104
+ async function detectPackageManager(root) {
105
+ if (await fs.pathExists(path.join(root, "pnpm-lock.yaml")))
106
+ return "pnpm";
107
+ if (await fs.pathExists(path.join(root, "yarn.lock")))
108
+ return "yarn";
109
+ if (await fs.pathExists(path.join(root, "bun.lockb")))
110
+ return "bun";
111
+ if (await fs.pathExists(path.join(root, "package-lock.json")))
112
+ return "npm";
113
+ return "unknown";
114
+ }
115
+ async function detectWorkspaces(root, pkg) {
116
+ const workspaces = [];
117
+ // Get workspace patterns from package.json or pnpm-workspace.yaml
118
+ let patterns = [];
119
+ if (pkg.workspaces) {
120
+ patterns = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages || [];
121
+ }
122
+ else {
123
+ const pnpmWs = path.join(root, "pnpm-workspace.yaml");
124
+ if (await fs.pathExists(pnpmWs)) {
125
+ const content = await fs.readFile(pnpmWs, "utf8");
126
+ const match = content.match(/packages:\s*\n((?:\s+-\s+.+\n?)*)/);
127
+ if (match && match[1]) {
128
+ patterns = match[1].split("\n").map(l => l.replace(/^\s*-\s*['"]?/, "").replace(/['"]?\s*$/, "")).filter(Boolean);
129
+ }
130
+ }
131
+ }
132
+ // Resolve workspace directories
133
+ for (const pattern of patterns) {
134
+ const baseDir = pattern.replace(/\/?\*$/, "");
135
+ const wsDir = path.join(root, baseDir);
136
+ if (await fs.pathExists(wsDir)) {
137
+ try {
138
+ const entries = await fs.readdir(wsDir, { withFileTypes: true });
139
+ for (const entry of entries) {
140
+ if (!entry.isDirectory())
141
+ continue;
142
+ const wsPath = path.join(baseDir, entry.name);
143
+ const absPath = path.join(root, wsPath);
144
+ const wsPkgPath = path.join(absPath, "package.json");
145
+ const hasPackageJson = await fs.pathExists(wsPkgPath);
146
+ let wsType = "node";
147
+ if (hasPackageJson) {
148
+ try {
149
+ const wsPkg = await fs.readJson(wsPkgPath);
150
+ const wsDeps = { ...wsPkg.dependencies, ...wsPkg.devDependencies };
151
+ if (wsDeps?.next)
152
+ wsType = "nextjs";
153
+ }
154
+ catch { /* ignore */ }
155
+ }
156
+ let name = entry.name;
157
+ if (hasPackageJson) {
158
+ try {
159
+ const wsPkg = await fs.readJson(wsPkgPath);
160
+ name = wsPkg.name || entry.name;
161
+ }
162
+ catch { /* ignore */ }
163
+ }
164
+ workspaces.push({
165
+ name,
166
+ path: wsPath,
167
+ absolutePath: absPath,
168
+ type: wsType,
169
+ hasPackageJson,
170
+ });
171
+ }
172
+ }
173
+ catch { /* ignore */ }
174
+ }
175
+ }
176
+ return workspaces;
177
+ }
178
+ // ─── Rule Context Factory ─────────────────────────────────────────
179
+ const IGNORE_DIRS = new Set([
180
+ "node_modules", ".next", ".git", "dist", "build", ".turbo",
181
+ ".pnpm-store", "coverage", ".cache", ".vercel", "__pycache__",
182
+ ]);
183
+ function createRuleContext(root, project, isWorkspace = false) {
184
+ return {
185
+ root,
186
+ project,
187
+ isWorkspace,
188
+ async readFile(relativePath) {
189
+ try {
190
+ const abs = path.join(root, relativePath);
191
+ return await fs.readFile(abs, "utf8");
192
+ }
193
+ catch {
194
+ return null;
195
+ }
196
+ },
197
+ async fileExists(relativePath) {
198
+ return fs.pathExists(path.join(root, relativePath));
199
+ },
200
+ async findFiles(pattern, maxDepth = 6) {
201
+ const results = [];
202
+ async function walk(dir, depth) {
203
+ if (depth > maxDepth)
204
+ return;
205
+ try {
206
+ const entries = await fs.readdir(dir, { withFileTypes: true });
207
+ for (const entry of entries) {
208
+ if (IGNORE_DIRS.has(entry.name))
209
+ continue;
210
+ const rel = path.relative(root, path.join(dir, entry.name));
211
+ if (entry.isDirectory()) {
212
+ await walk(path.join(dir, entry.name), depth + 1);
213
+ }
214
+ else if (pattern.test(rel)) {
215
+ results.push(rel);
216
+ }
217
+ }
218
+ }
219
+ catch { /* ignore permission errors */ }
220
+ }
221
+ await walk(root, 0);
222
+ return results;
223
+ },
224
+ async readJson(relativePath) {
225
+ try {
226
+ return await fs.readJson(path.join(root, relativePath));
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ },
232
+ };
233
+ }
234
+ // ─── Score Calculation ─────────────────────────────────────────────
235
+ function calculateScore(diagnostics, totalRules) {
236
+ if (totalRules === 0)
237
+ return { score: 100, grade: "A+" };
238
+ const errors = diagnostics.filter(d => d.severity === "error").length;
239
+ const warnings = diagnostics.filter(d => d.severity === "warning").length;
240
+ // Each error costs 5 points, each warning costs 2 points, min 0
241
+ const deductions = (errors * 5) + (warnings * 2);
242
+ const score = Math.max(0, Math.min(100, 100 - deductions));
243
+ let grade;
244
+ if (score >= 95)
245
+ grade = "A+";
246
+ else if (score >= 90)
247
+ grade = "A";
248
+ else if (score >= 85)
249
+ grade = "A-";
250
+ else if (score >= 80)
251
+ grade = "B+";
252
+ else if (score >= 75)
253
+ grade = "B";
254
+ else if (score >= 70)
255
+ grade = "B-";
256
+ else if (score >= 65)
257
+ grade = "C+";
258
+ else if (score >= 60)
259
+ grade = "C";
260
+ else if (score >= 55)
261
+ grade = "C-";
262
+ else if (score >= 50)
263
+ grade = "D";
264
+ else
265
+ grade = "F";
266
+ return { score, grade };
267
+ }
268
+ // ─── Main Doctor Engine ───────────────────────────────────────────
269
+ async function runDoctor(directory, options = {}) {
270
+ const start = Date.now();
271
+ const project = await detectProject(directory);
272
+ // Determine which roots to scan
273
+ const scanRoots = [];
274
+ if (project.isMonorepo && project.workspaces) {
275
+ // Filter by --project if specified
276
+ const workspaces = options.project
277
+ ? project.workspaces.filter(ws => ws.name === options.project ||
278
+ ws.path.endsWith(options.project) ||
279
+ ws.name.includes(options.project))
280
+ : project.workspaces;
281
+ // Scan root for turbo rules
282
+ scanRoots.push({ root: project.root, project });
283
+ // Scan each workspace
284
+ for (const ws of workspaces) {
285
+ const wsProject = {
286
+ ...project,
287
+ type: ws.type,
288
+ name: ws.name,
289
+ root: ws.absolutePath,
290
+ isMonorepo: false,
291
+ workspaces: undefined,
292
+ };
293
+ // Re-detect deps for this workspace
294
+ const wsPkg = await fs.readJson(path.join(ws.absolutePath, "package.json")).catch(() => ({}));
295
+ const wsDeps = { ...wsPkg.dependencies, ...wsPkg.devDependencies };
296
+ wsProject.nextVersion = wsDeps?.next;
297
+ wsProject.reactVersion = wsDeps?.react;
298
+ scanRoots.push({ root: ws.absolutePath, project: wsProject });
299
+ }
300
+ }
301
+ else {
302
+ scanRoots.push({ root: project.root, project });
303
+ }
304
+ // Filter rules by category and project type
305
+ const applicableRules = index_1.allRules.filter(rule => {
306
+ if (options.category && rule.category !== options.category)
307
+ return false;
308
+ return true;
309
+ });
310
+ // Run rules across all scan roots
311
+ const allDiagnostics = [];
312
+ const ruleResults = [];
313
+ const diagnosticsByRoot = new Map();
314
+ for (const { root, project: scanProject } of scanRoots) {
315
+ const isWorkspace = project.isMonorepo && root !== project.root;
316
+ const ctx = createRuleContext(root, scanProject, isWorkspace);
317
+ const rootDiagnostics = [];
318
+ // Only run rules that apply to this project type
319
+ const rules = applicableRules.filter((rule) => rule.appliesTo.includes(scanProject.type) ||
320
+ (scanProject.type === "turbo" && rule.appliesTo.includes("turbo")));
321
+ for (const rule of rules) {
322
+ try {
323
+ const diagnostics = await rule.check(ctx);
324
+ // Prefix file paths with workspace path for monorepos
325
+ const prefixedDiags = diagnostics.map((d) => ({
326
+ ...d,
327
+ filePath: project.isMonorepo && root !== project.root
328
+ ? path.relative(project.root, path.join(root, d.filePath))
329
+ : d.filePath,
330
+ }));
331
+ const existing = ruleResults.find((r) => r.ruleId === rule.id);
332
+ if (existing) {
333
+ existing.diagnostics.push(...prefixedDiags);
334
+ existing.passed = existing.passed && prefixedDiags.length === 0;
335
+ }
336
+ else {
337
+ ruleResults.push({
338
+ ruleId: rule.id,
339
+ ruleName: rule.name,
340
+ category: rule.category,
341
+ passed: prefixedDiags.length === 0,
342
+ diagnostics: prefixedDiags,
343
+ });
344
+ }
345
+ allDiagnostics.push(...prefixedDiags);
346
+ rootDiagnostics.push(...prefixedDiags);
347
+ }
348
+ catch (err) {
349
+ // Rule threw — treat as a pass (we don't want engine bugs to fail the scan)
350
+ }
351
+ }
352
+ diagnosticsByRoot.set(root, rootDiagnostics);
353
+ }
354
+ // Auto-fix if requested
355
+ let fixedCount = 0;
356
+ if (options.fix && !options.dryRun) {
357
+ for (const { root, project: scanProject } of scanRoots) {
358
+ const isWorkspace = project.isMonorepo && root !== project.root;
359
+ const ctx = createRuleContext(root, scanProject, isWorkspace);
360
+ const rules = applicableRules.filter((r) => r.appliesTo.includes(scanProject.type));
361
+ const rootDiags = diagnosticsByRoot.get(root) || [];
362
+ for (const rule of rules) {
363
+ if (!rule.fix)
364
+ continue;
365
+ const ruleDiags = rootDiags.filter(d => d.ruleId === rule.id && d.autoFixable);
366
+ for (const diag of ruleDiags) {
367
+ try {
368
+ const fixed = await rule.fix(ctx, diag);
369
+ if (fixed)
370
+ fixedCount++;
371
+ }
372
+ catch { /* ignore fix errors */ }
373
+ }
374
+ }
375
+ }
376
+ }
377
+ const { score, grade } = calculateScore(allDiagnostics, ruleResults.length);
378
+ return {
379
+ score,
380
+ grade,
381
+ diagnostics: allDiagnostics,
382
+ project,
383
+ ruleResults,
384
+ fixedCount: options.fix ? fixedCount : undefined,
385
+ duration: Date.now() - start,
386
+ };
387
+ }
388
+ // ─── Display ──────────────────────────────────────────────────────
389
+ function displayResult(result, options = {}) {
390
+ const { score, grade, diagnostics, project, ruleResults } = result;
391
+ // Score-only mode
392
+ if (options.score) {
393
+ if (options.json) {
394
+ console.log(JSON.stringify({ score, grade }));
395
+ }
396
+ else {
397
+ console.log(`${score}`);
398
+ }
399
+ return;
400
+ }
401
+ // JSON mode
402
+ if (options.json) {
403
+ console.log(JSON.stringify(result, null, 2));
404
+ return;
405
+ }
406
+ // Header
407
+ console.log();
408
+ console.log(chalk_1.default.bold("🩺 MyContext Doctor"));
409
+ console.log();
410
+ console.log(`${chalk_1.default.dim("📂 Project:")} ${project.name}`);
411
+ console.log(`${chalk_1.default.dim("🔍 Type:")} ${formatProjectType(project)}`);
412
+ if (project.isMonorepo && project.workspaces) {
413
+ console.log(`${chalk_1.default.dim("📦 Workspaces:")} ${project.workspaces.length} detected`);
414
+ }
415
+ console.log();
416
+ // Group diagnostics by category
417
+ const categories = ["nextjs", "turbo", "node", "dead"];
418
+ for (const cat of categories) {
419
+ const catResults = ruleResults.filter(r => r.category === cat);
420
+ if (catResults.length === 0)
421
+ continue;
422
+ console.log(chalk_1.default.bold(formatCategory(cat)));
423
+ console.log(chalk_1.default.dim("─".repeat(50)));
424
+ for (const rr of catResults) {
425
+ if (rr.passed) {
426
+ console.log(` ${chalk_1.default.green("✓")} ${chalk_1.default.dim(rr.ruleId.padEnd(35))} ${chalk_1.default.green("pass")}`);
427
+ }
428
+ else {
429
+ for (const diag of rr.diagnostics) {
430
+ const icon = diag.severity === "error" ? chalk_1.default.red("✗") : chalk_1.default.yellow("⚠");
431
+ const loc = diag.line ? chalk_1.default.dim(`:${diag.line}`) : "";
432
+ console.log(` ${icon} ${chalk_1.default.dim(diag.ruleId.padEnd(35))} ${diag.message}`);
433
+ if (options.verbose && diag.filePath) {
434
+ console.log(` ${chalk_1.default.dim("→")} ${chalk_1.default.cyan(diag.filePath)}${loc}`);
435
+ }
436
+ if (options.verbose && diag.help) {
437
+ console.log(` ${chalk_1.default.dim("💡")} ${chalk_1.default.dim(diag.help)}`);
438
+ }
439
+ }
440
+ }
441
+ }
442
+ console.log();
443
+ }
444
+ // Score
445
+ const errors = diagnostics.filter(d => d.severity === "error").length;
446
+ const warnings = diagnostics.filter(d => d.severity === "warning").length;
447
+ const passed = ruleResults.filter(r => r.passed).length;
448
+ console.log(chalk_1.default.bold("Score: ") + gradeColor(grade, `${score}/100 (${grade})`));
449
+ console.log(`${chalk_1.default.red(`Errors: ${errors}`)} | ` +
450
+ `${chalk_1.default.yellow(`Warnings: ${warnings}`)} | ` +
451
+ `${chalk_1.default.green(`Passed: ${passed}/${ruleResults.length}`)}`);
452
+ console.log(chalk_1.default.dim(`Completed in ${result.duration}ms`));
453
+ // Fix summary
454
+ if (result.fixedCount !== undefined) {
455
+ console.log();
456
+ console.log(chalk_1.default.green(`🔧 Fixed ${result.fixedCount} issues`));
457
+ }
458
+ else {
459
+ const fixable = diagnostics.filter(d => d.autoFixable).length;
460
+ if (fixable > 0) {
461
+ console.log();
462
+ console.log(chalk_1.default.dim(`Run ${chalk_1.default.cyan("mycontext doctor --fix")} to auto-fix ${fixable} issues`));
463
+ }
464
+ }
465
+ console.log();
466
+ }
467
+ function formatProjectType(project) {
468
+ if (project.type === "turbo")
469
+ return `Turborepo monorepo`;
470
+ if (project.type === "nextjs")
471
+ return `Next.js ${project.nextVersion || ""}`.trim();
472
+ return "Node.js";
473
+ }
474
+ function formatCategory(cat) {
475
+ switch (cat) {
476
+ case "nextjs": return "⚡ Next.js";
477
+ case "turbo": return "🌀 Turborepo";
478
+ case "node": return "📦 Node.js / Structure";
479
+ case "dead": return "💀 Dead Code";
480
+ }
481
+ }
482
+ function gradeColor(grade, text) {
483
+ if (grade.startsWith("A"))
484
+ return chalk_1.default.green(text);
485
+ if (grade.startsWith("B"))
486
+ return chalk_1.default.cyan(text);
487
+ if (grade.startsWith("C"))
488
+ return chalk_1.default.yellow(text);
489
+ return chalk_1.default.red(text);
490
+ }
491
+ //# sourceMappingURL=DoctorEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DoctorEngine.js","sourceRoot":"","sources":["../../src/doctor/DoctorEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DoctorResult, DiagnoseOptions } from "./types";
2
+ export declare function diagnose(directory: string, options?: DiagnoseOptions): Promise<DoctorResult>;
3
+ export { type DoctorResult, type DiagnoseOptions } from "./types";
4
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/doctor/api.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAE7E,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAKvB;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diagnose = diagnose;
4
+ /**
5
+ * Programmatic API for mycontext doctor
6
+ *
7
+ * Usage:
8
+ * import { diagnose } from "./doctor/api";
9
+ * const result = await diagnose("./path/to/project");
10
+ * console.log(result.score);
11
+ */
12
+ const DoctorEngine_1 = require("./DoctorEngine");
13
+ async function diagnose(directory, options = {}) {
14
+ return (0, DoctorEngine_1.runDoctor)(directory, {
15
+ category: options.category,
16
+ project: options.project,
17
+ });
18
+ }
19
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/doctor/api.ts"],"names":[],"mappings":";;AAWA,4BAQC;AAnBD;;;;;;;GAOG;AACH,iDAA2C;AAGpC,KAAK,UAAU,QAAQ,CAC5B,SAAiB,EACjB,UAA2B,EAAE;IAE7B,OAAO,IAAA,wBAAS,EAAC,SAAS,EAAE;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorRule } from "../types";
2
+ export declare const deadCodeRules: DoctorRule[];
3
+ //# sourceMappingURL=dead-code-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code-rules.d.ts","sourceRoot":"","sources":["../../../src/doctor/rules/dead-code-rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAC;AA6PpE,eAAO,MAAM,aAAa,EAAE,UAAU,EAIrC,CAAC"}