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/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\n\nconst program = new Command();\n\nprogram\n .name('atomic')\n .description('Schema-first agent swarm orchestration framework')\n .version('0.1.0');\n\n// Init command - Story 1.3\nprogram\n .command('init')\n .description('Initialize .atomic/ directory with storage and registry')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { initCommand } = await import('./commands/init.js');\n return initCommand(options);\n });\n\n// Register command - Story 1.5\nprogram\n .command('register <path>')\n .description('Register an atom file')\n .option('--json', 'Output structured JSON response')\n .action(async (atomPath, options) => {\n const { registerCommand } = await import('./commands/register.js');\n return registerCommand(atomPath, options);\n });\n\n// List command - Story 1.11\nprogram\n .command('list')\n .description('List registered atoms')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { listCommand } = await import('./commands/list.js');\n return listCommand(options);\n });\n\n// Run command - Story 2.2\nprogram\n .command('run <atom>')\n .description('Execute an atom (handler or generator)')\n .option('--input <json>', 'Input data as JSON string')\n .option('--cache', 'Use cached result for idempotent atoms (not yet implemented)')\n .option('-y, --yes', 'Skip confirmation for non-idempotent atoms')\n .option('--json', 'Output structured JSON response')\n .action(async (target, options) => {\n const { runCommand } = await import('./commands/run.js');\n return runCommand(target, options);\n });\n\n// Test generation command - Story 1.7\nprogram\n .command('test-gen <path>')\n .description('Generate structural tests for an atom')\n .option('--output <path>', 'Custom output path for generated tests')\n .option('--json', 'Output structured JSON response')\n .action(async (atomPath, options) => {\n const { testGenCommand } = await import('./commands/test-gen.js');\n return testGenCommand(atomPath, options);\n });\n\n// Test command - Story 1.8\nprogram\n .command('test <atom>')\n .description('Run tests for an atom')\n .option('--coverage', 'Show coverage report')\n .option('--json', 'Output structured JSON response')\n .action(async (atomName, options) => {\n const { testCommand } = await import('./commands/test.js');\n return testCommand(atomName, options);\n });\n\n// Status command - Story 2.8\nprogram\n .command('status')\n .description('Show current system state')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { statusCommand } = await import('./commands/status.js');\n return statusCommand(options);\n });\n\n// History command - Story 2.9\nprogram\n .command('history [runId]')\n .description('Show execution history')\n .option('--atom <name>', 'Filter to specific atom')\n .option('--limit <n>', 'Limit results', '20')\n .option('--json', 'Output structured JSON response')\n .action(async (runId, options) => {\n const { historyCommand } = await import('./commands/history.js');\n return historyCommand(runId, options);\n });\n\n// Create command group - Story 1.9\nconst create = program\n .command('create')\n .description('Create new atoms or resources');\n\ncreate\n .command('atom <name>')\n .description('Create a new atom with scaffolded files')\n .option('--path <dir>', 'Custom output directory')\n .option('--json', 'Output structured JSON response')\n .action(async (name, options) => {\n const { createAtomCommand } = await import('./commands/create-atom.js');\n return createAtomCommand(name, options);\n });\n\n// Extract command - Story 1.10\nprogram\n .command('extract')\n .description('Extract atom from existing skill, BMAD workflow, MCP tool, or code')\n .option('--skill <path>', 'Extract from Claude Code skill')\n .option('--bmad <path>', 'Extract from BMAD workflow')\n .option('--mcp <path>', 'Extract from MCP tool definition')\n .option('--code <path>', 'Extract from existing code file')\n .option('--output <dir>', 'Output directory for generated atom')\n .option('-y, --yes', 'Auto-create without confirmation')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { extractCommand } = await import('./commands/extract.js');\n return extractCommand(options);\n });\n\n// Suggest command - G3\nprogram\n .command('suggest')\n .description('Scan codebase for functions that could become atoms')\n .option('--path <dir>', 'Directory to scan (default: cwd)')\n .option('--limit <n>', 'Max candidates to show (default: 20)')\n .option('--scan-limit <n>', 'Max files to scan (default: 1000)')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { suggestCommand } = await import('./commands/suggest.js');\n return suggestCommand(options);\n });\n\n// Graduate command - Story 3.5\nprogram\n .command('graduate <atom>')\n .description('Graduate an atom from handler to generator')\n .option('-y, --yes', 'Skip confirmation')\n .option('--json', 'Output structured JSON response')\n .action(async (atom, options) => {\n const { graduateCommand } = await import('./commands/graduate.js');\n return graduateCommand({ atom, ...options });\n });\n\n// Revert command - Story 3.6\nprogram\n .command('revert <atom>')\n .description('Revert a graduated atom back to handler execution')\n .option('--reason <reason>', 'Reason for reverting')\n .option('-y, --yes', 'Skip confirmation')\n .option('--json', 'Output structured JSON response')\n .action(async (atom, options) => {\n const { revertCommand } = await import('./commands/revert.js');\n return revertCommand({ atom, ...options });\n });\n\n// Trust command - Story 4.3, 4.6\nprogram\n .command('trust [stack]')\n .description('Manage trust levels for atom stacks')\n .option('--level <level>', 'Set trust level (new, proven, trusted)')\n .option('--list', 'List all stacks with trust levels')\n .option('--reset', 'Reset trust to new level')\n .option('--json', 'Output structured JSON response')\n .action(async (stack, options) => {\n const { trustSetCommand, trustListCommand, trustResetCommand } = await import('./commands/trust.js');\n if (options.list) {\n await trustListCommand({ json: options.json });\n } else if (options.reset) {\n if (!stack) {\n console.error('Error: Stack name required for --reset');\n process.exit(1);\n }\n await trustResetCommand({ stack, json: options.json });\n } else if (options.level) {\n if (!stack) {\n console.error('Error: Stack name required for --level');\n process.exit(1);\n }\n await trustSetCommand({ stack, level: options.level, json: options.json });\n } else {\n console.error('Error: Must specify --level, --list, or --reset');\n process.exit(1);\n }\n });\n\n// Workflow command group - Story 5.4\nconst workflow = program\n .command('workflow')\n .description('Manage and execute workflows');\n\nworkflow\n .command('run <name>')\n .description('Execute a workflow')\n .option('--dry-run', 'Show execution plan without running')\n .option('--force-rebuild <atoms>', 'Force rebuild specific atoms (comma-separated)')\n .option('--force-rebuild-all', 'Force rebuild all atoms')\n .option('--no-beads', 'Disable Beads tracking (enabled by default)')\n .option('--json', 'Output structured JSON response')\n .action(async (name, options) => {\n const { workflowRunCommand } = await import('./commands/workflow.js');\n return workflowRunCommand(name, options);\n });\n\nworkflow\n .command('list')\n .description('List available workflows')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { workflowListCommand } = await import('./commands/workflow.js');\n return workflowListCommand(options);\n });\n\nworkflow\n .command('resume <name>')\n .description('Resume a failed or partial workflow')\n .option('--run <runId>', 'Specific run ID to resume')\n .option('--from <atom>', 'Force restart from specific atom')\n .option('--no-beads', 'Disable Beads tracking (enabled by default)')\n .option('--json', 'Output structured JSON response')\n .action(async (name, options) => {\n const { workflowResumeCommand } = await import('./commands/workflow.js');\n return workflowResumeCommand(name, options);\n });\n\n// Plan command - Story 5.5\nprogram\n .command('plan <workflow>')\n .description('Preview workflow execution plan')\n .option('--verbose', 'Show detailed atom information')\n .option('--json', 'Output structured JSON response')\n .action(async (name, options) => {\n const { planCommand } = await import('./commands/plan.js');\n return planCommand(name, options);\n });\n\n// Escalate command - Story 5.6, 5.7\nprogram\n .command('escalate')\n .description('Create Beads issue for unresolvable problems')\n .option('--message <msg>', 'Additional context')\n .option('--run <runId>', 'Link to specific run ID')\n .option('--atom <name>', 'Atom that failed')\n .option('--reason <reason>', 'Why the issue is blocked')\n .option('--retries <n>', 'Number of retry attempts', (value) => {\n const parsed = parseInt(value, 10);\n if (isNaN(parsed) || parsed < 0) {\n console.error('Error: --retries must be a non-negative integer');\n process.exit(1);\n }\n return parsed;\n })\n .option('--workflow <name>', 'Workflow name for context')\n .option('--parent-bead <id>', 'Parent bead ID for linking')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { escalateCommand } = await import('./commands/escalate.js');\n return escalateCommand({\n message: options.message,\n runId: options.run,\n atom: options.atom,\n reason: options.reason,\n retries: options.retries,\n workflowName: options.workflow,\n parentBeadId: options.parentBead,\n json: options.json,\n });\n });\n\n// Scan generators command - Story 6.1\nprogram\n .command('scan-generators')\n .description('Detect existing generators (Plop, Hygen, Yeoman, Cookiecutter, custom)')\n .option('--system <system>', 'Filter to specific system (plop, hygen, yeoman, cookiecutter, custom)')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { scanGeneratorsCommand } = await import('./commands/scan-generators.js');\n return scanGeneratorsCommand(options);\n });\n\n// Import generator command - Story 6.2, 6.3, 6.4\nprogram\n .command('import-generator')\n .description('Import generators from external systems')\n .option('--plop <name>', 'Import Plop generator by name')\n .option('--hygen <name>', 'Import Hygen generator (generator/action format)')\n .option('--yeoman <name>', 'Import Yeoman generator by name')\n .option('--cookiecutter <path>', 'Import Cookiecutter template from path')\n .option('--script <path>', 'Import custom script (shell, JS, Python)')\n .option('--output <dir>', 'Output directory for generator', 'generators')\n .option('--overwrite', 'Overwrite existing generator')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { importGeneratorCommand } = await import('./commands/import-generator.js');\n return importGeneratorCommand(options);\n });\n\n// Validate generator command - Story 6.5\nprogram\n .command('validate-generator')\n .description('Validate imported generators by executing with sample params')\n .option('--generator <name>', 'Generator to validate')\n .option('--all', 'Validate all generators in generators/ directory')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { validateGeneratorCommand } = await import('./commands/validate-generator.js');\n return validateGeneratorCommand(options);\n });\n\n// Skills command group - Story 6.6\nconst skills = program.command('skills').description('Manage Claude Code skills');\n\nskills\n .command('scan')\n .description('Discover available Claude Code skills')\n .option('--json', 'Output structured JSON response')\n .action(async (options) => {\n const { skillsScanCommand } = await import('./commands/skills-scan.js');\n return skillsScanCommand(options);\n });\n\nskills\n .command('suggest <atom>')\n .description('Get skill recommendations for an atom')\n .option('--json', 'Output structured JSON response')\n .action(async (atomName, options) => {\n const { skillsSuggestCommand } = await import('./commands/skills-suggest.js');\n return skillsSuggestCommand(atomName, options);\n });\n\nskills\n .command('assign <atom>')\n .description('Assign a skill to an atom')\n .requiredOption('--skill <name>', 'Skill name to assign')\n .option('--json', 'Output structured JSON response')\n .action(async (atomName, options) => {\n const { skillsAssignCommand } = await import('./commands/skills-assign.js');\n return skillsAssignCommand(atomName, options);\n });\n\nskills\n .command('list <atom>')\n .description('List skills assigned to an atom')\n .option('--json', 'Output structured JSON response')\n .action(async (atomName, options) => {\n const { skillsListAtomCommand } = await import('./commands/skills-assign.js');\n return skillsListAtomCommand(atomName, options);\n });\n\nskills\n .command('remove <atom>')\n .description('Remove a skill from an atom')\n .requiredOption('--skill <name>', 'Skill name to remove')\n .option('--json', 'Output structured JSON response')\n .action(async (atomName, options) => {\n const { skillsRemoveCommand } = await import('./commands/skills-assign.js');\n return skillsRemoveCommand(atomName, options);\n });\n\nprogram.parse();\n"],"mappings":";;;AACA,SAAS,eAAe;AAExB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,QAAQ,EACb,YAAY,kDAAkD,EAC9D,QAAQ,OAAO;AAGlB,QACG,QAAQ,MAAM,EACd,YAAY,yDAAyD,EACrE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,SAAO,YAAY,OAAO;AAC5B,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,uBAAuB,EACnC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAwB;AACjE,SAAO,gBAAgB,UAAU,OAAO;AAC1C,CAAC;AAGH,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,SAAO,YAAY,OAAO;AAC5B,CAAC;AAGH,QACG,QAAQ,YAAY,EACpB,YAAY,wCAAwC,EACpD,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,WAAW,8DAA8D,EAChF,OAAO,aAAa,4CAA4C,EAChE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,QAAQ,YAAY;AACjC,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,mBAAmB;AACvD,SAAO,WAAW,QAAQ,OAAO;AACnC,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,uCAAuC,EACnD,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,eAAe,IAAI,MAAM,OAAO,wBAAwB;AAChE,SAAO,eAAe,UAAU,OAAO;AACzC,CAAC;AAGH,QACG,QAAQ,aAAa,EACrB,YAAY,uBAAuB,EACnC,OAAO,cAAc,sBAAsB,EAC3C,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,SAAO,YAAY,UAAU,OAAO;AACtC,CAAC;AAGH,QACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,SAAO,cAAc,OAAO;AAC9B,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,wBAAwB,EACpC,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,eAAe,iBAAiB,IAAI,EAC3C,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,OAAO,YAAY;AAChC,QAAM,EAAE,eAAe,IAAI,MAAM,OAAO,uBAAuB;AAC/D,SAAO,eAAe,OAAO,OAAO;AACtC,CAAC;AAGH,IAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,+BAA+B;AAE9C,OACG,QAAQ,aAAa,EACrB,YAAY,yCAAyC,EACrD,OAAO,gBAAgB,yBAAyB,EAChD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,2BAA2B;AACtE,SAAO,kBAAkB,MAAM,OAAO;AACxC,CAAC;AAGH,QACG,QAAQ,SAAS,EACjB,YAAY,oEAAoE,EAChF,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,kCAAkC,EACzD,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,kBAAkB,qCAAqC,EAC9D,OAAO,aAAa,kCAAkC,EACtD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,eAAe,IAAI,MAAM,OAAO,uBAAuB;AAC/D,SAAO,eAAe,OAAO;AAC/B,CAAC;AAGH,QACG,QAAQ,SAAS,EACjB,YAAY,qDAAqD,EACjE,OAAO,gBAAgB,kCAAkC,EACzD,OAAO,eAAe,sCAAsC,EAC5D,OAAO,oBAAoB,mCAAmC,EAC9D,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,eAAe,IAAI,MAAM,OAAO,uBAAuB;AAC/D,SAAO,eAAe,OAAO;AAC/B,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,4CAA4C,EACxD,OAAO,aAAa,mBAAmB,EACvC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAwB;AACjE,SAAO,gBAAgB,EAAE,MAAM,GAAG,QAAQ,CAAC;AAC7C,CAAC;AAGH,QACG,QAAQ,eAAe,EACvB,YAAY,mDAAmD,EAC/D,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,aAAa,mBAAmB,EACvC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAsB;AAC7D,SAAO,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;AAC3C,CAAC;AAGH,QACG,QAAQ,eAAe,EACvB,YAAY,qCAAqC,EACjD,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,UAAU,mCAAmC,EACpD,OAAO,WAAW,0BAA0B,EAC5C,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,OAAO,YAAY;AAChC,QAAM,EAAE,iBAAiB,kBAAkB,kBAAkB,IAAI,MAAM,OAAO,qBAAqB;AACnG,MAAI,QAAQ,MAAM;AAChB,UAAM,iBAAiB,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EAC/C,WAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,wCAAwC;AACtD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,kBAAkB,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,EACvD,WAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,wCAAwC;AACtD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,gBAAgB,EAAE,OAAO,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,EAC3E,OAAO;AACL,YAAQ,MAAM,iDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,8BAA8B;AAE7C,SACG,QAAQ,YAAY,EACpB,YAAY,oBAAoB,EAChC,OAAO,aAAa,qCAAqC,EACzD,OAAO,2BAA2B,gDAAgD,EAClF,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,cAAc,6CAA6C,EAClE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,wBAAwB;AACpE,SAAO,mBAAmB,MAAM,OAAO;AACzC,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,0BAA0B,EACtC,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AACrE,SAAO,oBAAoB,OAAO;AACpC,CAAC;AAEH,SACG,QAAQ,eAAe,EACvB,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,2BAA2B,EACnD,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,cAAc,6CAA6C,EAClE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,wBAAwB;AACvE,SAAO,sBAAsB,MAAM,OAAO;AAC5C,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,iCAAiC,EAC7C,OAAO,aAAa,gCAAgC,EACpD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,SAAO,YAAY,MAAM,OAAO;AAClC,CAAC;AAGH,QACG,QAAQ,UAAU,EAClB,YAAY,8CAA8C,EAC1D,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,iBAAiB,4BAA4B,CAAC,UAAU;AAC9D,QAAM,SAAS,SAAS,OAAO,EAAE;AACjC,MAAI,MAAM,MAAM,KAAK,SAAS,GAAG;AAC/B,YAAQ,MAAM,iDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT,CAAC,EACA,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAwB;AACjE,SAAO,gBAAgB;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,wEAAwE,EACpF,OAAO,qBAAqB,uEAAuE,EACnG,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,+BAA+B;AAC9E,SAAO,sBAAsB,OAAO;AACtC,CAAC;AAGH,QACG,QAAQ,kBAAkB,EAC1B,YAAY,yCAAyC,EACrD,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,kBAAkB,kDAAkD,EAC3E,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,yBAAyB,wCAAwC,EACxE,OAAO,mBAAmB,0CAA0C,EACpE,OAAO,kBAAkB,kCAAkC,YAAY,EACvE,OAAO,eAAe,8BAA8B,EACpD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,gCAAgC;AAChF,SAAO,uBAAuB,OAAO;AACvC,CAAC;AAGH,QACG,QAAQ,oBAAoB,EAC5B,YAAY,8DAA8D,EAC1E,OAAO,sBAAsB,uBAAuB,EACpD,OAAO,SAAS,kDAAkD,EAClE,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,kCAAkC;AACpF,SAAO,yBAAyB,OAAO;AACzC,CAAC;AAGH,IAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,2BAA2B;AAEhF,OACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,YAAY;AACzB,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,2BAA2B;AACtE,SAAO,kBAAkB,OAAO;AAClC,CAAC;AAEH,OACG,QAAQ,gBAAgB,EACxB,YAAY,uCAAuC,EACnD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,8BAA8B;AAC5E,SAAO,qBAAqB,UAAU,OAAO;AAC/C,CAAC;AAEH,OACG,QAAQ,eAAe,EACvB,YAAY,2BAA2B,EACvC,eAAe,kBAAkB,sBAAsB,EACvD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,6BAA6B;AAC1E,SAAO,oBAAoB,UAAU,OAAO;AAC9C,CAAC;AAEH,OACG,QAAQ,aAAa,EACrB,YAAY,iCAAiC,EAC7C,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,6BAA6B;AAC5E,SAAO,sBAAsB,UAAU,OAAO;AAChD,CAAC;AAEH,OACG,QAAQ,eAAe,EACvB,YAAY,6BAA6B,EACzC,eAAe,kBAAkB,sBAAsB,EACvD,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,6BAA6B;AAC1E,SAAO,oBAAoB,UAAU,OAAO;AAC9C,CAAC;AAEH,QAAQ,MAAM;","names":[]}
@@ -0,0 +1,153 @@
1
+ import {
2
+ resolveAtomPath
3
+ } from "./chunk-RS2IEGW3.js";
4
+ import {
5
+ ATOMIC_DIR,
6
+ fileExists,
7
+ initStorage
8
+ } from "./chunk-YKJO3ZFY.js";
9
+ import {
10
+ toErrorMessage
11
+ } from "./chunk-PLQJM2KT.js";
12
+
13
+ // src/commands/create-atom.ts
14
+ import { join } from "path";
15
+ import { mkdir, writeFile } from "fs/promises";
16
+ var ATOM_TEMPLATE = (name) => `import { defineAtom, success, executionError, validationError, z } from 'atomism';
17
+
18
+ /**
19
+ * ${name} atom
20
+ *
21
+ * TODO: Add description of what this atom does
22
+ */
23
+ export default defineAtom({
24
+ name: '${name}',
25
+ description: 'TODO: Add description',
26
+ input: z.object({
27
+ // TODO: Define input schema
28
+ // Example: name: z.string().describe('The user name'),
29
+ }),
30
+ output: z.object({
31
+ // TODO: Define output schema
32
+ // Example: result: z.string().describe('The processed result'),
33
+ }),
34
+ tests: {
35
+ path: './${name}.test.ts',
36
+ },
37
+ idempotent: true,
38
+ handler: async (input) => {
39
+ // TODO: Implement handler logic
40
+
41
+ // Return success with output matching output schema
42
+ return success({
43
+ // result: 'processed',
44
+ });
45
+
46
+ // Or return an error:
47
+ // return executionError('Runtime failure message', true /* recoverable */);
48
+ // return validationError('Bad input message');
49
+ },
50
+ });
51
+ `;
52
+ var TEST_TEMPLATE = (name) => `import { describe, it, expect } from 'vitest';
53
+ import { z } from 'atomism';
54
+ import atom from './${name}.js';
55
+
56
+ describe('${name}', () => {
57
+ describe('input validation', () => {
58
+ it.todo('validates required input fields');
59
+ it.todo('rejects invalid input types');
60
+ });
61
+
62
+ describe('handler behavior', () => {
63
+ it.todo('processes valid input correctly');
64
+ it.todo('returns success result with expected output');
65
+ it.todo('handles edge cases appropriately');
66
+ });
67
+
68
+ describe('error handling', () => {
69
+ it.todo('returns error for invalid state');
70
+ it.todo('provides recoverable error information');
71
+ });
72
+
73
+ describe('idempotency', () => {
74
+ it.todo('produces same result when called multiple times with same input');
75
+ });
76
+ });
77
+ `;
78
+ async function createAtomCommand(name, options) {
79
+ const projectRoot = process.cwd();
80
+ try {
81
+ if (!/^[a-z][a-z0-9_]*$/.test(name)) {
82
+ throw new Error(
83
+ `Invalid atom name: ${name}
84
+ Atom names must start with lowercase letter and contain only lowercase letters, numbers, and underscores.`
85
+ );
86
+ }
87
+ let initialized = false;
88
+ const atomicPath = join(projectRoot, ATOMIC_DIR);
89
+ if (!await fileExists(atomicPath)) {
90
+ await initStorage(projectRoot);
91
+ initialized = true;
92
+ }
93
+ const outputDir = options.path ? resolveAtomPath(options.path, projectRoot) : join(projectRoot, "atoms");
94
+ await mkdir(outputDir, { recursive: true });
95
+ const atomPath = join(outputDir, `${name}.ts`);
96
+ const testPath = join(outputDir, `${name}.test.ts`);
97
+ if (await fileExists(atomPath)) {
98
+ throw new Error(
99
+ `Atom file already exists: ${atomPath}
100
+ Use a different name or delete the existing file.`
101
+ );
102
+ }
103
+ if (await fileExists(testPath)) {
104
+ throw new Error(
105
+ `Test file already exists: ${testPath}
106
+ Use a different name or delete the existing file.`
107
+ );
108
+ }
109
+ await writeFile(atomPath, ATOM_TEMPLATE(name));
110
+ await writeFile(testPath, TEST_TEMPLATE(name));
111
+ const result = {
112
+ success: true,
113
+ atomName: name,
114
+ atomPath,
115
+ testPath,
116
+ initialized
117
+ };
118
+ if (options.json) {
119
+ console.log(JSON.stringify(result, null, 2));
120
+ } else {
121
+ if (initialized) {
122
+ console.log("\u2713 Initialized .atomic/ directory");
123
+ }
124
+ console.log(`\u2713 Created atom: ${name}`);
125
+ console.log(` Atom: ${atomPath}`);
126
+ console.log(` Test: ${testPath}`);
127
+ console.log("");
128
+ console.log("Next steps:");
129
+ console.log(` 1. Edit ${atomPath} to define input/output schemas and handler`);
130
+ console.log(` 2. Run: atomic register ${atomPath}`);
131
+ console.log(` 3. Run: atomic test-gen ${atomPath}`);
132
+ }
133
+ } catch (err) {
134
+ if (options.json) {
135
+ console.log(
136
+ JSON.stringify({
137
+ success: false,
138
+ error: toErrorMessage(err)
139
+ })
140
+ );
141
+ process.exit(1);
142
+ } else {
143
+ console.error(
144
+ `Error: ${toErrorMessage(err)}`
145
+ );
146
+ process.exit(1);
147
+ }
148
+ }
149
+ }
150
+ export {
151
+ createAtomCommand
152
+ };
153
+ //# sourceMappingURL=create-atom-AXPDBYQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/create-atom.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { initStorage, ATOMIC_DIR, fileExists } from '../storage/index.js';\nimport { toErrorMessage } from '../utils/errors.js';\nimport { resolveAtomPath } from '../utils/paths.js';\n\nexport interface CreateAtomOptions {\n json?: boolean;\n path?: string;\n}\n\nexport interface CreateAtomResult {\n success: boolean;\n atomName: string;\n atomPath: string;\n testPath: string;\n initialized: boolean;\n}\n\nconst ATOM_TEMPLATE = (name: string): string => `import { defineAtom, success, executionError, validationError, z } from 'atomism';\n\n/**\n * ${name} atom\n *\n * TODO: Add description of what this atom does\n */\nexport default defineAtom({\n name: '${name}',\n description: 'TODO: Add description',\n input: z.object({\n // TODO: Define input schema\n // Example: name: z.string().describe('The user name'),\n }),\n output: z.object({\n // TODO: Define output schema\n // Example: result: z.string().describe('The processed result'),\n }),\n tests: {\n path: './${name}.test.ts',\n },\n idempotent: true,\n handler: async (input) => {\n // TODO: Implement handler logic\n\n // Return success with output matching output schema\n return success({\n // result: 'processed',\n });\n\n // Or return an error:\n // return executionError('Runtime failure message', true /* recoverable */);\n // return validationError('Bad input message');\n },\n});\n`;\n\nconst TEST_TEMPLATE = (name: string): string => `import { describe, it, expect } from 'vitest';\nimport { z } from 'atomism';\nimport atom from './${name}.js';\n\ndescribe('${name}', () => {\n describe('input validation', () => {\n it.todo('validates required input fields');\n it.todo('rejects invalid input types');\n });\n\n describe('handler behavior', () => {\n it.todo('processes valid input correctly');\n it.todo('returns success result with expected output');\n it.todo('handles edge cases appropriately');\n });\n\n describe('error handling', () => {\n it.todo('returns error for invalid state');\n it.todo('provides recoverable error information');\n });\n\n describe('idempotency', () => {\n it.todo('produces same result when called multiple times with same input');\n });\n});\n`;\n\n/**\n * Scaffold a new atom file and its test stub.\n */\nexport async function createAtomCommand(\n name: string,\n options: CreateAtomOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n\n try {\n // Validate atom name\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(\n `Invalid atom name: ${name}\\n` +\n `Atom names must start with lowercase letter and contain only lowercase letters, numbers, and underscores.`\n );\n }\n\n // Initialize storage if needed\n let initialized = false;\n const atomicPath = join(projectRoot, ATOMIC_DIR);\n if (!(await fileExists(atomicPath))) {\n await initStorage(projectRoot);\n initialized = true;\n }\n\n // Determine output directory\n const outputDir = options.path\n ? resolveAtomPath(options.path, projectRoot)\n : join(projectRoot, 'atoms');\n\n // Create output directory\n await mkdir(outputDir, { recursive: true });\n\n // Check if files already exist\n const atomPath = join(outputDir, `${name}.ts`);\n const testPath = join(outputDir, `${name}.test.ts`);\n\n if (await fileExists(atomPath)) {\n throw new Error(\n `Atom file already exists: ${atomPath}\\n` +\n `Use a different name or delete the existing file.`\n );\n }\n\n if (await fileExists(testPath)) {\n throw new Error(\n `Test file already exists: ${testPath}\\n` +\n `Use a different name or delete the existing file.`\n );\n }\n\n // Write atom file\n await writeFile(atomPath, ATOM_TEMPLATE(name));\n\n // Write test file\n await writeFile(testPath, TEST_TEMPLATE(name));\n\n // Output result\n const result: CreateAtomResult = {\n success: true,\n atomName: name,\n atomPath,\n testPath,\n initialized,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (initialized) {\n console.log('✓ Initialized .atomic/ directory');\n }\n console.log(`✓ Created atom: ${name}`);\n console.log(` Atom: ${atomPath}`);\n console.log(` Test: ${testPath}`);\n console.log('');\n console.log('Next steps:');\n console.log(` 1. Edit ${atomPath} to define input/output schemas and handler`);\n console.log(` 2. Run: atomic register ${atomPath}`);\n console.log(` 3. Run: atomic test-gen ${atomPath}`);\n }\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({\n success: false,\n error: toErrorMessage(err),\n })\n );\n process.exit(1);\n } else {\n console.error(\n `Error: ${toErrorMessage(err)}`\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,OAAO,iBAAiB;AAkBjC,IAAM,gBAAgB,CAAC,SAAyB;AAAA;AAAA;AAAA,KAG3C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,WAKE,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAWA,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBnB,IAAM,gBAAgB,CAAC,SAAyB;AAAA;AAAA,sBAE1B,IAAI;AAAA;AAAA,YAEd,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BhB,eAAsB,kBACpB,MACA,SACe;AACf,QAAM,cAAc,QAAQ,IAAI;AAEhC,MAAI;AAEF,QAAI,CAAC,oBAAoB,KAAK,IAAI,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,sBAAsB,IAAI;AAAA;AAAA,MAE5B;AAAA,IACF;AAGA,QAAI,cAAc;AAClB,UAAM,aAAa,KAAK,aAAa,UAAU;AAC/C,QAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,YAAM,YAAY,WAAW;AAC7B,oBAAc;AAAA,IAChB;AAGA,UAAM,YAAY,QAAQ,OACtB,gBAAgB,QAAQ,MAAM,WAAW,IACzC,KAAK,aAAa,OAAO;AAG7B,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG1C,UAAM,WAAW,KAAK,WAAW,GAAG,IAAI,KAAK;AAC7C,UAAM,WAAW,KAAK,WAAW,GAAG,IAAI,UAAU;AAElD,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,YAAM,IAAI;AAAA,QACR,6BAA6B,QAAQ;AAAA;AAAA,MAEvC;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,YAAM,IAAI;AAAA,QACR,6BAA6B,QAAQ;AAAA;AAAA,MAEvC;AAAA,IACF;AAGA,UAAM,UAAU,UAAU,cAAc,IAAI,CAAC;AAG7C,UAAM,UAAU,UAAU,cAAc,IAAI,CAAC;AAG7C,UAAM,SAA2B;AAAA,MAC/B,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,UAAI,aAAa;AACf,gBAAQ,IAAI,uCAAkC;AAAA,MAChD;AACA,cAAQ,IAAI,wBAAmB,IAAI,EAAE;AACrC,cAAQ,IAAI,WAAW,QAAQ,EAAE;AACjC,cAAQ,IAAI,WAAW,QAAQ,EAAE;AACjC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,aAAa;AACzB,cAAQ,IAAI,aAAa,QAAQ,6CAA6C;AAC9E,cAAQ,IAAI,6BAA6B,QAAQ,EAAE;AACnD,cAAQ,IAAI,6BAA6B,QAAQ,EAAE;AAAA,IACrD;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,QAAQ,MAAM;AAChB,cAAQ;AAAA,QACN,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,OAAO,eAAe,GAAG;AAAA,QAC3B,CAAC;AAAA,MACH;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ;AAAA,QACN,UAAU,eAAe,GAAG,CAAC;AAAA,MAC/B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,211 @@
1
+ import {
2
+ fmt
3
+ } from "./chunk-S6Z5G5DB.js";
4
+ import {
5
+ toErrorMessage
6
+ } from "./chunk-PLQJM2KT.js";
7
+
8
+ // src/commands/escalate.ts
9
+ import { execFile } from "child_process";
10
+ import { promisify } from "util";
11
+ import { platform } from "os";
12
+ import { z } from "zod";
13
+ var execFileAsync = promisify(execFile);
14
+ var EscalateOptionsSchema = z.object({
15
+ message: z.string().optional(),
16
+ runId: z.string().optional(),
17
+ atom: z.string().optional(),
18
+ reason: z.string().optional(),
19
+ retries: z.number().int().nonnegative().optional(),
20
+ json: z.boolean().optional(),
21
+ /** Workflow name for context */
22
+ workflowName: z.string().optional(),
23
+ /** Parent bead ID for linking escalation to workflow */
24
+ parentBeadId: z.string().optional()
25
+ });
26
+ async function isBeadsAvailable() {
27
+ try {
28
+ const cmd = platform() === "win32" ? "where" : "which";
29
+ await execFileAsync(cmd, ["bd"], {});
30
+ return true;
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+ async function isBeadsInitialized() {
36
+ try {
37
+ await execFileAsync("bd", ["info"], {});
38
+ return true;
39
+ } catch {
40
+ return false;
41
+ }
42
+ }
43
+ async function createBeadsIssue(title, description, labels) {
44
+ try {
45
+ const args = ["create", title, "-d", description];
46
+ for (const label of labels) {
47
+ args.push("-l", label);
48
+ }
49
+ args.push("-t", "task", "--json");
50
+ const { stdout } = await execFileAsync("bd", args, {
51
+ encoding: "utf-8"
52
+ });
53
+ const parsed = JSON.parse(stdout);
54
+ if (parsed.id) {
55
+ return { issueId: parsed.id };
56
+ }
57
+ return { error: "Failed to parse issue ID from Beads output" };
58
+ } catch (err) {
59
+ return {
60
+ error: toErrorMessage(err)
61
+ };
62
+ }
63
+ }
64
+ function buildDescription(options) {
65
+ const lines = [];
66
+ lines.push("## Escalation Details");
67
+ lines.push("");
68
+ lines.push("This issue was escalated from the atomic CLI and requires human intervention.");
69
+ lines.push("");
70
+ if (options.workflowName) {
71
+ lines.push(`**Workflow:** \`${options.workflowName}\``);
72
+ }
73
+ if (options.atom) {
74
+ lines.push(`**Atom:** \`${options.atom}\``);
75
+ }
76
+ if (options.runId) {
77
+ lines.push(`**Run ID:** ${options.runId}`);
78
+ }
79
+ if (options.parentBeadId) {
80
+ lines.push(`**Parent Bead:** ${options.parentBeadId}`);
81
+ }
82
+ if (options.retries !== void 0 && options.retries > 0) {
83
+ lines.push(`**Retry Attempts:** ${options.retries}`);
84
+ }
85
+ if (options.workflowName || options.atom || options.runId || options.parentBeadId || options.retries) {
86
+ lines.push("");
87
+ }
88
+ if (options.reason) {
89
+ lines.push("## Blocked Reason");
90
+ lines.push("");
91
+ lines.push(options.reason);
92
+ lines.push("");
93
+ }
94
+ if (options.message) {
95
+ lines.push("## Additional Context");
96
+ lines.push("");
97
+ lines.push(options.message);
98
+ lines.push("");
99
+ }
100
+ lines.push("## Resolution");
101
+ lines.push("");
102
+ lines.push("After resolving this issue:");
103
+ lines.push("1. Run `bd close <issue-id>` to mark complete");
104
+ if (options.workflowName) {
105
+ lines.push(`2. Resume with \`atomic workflow resume ${options.workflowName}\``);
106
+ } else if (options.atom) {
107
+ lines.push(`2. Retry with \`atomic run ${options.atom}\``);
108
+ } else {
109
+ lines.push("2. Retry the failed atomic operation");
110
+ }
111
+ lines.push("");
112
+ lines.push("## Labels");
113
+ lines.push("");
114
+ lines.push("- `atomic` - Created by atomic CLI");
115
+ lines.push("- `escalated` - Requires human intervention");
116
+ if (options.workflowName) {
117
+ lines.push(`- \`workflow:${options.workflowName}\` - Part of workflow`);
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ async function escalateCommand(options) {
122
+ const parseResult = EscalateOptionsSchema.safeParse(options);
123
+ if (!parseResult.success) {
124
+ const result2 = {
125
+ success: false,
126
+ error: `Invalid options: ${parseResult.error.message}`
127
+ };
128
+ if (options.json === true) {
129
+ console.log(JSON.stringify(result2, null, 2));
130
+ } else {
131
+ console.error(fmt.red("Error:"), result2.error);
132
+ }
133
+ process.exit(1);
134
+ }
135
+ const validated = parseResult.data;
136
+ if (!await isBeadsAvailable()) {
137
+ const result2 = {
138
+ success: false,
139
+ error: "Beads CLI (bd) not found. Install Beads to use escalation."
140
+ };
141
+ if (validated.json) {
142
+ console.log(JSON.stringify(result2, null, 2));
143
+ } else {
144
+ console.error(fmt.red("Error:"), result2.error);
145
+ }
146
+ process.exit(1);
147
+ }
148
+ if (!await isBeadsInitialized()) {
149
+ const result2 = {
150
+ success: false,
151
+ error: "Beads not initialized. Run `bd init` first."
152
+ };
153
+ if (validated.json) {
154
+ console.log(JSON.stringify(result2, null, 2));
155
+ } else {
156
+ console.error(fmt.red("Error:"), result2.error);
157
+ }
158
+ process.exit(1);
159
+ }
160
+ let title;
161
+ if (validated.workflowName) {
162
+ title = `[atomic] Escalation: workflow '${validated.workflowName}'`;
163
+ if (validated.atom) {
164
+ title += ` at '${validated.atom}'`;
165
+ }
166
+ } else if (validated.runId) {
167
+ title = `[atomic] Escalation for run ${validated.runId}`;
168
+ } else {
169
+ title = "[atomic] Manual escalation";
170
+ }
171
+ const description = buildDescription(validated);
172
+ const createResult = await createBeadsIssue(title, description, [
173
+ "atomic",
174
+ "escalated"
175
+ ]);
176
+ if ("error" in createResult) {
177
+ const result2 = {
178
+ success: false,
179
+ error: createResult.error
180
+ };
181
+ if (validated.json) {
182
+ console.log(JSON.stringify(result2, null, 2));
183
+ } else {
184
+ console.error(fmt.red("Error:"), result2.error);
185
+ }
186
+ process.exit(1);
187
+ }
188
+ const result = {
189
+ success: true,
190
+ issueId: createResult.issueId,
191
+ title
192
+ };
193
+ if (validated.json) {
194
+ console.log(JSON.stringify(result, null, 2));
195
+ } else {
196
+ console.log(
197
+ fmt.green("\u2713"),
198
+ fmt.bold("Escalation created"),
199
+ fmt.cyan(createResult.issueId)
200
+ );
201
+ console.log(` Title: ${title}`);
202
+ if (validated.message) {
203
+ console.log(` Notes: ${validated.message}`);
204
+ }
205
+ }
206
+ }
207
+ export {
208
+ EscalateOptionsSchema,
209
+ escalateCommand
210
+ };
211
+ //# sourceMappingURL=escalate-BTEJT5NL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/escalate.ts"],"sourcesContent":["/**\n * Escalate command implementation for the atomic CLI.\n *\n * This module implements issue escalation to Beads for unresolvable problems\n * during workflow execution.\n *\n * @module commands/escalate\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { platform } from 'node:os';\nimport { z } from 'zod';\nimport { fmt } from '../cli/format.js';\nimport { toErrorMessage } from '../utils/errors.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Schema for escalate command options.\n */\nexport const EscalateOptionsSchema = z.object({\n message: z.string().optional(),\n runId: z.string().optional(),\n atom: z.string().optional(),\n reason: z.string().optional(),\n retries: z.number().int().nonnegative().optional(),\n json: z.boolean().optional(),\n /** Workflow name for context */\n workflowName: z.string().optional(),\n /** Parent bead ID for linking escalation to workflow */\n parentBeadId: z.string().optional(),\n});\n\n/**\n * Options for the escalate command.\n */\nexport type EscalateOptions = z.infer<typeof EscalateOptionsSchema>;\n\n/**\n * Result of escalate command.\n */\nexport interface EscalateResult {\n success: boolean;\n issueId?: string;\n title?: string;\n error?: string;\n}\n\n/**\n * Check if Beads (bd) CLI is available.\n * Uses execFile with array args to avoid shell injection.\n */\nasync function isBeadsAvailable(): Promise<boolean> {\n try {\n const cmd = platform() === 'win32' ? 'where' : 'which';\n await execFileAsync(cmd, ['bd'], {});\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Beads is initialized in the current directory.\n */\nasync function isBeadsInitialized(): Promise<boolean> {\n try {\n await execFileAsync('bd', ['info'], {});\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a Beads issue for escalation.\n * Uses execFile with array args to avoid shell injection.\n */\nasync function createBeadsIssue(\n title: string,\n description: string,\n labels: string[]\n): Promise<{ issueId: string } | { error: string }> {\n try {\n // Build args array to avoid shell injection\n const args = ['create', title, '-d', description];\n for (const label of labels) {\n args.push('-l', label);\n }\n args.push('-t', 'task', '--json');\n\n const { stdout } = await execFileAsync('bd', args, {\n encoding: 'utf-8',\n });\n\n // Parse JSON output to get issue ID\n const parsed = JSON.parse(stdout);\n if (parsed.id) {\n return { issueId: parsed.id };\n }\n return { error: 'Failed to parse issue ID from Beads output' };\n } catch (err) {\n return {\n error: toErrorMessage(err),\n };\n }\n}\n\n/**\n * Build the escalation description with full context for bd ready.\n */\nfunction buildDescription(options: EscalateOptions): string {\n const lines: string[] = [];\n\n lines.push('## Escalation Details');\n lines.push('');\n lines.push('This issue was escalated from the atomic CLI and requires human intervention.');\n lines.push('');\n\n // Workflow context\n if (options.workflowName) {\n lines.push(`**Workflow:** \\`${options.workflowName}\\``);\n }\n\n // Atom context for bd ready\n if (options.atom) {\n lines.push(`**Atom:** \\`${options.atom}\\``);\n }\n\n if (options.runId) {\n lines.push(`**Run ID:** ${options.runId}`);\n }\n\n if (options.parentBeadId) {\n lines.push(`**Parent Bead:** ${options.parentBeadId}`);\n }\n\n if (options.retries !== undefined && options.retries > 0) {\n lines.push(`**Retry Attempts:** ${options.retries}`);\n }\n\n if (options.workflowName || options.atom || options.runId || options.parentBeadId || options.retries) {\n lines.push('');\n }\n\n // Blocked reason\n if (options.reason) {\n lines.push('## Blocked Reason');\n lines.push('');\n lines.push(options.reason);\n lines.push('');\n }\n\n // User notes\n if (options.message) {\n lines.push('## Additional Context');\n lines.push('');\n lines.push(options.message);\n lines.push('');\n }\n\n // Resolution instructions\n lines.push('## Resolution');\n lines.push('');\n lines.push('After resolving this issue:');\n lines.push('1. Run `bd close <issue-id>` to mark complete');\n if (options.workflowName) {\n lines.push(`2. Resume with \\`atomic workflow resume ${options.workflowName}\\``);\n } else if (options.atom) {\n lines.push(`2. Retry with \\`atomic run ${options.atom}\\``);\n } else {\n lines.push('2. Retry the failed atomic operation');\n }\n lines.push('');\n\n lines.push('## Labels');\n lines.push('');\n lines.push('- `atomic` - Created by atomic CLI');\n lines.push('- `escalated` - Requires human intervention');\n if (options.workflowName) {\n lines.push(`- \\`workflow:${options.workflowName}\\` - Part of workflow`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Execute the escalate command.\n *\n * @param options - Escalate options\n */\nexport async function escalateCommand(\n options: EscalateOptions\n): Promise<void> {\n // Validate options with Zod schema\n const parseResult = EscalateOptionsSchema.safeParse(options);\n if (!parseResult.success) {\n const result: EscalateResult = {\n success: false,\n error: `Invalid options: ${parseResult.error.message}`,\n };\n // Use strict equality check since input is untrusted\n if (options.json === true) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(fmt.red('Error:'), result.error);\n }\n process.exit(1);\n }\n const validated = parseResult.data;\n\n // Check if Beads is available\n if (!(await isBeadsAvailable())) {\n const result: EscalateResult = {\n success: false,\n error: 'Beads CLI (bd) not found. Install Beads to use escalation.',\n };\n\n if (validated.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(fmt.red('Error:'), result.error);\n }\n process.exit(1);\n }\n\n // Check if Beads is initialized\n if (!(await isBeadsInitialized())) {\n const result: EscalateResult = {\n success: false,\n error: 'Beads not initialized. Run `bd init` first.',\n };\n\n if (validated.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(fmt.red('Error:'), result.error);\n }\n process.exit(1);\n }\n\n // Build title\n let title: string;\n if (validated.workflowName) {\n title = `[atomic] Escalation: workflow '${validated.workflowName}'`;\n if (validated.atom) {\n title += ` at '${validated.atom}'`;\n }\n } else if (validated.runId) {\n title = `[atomic] Escalation for run ${validated.runId}`;\n } else {\n title = '[atomic] Manual escalation';\n }\n\n // Build description\n const description = buildDescription(validated);\n\n // Create the Beads issue\n const createResult = await createBeadsIssue(title, description, [\n 'atomic',\n 'escalated',\n ]);\n\n if ('error' in createResult) {\n const result: EscalateResult = {\n success: false,\n error: createResult.error,\n };\n\n if (validated.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.error(fmt.red('Error:'), result.error);\n }\n process.exit(1);\n }\n\n // Success\n const result: EscalateResult = {\n success: true,\n issueId: createResult.issueId,\n title,\n };\n\n if (validated.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(\n fmt.green('✓'),\n fmt.bold('Escalation created'),\n fmt.cyan(createResult.issueId)\n );\n console.log(` Title: ${title}`);\n if (validated.message) {\n console.log(` Notes: ${validated.message}`);\n }\n }\n}\n"],"mappings":"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","names":["result"]}