mindforge-cc 2.1.1 → 2.1.3
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/CHANGELOG.md +25 -6
- package/README.md +68 -43
- package/RELEASENOTES.md +26 -26
- package/bin/install.js +42 -41
- package/bin/installer-core.js +68 -26
- package/bin/wizard/setup-wizard.js +12 -25
- package/bin/wizard/theme.js +178 -0
- package/docs/PERSONAS.md +80 -48
- package/docs/References/config-reference.md +81 -0
- package/docs/architecture/README.md +54 -42
- package/docs/commands-reference.md +62 -15
- package/docs/getting-started.md +26 -18
- package/docs/skills-authoring-guide.md +39 -11
- package/docs/tutorial.md +83 -116
- package/docs/user-guide.md +72 -198
- package/package.json +1 -1
- package/.mindforge/memory/decision-library.jsonl +0 -0
- package/.mindforge/memory/knowledge-base.jsonl +0 -7
- package/.mindforge/memory/pattern-library.jsonl +0 -1
- package/.mindforge/memory/team-preferences.jsonl +0 -4
- package/.planning/browser-daemon.log +0 -32
- package/docs/mindforge-md-reference.md +0 -57
- package/docs/references/config-reference.md +0 -64
- /package/docs/{context → Context}/Master-Context.md +0 -0
- /package/docs/{references → References}/audit-events.md +0 -0
- /package/docs/{references → References}/checkpoints.md +0 -0
- /package/docs/{references → References}/commands.md +0 -0
- /package/docs/{references → References}/continuation-format.md +0 -0
- /package/docs/{references → References}/decimal-phase-calculation.md +0 -0
- /package/docs/{references → References}/git-integration.md +0 -0
- /package/docs/{references → References}/git-planning-commit.md +0 -0
- /package/docs/{references → References}/model-profile-resolution.md +0 -0
- /package/docs/{references → References}/model-profiles.md +0 -0
- /package/docs/{references → References}/phase-argument-parsing.md +0 -0
- /package/docs/{references → References}/planning-config.md +0 -0
- /package/docs/{references → References}/questioning.md +0 -0
- /package/docs/{references → References}/sdk-api.md +0 -0
- /package/docs/{references → References}/skills-api.md +0 -0
- /package/docs/{references → References}/tdd.md +0 -0
- /package/docs/{references → References}/ui-brand.md +0 -0
- /package/docs/{references → References}/user-profiling.md +0 -0
- /package/docs/{references → References}/verification-patterns.md +0 -0
- /package/docs/{references → References}/workstream-flag.md +0 -0
- /package/docs/{templates → Templates}/Agents/CLAUDE-MD.md +0 -0
- /package/docs/{templates → Templates}/Agents/COPILOT-INSTRUCTIONS.md +0 -0
- /package/docs/{templates → Templates}/Agents/DEBUGGER-PROMPT.md +0 -0
- /package/docs/{templates → Templates}/Agents/PLANNER-PROMPT.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/architecture.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/concerns.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/conventions.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/integrations.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/stack.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/structure.md +0 -0
- /package/docs/{templates/codebase → Templates/Codebase}/testing.md +0 -0
- /package/docs/{templates → Templates}/Execution/CONTINUE-HERE.md +0 -0
- /package/docs/{templates → Templates}/Execution/DISCUSSION-LOG.md +0 -0
- /package/docs/{templates → Templates}/Execution/PHASE-PROMPT.md +0 -0
- /package/docs/{templates → Templates}/Execution/STATE.md +0 -0
- /package/docs/{templates → Templates}/Execution/SUMMARY-COMPLEX.md +0 -0
- /package/docs/{templates → Templates}/Execution/SUMMARY-MINIMAL.md +0 -0
- /package/docs/{templates → Templates}/Execution/SUMMARY-STANDARD.md +0 -0
- /package/docs/{templates → Templates}/Execution/SUMMARY.md +0 -0
- /package/docs/{templates → Templates}/Profile/DEV-PREFERENCES.md +0 -0
- /package/docs/{templates → Templates}/Profile/USER-PROFILE.md +0 -0
- /package/docs/{templates → Templates}/Profile/USER-SETUP.md +0 -0
- /package/docs/{templates → Templates}/Project/DISCOVERY.md +0 -0
- /package/docs/{templates → Templates}/Project/MILESTONE-ARCHIVE.md +0 -0
- /package/docs/{templates → Templates}/Project/MILESTONE.md +0 -0
- /package/docs/{templates → Templates}/Project/PROJECT.md +0 -0
- /package/docs/{templates → Templates}/Project/REQUIREMENTS.md +0 -0
- /package/docs/{templates → Templates}/Project/RETROSPECTIVE.md +0 -0
- /package/docs/{templates → Templates}/Project/ROADMAP.md +0 -0
- /package/docs/{templates → Templates}/Quality/DEBUG.md +0 -0
- /package/docs/{templates → Templates}/Quality/UAT.md +0 -0
- /package/docs/{templates → Templates}/Quality/UI-SPEC.md +0 -0
- /package/docs/{templates → Templates}/Quality/VALIDATION.md +0 -0
- /package/docs/{templates → Templates}/Quality/VERIFICATION-REPORT.md +0 -0
- /package/docs/{templates/research → Templates/Research}/ARCHITECTURE.md +0 -0
- /package/docs/{templates/research → Templates/Research}/FEATURES.md +0 -0
- /package/docs/{templates/research → Templates/Research}/PITFALLS.md +0 -0
- /package/docs/{templates/research → Templates/Research}/STACK.md +0 -0
- /package/docs/{templates/research → Templates/Research}/SUMMARY.md +0 -0
- /package/docs/{templates → Templates}/System/CONFIG.json +0 -0
- /package/docs/{templates → Templates}/System/CONTEXT.md +0 -0
package/bin/installer-core.js
CHANGED
|
@@ -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
|
-
|
|
259
|
-
|
|
260
|
-
if (dryRun)
|
|
261
|
-
if (selfInstall)
|
|
261
|
+
Theme.printPrompt(`Runtime : ${c.cyan(runtime)}`);
|
|
262
|
+
Theme.printPrompt(`Scope : ${c.dim(scope)} → ${c.bold(targetDir)}`);
|
|
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
|
-
|
|
311
|
+
Theme.printResolved(`${c.bold(cfg.entryFile)} (Mirrored to project root)`);
|
|
309
312
|
} else {
|
|
310
|
-
|
|
313
|
+
Theme.printResolved(`${c.bold('CLAUDE.md')} (Mirrored to project root)`);
|
|
311
314
|
}
|
|
312
315
|
} else {
|
|
313
|
-
|
|
316
|
+
Theme.printResolved(c.bold(cfg.entryFile));
|
|
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
|
-
|
|
352
|
+
Theme.printResolved(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`);
|
|
350
353
|
} else {
|
|
351
|
-
|
|
354
|
+
Theme.printResolved(`${c.bold(files.length)} commands`);
|
|
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
|
-
|
|
382
|
+
Theme.printResolved(`${c.bold('.mindforge/')} (minimal core)`);
|
|
380
383
|
} else {
|
|
381
384
|
fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
382
|
-
|
|
385
|
+
Theme.printResolved(`${c.bold('.mindforge/')} (framework engine)`);
|
|
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
|
-
|
|
404
|
+
Theme.printResolved(`${c.bold('.planning/')} (state templates)`);
|
|
402
405
|
}
|
|
403
406
|
}
|
|
404
407
|
} else {
|
|
405
|
-
|
|
408
|
+
Theme.printPrompt(c.dim('.planning/ already exists — preserved (run /mindforge:health to verify)'));
|
|
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
|
-
|
|
416
|
+
Theme.printResolved(`${c.bold('MINDFORGE.md')} (project constitution)`);
|
|
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
|
-
|
|
425
|
+
Theme.printResolved(`${c.bold('bin/')} (utilities)`);
|
|
423
426
|
} else if (fsu.exists(binDst)) {
|
|
424
|
-
|
|
427
|
+
Theme.printPrompt(c.dim('bin/ already exists — preserved'));
|
|
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
|
-
|
|
433
|
-
console.log(' ✅ Install verified');
|
|
435
|
+
Theme.printResolved(c.bold('Install verified'));
|
|
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,14 @@ async function run(args) {
|
|
|
500
540
|
const isCheck = args.includes('--check');
|
|
501
541
|
const options = { dryRun, force, verbose, withUtils, minimal };
|
|
502
542
|
|
|
503
|
-
|
|
543
|
+
// Get package.json for version
|
|
544
|
+
const pJSON = JSON.parse(fsu.read(path.join(SOURCE_ROOT, 'package.json')));
|
|
504
545
|
|
|
546
|
+
// Print header and brand manifest
|
|
547
|
+
if (options.verbose || !process.stdout.isTTY) {
|
|
548
|
+
Theme.printHeader(pJSON.version);
|
|
549
|
+
Theme.printBrandManifest();
|
|
550
|
+
}
|
|
505
551
|
// Check for updates only
|
|
506
552
|
if (isCheck) {
|
|
507
553
|
const { checkAndUpdate } = require('./updater/self-update');
|
|
@@ -518,14 +564,10 @@ async function run(args) {
|
|
|
518
564
|
}
|
|
519
565
|
|
|
520
566
|
if (!isUninstall) {
|
|
521
|
-
|
|
522
|
-
|
|
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');
|
|
567
|
+
const stats = collectManifestStats();
|
|
568
|
+
Theme.printSuccessV2(runtime, scope, stats);
|
|
527
569
|
} else {
|
|
528
|
-
|
|
570
|
+
Theme.printResolved(c.bold('MindForge uninstalled'));
|
|
529
571
|
}
|
|
530
572
|
}
|
|
531
573
|
|
|
@@ -12,21 +12,14 @@ const IS_INTERACTIVE =
|
|
|
12
12
|
!ARGS.some((a) => ['--claude', '--antigravity', '--all', '--help'].includes(a)) &&
|
|
13
13
|
process.stdin.isTTY !== false;
|
|
14
14
|
|
|
15
|
-
const
|
|
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({
|
|
27
20
|
input: process.stdin,
|
|
28
21
|
output: process.stdout,
|
|
29
|
-
terminal:
|
|
22
|
+
terminal: process.stdin.isTTY,
|
|
30
23
|
});
|
|
31
24
|
}
|
|
32
25
|
|
|
@@ -74,14 +67,12 @@ function askMultiChoice(rl, q, choices) {
|
|
|
74
67
|
}
|
|
75
68
|
|
|
76
69
|
function printBanner() {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
console.log(c.dim(` v${VERSION}`));
|
|
80
|
-
console.log('');
|
|
70
|
+
Theme.printHeader(VERSION);
|
|
71
|
+
Theme.printBrandManifest();
|
|
81
72
|
}
|
|
82
73
|
|
|
83
74
|
async function detectEnvironment() {
|
|
84
|
-
|
|
75
|
+
Theme.printPrompt(c.bold('Detecting environment...'));
|
|
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(`
|
|
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
|
-
|
|
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.printSuccessV2(runtimes.join(', '), scope);
|
|
176
163
|
|
|
177
164
|
if (credGuidance.length > 0) {
|
|
178
|
-
console.log(c.bold('
|
|
165
|
+
console.log(c.bold(' CONFIGURE CREDENTIALS\n'));
|
|
179
166
|
credGuidance.forEach((g) => {
|
|
180
|
-
console.log(`
|
|
181
|
-
console.log(`
|
|
182
|
-
console.log(c.dim(`
|
|
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,178 @@
|
|
|
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
|
+
resolved: '●',
|
|
27
|
+
check: '✓',
|
|
28
|
+
cross: '✘',
|
|
29
|
+
arrow: '→',
|
|
30
|
+
prompt: '❯',
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
logo: [
|
|
34
|
+
'███╗ ███╗██╗███╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ███████╗',
|
|
35
|
+
'████╗ ████║██║████╗ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',
|
|
36
|
+
'██╔████╔██║██║██╔██╗ ██║██║ ██║█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',
|
|
37
|
+
'██║╚██╔╝██║██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',
|
|
38
|
+
'██║ ╚═╝ ██║██║██║ ╚████║██████╔╝██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',
|
|
39
|
+
'╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝'
|
|
40
|
+
].join('\n'),
|
|
41
|
+
|
|
42
|
+
tagline: "THE AUTONOMOUS ENTERPRISE AGENTIC ECOSYSTEM",
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Print a styled header with BMad-style border flare
|
|
46
|
+
*/
|
|
47
|
+
printHeader(subtitle) {
|
|
48
|
+
console.log(`\n ${this.colors.dim('┌' + '─'.repeat(78) + '┐')}`);
|
|
49
|
+
this.logo.split('\n').forEach(line => {
|
|
50
|
+
console.log(` ${this.colors.dim('│')} ${line.padEnd(74)} ${this.colors.dim('│')}`);
|
|
51
|
+
});
|
|
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 v2.1.3`.padEnd(74))} ${this.colors.dim('│')}`);
|
|
54
|
+
console.log(` ${this.colors.dim('└' + '─'.repeat(78) + '┘')}\n`);
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Print Brand Manifest (BMad V6 style)
|
|
59
|
+
*/
|
|
60
|
+
printBrandManifest() {
|
|
61
|
+
console.log(` ${this.colors.dim('│')}`);
|
|
62
|
+
console.log(` ${this.colors.dim('│')} ${this.colors.green('🎉 V2.1.3 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
|
+
},
|
|
80
|
+
|
|
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}`);
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Success Banner ( V2 Architectural Style)
|
|
91
|
+
*/
|
|
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);
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
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)
|
|
122
|
+
*/
|
|
123
|
+
printManifest(stats = {}) {
|
|
124
|
+
const { personas = 32, skills = 12, governance = 4, integrations = 7, actions = 60 } = stats;
|
|
125
|
+
|
|
126
|
+
console.log(` ${this.colors.bold('PAYLOAD MANIFEST')}`);
|
|
127
|
+
console.log(` ${this.colors.dim('┌' + '─'.repeat(74) + '┐')}`);
|
|
128
|
+
|
|
129
|
+
const rows = [
|
|
130
|
+
['PERSONAS', personas, 'The autonomous persona ecosystem'],
|
|
131
|
+
['SKILLS', skills, 'Enterprise-grade skill packs'],
|
|
132
|
+
['GOVERNANCE', governance, 'Compliance and safety modules'],
|
|
133
|
+
['INTEGRATIONS', integrations, 'Multi-platform connector suite'],
|
|
134
|
+
['ACTIONS', actions, 'Total autonomous commands deployed'],
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
rows.forEach(([label, count, desc]) => {
|
|
138
|
+
const countStr = count.toString().padStart(3);
|
|
139
|
+
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('│')}`);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
console.log(` ${this.colors.dim('└' + '─'.repeat(74) + '┘')}\n`);
|
|
143
|
+
},
|
|
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
|
+
*/
|
|
163
|
+
printStatus(label, state = 'info') {
|
|
164
|
+
const icons = {
|
|
165
|
+
done: this.colors.green(this.chars.resolved),
|
|
166
|
+
fail: this.colors.red(this.chars.cross),
|
|
167
|
+
info: this.colors.cyan(this.chars.bullet),
|
|
168
|
+
warn: this.colors.yellow('!'),
|
|
169
|
+
};
|
|
170
|
+
console.log(` ${icons[state] || icons.info} ${label}`);
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
// --- Aliases for legacy compatibility ---
|
|
174
|
+
status(label, state) { this.printStatus(label, state); },
|
|
175
|
+
printSuccess(runtime, scope, stats) { this.printSuccessV2(runtime, scope, stats); }
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
module.exports = Theme;
|