Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
import type { WizardPrompter } from '../prompter/interface.js';
|
|
import type { WizardState, CommunicationStyle } from '../types.js';
|
|
import { DEFAULTS } from '../constants.js';
|
|
|
|
export async function soulSetupStage(
|
|
p: WizardPrompter,
|
|
state: WizardState,
|
|
): Promise<void> {
|
|
if (state.installAction === 'keep') return;
|
|
|
|
p.separator();
|
|
p.note(
|
|
'Your agent identity defines how AI assistants behave,\n' +
|
|
'their principles, and communication style.\n' +
|
|
'This creates SOUL.md.',
|
|
'Agent Identity',
|
|
);
|
|
|
|
if (!state.soul.agentName) {
|
|
state.soul.agentName = await p.text({
|
|
message: 'What name should agents use?',
|
|
placeholder: 'e.g., Jarvis, Assistant, Mosaic',
|
|
defaultValue: DEFAULTS.agentName,
|
|
validate: (v) => {
|
|
if (v.length === 0) return 'Name cannot be empty';
|
|
if (v.length > 50) return 'Name must be under 50 characters';
|
|
},
|
|
});
|
|
}
|
|
|
|
if (state.mode === 'advanced') {
|
|
if (!state.soul.roleDescription) {
|
|
state.soul.roleDescription = await p.text({
|
|
message: 'Agent role description',
|
|
placeholder: 'e.g., execution partner and visibility engine',
|
|
defaultValue: DEFAULTS.roleDescription,
|
|
});
|
|
}
|
|
} else {
|
|
state.soul.roleDescription ??= DEFAULTS.roleDescription;
|
|
}
|
|
|
|
if (!state.soul.communicationStyle) {
|
|
state.soul.communicationStyle = await p.select<CommunicationStyle>({
|
|
message: 'Communication style',
|
|
options: [
|
|
{ value: 'direct', label: 'Direct', hint: 'Concise, no fluff, actionable' },
|
|
{ value: 'friendly', label: 'Friendly', hint: 'Warm but efficient, conversational' },
|
|
{ value: 'formal', label: 'Formal', hint: 'Professional, structured, thorough' },
|
|
],
|
|
initialValue: 'direct',
|
|
});
|
|
}
|
|
|
|
if (state.mode === 'advanced') {
|
|
if (!state.soul.accessibility) {
|
|
state.soul.accessibility = await p.text({
|
|
message: 'Accessibility preferences',
|
|
placeholder:
|
|
"e.g., ADHD-friendly chunking, dyslexia-aware formatting, or 'none'",
|
|
defaultValue: 'none',
|
|
});
|
|
}
|
|
|
|
if (!state.soul.customGuardrails) {
|
|
state.soul.customGuardrails = await p.text({
|
|
message: 'Custom guardrails (optional)',
|
|
placeholder: 'e.g., Never auto-commit to main',
|
|
defaultValue: '',
|
|
});
|
|
}
|
|
}
|
|
}
|