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 +2 -1
- package/bin/installer-core.js +21 -21
- package/bin/wizard/setup-wizard.js +5 -5
- package/bin/wizard/theme.js +86 -49
- package/package.json +1 -1
package/bin/install.js
CHANGED
package/bin/installer-core.js
CHANGED
|
@@ -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.
|
|
262
|
-
Theme.
|
|
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.
|
|
311
|
+
Theme.printResolved(`${c.bold(cfg.entryFile)} (Mirrored to project root)`);
|
|
312
312
|
} else {
|
|
313
|
-
Theme.
|
|
313
|
+
Theme.printResolved(`${c.bold('CLAUDE.md')} (Mirrored to project root)`);
|
|
314
314
|
}
|
|
315
315
|
} else {
|
|
316
|
-
Theme.
|
|
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.
|
|
352
|
+
Theme.printResolved(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`);
|
|
353
353
|
} else {
|
|
354
|
-
Theme.
|
|
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.
|
|
382
|
+
Theme.printResolved(`${c.bold('.mindforge/')} (minimal core)`);
|
|
383
383
|
} else {
|
|
384
384
|
fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
385
|
-
Theme.
|
|
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.
|
|
404
|
+
Theme.printResolved(`${c.bold('.planning/')} (state templates)`);
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
407
|
} else {
|
|
408
|
-
Theme.
|
|
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.
|
|
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.
|
|
425
|
+
Theme.printResolved(`${c.bold('bin/')} (utilities)`);
|
|
426
426
|
} else if (fsu.exists(binDst)) {
|
|
427
|
-
Theme.
|
|
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.
|
|
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
|
|
547
|
-
|
|
548
|
-
|
|
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.
|
|
567
|
+
Theme.printSuccessV2(runtime, scope, stats);
|
|
568
568
|
} else {
|
|
569
|
-
Theme.
|
|
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:
|
|
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(
|
|
71
|
-
Theme.
|
|
70
|
+
Theme.printHeader(VERSION);
|
|
71
|
+
Theme.printBrandManifest();
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
async function detectEnvironment() {
|
|
75
|
-
Theme.
|
|
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.
|
|
162
|
+
Theme.printSuccessV2(runtimes.join(', '), scope);
|
|
163
163
|
|
|
164
164
|
if (credGuidance.length > 0) {
|
|
165
165
|
console.log(c.bold(' CONFIGURE CREDENTIALS\n'));
|
package/bin/wizard/theme.js
CHANGED
|
@@ -23,7 +23,8 @@ const Theme = {
|
|
|
23
23
|
side: '│',
|
|
24
24
|
divider: '├──────────────────────────────────────────────────────────────────────────────┤',
|
|
25
25
|
bullet: '◇',
|
|
26
|
-
|
|
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(
|
|
47
|
-
console.log(
|
|
47
|
+
printHeader(subtitle) {
|
|
48
|
+
console.log(`\n ${this.colors.dim('┌' + '─'.repeat(78) + '┐')}`);
|
|
48
49
|
this.logo.split('\n').forEach(line => {
|
|
49
|
-
console.log(`
|
|
50
|
+
console.log(` ${this.colors.dim('│')} ${line.padEnd(74)} ${this.colors.dim('│')}`);
|
|
50
51
|
});
|
|
51
|
-
console.log(
|
|
52
|
-
console.log(
|
|
53
|
-
console.log(`
|
|
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
|
|
58
|
+
* Print Brand Manifest (BMad V6 style)
|
|
58
59
|
*/
|
|
59
|
-
|
|
60
|
-
console.log(` ${this.colors.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
*
|
|
90
|
+
* Success Banner ( V2 Architectural Style)
|
|
76
91
|
*/
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
console.log(
|
|
84
|
-
console.log(` ${this.colors.dim('
|
|
85
|
-
console.log(` ${this.colors.dim('│')}
|
|
86
|
-
console.log(` ${this.colors.dim('
|
|
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
|
-
*
|
|
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.
|
|
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
|
-
|
|
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;
|