grimoire-wizard 0.5.2 → 0.6.0
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/README.md +66 -51
- package/dist/cli.js +504 -69
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +113 -12
- package/dist/index.js +506 -70
- package/dist/index.js.map +1 -1
- package/examples/yaml/demo.yaml +54 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/parser.ts","../src/schema.ts","../src/runner.ts","../src/conditions.ts","../src/engine.ts","../src/theme.ts","../src/themes/presets.ts","../src/spinners.ts","../src/renderers/inquirer.ts","../src/resolve.ts","../src/template.ts","../src/banner.ts","../src/plugins.ts","../src/cache.ts","../src/progress.ts","../src/mru.ts","../src/scaffolder.ts","../src/completions.ts","../src/templates.ts","../src/renderers/ink.ts","../src/renderers/clack.ts","../src/renderers/symbols.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport chalk from 'chalk';\nimport { program } from 'commander';\nimport { loadWizardConfig } from './parser';\nimport { runWizard } from './runner';\nimport { getVisibleSteps } from './engine';\nimport { resolveTheme } from './theme';\nimport { resolveTemplate } from './template';\nimport { scaffoldWizard } from './scaffolder';\nimport { bashCompletion, zshCompletion, fishCompletion } from './completions';\nimport { clearCache } from './cache';\nimport { listTemplates, deleteTemplate, loadTemplate } from './templates';\nimport { InkRenderer } from './renderers/ink';\nimport { ClackRenderer } from './renderers/clack';\nimport type { WizardRenderer } from './types';\nimport { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { stringify as yamlStringify } from 'yaml';\nimport type { Condition, WizardConfig } from './types';\n\nlet plainMode = false;\n\nfunction applyColorMode(opts: { color?: boolean; plain?: boolean }): void {\n if (opts.plain || opts.color === false || process.env['NO_COLOR'] !== undefined) {\n chalk.level = 0;\n plainMode = true;\n }\n}\n\ninterface RunCommandOpts {\n output?: string;\n format?: string;\n quiet?: boolean;\n dryRun?: boolean;\n mock?: string;\n json?: boolean;\n cache?: boolean;\n resume?: boolean;\n renderer?: string;\n template?: string;\n}\n\nprogram\n .name('grimoire')\n .description('Config-driven CLI wizard framework')\n .version('0.4.0')\n .option('--no-color', 'Disable colored output')\n .option('--plain', 'Plain output mode (no colors, no banner)')\n .hook('preAction', () => {\n const globalOpts = program.opts<{ color?: boolean; plain?: boolean }>();\n applyColorMode(globalOpts);\n });\n\nprogram\n .command('run')\n .description('Run a wizard from a config file')\n .argument('<config>', 'Path to wizard config file (.yaml, .json, .js, .ts)')\n .option('-o, --output <path>', 'Write answers to file')\n .option('-f, --format <format>', 'Output format: json, env, yaml', 'json')\n .option('-q, --quiet', 'Suppress header and summary output')\n .option('--dry-run', 'Show step plan without running the wizard')\n .option('--mock <json>', 'Run wizard with preset answers (JSON string)')\n .option('--json', 'Output structured JSON result to stdout')\n .option('--no-cache', 'Disable answer caching for this run')\n .option('--no-resume', 'Disable progress resume for this run')\n .option('--renderer <type>', 'Renderer to use: inquirer (default), ink, or clack', 'inquirer')\n .option('--template <name>', 'Load a saved template as defaults')\n .action(async (configPath: string, opts: RunCommandOpts) => {\n try {\n const fullPath = resolve(configPath);\n const config = await loadWizardConfig(fullPath);\n\n if (opts.dryRun) {\n printDryRun(config);\n return;\n }\n\n const mockAnswers = parseMockAnswers(opts.mock);\n const isJsonOutput = opts.json === true;\n const renderer = resolveRenderer(opts.renderer);\n\n let templateAnswers: Record<string, unknown> | undefined;\n if (opts.template) {\n templateAnswers = loadTemplate(config.meta.name, opts.template);\n if (!templateAnswers) {\n console.error(`\\n Template \"${opts.template}\" not found for \"${config.meta.name}\".\\n`);\n process.exit(1);\n }\n }\n\n const answers = await runWizard(config, {\n renderer,\n quiet: opts.quiet ?? isJsonOutput,\n plain: plainMode,\n mockAnswers,\n templateAnswers,\n cache: opts.cache,\n resume: opts.resume,\n configFilePath: fullPath,\n });\n\n const rawOutputPath = opts.output ?? config.output?.path;\n const outputPath = rawOutputPath ? resolve(resolveTemplate(rawOutputPath, answers)) : undefined;\n\n if (isJsonOutput) {\n const stepsCompleted = Object.keys(answers).length;\n const result = {\n ok: true,\n wizard: config.meta.name,\n answers,\n stepsCompleted,\n format: 'json',\n };\n const jsonStr = JSON.stringify(result, null, 2);\n console.log(jsonStr);\n if (outputPath) {\n writeFileSync(outputPath, jsonStr + '\\n', 'utf-8');\n }\n return;\n }\n\n if (outputPath) {\n const format = opts.format ?? config.output?.format ?? 'json';\n const content = formatOutput(answers, format);\n writeFileSync(outputPath, content, 'utf-8');\n if (!opts.quiet) {\n console.log(`\\n Answers written to: ${outputPath}\\n`);\n }\n }\n } catch (error) {\n if (opts.json) {\n const result = {\n ok: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('validate')\n .description('Validate a wizard config file without running it')\n .argument('<config>', 'Path to wizard config file')\n .action(async (configPath: string) => {\n try {\n const fullPath = resolve(configPath);\n const config = await loadWizardConfig(fullPath);\n console.log(`\\n ✓ Valid wizard config: \"${config.meta.name}\"`);\n console.log(` ${String(config.steps.length)} steps defined\\n`);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ✗ Invalid config: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('create')\n .description('Interactively scaffold a new wizard config file')\n .argument('[output]', 'Output file path', 'wizard.yaml')\n .action(async (output: string) => {\n try {\n const resolvedPath = resolve(output);\n await scaffoldWizard(resolvedPath);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('demo')\n .description('Run a demo wizard showcasing all step types')\n .action(async () => {\n try {\n const demoPath = resolve(\n fileURLToPath(import.meta.url),\n '..',\n '..',\n 'examples',\n 'yaml',\n 'demo.yaml',\n );\n const config = await loadWizardConfig(demoPath);\n await runWizard(config);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('completion')\n .description('Output shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n switch (shell) {\n case 'bash':\n console.log(bashCompletion());\n break;\n case 'zsh':\n console.log(zshCompletion());\n break;\n case 'fish':\n console.log(fishCompletion());\n break;\n default:\n console.error(`Unknown shell: ${shell}. Supported: bash, zsh, fish`);\n process.exit(1);\n }\n });\n\nconst cacheCommand = program\n .command('cache')\n .description('Manage cached wizard answers');\n\ncacheCommand\n .command('clear')\n .description('Delete cached wizard answers')\n .argument('[name]', 'Wizard name to clear (clears all if omitted)')\n .action((name?: string) => {\n clearCache(name);\n if (name) {\n console.log(`\\n Cache cleared for \"${name}\".\\n`);\n } else {\n console.log('\\n All cached answers cleared.\\n');\n }\n });\n\nconst templateCommand = program\n .command('template')\n .description('Manage saved wizard answer templates');\n\ntemplateCommand\n .command('list')\n .description('List saved templates for a wizard')\n .argument('<wizard-name>', 'Wizard name')\n .action((wizardName: string) => {\n const templates = listTemplates(wizardName);\n if (templates.length === 0) {\n console.log(`\\n No templates found for \"${wizardName}\".\\n`);\n return;\n }\n console.log(`\\n Templates for \"${wizardName}\":\\n`);\n for (const t of templates) {\n console.log(` - ${t}`);\n }\n console.log();\n });\n\ntemplateCommand\n .command('delete')\n .description('Delete a saved template')\n .argument('<wizard-name>', 'Wizard name')\n .argument('<template-name>', 'Template name')\n .action((wizardName: string, templateName: string) => {\n deleteTemplate(wizardName, templateName);\n console.log(`\\n Template \"${templateName}\" deleted from \"${wizardName}\".\\n`);\n });\n\nprogram.parse();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMockAnswers(\n mockJson: string | undefined,\n): Record<string, unknown> | undefined {\n if (mockJson === undefined) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(mockJson);\n if (!isRecord(parsed)) {\n throw new Error('--mock value must be a JSON object');\n }\n return parsed;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`--mock value is not valid JSON: ${error.message}`);\n }\n throw error;\n }\n}\n\nfunction printDryRun(config: WizardConfig): void {\n const theme = resolveTheme(config.theme);\n const visibleSteps = getVisibleSteps(config, {});\n\n console.log();\n console.log(` ${theme.bold('Dry Run:')} \"${config.meta.name}\"`);\n if (config.meta.description) {\n console.log(` ${theme.muted(config.meta.description)}`);\n }\n console.log();\n\n if (config.checks && config.checks.length > 0) {\n console.log(` ${theme.bold('Pre-flight checks:')}`);\n for (const check of config.checks) {\n console.log(` ${theme.muted('•')} ${check.name}: ${theme.muted(check.run)}`);\n }\n console.log();\n }\n\n for (let i = 0; i < config.steps.length; i++) {\n const step = config.steps[i];\n if (!step) continue;\n\n const isVisible = visibleSteps.some((v) => v.id === step.id);\n const num = String(i + 1).padStart(2, ' ');\n const typeStr = step.type.padEnd(12);\n const idStr = step.id.padEnd(20);\n const msg = `\"${step.message}\"`;\n\n const parts: string[] = [];\n\n if (!isVisible) {\n parts.push('(hidden)');\n }\n\n if (step.required === false) {\n parts.push('(optional)');\n }\n\n if (step.type === 'multiselect') {\n if (step.min !== undefined) parts.push(`min:${String(step.min)}`);\n if (step.max !== undefined) parts.push(`max:${String(step.max)}`);\n }\n\n if (step.when) {\n parts.push(`[when: ${formatCondition(step.when)}]`);\n }\n\n if (step.type === 'select' && step.routes) {\n const routeParts = Object.entries(step.routes)\n .map(([k, v]) => `${k}→${v}`)\n .join(', ');\n parts.push(`routes: {${routeParts}}`);\n }\n\n if (step.next) {\n parts.push(`→ ${step.next}`);\n }\n\n const suffix = parts.length > 0 ? ` ${parts.join(' ')}` : '';\n console.log(` Step ${num} ${typeStr} ${idStr} ${msg}${suffix}`);\n }\n\n console.log();\n\n if (config.onComplete) {\n console.log(` ${theme.bold('onComplete handler:')}`);\n console.log(` ${theme.muted(config.onComplete)}`);\n console.log();\n }\n\n if (config.actions && config.actions.length > 0) {\n console.log(` ${theme.bold('Post-wizard actions:')}`);\n for (const action of config.actions) {\n const label = action.name ?? action.run;\n const whenStr = action.when ? ` [when: ${formatCondition(action.when)}]` : '';\n console.log(` ${theme.muted('•')} ${label}: ${theme.muted(action.run)}${whenStr}`);\n }\n console.log();\n }\n}\n\nfunction formatCondition(condition: Condition): string {\n if ('all' in condition) {\n return `all(${condition.all.map(formatCondition).join(', ')})`;\n }\n if ('any' in condition) {\n return `any(${condition.any.map(formatCondition).join(', ')})`;\n }\n if ('not' in condition) {\n return `not(${formatCondition(condition.not)})`;\n }\n if ('equals' in condition) {\n return `${condition.field} equals ${String(condition.equals)}`;\n }\n if ('notEquals' in condition) {\n return `${condition.field} notEquals ${String(condition.notEquals)}`;\n }\n if ('includes' in condition) {\n return `${condition.field} includes ${String(condition.includes)}`;\n }\n if ('notIncludes' in condition) {\n return `${condition.field} notIncludes ${String(condition.notIncludes)}`;\n }\n if ('greaterThan' in condition) {\n return `${condition.field} > ${String(condition.greaterThan)}`;\n }\n if ('lessThan' in condition) {\n return `${condition.field} < ${String(condition.lessThan)}`;\n }\n if ('isEmpty' in condition) {\n return `${condition.field} isEmpty`;\n }\n if ('isNotEmpty' in condition) {\n return `${condition.field} isNotEmpty`;\n }\n return 'unknown';\n}\n\nfunction resolveRenderer(rendererName?: string): WizardRenderer | undefined {\n if (!rendererName || rendererName === 'inquirer') {\n return undefined;\n }\n if (rendererName === 'ink') {\n return new InkRenderer();\n }\n if (rendererName === 'clack') {\n return new ClackRenderer();\n }\n throw new Error(`Unknown renderer: \"${rendererName}\". Supported: inquirer, ink, clack`);\n}\n\nfunction toEnvKey(key: string): string {\n return key.replace(/[^a-zA-Z0-9]/g, '_').toUpperCase();\n}\n\nfunction formatOutput(answers: Record<string, unknown>, format: string): string {\n switch (format) {\n case 'json':\n return JSON.stringify(answers, null, 2) + '\\n';\n case 'env':\n return Object.entries(answers)\n .map(([key, value]) => {\n const strValue = Array.isArray(value)\n ? value.join(',')\n : String(value);\n return `${toEnvKey(key)}=${strValue}`;\n })\n .join('\\n') + '\\n';\n case 'yaml':\n return yamlStringify(answers);\n default:\n return JSON.stringify(answers, null, 2) + '\\n';\n }\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { readFileSync } from 'node:fs';\nimport { dirname, resolve, isAbsolute } from 'node:path';\nimport { parse as parseYAML } from 'yaml';\nimport { parseWizardConfig } from './schema';\nimport type { WizardConfig, StepConfig, ThemeConfig } from './types';\n\nconst DONE_SENTINEL = '__done__';\n\nfunction buildStepGraph(steps: StepConfig[]): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n const edges: string[] = [];\n\n if (step.next && step.next !== DONE_SENTINEL) {\n edges.push(step.next);\n }\n\n if (step.type === 'select' && step.routes) {\n for (const target of Object.values(step.routes)) {\n if (target !== DONE_SENTINEL) {\n edges.push(target);\n }\n }\n }\n\n if (!step.next && !(step.type === 'select' && step.routes)) {\n const nextStep = steps[i + 1];\n if (nextStep) {\n edges.push(nextStep.id);\n }\n }\n\n graph.set(step.id, edges);\n }\n\n return graph;\n}\n\nfunction detectCycles(config: WizardConfig): void {\n const graph = buildStepGraph(config.steps);\n\n const UNVISITED = 0;\n const IN_STACK = 1;\n const DONE = 2;\n\n const nodeState = new Map<string, number>();\n for (const id of graph.keys()) {\n nodeState.set(id, UNVISITED);\n }\n\n function dfs(nodeId: string, path: string[]): void {\n nodeState.set(nodeId, IN_STACK);\n const currentPath = [...path, nodeId];\n\n for (const neighbor of graph.get(nodeId) ?? []) {\n const state = nodeState.get(neighbor);\n\n if (state === IN_STACK) {\n const cycleStart = currentPath.indexOf(neighbor);\n const cycle = [...currentPath.slice(cycleStart), neighbor];\n throw new Error(`Cycle detected in wizard steps: ${cycle.join(' \\u2192 ')}`);\n }\n\n if (state === UNVISITED) {\n dfs(neighbor, currentPath);\n }\n }\n\n nodeState.set(nodeId, DONE);\n }\n\n for (const id of graph.keys()) {\n if (nodeState.get(id) === UNVISITED) {\n dfs(id, []);\n }\n }\n}\n\nfunction deepMergeTheme(\n parent: ThemeConfig | undefined,\n child: ThemeConfig | undefined,\n): ThemeConfig | undefined {\n if (!parent && !child) return undefined;\n if (!parent) return child;\n if (!child) return parent;\n return {\n tokens: { ...parent.tokens, ...child.tokens },\n icons: { ...parent.icons, ...child.icons },\n };\n}\n\nfunction mergeConfigs(parent: WizardConfig, child: WizardConfig): WizardConfig {\n return {\n meta: { ...parent.meta, ...child.meta },\n theme: deepMergeTheme(parent.theme, child.theme),\n steps: child.steps,\n output: child.output ?? parent.output,\n checks: [\n ...(parent.checks ?? []),\n ...(child.checks ?? []),\n ],\n actions: child.actions ?? parent.actions,\n };\n}\n\nconst OPTION_STEP_TYPES = new Set(['select', 'multiselect', 'search']);\n\nfunction resolveOptionsFromSteps(raw: Record<string, unknown>, configDir: string): void {\n const steps = raw['steps'];\n if (!Array.isArray(steps)) return;\n\n for (const step of steps) {\n if (typeof step !== 'object' || step === null) continue;\n const stepObj = step as Record<string, unknown>;\n const optionsFrom = stepObj['optionsFrom'];\n if (typeof optionsFrom !== 'string') continue;\n\n const stepId = String(stepObj['id'] ?? 'unknown');\n const stepType = String(stepObj['type'] ?? 'unknown');\n\n if (!OPTION_STEP_TYPES.has(stepType)) {\n throw new Error(\n `Step \"${stepId}\" has \"optionsFrom\" but type \"${stepType}\" does not support dynamic options`,\n );\n }\n\n const fullPath = isAbsolute(optionsFrom)\n ? optionsFrom\n : resolve(configDir, optionsFrom);\n\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n throw new Error(\n `Step \"${stepId}\": failed to read optionsFrom file \"${fullPath}\"`,\n );\n }\n\n let parsed: unknown;\n try {\n if (fullPath.endsWith('.yaml') || fullPath.endsWith('.yml')) {\n parsed = parseYAML(content);\n } else {\n parsed = JSON.parse(content);\n }\n } catch {\n throw new Error(\n `Step \"${stepId}\": optionsFrom file \"${fullPath}\" contains invalid JSON/YAML`,\n );\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\n `Step \"${stepId}\": optionsFrom file \"${fullPath}\" must contain an array`,\n );\n }\n\n stepObj['options'] = parsed;\n delete stepObj['optionsFrom'];\n }\n}\n\nasync function loadWithInheritance(\n filePath: string,\n seen: Set<string>,\n): Promise<WizardConfig> {\n const resolvedPath = resolve(filePath);\n\n if (seen.has(resolvedPath)) {\n throw new Error(`Circular extends detected: \"${resolvedPath}\" was already loaded`);\n }\n seen.add(resolvedPath);\n\n const explorer = cosmiconfig('grimoire');\n const result = await explorer.load(resolvedPath);\n\n if (!result || result.isEmpty) {\n throw new Error(`No configuration found at: ${resolvedPath}`);\n }\n\n const raw = result.config as Record<string, unknown>;\n const extendsPath = typeof raw['extends'] === 'string' ? raw['extends'] : undefined;\n\n resolveOptionsFromSteps(raw, dirname(resolvedPath));\n const config = parseWizardConfig(raw);\n\n if (!extendsPath) {\n return config;\n }\n\n const parentPath = isAbsolute(extendsPath)\n ? extendsPath\n : resolve(dirname(resolvedPath), extendsPath);\n\n const parentConfig = await loadWithInheritance(parentPath, seen);\n return mergeConfigs(parentConfig, config);\n}\n\nexport async function loadWizardConfig(filePath: string): Promise<WizardConfig> {\n const config = await loadWithInheritance(filePath, new Set<string>());\n detectCycles(config);\n return config;\n}\n\nexport function parseWizardYAML(yamlString: string): WizardConfig {\n const raw: unknown = parseYAML(yamlString);\n\n if (raw !== null && typeof raw === 'object' && !Array.isArray(raw)) {\n if ('extends' in raw && typeof raw.extends === 'string') {\n throw new Error(\n '\"extends\" is not supported in parseWizardYAML — use loadWizardConfig with a file path',\n );\n }\n\n const steps = (raw as Record<string, unknown>)['steps'];\n if (Array.isArray(steps)) {\n for (const step of steps) {\n if (typeof step === 'object' && step !== null && 'optionsFrom' in step) {\n throw new Error(\n '\"optionsFrom\" is not supported in parseWizardYAML — use loadWizardConfig with a file path',\n );\n }\n }\n }\n }\n\n const config = parseWizardConfig(raw);\n detectCycles(config);\n return config;\n}\n","import { z } from 'zod';\nimport type {\n ActionConfig,\n Condition,\n PreFlightCheck,\n ValidationRule,\n WizardConfig,\n} from './types';\n\nconst conditionSchema: z.ZodType<Condition> = z.lazy(() => {\n const fieldEquals = z.object({ field: z.string(), equals: z.unknown() }).strict();\n const fieldNotEquals = z.object({ field: z.string(), notEquals: z.unknown() }).strict();\n const fieldIncludes = z.object({ field: z.string(), includes: z.unknown() }).strict();\n const fieldNotIncludes = z.object({ field: z.string(), notIncludes: z.unknown() }).strict();\n const fieldGreaterThan = z.object({ field: z.string(), greaterThan: z.number() }).strict();\n const fieldLessThan = z.object({ field: z.string(), lessThan: z.number() }).strict();\n const fieldIsEmpty = z.object({ field: z.string(), isEmpty: z.literal(true) }).strict();\n const fieldIsNotEmpty = z.object({ field: z.string(), isNotEmpty: z.literal(true) }).strict();\n const allCondition = z.object({ all: z.array(conditionSchema) }).strict();\n const anyCondition = z.object({ any: z.array(conditionSchema) }).strict();\n const notCondition = z.object({ not: conditionSchema }).strict();\n\n return z.union([\n fieldEquals,\n fieldNotEquals,\n fieldIncludes,\n fieldNotIncludes,\n fieldGreaterThan,\n fieldLessThan,\n fieldIsEmpty,\n fieldIsNotEmpty,\n allCondition,\n anyCondition,\n notCondition,\n ]) as z.ZodType<Condition>;\n});\n\nconst validationRuleSchema: z.ZodType<ValidationRule> = z.discriminatedUnion('rule', [\n z.object({ rule: z.literal('required'), message: z.string().optional() }),\n z.object({ rule: z.literal('minLength'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('maxLength'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('pattern'), value: z.string(), message: z.string().optional() }),\n z.object({ rule: z.literal('min'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('max'), value: z.number(), message: z.string().optional() }),\n]);\n\nconst selectOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n hint: z.string().optional(),\n disabled: z.union([z.boolean(), z.string()]).optional(),\n});\n\nconst separatorOptionSchema = z.object({\n separator: z.string(),\n});\n\nconst selectChoiceSchema = z.union([selectOptionSchema, separatorOptionSchema]);\n\nconst baseStepFields = {\n id: z.string(),\n message: z.string(),\n description: z.string().optional(),\n next: z.string().optional(),\n when: conditionSchema.optional(),\n keepValuesOnPrevious: z.boolean().optional(),\n required: z.boolean().optional(),\n group: z.string().optional(),\n} as const;\n\nconst textStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('text'),\n placeholder: z.string().optional(),\n default: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst selectStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('select'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.string().optional(),\n routes: z.record(z.string(), z.string()).optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n});\n\nconst multiSelectStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('multiselect'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.array(z.string()).optional(),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n});\n\nconst confirmStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('confirm'),\n default: z.boolean().optional(),\n});\n\nconst passwordStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('password'),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst numberStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('number'),\n default: z.number().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().positive().optional(),\n});\n\nconst searchStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('search'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.string().optional(),\n placeholder: z.string().optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n});\n\nconst editorStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('editor'),\n default: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst pathStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('path'),\n default: z.string().optional(),\n placeholder: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst toggleStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('toggle'),\n default: z.boolean().optional(),\n active: z.string().optional(),\n inactive: z.string().optional(),\n});\n\nconst messageStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('message'),\n});\n\nconst noteStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('note'),\n});\n\nconst stepConfigSchema = z.discriminatedUnion('type', [\n textStepSchema,\n selectStepSchema,\n multiSelectStepSchema,\n confirmStepSchema,\n passwordStepSchema,\n numberStepSchema,\n searchStepSchema,\n editorStepSchema,\n pathStepSchema,\n toggleStepSchema,\n messageStepSchema,\n noteStepSchema,\n]);\n\nconst hexColorSchema = z.string().regex(\n /^#[0-9a-fA-F]{6}$/,\n 'Must be a 6-digit hex color (e.g., #FF0000)',\n);\n\nconst themeConfigSchema = z.object({\n preset: z.enum(['default', 'catppuccin', 'dracula', 'nord', 'tokyonight', 'monokai']).optional(),\n tokens: z.object({\n primary: hexColorSchema.optional(),\n success: hexColorSchema.optional(),\n error: hexColorSchema.optional(),\n warning: hexColorSchema.optional(),\n info: hexColorSchema.optional(),\n muted: hexColorSchema.optional(),\n accent: hexColorSchema.optional(),\n }).optional(),\n icons: z.object({\n step: z.string().optional(),\n stepDone: z.string().optional(),\n stepPending: z.string().optional(),\n pointer: z.string().optional(),\n }).optional(),\n spinner: z.union([\n z.string(),\n z.object({\n frames: z.array(z.string()).min(1),\n interval: z.number().positive().optional(),\n }),\n ]).optional(),\n});\n\nconst preFlightCheckSchema: z.ZodType<PreFlightCheck> = z.object({\n name: z.string(),\n run: z.string(),\n message: z.string(),\n});\n\nconst actionConfigSchema: z.ZodType<ActionConfig> = z.object({\n name: z.string().optional(),\n run: z.string(),\n when: conditionSchema.optional(),\n});\n\nconst wizardConfigSchema = z.object({\n meta: z.object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n review: z.boolean().optional(),\n icon: z.string().optional(),\n }),\n theme: themeConfigSchema.optional(),\n steps: z.array(stepConfigSchema).min(1),\n output: z.object({\n format: z.enum(['json', 'env', 'yaml']),\n path: z.string().optional(),\n }).optional(),\n extends: z.string().optional(),\n checks: z.array(preFlightCheckSchema).optional(),\n actions: z.array(actionConfigSchema).optional(),\n onComplete: z.string().optional(),\n}).superRefine((config, ctx) => {\n const stepIds = new Set<string>();\n\n for (const step of config.steps) {\n if (stepIds.has(step.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate step ID: \"${step.id}\"`,\n path: ['steps'],\n });\n }\n stepIds.add(step.id);\n }\n\n config.steps.forEach((step, i) => {\n if (step.next && step.next !== '__done__' && !stepIds.has(step.next)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" references unknown next step: \"${step.next}\"`,\n path: ['steps', i, 'next'],\n });\n }\n\n if (step.type === 'select' && step.routes) {\n for (const [key, target] of Object.entries(step.routes)) {\n if (target !== '__done__' && !stepIds.has(target)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" route \"${key}\" references unknown step: \"${target}\"`,\n path: ['steps', i, 'routes', key],\n });\n }\n }\n }\n\n if (step.when) {\n collectConditionFieldIssues(step.when, stepIds, ctx, ['steps', i, 'when']);\n }\n\n if (step.type === 'select' && step.routes && step.options) {\n const optionValues = new Set<string>();\n for (const o of step.options) {\n if ('value' in o) {\n optionValues.add(o.value);\n }\n }\n for (const routeKey of Object.keys(step.routes)) {\n if (!optionValues.has(routeKey)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" route key \"${routeKey}\" does not match any option value`,\n path: ['steps', i, 'routes', routeKey],\n });\n }\n }\n }\n\n if (step.type === 'select' || step.type === 'multiselect' || step.type === 'search') {\n const hasOptions = step.options !== undefined;\n const hasOptionsFrom = step.optionsFrom !== undefined;\n if (hasOptions && hasOptionsFrom) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" has both \"options\" and \"optionsFrom\" — only one is allowed`,\n path: ['steps', i],\n });\n }\n if (!hasOptions && !hasOptionsFrom) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" must have either \"options\" or \"optionsFrom\"`,\n path: ['steps', i],\n });\n }\n }\n\n if ((step.type === 'number' || step.type === 'multiselect') &&\n step.min !== undefined && step.max !== undefined && step.min > step.max) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" has min (${String(step.min)}) greater than max (${String(step.max)})`,\n path: ['steps', i],\n });\n }\n });\n\n if (config.actions) {\n config.actions.forEach((action, i) => {\n if (action.when) {\n collectConditionFieldIssues(action.when, stepIds, ctx, ['actions', i, 'when']);\n }\n });\n }\n});\n\nfunction collectConditionFieldIssues(\n condition: Condition,\n validIds: Set<string>,\n ctx: z.RefinementCtx,\n path: (string | number)[],\n): void {\n if ('field' in condition) {\n const fieldRoot = condition.field.split('.')[0];\n if (fieldRoot && !validIds.has(fieldRoot)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Condition references unknown step ID: \"${fieldRoot}\"`,\n path,\n });\n }\n return;\n }\n if ('all' in condition) {\n condition.all.forEach((child, i) => {\n collectConditionFieldIssues(child, validIds, ctx, [...path, 'all', i]);\n });\n return;\n }\n if ('any' in condition) {\n condition.any.forEach((child, i) => {\n collectConditionFieldIssues(child, validIds, ctx, [...path, 'any', i]);\n });\n return;\n }\n if ('not' in condition) {\n collectConditionFieldIssues(condition.not, validIds, ctx, [...path, 'not']);\n }\n}\n\nexport {\n actionConfigSchema,\n conditionSchema,\n validationRuleSchema,\n selectOptionSchema,\n separatorOptionSchema,\n selectChoiceSchema,\n messageStepSchema,\n noteStepSchema,\n stepConfigSchema,\n themeConfigSchema,\n preFlightCheckSchema,\n wizardConfigSchema,\n};\n\nexport function parseWizardConfig(raw: unknown): WizardConfig {\n // The zod schema allows options to be optional (when optionsFrom is used).\n // After resolution in loadWizardConfig, options is always populated.\n const result = wizardConfigSchema.parse(raw) as WizardConfig;\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { resolve, dirname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createWizardState, getVisibleSteps, wizardReducer } from './engine';\nimport { resolveTheme } from './theme';\nimport { InquirerRenderer } from './renderers/inquirer';\nimport { resolveEnvDefault, resolveEnvDefaultBoolean, resolveEnvDefaultNumber } from './resolve';\nimport { resolveTemplate, resolveTemplateStrict } from './template';\nimport { renderBanner } from './banner';\nimport { registerPlugin, getPluginStep, clearPlugins } from './plugins';\nimport type { GrimoirePlugin } from './plugins';\nimport { evaluateCondition } from './conditions';\nimport { loadCachedAnswers, saveCachedAnswers } from './cache';\nimport { saveProgress, loadProgress, clearProgress } from './progress';\nimport { recordSelection, getOrderedOptions } from './mru';\nimport type { ActionConfig, PreFlightCheck, SelectChoice, SelectOption, StepConfig, WizardConfig, WizardEvent, WizardRenderer, WizardState, ResolvedTheme } from './types';\n\nfunction emitEvent(renderer: WizardRenderer, event: WizardEvent, theme: ResolvedTheme): void {\n if (renderer.onEvent) {\n renderer.onEvent(event, theme);\n }\n}\n\nexport interface RunWizardOptions {\n renderer?: WizardRenderer;\n quiet?: boolean;\n plain?: boolean;\n mockAnswers?: Record<string, unknown>;\n templateAnswers?: Record<string, unknown>;\n onBeforeStep?: (stepId: string, step: StepConfig, state: WizardState) => Promise<void> | void;\n onAfterStep?: (stepId: string, value: unknown, state: WizardState) => Promise<void> | void;\n onStepComplete?: (stepId: string, value: unknown, state: WizardState) => void;\n onCancel?: (state: WizardState) => void;\n plugins?: GrimoirePlugin[];\n asyncValidate?: (stepId: string, value: unknown, answers: Record<string, unknown>) => Promise<string | null>;\n cache?: boolean | { dir?: string };\n mru?: boolean;\n resume?: boolean;\n configFilePath?: string;\n optionsProvider?: (\n stepId: string,\n answers: Record<string, unknown>,\n ) => Promise<SelectOption[] | undefined>;\n}\n\nexport function runPreFlightChecks(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): void {\n if (renderer) emitEvent(renderer, { type: 'checks:start', checks }, theme);\n for (const check of checks) {\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: check.name }, theme);\n try {\n execSync(check.run, { stdio: 'pipe' });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: `${check.name}` }, theme);\n console.log(` ${theme.success('✓')} ${check.name}`);\n if (renderer) emitEvent(renderer, { type: 'check:pass', name: check.name }, theme);\n } catch {\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n console.log(` ${theme.error('✗')} ${check.name}: ${check.message}`);\n if (renderer) emitEvent(renderer, { type: 'check:fail', name: check.name, message: check.message }, theme);\n throw new Error(`Pre-flight check failed: ${check.name} — ${check.message}`);\n }\n }\n console.log();\n}\n\nfunction getMockValue(\n step: StepConfig,\n mockAnswers: Record<string, unknown>,\n): unknown {\n if (step.id in mockAnswers) {\n return mockAnswers[step.id];\n }\n\n if (step.type === 'message' || step.type === 'note') {\n return true;\n }\n\n const defaultValue = getStepDefault(step);\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n\n throw new Error(\n `Mock mode: no answer provided for step \"${step.id}\" and no default available`,\n );\n}\n\nfunction getStepDefault(step: StepConfig): unknown {\n switch (step.type) {\n case 'text':\n case 'select':\n case 'search':\n case 'editor':\n case 'path':\n return step.default;\n case 'number':\n return step.default;\n case 'confirm':\n case 'toggle':\n return step.default;\n case 'multiselect':\n return step.default;\n case 'password':\n case 'message':\n case 'note':\n return undefined;\n }\n}\n\nexport async function runWizard(\n config: WizardConfig,\n options?: RunWizardOptions,\n): Promise<Record<string, unknown>> {\n const renderer = options?.renderer ?? new InquirerRenderer();\n const theme = resolveTheme(config.theme);\n const mockAnswers = options?.mockAnswers;\n const isMock = mockAnswers !== undefined;\n const quiet = options?.quiet ?? isMock;\n const cacheEnabled = !isMock && options?.cache !== false;\n const cacheDir = typeof options?.cache === 'object' ? options.cache.dir : undefined;\n const mruEnabled = !isMock && options?.mru !== false;\n let state = createWizardState(config);\n\n const resumeEnabled = !isMock && options?.resume !== false;\n if (resumeEnabled) {\n const saved = loadProgress(config.meta.name);\n if (saved) {\n const stepExists = config.steps.some(s => s.id === saved.currentStepId);\n if (stepExists) {\n state = {\n ...state,\n currentStepId: saved.currentStepId,\n answers: { ...state.answers, ...saved.answers },\n history: saved.history,\n };\n }\n }\n }\n\n const cachedAnswers = cacheEnabled\n ? loadCachedAnswers(config.meta.name, cacheDir)\n : undefined;\n\n const userPlugins = options?.plugins;\n if (userPlugins) {\n for (const plugin of userPlugins) {\n registerPlugin(plugin);\n }\n }\n\n try {\n if (!isMock && config.checks && config.checks.length > 0) {\n runPreFlightChecks(config.checks, theme, renderer);\n }\n\n if (!quiet) {\n printWizardHeader(config, theme, options?.plain);\n }\n\n const visibleStepsForCount = getVisibleSteps(config, state.answers);\n emitEvent(renderer, { type: 'session:start', wizard: config.meta.name, description: config.meta.description, totalSteps: visibleStepsForCount.length }, theme);\n\n let needsReview = true;\n\n while (needsReview) {\n let previousGroup: string | undefined;\n\n while (state.status === 'running') {\n const visibleSteps = getVisibleSteps(config, state.answers);\n const currentStep = config.steps.find((s) => s.id === state.currentStepId);\n\n if (!currentStep) {\n throw new Error(`Current step not found: \"${state.currentStepId}\"`);\n }\n\n if (currentStep.group !== undefined && currentStep.group !== previousGroup) {\n const resolvedGroup = resolveTemplate(currentStep.group, state.answers);\n if (!isMock) {\n renderer.renderGroupHeader(resolvedGroup, theme);\n }\n emitEvent(renderer, { type: 'group:start', group: resolvedGroup }, theme);\n }\n previousGroup = currentStep.group;\n\n const stepIndex = visibleSteps.findIndex((s) => s.id === state.currentStepId);\n const resolvedMessage = resolveTemplate(currentStep.message, state.answers);\n const resolvedDescription = currentStep.description ? resolveTemplate(currentStep.description, state.answers) : undefined;\n\n if (!isMock) {\n renderer.renderStepHeader(stepIndex, visibleSteps.length, resolvedMessage, theme, resolvedDescription);\n }\n\n emitEvent(renderer, { type: 'step:start', stepId: currentStep.id, stepIndex, totalVisible: visibleSteps.length, step: currentStep }, theme);\n\n if (currentStep.type === 'note') {\n emitEvent(renderer, { type: 'note', title: resolvedMessage, body: resolvedDescription ?? '' }, theme);\n }\n\n if (options?.onBeforeStep) {\n await options.onBeforeStep(currentStep.id, currentStep, state);\n }\n\n const pluginStep = getPluginStep(currentStep.type);\n const resolvedStep = pluginStep ? currentStep : resolveStepDefaults(currentStep, cachedAnswers);\n const withTemplate = options?.templateAnswers\n ? applyTemplateDefaults(resolvedStep, options.templateAnswers)\n : resolvedStep;\n const templatedStep = resolveStepTemplates(withTemplate, state.answers);\n const mruStep = mruEnabled ? applyMruOrdering(templatedStep, config.meta.name) : templatedStep;\n\n let finalStep = mruStep;\n if (!isMock && options?.optionsProvider && isSelectLikeStep(currentStep.type)) {\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: resolvedMessage }, theme);\n const dynamicOptions = await options.optionsProvider(currentStep.id, state.answers);\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: resolvedMessage }, theme);\n if (dynamicOptions) {\n finalStep = { ...mruStep, options: dynamicOptions } as StepConfig;\n }\n }\n\n try {\n const value = isMock\n ? getMockValue(finalStep, mockAnswers)\n : pluginStep\n ? await pluginStep.render(toStepRecord(finalStep), state, theme)\n : await renderStep(renderer, finalStep, state, theme);\n\n if (pluginStep?.validate) {\n const pluginError = pluginStep.validate(value, toStepRecord(templatedStep));\n if (pluginError) {\n if (isMock) {\n throw new Error(\n `Mock mode: validation failed for step \"${currentStep.id}\": ${pluginError}`,\n );\n }\n console.log(theme.error(`\\n ${pluginError}\\n`));\n continue;\n }\n }\n\n const nextState = wizardReducer(state, { type: 'NEXT', value }, config);\n\n if (nextState.errors[currentStep.id]) {\n const errorMsg = resolveTemplate(nextState.errors[currentStep.id] ?? '', state.answers);\n emitEvent(renderer, { type: 'step:error', stepId: currentStep.id, error: errorMsg }, theme);\n if (isMock) {\n throw new Error(\n `Mock mode: validation failed for step \"${currentStep.id}\": ${errorMsg}`,\n );\n }\n console.log(theme.error(`\\n ${errorMsg}\\n`));\n state = { ...nextState, errors: {} };\n continue;\n }\n\n if (!isMock && options?.asyncValidate) {\n const asyncError = await options.asyncValidate(currentStep.id, value, nextState.answers);\n if (asyncError !== null) {\n console.log(theme.error(`\\n ${asyncError}\\n`));\n state = { ...nextState, errors: {} };\n continue;\n }\n }\n\n if (options?.onAfterStep) {\n await options.onAfterStep(currentStep.id, value, nextState);\n }\n\n state = nextState;\n emitEvent(renderer, { type: 'step:complete', stepId: currentStep.id, value, step: currentStep }, theme);\n\n if (mruEnabled && isSelectLikeStep(currentStep.type)) {\n recordSelection(config.meta.name, currentStep.id, value as string | string[]);\n }\n\n options?.onStepComplete?.(currentStep.id, value, state);\n } catch (error: unknown) {\n if (!isMock && isUserCancel(error)) {\n state = wizardReducer(state, { type: 'CANCEL' }, config);\n options?.onCancel?.(state);\n const passwordStepIds = config.steps.filter(s => s.type === 'password').map(s => s.id);\n saveProgress(config.meta.name, {\n currentStepId: state.currentStepId,\n answers: state.answers,\n history: state.history,\n }, undefined, passwordStepIds);\n emitEvent(renderer, { type: 'session:end', answers: state.answers, cancelled: true }, theme);\n if (!quiet) {\n console.log(theme.warning('\\n Wizard cancelled.\\n'));\n }\n return state.answers;\n }\n throw error;\n }\n }\n\n // Review screen: after wizard loop completes, before summary\n if (config.meta.review && !isMock && state.status === 'done') {\n const reviewLines: string[] = [];\n for (const step of config.steps) {\n const answer = state.answers[step.id];\n if (answer === undefined) continue;\n const display = step.type === 'password' ? '****' :\n Array.isArray(answer) ? answer.map(String).join(', ') : String(answer);\n reviewLines.push(`${step.id}: ${display}`);\n }\n\n emitEvent(renderer, { type: 'note', title: 'Review your answers', body: reviewLines.join('\\n') }, theme);\n\n console.log(`\\n ${theme.bold('Review your answers:')}\\n`);\n for (const line of reviewLines) {\n console.log(` ${line}`);\n }\n console.log();\n\n const { confirm: confirmPrompt } = await import('@inquirer/prompts');\n const ok = await confirmPrompt({\n message: 'Everything look right?',\n default: true,\n });\n\n if (ok) {\n needsReview = false;\n } else {\n const { select: selectPrompt } = await import('@inquirer/prompts');\n const stepsWithAnswers = config.steps.filter(\n s => state.answers[s.id] !== undefined && s.type !== 'note' && s.type !== 'message',\n );\n\n const stepToRevisit = await selectPrompt({\n message: 'Which step would you like to change?',\n choices: stepsWithAnswers.map(s => ({\n name: `${s.id}: ${s.type === 'password' ? '****' : String(state.answers[s.id] ?? '')}`,\n value: s.id,\n })),\n });\n\n state = {\n ...state,\n currentStepId: stepToRevisit,\n status: 'running',\n };\n }\n } else {\n needsReview = false;\n }\n }\n\n if (state.status === 'done' && !quiet) {\n renderer.renderSummary(state.answers, config.steps, theme);\n }\n\n if (state.status === 'done' && !isMock) {\n if (config.onComplete) {\n await executeOnComplete(config.onComplete, options?.configFilePath, state.answers, config, theme, renderer);\n }\n if (config.actions && config.actions.length > 0) {\n await executeActions(config.actions, state.answers, theme, renderer);\n }\n }\n\n emitEvent(renderer, { type: 'session:end', answers: state.answers, cancelled: state.status === 'cancelled' }, theme);\n\n if (state.status === 'done' && cacheEnabled) {\n const passwordStepIds = new Set(\n config.steps.filter((s) => s.type === 'password').map((s) => s.id),\n );\n const answersToCache: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state.answers)) {\n if (!passwordStepIds.has(key)) {\n answersToCache[key] = value;\n }\n }\n saveCachedAnswers(config.meta.name, answersToCache, cacheDir);\n }\n\n if (state.status === 'done') {\n clearProgress(config.meta.name);\n }\n\n return state.answers;\n } finally {\n if (userPlugins) {\n clearPlugins();\n }\n }\n}\n\nfunction toStepRecord(step: StepConfig): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(step)) {\n record[key] = val;\n }\n return record;\n}\n\nfunction renderStep(\n renderer: WizardRenderer,\n step: StepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n): Promise<unknown> {\n switch (step.type) {\n case 'text':\n return renderer.renderText(step, state, theme);\n case 'select':\n return renderer.renderSelect(step, state, theme);\n case 'multiselect':\n return renderer.renderMultiSelect(step, state, theme);\n case 'confirm':\n return renderer.renderConfirm(step, state, theme);\n case 'password':\n return renderer.renderPassword(step, state, theme);\n case 'number':\n return renderer.renderNumber(step, state, theme);\n case 'search':\n return renderer.renderSearch(step, state, theme);\n case 'editor':\n return renderer.renderEditor(step, state, theme);\n case 'path':\n return renderer.renderPath(step, state, theme);\n case 'toggle':\n return renderer.renderToggle(step, state, theme);\n case 'message':\n renderer.renderMessage(step, state, theme);\n return Promise.resolve(true);\n case 'note':\n return Promise.resolve(true);\n }\n}\n\nfunction resolveStepDefaults(\n step: StepConfig,\n cachedAnswers?: Record<string, unknown>,\n): StepConfig {\n switch (step.type) {\n case 'text': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'search': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'editor': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'path': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'select': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'number': {\n const resolved = resolveEnvDefaultNumber(step.default);\n const fallback = resolved ?? getCachedDefault<number>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'confirm': {\n const resolved = resolveEnvDefaultBoolean(step.default);\n const fallback = resolved ?? getCachedDefault<boolean>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'toggle': {\n const resolved = resolveEnvDefaultBoolean(step.default);\n const fallback = resolved ?? getCachedDefault<boolean>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'multiselect': {\n const fallback = step.default ?? getCachedDefault<string[]>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'password':\n case 'message':\n case 'note':\n return step;\n }\n}\n\nfunction getCachedDefault<T>(\n stepId: string,\n cachedAnswers?: Record<string, unknown>,\n): T | undefined {\n if (!cachedAnswers || !(stepId in cachedAnswers)) return undefined;\n return cachedAnswers[stepId] as T;\n}\n\nfunction applyTemplateDefaults(step: StepConfig, templateAnswers: Record<string, unknown>): StepConfig {\n if (!(step.id in templateAnswers)) return step;\n if (step.type === 'password' || step.type === 'message' || step.type === 'note') return step;\n\n const value = templateAnswers[step.id];\n\n switch (step.type) {\n case 'text':\n case 'select':\n case 'search':\n case 'editor':\n case 'path':\n return { ...step, default: typeof value === 'string' ? value : step.default };\n case 'number':\n return { ...step, default: typeof value === 'number' ? value : step.default };\n case 'confirm':\n case 'toggle':\n return { ...step, default: typeof value === 'boolean' ? value : step.default };\n case 'multiselect':\n return { ...step, default: Array.isArray(value) ? (value as string[]) : step.default };\n }\n}\n\nfunction isSelectLikeStep(type: string): boolean {\n return type === 'select' || type === 'multiselect' || type === 'search';\n}\n\nfunction applyMruOrdering(step: StepConfig, wizardName: string): StepConfig {\n if (step.type === 'select') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n if (step.type === 'multiselect') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n if (step.type === 'search') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n return step;\n}\n\nfunction resolveChoiceTemplates(\n options: SelectChoice[],\n answers: Record<string, unknown>,\n): SelectChoice[] {\n return options.map((opt) => {\n if ('separator' in opt) return opt;\n return {\n ...opt,\n label: resolveTemplate(opt.label, answers),\n hint: opt.hint ? resolveTemplate(opt.hint, answers) : undefined,\n };\n });\n}\n\nfunction resolveStepTemplates(step: StepConfig, answers: Record<string, unknown>): StepConfig {\n switch (step.type) {\n case 'text':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'select':\n return {\n ...step,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'multiselect':\n return {\n ...step,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'search':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'path':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'editor':\n return {\n ...step,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'password':\n case 'number':\n case 'confirm':\n case 'toggle':\n case 'message':\n case 'note':\n return {\n ...step,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n }\n}\n\nasync function executeOnComplete(\n handlerPath: string,\n configFilePath: string | undefined,\n answers: Record<string, unknown>,\n config: WizardConfig,\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): Promise<void> {\n if (renderer) emitEvent(renderer, { type: 'oncomplete:start' }, theme);\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: `Running onComplete handler...` }, theme);\n\n const resolvedPath = configFilePath\n ? resolve(dirname(configFilePath), handlerPath)\n : resolve(handlerPath);\n\n try {\n const mod = await import(pathToFileURL(resolvedPath).href);\n if (typeof mod.default !== 'function') {\n throw new Error(`onComplete handler \"${handlerPath}\" must export a default function`);\n }\n await mod.default({ answers, config });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: 'Handler complete' }, theme);\n if (renderer) emitEvent(renderer, { type: 'oncomplete:pass' }, theme);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n if (renderer) emitEvent(renderer, { type: 'oncomplete:fail', error: message }, theme);\n console.log(`\\n ${theme.error('✗')} onComplete handler failed: ${message}\\n`);\n throw error;\n }\n}\n\nasync function executeActions(\n actions: ActionConfig[],\n answers: Record<string, unknown>,\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): Promise<void> {\n if (renderer) emitEvent(renderer, { type: 'actions:start' }, theme);\n console.log(`\\n ${theme.bold('Running actions...')}\\n`);\n\n for (const action of actions) {\n if (action.when && !evaluateCondition(action.when, answers)) {\n continue;\n }\n\n const resolvedCommand = resolveTemplateStrict(action.run, answers);\n const resolvedName = action.name ? resolveTemplateStrict(action.name, answers) : undefined;\n const label = resolvedName ?? resolvedCommand;\n\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: label }, theme);\n try {\n execSync(resolvedCommand, { stdio: 'pipe' });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: label }, theme);\n console.log(` ${theme.success('✓')} ${label}`);\n if (renderer) emitEvent(renderer, { type: 'action:pass', name: label }, theme);\n } catch {\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n console.log(` ${theme.error('✗')} ${label}`);\n if (renderer) emitEvent(renderer, { type: 'action:fail', name: label }, theme);\n throw new Error(`Action failed: ${label}`);\n }\n }\n console.log();\n}\n\nfunction printWizardHeader(config: WizardConfig, theme: ResolvedTheme, plain?: boolean): void {\n console.log();\n console.log(renderBanner(config.meta.name, theme, { plain, icon: config.meta.icon }));\n if (config.meta.description) {\n console.log(` ${theme.muted(config.meta.description)}`);\n }\n console.log();\n}\n\nfunction isUserCancel(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.message.includes('User force closed') ||\n error.name === 'ExitPromptError'\n );\n }\n return false;\n}\n","import type { Condition, StepConfig } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n\n return current;\n}\n\nexport function evaluateCondition(\n condition: Condition,\n answers: Record<string, unknown>,\n): boolean {\n if ('all' in condition) {\n return condition.all.every((c) => evaluateCondition(c, answers));\n }\n if ('any' in condition) {\n return condition.any.some((c) => evaluateCondition(c, answers));\n }\n if ('not' in condition) {\n return !evaluateCondition(condition.not, answers);\n }\n\n const value = getValueByPath(answers, condition.field);\n\n if ('isEmpty' in condition) {\n if (value === undefined || value === null) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n }\n if ('isNotEmpty' in condition) {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n }\n\n if (value === undefined || value === null) {\n return false;\n }\n\n if ('equals' in condition) {\n return value === condition.equals;\n }\n if ('notEquals' in condition) {\n return value !== condition.notEquals;\n }\n if ('includes' in condition) {\n if (Array.isArray(value)) {\n return value.includes(condition.includes);\n }\n if (typeof value === 'string' && typeof condition.includes === 'string') {\n return value.includes(condition.includes);\n }\n return false;\n }\n if ('notIncludes' in condition) {\n if (Array.isArray(value)) {\n return !value.includes(condition.notIncludes);\n }\n if (typeof value === 'string' && typeof condition.notIncludes === 'string') {\n return !value.includes(condition.notIncludes);\n }\n return false;\n }\n if ('greaterThan' in condition) {\n return typeof value === 'number' && value > condition.greaterThan;\n }\n if ('lessThan' in condition) {\n return typeof value === 'number' && value < condition.lessThan;\n }\n\n return false;\n}\n\nexport function isStepVisible(\n step: StepConfig,\n answers: Record<string, unknown>,\n): boolean {\n if (!step.when) {\n return true;\n }\n return evaluateCondition(step.when, answers);\n}\n","import type {\n StepConfig,\n ValidationRule,\n WizardConfig,\n WizardState,\n WizardTransition,\n} from './types';\nimport { isStepVisible } from './conditions';\n\nexport function createWizardState(config: WizardConfig): WizardState {\n const firstVisible = config.steps.find((s) => isStepVisible(s, {}));\n if (!firstVisible) {\n throw new Error('No visible steps in wizard configuration');\n }\n\n return {\n currentStepId: firstVisible.id,\n answers: {},\n history: [],\n status: 'running',\n errors: {},\n };\n}\n\nexport function validateStepAnswer(\n step: StepConfig,\n value: unknown,\n): string | null {\n if (step.type === 'message') {\n return null;\n }\n\n const isRequired = step.required !== false;\n\n if (isRequired) {\n if (value === undefined || value === null || value === '') {\n return 'This field is required';\n }\n if (Array.isArray(value) && value.length === 0) {\n return 'This field is required';\n }\n }\n\n if ((step.type === 'text' || step.type === 'password' || step.type === 'editor' || step.type === 'path') && step.validate) {\n const strValue = typeof value === 'string' ? value : String(value ?? '');\n for (const rule of step.validate) {\n const error = applyValidationRule(rule, strValue);\n if (error) return error;\n }\n }\n\n if (step.type === 'number' && typeof value === 'number') {\n if (step.min !== undefined && value < step.min) {\n return `Must be at least ${String(step.min)}`;\n }\n if (step.max !== undefined && value > step.max) {\n return `Must be at most ${String(step.max)}`;\n }\n }\n\n if (step.type === 'multiselect' && Array.isArray(value)) {\n if (step.min !== undefined && value.length < step.min) {\n return `Select at least ${String(step.min)} option${step.min === 1 ? '' : 's'}`;\n }\n if (step.max !== undefined && value.length > step.max) {\n return `Select at most ${String(step.max)} option${step.max === 1 ? '' : 's'}`;\n }\n }\n\n return null;\n}\n\nexport function resolveNextStep(\n config: WizardConfig,\n currentStep: StepConfig,\n answer: unknown,\n answers: Record<string, unknown>,\n): string {\n let targetId: string | undefined;\n\n if (currentStep.type === 'select' && currentStep.routes) {\n const route = currentStep.routes[String(answer)];\n if (route === '__done__') return '__done__';\n if (route) targetId = route;\n }\n\n if (!targetId && currentStep.next) {\n if (currentStep.next === '__done__') return '__done__';\n targetId = currentStep.next;\n }\n\n if (!targetId) {\n const currentIndex = config.steps.findIndex(s => s.id === currentStep.id);\n const nextInArray = config.steps[currentIndex + 1];\n if (!nextInArray) return '__done__';\n targetId = nextInArray.id;\n }\n\n const targetIndex = config.steps.findIndex(s => s.id === targetId);\n if (targetIndex < 0) return '__done__';\n\n for (let i = targetIndex; i < config.steps.length; i++) {\n const step = config.steps[i];\n if (step && isStepVisible(step, answers)) {\n return step.id;\n }\n }\n\n return '__done__';\n}\n\nexport function getVisibleSteps(\n config: WizardConfig,\n answers: Record<string, unknown>,\n): StepConfig[] {\n return config.steps.filter(s => isStepVisible(s, answers));\n}\n\nexport function wizardReducer(\n state: WizardState,\n transition: WizardTransition,\n config: WizardConfig,\n): WizardState {\n switch (transition.type) {\n case 'NEXT': {\n const currentStep = findStepOrThrow(config, state.currentStepId);\n\n const validationError = validateStepAnswer(currentStep, transition.value);\n if (validationError) {\n return {\n ...state,\n errors: { ...state.errors, [state.currentStepId]: validationError },\n };\n }\n\n const updatedAnswers = {\n ...state.answers,\n [state.currentStepId]: transition.value,\n };\n\n const nextStepId = resolveNextStep(\n config,\n currentStep,\n transition.value,\n updatedAnswers,\n );\n\n if (nextStepId === '__done__') {\n return {\n ...state,\n answers: updatedAnswers,\n history: [...state.history, state.currentStepId],\n status: 'done',\n errors: {},\n };\n }\n\n const finalAnswers = cleanOrphanedAnswers(\n config,\n updatedAnswers,\n state.currentStepId,\n nextStepId,\n );\n\n return {\n ...state,\n currentStepId: nextStepId,\n answers: finalAnswers,\n history: [...state.history, state.currentStepId],\n status: 'running',\n errors: {},\n };\n }\n\n case 'BACK': {\n if (state.history.length === 0) {\n return state;\n }\n\n const previousStepId = state.history[state.history.length - 1]!;\n const currentStep = config.steps.find(s => s.id === state.currentStepId);\n const newAnswers = { ...state.answers };\n\n if (currentStep && currentStep.keepValuesOnPrevious === false) {\n delete newAnswers[currentStep.id];\n }\n\n return {\n ...state,\n currentStepId: previousStepId,\n answers: newAnswers,\n history: state.history.slice(0, -1),\n status: 'running',\n errors: {},\n };\n }\n\n case 'JUMP': {\n findStepOrThrow(config, transition.stepId);\n\n return {\n ...state,\n currentStepId: transition.stepId,\n history: [...state.history, state.currentStepId],\n status: 'running',\n errors: {},\n };\n }\n\n case 'CANCEL': {\n return { ...state, status: 'cancelled' };\n }\n }\n}\n\nfunction findStepOrThrow(config: WizardConfig, stepId: string): StepConfig {\n const step = config.steps.find(s => s.id === stepId);\n if (!step) {\n throw new Error(`Step not found: \"${stepId}\"`);\n }\n return step;\n}\n\nfunction cleanOrphanedAnswers(\n config: WizardConfig,\n answers: Record<string, unknown>,\n _fromStepId: string,\n _toStepId: string,\n): Record<string, unknown> {\n const cleaned = { ...answers };\n for (const step of config.steps) {\n if (step.id in cleaned && !isStepVisible(step, cleaned)) {\n delete cleaned[step.id];\n }\n }\n return cleaned;\n}\n\nfunction applyValidationRule(rule: ValidationRule, value: string): string | null {\n switch (rule.rule) {\n case 'required':\n return !value.trim() ? (rule.message ?? 'This field is required') : null;\n case 'minLength':\n return value.length < rule.value\n ? (rule.message ?? `Must be at least ${String(rule.value)} characters`)\n : null;\n case 'maxLength':\n return value.length > rule.value\n ? (rule.message ?? `Must be at most ${String(rule.value)} characters`)\n : null;\n case 'pattern': {\n const regex = new RegExp(rule.value);\n return !regex.test(value)\n ? (rule.message ?? `Must match pattern: ${rule.value}`)\n : null;\n }\n case 'min':\n case 'max':\n default:\n return null;\n }\n}\n","import chalk from 'chalk';\nimport type { ThemeConfig, ResolvedTheme } from './types';\nimport { THEME_PRESETS } from './themes/presets';\nimport { resolveSpinner } from './spinners';\n\nconst DEFAULT_TOKENS = {\n primary: '#5B9BD5',\n success: '#6BCB77',\n error: '#FF6B6B',\n warning: '#FFD93D',\n info: '#4D96FF',\n muted: '#888888',\n accent: '#C084FC',\n} as const;\n\nconst DEFAULT_ICONS = {\n step: '\\u25CF',\n stepDone: '\\u2713',\n stepPending: '\\u25CB',\n pointer: '\\u203A',\n} as const;\n\nexport function resolveTheme(themeConfig?: ThemeConfig): ResolvedTheme {\n const presetTokens = themeConfig?.preset ? THEME_PRESETS[themeConfig.preset] : undefined;\n const tokens = { ...DEFAULT_TOKENS, ...presetTokens, ...themeConfig?.tokens };\n const icons = { ...DEFAULT_ICONS, ...themeConfig?.icons };\n\n return {\n primary: chalk.hex(tokens.primary),\n success: chalk.hex(tokens.success),\n error: chalk.hex(tokens.error),\n warning: chalk.hex(tokens.warning),\n info: chalk.hex(tokens.info),\n muted: chalk.hex(tokens.muted),\n accent: chalk.hex(tokens.accent),\n bold: chalk.bold,\n icons,\n spinner: resolveSpinner(themeConfig?.spinner),\n };\n}\n","export interface PresetTokens {\n primary: string;\n success: string;\n error: string;\n warning: string;\n info: string;\n muted: string;\n accent: string;\n}\n\nexport const THEME_PRESETS: Record<string, PresetTokens> = {\n default: {\n primary: '#7C3AED',\n success: '#10B981',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#3B82F6',\n muted: '#6B7280',\n accent: '#8B5CF6',\n },\n catppuccin: {\n primary: '#cba6f7',\n success: '#a6e3a1',\n error: '#f38ba8',\n warning: '#fab387',\n info: '#74c7ec',\n muted: '#6c7086',\n accent: '#f5c2e7',\n },\n dracula: {\n primary: '#bd93f9',\n success: '#50fa7b',\n error: '#ff5555',\n warning: '#ffb86c',\n info: '#8be9fd',\n muted: '#6272a4',\n accent: '#ff79c6',\n },\n nord: {\n primary: '#88c0d0',\n success: '#a3be8c',\n error: '#bf616a',\n warning: '#ebcb8b',\n info: '#81a1c1',\n muted: '#4c566a',\n accent: '#b48ead',\n },\n tokyonight: {\n primary: '#7aa2f7',\n success: '#9ece6a',\n error: '#f7768e',\n warning: '#e0af68',\n info: '#7dcfff',\n muted: '#565f89',\n accent: '#bb9af7',\n },\n monokai: {\n primary: '#ab9df2',\n success: '#a9dc76',\n error: '#ff6188',\n warning: '#ffd866',\n info: '#78dce8',\n muted: '#727072',\n accent: '#fc9867',\n },\n};\n\nexport const PRESET_NAMES = Object.keys(THEME_PRESETS) as string[];\n","export interface SpinnerConfig {\n frames: string[];\n interval: number;\n}\n\nexport const spinners = {\n dots: { interval: 80, frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] },\n dots2: { interval: 80, frames: ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'] },\n line: { interval: 130, frames: ['-', '\\\\', '|', '/'] },\n arc: { interval: 100, frames: ['◜', '◠', '◝', '◞', '◡', '◟'] },\n circle: { interval: 80, frames: ['◒', '◐', '◓', '◑'] },\n circleHalves: { interval: 50, frames: ['◐', '◓', '◑', '◒'] },\n triangle: { interval: 50, frames: ['◢', '◣', '◤', '◥'] },\n pipe: { interval: 100, frames: ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'] },\n arrow: { interval: 100, frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'] },\n arrow3: { interval: 120, frames: ['▹▹▹▹▹', '▸▹▹▹▹', '▹▸▹▹▹', '▹▹▸▹▹', '▹▹▹▸▹', '▹▹▹▹▸'] },\n bouncingBar: { interval: 80, frames: ['[ ]', '[= ]', '[== ]', '[=== ]', '[====]', '[ ===]', '[ ==]', '[ =]', '[ ]', '[ =]', '[ ==]', '[ ===]', '[====]', '[=== ]', '[== ]', '[= ]'] },\n bouncingBall: { interval: 80, frames: ['( ● )', '( ● )', '( ● )', '( ● )', '( ●)', '( ● )', '( ● )', '( ● )', '( ● )', '(● )'] },\n simpleDots: { interval: 400, frames: ['. ', '.. ', '...', ' '] },\n aesthetic: { interval: 80, frames: ['▰▱▱▱▱▱▱', '▰▰▱▱▱▱▱', '▰▰▰▱▱▱▱', '▰▰▰▰▱▱▱', '▰▰▰▰▰▱▱', '▰▰▰▰▰▰▱', '▰▰▰▰▰▰▰', '▰▱▱▱▱▱▱'] },\n star: { interval: 70, frames: ['✶', '✸', '✹', '✺', '✹', '✷'] },\n} as const satisfies Record<string, SpinnerConfig>;\n\nexport type SpinnerName = keyof typeof spinners;\n\nexport const DEFAULT_SPINNER: SpinnerName = 'circle';\n\nexport function resolveSpinner(\n config?: string | { frames: string[]; interval?: number },\n): SpinnerConfig {\n if (!config) {\n return spinners[DEFAULT_SPINNER];\n }\n if (typeof config === 'string') {\n if (config in spinners) {\n return spinners[config as SpinnerName];\n }\n throw new Error(`Unknown spinner preset: \"${config}\". Available: ${Object.keys(spinners).join(', ')}`);\n }\n return {\n frames: config.frames,\n interval: config.interval ?? 80,\n };\n}\n","import {\n input,\n select,\n checkbox,\n confirm,\n password,\n number,\n search,\n editor,\n Separator,\n} from '@inquirer/prompts';\nimport type {\n ConfirmStepConfig,\n EditorStepConfig,\n MessageStepConfig,\n MultiSelectStepConfig,\n NumberStepConfig,\n PasswordStepConfig,\n PathStepConfig,\n ResolvedTheme,\n SearchStepConfig,\n SelectOption,\n SelectStepConfig,\n StepConfig,\n TextStepConfig,\n ToggleStepConfig,\n WizardRenderer,\n WizardState,\n} from '../types';\n\nexport class InquirerRenderer implements WizardRenderer {\n renderStepHeader(\n stepIndex: number,\n totalVisible: number,\n message: string,\n theme: ResolvedTheme,\n description?: string,\n ): void {\n const barWidth = 20;\n const filledCount = totalVisible > 0 ? Math.round((stepIndex / totalVisible) * barWidth) : 0;\n const remainingCount = barWidth - filledCount;\n const filledBar = theme.success('\\u2588'.repeat(filledCount));\n const remainingBar = theme.muted('\\u2591'.repeat(remainingCount));\n const counter = theme.muted(`Step ${String(stepIndex + 1)}/${String(totalVisible)}`);\n const stepMessage = theme.muted(`\\u2014 ${message}`);\n console.log(`\\n [${filledBar}${remainingBar}] ${counter} ${stepMessage}`);\n if (description) {\n console.log(` ${theme.muted(description)}`);\n }\n }\n\n async renderText(\n step: TextStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string'\n ? existingAnswer\n : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderSelect(\n step: SelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n disabled: opt.disabled,\n };\n });\n\n return select({\n message: step.message,\n choices,\n default: defaultValue,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderMultiSelect(\n step: MultiSelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string[]> {\n const existingAnswer = state.answers[step.id];\n const previousSelections: string[] | undefined = Array.isArray(existingAnswer)\n ? existingAnswer.filter((v): v is string => typeof v === 'string')\n : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n checked: previousSelections?.includes(opt.value) ?? false,\n disabled: opt.disabled,\n };\n });\n\n return checkbox({\n message: step.message,\n choices,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderConfirm(\n step: ConfirmStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'boolean' ? existingAnswer : step.default;\n\n return confirm({\n message: step.message,\n default: defaultValue ?? true,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPassword(\n step: PasswordStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return password({\n message: step.message,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderNumber(\n step: NumberStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<number> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'number' ? existingAnswer : step.default;\n\n const result = await number({\n message: step.message,\n default: defaultValue,\n min: step.min,\n max: step.max,\n step: step.step,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result ?? defaultValue ?? 0;\n }\n\n async renderSearch(\n step: SearchStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return search({\n message: step.message,\n source: (input) => {\n const term = (input ?? '').toLowerCase();\n return step.options\n .filter((opt): opt is SelectOption => 'value' in opt)\n .filter((opt) => !opt.disabled && opt.label.toLowerCase().includes(term))\n .map((opt) => ({\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n }));\n },\n pageSize: step.pageSize,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderEditor(\n step: EditorStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return editor({\n message: step.message,\n default: step.default,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPath(\n step: PathStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderToggle(\n step: ToggleStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const activeLabel = step.active ?? 'On';\n const inactiveLabel = step.inactive ?? 'Off';\n\n const defaultValue =\n typeof existingAnswer === 'boolean'\n ? (existingAnswer ? activeLabel : inactiveLabel)\n : (step.default === true ? activeLabel : inactiveLabel);\n\n const result = await select({\n message: step.message,\n choices: [\n { name: activeLabel, value: activeLabel },\n { name: inactiveLabel, value: inactiveLabel },\n ],\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result === activeLabel;\n }\n\n renderMessage(step: MessageStepConfig, _state: WizardState, theme: ResolvedTheme): void {\n if (step.description) {\n console.log(` ${theme.muted(step.description)}`);\n }\n console.log();\n }\n\n renderGroupHeader(group: string, theme: ResolvedTheme): void {\n console.log(`\\n ${theme.accent('\\u2500\\u2500')} ${theme.bold(group)} ${theme.accent('\\u2500\\u2500')}\\n`);\n }\n\n renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n console.log(`\\n${theme.muted('\\u2500'.repeat(40))}`);\n console.log(` ${theme.bold('Summary')}\\n`);\n\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n\n console.log(\n ` ${theme.muted(step.id.padEnd(20))} ${theme.primary(display)}`,\n );\n }\n\n console.log(theme.muted('\\u2500'.repeat(40)));\n }\n\n clear(): void {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n }\n}\n","export function resolveEnvDefault(value: string | undefined): string | undefined {\n if (typeof value !== 'string') return value;\n if (!value.startsWith('$')) return value;\n const envKey = value.slice(1);\n return process.env[envKey] ?? value;\n}\n\nexport function resolveEnvDefaultNumber(value: number | string | undefined): number | undefined {\n if (typeof value === 'number') return value;\n const resolved = resolveEnvDefault(typeof value === 'string' ? value : undefined);\n if (resolved === undefined) return undefined;\n const num = Number(resolved);\n return Number.isNaN(num) ? undefined : num;\n}\n\nexport function resolveEnvDefaultBoolean(value: boolean | string | undefined): boolean | undefined {\n if (typeof value === 'boolean') return value;\n const resolved = resolveEnvDefault(typeof value === 'string' ? value : undefined);\n if (resolved === undefined) return undefined;\n return resolved === 'true' || resolved === '1';\n}\n","/**\n * Resolve {{stepId}} placeholders in a template string.\n * Array values are joined with \", \". Unresolved placeholders remain as-is.\n */\nexport function resolveTemplate(template: string, answers: Record<string, unknown>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, key: string) => {\n const trimmedKey = key.trim();\n if (trimmedKey in answers) {\n const value = answers[trimmedKey];\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n }\n return _match;\n });\n}\n\n/**\n * Resolve {{stepId}} placeholders strictly — throws if any placeholder\n * references a step-id not found in the answers map.\n * Used by actions where missing answers indicate a config error.\n */\nexport function resolveTemplateStrict(template: string, answers: Record<string, unknown>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, key: string) => {\n const trimmedKey = key.trim();\n if (!(trimmedKey in answers)) {\n throw new Error(`Action references unknown step \"${trimmedKey}\"`);\n }\n const value = answers[trimmedKey];\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n });\n}\n","import figlet from 'figlet';\nimport gradient from 'gradient-string';\nimport type { ResolvedTheme } from './types';\n\nconst GRIMOIRE_GRADIENT = gradient(['#C084FC', '#5B9BD5', '#6BCB77']);\n\n/**\n * Render a figlet ASCII art banner for the wizard name.\n * Falls back to plain bold text if figlet rendering fails.\n */\nexport function renderBanner(\n name: string,\n theme: ResolvedTheme,\n options?: { plain?: boolean; icon?: string },\n): string {\n const icon = options?.icon;\n const prefix = icon ? `${icon} ` : '';\n\n if (options?.plain) {\n return ` ${prefix}${theme.bold(name)}`;\n }\n\n try {\n const art = figlet.textSync(name, {\n font: 'Small',\n horizontalLayout: 'default',\n });\n\n const artLines = art.split('\\n');\n const lines = artLines\n .map((line, i) => {\n if (icon && i === Math.floor(artLines.length / 2)) {\n return ` ${icon} ${line}`;\n }\n return icon ? ` ${line}` : ` ${line}`;\n })\n .join('\\n');\n\n return GRIMOIRE_GRADIENT(lines);\n } catch {\n return ` ${prefix}${theme.bold(name)}`;\n }\n}\n","import type { WizardState, ResolvedTheme } from './types';\n\n// ─── Plugin Interfaces ──────────────────────────────────────────────────────\n\nexport interface StepPlugin {\n render(config: Record<string, unknown>, state: WizardState, theme: ResolvedTheme): Promise<unknown>;\n validate?(value: unknown, config: Record<string, unknown>): string | null;\n}\n\nexport interface GrimoirePlugin {\n name: string;\n steps: Record<string, StepPlugin>;\n}\n\n// ─── Built-in Step Types (protected from override) ──────────────────────────\n\nconst BUILT_IN_STEP_TYPES = new Set([\n 'text',\n 'select',\n 'multiselect',\n 'confirm',\n 'password',\n 'number',\n 'search',\n 'editor',\n 'path',\n 'toggle',\n]);\n\n// ─── Plugin Registry ────────────────────────────────────────────────────────\n\nconst pluginStepRegistry = new Map<string, StepPlugin>();\n\nexport function registerPlugin(plugin: GrimoirePlugin): void {\n for (const [stepType, stepPlugin] of Object.entries(plugin.steps)) {\n if (BUILT_IN_STEP_TYPES.has(stepType)) {\n throw new Error(`Cannot override built-in step type \"${stepType}\"`);\n }\n if (pluginStepRegistry.has(stepType)) {\n throw new Error(`Step type \"${stepType}\" is already registered`);\n }\n pluginStepRegistry.set(stepType, stepPlugin);\n }\n}\n\nexport function getPluginStep(stepType: string): StepPlugin | undefined {\n return pluginStepRegistry.get(stepType);\n}\n\nexport function clearPlugins(): void {\n pluginStepRegistry.clear();\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst DEFAULT_CACHE_DIR = join(homedir(), '.config', 'grimoire', 'cache');\n\nexport function slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function getCacheDir(customDir?: string): string {\n return customDir ?? DEFAULT_CACHE_DIR;\n}\n\nfunction getCacheFilePath(wizardName: string, customDir?: string): string {\n return join(getCacheDir(customDir), `${slugify(wizardName)}.json`);\n}\n\nexport function loadCachedAnswers(\n wizardName: string,\n customDir?: string,\n): Record<string, unknown> | undefined {\n try {\n const filePath = getCacheFilePath(wizardName, customDir);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function saveCachedAnswers(\n wizardName: string,\n answers: Record<string, unknown>,\n customDir?: string,\n): void {\n try {\n const dir = getCacheDir(customDir);\n mkdirSync(dir, { recursive: true });\n const filePath = getCacheFilePath(wizardName, customDir);\n writeFileSync(filePath, JSON.stringify(answers, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function clearCache(wizardName?: string, customDir?: string): void {\n try {\n const dir = getCacheDir(customDir);\n if (wizardName) {\n const filePath = getCacheFilePath(wizardName, customDir);\n unlinkSync(filePath);\n } else {\n const files = readdirSync(dir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n unlinkSync(join(dir, file));\n }\n }\n }\n } catch { }\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { slugify } from './cache';\n\nconst DEFAULT_PROGRESS_DIR = join(homedir(), '.config', 'grimoire', 'progress');\n\nexport interface SavedProgress {\n currentStepId: string;\n answers: Record<string, unknown>;\n history: string[];\n savedAt: string;\n}\n\nfunction getProgressFilePath(wizardName: string, customDir?: string): string {\n const dir = customDir ?? DEFAULT_PROGRESS_DIR;\n return join(dir, `${slugify(wizardName)}.json`);\n}\n\nexport function saveProgress(\n wizardName: string,\n state: { currentStepId: string; answers: Record<string, unknown>; history: string[] },\n customDir?: string,\n excludeStepIds?: string[],\n): void {\n try {\n const dir = customDir ?? DEFAULT_PROGRESS_DIR;\n mkdirSync(dir, { recursive: true });\n\n const excludeSet = new Set(excludeStepIds ?? []);\n const filteredAnswers: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state.answers)) {\n if (!excludeSet.has(key)) {\n filteredAnswers[key] = value;\n }\n }\n\n const progress: SavedProgress = {\n currentStepId: state.currentStepId,\n answers: filteredAnswers,\n history: state.history,\n savedAt: new Date().toISOString(),\n };\n\n const filePath = getProgressFilePath(wizardName, customDir);\n writeFileSync(filePath, JSON.stringify(progress, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function loadProgress(\n wizardName: string,\n customDir?: string,\n): SavedProgress | null {\n try {\n const filePath = getProgressFilePath(wizardName, customDir);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n !Array.isArray(parsed) &&\n 'currentStepId' in parsed &&\n 'answers' in parsed &&\n 'history' in parsed &&\n 'savedAt' in parsed\n ) {\n return parsed as SavedProgress;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearProgress(\n wizardName: string,\n customDir?: string,\n): void {\n try {\n const filePath = getProgressFilePath(wizardName, customDir);\n unlinkSync(filePath);\n } catch { }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { SelectChoice } from './types';\n\n// ─── MRU Storage Path ────────────────────────────────────────────────────────\n\nconst MRU_DIR = join(homedir(), '.config', 'grimoire', 'mru');\n\ntype MruStepData = Record<string, number>;\ntype MruWizardData = Record<string, MruStepData>;\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\nfunction getMruFilePath(wizardName: string): string {\n const safeName = wizardName.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(MRU_DIR, `${safeName}.json`);\n}\n\nfunction loadMruData(wizardName: string): MruWizardData {\n const filePath = getMruFilePath(wizardName);\n try {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return {};\n }\n return parsed as MruWizardData;\n } catch {\n return {};\n }\n}\n\nfunction saveMruData(wizardName: string, data: MruWizardData): void {\n const filePath = getMruFilePath(wizardName);\n try {\n mkdirSync(MRU_DIR, { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n } catch {\n // Silent fail — MRU is non-critical\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function recordSelection(\n wizardName: string,\n stepId: string,\n value: string | string[],\n): void {\n const data = loadMruData(wizardName);\n const stepData: MruStepData = data[stepId] ?? {};\n\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n stepData[v] = (stepData[v] ?? 0) + 1;\n }\n\n data[stepId] = stepData;\n saveMruData(wizardName, data);\n}\n\nexport function getOrderedOptions(\n wizardName: string,\n stepId: string,\n options: SelectChoice[],\n): SelectChoice[] {\n const data = loadMruData(wizardName);\n const stepData: MruStepData = data[stepId] ?? {};\n\n if (Object.keys(stepData).length === 0) {\n return options;\n }\n\n const separatorIndices = new Map<number, SelectChoice>();\n const selectableOptions: SelectChoice[] = [];\n\n for (let i = 0; i < options.length; i++) {\n const opt = options[i]!;\n if ('separator' in opt) {\n separatorIndices.set(i, opt);\n } else {\n selectableOptions.push(opt);\n }\n }\n\n const sorted = [...selectableOptions].sort((a, b) => {\n if (!('value' in a) || !('value' in b)) return 0;\n const countA = stepData[a.value] ?? 0;\n const countB = stepData[b.value] ?? 0;\n return countB - countA;\n });\n\n const result: SelectChoice[] = [];\n let sortedIndex = 0;\n\n for (let i = 0; i < options.length; i++) {\n const sep = separatorIndices.get(i);\n if (sep) {\n result.push(sep);\n } else {\n const next = sorted[sortedIndex];\n if (next) {\n result.push(next);\n }\n sortedIndex++;\n }\n }\n\n return result;\n}\n\nexport function clearMruData(wizardName: string): void {\n const filePath = getMruFilePath(wizardName);\n try {\n if (existsSync(filePath)) {\n writeFileSync(filePath, '{}', 'utf-8');\n }\n } catch {\n // Silent fail — MRU is non-critical\n }\n}\n","import { input, select, confirm, number } from '@inquirer/prompts';\nimport { stringify } from 'yaml';\nimport { writeFileSync } from 'node:fs';\nimport { relative } from 'node:path';\n\n// ─── Types for scaffolded config ─────────────────────────────────────────────\n\ninterface ScaffoldedOption {\n value: string;\n label: string;\n}\n\ninterface ScaffoldedStep {\n id: string;\n type: string;\n message: string;\n required?: boolean;\n options?: ScaffoldedOption[];\n}\n\ninterface ScaffoldedConfig {\n meta: {\n name: string;\n description?: string;\n };\n steps: ScaffoldedStep[];\n output: {\n format: string;\n path?: string;\n };\n theme?: {\n tokens: {\n primary: string;\n };\n };\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst STEP_TYPE_CHOICES = [\n { name: 'text', value: 'text' },\n { name: 'select', value: 'select' },\n { name: 'multiselect', value: 'multiselect' },\n { name: 'confirm', value: 'confirm' },\n { name: 'password', value: 'password' },\n { name: 'number', value: 'number' },\n { name: 'search', value: 'search' },\n { name: 'editor', value: 'editor' },\n { name: 'path', value: 'path' },\n { name: 'toggle', value: 'toggle' },\n];\n\nconst TYPES_WITH_OPTIONS = new Set(['select', 'multiselect', 'search']);\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction isUserCancel(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.message.includes('User force closed') ||\n error.name === 'ExitPromptError'\n );\n }\n return false;\n}\n\n// ─── Main scaffolder ─────────────────────────────────────────────────────────\n\nexport async function scaffoldWizard(outputPath: string): Promise<void> {\n try {\n // 1. Wizard name\n const wizardName = await input({\n message: 'Wizard name',\n validate: (val) => val.trim().length > 0 || 'Name is required',\n });\n\n // 2. Description (optional)\n const description = await input({\n message: 'Description (optional)',\n });\n\n // 3. Number of steps\n const rawStepCount = await number({\n message: 'How many steps?',\n default: 3,\n min: 1,\n max: 20,\n });\n const stepCount = rawStepCount ?? 3;\n\n // 4. Collect steps\n const steps: ScaffoldedStep[] = [];\n\n for (let i = 0; i < stepCount; i++) {\n console.log(`\\n Step ${String(i + 1)} of ${String(stepCount)}`);\n\n const stepId = await input({\n message: 'Step ID',\n validate: (val) =>\n /^[a-z][a-z0-9-]*$/.test(val) ||\n 'Must be lowercase, start with a letter, hyphens only (e.g., my-step)',\n });\n\n const stepType = await select({\n message: 'Step type',\n choices: STEP_TYPE_CHOICES,\n });\n\n const stepMessage = await input({\n message: 'Prompt message',\n validate: (val) => val.trim().length > 0 || 'Message is required',\n });\n\n const step: ScaffoldedStep = {\n id: stepId,\n type: stepType,\n message: stepMessage,\n };\n\n if (TYPES_WITH_OPTIONS.has(stepType)) {\n const rawOptions = await input({\n message: 'Options (comma-separated values)',\n validate: (val) =>\n val.split(',').some((v) => v.trim().length > 0) ||\n 'At least one option is required',\n });\n\n step.options = rawOptions\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0)\n .map((v) => ({\n value: v,\n label: v.charAt(0).toUpperCase() + v.slice(1),\n }));\n }\n\n const isRequired = await confirm({\n message: 'Is this a required field?',\n default: true,\n });\n\n if (!isRequired) {\n step.required = false;\n }\n\n steps.push(step);\n }\n\n // 5. Output format\n const format = await select({\n message: 'Output format',\n choices: [\n { name: 'JSON', value: 'json' },\n { name: 'YAML', value: 'yaml' },\n { name: 'ENV', value: 'env' },\n ],\n });\n\n // 6. Output file path (optional)\n const outputFilePath = await input({\n message: 'Output file path (optional)',\n });\n\n // 7. Theme\n const wantTheme = await confirm({\n message: 'Do you want a theme?',\n default: false,\n });\n\n let primaryColor = '';\n if (wantTheme) {\n primaryColor = await input({\n message: 'Primary color (hex)',\n default: '#5B9BD5',\n validate: (val) =>\n /^#[0-9A-Fa-f]{6}$/.test(val) ||\n 'Must be a valid hex color (e.g., #5B9BD5)',\n });\n }\n\n const meta: ScaffoldedConfig['meta'] = { name: wizardName };\n if (description.length > 0) {\n meta.description = description;\n }\n\n const outputConfig: ScaffoldedConfig['output'] = { format };\n if (outputFilePath.length > 0) {\n outputConfig.path = outputFilePath;\n }\n\n const config: ScaffoldedConfig = {\n meta,\n steps,\n output: outputConfig,\n };\n\n if (wantTheme) {\n config.theme = { tokens: { primary: primaryColor } };\n }\n\n const yamlContent = stringify(config);\n writeFileSync(outputPath, yamlContent, 'utf-8');\n\n const displayPath = relative(process.cwd(), outputPath);\n console.log(`\\n \\u2713 Created wizard config: ${outputPath}`);\n console.log(` Run it with: grimoire run ${displayPath}\\n`);\n } catch (error) {\n if (isUserCancel(error)) {\n console.log('\\n Wizard creation cancelled.\\n');\n return;\n }\n throw error;\n }\n}\n","export function bashCompletion(): string {\n return `_grimoire() {\n local cur prev words cword\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n words=(\"\\${COMP_WORDS[@]}\")\n cword=\\${COMP_CWORD}\n\n # Get the subcommand (first non-option argument)\n local subcommand=\"\"\n local i\n for ((i = 1; i < cword; i++)); do\n if [[ \"\\${words[i]}\" != -* ]]; then\n subcommand=\"\\${words[i]}\"\n break\n fi\n done\n\n # Complete subcommands\n if [[ \\${cword} -eq 1 ]]; then\n COMPREPLY=($(compgen -W \"run validate create demo completion\" -- \"\\${cur}\"))\n return 0\n fi\n\n # Complete shell argument for completion command\n if [[ \"\\${subcommand}\" == \"completion\" ]]; then\n if [[ \\${cword} -eq 2 ]]; then\n COMPREPLY=($(compgen -W \"bash zsh fish\" -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for run command\n if [[ \"\\${subcommand}\" == \"run\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=($(compgen -W \"-o --output -f --format -q --quiet --dry-run --mock --json\" -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"-f\" ]] || [[ \"\\${prev}\" == \"--format\" ]]; then\n COMPREPLY=($(compgen -W \"json yaml env\" -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"-o\" ]] || [[ \"\\${prev}\" == \"--output\" ]]; then\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"--mock\" ]]; then\n COMPREPLY=()\n else\n # Complete config file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for validate command\n if [[ \"\\${subcommand}\" == \"validate\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=()\n else\n # Complete config file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for create command\n if [[ \"\\${subcommand}\" == \"create\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=()\n else\n # Complete output file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for demo command\n if [[ \"\\${subcommand}\" == \"demo\" ]]; then\n COMPREPLY=()\n return 0\n fi\n\n return 0\n}\n\ncomplete -o bashdefault -o default -o nospace -F _grimoire grimoire\n`;\n}\n\nexport function zshCompletion(): string {\n return `#compdef grimoire\n\n_grimoire() {\n local -a subcommands\n subcommands=(\n 'run:Run a wizard from a config file'\n 'validate:Validate a wizard config file without running it'\n 'create:Interactively scaffold a new wizard config file'\n 'demo:Run a demo wizard showcasing all step types'\n 'completion:Output shell completion script'\n )\n\n local -a run_flags\n run_flags=(\n '-o+[Write answers to file]:output file:_files'\n '--output+[Write answers to file]:output file:_files'\n '-f+[Output format]:format:(json yaml env)'\n '--format+[Output format]:format:(json yaml env)'\n '-q[Suppress header and summary output]'\n '--quiet[Suppress header and summary output]'\n '--dry-run[Show step plan without running the wizard]'\n '--mock+[Run wizard with preset answers]:json string:'\n '--json[Output structured JSON result to stdout]'\n )\n\n local -a completion_shells\n completion_shells=(\n 'bash:Bash shell'\n 'zsh:Zsh shell'\n 'fish:Fish shell'\n )\n\n local context state line\n\n _arguments -C \\\n '1: :->command' \\\n '*::args:->args'\n\n case \\$state in\n command)\n _describe 'command' subcommands\n ;;\n args)\n case \\${words[2]} in\n run)\n _arguments \\\n \\$run_flags \\\n '1:config file:_files'\n ;;\n validate)\n _arguments '1:config file:_files'\n ;;\n create)\n _arguments '1:output file:_files'\n ;;\n demo)\n ;;\n completion)\n _describe 'shell' completion_shells\n ;;\n esac\n ;;\n esac\n}\n\n_grimoire\n`;\n}\n\nexport function fishCompletion(): string {\n return `# Fish completion for grimoire\n\n# Subcommands\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"run\" -d \"Run a wizard from a config file\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"validate\" -d \"Validate a wizard config file without running it\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"create\" -d \"Interactively scaffold a new wizard config file\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"demo\" -d \"Run a demo wizard showcasing all step types\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"completion\" -d \"Output shell completion script\"\n\n# run command flags\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s o -l output -d \"Write answers to file\" -r\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s f -l format -d \"Output format\" -x -a \"json yaml env\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s q -l quiet -d \"Suppress header and summary output\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l dry-run -d \"Show step plan without running the wizard\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l mock -d \"Run wizard with preset answers (JSON string)\" -r\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l json -d \"Output structured JSON result to stdout\"\n\n# completion command shells\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"bash\" -d \"Bash shell\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"zsh\" -d \"Zsh shell\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"fish\" -d \"Fish shell\"\n`;\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { slugify } from './cache';\n\nconst TEMPLATES_DIR = join(homedir(), '.config', 'grimoire', 'templates');\n\nfunction getWizardTemplateDir(wizardName: string): string {\n return join(TEMPLATES_DIR, slugify(wizardName));\n}\n\nfunction getTemplateFilePath(wizardName: string, templateName: string): string {\n return join(getWizardTemplateDir(wizardName), `${slugify(templateName)}.json`);\n}\n\nexport function saveTemplate(\n wizardName: string,\n templateName: string,\n answers: Record<string, unknown>,\n excludeKeys?: string[],\n): void {\n try {\n const dir = getWizardTemplateDir(wizardName);\n mkdirSync(dir, { recursive: true });\n const filePath = getTemplateFilePath(wizardName, templateName);\n let answersToSave = answers;\n if (excludeKeys && excludeKeys.length > 0) {\n const excluded = new Set(excludeKeys);\n answersToSave = Object.fromEntries(\n Object.entries(answers).filter(([k]) => !excluded.has(k)),\n );\n }\n writeFileSync(filePath, JSON.stringify(answersToSave, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function loadTemplate(\n wizardName: string,\n templateName: string,\n): Record<string, unknown> | undefined {\n try {\n const filePath = getTemplateFilePath(wizardName, templateName);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function listTemplates(wizardName: string): string[] {\n try {\n const dir = getWizardTemplateDir(wizardName);\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => f.replace(/\\.json$/, ''));\n } catch {\n return [];\n }\n}\n\nexport function deleteTemplate(wizardName: string, templateName: string): void {\n try {\n const filePath = getTemplateFilePath(wizardName, templateName);\n unlinkSync(filePath);\n } catch { }\n}\n","import {\n input,\n select,\n checkbox,\n confirm,\n password,\n number,\n search,\n editor,\n Separator,\n} from '@inquirer/prompts';\nimport type {\n ConfirmStepConfig,\n EditorStepConfig,\n MessageStepConfig,\n MultiSelectStepConfig,\n NumberStepConfig,\n PasswordStepConfig,\n PathStepConfig,\n ResolvedTheme,\n SearchStepConfig,\n SelectOption,\n SelectStepConfig,\n StepConfig,\n TextStepConfig,\n ToggleStepConfig,\n WizardRenderer,\n WizardState,\n} from '../types';\n\nfunction boxLine(text: string, theme: ResolvedTheme): string {\n const line = '\\u2500'.repeat(Math.max(0, 40 - text.length));\n return `${theme.accent('\\u250C\\u2500')} ${theme.bold(text)} ${theme.accent(`${line}\\u2510`)}`;\n}\n\nexport class InkRenderer implements WizardRenderer {\n renderStepHeader(\n stepIndex: number,\n totalVisible: number,\n message: string,\n theme: ResolvedTheme,\n description?: string,\n ): void {\n const barWidth = 30;\n const progress = totalVisible > 0 ? stepIndex / totalVisible : 0;\n const filledCount = Math.round(progress * barWidth);\n const remainingCount = barWidth - filledCount;\n\n const filledBar = theme.success('\\u2593'.repeat(filledCount));\n const remainingBar = theme.muted('\\u2591'.repeat(remainingCount));\n const pct = `${String(Math.round(progress * 100))}%`;\n const counter = theme.muted(`Step ${String(stepIndex + 1)}/${String(totalVisible)}`);\n\n console.log();\n console.log(` ${theme.accent('\\u250C')} ${counter} ${theme.muted(pct)}`);\n console.log(` ${theme.accent('\\u2502')} [${filledBar}${remainingBar}]`);\n console.log(` ${theme.accent('\\u2514\\u2500')} ${theme.primary(message)}`);\n\n if (description) {\n console.log(` ${theme.muted(description)}`);\n }\n }\n\n async renderText(\n step: TextStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string'\n ? existingAnswer\n : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderSelect(\n step: SelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n disabled: opt.disabled,\n };\n });\n\n return select({\n message: step.message,\n choices,\n default: defaultValue,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderMultiSelect(\n step: MultiSelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string[]> {\n const existingAnswer = state.answers[step.id];\n const previousSelections: string[] | undefined = Array.isArray(existingAnswer)\n ? existingAnswer.filter((v): v is string => typeof v === 'string')\n : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n checked: previousSelections?.includes(opt.value) ?? false,\n disabled: opt.disabled,\n };\n });\n\n return checkbox({\n message: step.message,\n choices,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderConfirm(\n step: ConfirmStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'boolean' ? existingAnswer : step.default;\n\n return confirm({\n message: step.message,\n default: defaultValue ?? true,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPassword(\n step: PasswordStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return password({\n message: step.message,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderNumber(\n step: NumberStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<number> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'number' ? existingAnswer : step.default;\n\n const result = await number({\n message: step.message,\n default: defaultValue,\n min: step.min,\n max: step.max,\n step: step.step,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result ?? defaultValue ?? 0;\n }\n\n async renderSearch(\n step: SearchStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return search({\n message: step.message,\n source: (term) => {\n const query = (term ?? '').toLowerCase();\n return step.options\n .filter((opt): opt is SelectOption => 'value' in opt)\n .filter((opt) => !opt.disabled && opt.label.toLowerCase().includes(query))\n .map((opt) => ({\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n }));\n },\n pageSize: step.pageSize,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderEditor(\n step: EditorStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return editor({\n message: step.message,\n default: step.default,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPath(\n step: PathStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderToggle(\n step: ToggleStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const activeLabel = step.active ?? 'On';\n const inactiveLabel = step.inactive ?? 'Off';\n\n const defaultValue =\n typeof existingAnswer === 'boolean'\n ? (existingAnswer ? activeLabel : inactiveLabel)\n : (step.default === true ? activeLabel : inactiveLabel);\n\n const result = await select({\n message: step.message,\n choices: [\n { name: activeLabel, value: activeLabel },\n { name: inactiveLabel, value: inactiveLabel },\n ],\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result === activeLabel;\n }\n\n renderMessage(step: MessageStepConfig, _state: WizardState, theme: ResolvedTheme): void {\n if (step.description) {\n console.log(` ${theme.muted(step.description)}`);\n }\n console.log();\n }\n\n renderGroupHeader(group: string, theme: ResolvedTheme): void {\n console.log();\n console.log(` ${boxLine(group, theme)}`);\n console.log();\n }\n\n renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n const divider = theme.accent('\\u2500'.repeat(50));\n console.log();\n console.log(` ${divider}`);\n console.log(` ${theme.accent('\\u2502')} ${theme.bold('Summary')}`);\n console.log(` ${divider}`);\n\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n\n const label = theme.muted(step.id.padEnd(24));\n const value = theme.primary(display);\n console.log(` ${theme.accent('\\u2502')} ${label} ${value}`);\n }\n\n console.log(` ${divider}`);\n }\n\n clear(): void {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n }\n}\n","import chalk from 'chalk';\nimport { InquirerRenderer } from './inquirer';\nimport {\n S_BAR,\n S_BAR_START,\n S_BAR_END,\n S_BAR_H,\n S_STEP_SUBMIT,\n S_STEP_CANCEL,\n S_STEP_ERROR,\n S_CORNER_TR,\n S_CORNER_BR,\n} from './symbols';\nimport type { ResolvedTheme, StepConfig, WizardEvent } from '../types';\n\nexport class ClackRenderer extends InquirerRenderer {\n private spinnerInterval: ReturnType<typeof setInterval> | undefined;\n private spinnerFrameIndex = 0;\n\n override renderStepHeader(): void {}\n\n override renderGroupHeader(): void {}\n\n override renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n const entries: Array<{ id: string; display: string }> = [];\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n entries.push({ id: step.id, display });\n }\n\n if (entries.length === 0) return;\n\n const title = 'Summary';\n const lines = entries.map((e) => `${e.id}: ${e.display}`);\n this.writeNoteBox(title, lines, theme);\n }\n\n onEvent(event: WizardEvent, theme: ResolvedTheme): void {\n switch (event.type) {\n case 'session:start':\n this.handleSessionStart(event, theme);\n break;\n case 'session:end':\n this.handleSessionEnd(event, theme);\n break;\n case 'step:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n break;\n case 'step:complete':\n this.handleStepComplete(event, theme);\n break;\n case 'step:error':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(`${S_STEP_ERROR} ${event.error}`)}\\n`);\n break;\n case 'step:back':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.muted('\\u21a9 Back')}\\n`);\n break;\n case 'group:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.accent(event.group)}\\n`);\n break;\n case 'note':\n this.writeNoteBox(event.title, event.body.split('\\n'), theme);\n break;\n case 'spinner:start':\n this.startSpinner(event.message, theme);\n break;\n case 'spinner:stop':\n this.stopSpinner(event.message, theme);\n break;\n case 'checks:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.bold('Running checks...')}\\n`);\n break;\n case 'check:pass':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${event.name}\\n`);\n break;\n case 'check:fail':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(S_STEP_ERROR)} ${event.name}: ${event.message}\\n`);\n break;\n case 'actions:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.bold('Running actions...')}\\n`);\n break;\n case 'action:pass':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${event.name}\\n`);\n break;\n case 'action:fail':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(S_STEP_ERROR)} ${event.name}\\n`);\n break;\n }\n }\n\n private handleSessionStart(\n event: Extract<WizardEvent, { type: 'session:start' }>,\n theme: ResolvedTheme,\n ): void {\n process.stdout.write(`${chalk.gray(S_BAR_START)} ${theme.bold(event.wizard)}\\n`);\n if (event.description) {\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.muted(event.description)}\\n`);\n }\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n }\n\n private handleSessionEnd(\n event: Extract<WizardEvent, { type: 'session:end' }>,\n theme: ResolvedTheme,\n ): void {\n if (event.cancelled) {\n process.stdout.write(`${theme.warning(S_STEP_CANCEL)} Cancelled\\n`);\n } else {\n process.stdout.write(`${chalk.gray(S_BAR_END)} ${theme.success(\"You're all set!\")}\\n`);\n }\n }\n\n private handleStepComplete(\n event: Extract<WizardEvent, { type: 'step:complete' }>,\n theme: ResolvedTheme,\n ): void {\n const displayValue = event.step.type === 'password'\n ? '****'\n : this.formatValue(event.value);\n process.stdout.write(\n `${chalk.gray(S_STEP_SUBMIT)} ${event.step.message} ${chalk.gray('\\u00b7')} ${theme.muted(displayValue)}\\n`,\n );\n }\n\n private formatValue(value: unknown): string {\n if (Array.isArray(value)) return value.map(String).join(', ');\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n return String(value);\n }\n\n private writeNoteBox(title: string, lines: string[], _theme: ResolvedTheme): void {\n const maxLen = Math.max(title.length, ...lines.map((l) => l.length));\n const padded = maxLen + 2;\n const topLine = `${S_BAR_H.repeat(padded - title.length - 1)}${S_CORNER_TR}`;\n const bottomLine = `${S_BAR_H.repeat(padded)}${S_CORNER_BR}`;\n\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(`\\u256D${S_BAR_H} ${title} ${topLine}`)}\\n`);\n for (const line of lines) {\n const pad = ' '.repeat(maxLen - line.length);\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(S_BAR)} ${line}${pad} ${chalk.gray(S_BAR)}\\n`);\n }\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(`\\u256E${bottomLine}`)}\\n`);\n }\n\n private startSpinner(message: string, theme: ResolvedTheme): void {\n this.spinnerFrameIndex = 0;\n const { frames, interval } = theme.spinner;\n this.spinnerInterval = setInterval(() => {\n const frame = frames[this.spinnerFrameIndex % frames.length];\n process.stdout.write(`\\r${chalk.gray(S_BAR)} ${chalk.cyan(frame ?? '')} ${message}`);\n this.spinnerFrameIndex++;\n }, interval);\n }\n\n private stopSpinner(message: string | undefined, theme: ResolvedTheme): void {\n if (this.spinnerInterval) {\n clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n const finalMessage = message ?? 'Done';\n process.stdout.write(`\\r${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${finalMessage}\\n`);\n }\n}\n","function isUnicodeSupported(): boolean {\n if (process.platform === 'win32') {\n return Boolean(process.env['WT_SESSION']) || process.env['TERM_PROGRAM'] === 'vscode';\n }\n return process.env['TERM'] !== 'linux';\n}\n\nconst unicode = isUnicodeSupported();\nconst u = (unicodeChar: string, fallback: string): string => unicode ? unicodeChar : fallback;\n\nexport const S_BAR_START = u('┌', 'T');\nexport const S_BAR = u('│', '|');\nexport const S_BAR_END = u('└', '—');\nexport const S_STEP_ACTIVE = u('◆', '*');\nexport const S_STEP_SUBMIT = u('◇', 'o');\nexport const S_STEP_CANCEL = u('■', 'x');\nexport const S_STEP_ERROR = u('▲', 'x');\nexport const S_CORNER_TR = u('╮', '+');\nexport const S_CORNER_BR = u('╯', '+');\nexport const S_BAR_H = u('─', '-');\n"],"mappings":"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","names":["chalk","resolve","dirname","input","readFileSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","join","homedir","join","homedir","mkdirSync","writeFileSync","readFileSync","unlinkSync","readFileSync","writeFileSync","mkdirSync","join","homedir","resolve","dirname","input","select","confirm","number","writeFileSync","isUserCancel","mkdirSync","readFileSync","writeFileSync","unlinkSync","readdirSync","existsSync","join","homedir","join","homedir","readFileSync","existsSync","readdirSync","unlinkSync","input","select","checkbox","confirm","password","number","search","editor","Separator","chalk","chalk","writeFileSync","resolve","chalk","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/parser.ts","../src/schema.ts","../src/runner.ts","../src/conditions.ts","../src/engine.ts","../src/theme.ts","../src/themes/presets.ts","../src/spinners.ts","../src/renderers/inquirer.ts","../src/resolve.ts","../src/template.ts","../src/banner.ts","../src/plugins.ts","../src/cache.ts","../src/progress.ts","../src/mru.ts","../src/scaffolder.ts","../src/completions.ts","../src/templates.ts","../src/renderers/ink.ts","../src/renderers/clack.ts","../src/renderers/symbols.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport chalk from 'chalk';\nimport { program } from 'commander';\nimport { loadWizardConfig } from './parser';\nimport { runWizard } from './runner';\nimport { getVisibleSteps } from './engine';\nimport { resolveTheme } from './theme';\nimport { resolveTemplate } from './template';\nimport { scaffoldWizard } from './scaffolder';\nimport { bashCompletion, zshCompletion, fishCompletion } from './completions';\nimport { clearCache } from './cache';\nimport { listTemplates, deleteTemplate, loadTemplate } from './templates';\nimport { InkRenderer } from './renderers/ink';\nimport { ClackRenderer } from './renderers/clack';\nimport type { WizardRenderer } from './types';\nimport { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { stringify as yamlStringify } from 'yaml';\nimport type { Condition, WizardConfig } from './types';\n\nlet plainMode = false;\n\nfunction applyColorMode(opts: { color?: boolean; plain?: boolean }): void {\n if (opts.plain || opts.color === false || process.env['NO_COLOR'] !== undefined) {\n chalk.level = 0;\n plainMode = true;\n }\n}\n\ninterface RunCommandOpts {\n output?: string;\n format?: string;\n quiet?: boolean;\n dryRun?: boolean;\n mock?: string;\n json?: boolean;\n cache?: boolean;\n resume?: boolean;\n renderer?: string;\n template?: string;\n}\n\nprogram\n .name('grimoire')\n .description('Config-driven CLI wizard framework')\n .version('0.4.0')\n .option('--no-color', 'Disable colored output')\n .option('--plain', 'Plain output mode (no colors, no banner)')\n .hook('preAction', () => {\n const globalOpts = program.opts<{ color?: boolean; plain?: boolean }>();\n applyColorMode(globalOpts);\n });\n\nprogram\n .command('run')\n .description('Run a wizard from a config file')\n .argument('<config>', 'Path to wizard config file (.yaml, .json, .js, .ts)')\n .option('-o, --output <path>', 'Write answers to file')\n .option('-f, --format <format>', 'Output format: json, env, yaml', 'json')\n .option('-q, --quiet', 'Suppress header and summary output')\n .option('--dry-run', 'Show step plan without running the wizard')\n .option('--mock <json>', 'Run wizard with preset answers (JSON string)')\n .option('--json', 'Output structured JSON result to stdout')\n .option('--no-cache', 'Disable answer caching for this run')\n .option('--no-resume', 'Disable progress resume for this run')\n .option('--renderer <type>', 'Renderer to use: inquirer (default), ink, or clack', 'inquirer')\n .option('--template <name>', 'Load a saved template as defaults')\n .action(async (configPath: string, opts: RunCommandOpts) => {\n try {\n const fullPath = resolve(configPath);\n const config = await loadWizardConfig(fullPath);\n\n if (opts.dryRun) {\n printDryRun(config);\n return;\n }\n\n const mockAnswers = parseMockAnswers(opts.mock);\n const isJsonOutput = opts.json === true;\n const renderer = resolveRenderer(opts.renderer);\n\n let templateAnswers: Record<string, unknown> | undefined;\n if (opts.template) {\n templateAnswers = loadTemplate(config.meta.name, opts.template);\n if (!templateAnswers) {\n console.error(`\\n Template \"${opts.template}\" not found for \"${config.meta.name}\".\\n`);\n process.exit(1);\n }\n }\n\n const answers = await runWizard(config, {\n renderer,\n quiet: opts.quiet ?? isJsonOutput,\n plain: plainMode,\n mockAnswers,\n templateAnswers,\n cache: opts.cache,\n resume: opts.resume,\n configFilePath: fullPath,\n });\n\n const rawOutputPath = opts.output ?? config.output?.path;\n const outputPath = rawOutputPath ? resolve(resolveTemplate(rawOutputPath, answers)) : undefined;\n\n if (isJsonOutput) {\n const stepsCompleted = Object.keys(answers).length;\n const result = {\n ok: true,\n wizard: config.meta.name,\n answers,\n stepsCompleted,\n format: 'json',\n };\n const jsonStr = JSON.stringify(result, null, 2);\n console.log(jsonStr);\n if (outputPath) {\n writeFileSync(outputPath, jsonStr + '\\n', 'utf-8');\n }\n return;\n }\n\n if (outputPath) {\n const format = opts.format ?? config.output?.format ?? 'json';\n const content = formatOutput(answers, format);\n writeFileSync(outputPath, content, 'utf-8');\n if (!opts.quiet) {\n console.log(`\\n Answers written to: ${outputPath}\\n`);\n }\n }\n } catch (error) {\n if (opts.json) {\n const result = {\n ok: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('validate')\n .description('Validate a wizard config file without running it')\n .argument('<config>', 'Path to wizard config file')\n .action(async (configPath: string) => {\n try {\n const fullPath = resolve(configPath);\n const config = await loadWizardConfig(fullPath);\n console.log(`\\n ✓ Valid wizard config: \"${config.meta.name}\"`);\n console.log(` ${String(config.steps.length)} steps defined\\n`);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ✗ Invalid config: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('create')\n .description('Interactively scaffold a new wizard config file')\n .argument('[output]', 'Output file path', 'wizard.yaml')\n .action(async (output: string) => {\n try {\n const resolvedPath = resolve(output);\n await scaffoldWizard(resolvedPath);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('demo')\n .description('Run a demo wizard showcasing all step types')\n .action(async () => {\n try {\n const demoPath = resolve(\n fileURLToPath(import.meta.url),\n '..',\n '..',\n 'examples',\n 'yaml',\n 'demo.yaml',\n );\n const config = await loadWizardConfig(demoPath);\n await runWizard(config);\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n Error: ${error.message}\\n`);\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('completion')\n .description('Output shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n switch (shell) {\n case 'bash':\n console.log(bashCompletion());\n break;\n case 'zsh':\n console.log(zshCompletion());\n break;\n case 'fish':\n console.log(fishCompletion());\n break;\n default:\n console.error(`Unknown shell: ${shell}. Supported: bash, zsh, fish`);\n process.exit(1);\n }\n });\n\nconst cacheCommand = program\n .command('cache')\n .description('Manage cached wizard answers');\n\ncacheCommand\n .command('clear')\n .description('Delete cached wizard answers')\n .argument('[name]', 'Wizard name to clear (clears all if omitted)')\n .action((name?: string) => {\n clearCache(name);\n if (name) {\n console.log(`\\n Cache cleared for \"${name}\".\\n`);\n } else {\n console.log('\\n All cached answers cleared.\\n');\n }\n });\n\nconst templateCommand = program\n .command('template')\n .description('Manage saved wizard answer templates');\n\ntemplateCommand\n .command('list')\n .description('List saved templates for a wizard')\n .argument('<wizard-name>', 'Wizard name')\n .action((wizardName: string) => {\n const templates = listTemplates(wizardName);\n if (templates.length === 0) {\n console.log(`\\n No templates found for \"${wizardName}\".\\n`);\n return;\n }\n console.log(`\\n Templates for \"${wizardName}\":\\n`);\n for (const t of templates) {\n console.log(` - ${t}`);\n }\n console.log();\n });\n\ntemplateCommand\n .command('delete')\n .description('Delete a saved template')\n .argument('<wizard-name>', 'Wizard name')\n .argument('<template-name>', 'Template name')\n .action((wizardName: string, templateName: string) => {\n deleteTemplate(wizardName, templateName);\n console.log(`\\n Template \"${templateName}\" deleted from \"${wizardName}\".\\n`);\n });\n\nprogram.parse();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMockAnswers(\n mockJson: string | undefined,\n): Record<string, unknown> | undefined {\n if (mockJson === undefined) {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(mockJson);\n if (!isRecord(parsed)) {\n throw new Error('--mock value must be a JSON object');\n }\n return parsed;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`--mock value is not valid JSON: ${error.message}`);\n }\n throw error;\n }\n}\n\nfunction printDryRun(config: WizardConfig): void {\n const theme = resolveTheme(config.theme);\n const visibleSteps = getVisibleSteps(config, {});\n\n console.log();\n console.log(` ${theme.bold('Dry Run:')} \"${config.meta.name}\"`);\n if (config.meta.description) {\n console.log(` ${theme.muted(config.meta.description)}`);\n }\n console.log();\n\n if (config.checks && config.checks.length > 0) {\n console.log(` ${theme.bold('Pre-flight checks:')}`);\n for (const check of config.checks) {\n console.log(` ${theme.muted('•')} ${check.name}: ${theme.muted(check.run)}`);\n }\n console.log();\n }\n\n for (let i = 0; i < config.steps.length; i++) {\n const step = config.steps[i];\n if (!step) continue;\n\n const isVisible = visibleSteps.some((v) => v.id === step.id);\n const num = String(i + 1).padStart(2, ' ');\n const typeStr = step.type.padEnd(12);\n const idStr = step.id.padEnd(20);\n const msg = `\"${step.message}\"`;\n\n const parts: string[] = [];\n\n if (!isVisible) {\n parts.push('(hidden)');\n }\n\n if (step.required === false) {\n parts.push('(optional)');\n }\n\n if (step.type === 'multiselect') {\n if (step.min !== undefined) parts.push(`min:${String(step.min)}`);\n if (step.max !== undefined) parts.push(`max:${String(step.max)}`);\n }\n\n if (step.when) {\n parts.push(`[when: ${formatCondition(step.when)}]`);\n }\n\n if (step.type === 'select' && step.routes) {\n const routeParts = Object.entries(step.routes)\n .map(([k, v]) => `${k}→${v}`)\n .join(', ');\n parts.push(`routes: {${routeParts}}`);\n }\n\n if (step.next) {\n parts.push(`→ ${step.next}`);\n }\n\n const suffix = parts.length > 0 ? ` ${parts.join(' ')}` : '';\n console.log(` Step ${num} ${typeStr} ${idStr} ${msg}${suffix}`);\n }\n\n console.log();\n\n if (config.onComplete) {\n console.log(` ${theme.bold('onComplete handler:')}`);\n console.log(` ${theme.muted(config.onComplete)}`);\n console.log();\n }\n\n if (config.actions && config.actions.length > 0) {\n console.log(` ${theme.bold('Post-wizard actions:')}`);\n for (const action of config.actions) {\n const label = action.name ?? action.run;\n const whenStr = action.when ? ` [when: ${formatCondition(action.when)}]` : '';\n console.log(` ${theme.muted('•')} ${label}: ${theme.muted(action.run)}${whenStr}`);\n }\n console.log();\n }\n}\n\nfunction formatCondition(condition: Condition): string {\n if ('all' in condition) {\n return `all(${condition.all.map(formatCondition).join(', ')})`;\n }\n if ('any' in condition) {\n return `any(${condition.any.map(formatCondition).join(', ')})`;\n }\n if ('not' in condition) {\n return `not(${formatCondition(condition.not)})`;\n }\n if ('equals' in condition) {\n return `${condition.field} equals ${String(condition.equals)}`;\n }\n if ('notEquals' in condition) {\n return `${condition.field} notEquals ${String(condition.notEquals)}`;\n }\n if ('includes' in condition) {\n return `${condition.field} includes ${String(condition.includes)}`;\n }\n if ('notIncludes' in condition) {\n return `${condition.field} notIncludes ${String(condition.notIncludes)}`;\n }\n if ('greaterThan' in condition) {\n return `${condition.field} > ${String(condition.greaterThan)}`;\n }\n if ('lessThan' in condition) {\n return `${condition.field} < ${String(condition.lessThan)}`;\n }\n if ('isEmpty' in condition) {\n return `${condition.field} isEmpty`;\n }\n if ('isNotEmpty' in condition) {\n return `${condition.field} isNotEmpty`;\n }\n return 'unknown';\n}\n\nfunction resolveRenderer(rendererName?: string): WizardRenderer | undefined {\n if (!rendererName || rendererName === 'inquirer') {\n return undefined;\n }\n if (rendererName === 'ink') {\n return new InkRenderer();\n }\n if (rendererName === 'clack') {\n return new ClackRenderer();\n }\n throw new Error(`Unknown renderer: \"${rendererName}\". Supported: inquirer, ink, clack`);\n}\n\nfunction toEnvKey(key: string): string {\n return key.replace(/[^a-zA-Z0-9]/g, '_').toUpperCase();\n}\n\nfunction formatOutput(answers: Record<string, unknown>, format: string): string {\n switch (format) {\n case 'json':\n return JSON.stringify(answers, null, 2) + '\\n';\n case 'env':\n return Object.entries(answers)\n .map(([key, value]) => {\n const strValue = Array.isArray(value)\n ? value.join(',')\n : String(value);\n return `${toEnvKey(key)}=${strValue}`;\n })\n .join('\\n') + '\\n';\n case 'yaml':\n return yamlStringify(answers);\n default:\n return JSON.stringify(answers, null, 2) + '\\n';\n }\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { readFileSync } from 'node:fs';\nimport { dirname, resolve, isAbsolute } from 'node:path';\nimport { parse as parseYAML } from 'yaml';\nimport { parseWizardConfig } from './schema';\nimport type { WizardConfig, StepConfig, ThemeConfig } from './types';\n\nconst DONE_SENTINEL = '__done__';\n\nfunction buildStepGraph(steps: StepConfig[]): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n const edges: string[] = [];\n\n if (step.next && step.next !== DONE_SENTINEL) {\n edges.push(step.next);\n }\n\n if (step.type === 'select' && step.routes) {\n for (const target of Object.values(step.routes)) {\n if (target !== DONE_SENTINEL) {\n edges.push(target);\n }\n }\n }\n\n if (!step.next && !(step.type === 'select' && step.routes)) {\n const nextStep = steps[i + 1];\n if (nextStep) {\n edges.push(nextStep.id);\n }\n }\n\n graph.set(step.id, edges);\n }\n\n return graph;\n}\n\nfunction detectCycles(config: WizardConfig): void {\n const graph = buildStepGraph(config.steps);\n\n const UNVISITED = 0;\n const IN_STACK = 1;\n const DONE = 2;\n\n const nodeState = new Map<string, number>();\n for (const id of graph.keys()) {\n nodeState.set(id, UNVISITED);\n }\n\n function dfs(nodeId: string, path: string[]): void {\n nodeState.set(nodeId, IN_STACK);\n const currentPath = [...path, nodeId];\n\n for (const neighbor of graph.get(nodeId) ?? []) {\n const state = nodeState.get(neighbor);\n\n if (state === IN_STACK) {\n const cycleStart = currentPath.indexOf(neighbor);\n const cycle = [...currentPath.slice(cycleStart), neighbor];\n throw new Error(`Cycle detected in wizard steps: ${cycle.join(' \\u2192 ')}`);\n }\n\n if (state === UNVISITED) {\n dfs(neighbor, currentPath);\n }\n }\n\n nodeState.set(nodeId, DONE);\n }\n\n for (const id of graph.keys()) {\n if (nodeState.get(id) === UNVISITED) {\n dfs(id, []);\n }\n }\n}\n\nfunction deepMergeTheme(\n parent: ThemeConfig | undefined,\n child: ThemeConfig | undefined,\n): ThemeConfig | undefined {\n if (!parent && !child) return undefined;\n if (!parent) return child;\n if (!child) return parent;\n return {\n tokens: { ...parent.tokens, ...child.tokens },\n icons: { ...parent.icons, ...child.icons },\n };\n}\n\nfunction mergeConfigs(parent: WizardConfig, child: WizardConfig): WizardConfig {\n return {\n meta: { ...parent.meta, ...child.meta },\n theme: deepMergeTheme(parent.theme, child.theme),\n steps: child.steps,\n output: child.output ?? parent.output,\n checks: [\n ...(parent.checks ?? []),\n ...(child.checks ?? []),\n ],\n actions: child.actions ?? parent.actions,\n };\n}\n\nconst OPTION_STEP_TYPES = new Set(['select', 'multiselect', 'search']);\n\nfunction resolveOptionsFromSteps(raw: Record<string, unknown>, configDir: string): void {\n const steps = raw['steps'];\n if (!Array.isArray(steps)) return;\n\n for (const step of steps) {\n if (typeof step !== 'object' || step === null) continue;\n const stepObj = step as Record<string, unknown>;\n const optionsFrom = stepObj['optionsFrom'];\n if (typeof optionsFrom !== 'string') continue;\n\n const stepId = String(stepObj['id'] ?? 'unknown');\n const stepType = String(stepObj['type'] ?? 'unknown');\n\n if (!OPTION_STEP_TYPES.has(stepType)) {\n throw new Error(\n `Step \"${stepId}\" has \"optionsFrom\" but type \"${stepType}\" does not support dynamic options`,\n );\n }\n\n const fullPath = isAbsolute(optionsFrom)\n ? optionsFrom\n : resolve(configDir, optionsFrom);\n\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n throw new Error(\n `Step \"${stepId}\": failed to read optionsFrom file \"${fullPath}\"`,\n );\n }\n\n let parsed: unknown;\n try {\n if (fullPath.endsWith('.yaml') || fullPath.endsWith('.yml')) {\n parsed = parseYAML(content);\n } else {\n parsed = JSON.parse(content);\n }\n } catch {\n throw new Error(\n `Step \"${stepId}\": optionsFrom file \"${fullPath}\" contains invalid JSON/YAML`,\n );\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\n `Step \"${stepId}\": optionsFrom file \"${fullPath}\" must contain an array`,\n );\n }\n\n stepObj['options'] = parsed;\n delete stepObj['optionsFrom'];\n }\n}\n\nasync function loadWithInheritance(\n filePath: string,\n seen: Set<string>,\n): Promise<WizardConfig> {\n const resolvedPath = resolve(filePath);\n\n if (seen.has(resolvedPath)) {\n throw new Error(`Circular extends detected: \"${resolvedPath}\" was already loaded`);\n }\n seen.add(resolvedPath);\n\n const explorer = cosmiconfig('grimoire');\n const result = await explorer.load(resolvedPath);\n\n if (!result || result.isEmpty) {\n throw new Error(`No configuration found at: ${resolvedPath}`);\n }\n\n const raw = result.config as Record<string, unknown>;\n const extendsPath = typeof raw['extends'] === 'string' ? raw['extends'] : undefined;\n\n resolveOptionsFromSteps(raw, dirname(resolvedPath));\n const config = parseWizardConfig(raw);\n\n if (!extendsPath) {\n return config;\n }\n\n const parentPath = isAbsolute(extendsPath)\n ? extendsPath\n : resolve(dirname(resolvedPath), extendsPath);\n\n const parentConfig = await loadWithInheritance(parentPath, seen);\n return mergeConfigs(parentConfig, config);\n}\n\nexport async function loadWizardConfig(filePath: string): Promise<WizardConfig> {\n const config = await loadWithInheritance(filePath, new Set<string>());\n detectCycles(config);\n config._configFilePath = resolve(filePath);\n return config;\n}\n\nexport function parseWizardYAML(yamlString: string): WizardConfig {\n const raw: unknown = parseYAML(yamlString);\n\n if (raw !== null && typeof raw === 'object' && !Array.isArray(raw)) {\n if ('extends' in raw && typeof raw.extends === 'string') {\n throw new Error(\n '\"extends\" is not supported in parseWizardYAML — use loadWizardConfig with a file path',\n );\n }\n\n const steps = (raw as Record<string, unknown>)['steps'];\n if (Array.isArray(steps)) {\n for (const step of steps) {\n if (typeof step === 'object' && step !== null && 'optionsFrom' in step) {\n throw new Error(\n '\"optionsFrom\" is not supported in parseWizardYAML — use loadWizardConfig with a file path',\n );\n }\n }\n }\n }\n\n const config = parseWizardConfig(raw);\n detectCycles(config);\n return config;\n}\n","import { z } from 'zod';\nimport type {\n ActionConfig,\n Condition,\n PreFlightCheck,\n ValidationRule,\n WizardConfig,\n} from './types';\n\nconst conditionSchema: z.ZodType<Condition> = z.lazy(() => {\n const fieldEquals = z.object({ field: z.string(), equals: z.unknown() }).strict();\n const fieldNotEquals = z.object({ field: z.string(), notEquals: z.unknown() }).strict();\n const fieldIncludes = z.object({ field: z.string(), includes: z.unknown() }).strict();\n const fieldNotIncludes = z.object({ field: z.string(), notIncludes: z.unknown() }).strict();\n const fieldGreaterThan = z.object({ field: z.string(), greaterThan: z.number() }).strict();\n const fieldLessThan = z.object({ field: z.string(), lessThan: z.number() }).strict();\n const fieldIsEmpty = z.object({ field: z.string(), isEmpty: z.literal(true) }).strict();\n const fieldIsNotEmpty = z.object({ field: z.string(), isNotEmpty: z.literal(true) }).strict();\n const allCondition = z.object({ all: z.array(conditionSchema) }).strict();\n const anyCondition = z.object({ any: z.array(conditionSchema) }).strict();\n const notCondition = z.object({ not: conditionSchema }).strict();\n\n return z.union([\n fieldEquals,\n fieldNotEquals,\n fieldIncludes,\n fieldNotIncludes,\n fieldGreaterThan,\n fieldLessThan,\n fieldIsEmpty,\n fieldIsNotEmpty,\n allCondition,\n anyCondition,\n notCondition,\n ]) as z.ZodType<Condition>;\n});\n\nconst validationRuleSchema: z.ZodType<ValidationRule> = z.discriminatedUnion('rule', [\n z.object({ rule: z.literal('required'), message: z.string().optional() }),\n z.object({ rule: z.literal('minLength'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('maxLength'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('pattern'), value: z.string(), message: z.string().optional() }),\n z.object({ rule: z.literal('min'), value: z.number(), message: z.string().optional() }),\n z.object({ rule: z.literal('max'), value: z.number(), message: z.string().optional() }),\n]);\n\nconst selectOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n hint: z.string().optional(),\n disabled: z.union([z.boolean(), z.string()]).optional(),\n});\n\nconst separatorOptionSchema = z.object({\n separator: z.string(),\n});\n\nconst selectChoiceSchema = z.union([selectOptionSchema, separatorOptionSchema]);\n\nconst stepReviewConfigSchema = z.object({\n hide: z.boolean().optional(),\n label: z.string().optional(),\n format: z.enum(['none', 'uppercase', 'lowercase', 'capitalize']).optional(),\n}).optional();\n\nconst baseStepFields = {\n id: z.string(),\n message: z.string(),\n description: z.string().optional(),\n next: z.string().optional(),\n when: conditionSchema.optional(),\n keepValuesOnPrevious: z.boolean().optional(),\n required: z.boolean().optional(),\n group: z.string().optional(),\n review: stepReviewConfigSchema,\n} as const;\n\nconst textStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('text'),\n placeholder: z.string().optional(),\n default: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst selectStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('select'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.string().optional(),\n routes: z.record(z.string(), z.string()).optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n columns: z.number().int().min(1).max(8).optional(),\n});\n\nconst multiSelectStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('multiselect'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.array(z.string()).optional(),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n columns: z.number().int().min(1).max(8).optional(),\n});\n\nconst confirmStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('confirm'),\n default: z.boolean().optional(),\n});\n\nconst passwordStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('password'),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst numberStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('number'),\n default: z.number().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().positive().optional(),\n});\n\nconst searchStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('search'),\n options: z.array(selectChoiceSchema).min(1).optional(),\n optionsFrom: z.string().optional(),\n default: z.string().optional(),\n placeholder: z.string().optional(),\n pageSize: z.number().int().positive().optional(),\n loop: z.boolean().optional(),\n columns: z.number().int().min(1).max(8).optional(),\n});\n\nconst editorStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('editor'),\n default: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst pathStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('path'),\n default: z.string().optional(),\n placeholder: z.string().optional(),\n validate: z.array(validationRuleSchema).optional(),\n});\n\nconst toggleStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('toggle'),\n default: z.boolean().optional(),\n active: z.string().optional(),\n inactive: z.string().optional(),\n});\n\nconst messageStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('message'),\n});\n\nconst noteStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('note'),\n style: z.enum(['info', 'warning', 'error', 'success', 'code', 'banner']).optional(),\n});\n\nconst browserStepSchema = z.object({\n ...baseStepFields,\n type: z.literal('browser'),\n url: z.string(),\n fallback: z.string().optional(),\n});\n\nconst stepConfigSchema = z.discriminatedUnion('type', [\n textStepSchema,\n selectStepSchema,\n multiSelectStepSchema,\n confirmStepSchema,\n passwordStepSchema,\n numberStepSchema,\n searchStepSchema,\n editorStepSchema,\n pathStepSchema,\n toggleStepSchema,\n messageStepSchema,\n noteStepSchema,\n browserStepSchema,\n]);\n\nconst hexColorSchema = z.string().regex(\n /^#[0-9a-fA-F]{6}$/,\n 'Must be a 6-digit hex color (e.g., #FF0000)',\n);\n\nconst progressBarConfigSchema = z.object({\n width: z.number().int().positive().max(200).optional(),\n filledColor: hexColorSchema.optional(),\n emptyColor: hexColorSchema.optional(),\n style: z.enum(['blocks', 'line', 'dots', 'arrow']).optional(),\n}).optional();\n\nconst themeConfigSchema = z.object({\n preset: z.enum(['default', 'catppuccin', 'dracula', 'nord', 'tokyonight', 'monokai']).optional(),\n tokens: z.object({\n primary: hexColorSchema.optional(),\n success: hexColorSchema.optional(),\n error: hexColorSchema.optional(),\n warning: hexColorSchema.optional(),\n info: hexColorSchema.optional(),\n muted: hexColorSchema.optional(),\n accent: hexColorSchema.optional(),\n highlight: hexColorSchema.optional(),\n highlightBg: hexColorSchema.optional(),\n pointer: hexColorSchema.optional(),\n checked: hexColorSchema.optional(),\n dimmed: hexColorSchema.optional(),\n }).optional(),\n icons: z.object({\n step: z.string().optional(),\n stepDone: z.string().optional(),\n stepPending: z.string().optional(),\n pointer: z.string().optional(),\n }).optional(),\n spinner: z.union([\n z.string(),\n z.object({\n frames: z.array(z.string()).min(1),\n interval: z.number().positive().optional(),\n }),\n ]).optional(),\n spinnerElapsed: z.boolean().optional(),\n progressBar: progressBarConfigSchema,\n});\n\nconst preFlightCheckSchema: z.ZodType<PreFlightCheck> = z.object({\n name: z.string(),\n run: z.string(),\n message: z.string(),\n showOutput: z.boolean().optional(),\n});\n\nconst actionConfigSchema: z.ZodType<ActionConfig> = z.object({\n name: z.string().optional(),\n run: z.string(),\n when: conditionSchema.optional(),\n});\n\nconst wizardConfigSchema = z.object({\n meta: z.object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n review: z.boolean().optional(),\n icon: z.string().optional(),\n iconSize: z.union([z.enum(['small', 'medium', 'large']), z.number().int().positive()]).optional(),\n font: z.string().min(1).optional(),\n banner: z.union([z.string(), z.function()]).optional(),\n subtitle: z.string().optional(),\n clearBetweenSteps: z.boolean().optional(),\n checksStyle: z.enum(['spinner', 'tasklist']).optional(),\n }),\n theme: themeConfigSchema.optional(),\n steps: z.array(stepConfigSchema).min(1),\n output: z.object({\n format: z.enum(['json', 'env', 'yaml']),\n path: z.string().optional(),\n }).optional(),\n extends: z.string().optional(),\n checks: z.array(preFlightCheckSchema).optional(),\n actions: z.array(actionConfigSchema).optional(),\n onComplete: z.string().optional(),\n}).superRefine((config, ctx) => {\n const stepIds = new Set<string>();\n\n for (const step of config.steps) {\n if (stepIds.has(step.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate step ID: \"${step.id}\"`,\n path: ['steps'],\n });\n }\n stepIds.add(step.id);\n }\n\n config.steps.forEach((step, i) => {\n if (step.next && step.next !== '__done__' && !stepIds.has(step.next)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" references unknown next step: \"${step.next}\"`,\n path: ['steps', i, 'next'],\n });\n }\n\n if (step.type === 'select' && step.routes) {\n for (const [key, target] of Object.entries(step.routes)) {\n if (target !== '__done__' && !stepIds.has(target)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" route \"${key}\" references unknown step: \"${target}\"`,\n path: ['steps', i, 'routes', key],\n });\n }\n }\n }\n\n if (step.when) {\n collectConditionFieldIssues(step.when, stepIds, ctx, ['steps', i, 'when']);\n }\n\n if (step.type === 'select' && step.routes && step.options) {\n const optionValues = new Set<string>();\n for (const o of step.options) {\n if ('value' in o) {\n optionValues.add(o.value);\n }\n }\n for (const routeKey of Object.keys(step.routes)) {\n if (!optionValues.has(routeKey)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" route key \"${routeKey}\" does not match any option value`,\n path: ['steps', i, 'routes', routeKey],\n });\n }\n }\n }\n\n if (step.type === 'select' || step.type === 'multiselect' || step.type === 'search') {\n const hasOptions = step.options !== undefined;\n const hasOptionsFrom = step.optionsFrom !== undefined;\n if (hasOptions && hasOptionsFrom) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" has both \"options\" and \"optionsFrom\" — only one is allowed`,\n path: ['steps', i],\n });\n }\n if (!hasOptions && !hasOptionsFrom) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" must have either \"options\" or \"optionsFrom\"`,\n path: ['steps', i],\n });\n }\n }\n\n if ((step.type === 'number' || step.type === 'multiselect') &&\n step.min !== undefined && step.max !== undefined && step.min > step.max) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Step \"${step.id}\" has min (${String(step.min)}) greater than max (${String(step.max)})`,\n path: ['steps', i],\n });\n }\n });\n\n if (config.actions) {\n config.actions.forEach((action, i) => {\n if (action.when) {\n collectConditionFieldIssues(action.when, stepIds, ctx, ['actions', i, 'when']);\n }\n });\n }\n});\n\nfunction collectConditionFieldIssues(\n condition: Condition,\n validIds: Set<string>,\n ctx: z.RefinementCtx,\n path: (string | number)[],\n): void {\n if ('field' in condition) {\n const fieldRoot = condition.field.split('.')[0];\n if (fieldRoot && !validIds.has(fieldRoot)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Condition references unknown step ID: \"${fieldRoot}\"`,\n path,\n });\n }\n return;\n }\n if ('all' in condition) {\n condition.all.forEach((child, i) => {\n collectConditionFieldIssues(child, validIds, ctx, [...path, 'all', i]);\n });\n return;\n }\n if ('any' in condition) {\n condition.any.forEach((child, i) => {\n collectConditionFieldIssues(child, validIds, ctx, [...path, 'any', i]);\n });\n return;\n }\n if ('not' in condition) {\n collectConditionFieldIssues(condition.not, validIds, ctx, [...path, 'not']);\n }\n}\n\nexport {\n actionConfigSchema,\n conditionSchema,\n validationRuleSchema,\n selectOptionSchema,\n separatorOptionSchema,\n selectChoiceSchema,\n messageStepSchema,\n noteStepSchema,\n stepConfigSchema,\n themeConfigSchema,\n preFlightCheckSchema,\n wizardConfigSchema,\n};\n\nexport function parseWizardConfig(raw: unknown): WizardConfig {\n // The zod schema allows options to be optional (when optionsFrom is used).\n // After resolution in loadWizardConfig, options is always populated.\n const result = wizardConfigSchema.parse(raw) as WizardConfig;\n return result;\n}\n","import { execSync, execFileSync } from 'node:child_process';\nimport { resolve, dirname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createWizardState, getVisibleSteps, wizardReducer } from './engine';\nimport { resolveTheme } from './theme';\nimport { InquirerRenderer } from './renderers/inquirer';\nimport { resolveEnvDefault, resolveEnvDefaultBoolean, resolveEnvDefaultNumber } from './resolve';\nimport { resolveTemplate, resolveTemplateStrict } from './template';\nimport { renderBanner } from './banner';\nimport { registerPlugin, getPluginStep, clearPlugins } from './plugins';\nimport type { GrimoirePlugin } from './plugins';\nimport { evaluateCondition } from './conditions';\nimport { loadCachedAnswers, saveCachedAnswers } from './cache';\nimport { saveProgress, loadProgress, clearProgress } from './progress';\nimport { recordSelection, getOrderedOptions } from './mru';\nimport type { ActionConfig, HookContext, PreFlightCheck, PromptConfig, SelectChoice, SelectOption, StepConfig, WizardConfig, WizardEvent, WizardRenderer, WizardState, ResolvedTheme } from './types';\n\nfunction emitEvent(renderer: WizardRenderer, event: WizardEvent, theme: ResolvedTheme): void {\n if (renderer.onEvent) {\n renderer.onEvent(event, theme);\n }\n}\n\nexport interface RunWizardOptions {\n renderer?: WizardRenderer;\n quiet?: boolean;\n plain?: boolean;\n mockAnswers?: Record<string, unknown>;\n templateAnswers?: Record<string, unknown>;\n onBeforeStep?: (stepId: string, step: StepConfig, context: HookContext) => Promise<void> | void;\n onAfterStep?: (stepId: string, value: unknown, context: HookContext) => Promise<void> | void;\n onStepComplete?: (stepId: string, value: unknown, state: WizardState) => void;\n onCancel?: (state: WizardState) => Promise<void> | void;\n plugins?: GrimoirePlugin[];\n asyncValidate?: (stepId: string, value: unknown, answers: Record<string, unknown>) => Promise<string | null>;\n cache?: boolean | { dir?: string };\n mru?: boolean;\n resume?: boolean;\n configFilePath?: string;\n optionsProvider?: (\n stepId: string,\n answers: Record<string, unknown>,\n ) => Promise<SelectOption[] | undefined>;\n}\n\nexport function runPreFlightChecks(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n checksStyle?: 'spinner' | 'tasklist',\n): void {\n if (checksStyle === 'tasklist') {\n runPreFlightChecksTasklist(checks, theme, renderer);\n } else {\n runPreFlightChecksSpinner(checks, theme, renderer);\n }\n}\n\nfunction runPreFlightChecksSpinner(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): void {\n if (renderer) emitEvent(renderer, { type: 'checks:start', checks }, theme);\n for (const check of checks) {\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: check.name }, theme);\n try {\n execSync(check.run, { stdio: 'pipe' });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: `${check.name}` }, theme);\n console.log(` ${theme.success('✓')} ${check.name}`);\n if (renderer) emitEvent(renderer, { type: 'check:pass', name: check.name }, theme);\n } catch {\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n console.log(` ${theme.error('✗')} ${check.name}: ${check.message}`);\n if (renderer) emitEvent(renderer, { type: 'check:fail', name: check.name, message: check.message }, theme);\n throw new Error(`Pre-flight check failed: ${check.name} — ${check.message}`);\n }\n }\n console.log();\n}\n\nfunction runPreFlightChecksTasklist(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): void {\n // Fall back to spinner mode in non-TTY environments (CI, piped output, --json)\n if (!process.stdout.isTTY) {\n runPreFlightChecksSpinner(checks, theme, renderer);\n return;\n }\n\n if (renderer) emitEvent(renderer, { type: 'checks:start', checks, mode: 'tasklist' }, theme);\n\n type TaskStatus = 'pending' | 'running' | 'pass' | 'fail';\n const statuses: TaskStatus[] = checks.map(() => 'pending');\n const icons = theme.icons;\n\n function renderTasklist(): void {\n process.stdout.write(`\\x1B[${checks.length}A\\x1B[0G`);\n for (let i = 0; i < checks.length; i++) {\n const check = checks[i]!;\n const s = statuses[i];\n let icon: string;\n if (s === 'pass') icon = theme.success(icons.stepDone);\n else if (s === 'fail') icon = theme.error('✗');\n else if (s === 'running') icon = theme.info('⠋');\n else icon = theme.muted(icons.stepPending);\n process.stdout.write(` ${icon} ${check.name}\\x1B[K\\n`);\n }\n }\n\n for (let i = 0; i < checks.length; i++) {\n process.stdout.write(` ${theme.muted(icons.stepPending)} ${checks[i]!.name}\\n`);\n }\n\n let failedCheck: PreFlightCheck | undefined;\n for (let i = 0; i < checks.length; i++) {\n const check = checks[i]!;\n statuses[i] = 'running';\n renderTasklist();\n try {\n execSync(check.run, { stdio: 'pipe' });\n statuses[i] = 'pass';\n renderTasklist();\n // Emit event AFTER visual update so cursor math stays correct\n if (renderer) emitEvent(renderer, { type: 'check:pass', name: check.name }, theme);\n } catch {\n statuses[i] = 'fail';\n renderTasklist();\n failedCheck = check;\n if (renderer) emitEvent(renderer, { type: 'check:fail', name: check.name, message: check.message }, theme);\n break;\n }\n }\n\n renderTasklist();\n console.log();\n\n if (failedCheck) {\n throw new Error(`Pre-flight check failed: ${failedCheck.name} — ${failedCheck.message}`);\n }\n}\n\nconst MOCK_MISS = Symbol('mock-miss');\n\nfunction getMockValue(\n step: StepConfig,\n mockAnswers: Record<string, unknown>,\n): unknown {\n if (step.id in mockAnswers) {\n return mockAnswers[step.id];\n }\n\n if (step.type === 'message' || step.type === 'note' || step.type === 'browser') {\n return true;\n }\n\n const defaultValue = getStepDefault(step);\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n\n return MOCK_MISS;\n}\n\nfunction getStepDefault(step: StepConfig): unknown {\n switch (step.type) {\n case 'text':\n case 'select':\n case 'search':\n case 'editor':\n case 'path':\n return step.default;\n case 'number':\n return step.default;\n case 'confirm':\n case 'toggle':\n return step.default;\n case 'multiselect':\n return step.default;\n case 'password':\n case 'message':\n case 'note':\n case 'browser':\n return undefined;\n }\n}\n\nexport async function runWizard(\n config: WizardConfig,\n options?: RunWizardOptions,\n): Promise<Record<string, unknown>> {\n const renderer = options?.renderer ?? new InquirerRenderer();\n const theme = resolveTheme(config.theme);\n const mockAnswers = options?.mockAnswers;\n const isMock = mockAnswers !== undefined;\n const quiet = options?.quiet ?? isMock;\n const cacheEnabled = !isMock && options?.cache !== false;\n const cacheDir = typeof options?.cache === 'object' ? options.cache.dir : undefined;\n const mruEnabled = !isMock && options?.mru !== false;\n let state = createWizardState(config);\n\n const resumeEnabled = !isMock && options?.resume !== false;\n if (resumeEnabled) {\n const saved = loadProgress(config.meta.name);\n if (saved) {\n const stepExists = config.steps.some(s => s.id === saved.currentStepId);\n if (stepExists) {\n state = {\n ...state,\n currentStepId: saved.currentStepId,\n answers: { ...state.answers, ...saved.answers },\n history: saved.history,\n };\n }\n }\n }\n\n const cachedAnswers = cacheEnabled\n ? loadCachedAnswers(config.meta.name, cacheDir)\n : undefined;\n\n const userPlugins = options?.plugins;\n if (userPlugins) {\n for (const plugin of userPlugins) {\n registerPlugin(plugin);\n }\n }\n\n let cancelFired = false;\n const performCancel = async (): Promise<void> => {\n if (cancelFired) return;\n cancelFired = true;\n state = wizardReducer(state, { type: 'CANCEL' }, config);\n const passwordStepIds = config.steps.filter(s => s.type === 'password').map(s => s.id);\n saveProgress(config.meta.name, {\n currentStepId: state.currentStepId,\n answers: state.answers,\n history: state.history,\n }, undefined, passwordStepIds);\n try { await options?.onCancel?.(state); } catch { }\n emitEvent(renderer, { type: 'session:end', answers: state.answers, cancelled: true }, theme);\n if (!quiet) console.log(theme.warning('\\n Wizard cancelled.\\n'));\n };\n\n const signalHandler = !isMock\n ? () => {\n performCancel().finally(() => process.exit(130));\n }\n : undefined;\n\n if (signalHandler) {\n process.once('SIGINT', signalHandler);\n process.once('SIGTERM', signalHandler);\n }\n\n try {\n if (!isMock && config.checks && config.checks.length > 0) {\n runPreFlightChecks(config.checks, theme, renderer, config.meta.checksStyle);\n }\n\n if (!quiet) {\n printWizardHeader(config, theme, options?.plain);\n }\n\n const visibleStepsForCount = getVisibleSteps(config, state.answers);\n emitEvent(renderer, { type: 'session:start', wizard: config.meta.name, description: config.meta.description, totalSteps: visibleStepsForCount.length }, theme);\n\n let needsReview = true;\n\n while (needsReview) {\n let previousGroup: string | undefined;\n let stepsCompleted = 0;\n\n while (state.status === 'running') {\n if (!isMock && config.meta.clearBetweenSteps && stepsCompleted > 0) {\n renderer.clear();\n if (!quiet) {\n printWizardHeader(config, theme, options?.plain);\n }\n previousGroup = undefined;\n }\n\n let nextStepOverride: string | undefined;\n\n const createHookContext = (stateOverride?: WizardState): HookContext => ({\n answers: { ...(stateOverride ?? state).answers },\n state: stateOverride ?? state,\n showNote: (title: string, body: string) => {\n emitEvent(renderer, { type: 'note', title, body }, theme);\n if (!('onEvent' in renderer) && process.stdout.isTTY) {\n console.log(`\\n ${theme.bold(title)}`);\n if (body) console.log(` ${theme.muted(body)}`);\n console.log();\n }\n },\n setNextStep: (stepId: string) => {\n nextStepOverride = stepId;\n },\n openBrowser: async (url: string) => {\n if (isMock) return;\n try { new URL(url); } catch { return; }\n if (process.platform === 'darwin') {\n execFileSync('open', [url], { stdio: 'ignore' });\n } else if (process.platform === 'win32') {\n execFileSync('powershell', ['-NoProfile', '-Command', `Start-Process '${url.replace(/'/g, \"''\")}'`], { stdio: 'ignore' });\n } else {\n execFileSync('xdg-open', [url], { stdio: 'ignore' });\n }\n },\n prompt: async (promptConfig: PromptConfig): Promise<unknown> => {\n if (isMock) {\n if (promptConfig.default !== undefined) return promptConfig.default;\n throw new Error('Mock mode: context.prompt() requires a default value');\n }\n const contextState = stateOverride ?? state;\n const tempStep = {\n id: '__hook_prompt__',\n message: promptConfig.message,\n type: promptConfig.type,\n ...(promptConfig.type === 'select'\n ? { options: promptConfig.options }\n : {}),\n default: promptConfig.default,\n } as StepConfig;\n return renderStep(renderer, tempStep, contextState, theme);\n },\n });\n\n const visibleSteps = getVisibleSteps(config, state.answers);\n const currentStep = config.steps.find((s) => s.id === state.currentStepId);\n\n if (!currentStep) {\n throw new Error(`Current step not found: \"${state.currentStepId}\"`);\n }\n\n if (currentStep.group !== undefined && currentStep.group !== previousGroup) {\n const resolvedGroup = resolveTemplate(currentStep.group, state.answers);\n if (!isMock) {\n renderer.renderGroupHeader(resolvedGroup, theme);\n }\n emitEvent(renderer, { type: 'group:start', group: resolvedGroup }, theme);\n }\n previousGroup = currentStep.group;\n\n const stepIndex = visibleSteps.findIndex((s) => s.id === state.currentStepId);\n const resolvedMessage = resolveTemplate(currentStep.message, state.answers);\n const resolvedDescription = currentStep.description ? resolveTemplate(currentStep.description, state.answers) : undefined;\n\n if (!isMock) {\n renderer.renderStepHeader(stepIndex, visibleSteps.length, resolvedMessage, theme, resolvedDescription);\n }\n\n emitEvent(renderer, { type: 'step:start', stepId: currentStep.id, stepIndex, totalVisible: visibleSteps.length, step: currentStep }, theme);\n\n if (currentStep.type === 'note') {\n emitEvent(renderer, { type: 'note', title: resolvedMessage, body: resolvedDescription ?? '' }, theme);\n if (!isMock && 'style' in currentStep && currentStep.style && 'renderNote' in renderer && !('onEvent' in renderer)) {\n const resolvedStep = { ...currentStep, message: resolvedMessage, description: resolvedDescription };\n (renderer as { renderNote: (step: typeof resolvedStep, theme: ResolvedTheme) => void }).renderNote(resolvedStep, theme);\n }\n }\n\n if (options?.onBeforeStep) {\n await options.onBeforeStep(currentStep.id, currentStep, createHookContext());\n }\n\n const pluginStep = getPluginStep(currentStep.type);\n const resolvedStep = pluginStep ? currentStep : resolveStepDefaults(currentStep, cachedAnswers);\n const withTemplate = options?.templateAnswers\n ? applyTemplateDefaults(resolvedStep, options.templateAnswers)\n : resolvedStep;\n const templatedStep = resolveStepTemplates(withTemplate, state.answers);\n const mruStep = mruEnabled ? applyMruOrdering(templatedStep, config.meta.name) : templatedStep;\n\n let finalStep = mruStep;\n if (!isMock && options?.optionsProvider && isSelectLikeStep(currentStep.type)) {\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: resolvedMessage }, theme);\n const dynamicOptions = await options.optionsProvider(currentStep.id, state.answers);\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: resolvedMessage }, theme);\n if (dynamicOptions) {\n finalStep = { ...mruStep, options: dynamicOptions } as StepConfig;\n }\n }\n\n try {\n let value: unknown;\n if (isMock) {\n const mockResult = getMockValue(finalStep, mockAnswers);\n if (mockResult === MOCK_MISS) {\n throw new Error(\n `Mock mode: no answer provided for step \"${finalStep.id}\" and no default available`,\n );\n } else {\n value = mockResult;\n }\n } else {\n value = pluginStep\n ? await pluginStep.render(toStepRecord(finalStep), state, theme)\n : await renderStep(renderer, finalStep, state, theme);\n }\n\n if (pluginStep?.validate) {\n const pluginError = pluginStep.validate(value, toStepRecord(templatedStep));\n if (pluginError) {\n if (isMock) {\n throw new Error(\n `Mock mode: validation failed for step \"${currentStep.id}\": ${pluginError}`,\n );\n }\n console.log(theme.error(`\\n ${pluginError}\\n`));\n continue;\n }\n }\n\n const nextState = wizardReducer(state, { type: 'NEXT', value }, config);\n\n if (nextState.errors[currentStep.id]) {\n const errorMsg = resolveTemplate(nextState.errors[currentStep.id] ?? '', state.answers);\n emitEvent(renderer, { type: 'step:error', stepId: currentStep.id, error: errorMsg }, theme);\n if (isMock) {\n throw new Error(\n `Mock mode: validation failed for step \"${currentStep.id}\": ${errorMsg}`,\n );\n }\n console.log(theme.error(`\\n ${errorMsg}\\n`));\n state = { ...nextState, errors: {} };\n continue;\n }\n\n if (!isMock && options?.asyncValidate) {\n const asyncError = await options.asyncValidate(currentStep.id, value, nextState.answers);\n if (asyncError !== null) {\n console.log(theme.error(`\\n ${asyncError}\\n`));\n state = { ...nextState, errors: {} };\n continue;\n }\n }\n\n if (options?.onAfterStep) {\n await options.onAfterStep(currentStep.id, value, createHookContext(nextState));\n }\n\n if (nextStepOverride) {\n if (nextStepOverride === '__done__') {\n state = { ...nextState, status: 'done' };\n } else {\n const targetExists = config.steps.some(s => s.id === nextStepOverride);\n if (!targetExists) {\n throw new Error(`setNextStep: step \"${nextStepOverride}\" does not exist`);\n }\n state = { ...nextState, status: 'running', currentStepId: nextStepOverride };\n }\n nextStepOverride = undefined;\n } else {\n state = nextState;\n }\n emitEvent(renderer, { type: 'step:complete', stepId: currentStep.id, value, step: currentStep }, theme);\n\n if (mruEnabled && isSelectLikeStep(currentStep.type)) {\n recordSelection(config.meta.name, currentStep.id, value as string | string[]);\n }\n\n options?.onStepComplete?.(currentStep.id, value, state);\n stepsCompleted++;\n } catch (error: unknown) {\n if (!isMock && isUserCancel(error)) {\n await performCancel();\n return state.answers;\n }\n throw error;\n }\n }\n\n // Review screen: after wizard loop completes, before summary\n if (config.meta.review && !isMock && state.status === 'done') {\n const reviewLines: string[] = [];\n for (const step of config.steps) {\n if (step.review?.hide) continue;\n if (step.type === 'note' || step.type === 'message') continue;\n const answer = state.answers[step.id];\n if (answer === undefined) continue;\n const label = step.review?.label ?? step.id;\n const raw = step.type === 'password' ? '****' :\n Array.isArray(answer) ? answer.map(String).join(', ') : String(answer);\n const display = formatReviewValue(raw, step.review?.format);\n reviewLines.push(`${label}: ${display}`);\n }\n\n emitEvent(renderer, { type: 'note', title: 'Review your answers', body: reviewLines.join('\\n') }, theme);\n\n console.log(`\\n ${theme.bold('Review your answers:')}\\n`);\n for (const line of reviewLines) {\n console.log(` ${line}`);\n }\n console.log();\n\n const { confirm: confirmPrompt } = await import('@inquirer/prompts');\n const ok = await confirmPrompt({\n message: 'Everything look right?',\n default: true,\n });\n\n if (ok) {\n needsReview = false;\n } else {\n const { select: selectPrompt } = await import('@inquirer/prompts');\n const stepsWithAnswers = config.steps.filter(\n s => state.answers[s.id] !== undefined && s.type !== 'note' && s.type !== 'message' && !s.review?.hide,\n );\n\n if (stepsWithAnswers.length === 0) {\n needsReview = false;\n break;\n }\n\n const stepToRevisit = await selectPrompt({\n message: 'Which step would you like to change?',\n choices: stepsWithAnswers.map(s => ({\n name: `${s.review?.label ?? s.id}: ${s.type === 'password' ? '****' : String(state.answers[s.id] ?? '')}`,\n value: s.id,\n })),\n });\n\n state = {\n ...state,\n currentStepId: stepToRevisit,\n status: 'running',\n };\n }\n } else {\n needsReview = false;\n }\n }\n\n if (state.status === 'done' && !quiet) {\n renderer.renderSummary(state.answers, config.steps, theme);\n }\n\n if (state.status === 'done' && !isMock) {\n if (config.onComplete) {\n await executeOnComplete(config.onComplete, options?.configFilePath, state.answers, config, theme, renderer);\n }\n if (config.actions && config.actions.length > 0) {\n await executeActions(config.actions, state.answers, theme, renderer);\n }\n }\n\n emitEvent(renderer, { type: 'session:end', answers: state.answers, cancelled: state.status === 'cancelled' }, theme);\n\n if (state.status === 'done' && cacheEnabled) {\n const passwordStepIds = new Set(\n config.steps.filter((s) => s.type === 'password').map((s) => s.id),\n );\n const answersToCache: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state.answers)) {\n if (!passwordStepIds.has(key)) {\n answersToCache[key] = value;\n }\n }\n saveCachedAnswers(config.meta.name, answersToCache, cacheDir);\n }\n\n if (state.status === 'done') {\n clearProgress(config.meta.name);\n }\n\n return state.answers;\n } finally {\n if (signalHandler) {\n process.removeListener('SIGINT', signalHandler);\n process.removeListener('SIGTERM', signalHandler);\n }\n if (userPlugins) {\n clearPlugins();\n }\n }\n}\n\nfunction toStepRecord(step: StepConfig): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(step)) {\n record[key] = val;\n }\n return record;\n}\n\nfunction renderStep(\n renderer: WizardRenderer,\n step: StepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n): Promise<unknown> {\n switch (step.type) {\n case 'text':\n return renderer.renderText(step, state, theme);\n case 'select':\n return renderer.renderSelect(step, state, theme);\n case 'multiselect':\n return renderer.renderMultiSelect(step, state, theme);\n case 'confirm':\n return renderer.renderConfirm(step, state, theme);\n case 'password':\n return renderer.renderPassword(step, state, theme);\n case 'number':\n return renderer.renderNumber(step, state, theme);\n case 'search':\n return renderer.renderSearch(step, state, theme);\n case 'editor':\n return renderer.renderEditor(step, state, theme);\n case 'path':\n return renderer.renderPath(step, state, theme);\n case 'toggle':\n return renderer.renderToggle(step, state, theme);\n case 'message':\n renderer.renderMessage(step, state, theme);\n return Promise.resolve(true);\n case 'note':\n return Promise.resolve(true);\n case 'browser': {\n const resolvedUrl = resolveTemplate(step.url, state.answers);\n console.log(`\\n ${theme.info('→')} ${step.message}`);\n console.log(` ${theme.muted(resolvedUrl)}`);\n openUrl(resolvedUrl);\n if (step.fallback) {\n console.log(` ${theme.muted(step.fallback)}`);\n }\n console.log();\n return Promise.resolve(true);\n }\n }\n}\n\nfunction resolveStepDefaults(\n step: StepConfig,\n cachedAnswers?: Record<string, unknown>,\n): StepConfig {\n switch (step.type) {\n case 'text': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'search': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'editor': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'path': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'select': {\n const envResolved = resolveEnvDefault(step.default);\n const fallback = envResolved ?? getCachedDefault<string>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'number': {\n const resolved = resolveEnvDefaultNumber(step.default);\n const fallback = resolved ?? getCachedDefault<number>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'confirm': {\n const resolved = resolveEnvDefaultBoolean(step.default);\n const fallback = resolved ?? getCachedDefault<boolean>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'toggle': {\n const resolved = resolveEnvDefaultBoolean(step.default);\n const fallback = resolved ?? getCachedDefault<boolean>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'multiselect': {\n const fallback = step.default ?? getCachedDefault<string[]>(step.id, cachedAnswers);\n return { ...step, default: fallback };\n }\n case 'password':\n case 'message':\n case 'note':\n case 'browser':\n return step;\n }\n}\n\nfunction getCachedDefault<T>(\n stepId: string,\n cachedAnswers?: Record<string, unknown>,\n): T | undefined {\n if (!cachedAnswers || !(stepId in cachedAnswers)) return undefined;\n return cachedAnswers[stepId] as T;\n}\n\nfunction applyTemplateDefaults(step: StepConfig, templateAnswers: Record<string, unknown>): StepConfig {\n if (!(step.id in templateAnswers)) return step;\n if (step.type === 'password' || step.type === 'message' || step.type === 'note' || step.type === 'browser') return step;\n\n const value = templateAnswers[step.id];\n\n switch (step.type) {\n case 'text':\n case 'select':\n case 'search':\n case 'editor':\n case 'path':\n return { ...step, default: typeof value === 'string' ? value : step.default };\n case 'number':\n return { ...step, default: typeof value === 'number' ? value : step.default };\n case 'confirm':\n case 'toggle':\n return { ...step, default: typeof value === 'boolean' ? value : step.default };\n case 'multiselect':\n return { ...step, default: Array.isArray(value) ? (value as string[]) : step.default };\n }\n}\n\nfunction isSelectLikeStep(type: string): boolean {\n return type === 'select' || type === 'multiselect' || type === 'search';\n}\n\nfunction applyMruOrdering(step: StepConfig, wizardName: string): StepConfig {\n if (step.type === 'select') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n if (step.type === 'multiselect') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n if (step.type === 'search') {\n return { ...step, options: getOrderedOptions(wizardName, step.id, step.options) };\n }\n return step;\n}\n\nfunction resolveChoiceTemplates(\n options: SelectChoice[],\n answers: Record<string, unknown>,\n): SelectChoice[] {\n return options.map((opt) => {\n if ('separator' in opt) return opt;\n return {\n ...opt,\n label: resolveTemplate(opt.label, answers),\n hint: opt.hint ? resolveTemplate(opt.hint, answers) : undefined,\n };\n });\n}\n\nfunction resolveStepTemplates(step: StepConfig, answers: Record<string, unknown>): StepConfig {\n switch (step.type) {\n case 'text':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'select':\n return {\n ...step,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'multiselect':\n return {\n ...step,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'search':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n options: resolveChoiceTemplates(step.options, answers),\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'path':\n return {\n ...step,\n placeholder: step.placeholder ? resolveTemplate(step.placeholder, answers) : undefined,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'editor':\n return {\n ...step,\n default: step.default ? resolveTemplate(step.default, answers) : undefined,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n case 'password':\n case 'number':\n case 'confirm':\n case 'toggle':\n case 'message':\n case 'note':\n case 'browser':\n return {\n ...step,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n }\n}\n\nasync function executeOnComplete(\n handlerPath: string,\n configFilePath: string | undefined,\n answers: Record<string, unknown>,\n config: WizardConfig,\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): Promise<void> {\n if (renderer) emitEvent(renderer, { type: 'oncomplete:start' }, theme);\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: `Running onComplete handler...` }, theme);\n\n const resolvedPath = configFilePath\n ? resolve(dirname(configFilePath), handlerPath)\n : resolve(handlerPath);\n\n try {\n const mod = await import(pathToFileURL(resolvedPath).href);\n if (typeof mod.default !== 'function') {\n throw new Error(`onComplete handler \"${handlerPath}\" must export a default function`);\n }\n await mod.default({ answers, config });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: 'Handler complete' }, theme);\n if (renderer) emitEvent(renderer, { type: 'oncomplete:pass' }, theme);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n if (renderer) emitEvent(renderer, { type: 'oncomplete:fail', error: message }, theme);\n console.log(`\\n ${theme.error('✗')} onComplete handler failed: ${message}\\n`);\n throw error;\n }\n}\n\nasync function executeActions(\n actions: ActionConfig[],\n answers: Record<string, unknown>,\n theme: ResolvedTheme,\n renderer?: WizardRenderer,\n): Promise<void> {\n if (renderer) emitEvent(renderer, { type: 'actions:start' }, theme);\n console.log(`\\n ${theme.bold('Running actions...')}\\n`);\n\n for (const action of actions) {\n if (action.when && !evaluateCondition(action.when, answers)) {\n continue;\n }\n\n const resolvedCommand = resolveTemplateStrict(action.run, answers);\n const resolvedName = action.name ? resolveTemplateStrict(action.name, answers) : undefined;\n const label = resolvedName ?? resolvedCommand;\n\n if (renderer) emitEvent(renderer, { type: 'spinner:start', message: label }, theme);\n try {\n execSync(resolvedCommand, { stdio: 'pipe' });\n if (renderer) emitEvent(renderer, { type: 'spinner:stop', message: label }, theme);\n console.log(` ${theme.success('✓')} ${label}`);\n if (renderer) emitEvent(renderer, { type: 'action:pass', name: label }, theme);\n } catch {\n if (renderer) emitEvent(renderer, { type: 'spinner:stop' }, theme);\n console.log(` ${theme.error('✗')} ${label}`);\n if (renderer) emitEvent(renderer, { type: 'action:fail', name: label }, theme);\n throw new Error(`Action failed: ${label}`);\n }\n }\n console.log();\n}\n\nfunction printWizardHeader(config: WizardConfig, theme: ResolvedTheme, plain?: boolean): void {\n console.log();\n console.log(renderBanner(config.meta.name, theme, {\n plain,\n icon: config.meta.icon,\n iconSize: config.meta.iconSize,\n font: config.meta.font,\n banner: config.meta.banner,\n subtitle: config.meta.subtitle,\n }));\n if (config.meta.description) {\n console.log(` ${theme.muted(config.meta.description)}`);\n }\n console.log();\n}\n\nfunction openUrl(url: string): void {\n try {\n if (process.platform === 'darwin') {\n execFileSync('open', [url], { stdio: 'ignore' });\n } else if (process.platform === 'win32') {\n const safeUrl = url.replace(/'/g, \"''\");\n execFileSync('powershell', ['-NoProfile', '-Command', `Start-Process '${safeUrl}'`], { stdio: 'ignore' });\n } else {\n execFileSync('xdg-open', [url], { stdio: 'ignore' });\n }\n } catch { }\n}\n\nfunction isUserCancel(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.message.includes('User force closed') ||\n error.name === 'ExitPromptError'\n );\n }\n return false;\n}\n\nfunction formatReviewValue(value: string, format?: string): string {\n switch (format) {\n case 'uppercase': return value.toUpperCase();\n case 'lowercase': return value.toLowerCase();\n case 'capitalize': return value.charAt(0).toUpperCase() + value.slice(1);\n default: return value;\n }\n}\n","import type { Condition, StepConfig } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n\n return current;\n}\n\nexport function evaluateCondition(\n condition: Condition,\n answers: Record<string, unknown>,\n): boolean {\n if ('all' in condition) {\n return condition.all.every((c) => evaluateCondition(c, answers));\n }\n if ('any' in condition) {\n return condition.any.some((c) => evaluateCondition(c, answers));\n }\n if ('not' in condition) {\n return !evaluateCondition(condition.not, answers);\n }\n\n const value = getValueByPath(answers, condition.field);\n\n if ('isEmpty' in condition) {\n if (value === undefined || value === null) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n }\n if ('isNotEmpty' in condition) {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n }\n\n if (value === undefined || value === null) {\n return false;\n }\n\n if ('equals' in condition) {\n return value === condition.equals;\n }\n if ('notEquals' in condition) {\n return value !== condition.notEquals;\n }\n if ('includes' in condition) {\n if (Array.isArray(value)) {\n return value.includes(condition.includes);\n }\n if (typeof value === 'string' && typeof condition.includes === 'string') {\n return value.includes(condition.includes);\n }\n return false;\n }\n if ('notIncludes' in condition) {\n if (Array.isArray(value)) {\n return !value.includes(condition.notIncludes);\n }\n if (typeof value === 'string' && typeof condition.notIncludes === 'string') {\n return !value.includes(condition.notIncludes);\n }\n return false;\n }\n if ('greaterThan' in condition) {\n return typeof value === 'number' && value > condition.greaterThan;\n }\n if ('lessThan' in condition) {\n return typeof value === 'number' && value < condition.lessThan;\n }\n\n return false;\n}\n\nexport function isStepVisible(\n step: StepConfig,\n answers: Record<string, unknown>,\n): boolean {\n if (!step.when) {\n return true;\n }\n return evaluateCondition(step.when, answers);\n}\n","import type {\n StepConfig,\n ValidationRule,\n WizardConfig,\n WizardState,\n WizardTransition,\n} from './types';\nimport { isStepVisible } from './conditions';\n\nexport function createWizardState(config: WizardConfig): WizardState {\n const firstVisible = config.steps.find((s) => isStepVisible(s, {}));\n if (!firstVisible) {\n throw new Error('No visible steps in wizard configuration');\n }\n\n return {\n currentStepId: firstVisible.id,\n answers: {},\n history: [],\n status: 'running',\n errors: {},\n };\n}\n\nexport function validateStepAnswer(\n step: StepConfig,\n value: unknown,\n): string | null {\n if (step.type === 'message') {\n return null;\n }\n\n const isRequired = step.required !== false;\n\n if (isRequired) {\n if (value === undefined || value === null || value === '') {\n return 'This field is required';\n }\n if (Array.isArray(value) && value.length === 0) {\n return 'This field is required';\n }\n }\n\n if ((step.type === 'text' || step.type === 'password' || step.type === 'editor' || step.type === 'path') && step.validate) {\n const strValue = typeof value === 'string' ? value : String(value ?? '');\n for (const rule of step.validate) {\n const error = applyValidationRule(rule, strValue);\n if (error) return error;\n }\n }\n\n if (step.type === 'number' && typeof value === 'number') {\n if (step.min !== undefined && value < step.min) {\n return `Must be at least ${String(step.min)}`;\n }\n if (step.max !== undefined && value > step.max) {\n return `Must be at most ${String(step.max)}`;\n }\n }\n\n if (step.type === 'multiselect' && Array.isArray(value)) {\n if (step.min !== undefined && value.length < step.min) {\n return `Select at least ${String(step.min)} option${step.min === 1 ? '' : 's'}`;\n }\n if (step.max !== undefined && value.length > step.max) {\n return `Select at most ${String(step.max)} option${step.max === 1 ? '' : 's'}`;\n }\n }\n\n return null;\n}\n\nexport function resolveNextStep(\n config: WizardConfig,\n currentStep: StepConfig,\n answer: unknown,\n answers: Record<string, unknown>,\n): string {\n let targetId: string | undefined;\n\n if (currentStep.type === 'select' && currentStep.routes) {\n const route = currentStep.routes[String(answer)];\n if (route === '__done__') return '__done__';\n if (route) targetId = route;\n }\n\n if (!targetId && currentStep.next) {\n if (currentStep.next === '__done__') return '__done__';\n targetId = currentStep.next;\n }\n\n if (!targetId) {\n const currentIndex = config.steps.findIndex(s => s.id === currentStep.id);\n const nextInArray = config.steps[currentIndex + 1];\n if (!nextInArray) return '__done__';\n targetId = nextInArray.id;\n }\n\n const targetIndex = config.steps.findIndex(s => s.id === targetId);\n if (targetIndex < 0) return '__done__';\n\n for (let i = targetIndex; i < config.steps.length; i++) {\n const step = config.steps[i];\n if (step && isStepVisible(step, answers)) {\n return step.id;\n }\n }\n\n return '__done__';\n}\n\nexport function getVisibleSteps(\n config: WizardConfig,\n answers: Record<string, unknown>,\n): StepConfig[] {\n return config.steps.filter(s => isStepVisible(s, answers));\n}\n\nexport function wizardReducer(\n state: WizardState,\n transition: WizardTransition,\n config: WizardConfig,\n): WizardState {\n switch (transition.type) {\n case 'NEXT': {\n const currentStep = findStepOrThrow(config, state.currentStepId);\n\n const validationError = validateStepAnswer(currentStep, transition.value);\n if (validationError) {\n return {\n ...state,\n errors: { ...state.errors, [state.currentStepId]: validationError },\n };\n }\n\n const isDisplayOnly = currentStep.type === 'note' || currentStep.type === 'message' || currentStep.type === 'browser';\n const updatedAnswers = isDisplayOnly\n ? { ...state.answers }\n : {\n ...state.answers,\n [state.currentStepId]: transition.value,\n };\n\n const nextStepId = resolveNextStep(\n config,\n currentStep,\n transition.value,\n updatedAnswers,\n );\n\n if (nextStepId === '__done__') {\n return {\n ...state,\n answers: updatedAnswers,\n history: [...state.history, state.currentStepId],\n status: 'done',\n errors: {},\n };\n }\n\n const finalAnswers = cleanOrphanedAnswers(\n config,\n updatedAnswers,\n state.currentStepId,\n nextStepId,\n );\n\n return {\n ...state,\n currentStepId: nextStepId,\n answers: finalAnswers,\n history: [...state.history, state.currentStepId],\n status: 'running',\n errors: {},\n };\n }\n\n case 'BACK': {\n if (state.history.length === 0) {\n return state;\n }\n\n const previousStepId = state.history[state.history.length - 1]!;\n const currentStep = config.steps.find(s => s.id === state.currentStepId);\n const newAnswers = { ...state.answers };\n\n if (currentStep && currentStep.keepValuesOnPrevious === false) {\n delete newAnswers[currentStep.id];\n }\n\n return {\n ...state,\n currentStepId: previousStepId,\n answers: newAnswers,\n history: state.history.slice(0, -1),\n status: 'running',\n errors: {},\n };\n }\n\n case 'JUMP': {\n findStepOrThrow(config, transition.stepId);\n\n return {\n ...state,\n currentStepId: transition.stepId,\n history: [...state.history, state.currentStepId],\n status: 'running',\n errors: {},\n };\n }\n\n case 'CANCEL': {\n return { ...state, status: 'cancelled' };\n }\n }\n}\n\nfunction findStepOrThrow(config: WizardConfig, stepId: string): StepConfig {\n const step = config.steps.find(s => s.id === stepId);\n if (!step) {\n throw new Error(`Step not found: \"${stepId}\"`);\n }\n return step;\n}\n\nfunction cleanOrphanedAnswers(\n config: WizardConfig,\n answers: Record<string, unknown>,\n _fromStepId: string,\n _toStepId: string,\n): Record<string, unknown> {\n const cleaned = { ...answers };\n for (const step of config.steps) {\n if (step.id in cleaned && !isStepVisible(step, cleaned)) {\n delete cleaned[step.id];\n }\n }\n return cleaned;\n}\n\nfunction applyValidationRule(rule: ValidationRule, value: string): string | null {\n switch (rule.rule) {\n case 'required':\n return !value.trim() ? (rule.message ?? 'This field is required') : null;\n case 'minLength':\n return value.length < rule.value\n ? (rule.message ?? `Must be at least ${String(rule.value)} characters`)\n : null;\n case 'maxLength':\n return value.length > rule.value\n ? (rule.message ?? `Must be at most ${String(rule.value)} characters`)\n : null;\n case 'pattern': {\n const regex = new RegExp(rule.value);\n return !regex.test(value)\n ? (rule.message ?? `Must match pattern: ${rule.value}`)\n : null;\n }\n case 'min':\n case 'max':\n default:\n return null;\n }\n}\n","import chalk from 'chalk';\nimport type { ThemeConfig, ResolvedTheme, ProgressBarStyle, ResolvedProgressBar } from './types';\nimport { THEME_PRESETS } from './themes/presets';\nimport { resolveSpinner } from './spinners';\n\nconst DEFAULT_TOKENS = {\n primary: '#5B9BD5',\n success: '#6BCB77',\n error: '#FF6B6B',\n warning: '#FFD93D',\n info: '#4D96FF',\n muted: '#888888',\n accent: '#C084FC',\n highlight: '#5B9BD5',\n highlightBg: '#1E1E2E',\n pointer: '#C084FC',\n checked: '#6BCB77',\n dimmed: '#555555',\n} as const;\n\nconst DEFAULT_ICONS = {\n step: '\\u25CF',\n stepDone: '\\u2713',\n stepPending: '\\u25CB',\n pointer: '\\u203A',\n} as const;\n\nconst PROGRESS_BAR_CHARS: Record<ProgressBarStyle, { filled: string; empty: string }> = {\n blocks: { filled: '\\u2588', empty: '\\u2591' },\n line: { filled: '\\u2500', empty: '\\u2500' },\n dots: { filled: '\\u2022', empty: '\\u00B7' },\n arrow: { filled: '\\u2550', empty: '\\u2500' },\n};\n\nfunction resolveProgressBar(config?: ThemeConfig['progressBar'], tokens?: Record<string, string>): ResolvedProgressBar {\n const style: ProgressBarStyle = config?.style ?? 'blocks';\n const chars = PROGRESS_BAR_CHARS[style];\n const filledHex = config?.filledColor ?? tokens?.success ?? DEFAULT_TOKENS.success;\n const emptyHex = config?.emptyColor ?? tokens?.muted ?? DEFAULT_TOKENS.muted;\n\n return {\n width: config?.width ?? 20,\n filledColor: chalk.hex(filledHex),\n emptyColor: chalk.hex(emptyHex),\n style,\n chars,\n };\n}\n\nexport function resolveTheme(themeConfig?: ThemeConfig): ResolvedTheme {\n const presetTokens = themeConfig?.preset ? THEME_PRESETS[themeConfig.preset] : undefined;\n const tokens = { ...DEFAULT_TOKENS, ...presetTokens, ...themeConfig?.tokens };\n const icons = { ...DEFAULT_ICONS, ...themeConfig?.icons };\n\n return {\n primary: chalk.hex(tokens.primary),\n success: chalk.hex(tokens.success),\n error: chalk.hex(tokens.error),\n warning: chalk.hex(tokens.warning),\n info: chalk.hex(tokens.info),\n muted: chalk.hex(tokens.muted),\n accent: chalk.hex(tokens.accent),\n highlight: chalk.hex(tokens.highlight),\n highlightBg: chalk.bgHex(tokens.highlightBg),\n pointer: chalk.hex(tokens.pointer),\n checked: chalk.hex(tokens.checked),\n dimmed: chalk.hex(tokens.dimmed),\n bold: chalk.bold,\n icons,\n spinner: resolveSpinner(themeConfig?.spinner),\n spinnerElapsed: themeConfig?.spinnerElapsed ?? false,\n progressBar: resolveProgressBar(themeConfig?.progressBar, tokens),\n };\n}\n","export interface PresetTokens {\n primary: string;\n success: string;\n error: string;\n warning: string;\n info: string;\n muted: string;\n accent: string;\n}\n\nexport const THEME_PRESETS: Record<string, PresetTokens> = {\n default: {\n primary: '#7C3AED',\n success: '#10B981',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#3B82F6',\n muted: '#6B7280',\n accent: '#8B5CF6',\n },\n catppuccin: {\n primary: '#cba6f7',\n success: '#a6e3a1',\n error: '#f38ba8',\n warning: '#fab387',\n info: '#74c7ec',\n muted: '#6c7086',\n accent: '#f5c2e7',\n },\n dracula: {\n primary: '#bd93f9',\n success: '#50fa7b',\n error: '#ff5555',\n warning: '#ffb86c',\n info: '#8be9fd',\n muted: '#6272a4',\n accent: '#ff79c6',\n },\n nord: {\n primary: '#88c0d0',\n success: '#a3be8c',\n error: '#bf616a',\n warning: '#ebcb8b',\n info: '#81a1c1',\n muted: '#4c566a',\n accent: '#b48ead',\n },\n tokyonight: {\n primary: '#7aa2f7',\n success: '#9ece6a',\n error: '#f7768e',\n warning: '#e0af68',\n info: '#7dcfff',\n muted: '#565f89',\n accent: '#bb9af7',\n },\n monokai: {\n primary: '#ab9df2',\n success: '#a9dc76',\n error: '#ff6188',\n warning: '#ffd866',\n info: '#78dce8',\n muted: '#727072',\n accent: '#fc9867',\n },\n};\n\nexport const PRESET_NAMES = Object.keys(THEME_PRESETS) as string[];\n","export interface SpinnerConfig {\n frames: string[];\n interval: number;\n}\n\nexport const spinners = {\n dots: { interval: 80, frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] },\n dots2: { interval: 80, frames: ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'] },\n line: { interval: 130, frames: ['-', '\\\\', '|', '/'] },\n arc: { interval: 100, frames: ['◜', '◠', '◝', '◞', '◡', '◟'] },\n circle: { interval: 80, frames: ['◒', '◐', '◓', '◑'] },\n circleHalves: { interval: 50, frames: ['◐', '◓', '◑', '◒'] },\n triangle: { interval: 50, frames: ['◢', '◣', '◤', '◥'] },\n pipe: { interval: 100, frames: ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'] },\n arrow: { interval: 100, frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'] },\n arrow3: { interval: 120, frames: ['▹▹▹▹▹', '▸▹▹▹▹', '▹▸▹▹▹', '▹▹▸▹▹', '▹▹▹▸▹', '▹▹▹▹▸'] },\n bouncingBar: { interval: 80, frames: ['[ ]', '[= ]', '[== ]', '[=== ]', '[====]', '[ ===]', '[ ==]', '[ =]', '[ ]', '[ =]', '[ ==]', '[ ===]', '[====]', '[=== ]', '[== ]', '[= ]'] },\n bouncingBall: { interval: 80, frames: ['( ● )', '( ● )', '( ● )', '( ● )', '( ●)', '( ● )', '( ● )', '( ● )', '( ● )', '(● )'] },\n simpleDots: { interval: 400, frames: ['. ', '.. ', '...', ' '] },\n aesthetic: { interval: 80, frames: ['▰▱▱▱▱▱▱', '▰▰▱▱▱▱▱', '▰▰▰▱▱▱▱', '▰▰▰▰▱▱▱', '▰▰▰▰▰▱▱', '▰▰▰▰▰▰▱', '▰▰▰▰▰▰▰', '▰▱▱▱▱▱▱'] },\n star: { interval: 70, frames: ['✶', '✸', '✹', '✺', '✹', '✷'] },\n} as const satisfies Record<string, SpinnerConfig>;\n\nexport type SpinnerName = keyof typeof spinners;\n\nexport const DEFAULT_SPINNER: SpinnerName = 'circle';\n\nexport function resolveSpinner(\n config?: string | { frames: string[]; interval?: number },\n): SpinnerConfig {\n if (!config) {\n return spinners[DEFAULT_SPINNER];\n }\n if (typeof config === 'string') {\n if (config in spinners) {\n return spinners[config as SpinnerName];\n }\n throw new Error(`Unknown spinner preset: \"${config}\". Available: ${Object.keys(spinners).join(', ')}`);\n }\n return {\n frames: config.frames,\n interval: config.interval ?? 80,\n };\n}\n","import {\n input,\n select,\n checkbox,\n confirm,\n password,\n number,\n search,\n editor,\n Separator,\n} from '@inquirer/prompts';\nimport type {\n ConfirmStepConfig,\n EditorStepConfig,\n MessageStepConfig,\n MultiSelectStepConfig,\n NoteStepConfig,\n NoteStyle,\n NumberStepConfig,\n PasswordStepConfig,\n PathStepConfig,\n ResolvedTheme,\n SearchStepConfig,\n SelectOption,\n SelectStepConfig,\n StepConfig,\n TextStepConfig,\n ToggleStepConfig,\n WizardRenderer,\n WizardState,\n} from '../types';\n\nexport class InquirerRenderer implements WizardRenderer {\n renderStepHeader(\n stepIndex: number,\n totalVisible: number,\n message: string,\n theme: ResolvedTheme,\n description?: string,\n ): void {\n const pb = theme.progressBar;\n const filledCount = totalVisible > 0 ? Math.round((stepIndex / totalVisible) * pb.width) : 0;\n const remainingCount = pb.width - filledCount;\n const filledBar = pb.filledColor(pb.chars.filled.repeat(filledCount));\n const remainingBar = pb.emptyColor(pb.chars.empty.repeat(remainingCount));\n const counter = theme.muted(`Step ${String(stepIndex + 1)}/${String(totalVisible)}`);\n const stepMessage = theme.muted(`\\u2014 ${message}`);\n console.log(`\\n [${filledBar}${remainingBar}] ${counter} ${stepMessage}`);\n if (description) {\n console.log(` ${theme.muted(description)}`);\n }\n }\n\n renderNote(step: NoteStepConfig, theme: ResolvedTheme): void {\n const title = step.message;\n const body = step.description ?? '';\n const style = step.style ?? 'info';\n\n const { colorFn, icon } = getNoteStyleConfig(style, theme);\n\n if (style === 'banner') {\n const width = Math.max(4, (process.stdout.columns ?? 60) - 4);\n const rule = colorFn('─'.repeat(width));\n console.log();\n console.log(` ${rule}`);\n console.log(` ${colorFn(icon)} ${theme.bold(title)}`);\n if (body) console.log(` ${theme.muted(body)}`);\n console.log(` ${rule}`);\n console.log();\n return;\n }\n\n const border = colorFn('\\u2502');\n const topRule = colorFn(`\\u250C${'─'.repeat(2)}`);\n const bottomRule = colorFn(`\\u2514${'─'.repeat(2)}`);\n\n console.log();\n console.log(` ${topRule} ${colorFn(icon)} ${theme.bold(title)}`);\n if (body) {\n for (const line of body.split('\\n')) {\n if (style === 'code') {\n console.log(` ${border} ${theme.muted(line)}`);\n } else {\n console.log(` ${border} ${line}`);\n }\n }\n }\n console.log(` ${bottomRule}`);\n console.log();\n }\n\n async renderText(\n step: TextStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string'\n ? existingAnswer\n : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderSelect(\n step: SelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n const rawChoices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n disabled: opt.disabled,\n };\n });\n\n const itemChoices = rawChoices.filter((c): c is Exclude<typeof c, InstanceType<typeof Separator>> => !(c instanceof Separator));\n const columnedItems = step.columns ? applyColumns(itemChoices, step.columns) : itemChoices;\n let itemIdx = 0;\n const choices = rawChoices.map(c => c instanceof Separator ? c : columnedItems[itemIdx++] ?? c);\n\n return select({\n message: step.message,\n choices,\n default: defaultValue,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: {\n prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone },\n icon: { cursor: theme.icons.pointer },\n style: { disabled: theme.dimmed },\n },\n });\n }\n\n async renderMultiSelect(\n step: MultiSelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string[]> {\n const existingAnswer = state.answers[step.id];\n const previousSelections: string[] | undefined = Array.isArray(existingAnswer)\n ? existingAnswer.filter((v): v is string => typeof v === 'string')\n : step.default;\n\n const rawChoices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n checked: previousSelections?.includes(opt.value) ?? false,\n disabled: opt.disabled,\n };\n });\n\n const itemChoices = rawChoices.filter((c): c is Exclude<typeof c, InstanceType<typeof Separator>> => !(c instanceof Separator));\n const columnedItems = step.columns ? applyColumns(itemChoices, step.columns) : itemChoices;\n let itemIdx = 0;\n const choices = rawChoices.map(c => c instanceof Separator ? c : columnedItems[itemIdx++] ?? c);\n\n return checkbox({\n message: step.message,\n choices,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: {\n prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone },\n icon: { cursor: theme.icons.pointer, checked: theme.checked('\\u2714'), unchecked: theme.muted('\\u25CB') },\n style: { disabledChoice: theme.dimmed },\n },\n });\n }\n\n async renderConfirm(\n step: ConfirmStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'boolean' ? existingAnswer : step.default;\n\n return confirm({\n message: step.message,\n default: defaultValue ?? true,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPassword(\n step: PasswordStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return password({\n message: step.message,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderNumber(\n step: NumberStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<number> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'number' ? existingAnswer : step.default;\n\n const result = await number({\n message: step.message,\n default: defaultValue,\n min: step.min,\n max: step.max,\n step: step.step,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result ?? defaultValue ?? 0;\n }\n\n async renderSearch(\n step: SearchStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const message = step.placeholder\n ? `${step.message} ${theme.muted(`(${step.placeholder})`)}`\n : step.message;\n return search({\n message,\n source: (input) => {\n const term = (input ?? '').toLowerCase();\n const filtered = step.options\n .filter((opt): opt is SelectOption => 'value' in opt)\n .filter((opt) => !opt.disabled && opt.label.toLowerCase().includes(term))\n .map((opt) => ({\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n }));\n return step.columns ? applyColumns(filtered, step.columns) : filtered;\n },\n pageSize: step.pageSize,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderEditor(\n step: EditorStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return editor({\n message: step.message,\n default: step.default,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPath(\n step: PathStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderToggle(\n step: ToggleStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const activeLabel = step.active ?? 'On';\n const inactiveLabel = step.inactive ?? 'Off';\n\n const defaultValue =\n typeof existingAnswer === 'boolean'\n ? (existingAnswer ? activeLabel : inactiveLabel)\n : (step.default === true ? activeLabel : inactiveLabel);\n\n const result = await select({\n message: step.message,\n choices: [\n { name: activeLabel, value: activeLabel },\n { name: inactiveLabel, value: inactiveLabel },\n ],\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result === activeLabel;\n }\n\n renderMessage(step: MessageStepConfig, _state: WizardState, theme: ResolvedTheme): void {\n if (step.description) {\n console.log(` ${theme.muted(step.description)}`);\n }\n console.log();\n }\n\n renderGroupHeader(group: string, theme: ResolvedTheme): void {\n console.log(`\\n ${theme.accent('\\u2500\\u2500')} ${theme.bold(group)} ${theme.accent('\\u2500\\u2500')}\\n`);\n }\n\n renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n console.log(`\\n${theme.muted('\\u2500'.repeat(40))}`);\n console.log(` ${theme.bold('Summary')}\\n`);\n\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n\n console.log(\n ` ${theme.muted(step.id.padEnd(20))} ${theme.primary(display)}`,\n );\n }\n\n console.log(theme.muted('\\u2500'.repeat(40)));\n }\n\n clear(): void {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n }\n\n}\n\nconst NOTE_STYLE_MAP: Record<NoteStyle, { tokenKey: keyof ResolvedTheme; icon: string }> = {\n info: { tokenKey: 'info', icon: '\\u2139' },\n warning: { tokenKey: 'warning', icon: '\\u26A0' },\n error: { tokenKey: 'error', icon: '\\u2716' },\n success: { tokenKey: 'success', icon: '\\u2714' },\n code: { tokenKey: 'muted', icon: '\\u276F' },\n banner: { tokenKey: 'primary', icon: '\\u2605' },\n};\n\nfunction getNoteStyleConfig(\n style: NoteStyle,\n theme: ResolvedTheme,\n): { colorFn: (text: string) => string; icon: string } {\n const entry = NOTE_STYLE_MAP[style];\n return {\n colorFn: theme[entry.tokenKey] as (text: string) => string,\n icon: entry.icon,\n };\n}\n\nexport function applyColumns<T extends { name: string; value: string; description?: string; disabled?: boolean | string }>(\n items: T[],\n columns: number,\n): T[] {\n const cols = Math.max(1, Math.floor(columns));\n if (cols <= 1) return items;\n if (items.length === 0) return items;\n\n const maxLabel = Math.max(...items.map(i => i.name.length));\n const colWidth = maxLabel + 4;\n\n const grouped: T[][] = [];\n for (let i = 0; i < items.length; i += cols) {\n grouped.push(items.slice(i, i + cols));\n }\n\n const result: T[] = [];\n for (const row of grouped) {\n for (let c = 0; c < row.length; c++) {\n const item = row[c]!;\n const isLast = c === row.length - 1;\n const paddedName = isLast ? item.name : item.name.padEnd(colWidth);\n result.push({ ...item, name: paddedName });\n }\n }\n return result;\n}\n","export function resolveEnvDefault(value: string | undefined): string | undefined {\n if (typeof value !== 'string') return value;\n if (!value.startsWith('$')) return value;\n const envKey = value.slice(1);\n return process.env[envKey] ?? value;\n}\n\nexport function resolveEnvDefaultNumber(value: number | string | undefined): number | undefined {\n if (typeof value === 'number') return value;\n const resolved = resolveEnvDefault(typeof value === 'string' ? value : undefined);\n if (resolved === undefined) return undefined;\n const num = Number(resolved);\n return Number.isNaN(num) ? undefined : num;\n}\n\nexport function resolveEnvDefaultBoolean(value: boolean | string | undefined): boolean | undefined {\n if (typeof value === 'boolean') return value;\n const resolved = resolveEnvDefault(typeof value === 'string' ? value : undefined);\n if (resolved === undefined) return undefined;\n return resolved === 'true' || resolved === '1';\n}\n","/**\n * Resolve {{stepId}} placeholders in a template string.\n * Array values are joined with \", \". Unresolved placeholders remain as-is.\n */\nexport function resolveTemplate(template: string, answers: Record<string, unknown>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, key: string) => {\n const trimmedKey = key.trim();\n if (trimmedKey in answers) {\n const value = answers[trimmedKey];\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n }\n return _match;\n });\n}\n\n/**\n * Resolve {{stepId}} placeholders strictly — throws if any placeholder\n * references a step-id not found in the answers map.\n * Used by actions where missing answers indicate a config error.\n */\nexport function resolveTemplateStrict(template: string, answers: Record<string, unknown>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, key: string) => {\n const trimmedKey = key.trim();\n if (!(trimmedKey in answers)) {\n throw new Error(`Action references unknown step \"${trimmedKey}\"`);\n }\n const value = answers[trimmedKey];\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n });\n}\n","import figlet from 'figlet';\nimport gradient from 'gradient-string';\nimport type { ResolvedTheme } from './types';\n\nconst GRIMOIRE_GRADIENT = gradient(['#C084FC', '#5B9BD5', '#6BCB77']);\n\nexport interface BannerOptions {\n plain?: boolean;\n icon?: string;\n iconSize?: 'small' | 'medium' | 'large' | number;\n font?: string;\n banner?: string | ((theme: ResolvedTheme) => string);\n subtitle?: string;\n}\n\nexport function renderBanner(\n name: string,\n theme: ResolvedTheme,\n options?: BannerOptions,\n): string {\n const icon = options?.icon;\n const prefix = icon ? `${icon} ` : '';\n\n if (options?.plain) {\n const line = ` ${prefix}${theme.bold(name)}`;\n return options?.subtitle ? `${line}\\n ${theme.muted(options.subtitle)}` : line;\n }\n\n if (options?.banner) {\n const bannerStr = (typeof options.banner === 'function'\n ? options.banner(theme)\n : options.banner).replace(/\\n$/, '');\n const raw = bannerStr.split('\\n');\n const mid = Math.floor(raw.length / 2);\n const bannerLines = raw.map((l, i) => {\n if (icon && i === mid) return ` ${icon} ${l}`;\n return icon ? ` ${l}` : ` ${l}`;\n }).join('\\n');\n const colored = typeof options.banner === 'function' ? bannerLines : GRIMOIRE_GRADIENT(bannerLines);\n return options?.subtitle ? `${colored}\\n ${theme.muted(options.subtitle)}` : colored;\n }\n\n try {\n const requestedFont = (options?.font ?? 'Small') as figlet.Fonts;\n let art: string;\n try {\n art = figlet.textSync(name, { font: requestedFont, horizontalLayout: 'default' });\n } catch {\n art = figlet.textSync(name, { font: 'Small', horizontalLayout: 'default' });\n }\n\n const artLines = art.split('\\n');\n const lines = artLines\n .map((line, i) => {\n const iconStr = getIconForLine(icon, options?.iconSize, i, artLines.length);\n if (iconStr !== undefined) {\n return ` ${iconStr}${line}`;\n }\n return icon ? ` ${line}` : ` ${line}`;\n })\n .join('\\n');\n\n const colored = GRIMOIRE_GRADIENT(lines);\n return options?.subtitle ? `${colored}\\n ${theme.muted(options.subtitle)}` : colored;\n } catch {\n const line = ` ${prefix}${theme.bold(name)}`;\n return options?.subtitle ? `${line}\\n ${theme.muted(options.subtitle)}` : line;\n }\n}\n\nfunction getIconForLine(\n icon: string | undefined,\n iconSize: 'small' | 'medium' | 'large' | number | undefined,\n lineIndex: number,\n totalLines: number,\n): string | undefined {\n if (!icon) return undefined;\n\n const mid = Math.floor(totalLines / 2);\n const span = resolveIconSpan(iconSize, totalLines);\n const halfSpan = Math.floor(span / 2);\n const start = Math.max(0, mid - halfSpan);\n const end = Math.min(totalLines - 1, start + span - 1);\n\n if (lineIndex >= start && lineIndex <= end) {\n return lineIndex === mid ? `${icon} ` : ` `;\n }\n return undefined;\n}\n\nfunction resolveIconSpan(\n iconSize: 'small' | 'medium' | 'large' | number | undefined,\n totalLines: number,\n): number {\n if (typeof iconSize === 'number') {\n const clamped = Math.max(1, Math.floor(isFinite(iconSize) ? iconSize : 1));\n return Math.min(clamped, totalLines);\n }\n switch (iconSize ?? 'small') {\n case 'small': return 1;\n case 'medium': return 3;\n case 'large': return totalLines;\n }\n}\n","import type { WizardState, ResolvedTheme } from './types';\n\n// ─── Plugin Interfaces ──────────────────────────────────────────────────────\n\nexport interface StepPlugin {\n render(config: Record<string, unknown>, state: WizardState, theme: ResolvedTheme): Promise<unknown>;\n validate?(value: unknown, config: Record<string, unknown>): string | null;\n}\n\nexport interface GrimoirePlugin {\n name: string;\n steps: Record<string, StepPlugin>;\n}\n\n// ─── Built-in Step Types (protected from override) ──────────────────────────\n\nconst BUILT_IN_STEP_TYPES = new Set([\n 'text',\n 'select',\n 'multiselect',\n 'confirm',\n 'password',\n 'number',\n 'search',\n 'editor',\n 'path',\n 'toggle',\n]);\n\n// ─── Plugin Registry ────────────────────────────────────────────────────────\n\nconst pluginStepRegistry = new Map<string, StepPlugin>();\n\nexport function registerPlugin(plugin: GrimoirePlugin): void {\n for (const [stepType, stepPlugin] of Object.entries(plugin.steps)) {\n if (BUILT_IN_STEP_TYPES.has(stepType)) {\n throw new Error(`Cannot override built-in step type \"${stepType}\"`);\n }\n if (pluginStepRegistry.has(stepType)) {\n throw new Error(`Step type \"${stepType}\" is already registered`);\n }\n pluginStepRegistry.set(stepType, stepPlugin);\n }\n}\n\nexport function getPluginStep(stepType: string): StepPlugin | undefined {\n return pluginStepRegistry.get(stepType);\n}\n\nexport function clearPlugins(): void {\n pluginStepRegistry.clear();\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst DEFAULT_CACHE_DIR = join(homedir(), '.config', 'grimoire', 'cache');\n\nexport function slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function getCacheDir(customDir?: string): string {\n return customDir ?? DEFAULT_CACHE_DIR;\n}\n\nfunction getCacheFilePath(wizardName: string, customDir?: string): string {\n return join(getCacheDir(customDir), `${slugify(wizardName)}.json`);\n}\n\nexport function loadCachedAnswers(\n wizardName: string,\n customDir?: string,\n): Record<string, unknown> | undefined {\n try {\n const filePath = getCacheFilePath(wizardName, customDir);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function saveCachedAnswers(\n wizardName: string,\n answers: Record<string, unknown>,\n customDir?: string,\n): void {\n try {\n const dir = getCacheDir(customDir);\n mkdirSync(dir, { recursive: true });\n const filePath = getCacheFilePath(wizardName, customDir);\n writeFileSync(filePath, JSON.stringify(answers, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function clearCache(wizardName?: string, customDir?: string): void {\n try {\n const dir = getCacheDir(customDir);\n if (wizardName) {\n const filePath = getCacheFilePath(wizardName, customDir);\n unlinkSync(filePath);\n } else {\n const files = readdirSync(dir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n unlinkSync(join(dir, file));\n }\n }\n }\n } catch { }\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { slugify } from './cache';\n\nconst DEFAULT_PROGRESS_DIR = join(homedir(), '.config', 'grimoire', 'progress');\n\nexport interface SavedProgress {\n currentStepId: string;\n answers: Record<string, unknown>;\n history: string[];\n savedAt: string;\n}\n\nfunction getProgressFilePath(wizardName: string, customDir?: string): string {\n const dir = customDir ?? DEFAULT_PROGRESS_DIR;\n return join(dir, `${slugify(wizardName)}.json`);\n}\n\nexport function saveProgress(\n wizardName: string,\n state: { currentStepId: string; answers: Record<string, unknown>; history: string[] },\n customDir?: string,\n excludeStepIds?: string[],\n): void {\n try {\n const dir = customDir ?? DEFAULT_PROGRESS_DIR;\n mkdirSync(dir, { recursive: true });\n\n const excludeSet = new Set(excludeStepIds ?? []);\n const filteredAnswers: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state.answers)) {\n if (!excludeSet.has(key)) {\n filteredAnswers[key] = value;\n }\n }\n\n const progress: SavedProgress = {\n currentStepId: state.currentStepId,\n answers: filteredAnswers,\n history: state.history,\n savedAt: new Date().toISOString(),\n };\n\n const filePath = getProgressFilePath(wizardName, customDir);\n writeFileSync(filePath, JSON.stringify(progress, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function loadProgress(\n wizardName: string,\n customDir?: string,\n): SavedProgress | null {\n try {\n const filePath = getProgressFilePath(wizardName, customDir);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n !Array.isArray(parsed) &&\n 'currentStepId' in parsed &&\n 'answers' in parsed &&\n 'history' in parsed &&\n 'savedAt' in parsed\n ) {\n return parsed as SavedProgress;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function clearProgress(\n wizardName: string,\n customDir?: string,\n): void {\n try {\n const filePath = getProgressFilePath(wizardName, customDir);\n unlinkSync(filePath);\n } catch { }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { SelectChoice } from './types';\n\n// ─── MRU Storage Path ────────────────────────────────────────────────────────\n\nconst MRU_DIR = join(homedir(), '.config', 'grimoire', 'mru');\n\ntype MruStepData = Record<string, number>;\ntype MruWizardData = Record<string, MruStepData>;\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\nfunction getMruFilePath(wizardName: string): string {\n const safeName = wizardName.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(MRU_DIR, `${safeName}.json`);\n}\n\nfunction loadMruData(wizardName: string): MruWizardData {\n const filePath = getMruFilePath(wizardName);\n try {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return {};\n }\n return parsed as MruWizardData;\n } catch {\n return {};\n }\n}\n\nfunction saveMruData(wizardName: string, data: MruWizardData): void {\n const filePath = getMruFilePath(wizardName);\n try {\n mkdirSync(MRU_DIR, { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n } catch {\n // Silent fail — MRU is non-critical\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function recordSelection(\n wizardName: string,\n stepId: string,\n value: string | string[],\n): void {\n const data = loadMruData(wizardName);\n const stepData: MruStepData = data[stepId] ?? {};\n\n const values = Array.isArray(value) ? value : [value];\n for (const v of values) {\n stepData[v] = (stepData[v] ?? 0) + 1;\n }\n\n data[stepId] = stepData;\n saveMruData(wizardName, data);\n}\n\nexport function getOrderedOptions(\n wizardName: string,\n stepId: string,\n options: SelectChoice[],\n): SelectChoice[] {\n const data = loadMruData(wizardName);\n const stepData: MruStepData = data[stepId] ?? {};\n\n if (Object.keys(stepData).length === 0) {\n return options;\n }\n\n const separatorIndices = new Map<number, SelectChoice>();\n const selectableOptions: SelectChoice[] = [];\n\n for (let i = 0; i < options.length; i++) {\n const opt = options[i]!;\n if ('separator' in opt) {\n separatorIndices.set(i, opt);\n } else {\n selectableOptions.push(opt);\n }\n }\n\n const sorted = [...selectableOptions].sort((a, b) => {\n if (!('value' in a) || !('value' in b)) return 0;\n const countA = stepData[a.value] ?? 0;\n const countB = stepData[b.value] ?? 0;\n return countB - countA;\n });\n\n const result: SelectChoice[] = [];\n let sortedIndex = 0;\n\n for (let i = 0; i < options.length; i++) {\n const sep = separatorIndices.get(i);\n if (sep) {\n result.push(sep);\n } else {\n const next = sorted[sortedIndex];\n if (next) {\n result.push(next);\n }\n sortedIndex++;\n }\n }\n\n return result;\n}\n\nexport function clearMruData(wizardName: string): void {\n const filePath = getMruFilePath(wizardName);\n try {\n if (existsSync(filePath)) {\n writeFileSync(filePath, '{}', 'utf-8');\n }\n } catch {\n // Silent fail — MRU is non-critical\n }\n}\n","import { input, select, confirm, number } from '@inquirer/prompts';\nimport { stringify } from 'yaml';\nimport { writeFileSync } from 'node:fs';\nimport { relative } from 'node:path';\n\n// ─── Types for scaffolded config ─────────────────────────────────────────────\n\ninterface ScaffoldedOption {\n value: string;\n label: string;\n}\n\ninterface ScaffoldedStep {\n id: string;\n type: string;\n message: string;\n required?: boolean;\n options?: ScaffoldedOption[];\n}\n\ninterface ScaffoldedConfig {\n meta: {\n name: string;\n description?: string;\n };\n steps: ScaffoldedStep[];\n output: {\n format: string;\n path?: string;\n };\n theme?: {\n tokens: {\n primary: string;\n };\n };\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst STEP_TYPE_CHOICES = [\n { name: 'text', value: 'text' },\n { name: 'select', value: 'select' },\n { name: 'multiselect', value: 'multiselect' },\n { name: 'confirm', value: 'confirm' },\n { name: 'password', value: 'password' },\n { name: 'number', value: 'number' },\n { name: 'search', value: 'search' },\n { name: 'editor', value: 'editor' },\n { name: 'path', value: 'path' },\n { name: 'toggle', value: 'toggle' },\n];\n\nconst TYPES_WITH_OPTIONS = new Set(['select', 'multiselect', 'search']);\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction isUserCancel(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.message.includes('User force closed') ||\n error.name === 'ExitPromptError'\n );\n }\n return false;\n}\n\n// ─── Main scaffolder ─────────────────────────────────────────────────────────\n\nexport async function scaffoldWizard(outputPath: string): Promise<void> {\n try {\n // 1. Wizard name\n const wizardName = await input({\n message: 'Wizard name',\n validate: (val) => val.trim().length > 0 || 'Name is required',\n });\n\n // 2. Description (optional)\n const description = await input({\n message: 'Description (optional)',\n });\n\n // 3. Number of steps\n const rawStepCount = await number({\n message: 'How many steps?',\n default: 3,\n min: 1,\n max: 20,\n });\n const stepCount = rawStepCount ?? 3;\n\n // 4. Collect steps\n const steps: ScaffoldedStep[] = [];\n\n for (let i = 0; i < stepCount; i++) {\n console.log(`\\n Step ${String(i + 1)} of ${String(stepCount)}`);\n\n const stepId = await input({\n message: 'Step ID',\n validate: (val) =>\n /^[a-z][a-z0-9-]*$/.test(val) ||\n 'Must be lowercase, start with a letter, hyphens only (e.g., my-step)',\n });\n\n const stepType = await select({\n message: 'Step type',\n choices: STEP_TYPE_CHOICES,\n });\n\n const stepMessage = await input({\n message: 'Prompt message',\n validate: (val) => val.trim().length > 0 || 'Message is required',\n });\n\n const step: ScaffoldedStep = {\n id: stepId,\n type: stepType,\n message: stepMessage,\n };\n\n if (TYPES_WITH_OPTIONS.has(stepType)) {\n const rawOptions = await input({\n message: 'Options (comma-separated values)',\n validate: (val) =>\n val.split(',').some((v) => v.trim().length > 0) ||\n 'At least one option is required',\n });\n\n step.options = rawOptions\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0)\n .map((v) => ({\n value: v,\n label: v.charAt(0).toUpperCase() + v.slice(1),\n }));\n }\n\n const isRequired = await confirm({\n message: 'Is this a required field?',\n default: true,\n });\n\n if (!isRequired) {\n step.required = false;\n }\n\n steps.push(step);\n }\n\n // 5. Output format\n const format = await select({\n message: 'Output format',\n choices: [\n { name: 'JSON', value: 'json' },\n { name: 'YAML', value: 'yaml' },\n { name: 'ENV', value: 'env' },\n ],\n });\n\n // 6. Output file path (optional)\n const outputFilePath = await input({\n message: 'Output file path (optional)',\n });\n\n // 7. Theme\n const wantTheme = await confirm({\n message: 'Do you want a theme?',\n default: false,\n });\n\n let primaryColor = '';\n if (wantTheme) {\n primaryColor = await input({\n message: 'Primary color (hex)',\n default: '#5B9BD5',\n validate: (val) =>\n /^#[0-9A-Fa-f]{6}$/.test(val) ||\n 'Must be a valid hex color (e.g., #5B9BD5)',\n });\n }\n\n const meta: ScaffoldedConfig['meta'] = { name: wizardName };\n if (description.length > 0) {\n meta.description = description;\n }\n\n const outputConfig: ScaffoldedConfig['output'] = { format };\n if (outputFilePath.length > 0) {\n outputConfig.path = outputFilePath;\n }\n\n const config: ScaffoldedConfig = {\n meta,\n steps,\n output: outputConfig,\n };\n\n if (wantTheme) {\n config.theme = { tokens: { primary: primaryColor } };\n }\n\n const yamlContent = stringify(config);\n writeFileSync(outputPath, yamlContent, 'utf-8');\n\n const displayPath = relative(process.cwd(), outputPath);\n console.log(`\\n \\u2713 Created wizard config: ${outputPath}`);\n console.log(` Run it with: grimoire run ${displayPath}\\n`);\n } catch (error) {\n if (isUserCancel(error)) {\n console.log('\\n Wizard creation cancelled.\\n');\n return;\n }\n throw error;\n }\n}\n","export function bashCompletion(): string {\n return `_grimoire() {\n local cur prev words cword\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n words=(\"\\${COMP_WORDS[@]}\")\n cword=\\${COMP_CWORD}\n\n # Get the subcommand (first non-option argument)\n local subcommand=\"\"\n local i\n for ((i = 1; i < cword; i++)); do\n if [[ \"\\${words[i]}\" != -* ]]; then\n subcommand=\"\\${words[i]}\"\n break\n fi\n done\n\n # Complete subcommands\n if [[ \\${cword} -eq 1 ]]; then\n COMPREPLY=($(compgen -W \"run validate create demo completion\" -- \"\\${cur}\"))\n return 0\n fi\n\n # Complete shell argument for completion command\n if [[ \"\\${subcommand}\" == \"completion\" ]]; then\n if [[ \\${cword} -eq 2 ]]; then\n COMPREPLY=($(compgen -W \"bash zsh fish\" -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for run command\n if [[ \"\\${subcommand}\" == \"run\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=($(compgen -W \"-o --output -f --format -q --quiet --dry-run --mock --json\" -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"-f\" ]] || [[ \"\\${prev}\" == \"--format\" ]]; then\n COMPREPLY=($(compgen -W \"json yaml env\" -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"-o\" ]] || [[ \"\\${prev}\" == \"--output\" ]]; then\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n elif [[ \"\\${prev}\" == \"--mock\" ]]; then\n COMPREPLY=()\n else\n # Complete config file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for validate command\n if [[ \"\\${subcommand}\" == \"validate\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=()\n else\n # Complete config file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for create command\n if [[ \"\\${subcommand}\" == \"create\" ]]; then\n if [[ \"\\${cur}\" == -* ]]; then\n COMPREPLY=()\n else\n # Complete output file path\n COMPREPLY=($(compgen -f -- \"\\${cur}\"))\n fi\n return 0\n fi\n\n # Complete flags for demo command\n if [[ \"\\${subcommand}\" == \"demo\" ]]; then\n COMPREPLY=()\n return 0\n fi\n\n return 0\n}\n\ncomplete -o bashdefault -o default -o nospace -F _grimoire grimoire\n`;\n}\n\nexport function zshCompletion(): string {\n return `#compdef grimoire\n\n_grimoire() {\n local -a subcommands\n subcommands=(\n 'run:Run a wizard from a config file'\n 'validate:Validate a wizard config file without running it'\n 'create:Interactively scaffold a new wizard config file'\n 'demo:Run a demo wizard showcasing all step types'\n 'completion:Output shell completion script'\n )\n\n local -a run_flags\n run_flags=(\n '-o+[Write answers to file]:output file:_files'\n '--output+[Write answers to file]:output file:_files'\n '-f+[Output format]:format:(json yaml env)'\n '--format+[Output format]:format:(json yaml env)'\n '-q[Suppress header and summary output]'\n '--quiet[Suppress header and summary output]'\n '--dry-run[Show step plan without running the wizard]'\n '--mock+[Run wizard with preset answers]:json string:'\n '--json[Output structured JSON result to stdout]'\n )\n\n local -a completion_shells\n completion_shells=(\n 'bash:Bash shell'\n 'zsh:Zsh shell'\n 'fish:Fish shell'\n )\n\n local context state line\n\n _arguments -C \\\n '1: :->command' \\\n '*::args:->args'\n\n case \\$state in\n command)\n _describe 'command' subcommands\n ;;\n args)\n case \\${words[2]} in\n run)\n _arguments \\\n \\$run_flags \\\n '1:config file:_files'\n ;;\n validate)\n _arguments '1:config file:_files'\n ;;\n create)\n _arguments '1:output file:_files'\n ;;\n demo)\n ;;\n completion)\n _describe 'shell' completion_shells\n ;;\n esac\n ;;\n esac\n}\n\n_grimoire\n`;\n}\n\nexport function fishCompletion(): string {\n return `# Fish completion for grimoire\n\n# Subcommands\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"run\" -d \"Run a wizard from a config file\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"validate\" -d \"Validate a wizard config file without running it\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"create\" -d \"Interactively scaffold a new wizard config file\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"demo\" -d \"Run a demo wizard showcasing all step types\"\ncomplete -c grimoire -f -n \"__fish_use_subcommand_from_list\" -a \"completion\" -d \"Output shell completion script\"\n\n# run command flags\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s o -l output -d \"Write answers to file\" -r\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s f -l format -d \"Output format\" -x -a \"json yaml env\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -s q -l quiet -d \"Suppress header and summary output\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l dry-run -d \"Show step plan without running the wizard\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l mock -d \"Run wizard with preset answers (JSON string)\" -r\ncomplete -c grimoire -n \"__fish_seen_subcommand_from run\" -l json -d \"Output structured JSON result to stdout\"\n\n# completion command shells\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"bash\" -d \"Bash shell\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"zsh\" -d \"Zsh shell\"\ncomplete -c grimoire -n \"__fish_seen_subcommand_from completion\" -f -a \"fish\" -d \"Fish shell\"\n`;\n}\n","import { mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { slugify } from './cache';\n\nconst TEMPLATES_DIR = join(homedir(), '.config', 'grimoire', 'templates');\n\nfunction getWizardTemplateDir(wizardName: string): string {\n return join(TEMPLATES_DIR, slugify(wizardName));\n}\n\nfunction getTemplateFilePath(wizardName: string, templateName: string): string {\n return join(getWizardTemplateDir(wizardName), `${slugify(templateName)}.json`);\n}\n\nexport function saveTemplate(\n wizardName: string,\n templateName: string,\n answers: Record<string, unknown>,\n excludeKeys?: string[],\n): void {\n try {\n const dir = getWizardTemplateDir(wizardName);\n mkdirSync(dir, { recursive: true });\n const filePath = getTemplateFilePath(wizardName, templateName);\n let answersToSave = answers;\n if (excludeKeys && excludeKeys.length > 0) {\n const excluded = new Set(excludeKeys);\n answersToSave = Object.fromEntries(\n Object.entries(answers).filter(([k]) => !excluded.has(k)),\n );\n }\n writeFileSync(filePath, JSON.stringify(answersToSave, null, 2) + '\\n', 'utf-8');\n } catch { }\n}\n\nexport function loadTemplate(\n wizardName: string,\n templateName: string,\n): Record<string, unknown> | undefined {\n try {\n const filePath = getTemplateFilePath(wizardName, templateName);\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function listTemplates(wizardName: string): string[] {\n try {\n const dir = getWizardTemplateDir(wizardName);\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => f.replace(/\\.json$/, ''));\n } catch {\n return [];\n }\n}\n\nexport function deleteTemplate(wizardName: string, templateName: string): void {\n try {\n const filePath = getTemplateFilePath(wizardName, templateName);\n unlinkSync(filePath);\n } catch { }\n}\n","import {\n input,\n select,\n checkbox,\n confirm,\n password,\n number,\n search,\n editor,\n Separator,\n} from '@inquirer/prompts';\nimport type {\n ConfirmStepConfig,\n EditorStepConfig,\n MessageStepConfig,\n MultiSelectStepConfig,\n NumberStepConfig,\n PasswordStepConfig,\n PathStepConfig,\n ResolvedTheme,\n SearchStepConfig,\n SelectOption,\n SelectStepConfig,\n StepConfig,\n TextStepConfig,\n ToggleStepConfig,\n WizardRenderer,\n WizardState,\n} from '../types';\n\nfunction boxLine(text: string, theme: ResolvedTheme): string {\n const line = '\\u2500'.repeat(Math.max(0, 40 - text.length));\n return `${theme.accent('\\u250C\\u2500')} ${theme.bold(text)} ${theme.accent(`${line}\\u2510`)}`;\n}\n\nexport class InkRenderer implements WizardRenderer {\n renderStepHeader(\n stepIndex: number,\n totalVisible: number,\n message: string,\n theme: ResolvedTheme,\n description?: string,\n ): void {\n const barWidth = 30;\n const progress = totalVisible > 0 ? stepIndex / totalVisible : 0;\n const filledCount = Math.round(progress * barWidth);\n const remainingCount = barWidth - filledCount;\n\n const filledBar = theme.success('\\u2593'.repeat(filledCount));\n const remainingBar = theme.muted('\\u2591'.repeat(remainingCount));\n const pct = `${String(Math.round(progress * 100))}%`;\n const counter = theme.muted(`Step ${String(stepIndex + 1)}/${String(totalVisible)}`);\n\n console.log();\n console.log(` ${theme.accent('\\u250C')} ${counter} ${theme.muted(pct)}`);\n console.log(` ${theme.accent('\\u2502')} [${filledBar}${remainingBar}]`);\n console.log(` ${theme.accent('\\u2514\\u2500')} ${theme.primary(message)}`);\n\n if (description) {\n console.log(` ${theme.muted(description)}`);\n }\n }\n\n async renderText(\n step: TextStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string'\n ? existingAnswer\n : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderSelect(\n step: SelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n disabled: opt.disabled,\n };\n });\n\n return select({\n message: step.message,\n choices,\n default: defaultValue,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderMultiSelect(\n step: MultiSelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string[]> {\n const existingAnswer = state.answers[step.id];\n const previousSelections: string[] | undefined = Array.isArray(existingAnswer)\n ? existingAnswer.filter((v): v is string => typeof v === 'string')\n : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n checked: previousSelections?.includes(opt.value) ?? false,\n disabled: opt.disabled,\n };\n });\n\n return checkbox({\n message: step.message,\n choices,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderConfirm(\n step: ConfirmStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'boolean' ? existingAnswer : step.default;\n\n return confirm({\n message: step.message,\n default: defaultValue ?? true,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPassword(\n step: PasswordStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return password({\n message: step.message,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderNumber(\n step: NumberStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<number> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'number' ? existingAnswer : step.default;\n\n const result = await number({\n message: step.message,\n default: defaultValue,\n min: step.min,\n max: step.max,\n step: step.step,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result ?? defaultValue ?? 0;\n }\n\n async renderSearch(\n step: SearchStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const message = step.placeholder\n ? `${step.message} ${theme.muted(`(${step.placeholder})`)}`\n : step.message;\n return search({\n message,\n source: (term) => {\n const query = (term ?? '').toLowerCase();\n return step.options\n .filter((opt): opt is SelectOption => 'value' in opt)\n .filter((opt) => !opt.disabled && opt.label.toLowerCase().includes(query))\n .map((opt) => ({\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n }));\n },\n pageSize: step.pageSize,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderEditor(\n step: EditorStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return editor({\n message: step.message,\n default: step.default,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPath(\n step: PathStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderToggle(\n step: ToggleStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const activeLabel = step.active ?? 'On';\n const inactiveLabel = step.inactive ?? 'Off';\n\n const defaultValue =\n typeof existingAnswer === 'boolean'\n ? (existingAnswer ? activeLabel : inactiveLabel)\n : (step.default === true ? activeLabel : inactiveLabel);\n\n const result = await select({\n message: step.message,\n choices: [\n { name: activeLabel, value: activeLabel },\n { name: inactiveLabel, value: inactiveLabel },\n ],\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result === activeLabel;\n }\n\n renderMessage(step: MessageStepConfig, _state: WizardState, theme: ResolvedTheme): void {\n if (step.description) {\n console.log(` ${theme.muted(step.description)}`);\n }\n console.log();\n }\n\n renderGroupHeader(group: string, theme: ResolvedTheme): void {\n console.log();\n console.log(` ${boxLine(group, theme)}`);\n console.log();\n }\n\n renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n const divider = theme.accent('\\u2500'.repeat(50));\n console.log();\n console.log(` ${divider}`);\n console.log(` ${theme.accent('\\u2502')} ${theme.bold('Summary')}`);\n console.log(` ${divider}`);\n\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n\n const label = theme.muted(step.id.padEnd(24));\n const value = theme.primary(display);\n console.log(` ${theme.accent('\\u2502')} ${label} ${value}`);\n }\n\n console.log(` ${divider}`);\n }\n\n clear(): void {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n }\n}\n","import chalk from 'chalk';\nimport { InquirerRenderer } from './inquirer';\nimport {\n S_BAR,\n S_BAR_START,\n S_BAR_END,\n S_BAR_H,\n S_STEP_SUBMIT,\n S_STEP_CANCEL,\n S_STEP_ERROR,\n S_CORNER_TR,\n S_CORNER_BR,\n} from './symbols';\nimport type { ResolvedTheme, StepConfig, WizardEvent } from '../types';\n\nexport class ClackRenderer extends InquirerRenderer {\n private spinnerInterval: ReturnType<typeof setInterval> | undefined;\n private spinnerFrameIndex = 0;\n private spinnerStartTime = 0;\n private checksMode: 'spinner' | 'tasklist' | undefined = undefined;\n\n override renderStepHeader(): void {}\n\n override renderGroupHeader(): void {}\n\n override renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n const entries: Array<{ id: string; display: string }> = [];\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n entries.push({ id: step.id, display });\n }\n\n if (entries.length === 0) return;\n\n const title = 'Summary';\n const lines = entries.map((e) => `${e.id}: ${e.display}`);\n this.writeNoteBox(title, lines, theme);\n }\n\n onEvent(event: WizardEvent, theme: ResolvedTheme): void {\n switch (event.type) {\n case 'session:start':\n this.handleSessionStart(event, theme);\n break;\n case 'session:end':\n this.handleSessionEnd(event, theme);\n break;\n case 'step:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n break;\n case 'step:complete':\n this.handleStepComplete(event, theme);\n break;\n case 'step:error':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(`${S_STEP_ERROR} ${event.error}`)}\\n`);\n break;\n case 'step:back':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.muted('\\u21a9 Back')}\\n`);\n break;\n case 'group:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.accent(event.group)}\\n`);\n break;\n case 'note':\n this.writeNoteBox(event.title, event.body.split('\\n'), theme);\n break;\n case 'spinner:start':\n this.startSpinner(event.message, theme);\n break;\n case 'spinner:stop':\n this.stopSpinner(event.message, theme);\n break;\n case 'checks:start':\n this.checksMode = event.mode === 'tasklist' ? 'tasklist' : 'spinner';\n if (this.checksMode !== 'tasklist') {\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.bold('Running checks...')}\\n`);\n }\n break;\n case 'check:pass':\n if (this.checksMode !== 'tasklist') {\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${event.name}\\n`);\n }\n break;\n case 'check:fail':\n if (this.checksMode !== 'tasklist') {\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(S_STEP_ERROR)} ${event.name}: ${event.message}\\n`);\n }\n break;\n case 'actions:start':\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.bold('Running actions...')}\\n`);\n break;\n case 'action:pass':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${event.name}\\n`);\n break;\n case 'action:fail':\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.error(S_STEP_ERROR)} ${event.name}\\n`);\n break;\n }\n }\n\n private handleSessionStart(\n event: Extract<WizardEvent, { type: 'session:start' }>,\n theme: ResolvedTheme,\n ): void {\n process.stdout.write(`${chalk.gray(S_BAR_START)} ${theme.bold(event.wizard)}\\n`);\n if (event.description) {\n process.stdout.write(`${chalk.gray(S_BAR)} ${theme.muted(event.description)}\\n`);\n }\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n }\n\n private handleSessionEnd(\n event: Extract<WizardEvent, { type: 'session:end' }>,\n theme: ResolvedTheme,\n ): void {\n if (event.cancelled) {\n process.stdout.write(`${theme.warning(S_STEP_CANCEL)} Cancelled\\n`);\n } else {\n process.stdout.write(`${chalk.gray(S_BAR_END)} ${theme.success(\"You're all set!\")}\\n`);\n }\n }\n\n private handleStepComplete(\n event: Extract<WizardEvent, { type: 'step:complete' }>,\n theme: ResolvedTheme,\n ): void {\n const displayValue = event.step.type === 'password'\n ? '****'\n : this.formatValue(event.value);\n process.stdout.write(\n `${chalk.gray(S_STEP_SUBMIT)} ${event.step.message} ${chalk.gray('\\u00b7')} ${theme.muted(displayValue)}\\n`,\n );\n }\n\n private formatValue(value: unknown): string {\n if (Array.isArray(value)) return value.map(String).join(', ');\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n return String(value);\n }\n\n private writeNoteBox(title: string, lines: string[], _theme: ResolvedTheme): void {\n const maxLen = Math.max(title.length, ...lines.map((l) => l.length));\n const padded = maxLen + 2;\n const topLine = `${S_BAR_H.repeat(padded - title.length - 1)}${S_CORNER_TR}`;\n const bottomLine = `${S_BAR_H.repeat(padded)}${S_CORNER_BR}`;\n\n process.stdout.write(`${chalk.gray(S_BAR)}\\n`);\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(`\\u256D${S_BAR_H} ${title} ${topLine}`)}\\n`);\n for (const line of lines) {\n const pad = ' '.repeat(maxLen - line.length);\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(S_BAR)} ${line}${pad} ${chalk.gray(S_BAR)}\\n`);\n }\n process.stdout.write(`${chalk.gray(S_BAR)} ${chalk.gray(`\\u256E${bottomLine}`)}\\n`);\n }\n\n private startSpinner(message: string, theme: ResolvedTheme): void {\n if (this.spinnerInterval) {\n clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n this.spinnerFrameIndex = 0;\n this.spinnerStartTime = Date.now();\n const { frames, interval } = theme.spinner;\n this.spinnerInterval = setInterval(() => {\n const frame = frames[this.spinnerFrameIndex % frames.length];\n const elapsed = theme.spinnerElapsed\n ? ` ${chalk.gray(`(${((Date.now() - this.spinnerStartTime) / 1000).toFixed(1)}s)`)}`\n : '';\n process.stdout.write(`\\r${chalk.gray(S_BAR)} ${chalk.cyan(frame ?? '')} ${message}${elapsed}`);\n this.spinnerFrameIndex++;\n }, interval);\n }\n\n private stopSpinner(message: string | undefined, theme: ResolvedTheme): void {\n if (this.spinnerInterval) {\n clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n const finalMessage = message ?? 'Done';\n process.stdout.write(`\\r${chalk.gray(S_BAR)} ${theme.success(S_STEP_SUBMIT)} ${finalMessage}\\x1B[K\\n`);\n }\n}\n","function isUnicodeSupported(): boolean {\n if (process.platform === 'win32') {\n return Boolean(process.env['WT_SESSION']) || process.env['TERM_PROGRAM'] === 'vscode';\n }\n return process.env['TERM'] !== 'linux';\n}\n\nconst unicode = isUnicodeSupported();\nconst u = (unicodeChar: string, fallback: string): string => unicode ? unicodeChar : fallback;\n\nexport const S_BAR_START = u('┌', 'T');\nexport const S_BAR = u('│', '|');\nexport const S_BAR_END = u('└', '—');\nexport const S_STEP_ACTIVE = u('◆', '*');\nexport const S_STEP_SUBMIT = u('◇', 'o');\nexport const S_STEP_CANCEL = u('■', 'x');\nexport const S_STEP_ERROR = u('▲', 'x');\nexport const S_CORNER_TR = u('╮', '+');\nexport const S_CORNER_BR = u('╯', '+');\nexport const S_BAR_H = u('─', '-');\n"],"mappings":"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","names":["chalk","resolve","dirname","input","readFileSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","join","homedir","join","homedir","mkdirSync","writeFileSync","readFileSync","unlinkSync","readFileSync","writeFileSync","mkdirSync","join","homedir","resolvedStep","resolve","dirname","input","select","confirm","number","writeFileSync","isUserCancel","mkdirSync","readFileSync","writeFileSync","unlinkSync","readdirSync","existsSync","join","homedir","join","homedir","readFileSync","existsSync","readdirSync","unlinkSync","input","select","checkbox","confirm","password","number","search","editor","Separator","chalk","chalk","writeFileSync","resolve","chalk","isRecord"]}
|