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.
- package/LICENSE +21 -0
- package/README.md +1399 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +2485 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +354 -0
- package/dist/index.js +1922 -0
- package/dist/index.js.map +1 -0
- package/examples/all-features.yaml +54 -0
- package/examples/base.yaml +28 -0
- package/examples/basic.yaml +61 -0
- package/examples/conditional.yaml +126 -0
- package/examples/demo.yaml +112 -0
- package/examples/ebay-mcp-setup.yaml +171 -0
- package/examples/extended.yaml +34 -0
- package/examples/themed.yaml +92 -0
- package/examples/with-checks.yaml +34 -0
- package/package.json +73 -0
- package/schema/grimoire.schema.json +964 -0
|
@@ -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
|