grimoire-wizard 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts","../src/parser.ts","../src/conditions.ts","../src/engine.ts","../src/theme.ts","../src/resolve.ts","../src/runner.ts","../src/renderers/inquirer.ts","../src/template.ts","../src/banner.ts","../src/plugins.ts","../src/cache.ts","../src/mru.ts","../src/define.ts","../src/renderers/ink.ts","../src/templates.ts"],"sourcesContent":["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 { 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 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","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","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 {\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","/**\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 type { WizardConfig } from './types';\n\nexport function defineWizard(config: WizardConfig): WizardConfig {\n return config;\n}\n","import {\n input,\n select,\n checkbox,\n confirm,\n password,\n number,\n search,\n editor,\n Separator,\n} from '@inquirer/prompts';\nimport type {\n ConfirmStepConfig,\n EditorStepConfig,\n MessageStepConfig,\n MultiSelectStepConfig,\n NumberStepConfig,\n PasswordStepConfig,\n PathStepConfig,\n ResolvedTheme,\n SearchStepConfig,\n SelectOption,\n SelectStepConfig,\n StepConfig,\n TextStepConfig,\n ToggleStepConfig,\n WizardRenderer,\n WizardState,\n} from '../types';\n\nfunction boxLine(text: string, theme: ResolvedTheme): string {\n const line = '\\u2500'.repeat(Math.max(0, 40 - text.length));\n return `${theme.accent('\\u250C\\u2500')} ${theme.bold(text)} ${theme.accent(`${line}\\u2510`)}`;\n}\n\nexport class InkRenderer implements WizardRenderer {\n renderStepHeader(\n stepIndex: number,\n totalVisible: number,\n message: string,\n theme: ResolvedTheme,\n description?: string,\n ): void {\n const barWidth = 30;\n const progress = totalVisible > 0 ? stepIndex / totalVisible : 0;\n const filledCount = Math.round(progress * barWidth);\n const remainingCount = barWidth - filledCount;\n\n const filledBar = theme.success('\\u2593'.repeat(filledCount));\n const remainingBar = theme.muted('\\u2591'.repeat(remainingCount));\n const pct = `${String(Math.round(progress * 100))}%`;\n const counter = theme.muted(`Step ${String(stepIndex + 1)}/${String(totalVisible)}`);\n\n console.log();\n console.log(` ${theme.accent('\\u250C')} ${counter} ${theme.muted(pct)}`);\n console.log(` ${theme.accent('\\u2502')} [${filledBar}${remainingBar}]`);\n console.log(` ${theme.accent('\\u2514\\u2500')} ${theme.primary(message)}`);\n\n if (description) {\n console.log(` ${theme.muted(description)}`);\n }\n }\n\n async renderText(\n step: TextStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string'\n ? existingAnswer\n : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderSelect(\n step: SelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n disabled: opt.disabled,\n };\n });\n\n return select({\n message: step.message,\n choices,\n default: defaultValue,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderMultiSelect(\n step: MultiSelectStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string[]> {\n const existingAnswer = state.answers[step.id];\n const previousSelections: string[] | undefined = Array.isArray(existingAnswer)\n ? existingAnswer.filter((v): v is string => typeof v === 'string')\n : step.default;\n\n const choices = step.options.map((opt) => {\n if ('separator' in opt) {\n return new Separator(opt.separator);\n }\n return {\n name: opt.label,\n value: opt.value,\n checked: previousSelections?.includes(opt.value) ?? false,\n disabled: opt.disabled,\n };\n });\n\n return checkbox({\n message: step.message,\n choices,\n pageSize: step.pageSize,\n loop: step.loop,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderConfirm(\n step: ConfirmStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'boolean' ? existingAnswer : step.default;\n\n return confirm({\n message: step.message,\n default: defaultValue ?? true,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPassword(\n step: PasswordStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return password({\n message: step.message,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderNumber(\n step: NumberStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<number> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'number' ? existingAnswer : step.default;\n\n const result = await number({\n message: step.message,\n default: defaultValue,\n min: step.min,\n max: step.max,\n step: step.step,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result ?? defaultValue ?? 0;\n }\n\n async renderSearch(\n step: SearchStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return search({\n message: step.message,\n source: (term) => {\n const query = (term ?? '').toLowerCase();\n return step.options\n .filter((opt): opt is SelectOption => 'value' in opt)\n .filter((opt) => !opt.disabled && opt.label.toLowerCase().includes(query))\n .map((opt) => ({\n name: opt.label,\n value: opt.value,\n description: opt.hint,\n }));\n },\n pageSize: step.pageSize,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderEditor(\n step: EditorStepConfig,\n _state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n return editor({\n message: step.message,\n default: step.default,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderPath(\n step: PathStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<string> {\n const existingAnswer = state.answers[step.id];\n const defaultValue =\n typeof existingAnswer === 'string' ? existingAnswer : step.default;\n\n return input({\n message: step.message,\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n }\n\n async renderToggle(\n step: ToggleStepConfig,\n state: WizardState,\n theme: ResolvedTheme,\n ): Promise<boolean> {\n const existingAnswer = state.answers[step.id];\n const activeLabel = step.active ?? 'On';\n const inactiveLabel = step.inactive ?? 'Off';\n\n const defaultValue =\n typeof existingAnswer === 'boolean'\n ? (existingAnswer ? activeLabel : inactiveLabel)\n : (step.default === true ? activeLabel : inactiveLabel);\n\n const result = await select({\n message: step.message,\n choices: [\n { name: activeLabel, value: activeLabel },\n { name: inactiveLabel, value: inactiveLabel },\n ],\n default: defaultValue,\n theme: { prefix: { idle: theme.icons.pointer, done: theme.icons.stepDone } },\n });\n\n return result === activeLabel;\n }\n\n renderMessage(step: MessageStepConfig, _state: WizardState, theme: ResolvedTheme): void {\n if (step.description) {\n console.log(` ${theme.muted(step.description)}`);\n }\n console.log();\n }\n\n renderGroupHeader(group: string, theme: ResolvedTheme): void {\n console.log();\n console.log(` ${boxLine(group, theme)}`);\n console.log();\n }\n\n renderSummary(\n answers: Record<string, unknown>,\n steps: StepConfig[],\n theme: ResolvedTheme,\n ): void {\n const divider = theme.accent('\\u2500'.repeat(50));\n console.log();\n console.log(` ${divider}`);\n console.log(` ${theme.accent('\\u2502')} ${theme.bold('Summary')}`);\n console.log(` ${divider}`);\n\n for (const step of steps) {\n const answer = answers[step.id];\n if (answer === undefined) continue;\n\n const display = Array.isArray(answer)\n ? answer.map(String).join(', ')\n : String(answer);\n\n const label = theme.muted(step.id.padEnd(24));\n const value = theme.primary(display);\n console.log(` ${theme.accent('\\u2502')} ${label} ${value}`);\n }\n\n console.log(` ${divider}`);\n }\n\n clear(): void {\n process.stdout.write('\\x1B[2J\\x1B[0f');\n }\n}\n","import { 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"],"mappings":"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","names":["input","readFileSync","readFileSync","writeFileSync","mkdirSync","join","homedir","input","select","checkbox","confirm","password","number","search","editor","Separator","mkdirSync","readFileSync","writeFileSync","unlinkSync","readdirSync","existsSync","join","homedir","join","homedir","mkdirSync","writeFileSync","readFileSync","existsSync","readdirSync","unlinkSync"]}
@@ -0,0 +1,54 @@
1
+ meta:
2
+ name: "All Features Showcase"
3
+ description: "Demonstrates search, editor, path, toggle, and step groups"
4
+
5
+ steps:
6
+ - id: search-framework
7
+ type: search
8
+ group: "Project Setup"
9
+ message: "Search for a framework"
10
+ options:
11
+ - { value: nextjs, label: "Next.js" }
12
+ - { value: remix, label: "Remix" }
13
+ - { value: astro, label: "Astro" }
14
+ - { value: sveltekit, label: "SvelteKit" }
15
+ - { value: nuxt, label: "Nuxt" }
16
+ - { value: gatsby, label: "Gatsby" }
17
+
18
+ - id: project-path
19
+ type: path
20
+ group: "Project Setup"
21
+ message: "Where should we create the project?"
22
+ placeholder: "./my-project"
23
+ validate:
24
+ - rule: required
25
+
26
+ - id: use-typescript
27
+ type: toggle
28
+ group: "Configuration"
29
+ message: "TypeScript?"
30
+ active: "Yes, TypeScript"
31
+ inactive: "No, JavaScript"
32
+ default: true
33
+
34
+ - id: readme-content
35
+ type: editor
36
+ group: "Configuration"
37
+ message: "Write your README content"
38
+ required: false
39
+
40
+ - id: port
41
+ type: number
42
+ group: "Configuration"
43
+ message: "Dev server port"
44
+ default: 3000
45
+ min: 1024
46
+ max: 65535
47
+
48
+ - id: confirm
49
+ type: confirm
50
+ message: "Create project?"
51
+ next: __done__
52
+
53
+ output:
54
+ format: json
@@ -0,0 +1,28 @@
1
+ meta:
2
+ name: "Base Project Wizard"
3
+ description: "Base configuration shared across projects"
4
+
5
+ theme:
6
+ tokens:
7
+ primary: "#7C3AED"
8
+ success: "#10B981"
9
+
10
+ steps:
11
+ - id: name
12
+ type: text
13
+ message: "Project name?"
14
+ validate:
15
+ - rule: required
16
+
17
+ - id: description
18
+ type: text
19
+ message: "Description?"
20
+ required: false
21
+
22
+ - id: confirm
23
+ type: confirm
24
+ message: "Continue?"
25
+ next: __done__
26
+
27
+ output:
28
+ format: json
@@ -0,0 +1,61 @@
1
+ meta:
2
+ name: "Project Setup Wizard"
3
+ version: "1.0.0"
4
+ description: "Set up a new project with best practices"
5
+
6
+ steps:
7
+ - id: project-name
8
+ type: text
9
+ message: "What is your project name?"
10
+ placeholder: "my-awesome-project"
11
+ validate:
12
+ - rule: required
13
+ - rule: pattern
14
+ value: "^[a-z][a-z0-9-]*$"
15
+ message: "Must be lowercase with hyphens only"
16
+ - rule: minLength
17
+ value: 2
18
+
19
+ - id: description
20
+ type: text
21
+ message: "Describe your project in one line"
22
+ required: false
23
+
24
+ - id: language
25
+ type: select
26
+ message: "Choose a language"
27
+ options:
28
+ - { value: typescript, label: "TypeScript" }
29
+ - { value: javascript, label: "JavaScript" }
30
+ - { value: python, label: "Python" }
31
+ - { value: go, label: "Go" }
32
+ default: typescript
33
+
34
+ - id: features
35
+ type: multiselect
36
+ message: "Select features to include"
37
+ options:
38
+ - { value: linting, label: "Linting (ESLint/Ruff)", hint: "Code quality checks" }
39
+ - { value: formatting, label: "Formatting (Prettier/Black)", hint: "Auto-format on save" }
40
+ - { value: testing, label: "Testing framework", hint: "Vitest/Jest/Pytest" }
41
+ - { value: ci, label: "CI/CD pipeline", hint: "GitHub Actions" }
42
+ - { value: docker, label: "Docker support" }
43
+ min: 1
44
+
45
+ - id: license
46
+ type: select
47
+ message: "Choose a license"
48
+ options:
49
+ - { value: mit, label: "MIT", hint: "Permissive, simple" }
50
+ - { value: apache-2.0, label: "Apache 2.0", hint: "Permissive, patent protection" }
51
+ - { value: gpl-3.0, label: "GPL 3.0", hint: "Copyleft" }
52
+ - { value: none, label: "No license" }
53
+ default: mit
54
+
55
+ - id: confirm
56
+ type: confirm
57
+ message: "Create project with these settings?"
58
+ next: __done__
59
+
60
+ output:
61
+ format: json
@@ -0,0 +1,126 @@
1
+ meta:
2
+ name: "Full-Stack Project Wizard"
3
+ description: "Set up a full-stack project with conditional framework selection"
4
+
5
+ steps:
6
+ - id: project-name
7
+ type: text
8
+ message: "Project name?"
9
+ validate:
10
+ - rule: required
11
+
12
+ - id: project-type
13
+ type: select
14
+ message: "What type of project?"
15
+ options:
16
+ - { value: web, label: "Web Application" }
17
+ - { value: api, label: "REST API" }
18
+ - { value: cli, label: "CLI Tool" }
19
+ - { value: lib, label: "Library" }
20
+ routes:
21
+ web: web-framework
22
+ api: api-framework
23
+ cli: cli-features
24
+ lib: lib-target
25
+
26
+ - id: web-framework
27
+ type: select
28
+ message: "Choose a web framework"
29
+ options:
30
+ - { value: nextjs, label: "Next.js", hint: "React SSR/SSG" }
31
+ - { value: astro, label: "Astro", hint: "Content-focused, multi-framework" }
32
+ - { value: sveltekit, label: "SvelteKit", hint: "Svelte with SSR" }
33
+ - { value: nuxt, label: "Nuxt", hint: "Vue SSR/SSG" }
34
+ next: styling
35
+
36
+ - id: styling
37
+ type: select
38
+ message: "CSS approach?"
39
+ when:
40
+ any:
41
+ - { field: web-framework, equals: nextjs }
42
+ - { field: web-framework, equals: sveltekit }
43
+ - { field: web-framework, equals: nuxt }
44
+ - { field: web-framework, equals: astro }
45
+ options:
46
+ - { value: tailwind, label: "Tailwind CSS" }
47
+ - { value: css-modules, label: "CSS Modules" }
48
+ - { value: styled, label: "Styled Components" }
49
+ - { value: vanilla, label: "Vanilla CSS" }
50
+ next: database
51
+
52
+ - id: api-framework
53
+ type: select
54
+ message: "Choose an API framework"
55
+ options:
56
+ - { value: express, label: "Express.js" }
57
+ - { value: fastify, label: "Fastify" }
58
+ - { value: hono, label: "Hono" }
59
+ - { value: elysia, label: "Elysia (Bun)" }
60
+ next: database
61
+
62
+ - id: database
63
+ type: select
64
+ message: "Database?"
65
+ options:
66
+ - { value: postgres, label: "PostgreSQL" }
67
+ - { value: mysql, label: "MySQL" }
68
+ - { value: sqlite, label: "SQLite" }
69
+ - { value: mongodb, label: "MongoDB" }
70
+ - { value: none, label: "No database" }
71
+ next: auth
72
+
73
+ - id: auth
74
+ type: select
75
+ message: "Authentication?"
76
+ when:
77
+ field: database
78
+ notEquals: none
79
+ options:
80
+ - { value: jwt, label: "JWT tokens" }
81
+ - { value: session, label: "Session-based" }
82
+ - { value: oauth, label: "OAuth 2.0" }
83
+ - { value: none, label: "No auth" }
84
+ next: deploy
85
+
86
+ - id: cli-features
87
+ type: multiselect
88
+ message: "CLI features to include"
89
+ options:
90
+ - { value: args, label: "Argument parsing (Commander)" }
91
+ - { value: prompts, label: "Interactive prompts" }
92
+ - { value: colors, label: "Colored output (Chalk)" }
93
+ - { value: spinner, label: "Spinners & progress bars" }
94
+ - { value: config, label: "Config file support" }
95
+ min: 1
96
+ next: deploy
97
+
98
+ - id: lib-target
99
+ type: multiselect
100
+ message: "Build targets"
101
+ options:
102
+ - { value: esm, label: "ESM" }
103
+ - { value: cjs, label: "CommonJS" }
104
+ - { value: types, label: "TypeScript declarations" }
105
+ - { value: umd, label: "UMD (browser)" }
106
+ default: ["esm", "types"]
107
+ min: 1
108
+ next: deploy
109
+
110
+ - id: deploy
111
+ type: select
112
+ message: "Deployment target?"
113
+ options:
114
+ - { value: vercel, label: "Vercel" }
115
+ - { value: aws, label: "AWS" }
116
+ - { value: docker, label: "Docker" }
117
+ - { value: npm, label: "npm (publish)" }
118
+ - { value: none, label: "None" }
119
+
120
+ - id: confirm
121
+ type: confirm
122
+ message: "Generate project?"
123
+ next: __done__
124
+
125
+ output:
126
+ format: json