fix: make mosaic init idempotent — detect existing config files
- mosaic-init bash script: detect existing SOUL.md/USER.md/TOOLS.md and prompt user to keep, import (re-use values as defaults), or overwrite. Non-interactive mode exits cleanly unless --force is passed. Overwrite creates timestamped backups before replacing files. - launch.ts checkSoul(): prefer 'mosaic wizard' over legacy bash script when SOUL.md is missing, with fallback to mosaic-init. - detect-install.ts: pre-populate wizard state with existing values when user chooses 'reconfigure', so they see current settings as defaults. - soul-setup.ts: show existing agent name and communication style as defaults during reconfiguration. - Added tests for reconfigure pre-population and reset non-population.
This commit is contained in:
@@ -54,12 +54,24 @@ function checkRuntime(cmd: string): void {
|
||||
function checkSoul(): void {
|
||||
const soulPath = join(MOSAIC_HOME, 'SOUL.md');
|
||||
if (!existsSync(soulPath)) {
|
||||
console.log('[mosaic] SOUL.md not found. Running mosaic init...');
|
||||
console.log('[mosaic] SOUL.md not found. Running setup wizard...');
|
||||
|
||||
// Prefer the TypeScript wizard (idempotent, detects existing files)
|
||||
try {
|
||||
const result = spawnSync(process.execPath, [process.argv[1]!, 'wizard'], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
if (result.status === 0 && existsSync(soulPath)) return;
|
||||
} catch {
|
||||
// Fall through to legacy init
|
||||
}
|
||||
|
||||
// Fallback: legacy bash mosaic-init
|
||||
const initBin = join(MOSAIC_HOME, 'tools', '_scripts', 'mosaic-init');
|
||||
if (existsSync(initBin)) {
|
||||
spawnSync(initBin, [], { stdio: 'inherit' });
|
||||
} else {
|
||||
console.error('[mosaic] mosaic-init not found. Run: mosaic wizard');
|
||||
console.error('[mosaic] Setup failed. Run: mosaic wizard');
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user