mindforge-cc 2.1.2 → 2.1.4

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/bin/install.js CHANGED
@@ -80,7 +80,8 @@ if (IS_NON_INTERACTIVE) {
80
80
  }
81
81
 
82
82
  function printHelp() {
83
- Theme.printHeader('MindForge', VERSION);
83
+ Theme.printHeader(VERSION);
84
+ Theme.printBrandManifest();
84
85
 
85
86
  process.stdout.write(`
86
87
  ${c.bold('USAGE')}
@@ -258,8 +258,8 @@ async function install(runtime, scope, options = {}) {
258
258
  const selfInstall = isSelfInstall();
259
259
  const targetDir = baseDir; // Define targetDir for the new printStatus line
260
260
 
261
- Theme.printStatus(`Runtime : ${c.cyan(runtime)}`, 'info');
262
- Theme.printStatus(`Scope : ${c.dim(scope)} → ${c.bold(targetDir)}`, 'info');
261
+ Theme.printPrompt(`Runtime : ${c.cyan(runtime)}`);
262
+ Theme.printPrompt(`Scope : ${c.dim(scope)} → ${c.bold(targetDir)}`);
263
263
  if (options.dryRun) Theme.printStatus('Mode : DRY RUN (no changes)', 'warn');
264
264
  if (selfInstall) Theme.printStatus(c.yellow('Self-install detected — skipping framework file copy'), 'warn');
265
265
 
@@ -308,12 +308,12 @@ async function install(runtime, scope, options = {}) {
308
308
  // If the runtime entry file is different (e.g. .cursorrules, copilot-instructions.md), copy that too
309
309
  if (cfg.entryFile !== 'CLAUDE.md') {
310
310
  safeCopyClaude(tempEntry, rootEntry, { force, verbose });
311
- Theme.status(`${c.bold(cfg.entryFile)} (Mirrored to project root)`, 'done');
311
+ Theme.printResolved(`${c.bold(cfg.entryFile)} (Mirrored to project root)`);
312
312
  } else {
313
- Theme.status(`${c.bold('CLAUDE.md')} (Mirrored to project root)`, 'done');
313
+ Theme.printResolved(`${c.bold('CLAUDE.md')} (Mirrored to project root)`);
314
314
  }
315
315
  } else {
316
- Theme.status(c.bold(cfg.entryFile), 'done');
316
+ Theme.printResolved(c.bold(cfg.entryFile));
317
317
  }
318
318
  }
319
319
 
@@ -349,9 +349,9 @@ async function install(runtime, scope, options = {}) {
349
349
  files.forEach(f => {
350
350
  fsu.copy(path.join(cmdSrc, f), path.join(standardCmdDir, f));
351
351
  });
352
- Theme.status(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`, 'done');
352
+ Theme.printResolved(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`);
353
353
  } else {
354
- Theme.status(`${c.bold(files.length)} commands`, 'done');
354
+ Theme.printResolved(`${c.bold(files.length)} commands`);
355
355
  }
356
356
  }
357
357
 
@@ -379,10 +379,10 @@ async function install(runtime, scope, options = {}) {
379
379
  const d = path.join(forgeDst, entry.name);
380
380
  entry.isDirectory() ? fsu.copyDir(s, d, { excludePatterns: SENSITIVE_EXCLUDE }) : fsu.copy(s, d);
381
381
  }
382
- Theme.status(`${c.bold('.mindforge/')} (minimal core)`, 'done');
382
+ Theme.printResolved(`${c.bold('.mindforge/')} (minimal core)`);
383
383
  } else {
384
384
  fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
385
- Theme.status(`${c.bold('.mindforge/')} (framework engine)`, 'done');
385
+ Theme.printResolved(`${c.bold('.mindforge/')} (framework engine)`);
386
386
  }
387
387
  }
388
388
 
@@ -401,11 +401,11 @@ async function install(runtime, scope, options = {}) {
401
401
  console.log(' ✅ .planning/ (minimal state)');
402
402
  } else {
403
403
  fsu.copyDir(planningSrc, planningDst, { excludePatterns: SENSITIVE_EXCLUDE });
404
- Theme.status(`${c.bold('.planning/')} (state templates)`, 'done');
404
+ Theme.printResolved(`${c.bold('.planning/')} (state templates)`);
405
405
  }
406
406
  }
407
407
  } else {
408
- Theme.status(c.dim('.planning/ already exists — preserved (run /mindforge:health to verify)'), 'info');
408
+ Theme.printPrompt(c.dim('.planning/ already exists — preserved (run /mindforge:health to verify)'));
409
409
  }
410
410
 
411
411
  // MINDFORGE.md — create only if it doesn't already exist
@@ -413,7 +413,7 @@ async function install(runtime, scope, options = {}) {
413
413
  const mindforgemSrc = src('MINDFORGE.md');
414
414
  if (!fsu.exists(mindforgemDst) && fsu.exists(mindforgemSrc)) {
415
415
  fsu.copy(mindforgemSrc, mindforgemDst);
416
- Theme.status(`${c.bold('MINDFORGE.md')} (project constitution)`, 'done');
416
+ Theme.printResolved(`${c.bold('MINDFORGE.md')} (project constitution)`);
417
417
  }
418
418
 
419
419
  // bin/ utilities (optional)
@@ -422,9 +422,9 @@ async function install(runtime, scope, options = {}) {
422
422
  const binSrc = src('bin');
423
423
  if (fsu.exists(binSrc) && !fsu.exists(binDst)) {
424
424
  fsu.copyDir(binSrc, binDst, { excludePatterns: SENSITIVE_EXCLUDE });
425
- Theme.status(`${c.bold('bin/')} (utilities)`, 'done');
425
+ Theme.printResolved(`${c.bold('bin/')} (utilities)`);
426
426
  } else if (fsu.exists(binDst)) {
427
- Theme.status(c.dim('bin/ already exists — preserved'), 'info');
427
+ Theme.printPrompt(c.dim('bin/ already exists — preserved'));
428
428
  }
429
429
  }
430
430
 
@@ -432,7 +432,7 @@ async function install(runtime, scope, options = {}) {
432
432
  }
433
433
 
434
434
  // ── 4. Verify installation ──────────────────────────────────────────────────
435
- Theme.status(c.bold('Install verified'), 'done');
435
+ Theme.printResolved(c.bold('Install verified'));
436
436
  }
437
437
 
438
438
  // ── Uninstall ─────────────────────────────────────────────────────────────────
@@ -543,10 +543,10 @@ async function run(args) {
543
543
  // Get package.json for version
544
544
  const pJSON = JSON.parse(fsu.read(path.join(SOURCE_ROOT, 'package.json')));
545
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
- }
546
+ // Print header and brand manifest
547
+ // Print header and brand manifest
548
+ Theme.printHeader(pJSON.version);
549
+ Theme.printBrandManifest();
550
550
  // Check for updates only
551
551
  if (isCheck) {
552
552
  const { checkAndUpdate } = require('./updater/self-update');
@@ -564,9 +564,9 @@ async function run(args) {
564
564
 
565
565
  if (!isUninstall) {
566
566
  const stats = collectManifestStats();
567
- Theme.printSuccess(runtime, scope, stats);
567
+ Theme.printSuccessV2(runtime, scope, stats);
568
568
  } else {
569
- Theme.status(c.bold('MindForge uninstalled'), 'done');
569
+ Theme.printResolved(c.bold('MindForge uninstalled'));
570
570
  }
571
571
  }
572
572
 
@@ -19,7 +19,7 @@ function createReadline() {
19
19
  return readline.createInterface({
20
20
  input: process.stdin,
21
21
  output: process.stdout,
22
- terminal: TTY,
22
+ terminal: process.stdin.isTTY,
23
23
  });
24
24
  }
25
25
 
@@ -67,12 +67,12 @@ function askMultiChoice(rl, q, choices) {
67
67
  }
68
68
 
69
69
  function printBanner() {
70
- Theme.printHeader('MindForge Setup Wizard', VERSION);
71
- Theme.printFeatures();
70
+ Theme.printHeader(VERSION);
71
+ Theme.printBrandManifest();
72
72
  }
73
73
 
74
74
  async function detectEnvironment() {
75
- Theme.status(c.bold('Detecting environment...'), 'info');
75
+ Theme.printPrompt(c.bold('Detecting environment...'));
76
76
  const env = await detector.detect();
77
77
  const rows = [
78
78
  ['Runtime(s)', env.runtimes.join(', ') || 'none'],
@@ -159,7 +159,7 @@ async function install(runtimes, scope, options = {}) {
159
159
  }
160
160
 
161
161
  function printNextSteps(runtimes, scope, credGuidance = []) {
162
- Theme.printSuccess(runtimes.join(', '), scope);
162
+ Theme.printSuccessV2(runtimes.join(', '), scope);
163
163
 
164
164
  if (credGuidance.length > 0) {
165
165
  console.log(c.bold(' CONFIGURE CREDENTIALS\n'));
@@ -23,7 +23,8 @@ const Theme = {
23
23
  side: '│',
24
24
  divider: '├──────────────────────────────────────────────────────────────────────────────┤',
25
25
  bullet: '◇',
26
- check: '',
26
+ resolved: '',
27
+ check: '✓',
27
28
  cross: '✘',
28
29
  arrow: '→',
29
30
  prompt: '❯',
@@ -41,53 +42,83 @@ const Theme = {
41
42
  tagline: "THE AUTONOMOUS ENTERPRISE AGENTIC ECOSYSTEM",
42
43
 
43
44
  /**
44
- * Print a styled header
45
+ * Print a styled header with BMad-style border flare
45
46
  */
46
- printHeader(title, subtitle) {
47
- console.log('\n');
47
+ printHeader(subtitle) {
48
+ console.log(`\n ${this.colors.dim('┌' + '─'.repeat(78) + '┐')}`);
48
49
  this.logo.split('\n').forEach(line => {
49
- console.log(` ${line}`);
50
+ console.log(` ${this.colors.dim('│')} ${line.padEnd(74)} ${this.colors.dim('│')}`);
50
51
  });
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`);
52
+ console.log(` ${this.colors.dim('')} ${this.colors.bold(this.tagline.padEnd(74))} ${this.colors.dim('│')}`);
53
+ console.log(` ${this.colors.dim('│')} ${this.colors.dim(`RELEASE v${subtitle}`.padEnd(74))} ${this.colors.dim('│')}`);
54
+ console.log(` ${this.colors.dim('└' + '─'.repeat(78) + '┘')}\n`);
54
55
  },
55
56
 
56
57
  /**
57
- * Print a feature grid
58
+ * Print Brand Manifest (BMad V6 style)
58
59
  */
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
- ];
60
+ printBrandManifest() {
61
+ console.log(` ${this.colors.dim('')}`);
62
+ console.log(` ${this.colors.dim('│')} ${this.colors.green('🎉 V2.1.4 IS HERE!')} Welcome to MindForge V2!`);
63
+ console.log(` ${this.colors.dim('')}`);
64
+ console.log(` ${this.colors.dim('')} ${this.colors.bold('THE PLATFORM VISION:')}`);
65
+ console.log(` ${this.colors.dim('│')} - Unified Enterprise Agentic Ecosystem`);
66
+ console.log(` ${this.colors.dim('')} - Modular Skills & Persona Architecture`);
67
+ console.log(` ${this.colors.dim('│')} - Autonomous Governance & Self-Healing`);
68
+ console.log(` ${this.colors.dim('│')}`);
69
+ console.log(` ${this.colors.dim('│')} ${this.colors.yellow('🌟 100% FREE & OPEN SOURCE')}`);
70
+ console.log(` ${this.colors.dim('│')} - No paywalls. No gated content.`);
71
+ console.log(` ${this.colors.dim('│')} - Empowering everyone with AI-Native tools.`);
72
+ console.log(` ${this.colors.dim('│')}`);
73
+ console.log(` ${this.colors.dim('│')} ${this.colors.cyan('⭐ HELP US GROW:')}`);
74
+ console.log(` ${this.colors.dim('│')} - GitHub: ${this.colors.dim('https://github.com/sairam0424/MindForge')}`);
75
+ console.log(` ${this.colors.dim('│')} - Discord: ${this.colors.dim('https://discord.gg/mindforge')}`);
76
+ console.log(` ${this.colors.dim('│')} - Docs: ${this.colors.dim('https://docs.mindforge.cc')}`);
77
+ console.log(` ${this.colors.dim('│')}`);
78
+ console.log(` ${this.colors.dim('—'.repeat(80))}\n`);
79
+ },
67
80
 
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('');
81
+ printPrompt(label) {
82
+ console.log(` ${this.colors.cyan(this.chars.bullet)} ${label}`);
83
+ },
84
+
85
+ printResolved(label) {
86
+ console.log(` ${this.colors.green(this.chars.resolved)} ${label}`);
72
87
  },
73
88
 
74
89
  /**
75
- * Print a status line
90
+ * Success Banner ( V2 Architectural Style)
76
91
  */
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`);
92
+ printSuccessV2(runtime, scope, stats = {}) {
93
+ const { personas = 32, skills = 12, governance = 4, integrations = 7 } = stats;
94
+ const boxWidth = 72;
95
+
96
+ console.log(`\n ${this.colors.green('MINDFORGE is ready! ')} ${this.colors.dim('─'.repeat(boxWidth - 20))}╮`);
97
+ console.log(` ${this.colors.dim('│')} ${this.colors.dim('│')}`);
98
+ console.log(` ${this.colors.dim('│')} ${this.colors.green('✓')} ${this.colors.bold('MindForge Core')} (installed) ${this.colors.dim('│')}`);
99
+ console.log(` ${this.colors.dim('')} ${this.colors.green('')} ${this.colors.bold('Personas')} (${personas} active) ${this.colors.dim('')}`);
100
+ console.log(` ${this.colors.dim('│')} ${this.colors.green('✓')} ${this.colors.bold('Skill Packs')} (${skills} verified) ${this.colors.dim('│')}`);
101
+ console.log(` ${this.colors.dim('')} ${this.colors.dim('')}`);
102
+ console.log(` ${this.colors.dim('│')} ${this.colors.bold('Environment')}: ${this.colors.cyan(runtime)} (${this.colors.dim(scope)}) ${this.colors.dim('│')}`);
103
+ console.log(` ${this.colors.dim('│')} ${this.colors.dim('│')}`);
104
+ console.log(` ${this.colors.dim('│')} ${this.colors.bold('Next steps:')} ${this.colors.dim('│')}`);
105
+ console.log(` ${this.colors.dim('│')} ${this.colors.bold('mindforge-cc init')} ${this.colors.dim('— Initialize your first workspace')} ${this.colors.dim('│')}`);
106
+ console.log(` ${this.colors.dim('│')} ${this.colors.bold('/mindforge:help')} ${this.colors.dim('— Explore the command suite')} ${this.colors.dim('│')}`);
107
+ console.log(` ${this.colors.dim('│')} ${this.colors.dim('│')}`);
108
+ console.log(` ${this.colors.dim('├' + '─'.repeat(boxWidth) + '╯')}\n`);
109
+
110
+ this.printManifest(stats);
87
111
  },
88
112
 
89
113
  /**
90
- * Print the installation manifest
114
+ * Legacy printSuccess (Redirects to V2)
115
+ */
116
+ printSuccess(runtime, scope, stats = {}) {
117
+ this.printSuccessV2(runtime, scope, stats);
118
+ },
119
+
120
+ /**
121
+ * Print Manifest (Hardened for V2)
91
122
  */
92
123
  printManifest(stats = {}) {
93
124
  const { personas = 32, skills = 12, governance = 4, integrations = 7, actions = 60 } = stats;
@@ -111,9 +142,27 @@ const Theme = {
111
142
  console.log(` ${this.colors.dim('└' + '─'.repeat(74) + '┘')}\n`);
112
143
  },
113
144
 
145
+ /**
146
+ * Print a status line
147
+ */
148
+ printTryItNow(command) {
149
+ const termWidth = process.stdout.columns || 80;
150
+ const padding = 4;
151
+ const content = `$ ${command}`;
152
+ const boxWidth = Math.min(termWidth - 4, content.length + padding * 2);
153
+
154
+ console.log(`\n ${this.colors.bold('TRY IT NOW')}`);
155
+ console.log(` ${this.colors.dim('┌' + '─'.repeat(boxWidth - 2) + '┐')}`);
156
+ console.log(` ${this.colors.dim('│')} ${this.colors.cyan(content.padEnd(boxWidth - 4))} ${this.colors.dim('│')}`);
157
+ console.log(` ${this.colors.dim('└' + '─'.repeat(boxWidth - 2) + '┘')}\n`);
158
+ },
159
+
160
+ /**
161
+ * Print a status line
162
+ */
114
163
  printStatus(label, state = 'info') {
115
164
  const icons = {
116
- done: this.colors.green(this.chars.check),
165
+ done: this.colors.green(this.chars.resolved),
117
166
  fail: this.colors.red(this.chars.cross),
118
167
  info: this.colors.cyan(this.chars.bullet),
119
168
  warn: this.colors.yellow('!'),
@@ -121,21 +170,9 @@ const Theme = {
121
170
  console.log(` ${icons[state] || icons.info} ${label}`);
122
171
  },
123
172
 
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
- }
173
+ // --- Aliases for legacy compatibility ---
174
+ status(label, state) { this.printStatus(label, state); },
175
+ printSuccess(runtime, scope, stats) { this.printSuccessV2(runtime, scope, stats); }
139
176
  };
140
177
 
141
178
  module.exports = Theme;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindforge-cc",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "description": "MindForge - Enterprise Agentic Framework for Claude Code and Antigravity",
5
5
  "bin": {
6
6
  "mindforge-cc": "bin/install.js"