mindforge-cc 2.1.0 → 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.
- package/.agent/bin/lib/commands.cjs +959 -0
- package/.agent/bin/lib/config.cjs +421 -0
- package/.agent/bin/lib/core.cjs +1166 -0
- package/.agent/bin/lib/frontmatter.cjs +307 -0
- package/.agent/bin/lib/init.cjs +1336 -0
- package/.agent/bin/lib/milestone.cjs +252 -0
- package/.agent/bin/lib/model-profiles.cjs +68 -0
- package/.agent/bin/lib/phase.cjs +888 -0
- package/.agent/bin/lib/profile-output.cjs +952 -0
- package/.agent/bin/lib/profile-pipeline.cjs +539 -0
- package/.agent/bin/lib/roadmap.cjs +329 -0
- package/.agent/bin/lib/security.cjs +356 -0
- package/.agent/bin/lib/state.cjs +969 -0
- package/.agent/bin/lib/template.cjs +222 -0
- package/.agent/bin/lib/uat.cjs +189 -0
- package/.agent/bin/lib/verify.cjs +851 -0
- package/.agent/bin/lib/workstream.cjs +491 -0
- package/.agent/bin/mindforge-tools.cjs +897 -0
- package/.agent/file-manifest.json +219 -0
- package/.agent/hooks/mindforge-check-update.js +114 -0
- package/.agent/hooks/mindforge-context-monitor.js +156 -0
- package/.agent/hooks/mindforge-prompt-guard.js +96 -0
- package/.agent/hooks/mindforge-statusline.js +119 -0
- package/.agent/hooks/mindforge-workflow-guard.js +94 -0
- package/.agent/mindforge/discuss-phase.md +1 -1
- package/.agent/mindforge/help.md +1 -1
- package/.agent/mindforge/learn.md +3 -2
- package/.agent/mindforge/research.md +3 -2
- package/.agent/mindforge/steer.md +1 -1
- package/.agent/settings.json +38 -0
- package/.agent/skills/mindforge-add-backlog/SKILL.md +72 -0
- package/.agent/skills/mindforge-add-phase/SKILL.md +39 -0
- package/.agent/skills/mindforge-add-tests/SKILL.md +28 -0
- package/.agent/skills/mindforge-add-todo/SKILL.md +42 -0
- package/.agent/skills/mindforge-audit-milestone/SKILL.md +29 -0
- package/.agent/skills/mindforge-audit-uat/SKILL.md +20 -0
- package/.agent/skills/mindforge-autonomous/SKILL.md +33 -0
- package/.agent/skills/mindforge-check-todos/SKILL.md +40 -0
- package/.agent/skills/mindforge-cleanup/SKILL.md +19 -0
- package/.agent/skills/mindforge-complete-milestone/SKILL.md +131 -0
- package/.agent/skills/mindforge-debug/SKILL.md +163 -0
- package/.agent/skills/mindforge-discuss-phase/SKILL.md +54 -0
- package/.agent/skills/mindforge-do/SKILL.md +26 -0
- package/.agent/skills/mindforge-execute-phase/SKILL.md +49 -0
- package/.agent/skills/mindforge-fast/SKILL.md +23 -0
- package/.agent/skills/mindforge-forensics/SKILL.md +49 -0
- package/.agent/skills/mindforge-health/SKILL.md +17 -0
- package/.agent/skills/mindforge-help/SKILL.md +23 -0
- package/.agent/skills/mindforge-insert-phase/SKILL.md +28 -0
- package/.agent/skills/mindforge-join-discord/SKILL.md +19 -0
- package/.agent/skills/mindforge-list-phase-assumptions/SKILL.md +41 -0
- package/.agent/skills/mindforge-list-workspaces/SKILL.md +17 -0
- package/.agent/skills/mindforge-manager/SKILL.md +32 -0
- package/.agent/skills/mindforge-map-codebase/SKILL.md +64 -0
- package/.agent/skills/mindforge-milestone-summary/SKILL.md +44 -0
- package/.agent/skills/mindforge-new-milestone/SKILL.md +38 -0
- package/.agent/skills/mindforge-new-project/SKILL.md +36 -0
- package/.agent/skills/mindforge-new-workspace/SKILL.md +39 -0
- package/.agent/skills/mindforge-next/SKILL.md +19 -0
- package/.agent/skills/mindforge-note/SKILL.md +29 -0
- package/.agent/skills/mindforge-pause-work/SKILL.md +35 -0
- package/.agent/skills/mindforge-plan-milestone-gaps/SKILL.md +28 -0
- package/.agent/skills/mindforge-plan-phase/SKILL.md +37 -0
- package/.agent/skills/mindforge-plant-seed/SKILL.md +22 -0
- package/.agent/skills/mindforge-pr-branch/SKILL.md +21 -0
- package/.agent/skills/mindforge-profile-user/SKILL.md +38 -0
- package/.agent/skills/mindforge-progress/SKILL.md +19 -0
- package/.agent/skills/mindforge-quick/SKILL.md +38 -0
- package/.agent/skills/mindforge-reapply-patches/SKILL.md +124 -0
- package/.agent/skills/mindforge-remove-phase/SKILL.md +26 -0
- package/.agent/skills/mindforge-remove-workspace/SKILL.md +22 -0
- package/.agent/skills/mindforge-research-phase/SKILL.md +186 -0
- package/.agent/skills/mindforge-resume-work/SKILL.md +35 -0
- package/.agent/skills/mindforge-review/SKILL.md +31 -0
- package/.agent/skills/mindforge-review-backlog/SKILL.md +58 -0
- package/.agent/skills/mindforge-session-report/SKILL.md +16 -0
- package/.agent/skills/mindforge-set-profile/SKILL.md +9 -0
- package/.agent/skills/mindforge-settings/SKILL.md +32 -0
- package/.agent/skills/mindforge-ship/SKILL.md +16 -0
- package/.agent/skills/mindforge-stats/SKILL.md +16 -0
- package/.agent/skills/mindforge-thread/SKILL.md +123 -0
- package/.agent/skills/mindforge-ui-phase/SKILL.md +24 -0
- package/.agent/skills/mindforge-ui-review/SKILL.md +24 -0
- package/.agent/skills/mindforge-update/SKILL.md +35 -0
- package/.agent/skills/mindforge-validate-phase/SKILL.md +26 -0
- package/.agent/skills/mindforge-verify-work/SKILL.md +30 -0
- package/.agent/skills/mindforge-workstreams/SKILL.md +65 -0
- package/.agent/workflows/mindforge-add-phase.md +112 -0
- package/.agent/workflows/mindforge-add-tests.md +351 -0
- package/.agent/workflows/mindforge-add-todo.md +158 -0
- package/.agent/workflows/mindforge-audit-milestone.md +332 -0
- package/.agent/workflows/mindforge-audit-uat.md +109 -0
- package/.agent/workflows/mindforge-autonomous.md +815 -0
- package/.agent/workflows/mindforge-check-todos.md +177 -0
- package/.agent/workflows/mindforge-cleanup.md +152 -0
- package/.agent/workflows/mindforge-complete-milestone.md +766 -0
- package/.agent/workflows/mindforge-diagnose-issues.md +220 -0
- package/.agent/workflows/mindforge-discovery-phase.md +289 -0
- package/.agent/workflows/mindforge-discuss-phase-assumptions.md +645 -0
- package/.agent/workflows/mindforge-discuss-phase.md +1047 -0
- package/.agent/workflows/mindforge-do.md +104 -0
- package/.agent/workflows/mindforge-execute-phase.md +838 -0
- package/.agent/workflows/mindforge-execute-plan.md +509 -0
- package/.agent/workflows/mindforge-fast.md +105 -0
- package/.agent/workflows/mindforge-forensics.md +265 -0
- package/.agent/workflows/mindforge-health.md +181 -0
- package/.agent/workflows/mindforge-help.md +606 -0
- package/.agent/workflows/mindforge-insert-phase.md +130 -0
- package/.agent/workflows/mindforge-list-phase-assumptions.md +178 -0
- package/.agent/workflows/mindforge-list-workspaces.md +56 -0
- package/.agent/workflows/mindforge-manager.md +360 -0
- package/.agent/workflows/mindforge-map-codebase.md +370 -0
- package/.agent/workflows/mindforge-milestone-summary.md +223 -0
- package/.agent/workflows/mindforge-new-milestone.md +469 -0
- package/.agent/workflows/mindforge-new-project.md +1226 -0
- package/.agent/workflows/mindforge-new-workspace.md +237 -0
- package/.agent/workflows/mindforge-next.md +97 -0
- package/.agent/workflows/mindforge-node-repair.md +92 -0
- package/.agent/workflows/mindforge-note.md +156 -0
- package/.agent/workflows/mindforge-pause-work.md +176 -0
- package/.agent/workflows/mindforge-plan-milestone-gaps.md +273 -0
- package/.agent/workflows/mindforge-plan-phase.md +848 -0
- package/.agent/workflows/mindforge-plant-seed.md +169 -0
- package/.agent/workflows/mindforge-pr-branch.md +129 -0
- package/.agent/workflows/mindforge-profile-user.md +450 -0
- package/.agent/workflows/mindforge-progress.md +507 -0
- package/.agent/workflows/mindforge-quick.md +732 -0
- package/.agent/workflows/mindforge-remove-phase.md +155 -0
- package/.agent/workflows/mindforge-remove-workspace.md +90 -0
- package/.agent/workflows/mindforge-research-phase.md +74 -0
- package/.agent/workflows/mindforge-resume-project.md +325 -0
- package/.agent/workflows/mindforge-review.md +228 -0
- package/.agent/workflows/mindforge-session-report.md +146 -0
- package/.agent/workflows/mindforge-settings.md +283 -0
- package/.agent/workflows/mindforge-ship.md +228 -0
- package/.agent/workflows/mindforge-stats.md +60 -0
- package/.agent/workflows/mindforge-transition.md +671 -0
- package/.agent/workflows/mindforge-ui-phase.md +290 -0
- package/.agent/workflows/mindforge-ui-review.md +157 -0
- package/.agent/workflows/mindforge-update.md +323 -0
- package/.agent/workflows/mindforge-validate-phase.md +167 -0
- package/.agent/workflows/mindforge-verify-phase.md +254 -0
- package/.agent/workflows/mindforge-verify-work.md +623 -0
- package/.mindforge/personas/advisor-researcher.md +3 -3
- package/.mindforge/personas/debug-specialist.md +1 -1
- package/.mindforge/personas/debugger.md +1 -1
- package/.mindforge/personas/developer.md +1 -1
- package/.mindforge/personas/phase-researcher.md +4 -4
- package/.mindforge/personas/project-researcher.md +3 -3
- package/.mindforge/personas/research-agent.md +4 -3
- package/.mindforge/personas/tech-writer.md +1 -1
- package/.mindforge/personas/ui-researcher.md +1 -1
- package/.planning/ROADMAP.md +10 -0
- package/CHANGELOG.md +34 -0
- package/README.md +70 -45
- package/RELEASENOTES.md +26 -26
- package/bin/install.js +41 -41
- package/bin/installer-core.js +67 -26
- package/bin/wizard/setup-wizard.js +11 -24
- package/bin/wizard/theme.js +141 -0
- package/docs/PERSONAS.md +119 -87
- package/docs/References/checkpoints.md +778 -0
- package/docs/References/config-reference.md +81 -0
- package/docs/References/continuation-format.md +249 -0
- package/docs/References/decimal-phase-calculation.md +64 -0
- package/docs/References/git-integration.md +295 -0
- package/docs/References/git-planning-commit.md +38 -0
- package/docs/References/model-profile-resolution.md +36 -0
- package/docs/References/model-profiles.md +139 -0
- package/docs/References/phase-argument-parsing.md +61 -0
- package/docs/References/planning-config.md +202 -0
- package/docs/References/questioning.md +162 -0
- package/docs/References/tdd.md +263 -0
- package/docs/References/ui-brand.md +160 -0
- package/docs/References/user-profiling.md +681 -0
- package/docs/References/verification-patterns.md +612 -0
- package/docs/References/workstream-flag.md +58 -0
- package/docs/Templates/Agents/CLAUDE-MD.md +122 -0
- package/docs/Templates/Agents/COPILOT-INSTRUCTIONS.md +7 -0
- package/docs/Templates/Agents/DEBUGGER-PROMPT.md +91 -0
- package/docs/Templates/Agents/PLANNER-PROMPT.md +117 -0
- package/docs/Templates/Codebase/architecture.md +255 -0
- package/docs/Templates/Codebase/concerns.md +310 -0
- package/docs/Templates/Codebase/conventions.md +307 -0
- package/docs/Templates/Codebase/integrations.md +280 -0
- package/docs/Templates/Codebase/stack.md +186 -0
- package/docs/Templates/Codebase/structure.md +285 -0
- package/docs/Templates/Codebase/testing.md +480 -0
- package/docs/Templates/Execution/CONTINUE-HERE.md +78 -0
- package/docs/Templates/Execution/DISCUSSION-LOG.md +63 -0
- package/docs/Templates/Execution/PHASE-PROMPT.md +610 -0
- package/docs/Templates/Execution/STATE.md +176 -0
- package/docs/Templates/Execution/SUMMARY-COMPLEX.md +59 -0
- package/docs/Templates/Execution/SUMMARY-MINIMAL.md +41 -0
- package/docs/Templates/Execution/SUMMARY-STANDARD.md +48 -0
- package/docs/Templates/Execution/SUMMARY.md +248 -0
- package/docs/Templates/Profile/DEV-PREFERENCES.md +21 -0
- package/docs/Templates/Profile/USER-PROFILE.md +146 -0
- package/docs/Templates/Profile/USER-SETUP.md +311 -0
- package/docs/Templates/Project/DISCOVERY.md +146 -0
- package/docs/Templates/Project/MILESTONE-ARCHIVE.md +123 -0
- package/docs/Templates/Project/MILESTONE.md +115 -0
- package/docs/Templates/Project/PROJECT.md +206 -0
- package/docs/Templates/Project/REQUIREMENTS.md +231 -0
- package/docs/Templates/Project/RETROSPECTIVE.md +54 -0
- package/docs/Templates/Project/ROADMAP.md +202 -0
- package/docs/Templates/Quality/DEBUG.md +164 -0
- package/docs/Templates/Quality/UAT.md +280 -0
- package/docs/Templates/Quality/UI-SPEC.md +100 -0
- package/docs/Templates/Quality/VALIDATION.md +76 -0
- package/docs/Templates/Quality/VERIFICATION-REPORT.md +322 -0
- package/docs/Templates/Research/ARCHITECTURE.md +204 -0
- package/docs/Templates/Research/FEATURES.md +147 -0
- package/docs/Templates/Research/PITFALLS.md +200 -0
- package/docs/Templates/Research/STACK.md +120 -0
- package/docs/Templates/Research/SUMMARY.md +170 -0
- package/docs/Templates/System/CONFIG.json +43 -0
- package/docs/Templates/System/CONTEXT.md +352 -0
- package/docs/architecture/README.md +54 -42
- package/docs/commands-reference.md +62 -14
- package/docs/getting-started.md +26 -18
- package/docs/skills-authoring-guide.md +40 -12
- package/docs/tutorial.md +83 -116
- package/docs/user-guide.md +72 -198
- package/package.json +7 -2
- 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/reference/config-reference.md +0 -64
- /package/{.mindforge/memory/decision-library.jsonl → .planning/phases/01-migrate-gsd-to-mindforge/.gitkeep} +0 -0
- /package/docs/{reference → References}/audit-events.md +0 -0
- /package/docs/{reference → References}/commands.md +0 -0
- /package/docs/{reference → References}/sdk-api.md +0 -0
- /package/docs/{reference → References}/skills-api.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.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
|
-
|
|
311
|
+
Theme.status(`${c.bold(cfg.entryFile)} (Mirrored to project root)`, 'done');
|
|
309
312
|
} else {
|
|
310
|
-
|
|
313
|
+
Theme.status(`${c.bold('CLAUDE.md')} (Mirrored to project root)`, 'done');
|
|
311
314
|
}
|
|
312
315
|
} else {
|
|
313
|
-
|
|
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
|
-
|
|
352
|
+
Theme.status(`${c.bold(files.length)} commands (Mirrored to .claude/commands/mindforge/)`, 'done');
|
|
350
353
|
} else {
|
|
351
|
-
|
|
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
|
-
|
|
382
|
+
Theme.status(`${c.bold('.mindforge/')} (minimal core)`, 'done');
|
|
380
383
|
} else {
|
|
381
384
|
fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
382
|
-
|
|
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
|
-
|
|
404
|
+
Theme.status(`${c.bold('.planning/')} (state templates)`, 'done');
|
|
402
405
|
}
|
|
403
406
|
}
|
|
404
407
|
} else {
|
|
405
|
-
|
|
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
|
-
|
|
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
|
-
|
|
425
|
+
Theme.status(`${c.bold('bin/')} (utilities)`, 'done');
|
|
423
426
|
} else if (fsu.exists(binDst)) {
|
|
424
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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');
|
|
566
|
+
const stats = collectManifestStats();
|
|
567
|
+
Theme.printSuccess(runtime, scope, stats);
|
|
527
568
|
} else {
|
|
528
|
-
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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(`
|
|
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.printSuccess(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,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;
|