memma 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 (304) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +21 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/generate/generateActionHandler.d.ts +3 -0
  8. package/dist/commands/generate/generateActionHandler.d.ts.map +1 -0
  9. package/dist/commands/generate/generateActionHandler.js +63 -0
  10. package/dist/commands/generate/generateActionHandler.js.map +1 -0
  11. package/dist/commands/generate/generateCommand.d.ts +3 -0
  12. package/dist/commands/generate/generateCommand.d.ts.map +1 -0
  13. package/dist/commands/generate/generateCommand.js +10 -0
  14. package/dist/commands/generate/generateCommand.js.map +1 -0
  15. package/dist/commands/generate/helpers/detectFileType.d.ts +2 -0
  16. package/dist/commands/generate/helpers/detectFileType.d.ts.map +1 -0
  17. package/dist/commands/generate/helpers/detectFileType.js +7 -0
  18. package/dist/commands/generate/helpers/detectFileType.js.map +1 -0
  19. package/dist/commands/generate/helpers/displayGenerateSuccessMessage.d.ts +7 -0
  20. package/dist/commands/generate/helpers/displayGenerateSuccessMessage.d.ts.map +1 -0
  21. package/dist/commands/generate/helpers/displayGenerateSuccessMessage.js +5 -0
  22. package/dist/commands/generate/helpers/displayGenerateSuccessMessage.js.map +1 -0
  23. package/dist/commands/generate/helpers/resolveOutputDirectory.d.ts +2 -0
  24. package/dist/commands/generate/helpers/resolveOutputDirectory.d.ts.map +1 -0
  25. package/dist/commands/generate/helpers/resolveOutputDirectory.js +29 -0
  26. package/dist/commands/generate/helpers/resolveOutputDirectory.js.map +1 -0
  27. package/dist/commands/generate/helpers/resolveSourceArgument.d.ts +8 -0
  28. package/dist/commands/generate/helpers/resolveSourceArgument.d.ts.map +1 -0
  29. package/dist/commands/generate/helpers/resolveSourceArgument.js +67 -0
  30. package/dist/commands/generate/helpers/resolveSourceArgument.js.map +1 -0
  31. package/dist/commands/generate/index.d.ts +2 -0
  32. package/dist/commands/generate/index.d.ts.map +1 -0
  33. package/dist/commands/generate/index.js +2 -0
  34. package/dist/commands/generate/index.js.map +1 -0
  35. package/dist/commands/generate/stream/llmResponseHandler.d.ts +9 -0
  36. package/dist/commands/generate/stream/llmResponseHandler.d.ts.map +1 -0
  37. package/dist/commands/generate/stream/llmResponseHandler.js +33 -0
  38. package/dist/commands/generate/stream/llmResponseHandler.js.map +1 -0
  39. package/dist/commands/generate/stream/sseHandler.d.ts +5 -0
  40. package/dist/commands/generate/stream/sseHandler.d.ts.map +1 -0
  41. package/dist/commands/generate/stream/sseHandler.js +28 -0
  42. package/dist/commands/generate/stream/sseHandler.js.map +1 -0
  43. package/dist/commands/generate/stream/statusHandler.d.ts +10 -0
  44. package/dist/commands/generate/stream/statusHandler.d.ts.map +1 -0
  45. package/dist/commands/generate/stream/statusHandler.js +38 -0
  46. package/dist/commands/generate/stream/statusHandler.js.map +1 -0
  47. package/dist/commands/generate/stream/streamGenerateResponse.d.ts +3 -0
  48. package/dist/commands/generate/stream/streamGenerateResponse.d.ts.map +1 -0
  49. package/dist/commands/generate/stream/streamGenerateResponse.js +19 -0
  50. package/dist/commands/generate/stream/streamGenerateResponse.js.map +1 -0
  51. package/dist/commands/generate/write/saveLLMResponse.d.ts +8 -0
  52. package/dist/commands/generate/write/saveLLMResponse.d.ts.map +1 -0
  53. package/dist/commands/generate/write/saveLLMResponse.js +18 -0
  54. package/dist/commands/generate/write/saveLLMResponse.js.map +1 -0
  55. package/dist/commands/generate/write/writeResponseToDir.d.ts +2 -0
  56. package/dist/commands/generate/write/writeResponseToDir.d.ts.map +1 -0
  57. package/dist/commands/generate/write/writeResponseToDir.js +18 -0
  58. package/dist/commands/generate/write/writeResponseToDir.js.map +1 -0
  59. package/dist/commands/generate/write/writeResponseToNewProject.ts.d.ts +3 -0
  60. package/dist/commands/generate/write/writeResponseToNewProject.ts.d.ts.map +1 -0
  61. package/dist/commands/generate/write/writeResponseToNewProject.ts.js +27 -0
  62. package/dist/commands/generate/write/writeResponseToNewProject.ts.js.map +1 -0
  63. package/dist/commands/init/index.d.ts +2 -0
  64. package/dist/commands/init/index.d.ts.map +1 -0
  65. package/dist/commands/init/index.js +2 -0
  66. package/dist/commands/init/index.js.map +1 -0
  67. package/dist/commands/init/initActionHandler.d.ts +2 -0
  68. package/dist/commands/init/initActionHandler.d.ts.map +1 -0
  69. package/dist/commands/init/initActionHandler.js +50 -0
  70. package/dist/commands/init/initActionHandler.js.map +1 -0
  71. package/dist/commands/init/initCommand.d.ts +3 -0
  72. package/dist/commands/init/initCommand.d.ts.map +1 -0
  73. package/dist/commands/init/initCommand.js +6 -0
  74. package/dist/commands/init/initCommand.js.map +1 -0
  75. package/dist/commands/init/memma-config/ensureMemmaConfigurations.d.ts +3 -0
  76. package/dist/commands/init/memma-config/ensureMemmaConfigurations.d.ts.map +1 -0
  77. package/dist/commands/init/memma-config/ensureMemmaConfigurations.js +8 -0
  78. package/dist/commands/init/memma-config/ensureMemmaConfigurations.js.map +1 -0
  79. package/dist/commands/init/memma-config/gatherConfigurationDetails.d.ts +3 -0
  80. package/dist/commands/init/memma-config/gatherConfigurationDetails.d.ts.map +1 -0
  81. package/dist/commands/init/memma-config/gatherConfigurationDetails.js +15 -0
  82. package/dist/commands/init/memma-config/gatherConfigurationDetails.js.map +1 -0
  83. package/dist/commands/init/memma-env/createPythonVirtualEnv.d.ts +2 -0
  84. package/dist/commands/init/memma-env/createPythonVirtualEnv.d.ts.map +1 -0
  85. package/dist/commands/init/memma-env/createPythonVirtualEnv.js +5 -0
  86. package/dist/commands/init/memma-env/createPythonVirtualEnv.js.map +1 -0
  87. package/dist/commands/init/memma-env/ensureMemmaEnvironment.d.ts +3 -0
  88. package/dist/commands/init/memma-env/ensureMemmaEnvironment.d.ts.map +1 -0
  89. package/dist/commands/init/memma-env/ensureMemmaEnvironment.js +21 -0
  90. package/dist/commands/init/memma-env/ensureMemmaEnvironment.js.map +1 -0
  91. package/dist/commands/init/memma-env/getVenvPath.d.ts +2 -0
  92. package/dist/commands/init/memma-env/getVenvPath.d.ts.map +1 -0
  93. package/dist/commands/init/memma-env/getVenvPath.js +9 -0
  94. package/dist/commands/init/memma-env/getVenvPath.js.map +1 -0
  95. package/dist/commands/init/memma-env/index.d.ts +2 -0
  96. package/dist/commands/init/memma-env/index.d.ts.map +1 -0
  97. package/dist/commands/init/memma-env/index.js +2 -0
  98. package/dist/commands/init/memma-env/index.js.map +1 -0
  99. package/dist/commands/init/memma-env/venvExists.d.ts +2 -0
  100. package/dist/commands/init/memma-env/venvExists.d.ts.map +1 -0
  101. package/dist/commands/init/memma-env/venvExists.js +7 -0
  102. package/dist/commands/init/memma-env/venvExists.js.map +1 -0
  103. package/dist/commands/init/messages/displayExitMessages.d.ts +2 -0
  104. package/dist/commands/init/messages/displayExitMessages.d.ts.map +1 -0
  105. package/dist/commands/init/messages/displayExitMessages.js +9 -0
  106. package/dist/commands/init/messages/displayExitMessages.js.map +1 -0
  107. package/dist/commands/init/messages/displayWelcomeMessages.d.ts +2 -0
  108. package/dist/commands/init/messages/displayWelcomeMessages.d.ts.map +1 -0
  109. package/dist/commands/init/messages/displayWelcomeMessages.js +12 -0
  110. package/dist/commands/init/messages/displayWelcomeMessages.js.map +1 -0
  111. package/dist/commands/init/packages/ensureRequirementsFile.d.ts +5 -0
  112. package/dist/commands/init/packages/ensureRequirementsFile.d.ts.map +1 -0
  113. package/dist/commands/init/packages/ensureRequirementsFile.js +11 -0
  114. package/dist/commands/init/packages/ensureRequirementsFile.js.map +1 -0
  115. package/dist/commands/init/packages/index.d.ts +2 -0
  116. package/dist/commands/init/packages/index.d.ts.map +1 -0
  117. package/dist/commands/init/packages/index.js +2 -0
  118. package/dist/commands/init/packages/index.js.map +1 -0
  119. package/dist/commands/init/packages/installPlaywrightBrowserBinaries.d.ts +2 -0
  120. package/dist/commands/init/packages/installPlaywrightBrowserBinaries.d.ts.map +1 -0
  121. package/dist/commands/init/packages/installPlaywrightBrowserBinaries.js +8 -0
  122. package/dist/commands/init/packages/installPlaywrightBrowserBinaries.js.map +1 -0
  123. package/dist/commands/init/packages/installRequiredMemmaPackages.d.ts +2 -0
  124. package/dist/commands/init/packages/installRequiredMemmaPackages.d.ts.map +1 -0
  125. package/dist/commands/init/packages/installRequiredMemmaPackages.js +12 -0
  126. package/dist/commands/init/packages/installRequiredMemmaPackages.js.map +1 -0
  127. package/dist/commands/init/packages/installRequiredPackages.d.ts +2 -0
  128. package/dist/commands/init/packages/installRequiredPackages.d.ts.map +1 -0
  129. package/dist/commands/init/packages/installRequiredPackages.js +5 -0
  130. package/dist/commands/init/packages/installRequiredPackages.js.map +1 -0
  131. package/dist/commands/init/python-env/checkPipInstalled.d.ts +5 -0
  132. package/dist/commands/init/python-env/checkPipInstalled.d.ts.map +1 -0
  133. package/dist/commands/init/python-env/checkPipInstalled.js +17 -0
  134. package/dist/commands/init/python-env/checkPipInstalled.js.map +1 -0
  135. package/dist/commands/init/python-env/detectPython.d.ts +3 -0
  136. package/dist/commands/init/python-env/detectPython.d.ts.map +1 -0
  137. package/dist/commands/init/python-env/detectPython.js +26 -0
  138. package/dist/commands/init/python-env/detectPython.js.map +1 -0
  139. package/dist/commands/init/python-env/detectPythonVersion.d.ts +2 -0
  140. package/dist/commands/init/python-env/detectPythonVersion.d.ts.map +1 -0
  141. package/dist/commands/init/python-env/detectPythonVersion.js +8 -0
  142. package/dist/commands/init/python-env/detectPythonVersion.js.map +1 -0
  143. package/dist/commands/init/python-env/index.d.ts +2 -0
  144. package/dist/commands/init/python-env/index.d.ts.map +1 -0
  145. package/dist/commands/init/python-env/index.js +2 -0
  146. package/dist/commands/init/python-env/index.js.map +1 -0
  147. package/dist/commands/init/python-env/validatePythonEnvironment.d.ts +3 -0
  148. package/dist/commands/init/python-env/validatePythonEnvironment.d.ts.map +1 -0
  149. package/dist/commands/init/python-env/validatePythonEnvironment.js +11 -0
  150. package/dist/commands/init/python-env/validatePythonEnvironment.js.map +1 -0
  151. package/dist/commands/init/scripts/copyMemmaPythonFiles.d.ts +6 -0
  152. package/dist/commands/init/scripts/copyMemmaPythonFiles.d.ts.map +1 -0
  153. package/dist/commands/init/scripts/copyMemmaPythonFiles.js +31 -0
  154. package/dist/commands/init/scripts/copyMemmaPythonFiles.js.map +1 -0
  155. package/dist/commands/reset/deleteMemmaDirectory.d.ts +2 -0
  156. package/dist/commands/reset/deleteMemmaDirectory.d.ts.map +1 -0
  157. package/dist/commands/reset/deleteMemmaDirectory.js +12 -0
  158. package/dist/commands/reset/deleteMemmaDirectory.js.map +1 -0
  159. package/dist/commands/reset/resetActionHandler.d.ts +2 -0
  160. package/dist/commands/reset/resetActionHandler.d.ts.map +1 -0
  161. package/dist/commands/reset/resetActionHandler.js +39 -0
  162. package/dist/commands/reset/resetActionHandler.js.map +1 -0
  163. package/dist/commands/reset/resetCommand.d.ts +3 -0
  164. package/dist/commands/reset/resetCommand.d.ts.map +1 -0
  165. package/dist/commands/reset/resetCommand.js +6 -0
  166. package/dist/commands/reset/resetCommand.js.map +1 -0
  167. package/dist/commands/start/getOrchestratorEnvVariables.d.ts +7 -0
  168. package/dist/commands/start/getOrchestratorEnvVariables.d.ts.map +1 -0
  169. package/dist/commands/start/getOrchestratorEnvVariables.js +12 -0
  170. package/dist/commands/start/getOrchestratorEnvVariables.js.map +1 -0
  171. package/dist/commands/start/index.d.ts +2 -0
  172. package/dist/commands/start/index.d.ts.map +1 -0
  173. package/dist/commands/start/index.js +2 -0
  174. package/dist/commands/start/index.js.map +1 -0
  175. package/dist/commands/start/startActionHandler.d.ts +2 -0
  176. package/dist/commands/start/startActionHandler.d.ts.map +1 -0
  177. package/dist/commands/start/startActionHandler.js +23 -0
  178. package/dist/commands/start/startActionHandler.js.map +1 -0
  179. package/dist/commands/start/startCommand.d.ts +3 -0
  180. package/dist/commands/start/startCommand.d.ts.map +1 -0
  181. package/dist/commands/start/startCommand.js +6 -0
  182. package/dist/commands/start/startCommand.js.map +1 -0
  183. package/dist/commands/start/startMemmaOrchestrator.d.ts +2 -0
  184. package/dist/commands/start/startMemmaOrchestrator.d.ts.map +1 -0
  185. package/dist/commands/start/startMemmaOrchestrator.js +31 -0
  186. package/dist/commands/start/startMemmaOrchestrator.js.map +1 -0
  187. package/dist/commands/start/waitForLocalServerReady.d.ts +2 -0
  188. package/dist/commands/start/waitForLocalServerReady.d.ts.map +1 -0
  189. package/dist/commands/start/waitForLocalServerReady.js +18 -0
  190. package/dist/commands/start/waitForLocalServerReady.js.map +1 -0
  191. package/dist/commands/stop/index.d.ts +2 -0
  192. package/dist/commands/stop/index.d.ts.map +1 -0
  193. package/dist/commands/stop/index.js +2 -0
  194. package/dist/commands/stop/index.js.map +1 -0
  195. package/dist/commands/stop/stopActionHandler.d.ts +2 -0
  196. package/dist/commands/stop/stopActionHandler.d.ts.map +1 -0
  197. package/dist/commands/stop/stopActionHandler.js +22 -0
  198. package/dist/commands/stop/stopActionHandler.js.map +1 -0
  199. package/dist/commands/stop/stopCommand.d.ts +3 -0
  200. package/dist/commands/stop/stopCommand.d.ts.map +1 -0
  201. package/dist/commands/stop/stopCommand.js +6 -0
  202. package/dist/commands/stop/stopCommand.js.map +1 -0
  203. package/dist/commands/stop/stopMemmaOrchestrator.d.ts +2 -0
  204. package/dist/commands/stop/stopMemmaOrchestrator.d.ts.map +1 -0
  205. package/dist/commands/stop/stopMemmaOrchestrator.js +15 -0
  206. package/dist/commands/stop/stopMemmaOrchestrator.js.map +1 -0
  207. package/dist/commands/stop/stopProcess.d.ts +2 -0
  208. package/dist/commands/stop/stopProcess.d.ts.map +1 -0
  209. package/dist/commands/stop/stopProcess.js +21 -0
  210. package/dist/commands/stop/stopProcess.js.map +1 -0
  211. package/dist/constants.d.ts +61 -0
  212. package/dist/constants.d.ts.map +1 -0
  213. package/dist/constants.js +69 -0
  214. package/dist/constants.js.map +1 -0
  215. package/dist/types.d.ts +57 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +2 -0
  218. package/dist/types.js.map +1 -0
  219. package/dist/utils/MemmaError.d.ts +4 -0
  220. package/dist/utils/MemmaError.d.ts.map +1 -0
  221. package/dist/utils/MemmaError.js +6 -0
  222. package/dist/utils/MemmaError.js.map +1 -0
  223. package/dist/utils/config/getMemmaConfig.d.ts +3 -0
  224. package/dist/utils/config/getMemmaConfig.d.ts.map +1 -0
  225. package/dist/utils/config/getMemmaConfig.js +12 -0
  226. package/dist/utils/config/getMemmaConfig.js.map +1 -0
  227. package/dist/utils/config/saveMemmaConfig.d.ts +3 -0
  228. package/dist/utils/config/saveMemmaConfig.d.ts.map +1 -0
  229. package/dist/utils/config/saveMemmaConfig.js +7 -0
  230. package/dist/utils/config/saveMemmaConfig.js.map +1 -0
  231. package/dist/utils/consoleMessages.d.ts +2 -0
  232. package/dist/utils/consoleMessages.d.ts.map +1 -0
  233. package/dist/utils/consoleMessages.js +2 -0
  234. package/dist/utils/consoleMessages.js.map +1 -0
  235. package/dist/utils/getMemmaScriptPath.d.ts +2 -0
  236. package/dist/utils/getMemmaScriptPath.d.ts.map +1 -0
  237. package/dist/utils/getMemmaScriptPath.js +6 -0
  238. package/dist/utils/getMemmaScriptPath.js.map +1 -0
  239. package/dist/utils/getPidOnPort.d.ts +2 -0
  240. package/dist/utils/getPidOnPort.d.ts.map +1 -0
  241. package/dist/utils/getPidOnPort.js +36 -0
  242. package/dist/utils/getPidOnPort.js.map +1 -0
  243. package/dist/utils/llm/validateAPIKey.d.ts +4 -0
  244. package/dist/utils/llm/validateAPIKey.d.ts.map +1 -0
  245. package/dist/utils/llm/validateAPIKey.js +46 -0
  246. package/dist/utils/llm/validateAPIKey.js.map +1 -0
  247. package/dist/utils/logger.d.ts +20 -0
  248. package/dist/utils/logger.d.ts.map +1 -0
  249. package/dist/utils/logger.js +91 -0
  250. package/dist/utils/logger.js.map +1 -0
  251. package/dist/utils/logo.d.ts +2 -0
  252. package/dist/utils/logo.d.ts.map +1 -0
  253. package/dist/utils/logo.js +32 -0
  254. package/dist/utils/logo.js.map +1 -0
  255. package/dist/utils/paths.d.ts +3 -0
  256. package/dist/utils/paths.d.ts.map +1 -0
  257. package/dist/utils/paths.js +11 -0
  258. package/dist/utils/paths.js.map +1 -0
  259. package/dist/utils/prompts.d.ts +4 -0
  260. package/dist/utils/prompts.d.ts.map +1 -0
  261. package/dist/utils/prompts.js +34 -0
  262. package/dist/utils/prompts.js.map +1 -0
  263. package/dist/utils/resolveDirectory.d.ts +2 -0
  264. package/dist/utils/resolveDirectory.d.ts.map +1 -0
  265. package/dist/utils/resolveDirectory.js +18 -0
  266. package/dist/utils/resolveDirectory.js.map +1 -0
  267. package/dist/utils/resolveOrchestratorState.d.ts +3 -0
  268. package/dist/utils/resolveOrchestratorState.d.ts.map +1 -0
  269. package/dist/utils/resolveOrchestratorState.js +32 -0
  270. package/dist/utils/resolveOrchestratorState.js.map +1 -0
  271. package/dist/utils/typeGuards.d.ts +8 -0
  272. package/dist/utils/typeGuards.d.ts.map +1 -0
  273. package/dist/utils/typeGuards.js +69 -0
  274. package/dist/utils/typeGuards.js.map +1 -0
  275. package/dist/utils/wait.d.ts +2 -0
  276. package/dist/utils/wait.d.ts.map +1 -0
  277. package/dist/utils/wait.js +22 -0
  278. package/dist/utils/wait.js.map +1 -0
  279. package/package.json +56 -0
  280. package/python/__init__.py +0 -0
  281. package/python/agents/coordinator_agent.py +28 -0
  282. package/python/agents/generator_agent.py +7 -0
  283. package/python/generate/__init__.py +0 -0
  284. package/python/generate/generate_from_url.py +53 -0
  285. package/python/graphs/__init__.py +0 -0
  286. package/python/graphs/memma_graph.py +46 -0
  287. package/python/main.py +75 -0
  288. package/python/nodes/__init__.py +0 -0
  289. package/python/nodes/coordinator_node.py +89 -0
  290. package/python/nodes/generate_node.py +72 -0
  291. package/python/nodes/screenshot_node.py +40 -0
  292. package/python/schemas/__init__.py +5 -0
  293. package/python/schemas/types.py +14 -0
  294. package/python/states/memma_state.py +27 -0
  295. package/python/tools/__init__.py +0 -0
  296. package/python/tools/generate_components.py +9 -0
  297. package/python/tools/generate_screenshot_path.py +39 -0
  298. package/python/tools/inspect_site.py +52 -0
  299. package/python/utils/clean_json_response.py +26 -0
  300. package/python/utils/encode_base64.py +27 -0
  301. package/python/utils/format_image_content.py +40 -0
  302. package/python/utils/llm_loader.py +33 -0
  303. package/python/utils/mime_types.py +8 -0
  304. package/python/utils/prompts.py +8 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Allen Lee
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ <p align="center">
2
+ <img src="https://github.com/6207ALS/memma/blob/commands/docs/images/memmaNodes.svg" width="250" height="auto" />
3
+ </p>
4
+
5
+ <h1 align="center">Memma<br><small>Visual-to-Code CLI Tool</small></h1>
6
+
7
+ Memma is an open-source, visual-to-code CLI tool that utilizes a lightweight
8
+ agentic AI workflow to convert websites into React components. With a single
9
+ command, Memma visually analyzes a website and returns the necessary React
10
+ components, styled with inline Tailwind CSS, to replicate the site’s layout.
11
+
12
+ Memma produces close structural and stylistic approximations of existing UIs,
13
+ enabling developers to jumpstart applications and iterate from a meaningful
14
+ starting codebase instead of a blank project.
15
+
16
+ ![npm](https://img.shields.io/npm/v/oclif)
17
+ [![GitHub license](https://img.shields.io/github/license/oclif/hello-world)](https://github.com/6207ALS/memma/blob/commands/LICENSE)
18
+
19
+ ## Features
20
+
21
+ - **Alternate between LLM Providers** - Configure Memma's environment with
22
+ either [Anthropic](https://platform.claude.com/) or [OpenAI](https://platform.openai.com/) API keys.
23
+ - **Scaffold a Next.js Project** - Optionally place the generated React
24
+ components into a newly created Next.js project.
25
+ - **Supports local image files** - Use a local image file path instead of an URL
26
+ for Memma to visually analyze.
27
+
28
+ ## Prerequisites
29
+
30
+ - [Python 3.8.0+](https://www.python.org/downloads/) installed on your environment
31
+ - An Anthropic or OpenAI API key
32
+
33
+ ## Getting Started
34
+
35
+ ### Install Memma:
36
+
37
+ ```sh-session
38
+ $ npm install -g memma
39
+ ```
40
+
41
+ ## `memma init`
42
+
43
+ Upon installing Memma, run `memma init` to initialize and configure your Memma
44
+ environment.
45
+
46
+ ```sh-session
47
+ $ memma init
48
+ ```
49
+
50
+ - When prompted, select your preferred LLM provider and provide an API key.
51
+ - Memma generates configuration files in a directory located in the user's home
52
+ directory (e.g. `~/.memma`).
53
+ - A Python virtual environment will be created (at `~/.memma`) to manage Memma’s
54
+ Python dependencies in isolation. This `venv` is used to run Memma's local
55
+ agentic backend.
56
+
57
+ ## `memma start`
58
+
59
+ Before running `memma generate`, a local Memma server must be running. Use
60
+ `memma start` to start the required FastAPI service.
61
+
62
+ ```sh-session
63
+ $ memma start
64
+ ```
65
+
66
+ Runs a local FastAPI server in the background to support Memma’s agentic
67
+ workflow.
68
+
69
+ ## `memma generate`
70
+
71
+ Generates React components from a provided source using Memma’s agentic
72
+ workflow. The output consists of TypeScript-based React components styled with
73
+ inline Tailwind CSS.
74
+
75
+ ```sh-session
76
+ $ memma generate <source> [outputDir]
77
+ ```
78
+
79
+ ### Arguments
80
+
81
+ | Argument | Required | Description |
82
+ | ----------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
83
+ | `source` | Yes | The source to generate from. This can be either a public website URL or a local image file (when used with the `--local-file` flag). |
84
+ | `outputDir` | No | Optional output directory where the generated components will be written. Defaults to the current working directory. Supported file types: `.png`/`.jpg`/`.jpeg`/`.webp` |
85
+
86
+ ### Options
87
+
88
+ | Option | Description |
89
+ | ---------------------- | ---------------------------------------------------------------------- |
90
+ | `-c, --create-project` | Scaffold a new Next.js project with the generated components. |
91
+ | `-l, --local-file` | Treat the provided source as a local image file path instead of a URL. |
92
+
93
+ > [!NOTE]
94
+ > A local Memma server must be running before executing
95
+ > `memma generate`. Refer to [`memma start`](#memma-start)
96
+
97
+ ## `memma stop`
98
+
99
+ Stops the locally running Memma server.
100
+
101
+ ```sh-session
102
+ $ memma stop
103
+ ```
104
+
105
+ ## `memma reset`
106
+
107
+ Resets Memma's environment, deleting all configuration files and directories.
108
+ Users must run `memma init` to reinitialize Memma's environment.
109
+
110
+ ```sh-session
111
+ $ memma reset
112
+ ```
113
+
114
+ ## License
115
+
116
+ Memma is released under the [MIT License]().
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init/initCommand.js';
4
+ import { startCommand } from './commands/start/startCommand.js';
5
+ import { stopCommand } from './commands/stop/stopCommand.js';
6
+ import { resetCommand } from './commands/reset/resetCommand.js';
7
+ import { generateCommand } from './commands/generate/generateCommand.js';
8
+ const program = new Command();
9
+ program
10
+ .name('memma')
11
+ .description('Memma: Visual-to-Code CLI tool')
12
+ .version('0.1.0');
13
+ // Register commands
14
+ program.addCommand(initCommand);
15
+ program.addCommand(startCommand);
16
+ program.addCommand(stopCommand);
17
+ program.addCommand(resetCommand);
18
+ program.addCommand(generateCommand);
19
+ // Parse args
20
+ program.parse(process.argv);
21
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gCAAgC,CAAC;KAC7C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,aAAa;AACb,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { GenerateActionHandlerOptions } from '../../types.js';
2
+ export declare function generateActionHandler(source: string, outputDir?: string, options?: GenerateActionHandlerOptions): Promise<void>;
3
+ //# sourceMappingURL=generateActionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateActionHandler.d.ts","sourceRoot":"","sources":["../../../src/commands/generate/generateActionHandler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAInE,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,4BAA4B,iBA8DvC"}
@@ -0,0 +1,63 @@
1
+ import fs from 'fs-extra';
2
+ import { ExitPromptError } from '@inquirer/core';
3
+ import { StatusHandler } from './stream/statusHandler.js';
4
+ import { createGenerateSSEHandler } from './stream/sseHandler.js';
5
+ import { streamGenerateResponse } from './stream/streamGenerateResponse.js';
6
+ import { LLMResponseHandler } from './stream/llmResponseHandler.js';
7
+ import { saveLLMResponse } from './write/saveLLMResponse.js';
8
+ import { resolveOutputDirectory } from './helpers/resolveOutputDirectory.js';
9
+ import { displayGenerateSuccessMessage } from './helpers/displayGenerateSuccessMessage.js';
10
+ import { resolveSourceArgument } from './helpers/resolveSourceArgument.js';
11
+ import { MemmaError } from '../../utils/MemmaError.js';
12
+ import { warn } from '../../utils/logger.js';
13
+ import { MEMMA_GENERATE_ENDPOINT } from '../../constants.js';
14
+ import { assertOrchestratorIsRunning } from '../../utils/typeGuards.js';
15
+ import { resolveOrchestratorState } from '../../utils/resolveOrchestratorState.js';
16
+ export async function generateActionHandler(source, outputDir, options) {
17
+ try {
18
+ // Make sure Memma orchestrator is running
19
+ const orchestratorState = await resolveOrchestratorState();
20
+ assertOrchestratorIsRunning(orchestratorState);
21
+ // Resolve "source" argument
22
+ const { value: sourceResolved } = resolveSourceArgument(source, options?.localFile);
23
+ // Resolve provided output directory
24
+ outputDir = await resolveOutputDirectory(outputDir);
25
+ if (await fs.exists(outputDir)) {
26
+ throw new MemmaError(`Directory ${outputDir} already exists.`);
27
+ }
28
+ // Start the POST stream
29
+ const body = JSON.stringify({ url: sourceResolved, options });
30
+ const response = await fetch(MEMMA_GENERATE_ENDPOINT, {
31
+ method: 'POST',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body,
34
+ });
35
+ if (!response.ok) {
36
+ throw new MemmaError(`Server returned ${response.status}`);
37
+ }
38
+ // Stream response, updating status and final value
39
+ const statusHandler = new StatusHandler();
40
+ const llmResponseHandler = new LLMResponseHandler();
41
+ await streamGenerateResponse(response, createGenerateSSEHandler(llmResponseHandler, statusHandler));
42
+ // Save response to directory
43
+ const llmResponse = llmResponseHandler.ensure();
44
+ await saveLLMResponse({
45
+ llmResponse,
46
+ outputDir,
47
+ createProject: options?.createProject,
48
+ });
49
+ displayGenerateSuccessMessage({ outputDir, options });
50
+ }
51
+ catch (err) {
52
+ if (err instanceof MemmaError) {
53
+ warn(err.message);
54
+ process.exit(1);
55
+ }
56
+ else if (err instanceof ExitPromptError) {
57
+ // User pressed Ctrl-C during a prompt
58
+ process.exit(130);
59
+ }
60
+ throw err;
61
+ }
62
+ }
63
+ //# sourceMappingURL=generateActionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateActionHandler.js","sourceRoot":"","sources":["../../../src/commands/generate/generateActionHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateCommand: Command;
3
+ //# sourceMappingURL=generateCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/generate/generateCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,eAAe,SAcI,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ import { generateActionHandler } from './generateActionHandler.js';
3
+ export const generateCommand = new Command('generate')
4
+ .description('Generate React components for a provided website URL (TypeScript + Tailwind CSS)')
5
+ .option('-c, --create-project', 'Scaffold a Next.js project with the generated components')
6
+ .option('-l, --local-file', 'Provide a local file path for an image file instead of an URL')
7
+ .argument('<source>')
8
+ .argument('[outputDir]')
9
+ .action(generateActionHandler);
10
+ //# sourceMappingURL=generateCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateCommand.js","sourceRoot":"","sources":["../../../src/commands/generate/generateCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CACV,kFAAkF,CACnF;KACA,MAAM,CACL,sBAAsB,EACtB,0DAA0D,CAC3D;KACA,MAAM,CACL,kBAAkB,EAClB,+DAA+D,CAChE;KACA,QAAQ,CAAC,UAAU,CAAC;KACpB,QAAQ,CAAC,aAAa,CAAC;KACvB,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isSupportedFileType(filePath: string): boolean;
2
+ //# sourceMappingURL=detectFileType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFileType.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/detectFileType.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG7D"}
@@ -0,0 +1,7 @@
1
+ import path from 'node:path';
2
+ import { SUPPORTED_FILE_TYPES } from '../../../constants.js';
3
+ export function isSupportedFileType(filePath) {
4
+ const extension = path.extname(filePath).toLowerCase();
5
+ return SUPPORTED_FILE_TYPES.includes(extension);
6
+ }
7
+ //# sourceMappingURL=detectFileType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectFileType.js","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/detectFileType.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { GenerateActionHandlerOptions } from '../../../types.js';
2
+ export interface GenerateSuccessMessageArgs {
3
+ outputDir: string;
4
+ options: GenerateActionHandlerOptions | undefined;
5
+ }
6
+ export declare const displayGenerateSuccessMessage: ({ outputDir, options, }: GenerateSuccessMessageArgs) => void;
7
+ //# sourceMappingURL=displayGenerateSuccessMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"displayGenerateSuccessMessage.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/displayGenerateSuccessMessage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,4BAA4B,GAAG,SAAS,CAAC;CACnD;AAED,eAAO,MAAM,6BAA6B,GAAI,yBAG3C,0BAA0B,SAO5B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { log } from '../../../utils/logger.js';
2
+ export const displayGenerateSuccessMessage = ({ outputDir, options, }) => {
3
+ log(`\nComponents successfully generated! Review the results at: ${outputDir}`, `\nOr run the following command${options?.createProject ? 's' : ''}:`, `\n\n cd ${outputDir}\n`, options?.createProject ? ' npm run dev\n' : '');
4
+ };
5
+ //# sourceMappingURL=displayGenerateSuccessMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"displayGenerateSuccessMessage.js","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/displayGenerateSuccessMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAS/C,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,SAAS,EACT,OAAO,GACoB,EAAE,EAAE;IAC/B,GAAG,CACD,+DAA+D,SAAS,EAAE,EAC1E,iCAAiC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EACrE,cAAc,SAAS,IAAI,EAC3B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAClD,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveOutputDirectory(dirArg?: string): Promise<string>;
2
+ //# sourceMappingURL=resolveOutputDirectory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOutputDirectory.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/resolveOutputDirectory.ts"],"names":[],"mappings":"AAOA,wBAAsB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB7E"}
@@ -0,0 +1,29 @@
1
+ import fs from 'fs-extra';
2
+ import { resolveDirectory } from '../../../utils/resolveDirectory.js';
3
+ import { MemmaError } from '../../../utils/MemmaError.js';
4
+ // If dirArg provided, returns absolute path to specified directory
5
+ // If not, returns an absolute path to a new, unique directory in cwd.
6
+ export async function resolveOutputDirectory(dirArg) {
7
+ let outputDir;
8
+ if (!dirArg || dirArg === '.') {
9
+ const baseDir = resolveDirectory('memma-output');
10
+ outputDir = await generateUniqueMemmaDir(baseDir);
11
+ }
12
+ else {
13
+ outputDir = resolveDirectory(dirArg);
14
+ if (await fs.pathExists(outputDir)) {
15
+ throw new MemmaError(`Directory "${outputDir}" already exists. Please choose a different name.`);
16
+ }
17
+ }
18
+ return outputDir;
19
+ }
20
+ async function generateUniqueMemmaDir(baseDir) {
21
+ let candidate = baseDir;
22
+ let counter = 1;
23
+ while (await fs.pathExists(candidate)) {
24
+ candidate = `${baseDir}-${counter}`;
25
+ counter++;
26
+ }
27
+ return candidate;
28
+ }
29
+ //# sourceMappingURL=resolveOutputDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOutputDirectory.js","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/resolveOutputDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,mEAAmE;AACnE,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAe;IAC1D,IAAI,SAAiB,CAAC;IAEtB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACjD,SAAS,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAErC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAClB,cAAc,SAAS,mDAAmD,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,OAAe;IACnD,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,SAAS,GAAG,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface ResolveSourceResult {
2
+ type: 'url' | 'file';
3
+ value: string;
4
+ }
5
+ export declare function resolveSourceArgument(source: string, isLocalFile?: boolean): ResolveSourceResult;
6
+ export declare function resolveUrlArgument(source: string): ResolveSourceResult;
7
+ export {};
8
+ //# sourceMappingURL=resolveSourceArgument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSourceArgument.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/resolveSourceArgument.ts"],"names":[],"mappings":"AAcA,UAAU,mBAAmB;IAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,OAAO,GACpB,mBAAmB,CAYrB;AAwBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAyBtE"}
@@ -0,0 +1,67 @@
1
+ import fs from 'fs';
2
+ import { MemmaError } from '../../../utils/MemmaError.js';
3
+ import { resolveDirectory } from '../../../utils/resolveDirectory.js';
4
+ import { isSupportedFileType } from './detectFileType.js';
5
+ import { SUPPORTED_FILE_TYPES } from '../../../constants.js';
6
+ export function resolveSourceArgument(source, isLocalFile) {
7
+ source = source.trim();
8
+ if (!source) {
9
+ throw new MemmaError('<source> argument cannot be empty.');
10
+ }
11
+ let result = isLocalFile
12
+ ? resolveLocalFileArgument(source)
13
+ : resolveUrlArgument(source);
14
+ return result;
15
+ }
16
+ function resolveLocalFileArgument(source) {
17
+ // Attempt to resolve source argument as absolute file path
18
+ const resolvedPath = resolveDirectory(source);
19
+ if (!fs.existsSync(resolvedPath)) {
20
+ throw new MemmaError(`File not found: ${resolvedPath}`);
21
+ }
22
+ const stats = fs.statSync(resolvedPath);
23
+ if (stats.isDirectory()) {
24
+ throw new MemmaError(`Expected file but got directory: ${resolvedPath}`);
25
+ }
26
+ if (!isSupportedFileType(resolvedPath)) {
27
+ throw new MemmaError(`Unsupported file type. Memma currently supports: ${SUPPORTED_FILE_TYPES.join(' / ')}`);
28
+ }
29
+ return { type: 'file', value: resolvedPath };
30
+ }
31
+ export function resolveUrlArgument(source) {
32
+ source = source.trim();
33
+ // If source starts with protocols http:// or https://
34
+ if (/^https?:\/\//i.test(source)) {
35
+ try {
36
+ new URL(source);
37
+ return { type: 'url', value: source };
38
+ }
39
+ catch {
40
+ throw new MemmaError(`Invalid URL: ${source}`);
41
+ }
42
+ }
43
+ // If source has a domain-like pattern
44
+ if (getURLNoProtocolRegExp().test(source)) {
45
+ const normalized = `http://${source}`;
46
+ try {
47
+ new URL(normalized);
48
+ return { type: 'url', value: normalized };
49
+ }
50
+ catch {
51
+ throw new MemmaError(`Invalid host or address: ${source}`);
52
+ }
53
+ }
54
+ throw new MemmaError(`Source does not appear to be a valid URL: ${source}`);
55
+ }
56
+ const getURLNoProtocolRegExp = () => {
57
+ // Host patterns
58
+ // Domains (example.com), localhost, IPv4/IPv6 (e.g. 127.0.0.1 or [::1])
59
+ const HOST_PATTERN = `(?:[a-z0-9.-]+|localhost|\\[?[0-9a-f:.]+\\]?)`;
60
+ // Optional port pattern (:8080)
61
+ const PORT_PATTERN = `(?::[0-9]{1,5})?`;
62
+ // Optional path pattern (/foo/bar)
63
+ const PATH_PATTERN = `(\\/.*)?`;
64
+ // Full URL-like regex (with no protocol)
65
+ return new RegExp(`^${HOST_PATTERN}${PORT_PATTERN}${PATH_PATTERN}$`, 'i');
66
+ };
67
+ //# sourceMappingURL=resolveSourceArgument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSourceArgument.js","sourceRoot":"","sources":["../../../../src/commands/generate/helpers/resolveSourceArgument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { generateCommand } from './generateCommand.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateCommand } from './generateCommand.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare class LLMResponseHandler {
2
+ response: string | undefined;
3
+ constructor();
4
+ set(val: string): void;
5
+ get(): string | undefined;
6
+ cleanResponse(): void;
7
+ ensure(): string;
8
+ }
9
+ //# sourceMappingURL=llmResponseHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmResponseHandler.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/stream/llmResponseHandler.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;;IAK7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAGtB,GAAG,IAAI,MAAM,GAAG,SAAS;IAIzB,aAAa,IAAI,IAAI;IAkBrB,MAAM,IAAI,MAAM;CAOjB"}
@@ -0,0 +1,33 @@
1
+ import { MemmaError } from '../../../utils/MemmaError.js';
2
+ export class LLMResponseHandler {
3
+ constructor() {
4
+ this.response = undefined;
5
+ }
6
+ set(val) {
7
+ this.response = val;
8
+ }
9
+ get() {
10
+ return this.response;
11
+ }
12
+ cleanResponse() {
13
+ if (this.response === undefined)
14
+ return;
15
+ let cleanedResponse = this.response;
16
+ // Remove opening ``` with optional language label (typescript, tsx, jsx, etc.)
17
+ cleanedResponse = cleanedResponse
18
+ .trim()
19
+ .replace(/^```[a-zA-Z0-9]*\s*\n?/, '');
20
+ // Remove closing ``` with optional trailing newline or spaces
21
+ cleanedResponse = cleanedResponse.replace(/\n?```[\s\n]*$/, '');
22
+ // Remove stray single backticks if any remain
23
+ cleanedResponse = cleanedResponse.replace(/^`+|`+$/g, '').trim();
24
+ this.response = cleanedResponse;
25
+ }
26
+ ensure() {
27
+ if (this.response === undefined)
28
+ throw new MemmaError('No LLM response received.');
29
+ this.cleanResponse();
30
+ return this.response;
31
+ }
32
+ }
33
+ //# sourceMappingURL=llmResponseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmResponseHandler.js","sourceRoot":"","sources":["../../../../src/commands/generate/stream/llmResponseHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,kBAAkB;IAG7B;QACE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IACD,GAAG,CAAC,GAAW;QACb,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;IACD,GAAG;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO;QACxC,IAAI,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEpC,+EAA+E;QAC/E,eAAe,GAAG,eAAe;aAC9B,IAAI,EAAE;aACN,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAEzC,8DAA8D;QAC9D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAEhE,8CAA8C;QAC9C,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjE,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC7B,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { EventSourceMessage } from 'eventsource-parser';
2
+ import { LLMResponseHandler } from './llmResponseHandler.js';
3
+ import { StatusHandler } from './statusHandler.js';
4
+ export declare function createGenerateSSEHandler(llmResponseHandler: LLMResponseHandler, statusUpdater: StatusHandler): (event: EventSourceMessage) => void;
5
+ //# sourceMappingURL=sseHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sseHandler.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/stream/sseHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,wBAAgB,wBAAwB,CACtC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,IAEpB,OAAO,kBAAkB,UAwBlC"}
@@ -0,0 +1,28 @@
1
+ import { MemmaError } from '../../../utils/MemmaError.js';
2
+ import { success } from '../../../utils/logger.js';
3
+ export function createGenerateSSEHandler(llmResponseHandler, statusUpdater) {
4
+ return (event) => {
5
+ if (event.event !== 'event')
6
+ return;
7
+ let data;
8
+ try {
9
+ data = JSON.parse(event.data);
10
+ }
11
+ catch (err) {
12
+ throw new MemmaError(`Malformed SSE event: ${event.data}`);
13
+ }
14
+ const { event: eventType, progress, message } = data;
15
+ switch (eventType) {
16
+ case 'status':
17
+ statusUpdater.update(progress, message);
18
+ break;
19
+ case 'done':
20
+ success('Generation complete');
21
+ llmResponseHandler.set(data.llmResponse);
22
+ break;
23
+ case 'error':
24
+ throw new MemmaError(`Generation failed: ${data.message}`);
25
+ }
26
+ };
27
+ }
28
+ //# sourceMappingURL=sseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sseHandler.js","sourceRoot":"","sources":["../../../../src/commands/generate/stream/sseHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,UAAU,wBAAwB,CACtC,kBAAsC,EACtC,aAA4B;IAE5B,OAAO,CAAC,KAAyB,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO;YAAE,OAAO;QAEpC,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAAC,wBAAwB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAErD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,qBAAqB,CAAC,CAAC;gBAC/B,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,IAAI,UAAU,CAAC,sBAAsB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Ora } from 'ora';
2
+ export declare class StatusHandler {
3
+ spinner: Ora | undefined;
4
+ constructor();
5
+ setSpinner(message: string): void;
6
+ succeedSpinner(message: string): void;
7
+ failSpinner(message: string): void;
8
+ update(progress: string, message: string): void;
9
+ }
10
+ //# sourceMappingURL=statusHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusHandler.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate/stream/statusHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,qBAAa,aAAa;IACxB,OAAO,EAAE,GAAG,GAAG,SAAS,CAAC;;IAKzB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAGjC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASrC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAehD"}
@@ -0,0 +1,38 @@
1
+ import { primary, spin } from '../../../utils/logger.js';
2
+ import { MemmaError } from '../../../utils/MemmaError.js';
3
+ export class StatusHandler {
4
+ constructor() {
5
+ this.spinner = undefined;
6
+ }
7
+ setSpinner(message) {
8
+ this.spinner = spin(message);
9
+ }
10
+ succeedSpinner(message) {
11
+ if (this.spinner)
12
+ this.spinner.stopAndPersist({
13
+ symbol: primary('✔'),
14
+ text: message,
15
+ });
16
+ this.spinner = undefined;
17
+ }
18
+ failSpinner(message) {
19
+ if (this.spinner)
20
+ this.spinner.fail(message);
21
+ this.spinner = undefined;
22
+ }
23
+ update(progress, message) {
24
+ const PREFIX = primary('[memma] ');
25
+ message = PREFIX + message;
26
+ switch (progress) {
27
+ case 'in progress':
28
+ return this.setSpinner(message);
29
+ case 'complete':
30
+ return this.succeedSpinner(message);
31
+ case 'error':
32
+ return this.failSpinner(message);
33
+ default:
34
+ throw new MemmaError('Unsupported progress type in SSE data.');
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=statusHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusHandler.js","sourceRoot":"","sources":["../../../../src/commands/generate/stream/statusHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,OAAO,aAAa;IAGxB;QACE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IACD,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,cAAc,CAAC,OAAe;QAC5B,IAAI,IAAI,CAAC,OAAO;YACd,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;gBACpB,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QAEL,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IACD,WAAW,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IACD,MAAM,CAAC,QAAgB,EAAE,OAAe;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QAE3B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC;gBACE,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF"}