@hypercli/gen 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/actions/communication.d.ts +201 -0
  4. package/dist/actions/communication.d.ts.map +1 -0
  5. package/dist/actions/communication.js +515 -0
  6. package/dist/actions/communication.js.map +1 -0
  7. package/dist/actions/decorator.d.ts +22 -0
  8. package/dist/actions/decorator.d.ts.map +1 -0
  9. package/dist/actions/decorator.js +110 -0
  10. package/dist/actions/decorator.js.map +1 -0
  11. package/dist/actions/executor.d.ts +85 -0
  12. package/dist/actions/executor.d.ts.map +1 -0
  13. package/dist/actions/executor.js +289 -0
  14. package/dist/actions/executor.js.map +1 -0
  15. package/dist/actions/index.d.ts +14 -0
  16. package/dist/actions/index.d.ts.map +1 -0
  17. package/dist/actions/index.js +15 -0
  18. package/dist/actions/index.js.map +1 -0
  19. package/dist/actions/parameter-resolver.d.ts +54 -0
  20. package/dist/actions/parameter-resolver.d.ts.map +1 -0
  21. package/dist/actions/parameter-resolver.js +300 -0
  22. package/dist/actions/parameter-resolver.js.map +1 -0
  23. package/dist/actions/registry.d.ts +78 -0
  24. package/dist/actions/registry.d.ts.map +1 -0
  25. package/dist/actions/registry.js +221 -0
  26. package/dist/actions/registry.js.map +1 -0
  27. package/dist/actions/types.d.ts +109 -0
  28. package/dist/actions/types.d.ts.map +1 -0
  29. package/dist/actions/types.js +31 -0
  30. package/dist/actions/types.js.map +1 -0
  31. package/dist/actions/utils.d.ts +42 -0
  32. package/dist/actions/utils.d.ts.map +1 -0
  33. package/dist/actions/utils.js +144 -0
  34. package/dist/actions/utils.js.map +1 -0
  35. package/dist/ai/ai-collector.d.ts +52 -0
  36. package/dist/ai/ai-collector.d.ts.map +1 -0
  37. package/dist/ai/ai-collector.js +64 -0
  38. package/dist/ai/ai-collector.js.map +1 -0
  39. package/dist/ai/ai-config.d.ts +230 -0
  40. package/dist/ai/ai-config.d.ts.map +1 -0
  41. package/dist/ai/ai-config.js +8 -0
  42. package/dist/ai/ai-config.js.map +1 -0
  43. package/dist/ai/ai-service.d.ts +66 -0
  44. package/dist/ai/ai-service.d.ts.map +1 -0
  45. package/dist/ai/ai-service.js +198 -0
  46. package/dist/ai/ai-service.js.map +1 -0
  47. package/dist/ai/ai-variable-resolver.d.ts +59 -0
  48. package/dist/ai/ai-variable-resolver.d.ts.map +1 -0
  49. package/dist/ai/ai-variable-resolver.js +219 -0
  50. package/dist/ai/ai-variable-resolver.js.map +1 -0
  51. package/dist/ai/context-collector.d.ts +30 -0
  52. package/dist/ai/context-collector.d.ts.map +1 -0
  53. package/dist/ai/context-collector.js +158 -0
  54. package/dist/ai/context-collector.js.map +1 -0
  55. package/dist/ai/cost-tracker.d.ts +41 -0
  56. package/dist/ai/cost-tracker.d.ts.map +1 -0
  57. package/dist/ai/cost-tracker.js +131 -0
  58. package/dist/ai/cost-tracker.js.map +1 -0
  59. package/dist/ai/env.d.ts +36 -0
  60. package/dist/ai/env.d.ts.map +1 -0
  61. package/dist/ai/env.js +100 -0
  62. package/dist/ai/env.js.map +1 -0
  63. package/dist/ai/index.d.ts +17 -0
  64. package/dist/ai/index.d.ts.map +1 -0
  65. package/dist/ai/index.js +25 -0
  66. package/dist/ai/index.js.map +1 -0
  67. package/dist/ai/model-router.d.ts +32 -0
  68. package/dist/ai/model-router.d.ts.map +1 -0
  69. package/dist/ai/model-router.js +113 -0
  70. package/dist/ai/model-router.js.map +1 -0
  71. package/dist/ai/output-validator.d.ts +24 -0
  72. package/dist/ai/output-validator.d.ts.map +1 -0
  73. package/dist/ai/output-validator.js +279 -0
  74. package/dist/ai/output-validator.js.map +1 -0
  75. package/dist/ai/prompt-assembler.d.ts +30 -0
  76. package/dist/ai/prompt-assembler.d.ts.map +1 -0
  77. package/dist/ai/prompt-assembler.js +93 -0
  78. package/dist/ai/prompt-assembler.js.map +1 -0
  79. package/dist/ai/prompt-pipeline.d.ts +63 -0
  80. package/dist/ai/prompt-pipeline.d.ts.map +1 -0
  81. package/dist/ai/prompt-pipeline.js +119 -0
  82. package/dist/ai/prompt-pipeline.js.map +1 -0
  83. package/dist/ai/prompt-template.jig +88 -0
  84. package/dist/ai/transports/api-transport.d.ts +12 -0
  85. package/dist/ai/transports/api-transport.d.ts.map +1 -0
  86. package/dist/ai/transports/api-transport.js +86 -0
  87. package/dist/ai/transports/api-transport.js.map +1 -0
  88. package/dist/ai/transports/command-transport.d.ts +20 -0
  89. package/dist/ai/transports/command-transport.d.ts.map +1 -0
  90. package/dist/ai/transports/command-transport.js +203 -0
  91. package/dist/ai/transports/command-transport.js.map +1 -0
  92. package/dist/ai/transports/index.d.ts +11 -0
  93. package/dist/ai/transports/index.d.ts.map +1 -0
  94. package/dist/ai/transports/index.js +10 -0
  95. package/dist/ai/transports/index.js.map +1 -0
  96. package/dist/ai/transports/resolve-transport.d.ts +15 -0
  97. package/dist/ai/transports/resolve-transport.d.ts.map +1 -0
  98. package/dist/ai/transports/resolve-transport.js +96 -0
  99. package/dist/ai/transports/resolve-transport.js.map +1 -0
  100. package/dist/ai/transports/stdout-transport.d.ts +14 -0
  101. package/dist/ai/transports/stdout-transport.d.ts.map +1 -0
  102. package/dist/ai/transports/stdout-transport.js +27 -0
  103. package/dist/ai/transports/stdout-transport.js.map +1 -0
  104. package/dist/ai/transports/types.d.ts +77 -0
  105. package/dist/ai/transports/types.d.ts.map +1 -0
  106. package/dist/ai/transports/types.js +8 -0
  107. package/dist/ai/transports/types.js.map +1 -0
  108. package/dist/commands/cookbook/info.d.ts +22 -0
  109. package/dist/commands/cookbook/info.d.ts.map +1 -0
  110. package/dist/commands/cookbook/info.js +217 -0
  111. package/dist/commands/cookbook/info.js.map +1 -0
  112. package/dist/commands/cookbook/list.d.ts +20 -0
  113. package/dist/commands/cookbook/list.d.ts.map +1 -0
  114. package/dist/commands/cookbook/list.js +133 -0
  115. package/dist/commands/cookbook/list.js.map +1 -0
  116. package/dist/commands/gen.d.ts +65 -0
  117. package/dist/commands/gen.d.ts.map +1 -0
  118. package/dist/commands/gen.js +478 -0
  119. package/dist/commands/gen.js.map +1 -0
  120. package/dist/commands/recipe/info.d.ts +18 -0
  121. package/dist/commands/recipe/info.d.ts.map +1 -0
  122. package/dist/commands/recipe/info.js +89 -0
  123. package/dist/commands/recipe/info.js.map +1 -0
  124. package/dist/commands/recipe/list.d.ts +29 -0
  125. package/dist/commands/recipe/list.d.ts.map +1 -0
  126. package/dist/commands/recipe/list.js +215 -0
  127. package/dist/commands/recipe/list.js.map +1 -0
  128. package/dist/commands/recipe/run.d.ts +44 -0
  129. package/dist/commands/recipe/run.d.ts.map +1 -0
  130. package/dist/commands/recipe/run.js +239 -0
  131. package/dist/commands/recipe/run.js.map +1 -0
  132. package/dist/commands/recipe/validate.d.ts +19 -0
  133. package/dist/commands/recipe/validate.d.ts.map +1 -0
  134. package/dist/commands/recipe/validate.js +66 -0
  135. package/dist/commands/recipe/validate.js.map +1 -0
  136. package/dist/discovery/generator-discovery.d.ts +130 -0
  137. package/dist/discovery/generator-discovery.d.ts.map +1 -0
  138. package/dist/discovery/generator-discovery.js +674 -0
  139. package/dist/discovery/generator-discovery.js.map +1 -0
  140. package/dist/discovery/index.d.ts +8 -0
  141. package/dist/discovery/index.d.ts.map +1 -0
  142. package/dist/discovery/index.js +7 -0
  143. package/dist/discovery/index.js.map +1 -0
  144. package/dist/hooks/command-not-found.d.ts +18 -0
  145. package/dist/hooks/command-not-found.d.ts.map +1 -0
  146. package/dist/hooks/command-not-found.js +182 -0
  147. package/dist/hooks/command-not-found.js.map +1 -0
  148. package/dist/hooks/suggest.d.ts +13 -0
  149. package/dist/hooks/suggest.d.ts.map +1 -0
  150. package/dist/hooks/suggest.js +28 -0
  151. package/dist/hooks/suggest.js.map +1 -0
  152. package/dist/index.d.ts +2 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +3 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/base-command.d.ts +26 -0
  157. package/dist/lib/base-command.d.ts.map +1 -0
  158. package/dist/lib/base-command.js +24 -0
  159. package/dist/lib/base-command.js.map +1 -0
  160. package/dist/lib/flags.d.ts +33 -0
  161. package/dist/lib/flags.d.ts.map +1 -0
  162. package/dist/lib/flags.js +64 -0
  163. package/dist/lib/flags.js.map +1 -0
  164. package/dist/ops/add.d.ts +4 -0
  165. package/dist/ops/add.d.ts.map +1 -0
  166. package/dist/ops/add.js +85 -0
  167. package/dist/ops/add.js.map +1 -0
  168. package/dist/ops/inject.d.ts +4 -0
  169. package/dist/ops/inject.d.ts.map +1 -0
  170. package/dist/ops/inject.js +28 -0
  171. package/dist/ops/inject.js.map +1 -0
  172. package/dist/ops/injector.d.ts +4 -0
  173. package/dist/ops/injector.d.ts.map +1 -0
  174. package/dist/ops/injector.js +68 -0
  175. package/dist/ops/injector.js.map +1 -0
  176. package/dist/ops/result.d.ts +3 -0
  177. package/dist/ops/result.d.ts.map +1 -0
  178. package/dist/ops/result.js +8 -0
  179. package/dist/ops/result.js.map +1 -0
  180. package/dist/prompts/interactive-prompts.d.ts +152 -0
  181. package/dist/prompts/interactive-prompts.d.ts.map +1 -0
  182. package/dist/prompts/interactive-prompts.js +574 -0
  183. package/dist/prompts/interactive-prompts.js.map +1 -0
  184. package/dist/recipe-engine/group-executor.d.ts +97 -0
  185. package/dist/recipe-engine/group-executor.d.ts.map +1 -0
  186. package/dist/recipe-engine/group-executor.js +293 -0
  187. package/dist/recipe-engine/group-executor.js.map +1 -0
  188. package/dist/recipe-engine/index.d.ts +112 -0
  189. package/dist/recipe-engine/index.d.ts.map +1 -0
  190. package/dist/recipe-engine/index.js +223 -0
  191. package/dist/recipe-engine/index.js.map +1 -0
  192. package/dist/recipe-engine/output-evaluator.d.ts +28 -0
  193. package/dist/recipe-engine/output-evaluator.d.ts.map +1 -0
  194. package/dist/recipe-engine/output-evaluator.js +78 -0
  195. package/dist/recipe-engine/output-evaluator.js.map +1 -0
  196. package/dist/recipe-engine/recipe-engine.d.ts +227 -0
  197. package/dist/recipe-engine/recipe-engine.d.ts.map +1 -0
  198. package/dist/recipe-engine/recipe-engine.js +1036 -0
  199. package/dist/recipe-engine/recipe-engine.js.map +1 -0
  200. package/dist/recipe-engine/step-executor.d.ts +172 -0
  201. package/dist/recipe-engine/step-executor.d.ts.map +1 -0
  202. package/dist/recipe-engine/step-executor.js +802 -0
  203. package/dist/recipe-engine/step-executor.js.map +1 -0
  204. package/dist/recipe-engine/tools/action-tool.d.ts +103 -0
  205. package/dist/recipe-engine/tools/action-tool.d.ts.map +1 -0
  206. package/dist/recipe-engine/tools/action-tool.js +473 -0
  207. package/dist/recipe-engine/tools/action-tool.js.map +1 -0
  208. package/dist/recipe-engine/tools/ai-tool.d.ts +26 -0
  209. package/dist/recipe-engine/tools/ai-tool.d.ts.map +1 -0
  210. package/dist/recipe-engine/tools/ai-tool.js +233 -0
  211. package/dist/recipe-engine/tools/ai-tool.js.map +1 -0
  212. package/dist/recipe-engine/tools/base.d.ts +214 -0
  213. package/dist/recipe-engine/tools/base.d.ts.map +1 -0
  214. package/dist/recipe-engine/tools/base.js +397 -0
  215. package/dist/recipe-engine/tools/base.js.map +1 -0
  216. package/dist/recipe-engine/tools/codemod-tool.d.ts +130 -0
  217. package/dist/recipe-engine/tools/codemod-tool.d.ts.map +1 -0
  218. package/dist/recipe-engine/tools/codemod-tool.js +786 -0
  219. package/dist/recipe-engine/tools/codemod-tool.js.map +1 -0
  220. package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts +21 -0
  221. package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts.map +1 -0
  222. package/dist/recipe-engine/tools/ensure-dirs-tool.js +130 -0
  223. package/dist/recipe-engine/tools/ensure-dirs-tool.js.map +1 -0
  224. package/dist/recipe-engine/tools/index.d.ts +126 -0
  225. package/dist/recipe-engine/tools/index.d.ts.map +1 -0
  226. package/dist/recipe-engine/tools/index.js +290 -0
  227. package/dist/recipe-engine/tools/index.js.map +1 -0
  228. package/dist/recipe-engine/tools/install-tool.d.ts +20 -0
  229. package/dist/recipe-engine/tools/install-tool.d.ts.map +1 -0
  230. package/dist/recipe-engine/tools/install-tool.js +194 -0
  231. package/dist/recipe-engine/tools/install-tool.js.map +1 -0
  232. package/dist/recipe-engine/tools/parallel-tool.d.ts +21 -0
  233. package/dist/recipe-engine/tools/parallel-tool.d.ts.map +1 -0
  234. package/dist/recipe-engine/tools/parallel-tool.js +134 -0
  235. package/dist/recipe-engine/tools/parallel-tool.js.map +1 -0
  236. package/dist/recipe-engine/tools/patch-tool.d.ts +21 -0
  237. package/dist/recipe-engine/tools/patch-tool.d.ts.map +1 -0
  238. package/dist/recipe-engine/tools/patch-tool.js +248 -0
  239. package/dist/recipe-engine/tools/patch-tool.js.map +1 -0
  240. package/dist/recipe-engine/tools/prompt-tool.d.ts +25 -0
  241. package/dist/recipe-engine/tools/prompt-tool.d.ts.map +1 -0
  242. package/dist/recipe-engine/tools/prompt-tool.js +162 -0
  243. package/dist/recipe-engine/tools/prompt-tool.js.map +1 -0
  244. package/dist/recipe-engine/tools/query-tool.d.ts +21 -0
  245. package/dist/recipe-engine/tools/query-tool.d.ts.map +1 -0
  246. package/dist/recipe-engine/tools/query-tool.js +249 -0
  247. package/dist/recipe-engine/tools/query-tool.js.map +1 -0
  248. package/dist/recipe-engine/tools/recipe-tool.d.ts +103 -0
  249. package/dist/recipe-engine/tools/recipe-tool.d.ts.map +1 -0
  250. package/dist/recipe-engine/tools/recipe-tool.js +617 -0
  251. package/dist/recipe-engine/tools/recipe-tool.js.map +1 -0
  252. package/dist/recipe-engine/tools/registry.d.ts +151 -0
  253. package/dist/recipe-engine/tools/registry.d.ts.map +1 -0
  254. package/dist/recipe-engine/tools/registry.js +244 -0
  255. package/dist/recipe-engine/tools/registry.js.map +1 -0
  256. package/dist/recipe-engine/tools/sequence-tool.d.ts +22 -0
  257. package/dist/recipe-engine/tools/sequence-tool.d.ts.map +1 -0
  258. package/dist/recipe-engine/tools/sequence-tool.js +122 -0
  259. package/dist/recipe-engine/tools/sequence-tool.js.map +1 -0
  260. package/dist/recipe-engine/tools/shell-tool.d.ts +25 -0
  261. package/dist/recipe-engine/tools/shell-tool.d.ts.map +1 -0
  262. package/dist/recipe-engine/tools/shell-tool.js +149 -0
  263. package/dist/recipe-engine/tools/shell-tool.js.map +1 -0
  264. package/dist/recipe-engine/tools/template-tool.d.ts +88 -0
  265. package/dist/recipe-engine/tools/template-tool.d.ts.map +1 -0
  266. package/dist/recipe-engine/tools/template-tool.js +613 -0
  267. package/dist/recipe-engine/tools/template-tool.js.map +1 -0
  268. package/dist/recipe-engine/types.d.ts +963 -0
  269. package/dist/recipe-engine/types.d.ts.map +1 -0
  270. package/dist/recipe-engine/types.js +94 -0
  271. package/dist/recipe-engine/types.js.map +1 -0
  272. package/dist/template-engines/ai-tags.d.ts +26 -0
  273. package/dist/template-engines/ai-tags.d.ts.map +1 -0
  274. package/dist/template-engines/ai-tags.js +233 -0
  275. package/dist/template-engines/ai-tags.js.map +1 -0
  276. package/dist/template-engines/index.d.ts +8 -0
  277. package/dist/template-engines/index.d.ts.map +1 -0
  278. package/dist/template-engines/index.js +8 -0
  279. package/dist/template-engines/index.js.map +1 -0
  280. package/dist/template-engines/jig-engine.d.ts +47 -0
  281. package/dist/template-engines/jig-engine.d.ts.map +1 -0
  282. package/dist/template-engines/jig-engine.js +173 -0
  283. package/dist/template-engines/jig-engine.js.map +1 -0
  284. package/dist/utils/coerce-value.d.ts +7 -0
  285. package/dist/utils/coerce-value.d.ts.map +1 -0
  286. package/dist/utils/coerce-value.js +18 -0
  287. package/dist/utils/coerce-value.js.map +1 -0
  288. package/dist/utils/diff.d.ts +8 -0
  289. package/dist/utils/diff.d.ts.map +1 -0
  290. package/dist/utils/diff.js +10 -0
  291. package/dist/utils/diff.js.map +1 -0
  292. package/dist/utils/global-packages.d.ts +11 -0
  293. package/dist/utils/global-packages.d.ts.map +1 -0
  294. package/dist/utils/global-packages.js +88 -0
  295. package/dist/utils/global-packages.js.map +1 -0
  296. package/dist/utils/pager.d.ts +6 -0
  297. package/dist/utils/pager.d.ts.map +1 -0
  298. package/dist/utils/pager.js +41 -0
  299. package/dist/utils/pager.js.map +1 -0
  300. package/help/cookbook/info.md +35 -0
  301. package/help/cookbook/list.md +37 -0
  302. package/help/gen.md +26 -0
  303. package/help/recipe/run.md +52 -0
  304. package/help/recipe/validate.md +51 -0
  305. package/oclif.manifest.json +580 -0
  306. package/package.json +120 -0
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Base Tool Framework
3
+ *
4
+ * Abstract base class and interfaces for all Recipe Step System tools.
5
+ * Provides common lifecycle management, error handling, and resource management.
6
+ */
7
+ import { ErrorCode, ErrorHandler, HypergenError, withErrorHandling } from "@hypercli/core";
8
+ import { Logger } from "@hypercli/core";
9
+ import createDebug from "debug";
10
+ /**
11
+ * Abstract base class for all Recipe Step System tools
12
+ *
13
+ * This class provides common functionality for Template, Action, CodeMod, and Recipe tools.
14
+ * Each tool type extends this class to implement specific execution logic.
15
+ */
16
+ export class Tool {
17
+ toolType;
18
+ name;
19
+ options;
20
+ logger;
21
+ debug;
22
+ resources = new Map();
23
+ metrics;
24
+ _isInitialized = false;
25
+ _isExecuting = false;
26
+ _isCleanedUp = false;
27
+ constructor(toolType, name, options = {}) {
28
+ this.toolType = toolType;
29
+ this.name = name;
30
+ this.options = options;
31
+ this.logger = new Logger(console.log);
32
+ this.debug = createDebug(`hyper:recipe:tool:${toolType}:${name}`);
33
+ this.metrics = {
34
+ startTime: new Date(),
35
+ retryAttempts: 0,
36
+ cleanupCompleted: false,
37
+ events: [],
38
+ };
39
+ this.debug("Tool instance created: %s (%s)", name, toolType);
40
+ }
41
+ /**
42
+ * Get tool type
43
+ */
44
+ getToolType() {
45
+ return this.toolType;
46
+ }
47
+ /**
48
+ * Get tool name
49
+ */
50
+ getName() {
51
+ return this.name;
52
+ }
53
+ /**
54
+ * Check if tool is initialized
55
+ */
56
+ isInitialized() {
57
+ return this._isInitialized;
58
+ }
59
+ /**
60
+ * Check if tool is currently executing
61
+ */
62
+ isExecuting() {
63
+ return this._isExecuting;
64
+ }
65
+ /**
66
+ * Check if tool has been cleaned up
67
+ */
68
+ isCleanedUp() {
69
+ return this._isCleanedUp;
70
+ }
71
+ /**
72
+ * Get tool lifecycle metrics
73
+ */
74
+ getMetrics() {
75
+ return { ...this.metrics };
76
+ }
77
+ /**
78
+ * Initialize the tool with configuration
79
+ * Called once before any execution
80
+ */
81
+ async initialize() {
82
+ if (this._isInitialized) {
83
+ this.debug("Tool already initialized, skipping");
84
+ return;
85
+ }
86
+ this.debug("Initializing tool");
87
+ try {
88
+ await withErrorHandling(async () => {
89
+ await this.onInitialize();
90
+ this._isInitialized = true;
91
+ this.addLifecycleEvent("validate", true, { phase: "initialize" });
92
+ this.debug("Tool initialization completed");
93
+ }, { function: "initialize", action: this.name });
94
+ }
95
+ catch (error) {
96
+ this.addLifecycleEvent("validate", false, {
97
+ phase: "initialize",
98
+ error: error instanceof Error ? error.message : String(error),
99
+ });
100
+ throw this.wrapError(error, "Tool initialization failed");
101
+ }
102
+ }
103
+ /**
104
+ * Validate the step configuration and context
105
+ */
106
+ async validate(step, context) {
107
+ this.debug("Validating step configuration");
108
+ const startTime = Date.now();
109
+ try {
110
+ const result = await withErrorHandling(async () => {
111
+ return await this.onValidate(step, context);
112
+ }, { function: "validate", action: this.name });
113
+ const duration = Date.now() - startTime;
114
+ this.metrics.validationDuration = duration;
115
+ this.addLifecycleEvent("validate", result.isValid, {
116
+ duration,
117
+ errorsCount: result.errors.length,
118
+ warningsCount: result.warnings.length,
119
+ });
120
+ this.debug("Validation completed: %s (errors: %d, warnings: %d)", result.isValid ? "valid" : "invalid", result.errors.length, result.warnings.length);
121
+ return result;
122
+ }
123
+ catch (error) {
124
+ const duration = Date.now() - startTime;
125
+ this.metrics.validationDuration = duration;
126
+ this.addLifecycleEvent("validate", false, {
127
+ duration,
128
+ error: error instanceof Error ? error.message : String(error),
129
+ });
130
+ throw this.wrapError(error, "Tool validation failed");
131
+ }
132
+ }
133
+ /**
134
+ * Execute the tool with the given step configuration and context
135
+ */
136
+ async execute(step, context, options) {
137
+ if (!this._isInitialized) {
138
+ await this.initialize();
139
+ }
140
+ if (this._isExecuting) {
141
+ throw ErrorHandler.createError(ErrorCode.INTERNAL_ERROR, "Tool is already executing", {
142
+ action: this.name,
143
+ phase: "execute",
144
+ });
145
+ }
146
+ this._isExecuting = true;
147
+ const startTime = Date.now();
148
+ this.debug("Starting tool execution");
149
+ try {
150
+ // Update metrics
151
+ this.metrics.startTime = new Date();
152
+ // Apply retry logic if specified
153
+ const maxRetries = options?.retries || step.retries || 0;
154
+ let lastError = null;
155
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
156
+ if (attempt > 0) {
157
+ this.debug("Retry attempt %d/%d", attempt, maxRetries);
158
+ this.metrics.retryAttempts = attempt;
159
+ // Add exponential backoff delay
160
+ const delay = Math.min(1000 * 2 ** (attempt - 1), 30000);
161
+ await new Promise((resolve) => setTimeout(resolve, delay));
162
+ }
163
+ try {
164
+ const result = await withErrorHandling(async () => {
165
+ return await this.onExecute(step, context, options);
166
+ }, { function: "execute", action: this.name, phase: "execute" });
167
+ const executionTime = Date.now() - startTime;
168
+ this.metrics.executionDuration = executionTime;
169
+ this.metrics.endTime = new Date();
170
+ this.metrics.duration = executionTime;
171
+ this.addLifecycleEvent("execute", result.status === "completed", {
172
+ duration: executionTime,
173
+ attempt,
174
+ filesCreated: result.filesCreated?.length || 0,
175
+ filesModified: result.filesModified?.length || 0,
176
+ filesDeleted: result.filesDeleted?.length || 0,
177
+ });
178
+ this.debug("Tool execution completed: %s (duration: %dms, attempt: %d)", result.status, executionTime, attempt + 1);
179
+ this._isExecuting = false;
180
+ return result;
181
+ }
182
+ catch (error) {
183
+ lastError = error;
184
+ this.debug("Tool execution failed on attempt %d: %s", attempt + 1, error instanceof Error ? error.message : String(error));
185
+ // If it's the last attempt, don't continue the retry loop
186
+ if (attempt === maxRetries) {
187
+ break;
188
+ }
189
+ // For certain errors, don't retry
190
+ if (error instanceof HypergenError && !this.shouldRetry(error)) {
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ // If we reach here, all attempts failed
196
+ const executionTime = Date.now() - startTime;
197
+ this.metrics.executionDuration = executionTime;
198
+ this.metrics.endTime = new Date();
199
+ this.metrics.duration = executionTime;
200
+ this.addLifecycleEvent("execute", false, {
201
+ duration: executionTime,
202
+ retryAttempts: this.metrics.retryAttempts,
203
+ error: lastError instanceof Error ? lastError.message : String(lastError),
204
+ });
205
+ throw this.wrapError(lastError, `Tool execution failed after ${maxRetries + 1} attempts`);
206
+ }
207
+ finally {
208
+ this._isExecuting = false;
209
+ }
210
+ }
211
+ /**
212
+ * Clean up resources used by the tool
213
+ */
214
+ async cleanup() {
215
+ if (this._isCleanedUp) {
216
+ this.debug("Tool already cleaned up, skipping");
217
+ return;
218
+ }
219
+ this.debug("Starting tool cleanup");
220
+ const startTime = Date.now();
221
+ const errors = [];
222
+ try {
223
+ // Clean up registered resources
224
+ for (const [id, resource] of this.resources) {
225
+ try {
226
+ this.debug("Cleaning up resource: %s (%s)", id, resource.type);
227
+ await resource.cleanup();
228
+ }
229
+ catch (error) {
230
+ const errorMessage = error instanceof Error ? error.message : String(error);
231
+ errors.push(`Failed to cleanup resource '${id}': ${errorMessage}`);
232
+ this.debug("Resource cleanup failed: %s - %s", id, errorMessage);
233
+ }
234
+ }
235
+ // Call tool-specific cleanup
236
+ try {
237
+ await this.onCleanup();
238
+ }
239
+ catch (error) {
240
+ const errorMessage = error instanceof Error ? error.message : String(error);
241
+ errors.push(`Tool cleanup failed: ${errorMessage}`);
242
+ this.debug("Tool cleanup failed: %s", errorMessage);
243
+ }
244
+ const duration = Date.now() - startTime;
245
+ this.metrics.cleanupDuration = duration;
246
+ this.metrics.cleanupCompleted = errors.length === 0;
247
+ this._isCleanedUp = true;
248
+ this.addLifecycleEvent("cleanup", errors.length === 0, {
249
+ duration,
250
+ resourcesCleanedUp: this.resources.size,
251
+ errorsCount: errors.length,
252
+ });
253
+ if (errors.length > 0) {
254
+ this.logger.warn(`Tool cleanup completed with ${errors.length} errors`);
255
+ for (const error of errors) {
256
+ this.logger.warn(` ${error}`);
257
+ }
258
+ }
259
+ else {
260
+ this.debug("Tool cleanup completed successfully");
261
+ }
262
+ // Clear resources map
263
+ this.resources.clear();
264
+ }
265
+ catch (error) {
266
+ const duration = Date.now() - startTime;
267
+ this.metrics.cleanupDuration = duration;
268
+ this.addLifecycleEvent("cleanup", false, {
269
+ duration,
270
+ error: error instanceof Error ? error.message : String(error),
271
+ });
272
+ throw this.wrapError(error, "Tool cleanup failed");
273
+ }
274
+ }
275
+ /**
276
+ * Register a resource for cleanup
277
+ */
278
+ registerResource(resource) {
279
+ if (this.resources.has(resource.id)) {
280
+ this.debug("Resource already registered, replacing: %s", resource.id);
281
+ }
282
+ this.resources.set(resource.id, resource);
283
+ this.debug("Resource registered: %s (%s)", resource.id, resource.type);
284
+ }
285
+ /**
286
+ * Unregister a resource (useful for early cleanup)
287
+ */
288
+ unregisterResource(resourceId) {
289
+ const resource = this.resources.get(resourceId);
290
+ if (resource) {
291
+ this.resources.delete(resourceId);
292
+ this.debug("Resource unregistered: %s", resourceId);
293
+ }
294
+ }
295
+ /**
296
+ * Get memory usage statistics
297
+ */
298
+ getMemoryUsage() {
299
+ const usage = process.memoryUsage();
300
+ return {
301
+ used: usage.heapUsed,
302
+ total: usage.heapTotal,
303
+ };
304
+ }
305
+ /**
306
+ * Add a lifecycle event to metrics
307
+ */
308
+ addLifecycleEvent(phase, success, metadata) {
309
+ this.metrics.events.push({
310
+ phase,
311
+ timestamp: new Date(),
312
+ success,
313
+ error: metadata?.error,
314
+ metadata,
315
+ });
316
+ // Track peak memory usage
317
+ const memUsage = this.getMemoryUsage();
318
+ if (!this.metrics.peakMemoryUsage || memUsage.used > this.metrics.peakMemoryUsage) {
319
+ this.metrics.peakMemoryUsage = memUsage.used;
320
+ }
321
+ }
322
+ /**
323
+ * Determine if an error should trigger a retry
324
+ */
325
+ shouldRetry(error) {
326
+ // Don't retry configuration or validation errors
327
+ const nonRetryableCodes = [
328
+ ErrorCode.CONFIG_INVALID_FORMAT,
329
+ ErrorCode.CONFIG_MISSING_REQUIRED,
330
+ ErrorCode.TEMPLATE_INVALID_SYNTAX,
331
+ ErrorCode.TEMPLATE_INVALID_FRONTMATTER,
332
+ ErrorCode.ACTION_INVALID_PARAMETERS,
333
+ ErrorCode.ACTION_INVALID_PARAM_TYPE,
334
+ ErrorCode.ACTION_INVALID_PARAM_VALUE,
335
+ ErrorCode.VALIDATION_ERROR,
336
+ ];
337
+ return !nonRetryableCodes.includes(error.code);
338
+ }
339
+ /**
340
+ * Wrap an error with tool context
341
+ */
342
+ wrapError(error, message) {
343
+ if (error instanceof HypergenError) {
344
+ // Add tool context to existing error
345
+ error.context = {
346
+ ...error.context,
347
+ toolType: this.toolType,
348
+ toolName: this.name,
349
+ phase: "execute",
350
+ };
351
+ return error;
352
+ }
353
+ return ErrorHandler.createError(ErrorCode.INTERNAL_ERROR, `${message}: ${error instanceof Error ? error.message : String(error)}`, {
354
+ toolType: this.toolType,
355
+ toolName: this.name,
356
+ phase: "execute",
357
+ cause: error,
358
+ });
359
+ }
360
+ // Abstract methods that must be implemented by concrete tool classes
361
+ /**
362
+ * Tool-specific initialization logic
363
+ * Override this method to perform any setup required before execution
364
+ */
365
+ async onInitialize() {
366
+ // Default implementation does nothing
367
+ }
368
+ /**
369
+ * Tool-specific cleanup logic
370
+ * Override this method to perform any cleanup required after execution
371
+ */
372
+ async onCleanup() {
373
+ // Default implementation does nothing
374
+ }
375
+ }
376
+ /**
377
+ * Abstract base class for tool factories
378
+ */
379
+ export class BaseToolFactory {
380
+ toolType;
381
+ constructor(toolType) {
382
+ this.toolType = toolType;
383
+ }
384
+ getToolType() {
385
+ return this.toolType;
386
+ }
387
+ validateConfig(config) {
388
+ // Default validation - can be overridden by concrete factories
389
+ return {
390
+ isValid: true,
391
+ errors: [],
392
+ warnings: [],
393
+ suggestions: [],
394
+ };
395
+ }
396
+ }
397
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/recipe-engine/tools/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * CodeMod Tool Implementation for Recipe Step System
3
+ *
4
+ * This tool provides AST-based code transformations and modifications using
5
+ * the TypeScript compiler API for TypeScript/JavaScript files, with fallback
6
+ * support for text-based transformations for other file types.
7
+ */
8
+ import * as ts from "typescript";
9
+ import { type CodeModStep, type StepContext, type StepExecutionOptions, type StepResult } from "#recipe-engine/types";
10
+ import { Tool, type ToolValidationResult } from "./base.js";
11
+ /**
12
+ * Supported CodeMod transformation types
13
+ */
14
+ export type CodeModType = "add-import" | "add-export" | "modify-function" | "add-property" | "replace-text" | "custom";
15
+ /**
16
+ * CodeMod transformation parameters
17
+ */
18
+ export interface CodeModParameters {
19
+ import?: string;
20
+ from?: string;
21
+ importType?: "default" | "named" | "namespace" | "side-effect";
22
+ alias?: string;
23
+ export?: string;
24
+ exportType?: "default" | "named";
25
+ functionName?: string;
26
+ newSignature?: string;
27
+ newBody?: string;
28
+ className?: string;
29
+ objectName?: string;
30
+ propertyName?: string;
31
+ propertyValue?: string;
32
+ propertyType?: string;
33
+ find?: string | RegExp;
34
+ replace?: string;
35
+ global?: boolean;
36
+ transformFunction?: string | ((sourceFile: ts.SourceFile, context: CodeModContext) => ts.SourceFile);
37
+ }
38
+ /**
39
+ * CodeMod execution context
40
+ */
41
+ export interface CodeModContext {
42
+ /** File path being transformed */
43
+ filePath: string;
44
+ /** Original source code */
45
+ sourceCode: string;
46
+ /** TypeScript source file (if applicable) */
47
+ sourceFile?: ts.SourceFile;
48
+ /** TypeScript program (if applicable) */
49
+ program?: ts.Program;
50
+ /** Step context */
51
+ stepContext: StepContext;
52
+ /** CodeMod parameters */
53
+ parameters: CodeModParameters;
54
+ /** Whether this is a dry run */
55
+ dryRun: boolean;
56
+ /** Whether to force overwrite */
57
+ force: boolean;
58
+ }
59
+ /**
60
+ * CodeMod Tool for AST transformations and code modifications
61
+ *
62
+ * Features:
63
+ * - TypeScript/JavaScript AST transformations using TypeScript compiler API
64
+ * - Text-based transformations for other file types
65
+ * - Built-in common transformations (add imports, exports, properties, etc.)
66
+ * - Custom transformation functions
67
+ * - Safe modification with backup and rollback
68
+ * - Batch processing with glob patterns
69
+ * - Comprehensive error handling and validation
70
+ */
71
+ export declare class CodeModTool extends Tool<CodeModStep> {
72
+ private tsConfigCache;
73
+ private transformationCache;
74
+ private backupFiles;
75
+ constructor(name?: string, options?: Record<string, any>);
76
+ /**
77
+ * Initialize CodeMod tool
78
+ */
79
+ protected onInitialize(): Promise<void>;
80
+ /**
81
+ * Validate CodeMod step configuration
82
+ */
83
+ protected onValidate(step: CodeModStep, context: StepContext): Promise<ToolValidationResult>;
84
+ /**
85
+ * Execute the CodeMod tool
86
+ */
87
+ protected onExecute(step: CodeModStep, context: StepContext, options?: StepExecutionOptions): Promise<StepResult>;
88
+ /**
89
+ * Tool-specific cleanup logic
90
+ */
91
+ protected onCleanup(): Promise<void>;
92
+ /**
93
+ * Resolve file patterns to actual file paths
94
+ */
95
+ private resolveFiles;
96
+ /**
97
+ * Glob files with proper error handling
98
+ */
99
+ private globFiles;
100
+ /**
101
+ * Transform a single file
102
+ */
103
+ private transformFile;
104
+ /**
105
+ * Apply AST-based transformation for TypeScript/JavaScript files
106
+ */
107
+ private applyASTTransformation;
108
+ /**
109
+ * Apply text-based transformation for non-TypeScript files
110
+ */
111
+ private applyTextTransformation;
112
+ /**
113
+ * Determine parser to use for file
114
+ */
115
+ private determineParser;
116
+ /**
117
+ * Create backup of file before transformation
118
+ */
119
+ private createBackup;
120
+ }
121
+ /**
122
+ * CodeMod Tool Factory
123
+ */
124
+ export declare class CodeModToolFactory {
125
+ create(name?: string, options?: Record<string, any>): CodeModTool;
126
+ getToolType(): "codemod";
127
+ validateConfig(config: Record<string, any>): ToolValidationResult;
128
+ }
129
+ export declare const codemodToolFactory: CodeModToolFactory;
130
+ //# sourceMappingURL=codemod-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemod-tool.d.ts","sourceRoot":"","sources":["../../../src/recipe-engine/tools/codemod-tool.ts"],"names":[],"mappings":"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"}