grimoire-wizard 0.3.0 → 0.3.1

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/dist/cli.js CHANGED
@@ -2161,7 +2161,7 @@ function applyColorMode(opts) {
2161
2161
  plainMode = true;
2162
2162
  }
2163
2163
  }
2164
- program.name("grimoire").description("Config-driven CLI wizard framework").version("0.3.0").option("--no-color", "Disable colored output").option("--plain", "Plain output mode (no colors, no banner)").hook("preAction", () => {
2164
+ program.name("grimoire").description("Config-driven CLI wizard framework").version("0.3.1").option("--no-color", "Disable colored output").option("--plain", "Plain output mode (no colors, no banner)").hook("preAction", () => {
2165
2165
  const globalOpts = program.opts();
2166
2166
  applyColorMode(globalOpts);
2167
2167
  });
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/renderers/inquirer.ts","../src/resolve.ts","../src/template.ts","../src/banner.ts","../src/plugins.ts","../src/cache.ts","../src/mru.ts","../src/scaffolder.ts","../src/completions.ts","../src/templates.ts","../src/renderers/ink.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 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 renderer?: string;\n template?: string;\n}\n\nprogram\n .name('grimoire')\n .description('Config-driven CLI wizard framework')\n .version('0.3.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('--renderer <type>', 'Renderer to use: inquirer (default) or ink', '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 });\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 '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.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 throw new Error(`Unknown renderer: \"${rendererName}\". Supported: inquirer, ink`);\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 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]);\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 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});\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 }),\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}).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 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 { createWizardState, getVisibleSteps, wizardReducer } from './engine';\nimport { resolveTheme } from './theme';\nimport { InquirerRenderer } from './renderers/inquirer';\nimport { resolveEnvDefault, resolveEnvDefaultBoolean, resolveEnvDefaultNumber } from './resolve';\nimport { resolveTemplate } 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 { recordSelection, getOrderedOptions } from './mru';\nimport type { ActionConfig, PreFlightCheck, SelectChoice, StepConfig, WizardConfig, WizardRenderer, WizardState, ResolvedTheme } from './types';\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}\n\nexport function runPreFlightChecks(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n): void {\n for (const check of checks) {\n try {\n execSync(check.run, { stdio: 'pipe' });\n console.log(` ${theme.success('✓')} ${check.name}`);\n } catch {\n console.log(` ${theme.error('✗')} ${check.name}: ${check.message}`);\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') {\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 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 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);\n }\n\n if (!quiet) {\n printWizardHeader(config, theme, options?.plain);\n }\n\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 (!isMock) {\n if (currentStep.group !== undefined && currentStep.group !== previousGroup) {\n const resolvedGroup = resolveTemplate(currentStep.group, state.answers);\n renderer.renderGroupHeader(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 renderer.renderStepHeader(stepIndex, visibleSteps.length, resolvedMessage, theme, resolvedDescription);\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 try {\n const value = isMock\n ? getMockValue(mruStep, mockAnswers)\n : pluginStep\n ? await pluginStep.render(toStepRecord(mruStep), state, theme)\n : await renderStep(renderer, mruStep, 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 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\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 if (!quiet) {\n console.log(theme.warning('\\n Wizard cancelled.\\n'));\n }\n return state.answers;\n }\n throw error;\n }\n }\n\n if (state.status === 'done' && !quiet) {\n renderer.renderSummary(state.answers, config.steps, theme);\n }\n\n if (state.status === 'done' && config.actions && config.actions.length > 0 && !isMock) {\n await executeActions(config.actions, state.answers, theme);\n }\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 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 }\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 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') 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 return {\n ...step,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n }\n}\n\nasync function executeActions(\n actions: ActionConfig[],\n answers: Record<string, unknown>,\n theme: ResolvedTheme,\n): Promise<void> {\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 = resolveTemplate(action.run, answers);\n const resolvedName = action.name ? resolveTemplate(action.name, answers) : undefined;\n const label = resolvedName ?? resolvedCommand;\n\n try {\n execSync(resolvedCommand, { stdio: 'pipe' });\n console.log(` ${theme.success('✓')} ${label}`);\n } catch {\n console.log(` ${theme.error('✗')} ${label}`);\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 }));\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';\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 tokens = { ...DEFAULT_TOKENS, ...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 };\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","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 },\n): string {\n if (options?.plain) {\n return ` ${theme.bold(name)}`;\n }\n\n try {\n const art = figlet.textSync(name, {\n font: 'Small',\n horizontalLayout: 'default',\n });\n\n const lines = art\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n\n return GRIMOIRE_GRADIENT(lines);\n } catch {\n return ` ${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 { 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"],"mappings":"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","names":["chalk","input","readFileSync","readFileSync","writeFileSync","mkdirSync","join","homedir","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","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/renderers/inquirer.ts","../src/resolve.ts","../src/template.ts","../src/banner.ts","../src/plugins.ts","../src/cache.ts","../src/mru.ts","../src/scaffolder.ts","../src/completions.ts","../src/templates.ts","../src/renderers/ink.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 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 renderer?: string;\n template?: string;\n}\n\nprogram\n .name('grimoire')\n .description('Config-driven CLI wizard framework')\n .version('0.3.1')\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('--renderer <type>', 'Renderer to use: inquirer (default) or ink', '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 });\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 '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.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 throw new Error(`Unknown renderer: \"${rendererName}\". Supported: inquirer, ink`);\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 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]);\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 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});\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 }),\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}).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 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 { createWizardState, getVisibleSteps, wizardReducer } from './engine';\nimport { resolveTheme } from './theme';\nimport { InquirerRenderer } from './renderers/inquirer';\nimport { resolveEnvDefault, resolveEnvDefaultBoolean, resolveEnvDefaultNumber } from './resolve';\nimport { resolveTemplate } 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 { recordSelection, getOrderedOptions } from './mru';\nimport type { ActionConfig, PreFlightCheck, SelectChoice, StepConfig, WizardConfig, WizardRenderer, WizardState, ResolvedTheme } from './types';\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}\n\nexport function runPreFlightChecks(\n checks: PreFlightCheck[],\n theme: ResolvedTheme,\n): void {\n for (const check of checks) {\n try {\n execSync(check.run, { stdio: 'pipe' });\n console.log(` ${theme.success('✓')} ${check.name}`);\n } catch {\n console.log(` ${theme.error('✗')} ${check.name}: ${check.message}`);\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') {\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 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 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);\n }\n\n if (!quiet) {\n printWizardHeader(config, theme, options?.plain);\n }\n\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 (!isMock) {\n if (currentStep.group !== undefined && currentStep.group !== previousGroup) {\n const resolvedGroup = resolveTemplate(currentStep.group, state.answers);\n renderer.renderGroupHeader(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 renderer.renderStepHeader(stepIndex, visibleSteps.length, resolvedMessage, theme, resolvedDescription);\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 try {\n const value = isMock\n ? getMockValue(mruStep, mockAnswers)\n : pluginStep\n ? await pluginStep.render(toStepRecord(mruStep), state, theme)\n : await renderStep(renderer, mruStep, 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 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\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 if (!quiet) {\n console.log(theme.warning('\\n Wizard cancelled.\\n'));\n }\n return state.answers;\n }\n throw error;\n }\n }\n\n if (state.status === 'done' && !quiet) {\n renderer.renderSummary(state.answers, config.steps, theme);\n }\n\n if (state.status === 'done' && config.actions && config.actions.length > 0 && !isMock) {\n await executeActions(config.actions, state.answers, theme);\n }\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 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 }\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 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') 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 return {\n ...step,\n description: step.description ? resolveTemplate(step.description, answers) : undefined,\n };\n }\n}\n\nasync function executeActions(\n actions: ActionConfig[],\n answers: Record<string, unknown>,\n theme: ResolvedTheme,\n): Promise<void> {\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 = resolveTemplate(action.run, answers);\n const resolvedName = action.name ? resolveTemplate(action.name, answers) : undefined;\n const label = resolvedName ?? resolvedCommand;\n\n try {\n execSync(resolvedCommand, { stdio: 'pipe' });\n console.log(` ${theme.success('✓')} ${label}`);\n } catch {\n console.log(` ${theme.error('✗')} ${label}`);\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 }));\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';\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 tokens = { ...DEFAULT_TOKENS, ...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 };\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","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 },\n): string {\n if (options?.plain) {\n return ` ${theme.bold(name)}`;\n }\n\n try {\n const art = figlet.textSync(name, {\n font: 'Small',\n horizontalLayout: 'default',\n });\n\n const lines = art\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n\n return GRIMOIRE_GRADIENT(lines);\n } catch {\n return ` ${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 { 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"],"mappings":"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","names":["chalk","input","readFileSync","readFileSync","writeFileSync","mkdirSync","join","homedir","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","writeFileSync","resolve","chalk","isRecord"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grimoire-wizard",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Config-driven CLI wizard framework. Define interactive terminal wizards in YAML/JSON with back-navigation, conditional branching, theming, and structured output.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,6 +47,10 @@
47
47
  "inquirer",
48
48
  "clack"
49
49
  ],
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/YosefHayim/grimoire.git"
53
+ },
50
54
  "author": "Yosef Hayim (https://github.com/YosefHayim)",
51
55
  "license": "MIT",
52
56
  "engines": {