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.
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/generate/generateActionHandler.d.ts +3 -0
- package/dist/commands/generate/generateActionHandler.d.ts.map +1 -0
- package/dist/commands/generate/generateActionHandler.js +63 -0
- package/dist/commands/generate/generateActionHandler.js.map +1 -0
- package/dist/commands/generate/generateCommand.d.ts +3 -0
- package/dist/commands/generate/generateCommand.d.ts.map +1 -0
- package/dist/commands/generate/generateCommand.js +10 -0
- package/dist/commands/generate/generateCommand.js.map +1 -0
- package/dist/commands/generate/helpers/detectFileType.d.ts +2 -0
- package/dist/commands/generate/helpers/detectFileType.d.ts.map +1 -0
- package/dist/commands/generate/helpers/detectFileType.js +7 -0
- package/dist/commands/generate/helpers/detectFileType.js.map +1 -0
- package/dist/commands/generate/helpers/displayGenerateSuccessMessage.d.ts +7 -0
- package/dist/commands/generate/helpers/displayGenerateSuccessMessage.d.ts.map +1 -0
- package/dist/commands/generate/helpers/displayGenerateSuccessMessage.js +5 -0
- package/dist/commands/generate/helpers/displayGenerateSuccessMessage.js.map +1 -0
- package/dist/commands/generate/helpers/resolveOutputDirectory.d.ts +2 -0
- package/dist/commands/generate/helpers/resolveOutputDirectory.d.ts.map +1 -0
- package/dist/commands/generate/helpers/resolveOutputDirectory.js +29 -0
- package/dist/commands/generate/helpers/resolveOutputDirectory.js.map +1 -0
- package/dist/commands/generate/helpers/resolveSourceArgument.d.ts +8 -0
- package/dist/commands/generate/helpers/resolveSourceArgument.d.ts.map +1 -0
- package/dist/commands/generate/helpers/resolveSourceArgument.js +67 -0
- package/dist/commands/generate/helpers/resolveSourceArgument.js.map +1 -0
- package/dist/commands/generate/index.d.ts +2 -0
- package/dist/commands/generate/index.d.ts.map +1 -0
- package/dist/commands/generate/index.js +2 -0
- package/dist/commands/generate/index.js.map +1 -0
- package/dist/commands/generate/stream/llmResponseHandler.d.ts +9 -0
- package/dist/commands/generate/stream/llmResponseHandler.d.ts.map +1 -0
- package/dist/commands/generate/stream/llmResponseHandler.js +33 -0
- package/dist/commands/generate/stream/llmResponseHandler.js.map +1 -0
- package/dist/commands/generate/stream/sseHandler.d.ts +5 -0
- package/dist/commands/generate/stream/sseHandler.d.ts.map +1 -0
- package/dist/commands/generate/stream/sseHandler.js +28 -0
- package/dist/commands/generate/stream/sseHandler.js.map +1 -0
- package/dist/commands/generate/stream/statusHandler.d.ts +10 -0
- package/dist/commands/generate/stream/statusHandler.d.ts.map +1 -0
- package/dist/commands/generate/stream/statusHandler.js +38 -0
- package/dist/commands/generate/stream/statusHandler.js.map +1 -0
- package/dist/commands/generate/stream/streamGenerateResponse.d.ts +3 -0
- package/dist/commands/generate/stream/streamGenerateResponse.d.ts.map +1 -0
- package/dist/commands/generate/stream/streamGenerateResponse.js +19 -0
- package/dist/commands/generate/stream/streamGenerateResponse.js.map +1 -0
- package/dist/commands/generate/write/saveLLMResponse.d.ts +8 -0
- package/dist/commands/generate/write/saveLLMResponse.d.ts.map +1 -0
- package/dist/commands/generate/write/saveLLMResponse.js +18 -0
- package/dist/commands/generate/write/saveLLMResponse.js.map +1 -0
- package/dist/commands/generate/write/writeResponseToDir.d.ts +2 -0
- package/dist/commands/generate/write/writeResponseToDir.d.ts.map +1 -0
- package/dist/commands/generate/write/writeResponseToDir.js +18 -0
- package/dist/commands/generate/write/writeResponseToDir.js.map +1 -0
- package/dist/commands/generate/write/writeResponseToNewProject.ts.d.ts +3 -0
- package/dist/commands/generate/write/writeResponseToNewProject.ts.d.ts.map +1 -0
- package/dist/commands/generate/write/writeResponseToNewProject.ts.js +27 -0
- package/dist/commands/generate/write/writeResponseToNewProject.ts.js.map +1 -0
- package/dist/commands/init/index.d.ts +2 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +2 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/initActionHandler.d.ts +2 -0
- package/dist/commands/init/initActionHandler.d.ts.map +1 -0
- package/dist/commands/init/initActionHandler.js +50 -0
- package/dist/commands/init/initActionHandler.js.map +1 -0
- package/dist/commands/init/initCommand.d.ts +3 -0
- package/dist/commands/init/initCommand.d.ts.map +1 -0
- package/dist/commands/init/initCommand.js +6 -0
- package/dist/commands/init/initCommand.js.map +1 -0
- package/dist/commands/init/memma-config/ensureMemmaConfigurations.d.ts +3 -0
- package/dist/commands/init/memma-config/ensureMemmaConfigurations.d.ts.map +1 -0
- package/dist/commands/init/memma-config/ensureMemmaConfigurations.js +8 -0
- package/dist/commands/init/memma-config/ensureMemmaConfigurations.js.map +1 -0
- package/dist/commands/init/memma-config/gatherConfigurationDetails.d.ts +3 -0
- package/dist/commands/init/memma-config/gatherConfigurationDetails.d.ts.map +1 -0
- package/dist/commands/init/memma-config/gatherConfigurationDetails.js +15 -0
- package/dist/commands/init/memma-config/gatherConfigurationDetails.js.map +1 -0
- package/dist/commands/init/memma-env/createPythonVirtualEnv.d.ts +2 -0
- package/dist/commands/init/memma-env/createPythonVirtualEnv.d.ts.map +1 -0
- package/dist/commands/init/memma-env/createPythonVirtualEnv.js +5 -0
- package/dist/commands/init/memma-env/createPythonVirtualEnv.js.map +1 -0
- package/dist/commands/init/memma-env/ensureMemmaEnvironment.d.ts +3 -0
- package/dist/commands/init/memma-env/ensureMemmaEnvironment.d.ts.map +1 -0
- package/dist/commands/init/memma-env/ensureMemmaEnvironment.js +21 -0
- package/dist/commands/init/memma-env/ensureMemmaEnvironment.js.map +1 -0
- package/dist/commands/init/memma-env/getVenvPath.d.ts +2 -0
- package/dist/commands/init/memma-env/getVenvPath.d.ts.map +1 -0
- package/dist/commands/init/memma-env/getVenvPath.js +9 -0
- package/dist/commands/init/memma-env/getVenvPath.js.map +1 -0
- package/dist/commands/init/memma-env/index.d.ts +2 -0
- package/dist/commands/init/memma-env/index.d.ts.map +1 -0
- package/dist/commands/init/memma-env/index.js +2 -0
- package/dist/commands/init/memma-env/index.js.map +1 -0
- package/dist/commands/init/memma-env/venvExists.d.ts +2 -0
- package/dist/commands/init/memma-env/venvExists.d.ts.map +1 -0
- package/dist/commands/init/memma-env/venvExists.js +7 -0
- package/dist/commands/init/memma-env/venvExists.js.map +1 -0
- package/dist/commands/init/messages/displayExitMessages.d.ts +2 -0
- package/dist/commands/init/messages/displayExitMessages.d.ts.map +1 -0
- package/dist/commands/init/messages/displayExitMessages.js +9 -0
- package/dist/commands/init/messages/displayExitMessages.js.map +1 -0
- package/dist/commands/init/messages/displayWelcomeMessages.d.ts +2 -0
- package/dist/commands/init/messages/displayWelcomeMessages.d.ts.map +1 -0
- package/dist/commands/init/messages/displayWelcomeMessages.js +12 -0
- package/dist/commands/init/messages/displayWelcomeMessages.js.map +1 -0
- package/dist/commands/init/packages/ensureRequirementsFile.d.ts +5 -0
- package/dist/commands/init/packages/ensureRequirementsFile.d.ts.map +1 -0
- package/dist/commands/init/packages/ensureRequirementsFile.js +11 -0
- package/dist/commands/init/packages/ensureRequirementsFile.js.map +1 -0
- package/dist/commands/init/packages/index.d.ts +2 -0
- package/dist/commands/init/packages/index.d.ts.map +1 -0
- package/dist/commands/init/packages/index.js +2 -0
- package/dist/commands/init/packages/index.js.map +1 -0
- package/dist/commands/init/packages/installPlaywrightBrowserBinaries.d.ts +2 -0
- package/dist/commands/init/packages/installPlaywrightBrowserBinaries.d.ts.map +1 -0
- package/dist/commands/init/packages/installPlaywrightBrowserBinaries.js +8 -0
- package/dist/commands/init/packages/installPlaywrightBrowserBinaries.js.map +1 -0
- package/dist/commands/init/packages/installRequiredMemmaPackages.d.ts +2 -0
- package/dist/commands/init/packages/installRequiredMemmaPackages.d.ts.map +1 -0
- package/dist/commands/init/packages/installRequiredMemmaPackages.js +12 -0
- package/dist/commands/init/packages/installRequiredMemmaPackages.js.map +1 -0
- package/dist/commands/init/packages/installRequiredPackages.d.ts +2 -0
- package/dist/commands/init/packages/installRequiredPackages.d.ts.map +1 -0
- package/dist/commands/init/packages/installRequiredPackages.js +5 -0
- package/dist/commands/init/packages/installRequiredPackages.js.map +1 -0
- package/dist/commands/init/python-env/checkPipInstalled.d.ts +5 -0
- package/dist/commands/init/python-env/checkPipInstalled.d.ts.map +1 -0
- package/dist/commands/init/python-env/checkPipInstalled.js +17 -0
- package/dist/commands/init/python-env/checkPipInstalled.js.map +1 -0
- package/dist/commands/init/python-env/detectPython.d.ts +3 -0
- package/dist/commands/init/python-env/detectPython.d.ts.map +1 -0
- package/dist/commands/init/python-env/detectPython.js +26 -0
- package/dist/commands/init/python-env/detectPython.js.map +1 -0
- package/dist/commands/init/python-env/detectPythonVersion.d.ts +2 -0
- package/dist/commands/init/python-env/detectPythonVersion.d.ts.map +1 -0
- package/dist/commands/init/python-env/detectPythonVersion.js +8 -0
- package/dist/commands/init/python-env/detectPythonVersion.js.map +1 -0
- package/dist/commands/init/python-env/index.d.ts +2 -0
- package/dist/commands/init/python-env/index.d.ts.map +1 -0
- package/dist/commands/init/python-env/index.js +2 -0
- package/dist/commands/init/python-env/index.js.map +1 -0
- package/dist/commands/init/python-env/validatePythonEnvironment.d.ts +3 -0
- package/dist/commands/init/python-env/validatePythonEnvironment.d.ts.map +1 -0
- package/dist/commands/init/python-env/validatePythonEnvironment.js +11 -0
- package/dist/commands/init/python-env/validatePythonEnvironment.js.map +1 -0
- package/dist/commands/init/scripts/copyMemmaPythonFiles.d.ts +6 -0
- package/dist/commands/init/scripts/copyMemmaPythonFiles.d.ts.map +1 -0
- package/dist/commands/init/scripts/copyMemmaPythonFiles.js +31 -0
- package/dist/commands/init/scripts/copyMemmaPythonFiles.js.map +1 -0
- package/dist/commands/reset/deleteMemmaDirectory.d.ts +2 -0
- package/dist/commands/reset/deleteMemmaDirectory.d.ts.map +1 -0
- package/dist/commands/reset/deleteMemmaDirectory.js +12 -0
- package/dist/commands/reset/deleteMemmaDirectory.js.map +1 -0
- package/dist/commands/reset/resetActionHandler.d.ts +2 -0
- package/dist/commands/reset/resetActionHandler.d.ts.map +1 -0
- package/dist/commands/reset/resetActionHandler.js +39 -0
- package/dist/commands/reset/resetActionHandler.js.map +1 -0
- package/dist/commands/reset/resetCommand.d.ts +3 -0
- package/dist/commands/reset/resetCommand.d.ts.map +1 -0
- package/dist/commands/reset/resetCommand.js +6 -0
- package/dist/commands/reset/resetCommand.js.map +1 -0
- package/dist/commands/start/getOrchestratorEnvVariables.d.ts +7 -0
- package/dist/commands/start/getOrchestratorEnvVariables.d.ts.map +1 -0
- package/dist/commands/start/getOrchestratorEnvVariables.js +12 -0
- package/dist/commands/start/getOrchestratorEnvVariables.js.map +1 -0
- package/dist/commands/start/index.d.ts +2 -0
- package/dist/commands/start/index.d.ts.map +1 -0
- package/dist/commands/start/index.js +2 -0
- package/dist/commands/start/index.js.map +1 -0
- package/dist/commands/start/startActionHandler.d.ts +2 -0
- package/dist/commands/start/startActionHandler.d.ts.map +1 -0
- package/dist/commands/start/startActionHandler.js +23 -0
- package/dist/commands/start/startActionHandler.js.map +1 -0
- package/dist/commands/start/startCommand.d.ts +3 -0
- package/dist/commands/start/startCommand.d.ts.map +1 -0
- package/dist/commands/start/startCommand.js +6 -0
- package/dist/commands/start/startCommand.js.map +1 -0
- package/dist/commands/start/startMemmaOrchestrator.d.ts +2 -0
- package/dist/commands/start/startMemmaOrchestrator.d.ts.map +1 -0
- package/dist/commands/start/startMemmaOrchestrator.js +31 -0
- package/dist/commands/start/startMemmaOrchestrator.js.map +1 -0
- package/dist/commands/start/waitForLocalServerReady.d.ts +2 -0
- package/dist/commands/start/waitForLocalServerReady.d.ts.map +1 -0
- package/dist/commands/start/waitForLocalServerReady.js +18 -0
- package/dist/commands/start/waitForLocalServerReady.js.map +1 -0
- package/dist/commands/stop/index.d.ts +2 -0
- package/dist/commands/stop/index.d.ts.map +1 -0
- package/dist/commands/stop/index.js +2 -0
- package/dist/commands/stop/index.js.map +1 -0
- package/dist/commands/stop/stopActionHandler.d.ts +2 -0
- package/dist/commands/stop/stopActionHandler.d.ts.map +1 -0
- package/dist/commands/stop/stopActionHandler.js +22 -0
- package/dist/commands/stop/stopActionHandler.js.map +1 -0
- package/dist/commands/stop/stopCommand.d.ts +3 -0
- package/dist/commands/stop/stopCommand.d.ts.map +1 -0
- package/dist/commands/stop/stopCommand.js +6 -0
- package/dist/commands/stop/stopCommand.js.map +1 -0
- package/dist/commands/stop/stopMemmaOrchestrator.d.ts +2 -0
- package/dist/commands/stop/stopMemmaOrchestrator.d.ts.map +1 -0
- package/dist/commands/stop/stopMemmaOrchestrator.js +15 -0
- package/dist/commands/stop/stopMemmaOrchestrator.js.map +1 -0
- package/dist/commands/stop/stopProcess.d.ts +2 -0
- package/dist/commands/stop/stopProcess.d.ts.map +1 -0
- package/dist/commands/stop/stopProcess.js +21 -0
- package/dist/commands/stop/stopProcess.js.map +1 -0
- package/dist/constants.d.ts +61 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +69 -0
- package/dist/constants.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/MemmaError.d.ts +4 -0
- package/dist/utils/MemmaError.d.ts.map +1 -0
- package/dist/utils/MemmaError.js +6 -0
- package/dist/utils/MemmaError.js.map +1 -0
- package/dist/utils/config/getMemmaConfig.d.ts +3 -0
- package/dist/utils/config/getMemmaConfig.d.ts.map +1 -0
- package/dist/utils/config/getMemmaConfig.js +12 -0
- package/dist/utils/config/getMemmaConfig.js.map +1 -0
- package/dist/utils/config/saveMemmaConfig.d.ts +3 -0
- package/dist/utils/config/saveMemmaConfig.d.ts.map +1 -0
- package/dist/utils/config/saveMemmaConfig.js +7 -0
- package/dist/utils/config/saveMemmaConfig.js.map +1 -0
- package/dist/utils/consoleMessages.d.ts +2 -0
- package/dist/utils/consoleMessages.d.ts.map +1 -0
- package/dist/utils/consoleMessages.js +2 -0
- package/dist/utils/consoleMessages.js.map +1 -0
- package/dist/utils/getMemmaScriptPath.d.ts +2 -0
- package/dist/utils/getMemmaScriptPath.d.ts.map +1 -0
- package/dist/utils/getMemmaScriptPath.js +6 -0
- package/dist/utils/getMemmaScriptPath.js.map +1 -0
- package/dist/utils/getPidOnPort.d.ts +2 -0
- package/dist/utils/getPidOnPort.d.ts.map +1 -0
- package/dist/utils/getPidOnPort.js +36 -0
- package/dist/utils/getPidOnPort.js.map +1 -0
- package/dist/utils/llm/validateAPIKey.d.ts +4 -0
- package/dist/utils/llm/validateAPIKey.d.ts.map +1 -0
- package/dist/utils/llm/validateAPIKey.js +46 -0
- package/dist/utils/llm/validateAPIKey.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logo.d.ts +2 -0
- package/dist/utils/logo.d.ts.map +1 -0
- package/dist/utils/logo.js +32 -0
- package/dist/utils/logo.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +11 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/prompts.d.ts +4 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +34 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/resolveDirectory.d.ts +2 -0
- package/dist/utils/resolveDirectory.d.ts.map +1 -0
- package/dist/utils/resolveDirectory.js +18 -0
- package/dist/utils/resolveDirectory.js.map +1 -0
- package/dist/utils/resolveOrchestratorState.d.ts +3 -0
- package/dist/utils/resolveOrchestratorState.d.ts.map +1 -0
- package/dist/utils/resolveOrchestratorState.js +32 -0
- package/dist/utils/resolveOrchestratorState.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +8 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/typeGuards.js +69 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/wait.d.ts +2 -0
- package/dist/utils/wait.d.ts.map +1 -0
- package/dist/utils/wait.js +22 -0
- package/dist/utils/wait.js.map +1 -0
- package/package.json +56 -0
- package/python/__init__.py +0 -0
- package/python/agents/coordinator_agent.py +28 -0
- package/python/agents/generator_agent.py +7 -0
- package/python/generate/__init__.py +0 -0
- package/python/generate/generate_from_url.py +53 -0
- package/python/graphs/__init__.py +0 -0
- package/python/graphs/memma_graph.py +46 -0
- package/python/main.py +75 -0
- package/python/nodes/__init__.py +0 -0
- package/python/nodes/coordinator_node.py +89 -0
- package/python/nodes/generate_node.py +72 -0
- package/python/nodes/screenshot_node.py +40 -0
- package/python/schemas/__init__.py +5 -0
- package/python/schemas/types.py +14 -0
- package/python/states/memma_state.py +27 -0
- package/python/tools/__init__.py +0 -0
- package/python/tools/generate_components.py +9 -0
- package/python/tools/generate_screenshot_path.py +39 -0
- package/python/tools/inspect_site.py +52 -0
- package/python/utils/clean_json_response.py +26 -0
- package/python/utils/encode_base64.py +27 -0
- package/python/utils/format_image_content.py +40 -0
- package/python/utils/llm_loader.py +33 -0
- package/python/utils/mime_types.py +8 -0
- 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
|
+

|
|
17
|
+
[](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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|