mindforge-cc 2.1.1 → 2.1.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 (84) hide show
  1. package/CHANGELOG.md +25 -6
  2. package/README.md +68 -43
  3. package/RELEASENOTES.md +26 -26
  4. package/bin/install.js +41 -41
  5. package/bin/installer-core.js +67 -26
  6. package/bin/wizard/setup-wizard.js +11 -24
  7. package/bin/wizard/theme.js +141 -0
  8. package/docs/PERSONAS.md +80 -48
  9. package/docs/References/config-reference.md +81 -0
  10. package/docs/architecture/README.md +54 -42
  11. package/docs/commands-reference.md +62 -15
  12. package/docs/getting-started.md +26 -18
  13. package/docs/skills-authoring-guide.md +39 -11
  14. package/docs/tutorial.md +83 -116
  15. package/docs/user-guide.md +72 -198
  16. package/package.json +1 -1
  17. package/.mindforge/memory/decision-library.jsonl +0 -0
  18. package/.mindforge/memory/knowledge-base.jsonl +0 -7
  19. package/.mindforge/memory/pattern-library.jsonl +0 -1
  20. package/.mindforge/memory/team-preferences.jsonl +0 -4
  21. package/.planning/browser-daemon.log +0 -32
  22. package/docs/mindforge-md-reference.md +0 -57
  23. package/docs/references/config-reference.md +0 -64
  24. /package/docs/{context → Context}/Master-Context.md +0 -0
  25. /package/docs/{references → References}/audit-events.md +0 -0
  26. /package/docs/{references → References}/checkpoints.md +0 -0
  27. /package/docs/{references → References}/commands.md +0 -0
  28. /package/docs/{references → References}/continuation-format.md +0 -0
  29. /package/docs/{references → References}/decimal-phase-calculation.md +0 -0
  30. /package/docs/{references → References}/git-integration.md +0 -0
  31. /package/docs/{references → References}/git-planning-commit.md +0 -0
  32. /package/docs/{references → References}/model-profile-resolution.md +0 -0
  33. /package/docs/{references → References}/model-profiles.md +0 -0
  34. /package/docs/{references → References}/phase-argument-parsing.md +0 -0
  35. /package/docs/{references → References}/planning-config.md +0 -0
  36. /package/docs/{references → References}/questioning.md +0 -0
  37. /package/docs/{references → References}/sdk-api.md +0 -0
  38. /package/docs/{references → References}/skills-api.md +0 -0
  39. /package/docs/{references → References}/tdd.md +0 -0
  40. /package/docs/{references → References}/ui-brand.md +0 -0
  41. /package/docs/{references → References}/user-profiling.md +0 -0
  42. /package/docs/{references → References}/verification-patterns.md +0 -0
  43. /package/docs/{references → References}/workstream-flag.md +0 -0
  44. /package/docs/{templates → Templates}/Agents/CLAUDE-MD.md +0 -0
  45. /package/docs/{templates → Templates}/Agents/COPILOT-INSTRUCTIONS.md +0 -0
  46. /package/docs/{templates → Templates}/Agents/DEBUGGER-PROMPT.md +0 -0
  47. /package/docs/{templates → Templates}/Agents/PLANNER-PROMPT.md +0 -0
  48. /package/docs/{templates/codebase → Templates/Codebase}/architecture.md +0 -0
  49. /package/docs/{templates/codebase → Templates/Codebase}/concerns.md +0 -0
  50. /package/docs/{templates/codebase → Templates/Codebase}/conventions.md +0 -0
  51. /package/docs/{templates/codebase → Templates/Codebase}/integrations.md +0 -0
  52. /package/docs/{templates/codebase → Templates/Codebase}/stack.md +0 -0
  53. /package/docs/{templates/codebase → Templates/Codebase}/structure.md +0 -0
  54. /package/docs/{templates/codebase → Templates/Codebase}/testing.md +0 -0
  55. /package/docs/{templates → Templates}/Execution/CONTINUE-HERE.md +0 -0
  56. /package/docs/{templates → Templates}/Execution/DISCUSSION-LOG.md +0 -0
  57. /package/docs/{templates → Templates}/Execution/PHASE-PROMPT.md +0 -0
  58. /package/docs/{templates → Templates}/Execution/STATE.md +0 -0
  59. /package/docs/{templates → Templates}/Execution/SUMMARY-COMPLEX.md +0 -0
  60. /package/docs/{templates → Templates}/Execution/SUMMARY-MINIMAL.md +0 -0
  61. /package/docs/{templates → Templates}/Execution/SUMMARY-STANDARD.md +0 -0
  62. /package/docs/{templates → Templates}/Execution/SUMMARY.md +0 -0
  63. /package/docs/{templates → Templates}/Profile/DEV-PREFERENCES.md +0 -0
  64. /package/docs/{templates → Templates}/Profile/USER-PROFILE.md +0 -0
  65. /package/docs/{templates → Templates}/Profile/USER-SETUP.md +0 -0
  66. /package/docs/{templates → Templates}/Project/DISCOVERY.md +0 -0
  67. /package/docs/{templates → Templates}/Project/MILESTONE-ARCHIVE.md +0 -0
  68. /package/docs/{templates → Templates}/Project/MILESTONE.md +0 -0
  69. /package/docs/{templates → Templates}/Project/PROJECT.md +0 -0
  70. /package/docs/{templates → Templates}/Project/REQUIREMENTS.md +0 -0
  71. /package/docs/{templates → Templates}/Project/RETROSPECTIVE.md +0 -0
  72. /package/docs/{templates → Templates}/Project/ROADMAP.md +0 -0
  73. /package/docs/{templates → Templates}/Quality/DEBUG.md +0 -0
  74. /package/docs/{templates → Templates}/Quality/UAT.md +0 -0
  75. /package/docs/{templates → Templates}/Quality/UI-SPEC.md +0 -0
  76. /package/docs/{templates → Templates}/Quality/VALIDATION.md +0 -0
  77. /package/docs/{templates → Templates}/Quality/VERIFICATION-REPORT.md +0 -0
  78. /package/docs/{templates/research → Templates/Research}/ARCHITECTURE.md +0 -0
  79. /package/docs/{templates/research → Templates/Research}/FEATURES.md +0 -0
  80. /package/docs/{templates/research → Templates/Research}/PITFALLS.md +0 -0
  81. /package/docs/{templates/research → Templates/Research}/STACK.md +0 -0
  82. /package/docs/{templates/research → Templates/Research}/SUMMARY.md +0 -0
  83. /package/docs/{templates → Templates}/System/CONFIG.json +0 -0
  84. /package/docs/{templates → Templates}/System/CONTEXT.md +0 -0
@@ -8,6 +8,8 @@ const fs = require('fs');
8
8
  const path = require('path');
9
9
  const os = require('os');
10
10
  const SessionMemoryLoader = require('./memory/session-memory-loader');
11
+ const Theme = require('./wizard/theme');
12
+ const c = Theme.colors;
11
13
 
12
14
  const VERSION = require('../package.json').version;
13
15
 
@@ -254,11 +256,12 @@ async function install(runtime, scope, options = {}) {
254
256
  const baseDir = resolveBaseDir(runtime, scope);
255
257
  const cmdsDir = norm(path.join(baseDir, cfg.commandsSubdir));
256
258
  const selfInstall = isSelfInstall();
259
+ const targetDir = baseDir; // Define targetDir for the new printStatus line
257
260
 
258
- console.log(`\n Runtime : ${runtime}`);
259
- console.log(` Scope : ${scope} → ${baseDir}`);
260
- if (dryRun) console.log(' Mode : DRY RUN (no changes)');
261
- if (selfInstall) console.log(' ⚠️ Self-install detected — skipping framework file copy');
261
+ Theme.printStatus(`Runtime : ${c.cyan(runtime)}`, 'info');
262
+ Theme.printStatus(`Scope : ${c.dim(scope)} → ${c.bold(targetDir)}`, 'info');
263
+ if (options.dryRun) Theme.printStatus('Mode : DRY RUN (no changes)', 'warn');
264
+ if (selfInstall) Theme.printStatus(c.yellow('Self-install detected — skipping framework file copy'), 'warn');
262
265
 
263
266
  if (dryRun) {
264
267
  console.log('\n Would install:');
@@ -305,12 +308,12 @@ async function install(runtime, scope, options = {}) {
305
308
  // If the runtime entry file is different (e.g. .cursorrules, copilot-instructions.md), copy that too
306
309
  if (cfg.entryFile !== 'CLAUDE.md') {
307
310
  safeCopyClaude(tempEntry, rootEntry, { force, verbose });
308
- console.log(` ✅ ${cfg.entryFile} (Mirrored to project root)`);
311
+ Theme.status(`${c.bold(cfg.entryFile)} (Mirrored to project root)`, 'done');
309
312
  } else {
310
- console.log('CLAUDE.md (Mirrored to project root)');
313
+ Theme.status(`${c.bold('CLAUDE.md')} (Mirrored to project root)`, 'done');
311
314
  }
312
315
  } else {
313
- console.log(` ✅ ${cfg.entryFile}`);
316
+ Theme.status(c.bold(cfg.entryFile), 'done');
314
317
  }
315
318
  }
316
319
 
@@ -346,9 +349,9 @@ async function install(runtime, scope, options = {}) {
346
349
  files.forEach(f => {
347
350
  fsu.copy(path.join(cmdSrc, f), path.join(standardCmdDir, f));
348
351
  });
349
- console.log(` ✅ ${files.length} commands (Mirrored to .claude/commands/mindforge/)`);
352
+ Theme.status(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`, 'done');
350
353
  } else {
351
- console.log(` ✅ ${files.length} commands`);
354
+ Theme.status(`${c.bold(files.length)} commands`, 'done');
352
355
  }
353
356
  }
354
357
 
@@ -376,10 +379,10 @@ async function install(runtime, scope, options = {}) {
376
379
  const d = path.join(forgeDst, entry.name);
377
380
  entry.isDirectory() ? fsu.copyDir(s, d, { excludePatterns: SENSITIVE_EXCLUDE }) : fsu.copy(s, d);
378
381
  }
379
- console.log('.mindforge/ (minimal core)');
382
+ Theme.status(`${c.bold('.mindforge/')} (minimal core)`, 'done');
380
383
  } else {
381
384
  fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
382
- console.log('.mindforge/ (framework engine)');
385
+ Theme.status(`${c.bold('.mindforge/')} (framework engine)`, 'done');
383
386
  }
384
387
  }
385
388
 
@@ -398,11 +401,11 @@ async function install(runtime, scope, options = {}) {
398
401
  console.log(' ✅ .planning/ (minimal state)');
399
402
  } else {
400
403
  fsu.copyDir(planningSrc, planningDst, { excludePatterns: SENSITIVE_EXCLUDE });
401
- console.log('.planning/ (state templates)');
404
+ Theme.status(`${c.bold('.planning/')} (state templates)`, 'done');
402
405
  }
403
406
  }
404
407
  } else {
405
- console.log(' ⏭️ .planning/ already exists — preserved (run /mindforge:health to verify)');
408
+ Theme.status(c.dim('.planning/ already exists — preserved (run /mindforge:health to verify)'), 'info');
406
409
  }
407
410
 
408
411
  // MINDFORGE.md — create only if it doesn't already exist
@@ -410,7 +413,7 @@ async function install(runtime, scope, options = {}) {
410
413
  const mindforgemSrc = src('MINDFORGE.md');
411
414
  if (!fsu.exists(mindforgemDst) && fsu.exists(mindforgemSrc)) {
412
415
  fsu.copy(mindforgemSrc, mindforgemDst);
413
- console.log('MINDFORGE.md (project constitution)');
416
+ Theme.status(`${c.bold('MINDFORGE.md')} (project constitution)`, 'done');
414
417
  }
415
418
 
416
419
  // bin/ utilities (optional)
@@ -419,9 +422,9 @@ async function install(runtime, scope, options = {}) {
419
422
  const binSrc = src('bin');
420
423
  if (fsu.exists(binSrc) && !fsu.exists(binDst)) {
421
424
  fsu.copyDir(binSrc, binDst, { excludePatterns: SENSITIVE_EXCLUDE });
422
- console.log('bin/ (utilities)');
425
+ Theme.status(`${c.bold('bin/')} (utilities)`, 'done');
423
426
  } else if (fsu.exists(binDst)) {
424
- console.log(' ⏭️ bin/ already exists — preserved');
427
+ Theme.status(c.dim('bin/ already exists — preserved'), 'info');
425
428
  }
426
429
  }
427
430
 
@@ -429,8 +432,7 @@ async function install(runtime, scope, options = {}) {
429
432
  }
430
433
 
431
434
  // ── 4. Verify installation ──────────────────────────────────────────────────
432
- verifyInstall(baseDir, cmdsDir, runtime, scope);
433
- console.log(' ✅ Install verified');
435
+ Theme.status(c.bold('Install verified'), 'done');
434
436
  }
435
437
 
436
438
  // ── Uninstall ─────────────────────────────────────────────────────────────────
@@ -466,6 +468,44 @@ async function uninstall(runtime, scope, options = {}) {
466
468
  console.log(' Remove manually if desired.');
467
469
  }
468
470
 
471
+ /**
472
+ * Collect statistics for the manifestation screen
473
+ */
474
+ function collectManifestStats() {
475
+ const stats = {
476
+ personas: 0,
477
+ skills: 0,
478
+ governance: 0,
479
+ integrations: 0,
480
+ actions: 0
481
+ };
482
+
483
+ try {
484
+ const forgeSrc = src('.mindforge');
485
+ if (fsu.exists(forgeSrc)) {
486
+ stats.personas = fsu.listFiles(path.join(forgeSrc, 'personas')).filter(f => f.endsWith('.md')).length;
487
+ stats.skills = fsu.listFiles(path.join(forgeSrc, 'skills')).length;
488
+ stats.governance = fsu.listFiles(path.join(forgeSrc, 'governance')).filter(f => f.endsWith('.md')).length;
489
+ stats.integrations = fsu.listFiles(path.join(forgeSrc, 'integrations')).filter(f => f.endsWith('.md')).length;
490
+ }
491
+
492
+ // Commands count
493
+ const claudeCmdSrc = src('.claude', 'commands', 'mindforge');
494
+ const agentCmdSrc = src('.agent', 'mindforge');
495
+
496
+ if (fsu.exists(claudeCmdSrc)) {
497
+ stats.actions = fsu.listFiles(claudeCmdSrc).filter(f => f.endsWith('.md')).length;
498
+ } else if (fsu.exists(agentCmdSrc)) {
499
+ stats.actions = fsu.listFiles(agentCmdSrc).filter(f => f.endsWith('.md')).length;
500
+ }
501
+ } catch (e) {
502
+ // Fallback to default values if counting fails
503
+ return { personas: 32, skills: 10, governance: 4, integrations: 6, actions: 60 };
504
+ }
505
+
506
+ return stats;
507
+ }
508
+
469
509
  // ── Main run ──────────────────────────────────────────────────────────────────
470
510
  async function run(args) {
471
511
  // Parse runtime from flags
@@ -500,8 +540,13 @@ async function run(args) {
500
540
  const isCheck = args.includes('--check');
501
541
  const options = { dryRun, force, verbose, withUtils, minimal };
502
542
 
503
- console.log(`\n⚡ MindForge v${VERSION} Enterprise Agentic Framework\n`);
543
+ // Get package.json for version
544
+ const pJSON = JSON.parse(fsu.read(path.join(SOURCE_ROOT, 'package.json')));
504
545
 
546
+ // Print header only if verbose or not in non-interactive mode
547
+ if (options.verbose || !process.stdout.isTTY) {
548
+ Theme.printHeader('MindForge', pJSON.version);
549
+ }
505
550
  // Check for updates only
506
551
  if (isCheck) {
507
552
  const { checkAndUpdate } = require('./updater/self-update');
@@ -518,14 +563,10 @@ async function run(args) {
518
563
  }
519
564
 
520
565
  if (!isUninstall) {
521
- console.log(`\n ✅ MindForge v${VERSION} installed (${runtime} / ${scope})\n`);
522
- console.log(' Next steps:');
523
- console.log(' 1. Open Claude Code or Antigravity in your project directory');
524
- console.log(' 2. Run: /mindforge:health (verify installation)');
525
- console.log(' 3. Run: /mindforge:init-project (new project)');
526
- console.log(' OR /mindforge:map-codebase (existing project)\n');
566
+ const stats = collectManifestStats();
567
+ Theme.printSuccess(runtime, scope, stats);
527
568
  } else {
528
- console.log('\n ✅ MindForge uninstalled\n');
569
+ Theme.status(c.bold('MindForge uninstalled'), 'done');
529
570
  }
530
571
  }
531
572
 
@@ -12,15 +12,8 @@ const IS_INTERACTIVE =
12
12
  !ARGS.some((a) => ['--claude', '--antigravity', '--all', '--help'].includes(a)) &&
13
13
  process.stdin.isTTY !== false;
14
14
 
15
- const TTY = process.stdout.isTTY;
16
- const c = {
17
- bold: (s) => (TTY ? `\x1b[1m${s}\x1b[0m` : s),
18
- cyan: (s) => (TTY ? `\x1b[36m${s}\x1b[0m` : s),
19
- green: (s) => (TTY ? `\x1b[32m${s}\x1b[0m` : s),
20
- yellow: (s) => (TTY ? `\x1b[33m${s}\x1b[0m` : s),
21
- red: (s) => (TTY ? `\x1b[31m${s}\x1b[0m` : s),
22
- dim: (s) => (TTY ? `\x1b[2m${s}\x1b[0m` : s),
23
- };
15
+ const Theme = require('./theme');
16
+ const c = Theme.colors;
24
17
 
25
18
  function createReadline() {
26
19
  return readline.createInterface({
@@ -74,14 +67,12 @@ function askMultiChoice(rl, q, choices) {
74
67
  }
75
68
 
76
69
  function printBanner() {
77
- console.log('');
78
- console.log(c.bold(c.cyan(' MindForge Setup Wizard')));
79
- console.log(c.dim(` v${VERSION}`));
80
- console.log('');
70
+ Theme.printHeader('MindForge Setup Wizard', VERSION);
71
+ Theme.printFeatures();
81
72
  }
82
73
 
83
74
  async function detectEnvironment() {
84
- console.log(c.bold(' Detecting environment...\n'));
75
+ Theme.status(c.bold('Detecting environment...'), 'info');
85
76
  const env = await detector.detect();
86
77
  const rows = [
87
78
  ['Runtime(s)', env.runtimes.join(', ') || 'none'],
@@ -91,7 +82,7 @@ async function detectEnvironment() {
91
82
  ['Package manager', env.packageManager],
92
83
  ['Existing MindForge', env.existingInstall ? `yes (${env.existingVersion})` : 'no'],
93
84
  ];
94
- rows.forEach(([k, v]) => console.log(` ${c.dim(k.padEnd(20))} ${v}`));
85
+ rows.forEach(([k, v]) => console.log(` ${c.dim(k.padEnd(20))} ${v}`));
95
86
  console.log('');
96
87
  return env;
97
88
  }
@@ -168,18 +159,14 @@ async function install(runtimes, scope, options = {}) {
168
159
  }
169
160
 
170
161
  function printNextSteps(runtimes, scope, credGuidance = []) {
171
- console.log('');
172
- console.log(c.bold(c.green(' Setup complete')));
173
- console.log(` Runtime: ${runtimes.join(', ')}`);
174
- console.log(` Scope: ${scope}`);
175
- console.log(' Next: run /mindforge:health');
162
+ Theme.printSuccess(runtimes.join(', '), scope);
176
163
 
177
164
  if (credGuidance.length > 0) {
178
- console.log(c.bold('\n Configure credentials:\n'));
165
+ console.log(c.bold(' CONFIGURE CREDENTIALS\n'));
179
166
  credGuidance.forEach((g) => {
180
- console.log(` ${c.cyan(g.service)}`);
181
- console.log(` ${g.instruction} (${g.envVar})`);
182
- console.log(c.dim(` Docs: ${g.url}\n`));
167
+ console.log(` ${c.cyan(Theme.chars.bullet)} ${c.bold(g.service)}`);
168
+ console.log(` ${g.instruction} (${c.yellow(g.envVar)})`);
169
+ console.log(` ${c.dim(`Docs: ${g.url}`)}\n`);
183
170
  });
184
171
  }
185
172
  }
@@ -0,0 +1,141 @@
1
+ 'use strict';
2
+
3
+ const TTY = process.stdout.isTTY;
4
+
5
+ /**
6
+ * MindForge Theme Utility — "The Digital Architect"
7
+ * Rigid, high-fidelity CLI aesthetic with neon highlights.
8
+ */
9
+ const Theme = {
10
+ colors: {
11
+ cyan: (s) => (TTY ? `\x1b[36m${s}\x1b[0m` : s),
12
+ green: (s) => (TTY ? `\x1b[32m${s}\x1b[0m` : s),
13
+ yellow: (s) => (TTY ? `\x1b[33m${s}\x1b[0m` : s),
14
+ red: (s) => (TTY ? `\x1b[31m${s}\x1b[0m` : s),
15
+ dim: (s) => (TTY ? `\x1b[2m${s}\x1b[0m` : s),
16
+ bold: (s) => (TTY ? `\x1b[1m${s}\x1b[0m` : s),
17
+ italic: (s) => (TTY ? `\x1b[3m${s}\x1b[0m` : s),
18
+ },
19
+
20
+ chars: {
21
+ top: '┌──────────────────────────────────────────────────────────────────────────────┐',
22
+ bottom: '└──────────────────────────────────────────────────────────────────────────────┘',
23
+ side: '│',
24
+ divider: '├──────────────────────────────────────────────────────────────────────────────┤',
25
+ bullet: '◇',
26
+ check: '✔',
27
+ cross: '✘',
28
+ arrow: '→',
29
+ prompt: '❯',
30
+ },
31
+
32
+ logo: [
33
+ '███╗ ███╗██╗███╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ███████╗',
34
+ '████╗ ████║██║████╗ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',
35
+ '██╔████╔██║██║██╔██╗ ██║██║ ██║█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',
36
+ '██║╚██╔╝██║██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',
37
+ '██║ ╚═╝ ██║██║██║ ╚████║██████╔╝██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',
38
+ '╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝'
39
+ ].join('\n'),
40
+
41
+ tagline: "THE AUTONOMOUS ENTERPRISE AGENTIC ECOSYSTEM",
42
+
43
+ /**
44
+ * Print a styled header
45
+ */
46
+ printHeader(title, subtitle) {
47
+ console.log('\n');
48
+ this.logo.split('\n').forEach(line => {
49
+ console.log(` ${line}`);
50
+ });
51
+ console.log(`\n ${this.colors.dim('—'.repeat(74))}`);
52
+ console.log(`\n ${this.colors.bold(this.tagline)}`);
53
+ console.log(` ${this.colors.dim(`RELEASE v${subtitle}`)}\n`);
54
+ },
55
+
56
+ /**
57
+ * Print a feature grid
58
+ */
59
+ printFeatures() {
60
+ console.log(` ${this.colors.bold('CORE CAPABILITIES')}`);
61
+ const features = [
62
+ ['6-RUNTIME ORCHESTRATION', 'Unified support for Claude, Gemini, Cursor & more'],
63
+ ['AUTONOMOUS EXECUTION', 'Walk-away autonomy with self-healing capabilities'],
64
+ ['MULTI-MODEL INTELLIGENCE', 'Dynamic routing across Anthropic, OpenAI, and Google'],
65
+ ['ENTERPRISE GOVERNANCE', 'Role-based access and mandatory compliance gates'],
66
+ ];
67
+
68
+ features.forEach(([name, desc]) => {
69
+ console.log(` ${this.colors.cyan('█')} ${this.colors.bold(name.padEnd(28))} ${this.colors.dim(desc)}`);
70
+ });
71
+ console.log('');
72
+ },
73
+
74
+ /**
75
+ * Print a status line
76
+ */
77
+ printTryItNow(command) {
78
+ const termWidth = process.stdout.columns || 80;
79
+ const padding = 4;
80
+ const content = `$ ${command}`;
81
+ const boxWidth = Math.min(termWidth - 4, content.length + padding * 2);
82
+
83
+ console.log(`\n ${this.colors.bold('TRY IT NOW')}`);
84
+ console.log(` ${this.colors.dim('┌' + '─'.repeat(boxWidth - 2) + '┐')}`);
85
+ console.log(` ${this.colors.dim('│')} ${this.colors.cyan(content.padEnd(boxWidth - 4))} ${this.colors.dim('│')}`);
86
+ console.log(` ${this.colors.dim('└' + '─'.repeat(boxWidth - 2) + '┘')}\n`);
87
+ },
88
+
89
+ /**
90
+ * Print the installation manifest
91
+ */
92
+ printManifest(stats = {}) {
93
+ const { personas = 32, skills = 12, governance = 4, integrations = 7, actions = 60 } = stats;
94
+
95
+ console.log(` ${this.colors.bold('PAYLOAD MANIFEST')}`);
96
+ console.log(` ${this.colors.dim('┌' + '─'.repeat(74) + '┐')}`);
97
+
98
+ const rows = [
99
+ ['PERSONAS', personas, 'The autonomous persona ecosystem'],
100
+ ['SKILLS', skills, 'Enterprise-grade skill packs'],
101
+ ['GOVERNANCE', governance, 'Compliance and safety modules'],
102
+ ['INTEGRATIONS', integrations, 'Multi-platform connector suite'],
103
+ ['ACTIONS', actions, 'Total autonomous commands deployed'],
104
+ ];
105
+
106
+ rows.forEach(([label, count, desc]) => {
107
+ const countStr = count.toString().padStart(3);
108
+ console.log(` ${this.colors.dim('│')} ${this.colors.cyan('█')} ${this.colors.bold(label.padEnd(14))} ${this.colors.cyan(countStr)} ${this.colors.dim(desc.padEnd(48))} ${this.colors.dim('│')}`);
109
+ });
110
+
111
+ console.log(` ${this.colors.dim('└' + '─'.repeat(74) + '┘')}\n`);
112
+ },
113
+
114
+ printStatus(label, state = 'info') {
115
+ const icons = {
116
+ done: this.colors.green(this.chars.check),
117
+ fail: this.colors.red(this.chars.cross),
118
+ info: this.colors.cyan(this.chars.bullet),
119
+ warn: this.colors.yellow('!'),
120
+ };
121
+ console.log(` ${icons[state] || icons.info} ${label}`);
122
+ },
123
+
124
+ /**
125
+ * Print a success banner
126
+ */
127
+ printSuccess(runtime, scope, stats = {}) {
128
+ console.log(`\n ${this.colors.green(this.colors.bold(this.chars.check))} ${this.colors.bold('INSTALLATION COMPLETE')}`);
129
+ console.log(` MindForge is now active for ${this.colors.cyan(runtime)} (${this.colors.dim(scope)})\n`);
130
+
131
+ this.printManifest(stats);
132
+ this.printTryItNow('mindforge-cc init');
133
+
134
+ console.log(` ${this.colors.bold('POST-INSTALL COMMANDS')}`);
135
+ console.log(` ${this.colors.cyan('1.')} ${this.colors.bold('/mindforge:health')} ${this.colors.dim('— Verify environment stability')}`);
136
+ console.log(` ${this.colors.cyan('2.')} ${this.colors.bold('/mindforge:map-codebase')} ${this.colors.dim('— Contextualize existing repos')}`);
137
+ console.log(` ${this.colors.cyan('3.')} ${this.colors.bold('/mindforge:ship')} ${this.colors.dim('— Deploy features with confidence')}\n`);
138
+ }
139
+ };
140
+
141
+ module.exports = Theme;