atomism 0.1.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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/chunk-34O5KJWR.js +81 -0
  4. package/dist/chunk-34O5KJWR.js.map +1 -0
  5. package/dist/chunk-55AP34JO.js +116 -0
  6. package/dist/chunk-55AP34JO.js.map +1 -0
  7. package/dist/chunk-6MDHM2B4.js +17 -0
  8. package/dist/chunk-6MDHM2B4.js.map +1 -0
  9. package/dist/chunk-GU2R4KLP.js +43 -0
  10. package/dist/chunk-GU2R4KLP.js.map +1 -0
  11. package/dist/chunk-H7WC3NXZ.js +39 -0
  12. package/dist/chunk-H7WC3NXZ.js.map +1 -0
  13. package/dist/chunk-P33CQFMY.js +329 -0
  14. package/dist/chunk-P33CQFMY.js.map +1 -0
  15. package/dist/chunk-P6X7T4KA.js +200 -0
  16. package/dist/chunk-P6X7T4KA.js.map +1 -0
  17. package/dist/chunk-PLQJM2KT.js +9 -0
  18. package/dist/chunk-PLQJM2KT.js.map +1 -0
  19. package/dist/chunk-RS2IEGW3.js +10 -0
  20. package/dist/chunk-RS2IEGW3.js.map +1 -0
  21. package/dist/chunk-S6Z5G5DB.js +84 -0
  22. package/dist/chunk-S6Z5G5DB.js.map +1 -0
  23. package/dist/chunk-UVUDQ4XP.js +259 -0
  24. package/dist/chunk-UVUDQ4XP.js.map +1 -0
  25. package/dist/chunk-UWVZQSP4.js +597 -0
  26. package/dist/chunk-UWVZQSP4.js.map +1 -0
  27. package/dist/chunk-YKJO3ZFY.js +308 -0
  28. package/dist/chunk-YKJO3ZFY.js.map +1 -0
  29. package/dist/cli.d.ts +1 -0
  30. package/dist/cli.js +152 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/create-atom-AXPDBYQL.js +153 -0
  33. package/dist/create-atom-AXPDBYQL.js.map +1 -0
  34. package/dist/escalate-BTEJT5NL.js +211 -0
  35. package/dist/escalate-BTEJT5NL.js.map +1 -0
  36. package/dist/extract-RPKCTINT.js +514 -0
  37. package/dist/extract-RPKCTINT.js.map +1 -0
  38. package/dist/graduate-453M7ZRQ.js +222 -0
  39. package/dist/graduate-453M7ZRQ.js.map +1 -0
  40. package/dist/helpers-PJPFPYBQ.js +11 -0
  41. package/dist/helpers-PJPFPYBQ.js.map +1 -0
  42. package/dist/history-OPD7NLZW.js +258 -0
  43. package/dist/history-OPD7NLZW.js.map +1 -0
  44. package/dist/import-generator-4CKRBMTE.js +1864 -0
  45. package/dist/import-generator-4CKRBMTE.js.map +1 -0
  46. package/dist/index.d.ts +230 -0
  47. package/dist/index.js +41 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/init-2FINDMYK.js +741 -0
  50. package/dist/init-2FINDMYK.js.map +1 -0
  51. package/dist/list-NEBVBGG3.js +71 -0
  52. package/dist/list-NEBVBGG3.js.map +1 -0
  53. package/dist/parser-3BILOSOO.js +157 -0
  54. package/dist/parser-3BILOSOO.js.map +1 -0
  55. package/dist/plan-DNVARHWH.js +249 -0
  56. package/dist/plan-DNVARHWH.js.map +1 -0
  57. package/dist/register-XTRMSH7Y.js +91 -0
  58. package/dist/register-XTRMSH7Y.js.map +1 -0
  59. package/dist/revert-J4CRDE2K.js +87 -0
  60. package/dist/revert-J4CRDE2K.js.map +1 -0
  61. package/dist/run-3GI3SBYL.js +188 -0
  62. package/dist/run-3GI3SBYL.js.map +1 -0
  63. package/dist/scan-generators-ST4TBEY7.js +375 -0
  64. package/dist/scan-generators-ST4TBEY7.js.map +1 -0
  65. package/dist/signatures-K5QIL4WG.js +258 -0
  66. package/dist/signatures-K5QIL4WG.js.map +1 -0
  67. package/dist/skills-assign-IHOXX4AI.js +182 -0
  68. package/dist/skills-assign-IHOXX4AI.js.map +1 -0
  69. package/dist/skills-load-JSD5UG2K.js +20 -0
  70. package/dist/skills-load-JSD5UG2K.js.map +1 -0
  71. package/dist/skills-scan-WACJFRJN.js +25 -0
  72. package/dist/skills-scan-WACJFRJN.js.map +1 -0
  73. package/dist/skills-suggest-JFI2NUJI.js +269 -0
  74. package/dist/skills-suggest-JFI2NUJI.js.map +1 -0
  75. package/dist/status-KQVSAZFR.js +111 -0
  76. package/dist/status-KQVSAZFR.js.map +1 -0
  77. package/dist/suggest-IFFJQFIW.js +183 -0
  78. package/dist/suggest-IFFJQFIW.js.map +1 -0
  79. package/dist/test-HP3FG3MO.js +152 -0
  80. package/dist/test-HP3FG3MO.js.map +1 -0
  81. package/dist/test-gen-2ZGPOP35.js +347 -0
  82. package/dist/test-gen-2ZGPOP35.js.map +1 -0
  83. package/dist/trust-4R26DULG.js +248 -0
  84. package/dist/trust-4R26DULG.js.map +1 -0
  85. package/dist/validate-generator-46H2LYYQ.js +410 -0
  86. package/dist/validate-generator-46H2LYYQ.js.map +1 -0
  87. package/dist/workflow-5UVLBS7J.js +655 -0
  88. package/dist/workflow-5UVLBS7J.js.map +1 -0
  89. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/importer/plop.ts","../src/importer/hygen.ts","../src/importer/yeoman.ts","../src/importer/utils.ts","../src/importer/cookiecutter.ts","../src/importer/script.ts","../src/commands/import-generator.ts"],"sourcesContent":["/**\n * Plop generator importer.\n *\n * Analyzes Plop generators and converts them to atomic generators.\n *\n * @module importer/plop\n */\n\nimport { join, basename } from 'node:path';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { toErrorMessage } from '../utils/errors.js';\n\n/**\n * Plop prompt type mapping to Zod types.\n */\nconst PROMPT_TYPE_MAP: Record<string, string> = {\n input: 'z.string()',\n number: 'z.number()',\n confirm: 'z.boolean()',\n list: 'z.string()', // Will be enum if choices exist\n rawlist: 'z.string()',\n expand: 'z.string()',\n checkbox: 'z.array(z.string())',\n password: 'z.string()',\n editor: 'z.string()',\n};\n\n/**\n * Plop prompt definition (simplified).\n */\nexport interface PlopPrompt {\n type: string;\n name: string;\n message?: string;\n default?: unknown;\n choices?: Array<string | { name: string; value: string }>;\n validate?: string;\n filter?: string;\n when?: string;\n}\n\n/**\n * Plop action definition (simplified).\n */\nexport interface PlopAction {\n type: string;\n path?: string;\n templateFile?: string;\n template?: string;\n pattern?: string;\n transform?: string;\n skip?: string;\n}\n\n/**\n * Parsed Plop generator.\n */\nexport interface ParsedPlopGenerator {\n name: string;\n description?: string;\n prompts: PlopPrompt[];\n actions: PlopAction[];\n templateFiles: string[];\n}\n\n/**\n * Import result.\n */\nexport interface ImportResult {\n success: boolean;\n generatorPath?: string;\n mappings: ImportMapping[];\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Import mapping for logging decisions.\n */\nexport interface ImportMapping {\n source: string;\n target: string;\n type: 'prompt' | 'action' | 'template';\n notes?: string;\n}\n\n/**\n * Check if a path exists.\n */\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract generator definitions from plopfile content.\n *\n * This uses regex-based parsing which is limited but works for common patterns.\n * Returns a Map where malformed configs (unbalanced braces) are still included\n * but will be noted in warnings during import.\n */\nexport function extractGenerators(content: string): Map<string, string> {\n const generators = new Map<string, string>();\n\n // Match setGenerator calls and capture the generator name and config\n const regex = /setGenerator\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*,\\s*(\\{[\\s\\S]*?\\})\\s*\\)/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n const name = match[1];\n const config = match[2];\n if (name && config) {\n // Store config even if unbalanced - validation happens during import\n generators.set(name, config);\n }\n }\n\n return generators;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction _escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Escape a string for use in single-quoted TypeScript string literal.\n */\nfunction escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Check if braces are balanced in a string.\n */\nfunction areBracesBalanced(str: string): boolean {\n let count = 0;\n for (const char of str) {\n if (char === '{') count++;\n if (char === '}') count--;\n if (count < 0) return false;\n }\n return count === 0;\n}\n\n/**\n * Parse prompts from generator config string.\n */\nexport function parsePrompts(config: string): PlopPrompt[] {\n const prompts: PlopPrompt[] = [];\n\n // Extract prompts array\n const promptsMatch = config.match(/prompts\\s*:\\s*\\[([\\s\\S]*?)\\]/);\n if (!promptsMatch) {\n return prompts;\n }\n\n const promptsStr = promptsMatch[1];\n if (!promptsStr) return prompts;\n\n // Split by `{ type:` to isolate individual prompt objects\n const promptParts = promptsStr.split(/\\{\\s*type\\s*:/);\n\n for (const part of promptParts) {\n if (!part.trim()) continue;\n\n // Re-add the prefix for parsing\n const promptStr = '{ type:' + part;\n\n // Extract type\n const typeMatch = promptStr.match(/type\\s*:\\s*['\"]([^'\"]+)['\"]/);\n const type = typeMatch?.[1];\n if (!type) continue;\n\n // Extract name\n const nameMatch = promptStr.match(/name\\s*:\\s*['\"]([^'\"]+)['\"]/);\n const name = nameMatch?.[1];\n if (!name) continue;\n\n // Extract message from this isolated prompt object\n const messageMatch = promptStr.match(/message\\s*:\\s*['\"]([^'\"]+)['\"]/);\n const message = messageMatch?.[1];\n\n // Extract default from this isolated prompt object\n const defaultMatch = promptStr.match(/default\\s*:\\s*['\"]?([^'\",}]+)['\"]?/);\n const defaultVal = defaultMatch?.[1];\n\n prompts.push({\n type,\n name,\n message,\n default: defaultVal,\n });\n }\n\n return prompts;\n}\n\n/**\n * Parse actions from generator config string.\n */\nexport function parseActions(config: string): PlopAction[] {\n const actions: PlopAction[] = [];\n\n // Extract actions array\n const actionsMatch = config.match(/actions\\s*:\\s*\\[([\\s\\S]*?)\\]/);\n if (!actionsMatch) {\n return actions;\n }\n\n const actionsStr = actionsMatch[1];\n if (!actionsStr) return actions;\n\n // Match individual action objects - use balanced brace matching\n // Split by `{ type:` to find action boundaries\n const actionParts = actionsStr.split(/\\{\\s*type\\s*:/);\n\n for (const part of actionParts) {\n if (!part.trim()) continue;\n\n // Re-add the prefix for parsing\n const actionStr = '{ type:' + part;\n\n // Extract type\n const typeMatch = actionStr.match(/type\\s*:\\s*['\"]([^'\"]+)['\"]/);\n const type = typeMatch?.[1];\n if (!type) continue;\n\n // Extract path - handle {{handlebars}} syntax\n const pathMatch = actionStr.match(/path\\s*:\\s*['\"`]([^'\"`]*(?:\\{\\{[^}]+\\}\\}[^'\"`]*)*)['\"`]/);\n const path = pathMatch?.[1];\n\n // Extract templateFile\n const templateFileMatch = actionStr.match(/templateFile\\s*:\\s*['\"`]([^'\"`]+)['\"`]/);\n const templateFile = templateFileMatch?.[1];\n\n // Extract inline template\n const templateMatch = actionStr.match(/template\\s*:\\s*['\"`]([^'\"`]+)['\"`]/);\n const template = templateMatch?.[1];\n\n actions.push({\n type,\n path,\n templateFile,\n template,\n });\n }\n\n return actions;\n}\n\n/**\n * Convert Plop prompts to Zod schema string.\n */\nexport function promptsToZod(prompts: PlopPrompt[]): string {\n if (prompts.length === 0) {\n return 'z.object({})';\n }\n\n const fields = prompts.map((prompt) => {\n let zodType = PROMPT_TYPE_MAP[prompt.type] || 'z.string()';\n\n // Add description from message\n if (prompt.message) {\n zodType += `.describe('${escapeStringLiteral(prompt.message)}')`;\n }\n\n // Add default if present\n if (prompt.default !== undefined) {\n if (typeof prompt.default === 'string') {\n zodType += `.default('${escapeStringLiteral(prompt.default)}')`;\n } else if (typeof prompt.default === 'number') {\n zodType += `.default(${prompt.default})`;\n } else if (typeof prompt.default === 'boolean') {\n zodType += `.default(${prompt.default})`;\n }\n }\n\n return ` ${prompt.name}: ${zodType}`;\n });\n\n return `z.object({\\n${fields.join(',\\n')}\\n})`;\n}\n\n/**\n * Convert Plop actions to template function string.\n */\nexport function actionsToTemplate(\n actions: PlopAction[],\n prompts: PlopPrompt[]\n): string {\n const paramNames = prompts.map((p) => p.name);\n const destructure = paramNames.length > 0 ? `{ ${paramNames.join(', ')} }` : '_params';\n\n // Generate output based on actions\n const outputs: string[] = [];\n\n for (const action of actions) {\n if (action.type === 'add' && action.path) {\n // Convert Plop path syntax to template literal\n const path = action.path.replace(/\\{\\{([^}]+)\\}\\}/g, '${$1}');\n outputs.push(` // Output: ${path}`);\n\n if (action.templateFile) {\n outputs.push(` // Template: ${action.templateFile}`);\n } else if (action.template) {\n outputs.push(` // Inline template`);\n }\n } else if (action.type === 'modify' && action.path) {\n const path = action.path.replace(/\\{\\{([^}]+)\\}\\}/g, '${$1}');\n outputs.push(` // Modify: ${path}`);\n } else if (action.type === 'append' && action.path) {\n const path = action.path.replace(/\\{\\{([^}]+)\\}\\}/g, '${$1}');\n outputs.push(` // Append to: ${path}`);\n }\n }\n\n if (outputs.length === 0) {\n outputs.push(' // No actions to convert');\n }\n\n return `(${destructure}) => {\n${outputs.join('\\n')}\n return \\`\n// TODO: Implement template based on Plop actions\n// Original actions: ${actions.length}\n\\`;\n}`;\n}\n\n/**\n * Generate atomic generator from parsed Plop generator.\n */\nexport function generateAtomicGenerator(parsed: ParsedPlopGenerator): string {\n const zodSchema = promptsToZod(parsed.prompts);\n const templateFn = actionsToTemplate(parsed.actions, parsed.prompts);\n\n return `/**\n * Atomic generator: ${parsed.name}\n *\n * Imported from Plop generator.\n * ${parsed.description ? `Description: ${parsed.description}` : ''}\n *\n * @module generators/${parsed.name}\n */\n\nimport { z } from 'atomism';\n\n/**\n * Generator parameters schema.\n *\n * Converted from Plop prompts:\n${parsed.prompts.map((p) => ` * - ${p.name}: ${p.type}${p.message ? ` (${p.message})` : ''}`).join('\\n')}\n */\nexport const paramsSchema = ${zodSchema};\n\nexport type Params = z.infer<typeof paramsSchema>;\n\n/**\n * Template function.\n *\n * Converted from Plop actions:\n${parsed.actions.map((a) => ` * - ${a.type}: ${a.path || a.templateFile || 'inline'}`).join('\\n')}\n */\nexport const template = ${templateFn};\n\n/**\n * Generator metadata.\n */\nexport const generator = {\n name: '${escapeStringLiteral(parsed.name)}',\n description: '${escapeStringLiteral(parsed.description || `Generator for ${parsed.name}`)}',\n params: paramsSchema,\n template,\n language: 'typescript' as const,\n};\n\nexport default generator;\n`;\n}\n\n/**\n * Import options.\n */\nexport interface ImportPlopOptions {\n /** Project root directory. */\n projectRoot: string;\n /** Generator name to import. */\n generatorName: string;\n /** Output directory for generators. */\n outputDir?: string;\n /** Overwrite existing generator. */\n overwrite?: boolean;\n}\n\n/**\n * Import a Plop generator.\n *\n * @param options - Import options\n * @returns Import result\n */\nexport async function importPlopGenerator(\n options: ImportPlopOptions\n): Promise<ImportResult> {\n const {\n projectRoot,\n generatorName,\n outputDir = 'generators',\n overwrite = false,\n } = options;\n\n const result: ImportResult = {\n success: false,\n mappings: [],\n warnings: [],\n errors: [],\n };\n\n // Find plopfile\n const plopFiles = ['plopfile.js', 'plopfile.ts', 'plopfile.mjs', 'plopfile.cjs'];\n let plopPath: string | null = null;\n\n for (const file of plopFiles) {\n const path = join(projectRoot, file);\n if (await pathExists(path)) {\n plopPath = path;\n break;\n }\n }\n\n if (!plopPath) {\n result.errors.push('No plopfile found in project root');\n return result;\n }\n\n // Read plopfile\n let content: string;\n try {\n content = await readFile(plopPath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read plopfile: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Extract generators\n const generators = extractGenerators(content);\n if (!generators.has(generatorName)) {\n result.errors.push(\n `Generator '${generatorName}' not found. Available: ${Array.from(generators.keys()).join(', ') || 'none'}`\n );\n return result;\n }\n\n const generatorConfig = generators.get(generatorName)!;\n\n // Warn if config appears malformed (unbalanced braces)\n if (!areBracesBalanced(generatorConfig)) {\n result.warnings.push(\n `Generator '${generatorName}' config may be malformed (unbalanced braces). Parsing may be incomplete.`\n );\n }\n\n // Parse prompts and actions\n const prompts = parsePrompts(generatorConfig);\n const actions = parseActions(generatorConfig);\n\n // Log mappings\n for (const prompt of prompts) {\n result.mappings.push({\n source: `prompt:${prompt.name}`,\n target: `params.${prompt.name}`,\n type: 'prompt',\n notes: `${prompt.type} → ${PROMPT_TYPE_MAP[prompt.type] || 'z.string()'}`,\n });\n }\n\n for (const action of actions) {\n result.mappings.push({\n source: `action:${action.type}`,\n target: action.path || action.templateFile || 'inline',\n type: 'action',\n notes: action.templateFile ? `templateFile: ${action.templateFile}` : undefined,\n });\n }\n\n // Extract template files\n const templateFiles = actions\n .filter((a) => a.templateFile)\n .map((a) => a.templateFile!);\n\n // Create parsed generator\n const parsed: ParsedPlopGenerator = {\n name: generatorName,\n prompts,\n actions,\n templateFiles,\n };\n\n // Check for description in config\n const descMatch = generatorConfig.match(/description\\s*:\\s*['\"]([^'\"]+)['\"]/);\n if (descMatch) {\n parsed.description = descMatch[1];\n }\n\n // Generate atomic generator\n const atomicGenerator = generateAtomicGenerator(parsed);\n\n // Validate generatorName to prevent path traversal\n const safeGeneratorName = basename(generatorName);\n if (safeGeneratorName !== generatorName || generatorName.includes('..')) {\n result.errors.push(\n `Invalid generator name '${generatorName}': must be a simple filename without path components`\n );\n return result;\n }\n\n // Create output directory\n const outputPath = join(projectRoot, outputDir);\n try {\n await mkdir(outputPath, { recursive: true });\n } catch (err) {\n result.errors.push(`Failed to create output directory: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Write generator file\n const generatorPath = join(outputPath, `${safeGeneratorName}.ts`);\n\n if ((await pathExists(generatorPath)) && !overwrite) {\n result.errors.push(\n `Generator file already exists: ${generatorPath}. Use --overwrite to replace.`\n );\n return result;\n }\n\n try {\n await writeFile(generatorPath, atomicGenerator, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to write generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Add warnings for things that need manual review\n if (prompts.length === 0) {\n result.warnings.push('No prompts found - generator will have empty params');\n }\n\n if (actions.length === 0) {\n result.warnings.push('No actions found - template function is placeholder');\n }\n\n for (const action of actions) {\n if (action.templateFile) {\n result.warnings.push(\n `Template file '${action.templateFile}' needs manual conversion`\n );\n }\n }\n\n result.success = true;\n result.generatorPath = generatorPath;\n\n return result;\n}\n","/**\n * Hygen generator importer.\n *\n * Analyzes Hygen templates and converts them to atomic generators.\n *\n * Hygen template structure:\n * - Located in `_templates/<generator>/<action>/` directories\n * - Template files have YAML frontmatter (between ---) and EJS body\n * - Frontmatter contains: to (output path), inject, sh, etc.\n * - prompt.js files define interactive prompts\n *\n * @module importer/hygen\n */\n\nimport { join, basename } from 'node:path';\nimport { readFile, writeFile, mkdir, access, readdir } from 'node:fs/promises';\nimport { toErrorMessage } from '../utils/errors.js';\n\n/**\n * Hygen prompt definition (from prompt.js).\n */\nexport interface HygenPrompt {\n type: string;\n name: string;\n message?: string;\n initial?: unknown;\n choices?: string[];\n}\n\n/**\n * Hygen template file.\n */\nexport interface HygenTemplate {\n filename: string;\n frontmatter: Record<string, string>;\n body: string;\n outputPath?: string;\n}\n\n/**\n * Parsed Hygen generator.\n */\nexport interface ParsedHygenGenerator {\n name: string;\n action: string;\n description?: string;\n prompts: HygenPrompt[];\n templates: HygenTemplate[];\n}\n\n/**\n * Import result.\n */\nexport interface HygenImportResult {\n success: boolean;\n generatorPath?: string;\n mappings: HygenImportMapping[];\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Import mapping for logging decisions.\n */\nexport interface HygenImportMapping {\n source: string;\n target: string;\n type: 'prompt' | 'template' | 'frontmatter';\n notes?: string;\n}\n\n/**\n * Hygen prompt type mapping to Zod types.\n */\nconst PROMPT_TYPE_MAP: Record<string, string> = {\n input: 'z.string()',\n text: 'z.string()',\n number: 'z.number()',\n confirm: 'z.boolean()',\n toggle: 'z.boolean()',\n select: 'z.string()',\n multiselect: 'z.array(z.string())',\n list: 'z.string()',\n autocomplete: 'z.string()',\n};\n\n/**\n * Check if a path exists.\n */\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Escape a string for use in single-quoted TypeScript string literal.\n */\nfunction escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Sanitize a string for use in JSDoc comments.\n * Escapes sequences that could break the comment block.\n */\nfunction sanitizeJsDocContent(str: string): string {\n return str\n .replace(/\\*\\//g, '*\\\\/')\n .replace(/\\/\\*/g, '/\\\\*');\n}\n\n/**\n * Parse YAML frontmatter from template content.\n */\nexport function parseFrontmatter(content: string): { frontmatter: Record<string, string>; body: string } {\n const frontmatter: Record<string, string> = {};\n\n // Normalize CRLF to LF for cross-platform compatibility\n const normalizedContent = content.replace(/\\r\\n/g, '\\n');\n\n // Check for frontmatter delimiter\n if (!normalizedContent.startsWith('---')) {\n return { frontmatter, body: normalizedContent };\n }\n\n // Find the closing delimiter\n const endIndex = normalizedContent.indexOf('\\n---', 3);\n if (endIndex === -1) {\n return { frontmatter, body: normalizedContent };\n }\n\n const frontmatterStr = normalizedContent.substring(4, endIndex);\n const body = normalizedContent.substring(endIndex + 4).trim();\n\n // Parse simple YAML (key: value pairs)\n const lines = frontmatterStr.split('\\n');\n for (const line of lines) {\n const match = line.match(/^(\\w+):\\s*(.+)$/);\n if (match) {\n const key = match[1];\n let value = match[2]!.trim();\n // Remove quotes if present\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) {\n frontmatter[key] = value;\n }\n }\n }\n\n return { frontmatter, body };\n}\n\n/**\n * Convert EJS syntax to template literal syntax.\n *\n * EJS: <%= name %> -> ${name}\n * EJS: <%- name %> -> ${name} (unescaped, same in template literal)\n * EJS: <% code %> -> Not supported, add warning\n */\nexport function convertEjsToTemplateLiteral(ejs: string): { template: string; hasCodeBlocks: boolean } {\n let hasCodeBlocks = false;\n\n // Check for code blocks (<% ... %> without = or -)\n if (/<%((?!=|-)[\\s\\S]*?)%>/.test(ejs)) {\n hasCodeBlocks = true;\n }\n\n let template = ejs\n // Convert <%= var %> to ${var}\n .replace(/<%=\\s*([^%]+?)\\s*%>/g, '${$1}')\n // Convert <%- var %> to ${var} (unescaped output)\n .replace(/<%-\\s*([^%]+?)\\s*%>/g, '${$1}')\n // Remove code blocks (not supported in template literals)\n .replace(/<%[\\s\\S]*?%>/g, '/* EJS code block - manual conversion needed */');\n\n // Escape backticks for template literal\n template = template.replace(/`/g, '\\\\`');\n\n return { template, hasCodeBlocks };\n}\n\n/**\n * Extract variable names from EJS template.\n */\nexport function extractEjsVariables(ejs: string): string[] {\n const variables = new Set<string>();\n const skipTokens = ['h', 'locals', 'helpers', 'if', 'else', 'for', 'while', 'true', 'false', 'null', 'undefined'];\n\n // Match <%= var %> and <%- var %> - capture the whole expression\n const regex = /<%[=-]\\s*([^%]+?)\\s*%>/g;\n let match;\n\n while ((match = regex.exec(ejs)) !== null) {\n const expression = match[1];\n if (!expression) continue;\n\n // Use matchAll to get each token's position correctly\n const tokenMatches = expression.matchAll(/\\b(\\w+)\\b/g);\n\n for (const tokenMatch of tokenMatches) {\n const token = tokenMatch[1];\n if (!token) continue;\n\n // Skip helper objects and common JS keywords\n if (skipTokens.includes(token)) continue;\n\n // Check if this specific token occurrence is followed by (\n const tokenEndIndex = tokenMatch.index! + tokenMatch[0].length;\n const afterToken = expression.slice(tokenEndIndex).trimStart();\n if (!afterToken.startsWith('(')) {\n variables.add(token);\n }\n }\n }\n\n return Array.from(variables);\n}\n\n/**\n * Parse prompts from prompt.js content.\n */\nexport function parsePromptJs(content: string): HygenPrompt[] {\n const prompts: HygenPrompt[] = [];\n\n // Match any JS object block (handles both { type, name } and { name, type } order)\n const objectRegex = /\\{[^{}]*\\}/g;\n let objMatch;\n\n while ((objMatch = objectRegex.exec(content)) !== null) {\n const promptStr = objMatch[0];\n\n // Extract type and name independently (order-agnostic)\n const typeMatch = promptStr.match(/type\\s*:\\s*['\"](\\w+)['\"]/);\n const nameMatch = promptStr.match(/name\\s*:\\s*['\"](\\w+)['\"]/);\n\n const type = typeMatch?.[1];\n const name = nameMatch?.[1];\n\n if (type && name) {\n // Extract message if present\n const messageMatch = promptStr.match(/message\\s*:\\s*['\"]([^'\"]+)['\"]/);\n const message = messageMatch?.[1];\n\n // Extract initial/default if present (trim to handle trailing whitespace)\n const initialMatch = promptStr.match(/initial\\s*:\\s*['\"]?([^'\",}]+)['\"]?/);\n const initial = initialMatch?.[1]?.trim();\n\n prompts.push({\n type,\n name,\n message,\n initial,\n });\n }\n }\n\n return prompts;\n}\n\n/**\n * Convert Hygen prompts to Zod schema string.\n */\nexport function promptsToZod(prompts: HygenPrompt[]): string {\n if (prompts.length === 0) {\n return 'z.object({})';\n }\n\n const fields = prompts.map((prompt) => {\n let zodType = PROMPT_TYPE_MAP[prompt.type] || 'z.string()';\n\n // Add description from message\n if (prompt.message) {\n zodType += `.describe('${escapeStringLiteral(prompt.message)}')`;\n }\n\n // Add default if present\n if (prompt.initial !== undefined) {\n if (Array.isArray(prompt.initial)) {\n // Handle array defaults for multiselect prompts\n const items = prompt.initial.map((item) =>\n typeof item === 'string' ? `'${escapeStringLiteral(item)}'` : String(item)\n );\n zodType += `.default([${items.join(', ')}])`;\n } else if (typeof prompt.initial === 'string') {\n zodType += `.default('${escapeStringLiteral(prompt.initial)}')`;\n } else if (typeof prompt.initial === 'number') {\n zodType += `.default(${prompt.initial})`;\n } else if (typeof prompt.initial === 'boolean') {\n zodType += `.default(${prompt.initial})`;\n }\n }\n\n return ` ${prompt.name}: ${zodType}`;\n });\n\n return `z.object({\\n${fields.join(',\\n')}\\n})`;\n}\n\n/**\n * Scan for Hygen generators in _templates directory.\n */\nexport async function scanHygenGenerators(templatesDir: string): Promise<Map<string, string[]>> {\n const generators = new Map<string, string[]>();\n\n if (!(await pathExists(templatesDir))) {\n return generators;\n }\n\n try {\n const entries = await readdir(templatesDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const generatorName = entry.name;\n const generatorPath = join(templatesDir, generatorName);\n\n try {\n // List actions (subdirectories)\n const actionEntries = await readdir(generatorPath, { withFileTypes: true });\n const actions = actionEntries\n .filter((e) => e.isDirectory())\n .map((e) => e.name);\n\n if (actions.length > 0) {\n generators.set(generatorName, actions);\n }\n } catch (err) {\n // Per-generator error - continue scanning other generators\n console.warn(`Warning: Failed to scan generator '${generatorName}' at ${generatorPath}: ${toErrorMessage(err)}`);\n }\n }\n }\n } catch (err) {\n // Log directory read error but continue with partial results\n console.warn(`Warning: Failed to scan templates directory: ${toErrorMessage(err)}`);\n }\n\n return generators;\n}\n\n/**\n * Generate atomic generator from parsed Hygen generator.\n */\nexport function generateAtomicGenerator(parsed: ParsedHygenGenerator): string {\n const zodSchema = promptsToZod(parsed.prompts);\n\n // Collect all variables from templates\n const allVariables = new Set<string>();\n for (const prompt of parsed.prompts) {\n allVariables.add(prompt.name);\n }\n for (const template of parsed.templates) {\n const vars = extractEjsVariables(template.body);\n for (const v of vars) {\n allVariables.add(v);\n }\n }\n\n const paramNames = Array.from(allVariables);\n const destructure = paramNames.length > 0 ? `{ ${paramNames.join(', ')} }` : '_params';\n\n // Build template function with converted bodies\n const templateOutputs: string[] = [];\n const convertedBodies: string[] = [];\n\n for (const template of parsed.templates) {\n const { template: convertedBody, hasCodeBlocks } = convertEjsToTemplateLiteral(template.body);\n const outputPath = template.frontmatter['to']\n ? convertEjsToTemplateLiteral(template.frontmatter['to']).template\n : template.filename;\n\n templateOutputs.push(` // Output: ${outputPath}`);\n if (hasCodeBlocks) {\n templateOutputs.push(` // WARNING: Contains EJS code blocks that need manual conversion`);\n }\n\n // Store converted body for use in template output\n convertedBodies.push(`// --- ${template.filename} ---\\n${convertedBody}`);\n }\n\n if (templateOutputs.length === 0) {\n templateOutputs.push(' // No templates found');\n }\n\n // Combine converted bodies for template output\n const combinedBodies = convertedBodies.length > 0\n ? convertedBodies.join('\\n\\n')\n : '// No templates found';\n\n const templateFn = `(${destructure}) => {\n${templateOutputs.join('\\n')}\n return \\`\n${combinedBodies}\n\\`;\n}`;\n\n const safeName = escapeStringLiteral(parsed.name);\n const safeAction = escapeStringLiteral(parsed.action);\n const safeDescription = escapeStringLiteral(parsed.description || `Generator for ${parsed.name}/${parsed.action}`);\n\n return `/**\n * Atomic generator: ${safeName}/${safeAction}\n *\n * Imported from Hygen generator.\n *\n * @module generators/${safeName}-${safeAction}\n */\n\nimport { z } from 'atomism';\n\n/**\n * Generator parameters schema.\n *\n * Converted from Hygen prompts:\n${parsed.prompts.map((p) => ` * - ${sanitizeJsDocContent(p.name)}: ${sanitizeJsDocContent(p.type)}${p.message ? ` (${sanitizeJsDocContent(p.message)})` : ''}`).join('\\n')}\n */\nexport const paramsSchema = ${zodSchema};\n\nexport type Params = z.infer<typeof paramsSchema>;\n\n/**\n * Template function.\n *\n * Converted from Hygen templates:\n${parsed.templates.map((t) => ` * - ${sanitizeJsDocContent(t.filename)}: ${sanitizeJsDocContent(t.frontmatter['to'] || 'inline')}`).join('\\n')}\n */\nexport const template = ${templateFn};\n\n/**\n * Generator metadata.\n */\nexport const generator = {\n name: '${safeName}-${safeAction}',\n description: '${safeDescription}',\n params: paramsSchema,\n template,\n language: 'typescript' as const,\n};\n\nexport default generator;\n`;\n}\n\n/**\n * Import options.\n */\nexport interface ImportHygenOptions {\n /** Project root directory. */\n projectRoot: string;\n /** Generator name to import. */\n generatorName: string;\n /** Action name to import. */\n actionName?: string;\n /** Output directory for generators. */\n outputDir?: string;\n /** Overwrite existing generator. */\n overwrite?: boolean;\n}\n\n/**\n * Import a Hygen generator.\n *\n * @param options - Import options\n * @returns Import result\n */\nexport async function importHygenGenerator(\n options: ImportHygenOptions\n): Promise<HygenImportResult> {\n const {\n projectRoot,\n generatorName,\n actionName,\n outputDir = 'generators',\n overwrite = false,\n } = options;\n\n const result: HygenImportResult = {\n success: false,\n mappings: [],\n warnings: [],\n errors: [],\n };\n\n // Find _templates directory\n const templatesDir = join(projectRoot, '_templates');\n if (!(await pathExists(templatesDir))) {\n result.errors.push('No _templates directory found in project root');\n return result;\n }\n\n // Scan for generators\n const generators = await scanHygenGenerators(templatesDir);\n if (!generators.has(generatorName)) {\n result.errors.push(\n `Generator '${generatorName}' not found. Available: ${Array.from(generators.keys()).join(', ') || 'none'}`\n );\n return result;\n }\n\n const actions = generators.get(generatorName)!;\n\n // If no action specified, use first action or require selection\n let targetAction = actionName;\n if (!targetAction) {\n if (actions.length === 1) {\n targetAction = actions[0];\n } else {\n result.errors.push(\n `Multiple actions available for '${generatorName}'. Specify one: ${actions.join(', ')}`\n );\n return result;\n }\n }\n\n if (!actions.includes(targetAction!)) {\n result.errors.push(\n `Action '${targetAction}' not found for generator '${generatorName}'. Available: ${actions.join(', ')}`\n );\n return result;\n }\n\n const actionDir = join(templatesDir, generatorName, targetAction!);\n\n // Read template files\n const templates: HygenTemplate[] = [];\n const prompts: HygenPrompt[] = [];\n\n try {\n const files = await readdir(actionDir);\n\n for (const file of files) {\n const filePath = join(actionDir, file);\n\n if (file === 'prompt.js' || file === 'prompt.cjs' || file === 'prompt.mjs') {\n // Parse prompt file\n const content = await readFile(filePath, 'utf-8');\n const parsedPrompts = parsePromptJs(content);\n prompts.push(...parsedPrompts);\n\n for (const prompt of parsedPrompts) {\n result.mappings.push({\n source: `prompt:${prompt.name}`,\n target: `params.${prompt.name}`,\n type: 'prompt',\n notes: `${prompt.type} → ${PROMPT_TYPE_MAP[prompt.type] || 'z.string()'}`,\n });\n }\n } else if (file.endsWith('.ejs.t') || file.endsWith('.t')) {\n // Parse template file\n const content = await readFile(filePath, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n\n templates.push({\n filename: file,\n frontmatter,\n body,\n outputPath: frontmatter['to'],\n });\n\n result.mappings.push({\n source: `template:${file}`,\n target: frontmatter['to'] || 'inline',\n type: 'template',\n notes: frontmatter['to'] ? `to: ${frontmatter['to']}` : undefined,\n });\n\n // Check for EJS code blocks\n if (/<%((?!=|-)[\\s\\S]*?)%>/.test(body)) {\n result.warnings.push(\n `Template '${file}' contains EJS code blocks that need manual conversion`\n );\n }\n }\n }\n } catch (err) {\n result.errors.push(`Failed to read templates: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Create parsed generator\n const parsed: ParsedHygenGenerator = {\n name: generatorName,\n action: targetAction!,\n prompts,\n templates,\n };\n\n // Generate atomic generator\n const atomicGenerator = generateAtomicGenerator(parsed);\n\n // Validate output name\n const outputName = `${generatorName}-${targetAction}`;\n const safeOutputName = basename(outputName);\n if (safeOutputName !== outputName || outputName.includes('..')) {\n result.errors.push(\n `Invalid generator name '${outputName}': must be a simple filename without path components`\n );\n return result;\n }\n\n // Create output directory\n const outputPath = join(projectRoot, outputDir);\n try {\n await mkdir(outputPath, { recursive: true });\n } catch (err) {\n result.errors.push(`Failed to create output directory: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Write generator file\n const generatorPath = join(outputPath, `${safeOutputName}.ts`);\n\n if ((await pathExists(generatorPath)) && !overwrite) {\n result.errors.push(\n `Generator file already exists: ${generatorPath}. Use --overwrite to replace.`\n );\n return result;\n }\n\n try {\n await writeFile(generatorPath, atomicGenerator, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to write generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Add warnings\n if (prompts.length === 0) {\n result.warnings.push('No prompts found - generator will have empty params');\n }\n\n if (templates.length === 0) {\n result.warnings.push('No templates found - template function is placeholder');\n }\n\n result.success = true;\n result.generatorPath = generatorPath;\n\n return result;\n}\n","/**\n * Yeoman generator importer.\n *\n * Analyzes Yeoman generators and converts them to atomic generators.\n *\n * Yeoman generator structure:\n * - Located in `generators/<name>/` directories or as npm packages `generator-*`\n * - `index.js` contains the generator class with prompting() and writing() methods\n * - Uses Inquirer.js for prompts\n *\n * @module importer/yeoman\n */\n\nimport { join, basename } from 'node:path';\nimport { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';\nimport { pathExists, escapeStringLiteral, sanitizeJsDocContent } from './utils.js';\nimport { toErrorMessage } from '../utils/errors.js';\n\n/**\n * Yeoman prompt definition.\n */\nexport interface YeomanPrompt {\n type: string;\n name: string;\n message?: string;\n default?: unknown;\n choices?: string[];\n}\n\n/**\n * Parsed Yeoman generator.\n */\nexport interface ParsedYeomanGenerator {\n name: string;\n description?: string;\n prompts: YeomanPrompt[];\n methods: string[];\n}\n\n/**\n * Import result.\n */\nexport interface YeomanImportResult {\n success: boolean;\n generatorPath?: string;\n mappings: YeomanImportMapping[];\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Import mapping for logging decisions.\n */\nexport interface YeomanImportMapping {\n source: string;\n target: string;\n type: 'prompt' | 'method' | 'option';\n notes?: string;\n}\n\n/**\n * Yeoman prompt type mapping to Zod types.\n */\nconst PROMPT_TYPE_MAP: Record<string, string> = {\n input: 'z.string()',\n number: 'z.number()',\n confirm: 'z.boolean()',\n list: 'z.string()',\n rawlist: 'z.string()',\n expand: 'z.string()',\n checkbox: 'z.array(z.string())',\n password: 'z.string()',\n editor: 'z.string()',\n};\n\n/**\n * Parse prompts from Yeoman generator content.\n */\nexport function parseYeomanPrompts(content: string): { prompts: YeomanPrompt[]; warnings: string[] } {\n const prompts: YeomanPrompt[] = [];\n const warnings: string[] = [];\n\n // Look for this.prompt([...]) calls\n const promptArrayMatch = content.match(/this\\.prompt\\s*\\(\\s*\\[([\\s\\S]*?)\\]\\s*\\)/);\n if (!promptArrayMatch) {\n return { prompts, warnings };\n }\n\n const promptArray = promptArrayMatch[1]!;\n\n // Match individual prompt objects\n // Note: This regex won't match prompts with nested objects (when, filter, validate functions)\n // Complex prompts with nested braces may need manual conversion\n const objectRegex = /\\{[^{}]*\\}/g;\n let objMatch;\n\n while ((objMatch = objectRegex.exec(promptArray)) !== null) {\n const promptStr = objMatch[0];\n\n // Extract type and name independently\n const typeMatch = promptStr.match(/type\\s*:\\s*['\"](\\w+)['\"]/);\n const nameMatch = promptStr.match(/name\\s*:\\s*['\"](\\w+)['\"]/);\n\n const type = typeMatch?.[1];\n const name = nameMatch?.[1];\n\n if (type && name) {\n const messageMatch = promptStr.match(/message\\s*:\\s*['\"]([^'\"]+)['\"]/);\n // Match quoted strings or simple unquoted values (numbers, booleans, identifiers)\n const defaultMatch = promptStr.match(/default\\s*:\\s*(?:'([^']*)'|\"([^\"]*)\"|(\\w+))/);\n\n prompts.push({\n type,\n name,\n message: messageMatch?.[1],\n default: (defaultMatch?.[1] ?? defaultMatch?.[2] ?? defaultMatch?.[3])?.trim(),\n });\n }\n }\n\n // Check for potentially missed complex prompts with nested braces\n const simpleObjectCount = (promptArray.match(/\\{[^{}]*\\}/g) || []).length;\n const nestedBraceCount = (promptArray.match(/\\{/g) || []).length;\n if (nestedBraceCount > simpleObjectCount) {\n warnings.push(\n 'Some prompts with nested objects (when/filter/validate functions) may not have been fully parsed. Manual review recommended.'\n );\n }\n\n return { prompts, warnings };\n}\n\n/**\n * Parse lifecycle methods from Yeoman generator.\n */\nexport function parseYeomanMethods(content: string): string[] {\n const methods: string[] = [];\n\n // Common Yeoman lifecycle methods\n const lifecycleMethods = [\n 'initializing',\n 'prompting',\n 'configuring',\n 'default',\n 'writing',\n 'conflicts',\n 'install',\n 'end',\n ];\n\n for (const method of lifecycleMethods) {\n // Check for method definition patterns\n const patterns = [\n new RegExp(`${method}\\\\s*\\\\(`), // method()\n new RegExp(`${method}\\\\s*:\\\\s*function`), // method: function\n new RegExp(`${method}\\\\s*:\\\\s*async`), // method: async\n new RegExp(`async\\\\s+${method}\\\\s*\\\\(`), // async method()\n ];\n\n if (patterns.some((p) => p.test(content))) {\n methods.push(method);\n }\n }\n\n return methods;\n}\n\n/**\n * Convert Yeoman prompts to Zod schema string.\n */\nexport function promptsToZod(prompts: YeomanPrompt[]): string {\n if (prompts.length === 0) {\n return 'z.object({})';\n }\n\n const fields = prompts.map((prompt) => {\n let zodType = PROMPT_TYPE_MAP[prompt.type] || 'z.string()';\n\n if (prompt.message) {\n zodType += `.describe('${escapeStringLiteral(prompt.message)}')`;\n }\n\n if (prompt.default !== undefined) {\n if (Array.isArray(prompt.default)) {\n const items = prompt.default.map((item) =>\n typeof item === 'string' ? `'${escapeStringLiteral(item)}'` : String(item)\n );\n zodType += `.default([${items.join(', ')}])`;\n } else if (typeof prompt.default === 'string') {\n zodType += `.default('${escapeStringLiteral(prompt.default)}')`;\n } else if (typeof prompt.default === 'number') {\n zodType += `.default(${prompt.default})`;\n } else if (typeof prompt.default === 'boolean') {\n zodType += `.default(${prompt.default})`;\n }\n }\n\n return ` ${prompt.name}: ${zodType}`;\n });\n\n return `z.object({\\n${fields.join(',\\n')}\\n})`;\n}\n\n/**\n * Scan for Yeoman generators in project.\n */\nexport async function scanYeomanGenerators(projectRoot: string): Promise<Map<string, string>> {\n const generators = new Map<string, string>();\n\n // Check generators/ directory\n const generatorsDir = join(projectRoot, 'generators');\n if (await pathExists(generatorsDir)) {\n try {\n const entries = await readdir(generatorsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const indexPath = join(generatorsDir, entry.name, 'index.js');\n if (await pathExists(indexPath)) {\n generators.set(entry.name, indexPath);\n }\n }\n }\n } catch (err) {\n console.warn(`Warning: Failed to scan generators directory: ${toErrorMessage(err)}`);\n }\n }\n\n // Check for generator-* packages in node_modules\n const nodeModulesDir = join(projectRoot, 'node_modules');\n if (await pathExists(nodeModulesDir)) {\n try {\n const entries = await readdir(nodeModulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith('generator-')) {\n const genName = entry.name.replace('generator-', '');\n const indexPath = join(nodeModulesDir, entry.name, 'generators', 'app', 'index.js');\n if (await pathExists(indexPath)) {\n generators.set(genName, indexPath);\n }\n }\n }\n } catch (err) {\n console.warn(`Warning: Failed to scan node_modules: ${toErrorMessage(err)}`);\n }\n }\n\n return generators;\n}\n\n/**\n * Generate atomic generator from parsed Yeoman generator.\n */\nexport function generateAtomicGenerator(parsed: ParsedYeomanGenerator): string {\n const zodSchema = promptsToZod(parsed.prompts);\n\n const paramNames = parsed.prompts.map((p) => p.name);\n const destructure = paramNames.length > 0 ? `{ ${paramNames.join(', ')} }` : '_';\n\n const safeName = escapeStringLiteral(parsed.name);\n const safeDescription = escapeStringLiteral(parsed.description || `Generator for ${parsed.name}`);\n\n return `/**\n * Atomic generator: ${safeName}\n *\n * Imported from Yeoman generator.\n *\n * @module generators/${safeName}\n */\n\nimport { z } from 'atomism';\n\n/**\n * Generator parameters schema.\n *\n * Converted from Yeoman prompts:\n${parsed.prompts.map((p) => ` * - ${sanitizeJsDocContent(p.name)}: ${sanitizeJsDocContent(p.type)}${p.message ? ` (${sanitizeJsDocContent(p.message)})` : ''}`).join('\\n')}\n */\nexport const paramsSchema = ${zodSchema};\n\nexport type Params = z.infer<typeof paramsSchema>;\n\n/**\n * Template function.\n *\n * Original Yeoman methods: ${parsed.methods.join(', ') || 'none detected'}\n */\nexport const template = (${destructure}: Params) => {\n // TODO: Implement template based on Yeoman generator\n // Original lifecycle methods: ${parsed.methods.join(', ') || 'none'}\n return \\`\n// Generated from Yeoman generator: ${safeName}\n// Parameters: ${paramNames.join(', ') || 'none'}\n\\`;\n};\n\n/**\n * Generator metadata.\n */\nexport const generator = {\n name: '${safeName}',\n description: '${safeDescription}',\n params: paramsSchema,\n template,\n language: 'typescript' as const,\n};\n\nexport default generator;\n`;\n}\n\n/**\n * Import options.\n */\nexport interface ImportYeomanOptions {\n projectRoot: string;\n generatorName: string;\n outputDir?: string;\n overwrite?: boolean;\n}\n\n/**\n * Import a Yeoman generator.\n */\nexport async function importYeomanGenerator(\n options: ImportYeomanOptions\n): Promise<YeomanImportResult> {\n const {\n projectRoot,\n generatorName,\n outputDir = 'generators',\n overwrite = false,\n } = options;\n\n const result: YeomanImportResult = {\n success: false,\n mappings: [],\n warnings: [],\n errors: [],\n };\n\n // Validate generator name\n const safeGeneratorName = basename(generatorName);\n if (safeGeneratorName !== generatorName || generatorName.includes('..')) {\n result.errors.push(\n `Invalid generator name '${generatorName}': must be a simple name without path components`\n );\n return result;\n }\n\n // Scan for generators\n const generators = await scanYeomanGenerators(projectRoot);\n if (!generators.has(generatorName)) {\n result.errors.push(\n `Generator '${generatorName}' not found. Available: ${Array.from(generators.keys()).join(', ') || 'none'}`\n );\n return result;\n }\n\n const generatorPath = generators.get(generatorName)!;\n\n // Read generator content\n let content: string;\n try {\n content = await readFile(generatorPath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Parse prompts and methods\n const { prompts, warnings: promptWarnings } = parseYeomanPrompts(content);\n const methods = parseYeomanMethods(content);\n\n // Add any parsing warnings\n result.warnings.push(...promptWarnings);\n\n // Log mappings\n for (const prompt of prompts) {\n result.mappings.push({\n source: `prompt:${prompt.name}`,\n target: `params.${prompt.name}`,\n type: 'prompt',\n notes: `${prompt.type} → ${PROMPT_TYPE_MAP[prompt.type] || 'z.string()'}`,\n });\n }\n\n for (const method of methods) {\n result.mappings.push({\n source: `method:${method}`,\n target: 'template function',\n type: 'method',\n notes: 'Lifecycle method needs manual conversion',\n });\n }\n\n // Create parsed generator\n const parsed: ParsedYeomanGenerator = {\n name: generatorName,\n prompts,\n methods,\n };\n\n // Generate atomic generator\n const atomicGenerator = generateAtomicGenerator(parsed);\n\n // Create output directory\n const outputPath = join(projectRoot, outputDir);\n try {\n await mkdir(outputPath, { recursive: true });\n } catch (err) {\n result.errors.push(`Failed to create output directory: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Write generator file\n const outputFilePath = join(outputPath, `${safeGeneratorName}.ts`);\n\n if ((await pathExists(outputFilePath)) && !overwrite) {\n result.errors.push(\n `Generator file already exists: ${outputFilePath}. Use --overwrite to replace.`\n );\n return result;\n }\n\n try {\n await writeFile(outputFilePath, atomicGenerator, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to write generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Add warnings\n if (prompts.length === 0) {\n result.warnings.push('No prompts found - generator will have empty params');\n }\n\n if (methods.length > 0) {\n result.warnings.push(\n `Yeoman lifecycle methods (${methods.join(', ')}) need manual conversion to template function`\n );\n }\n\n result.success = true;\n result.generatorPath = outputFilePath;\n\n return result;\n}\n","/**\n * Shared utility functions for importers.\n *\n * @module importer/utils\n */\n\nimport { access } from 'node:fs/promises';\n\n/**\n * Check if a path exists.\n */\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Escape a string for use in single-quoted TypeScript string literal.\n */\nexport function escapeStringLiteral(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Sanitize a string for use in JSDoc comments.\n */\nexport function sanitizeJsDocContent(str: string): string {\n return str\n .replace(/\\*\\//g, '*\\\\/')\n .replace(/\\/\\*/g, '/\\\\*');\n}\n","/**\n * Cookiecutter template importer.\n *\n * Analyzes Cookiecutter templates and converts them to atomic generators.\n *\n * Cookiecutter template structure:\n * - `cookiecutter.json` defines template variables\n * - Template files use Jinja2 syntax {{ cookiecutter.variable }}\n * - Directory structure mirrors output structure\n *\n * @module importer/cookiecutter\n */\n\nimport { join, basename, relative } from 'node:path';\nimport { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';\nimport { pathExists, escapeStringLiteral, sanitizeJsDocContent } from './utils.js';\nimport { toErrorMessage } from '../utils/errors.js';\n\n/**\n * Cookiecutter variable definition.\n */\nexport interface CookiecutterVariable {\n name: string;\n default?: unknown;\n choices?: string[];\n}\n\n/**\n * Parsed Cookiecutter template.\n */\nexport interface ParsedCookiecutterTemplate {\n name: string;\n description?: string;\n variables: CookiecutterVariable[];\n templateFiles: string[];\n}\n\n/**\n * Import result.\n */\nexport interface CookiecutterImportResult {\n success: boolean;\n generatorPath?: string;\n mappings: CookiecutterImportMapping[];\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Import mapping for logging decisions.\n */\nexport interface CookiecutterImportMapping {\n source: string;\n target: string;\n type: 'variable' | 'template';\n notes?: string;\n}\n\n/**\n * Parse cookiecutter.json file.\n */\nexport function parseCookiecutterJson(content: string): CookiecutterVariable[] {\n const variables: CookiecutterVariable[] = [];\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(content);\n } catch {\n return variables;\n }\n\n for (const [key, value] of Object.entries(config)) {\n // Skip special keys that start with _\n if (key.startsWith('_')) continue;\n\n const variable: CookiecutterVariable = {\n name: key,\n };\n\n if (Array.isArray(value)) {\n // Array means choices with first being default\n variable.choices = value.map(String);\n variable.default = value[0];\n } else {\n variable.default = value;\n }\n\n variables.push(variable);\n }\n\n return variables;\n}\n\n/**\n * Convert Jinja2 syntax to template literal syntax.\n */\nexport function convertJinjaToTemplateLiteral(jinja: string): { template: string; hasCodeBlocks: boolean } {\n let hasCodeBlocks = false;\n\n // Check for Jinja code blocks ({% ... %})\n if (/{%[\\s\\S]*?%}/.test(jinja)) {\n hasCodeBlocks = true;\n }\n\n let template = jinja\n // Convert {{ cookiecutter.var }} to ${var}\n .replace(/\\{\\{\\s*cookiecutter\\.(\\w+)\\s*\\}\\}/g, '${$1}')\n // Remove Jinja code blocks (not supported in template literals)\n .replace(/{%[\\s\\S]*?%}/g, '/* Jinja code block - manual conversion needed */');\n\n // Escape backticks for template literal\n template = template.replace(/`/g, '\\\\`');\n\n return { template, hasCodeBlocks };\n}\n\n/**\n * Extract Jinja variables from content.\n */\nexport function extractJinjaVariables(content: string): string[] {\n const variables = new Set<string>();\n\n const regex = /\\{\\{\\s*cookiecutter\\.(\\w+)\\s*\\}\\}/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n if (match[1]) {\n variables.add(match[1]);\n }\n }\n\n return Array.from(variables);\n}\n\n/**\n * Recursively find all template files.\n */\nasync function findTemplateFiles(\n dir: string,\n baseDir: string,\n warnings?: string[]\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip special directories\n if (entry.name === '__pycache__' || entry.name === '.git') continue;\n const subFiles = await findTemplateFiles(fullPath, baseDir, warnings);\n files.push(...subFiles);\n } else {\n files.push(relative(baseDir, fullPath));\n }\n }\n } catch (err) {\n const message = `Failed to scan directory ${dir}: ${toErrorMessage(err)}`;\n if (warnings) {\n warnings.push(message);\n }\n }\n\n return files;\n}\n\n/**\n * Convert Cookiecutter variables to Zod schema string.\n */\nexport function variablesToZod(variables: CookiecutterVariable[]): string {\n if (variables.length === 0) {\n return 'z.object({})';\n }\n\n const fields = variables.map((variable) => {\n let zodType: string;\n\n // Determine type based on default value\n if (variable.choices && variable.choices.length > 0) {\n const choices = variable.choices.map((c) => `'${escapeStringLiteral(c)}'`);\n zodType = `z.enum([${choices.join(', ')}])`;\n } else if (typeof variable.default === 'boolean') {\n zodType = 'z.boolean()';\n } else if (typeof variable.default === 'number') {\n zodType = 'z.number()';\n } else {\n zodType = 'z.string()';\n }\n\n // Add default\n if (variable.default !== undefined && !variable.choices) {\n if (typeof variable.default === 'string') {\n zodType += `.default('${escapeStringLiteral(variable.default)}')`;\n } else if (typeof variable.default === 'number' || typeof variable.default === 'boolean') {\n zodType += `.default(${variable.default})`;\n }\n }\n\n return ` ${variable.name}: ${zodType}`;\n });\n\n return `z.object({\\n${fields.join(',\\n')}\\n})`;\n}\n\n/**\n * Generate atomic generator from parsed Cookiecutter template.\n */\nexport function generateAtomicGenerator(parsed: ParsedCookiecutterTemplate): string {\n const zodSchema = variablesToZod(parsed.variables);\n\n const paramNames = parsed.variables.map((v) => v.name);\n const destructure = paramNames.length > 0 ? `{ ${paramNames.join(', ')} }` : '_';\n\n const safeName = escapeStringLiteral(parsed.name);\n const safeDescription = escapeStringLiteral(parsed.description || `Generator for ${parsed.name}`);\n\n return `/**\n * Atomic generator: ${safeName}\n *\n * Imported from Cookiecutter template.\n *\n * @module generators/${safeName}\n */\n\nimport { z } from 'atomism';\n\n/**\n * Generator parameters schema.\n *\n * Converted from cookiecutter.json:\n${parsed.variables.map((v) => ` * - ${sanitizeJsDocContent(v.name)}: ${v.choices ? `enum(${v.choices.slice(0, 3).join(', ')}${v.choices.length > 3 ? '...' : ''})` : typeof v.default}`).join('\\n')}\n */\nexport const paramsSchema = ${zodSchema};\n\nexport type Params = z.infer<typeof paramsSchema>;\n\n/**\n * Template function.\n *\n * Template files: ${parsed.templateFiles.length}\n${parsed.templateFiles.slice(0, 5).map((f) => ` * - ${sanitizeJsDocContent(f)}`).join('\\n')}${parsed.templateFiles.length > 5 ? '\\n * - ...' : ''}\n */\nexport const template = (${destructure}: Params) => {\n // TODO: Implement template based on Cookiecutter files\n // Original template files: ${parsed.templateFiles.length}\n return \\`\n// Generated from Cookiecutter template: ${safeName}\n// Parameters: ${paramNames.join(', ') || 'none'}\n\\`;\n};\n\n/**\n * Generator metadata.\n */\nexport const generator = {\n name: '${safeName}',\n description: '${safeDescription}',\n params: paramsSchema,\n template,\n language: 'typescript' as const,\n};\n\nexport default generator;\n`;\n}\n\n/**\n * Import options.\n */\nexport interface ImportCookiecutterOptions {\n projectRoot: string;\n templatePath: string;\n outputDir?: string;\n overwrite?: boolean;\n}\n\n/**\n * Import a Cookiecutter template.\n */\nexport async function importCookiecutterTemplate(\n options: ImportCookiecutterOptions\n): Promise<CookiecutterImportResult> {\n const {\n projectRoot,\n templatePath,\n outputDir = 'generators',\n overwrite = false,\n } = options;\n\n const result: CookiecutterImportResult = {\n success: false,\n mappings: [],\n warnings: [],\n errors: [],\n };\n\n // Resolve template path\n const fullTemplatePath = join(projectRoot, templatePath);\n\n // Check for cookiecutter.json\n const cookiecutterJsonPath = join(fullTemplatePath, 'cookiecutter.json');\n if (!(await pathExists(cookiecutterJsonPath))) {\n result.errors.push(`No cookiecutter.json found at ${templatePath}`);\n return result;\n }\n\n // Read cookiecutter.json\n let cookiecutterContent: string;\n try {\n cookiecutterContent = await readFile(cookiecutterJsonPath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read cookiecutter.json: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Parse variables\n const variables = parseCookiecutterJson(cookiecutterContent);\n\n // Log variable mappings\n for (const variable of variables) {\n result.mappings.push({\n source: `variable:${variable.name}`,\n target: `params.${variable.name}`,\n type: 'variable',\n notes: variable.choices\n ? `enum with ${variable.choices.length} choices`\n : variable.default !== undefined\n ? `default: ${variable.default}`\n : 'no default',\n });\n }\n\n // Find template files (look for directory named {{ cookiecutter.* }})\n const templateFiles: string[] = [];\n try {\n const entries = await readdir(fullTemplatePath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.includes('{{')) {\n const templateDir = join(fullTemplatePath, entry.name);\n const files = await findTemplateFiles(templateDir, templateDir, result.warnings);\n templateFiles.push(...files);\n }\n }\n } catch (err) {\n result.warnings.push(`Could not scan template files: ${toErrorMessage(err)}`);\n }\n\n // Log template mappings\n for (const file of templateFiles) {\n result.mappings.push({\n source: `template:${file}`,\n target: 'template output',\n type: 'template',\n });\n }\n\n // Generate name from path\n const templateName = basename(templatePath).replace(/^cookiecutter-/, '');\n\n // Validate output name before expensive operations\n const safeTemplateName = basename(templateName);\n if (safeTemplateName !== templateName || templateName.includes('..')) {\n result.errors.push(\n `Invalid template name '${templateName}': must be a simple name without path components`\n );\n return result;\n }\n\n // Create parsed template\n const parsed: ParsedCookiecutterTemplate = {\n name: templateName,\n variables,\n templateFiles,\n };\n\n // Generate atomic generator\n const atomicGenerator = generateAtomicGenerator(parsed);\n\n // Create output directory\n const outputPath = join(projectRoot, outputDir);\n try {\n await mkdir(outputPath, { recursive: true });\n } catch (err) {\n result.errors.push(`Failed to create output directory: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Write generator file\n const outputFilePath = join(outputPath, `${safeTemplateName}.ts`);\n\n if ((await pathExists(outputFilePath)) && !overwrite) {\n result.errors.push(\n `Generator file already exists: ${outputFilePath}. Use --overwrite to replace.`\n );\n return result;\n }\n\n try {\n await writeFile(outputFilePath, atomicGenerator, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to write generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Add warnings\n if (variables.length === 0) {\n result.warnings.push('No variables found in cookiecutter.json - generator will have empty params');\n }\n\n if (templateFiles.length > 0) {\n result.warnings.push(\n `Jinja2 templates (${templateFiles.length} files) need manual conversion to template literals`\n );\n }\n\n result.success = true;\n result.generatorPath = outputFilePath;\n\n return result;\n}\n","/**\n * Custom script importer.\n *\n * Analyzes custom generator scripts and converts them to atomic generators.\n *\n * Custom scripts can be:\n * - Shell scripts (.sh, .bash)\n * - Node.js scripts (.js, .mjs)\n * - TypeScript scripts (.ts)\n * - Python scripts (.py)\n *\n * The importer analyzes variable patterns and creates a scaffold for conversion.\n *\n * @module importer/script\n */\n\nimport { join, basename, extname } from 'node:path';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { pathExists, escapeStringLiteral, sanitizeJsDocContent } from './utils.js';\nimport { toErrorMessage } from '../utils/errors.js';\n\n/**\n * Detected variable from script.\n */\nexport interface ScriptVariable {\n name: string;\n source: string;\n type?: 'string' | 'boolean' | 'number';\n}\n\n/**\n * Parsed script information.\n */\nexport interface ParsedScript {\n name: string;\n language: string;\n variables: ScriptVariable[];\n content: string;\n}\n\n/**\n * Import result.\n */\nexport interface ScriptImportResult {\n success: boolean;\n generatorPath?: string;\n mappings: ScriptImportMapping[];\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Import mapping for logging decisions.\n */\nexport interface ScriptImportMapping {\n source: string;\n target: string;\n type: 'variable' | 'command' | 'file';\n notes?: string;\n}\n\n/**\n * Detect language from file extension.\n */\nexport function detectLanguage(filename: string): string {\n const ext = extname(filename).toLowerCase();\n const languageMap: Record<string, string> = {\n '.sh': 'shell',\n '.bash': 'shell',\n '.zsh': 'shell',\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.py': 'python',\n };\n return languageMap[ext] || 'unknown';\n}\n\n/**\n * Extract variables from shell script.\n */\nexport function extractShellVariables(content: string): ScriptVariable[] {\n const variables: ScriptVariable[] = [];\n const seen = new Set<string>();\n\n // Match $VAR and ${VAR} patterns\n const patterns = [\n /\\$\\{(\\w+)\\}/g, // ${VAR}\n /\\$(\\w+)/g, // $VAR (but not $$, $?, etc.)\n /read\\s+-p\\s+\"[^\"]*\"\\s+(\\w+)/g, // read -p \"prompt\" VAR\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name) && !/^\\d+$/.test(name)) {\n // Skip positional params and special vars\n if (!['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '?', '!', '#', '@', '*', '-', '$'].includes(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'shell variable',\n type: 'string',\n });\n }\n }\n }\n }\n\n return variables;\n}\n\n/**\n * Extract variables from JavaScript/TypeScript.\n */\nexport function extractJsVariables(content: string): ScriptVariable[] {\n const variables: ScriptVariable[] = [];\n const seen = new Set<string>();\n\n // Match process.argv patterns\n const argvPattern = /process\\.argv\\[(\\d+)\\]/g;\n let match;\n while ((match = argvPattern.exec(content)) !== null) {\n const index = parseInt(match[1]!, 10);\n if (index >= 2) { // argv[0] is node, argv[1] is script\n const name = `arg${index - 1}`;\n if (!seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: `process.argv[${index}]`,\n type: 'string',\n });\n }\n }\n }\n\n // Match inquirer/prompts patterns\n const promptPattern = /(?:name|key)\\s*:\\s*['\"](\\w+)['\"]/g;\n while ((match = promptPattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'prompt definition',\n type: 'string',\n });\n }\n }\n\n // Match environment variable usage\n const envPattern = /process\\.env\\.(\\w+)/g;\n while ((match = envPattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'environment variable',\n type: 'string',\n });\n }\n }\n\n return variables;\n}\n\n/**\n * Extract variables from Python script.\n */\nexport function extractPythonVariables(content: string): ScriptVariable[] {\n const variables: ScriptVariable[] = [];\n const seen = new Set<string>();\n\n // Match argparse add_argument patterns\n const argparsePattern = /add_argument\\s*\\(\\s*['\"]--?(\\w+)['\"]/g;\n let match;\n while ((match = argparsePattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'argparse argument',\n type: 'string',\n });\n }\n }\n\n // Match click option patterns\n const clickPattern = /@click\\.option\\s*\\(\\s*['\"]--(\\w+)['\"]/g;\n while ((match = clickPattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'click option',\n type: 'string',\n });\n }\n }\n\n // Match input() calls with variable assignment\n const inputPattern = /(\\w+)\\s*=\\s*input\\s*\\(/g;\n while ((match = inputPattern.exec(content)) !== null) {\n const name = match[1];\n if (name && !seen.has(name)) {\n seen.add(name);\n variables.push({\n name,\n source: 'input() call',\n type: 'string',\n });\n }\n }\n\n return variables;\n}\n\n/**\n * Extract variables based on script language.\n */\nexport function extractVariables(content: string, language: string): ScriptVariable[] {\n switch (language) {\n case 'shell':\n return extractShellVariables(content);\n case 'javascript':\n case 'typescript':\n return extractJsVariables(content);\n case 'python':\n return extractPythonVariables(content);\n default:\n return [];\n }\n}\n\n/**\n * Convert script variables to Zod schema string.\n */\nexport function variablesToZod(variables: ScriptVariable[]): string {\n if (variables.length === 0) {\n return 'z.object({})';\n }\n\n const fields = variables.map((variable) => {\n let zodType: string;\n switch (variable.type) {\n case 'boolean':\n zodType = 'z.boolean()';\n break;\n case 'number':\n zodType = 'z.number()';\n break;\n default:\n zodType = 'z.string()';\n }\n\n zodType += `.describe('${escapeStringLiteral(variable.source)}')`;\n return ` ${variable.name}: ${zodType}`;\n });\n\n return `z.object({\\n${fields.join(',\\n')}\\n})`;\n}\n\n/**\n * Generate atomic generator from parsed script.\n */\nexport function generateAtomicGenerator(parsed: ParsedScript): string {\n const zodSchema = variablesToZod(parsed.variables);\n\n const paramNames = parsed.variables.map((v) => v.name);\n const destructure = paramNames.length > 0 ? `{ ${paramNames.join(', ')} }` : '_';\n\n const safeName = escapeStringLiteral(parsed.name);\n\n return `/**\n * Atomic generator: ${safeName}\n *\n * Imported from custom ${parsed.language} script.\n *\n * @module generators/${safeName}\n */\n\nimport { z } from 'atomism';\n\n/**\n * Generator parameters schema.\n *\n * Detected variables from script:\n${parsed.variables.map((v) => ` * - ${sanitizeJsDocContent(v.name)}: ${sanitizeJsDocContent(v.source)}`).join('\\n') || ' * (none detected)'}\n */\nexport const paramsSchema = ${zodSchema};\n\nexport type Params = z.infer<typeof paramsSchema>;\n\n/**\n * Template function.\n *\n * Original script language: ${parsed.language}\n * Manual conversion required for script logic.\n */\nexport const template = (${destructure}: Params) => {\n // TODO: Implement template based on original script\n // Original script: ${safeName}\n // Language: ${parsed.language}\n return \\`\n// Generated from custom script: ${safeName}\n// Parameters: ${paramNames.join(', ') || 'none'}\n\\`;\n};\n\n/**\n * Generator metadata.\n */\nexport const generator = {\n name: '${safeName}',\n description: 'Generator imported from custom ${parsed.language} script',\n params: paramsSchema,\n template,\n language: 'typescript' as const,\n};\n\nexport default generator;\n`;\n}\n\n/**\n * Import options.\n */\nexport interface ImportScriptOptions {\n projectRoot: string;\n scriptPath: string;\n outputDir?: string;\n overwrite?: boolean;\n}\n\n/**\n * Import a custom script.\n */\nexport async function importScript(\n options: ImportScriptOptions\n): Promise<ScriptImportResult> {\n const {\n projectRoot,\n scriptPath,\n outputDir = 'generators',\n overwrite = false,\n } = options;\n\n const result: ScriptImportResult = {\n success: false,\n mappings: [],\n warnings: [],\n errors: [],\n };\n\n // Generate and validate name from path (fail fast before file reads)\n const scriptName = basename(scriptPath, extname(scriptPath));\n if (!/^[\\w-]+$/.test(scriptName)) {\n result.errors.push(\n `Invalid script name '${scriptName}': must contain only alphanumeric characters, dashes, and underscores`\n );\n return result;\n }\n\n // Resolve script path\n const fullScriptPath = join(projectRoot, scriptPath);\n\n if (!(await pathExists(fullScriptPath))) {\n result.errors.push(`Script not found: ${scriptPath}`);\n return result;\n }\n\n // Read script content\n let content: string;\n try {\n content = await readFile(fullScriptPath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read script: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Detect language\n const language = detectLanguage(scriptPath);\n if (language === 'unknown') {\n result.warnings.push(`Unknown script language for ${scriptPath}, treating as generic`);\n }\n\n // Extract variables\n const variables = extractVariables(content, language);\n\n // Log variable mappings\n for (const variable of variables) {\n result.mappings.push({\n source: `${variable.source}:${variable.name}`,\n target: `params.${variable.name}`,\n type: 'variable',\n notes: `Detected from ${language} script`,\n });\n }\n\n // Create parsed script\n const parsed: ParsedScript = {\n name: scriptName,\n language,\n variables,\n content,\n };\n\n // Generate atomic generator\n const atomicGenerator = generateAtomicGenerator(parsed);\n\n // Create output directory\n const outputPath = join(projectRoot, outputDir);\n try {\n await mkdir(outputPath, { recursive: true });\n } catch (err) {\n result.errors.push(`Failed to create output directory: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Write generator file\n const outputFilePath = join(outputPath, `${scriptName}.ts`);\n\n if ((await pathExists(outputFilePath)) && !overwrite) {\n result.errors.push(\n `Generator file already exists: ${outputFilePath}. Use --overwrite to replace.`\n );\n return result;\n }\n\n try {\n await writeFile(outputFilePath, atomicGenerator, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to write generator: ${toErrorMessage(err)}`);\n return result;\n }\n\n // Add warnings\n if (variables.length === 0) {\n result.warnings.push('No variables detected - generator will have empty params. Review the original script to add parameters.');\n }\n\n result.warnings.push(\n `Script logic needs manual conversion to template function. Original ${language} script preserved for reference.`\n );\n\n result.success = true;\n result.generatorPath = outputFilePath;\n\n return result;\n}\n","/**\n * Import generator command.\n *\n * Imports generators from external systems.\n */\n\nimport {\n importPlopGenerator,\n importHygenGenerator,\n importYeomanGenerator,\n importCookiecutterTemplate,\n importScript,\n} from '../importer/index.js';\n\nexport interface ImportGeneratorOptions {\n plop?: string;\n hygen?: string;\n yeoman?: string;\n cookiecutter?: string;\n script?: string;\n output?: string;\n overwrite?: boolean;\n json?: boolean;\n}\n\n/**\n * Execute the import-generator command.\n */\nexport async function importGeneratorCommand(\n options: ImportGeneratorOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n // Determine which system to import from\n if (options.plop) {\n await importFromPlop(projectRoot, options.plop, options);\n } else if (options.hygen) {\n await importFromHygen(projectRoot, options.hygen, options);\n } else if (options.yeoman) {\n await importFromYeoman(projectRoot, options.yeoman, options);\n } else if (options.cookiecutter) {\n await importFromCookiecutter(projectRoot, options.cookiecutter, options);\n } else if (options.script) {\n await importFromScript(projectRoot, options.script, options);\n } else {\n if (options.json) {\n console.log(\n JSON.stringify({\n success: false,\n error: 'Must specify a generator to import: --plop, --hygen, --yeoman, --cookiecutter, or --script',\n })\n );\n } else {\n console.error('Error: Must specify a generator to import');\n console.error('');\n console.error('Options:');\n console.error(' --plop <name> Import Plop generator');\n console.error(' --hygen <name> Import Hygen generator');\n console.error(' --yeoman <name> Import Yeoman generator');\n console.error(' --cookiecutter <path> Import Cookiecutter template');\n console.error(' --script <path> Import custom script');\n }\n process.exit(1);\n }\n}\n\n/**\n * Import from Plop.\n */\nasync function importFromPlop(\n projectRoot: string,\n generatorName: string,\n options: ImportGeneratorOptions\n): Promise<void> {\n const result = await importPlopGenerator({\n projectRoot,\n generatorName,\n outputDir: options.output,\n overwrite: options.overwrite,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n if (!result.success) {\n process.exit(1);\n }\n return;\n }\n\n // Human-readable output\n if (!result.success) {\n console.error('Import failed:');\n for (const error of result.errors) {\n console.error(` ✗ ${error}`);\n }\n process.exit(1);\n }\n\n console.log(`✓ Imported Plop generator '${generatorName}'`);\n console.log('');\n console.log(`Output: ${result.generatorPath}`);\n console.log('');\n\n if (result.mappings.length > 0) {\n console.log('Mappings:');\n for (const mapping of result.mappings) {\n const icon = mapping.type === 'prompt' ? '📝' : mapping.type === 'action' ? '⚡' : '📄';\n console.log(` ${icon} ${mapping.source} → ${mapping.target}`);\n if (mapping.notes) {\n console.log(` ${mapping.notes}`);\n }\n }\n console.log('');\n }\n\n if (result.warnings.length > 0) {\n console.log('Warnings (manual review needed):');\n for (const warning of result.warnings) {\n console.log(` ⚠ ${warning}`);\n }\n console.log('');\n }\n\n console.log('Next steps:');\n console.log(` 1. Review the generated file: ${result.generatorPath}`);\n console.log(' 2. Update the template function with actual logic');\n console.log(' 3. Test the generator');\n}\n\n/**\n * Import from Hygen.\n *\n * Hygen generator name format: <generator>/<action> or just <generator> if only one action exists.\n */\nasync function importFromHygen(\n projectRoot: string,\n generatorSpec: string,\n options: ImportGeneratorOptions\n): Promise<void> {\n // Parse generator spec (can be \"generator\" or \"generator/action\")\n const parts = generatorSpec.split('/');\n\n // Validate format: must be 1 or 2 segments\n if (parts.length > 2 || parts.some((p) => !p.trim())) {\n const errorMsg = `Invalid format '${generatorSpec}'. Expected 'generator' or 'generator/action'.`;\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: errorMsg }));\n } else {\n console.error(`Error: ${errorMsg}`);\n }\n process.exit(1);\n }\n\n const generatorName = parts[0]!;\n const actionName = parts[1];\n\n const result = await importHygenGenerator({\n projectRoot,\n generatorName,\n actionName,\n outputDir: options.output,\n overwrite: options.overwrite,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n if (!result.success) {\n process.exit(1);\n }\n return;\n }\n\n // Human-readable output\n if (!result.success) {\n console.error('Import failed:');\n for (const error of result.errors) {\n console.error(` ✗ ${error}`);\n }\n process.exit(1);\n }\n\n console.log(`✓ Imported Hygen generator '${generatorSpec}'`);\n console.log('');\n console.log(`Output: ${result.generatorPath}`);\n console.log('');\n\n if (result.mappings.length > 0) {\n console.log('Mappings:');\n for (const mapping of result.mappings) {\n const icon = mapping.type === 'prompt' ? '📝' : mapping.type === 'template' ? '📄' : '⚙️';\n console.log(` ${icon} ${mapping.source} → ${mapping.target}`);\n if (mapping.notes) {\n console.log(` ${mapping.notes}`);\n }\n }\n console.log('');\n }\n\n if (result.warnings.length > 0) {\n console.log('Warnings (manual review needed):');\n for (const warning of result.warnings) {\n console.log(` ⚠ ${warning}`);\n }\n console.log('');\n }\n\n console.log('Next steps:');\n console.log(` 1. Review the generated file: ${result.generatorPath}`);\n console.log(' 2. Update the template function with actual logic');\n console.log(' 3. Test the generator');\n}\n\n/**\n * Import from Yeoman.\n */\nasync function importFromYeoman(\n projectRoot: string,\n generatorName: string,\n options: ImportGeneratorOptions\n): Promise<void> {\n const result = await importYeomanGenerator({\n projectRoot,\n generatorName,\n outputDir: options.output,\n overwrite: options.overwrite,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n if (!result.success) {\n process.exit(1);\n }\n return;\n }\n\n // Human-readable output\n if (!result.success) {\n console.error('Import failed:');\n for (const error of result.errors) {\n console.error(` ✗ ${error}`);\n }\n process.exit(1);\n }\n\n console.log(`✓ Imported Yeoman generator '${generatorName}'`);\n console.log('');\n console.log(`Output: ${result.generatorPath}`);\n console.log('');\n\n if (result.mappings.length > 0) {\n console.log('Mappings:');\n for (const mapping of result.mappings) {\n const icon = mapping.type === 'prompt' ? '📝' : mapping.type === 'method' ? '⚙️' : '📄';\n console.log(` ${icon} ${mapping.source} → ${mapping.target}`);\n if (mapping.notes) {\n console.log(` ${mapping.notes}`);\n }\n }\n console.log('');\n }\n\n if (result.warnings.length > 0) {\n console.log('Warnings (manual review needed):');\n for (const warning of result.warnings) {\n console.log(` ⚠ ${warning}`);\n }\n console.log('');\n }\n\n console.log('Next steps:');\n console.log(` 1. Review the generated file: ${result.generatorPath}`);\n console.log(' 2. Update the template function with actual logic');\n console.log(' 3. Test the generator');\n}\n\n/**\n * Import from Cookiecutter.\n */\nasync function importFromCookiecutter(\n projectRoot: string,\n templatePath: string,\n options: ImportGeneratorOptions\n): Promise<void> {\n const result = await importCookiecutterTemplate({\n projectRoot,\n templatePath,\n outputDir: options.output,\n overwrite: options.overwrite,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n if (!result.success) {\n process.exit(1);\n }\n return;\n }\n\n // Human-readable output\n if (!result.success) {\n console.error('Import failed:');\n for (const error of result.errors) {\n console.error(` ✗ ${error}`);\n }\n process.exit(1);\n }\n\n console.log(`✓ Imported Cookiecutter template '${templatePath}'`);\n console.log('');\n console.log(`Output: ${result.generatorPath}`);\n console.log('');\n\n if (result.mappings.length > 0) {\n console.log('Mappings:');\n for (const mapping of result.mappings) {\n const icon = mapping.type === 'variable' ? '📝' : '📄';\n console.log(` ${icon} ${mapping.source} → ${mapping.target}`);\n if (mapping.notes) {\n console.log(` ${mapping.notes}`);\n }\n }\n console.log('');\n }\n\n if (result.warnings.length > 0) {\n console.log('Warnings (manual review needed):');\n for (const warning of result.warnings) {\n console.log(` ⚠ ${warning}`);\n }\n console.log('');\n }\n\n console.log('Next steps:');\n console.log(` 1. Review the generated file: ${result.generatorPath}`);\n console.log(' 2. Convert Jinja2 templates to template literals');\n console.log(' 3. Test the generator');\n}\n\n/**\n * Import from custom script.\n */\nasync function importFromScript(\n projectRoot: string,\n scriptPath: string,\n options: ImportGeneratorOptions\n): Promise<void> {\n const result = await importScript({\n projectRoot,\n scriptPath,\n outputDir: options.output,\n overwrite: options.overwrite,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result));\n if (!result.success) {\n process.exit(1);\n }\n return;\n }\n\n // Human-readable output\n if (!result.success) {\n console.error('Import failed:');\n for (const error of result.errors) {\n console.error(` ✗ ${error}`);\n }\n process.exit(1);\n }\n\n console.log(`✓ Imported custom script '${scriptPath}'`);\n console.log('');\n console.log(`Output: ${result.generatorPath}`);\n console.log('');\n\n if (result.mappings.length > 0) {\n console.log('Mappings:');\n for (const mapping of result.mappings) {\n const icon = mapping.type === 'command' ? '⚙️' : mapping.type === 'file' ? '📄' : '📝';\n console.log(` ${icon} ${mapping.source} → ${mapping.target}`);\n if (mapping.notes) {\n console.log(` ${mapping.notes}`);\n }\n }\n console.log('');\n }\n\n if (result.warnings.length > 0) {\n console.log('Warnings (manual review needed):');\n for (const warning of result.warnings) {\n console.log(` ⚠ ${warning}`);\n }\n console.log('');\n }\n\n console.log('Next steps:');\n console.log(` 1. Review the generated file: ${result.generatorPath}`);\n console.log(' 2. Convert script logic to template function');\n console.log(' 3. Test the generator');\n}\n"],"mappings":"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","names":["join","basename","readFile","writeFile","mkdir","access","PROMPT_TYPE_MAP","pathExists","access","escapeStringLiteral","promptsToZod","join","generateAtomicGenerator","readFile","basename","mkdir","writeFile","join","basename","readFile","writeFile","mkdir","readdir","access","pathExists","escapeStringLiteral","sanitizeJsDocContent","PROMPT_TYPE_MAP","promptsToZod","escapeStringLiteral","join","pathExists","readdir","generateAtomicGenerator","sanitizeJsDocContent","basename","readFile","mkdir","writeFile","join","basename","readFile","writeFile","mkdir","readdir","readdir","join","escapeStringLiteral","generateAtomicGenerator","sanitizeJsDocContent","pathExists","readFile","basename","mkdir","writeFile","join","basename","readFile","writeFile","mkdir","variablesToZod","escapeStringLiteral","generateAtomicGenerator","sanitizeJsDocContent","basename","join","pathExists","readFile","mkdir","writeFile"]}
@@ -0,0 +1,230 @@
1
+ import { z } from 'zod';
2
+ export { z } from 'zod';
3
+
4
+ declare const ErrorType: z.ZodEnum<{
5
+ validation: "validation";
6
+ execution: "execution";
7
+ dependency: "dependency";
8
+ timeout: "timeout";
9
+ }>;
10
+ type ErrorType = z.infer<typeof ErrorType>;
11
+ declare const AtomError: z.ZodObject<{
12
+ type: z.ZodEnum<{
13
+ validation: "validation";
14
+ execution: "execution";
15
+ dependency: "dependency";
16
+ timeout: "timeout";
17
+ }>;
18
+ message: z.ZodString;
19
+ recoverable: z.ZodBoolean;
20
+ suggestion: z.ZodOptional<z.ZodString>;
21
+ context: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
+ }, z.core.$strip>;
23
+ type AtomError = z.infer<typeof AtomError>;
24
+ declare const SuccessResponse: <T extends z.ZodType>(outputSchema: T) => z.ZodObject<{
25
+ success: z.ZodLiteral<true>;
26
+ data: T;
27
+ }, z.core.$strip>;
28
+ declare const ErrorResponse: z.ZodObject<{
29
+ success: z.ZodLiteral<false>;
30
+ error: z.ZodObject<{
31
+ type: z.ZodEnum<{
32
+ validation: "validation";
33
+ execution: "execution";
34
+ dependency: "dependency";
35
+ timeout: "timeout";
36
+ }>;
37
+ message: z.ZodString;
38
+ recoverable: z.ZodBoolean;
39
+ suggestion: z.ZodOptional<z.ZodString>;
40
+ context: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
41
+ }, z.core.$strip>;
42
+ }, z.core.$strip>;
43
+ type ErrorResponse = z.infer<typeof ErrorResponse>;
44
+ declare const AtomResult: <T extends z.ZodType>(outputSchema: T) => z.ZodDiscriminatedUnion<[z.ZodObject<{
45
+ success: z.ZodLiteral<true>;
46
+ data: T;
47
+ }, z.core.$strip>, z.ZodObject<{
48
+ success: z.ZodLiteral<false>;
49
+ error: z.ZodObject<{
50
+ type: z.ZodEnum<{
51
+ validation: "validation";
52
+ execution: "execution";
53
+ dependency: "dependency";
54
+ timeout: "timeout";
55
+ }>;
56
+ message: z.ZodString;
57
+ recoverable: z.ZodBoolean;
58
+ suggestion: z.ZodOptional<z.ZodString>;
59
+ context: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
60
+ }, z.core.$strip>;
61
+ }, z.core.$strip>], "success">;
62
+ type AtomResult<T> = {
63
+ success: true;
64
+ data: T;
65
+ } | {
66
+ success: false;
67
+ error: AtomError;
68
+ };
69
+ declare const TestManifest: z.ZodObject<{
70
+ path: z.ZodString;
71
+ coverage_threshold: z.ZodOptional<z.ZodNumber>;
72
+ }, z.core.$strip>;
73
+ type TestManifest = z.infer<typeof TestManifest>;
74
+ declare const AtomDefinition: z.ZodObject<{
75
+ name: z.ZodString;
76
+ description: z.ZodString;
77
+ input: z.ZodCustom<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
78
+ output: z.ZodCustom<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
79
+ idempotent: z.ZodDefault<z.ZodBoolean>;
80
+ tests: z.ZodObject<{
81
+ path: z.ZodString;
82
+ coverage_threshold: z.ZodOptional<z.ZodNumber>;
83
+ }, z.core.$strip>;
84
+ agent: z.ZodOptional<z.ZodString>;
85
+ skill: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strip>;
87
+ type AtomDefinition = z.infer<typeof AtomDefinition>;
88
+
89
+ /**
90
+ * Context module for atom execution.
91
+ *
92
+ * Provides a factory function to create enhanced runtime contexts for atom
93
+ * handlers with utilities for error handling, logging, and artifact storage.
94
+ *
95
+ * @module context
96
+ */
97
+ /**
98
+ * Log entry for run logs
99
+ */
100
+ interface LogEntry {
101
+ timestamp: string;
102
+ level: 'debug' | 'info' | 'warn' | 'error';
103
+ message: string;
104
+ data?: Record<string, unknown>;
105
+ }
106
+ /**
107
+ * Artifact reference stored in content-addressed storage
108
+ */
109
+ interface ArtifactRef {
110
+ hash: string;
111
+ path: string;
112
+ contentType: string;
113
+ size: number;
114
+ createdAt: string;
115
+ }
116
+ /**
117
+ * Skill context available during execution.
118
+ */
119
+ interface SkillContext {
120
+ /** Name of the skill */
121
+ name: string;
122
+ /** Skill instructions/content */
123
+ content: string;
124
+ /** Where the skill was loaded from */
125
+ source: 'project' | 'global' | 'mcp';
126
+ }
127
+ /**
128
+ * Enhanced context provided to atom handlers during execution.
129
+ *
130
+ * This context provides utilities for:
131
+ * - Error wrapping with structured AtomError
132
+ * - Logging to run logs
133
+ * - Storing and retrieving artifacts
134
+ * - Accessing run metadata
135
+ * - Accessing loaded skills
136
+ */
137
+ interface AtomContext {
138
+ /** Unique identifier for this run */
139
+ runId: string;
140
+ /** Workflow ID if this atom is part of a workflow */
141
+ workflowId?: string;
142
+ /** Abort signal for cancellation support */
143
+ signal?: AbortSignal;
144
+ /** Loaded skills available for this execution */
145
+ skills: SkillContext[];
146
+ /** Combined skill instructions as a single context string */
147
+ skillContext: string;
148
+ /**
149
+ * Wrap an error in a structured AtomError format
150
+ */
151
+ wrapError: (message: string, options?: {
152
+ type?: AtomError['type'];
153
+ recoverable?: boolean;
154
+ suggestion?: string;
155
+ context?: Record<string, unknown>;
156
+ cause?: unknown;
157
+ }) => AtomError;
158
+ /**
159
+ * Log a message to the run log
160
+ */
161
+ log: (level: LogEntry['level'], message: string, data?: Record<string, unknown>) => void;
162
+ /**
163
+ * Store an artifact in content-addressed storage
164
+ */
165
+ storeArtifact: (path: string, content: string | Buffer, contentType?: string) => Promise<ArtifactRef>;
166
+ /**
167
+ * Retrieve an artifact from content-addressed storage
168
+ */
169
+ getArtifact: (hashOrPath: string) => Promise<string | Buffer | null>;
170
+ /**
171
+ * Access the run logs
172
+ */
173
+ getLogs: () => LogEntry[];
174
+ }
175
+
176
+ interface AtomConfig<TInput extends z.ZodType, TOutput extends z.ZodType> {
177
+ name: string;
178
+ description: string;
179
+ input: TInput;
180
+ output: TOutput;
181
+ idempotent?: boolean;
182
+ tests: {
183
+ path: string;
184
+ coverage_threshold?: number;
185
+ };
186
+ agent?: string;
187
+ skill?: string;
188
+ handler: (input: z.infer<TInput>, context: AtomContext) => Promise<AtomResult<z.infer<TOutput>>>;
189
+ }
190
+ interface Atom<TInput extends z.ZodType, TOutput extends z.ZodType> {
191
+ name: string;
192
+ description: string;
193
+ input: TInput;
194
+ output: TOutput;
195
+ idempotent: boolean;
196
+ tests: {
197
+ path: string;
198
+ coverage_threshold?: number;
199
+ };
200
+ agent?: string;
201
+ skill?: string;
202
+ handler: (input: z.infer<TInput>, context: AtomContext) => Promise<AtomResult<z.infer<TOutput>>>;
203
+ }
204
+ /**
205
+ * Define a type-safe atom with full TypeScript inference.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * const greetAtom = defineAtom({
210
+ * name: 'greet_user',
211
+ * description: 'Greets a user by name',
212
+ * input: z.object({ name: z.string() }),
213
+ * output: z.object({ greeting: z.string() }),
214
+ * tests: { path: './tests/greet.test.ts' },
215
+ * handler: async (input, ctx) => {
216
+ * return {
217
+ * success: true,
218
+ * data: { greeting: `Hello, ${input.name}!` }
219
+ * };
220
+ * }
221
+ * });
222
+ * ```
223
+ */
224
+ declare function defineAtom<TInput extends z.ZodType, TOutput extends z.ZodType>(config: AtomConfig<TInput, TOutput>): Atom<TInput, TOutput>;
225
+ declare function success<T>(data: T): AtomResult<T>;
226
+ declare function failure(error: AtomError): AtomResult<never>;
227
+ declare function validationError(message: string, context?: Record<string, unknown>): AtomResult<never>;
228
+ declare function executionError(message: string, recoverable?: boolean, suggestion?: string, context?: Record<string, unknown>): AtomResult<never>;
229
+
230
+ export { type Atom, type AtomConfig, type AtomContext, AtomDefinition, AtomError, AtomResult, ErrorResponse, ErrorType, SuccessResponse, TestManifest, defineAtom, executionError, failure, success, validationError };
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ AtomDefinition,
3
+ AtomError,
4
+ AtomResult,
5
+ ErrorResponse,
6
+ ErrorType,
7
+ SuccessResponse,
8
+ TestManifest
9
+ } from "./chunk-34O5KJWR.js";
10
+ import "./chunk-H7WC3NXZ.js";
11
+ import "./chunk-P33CQFMY.js";
12
+ import {
13
+ defineAtom,
14
+ executionError,
15
+ failure,
16
+ success,
17
+ validationError
18
+ } from "./chunk-P6X7T4KA.js";
19
+ import "./chunk-RS2IEGW3.js";
20
+ import "./chunk-YKJO3ZFY.js";
21
+ import "./chunk-6MDHM2B4.js";
22
+ import "./chunk-PLQJM2KT.js";
23
+
24
+ // src/index.ts
25
+ import { z } from "zod";
26
+ export {
27
+ AtomDefinition,
28
+ AtomError,
29
+ AtomResult,
30
+ ErrorResponse,
31
+ ErrorType,
32
+ SuccessResponse,
33
+ TestManifest,
34
+ defineAtom,
35
+ executionError,
36
+ failure,
37
+ success,
38
+ validationError,
39
+ z
40
+ };
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Main library exports for atomic framework\n\n// Atom definition\nexport {\n defineAtom,\n success,\n failure,\n validationError,\n executionError,\n type AtomConfig,\n type Atom,\n type AtomContext,\n} from './atom/index.js';\n\n// Schemas and types\nexport {\n ErrorType,\n AtomError,\n SuccessResponse,\n ErrorResponse,\n AtomResult,\n TestManifest,\n AtomDefinition,\n} from './schemas/index.js';\n\n// Re-export Zod for convenience\nexport { z } from 'zod';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAS,SAAS;","names":[]}