Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { Command } from 'commander';
|
|
import { homedir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { ClackPrompter } from './prompter/clack-prompter.js';
|
|
import { HeadlessPrompter } from './prompter/headless-prompter.js';
|
|
import { createConfigService } from './config/config-service.js';
|
|
import { runWizard } from './wizard.js';
|
|
import { WizardCancelledError } from './errors.js';
|
|
import { VERSION, DEFAULT_MOSAIC_HOME } from './constants.js';
|
|
import type { CommunicationStyle } from './types.js';
|
|
|
|
const program = new Command()
|
|
.name('mosaic-wizard')
|
|
.description('Mosaic Installation Wizard')
|
|
.version(VERSION);
|
|
|
|
program
|
|
.option('--non-interactive', 'Run without prompts (uses defaults + flags)')
|
|
.option(
|
|
'--source-dir <path>',
|
|
'Source directory for framework files',
|
|
)
|
|
.option(
|
|
'--mosaic-home <path>',
|
|
'Target config directory',
|
|
DEFAULT_MOSAIC_HOME,
|
|
)
|
|
// SOUL.md overrides
|
|
.option('--name <name>', 'Agent name')
|
|
.option('--role <description>', 'Agent role description')
|
|
.option('--style <style>', 'Communication style: direct|friendly|formal')
|
|
.option('--accessibility <prefs>', 'Accessibility preferences')
|
|
.option('--guardrails <rules>', 'Custom guardrails')
|
|
// USER.md overrides
|
|
.option('--user-name <name>', 'Your name')
|
|
.option('--pronouns <pronouns>', 'Your pronouns')
|
|
.option('--timezone <tz>', 'Your timezone')
|
|
.action(async (opts) => {
|
|
try {
|
|
const mosaicHome: string = opts.mosaicHome;
|
|
const sourceDir: string = opts.sourceDir ?? mosaicHome;
|
|
|
|
const prompter = opts.nonInteractive
|
|
? new HeadlessPrompter()
|
|
: new ClackPrompter();
|
|
|
|
const configService = createConfigService(mosaicHome, sourceDir);
|
|
|
|
const style = opts.style as CommunicationStyle | undefined;
|
|
|
|
await runWizard({
|
|
mosaicHome,
|
|
sourceDir,
|
|
prompter,
|
|
configService,
|
|
cliOverrides: {
|
|
soul: {
|
|
agentName: opts.name,
|
|
roleDescription: opts.role,
|
|
communicationStyle: style,
|
|
accessibility: opts.accessibility,
|
|
customGuardrails: opts.guardrails,
|
|
},
|
|
user: {
|
|
userName: opts.userName,
|
|
pronouns: opts.pronouns,
|
|
timezone: opts.timezone,
|
|
},
|
|
},
|
|
});
|
|
} catch (err) {
|
|
if (err instanceof WizardCancelledError) {
|
|
console.log('\nWizard cancelled.');
|
|
process.exit(0);
|
|
}
|
|
console.error('Wizard failed:', err);
|
|
process.exit(1);
|
|
}
|
|
});
|
|
|
|
program.parse();
|