# Artifact Editor **AI-enhanced editor for creating diagrams, sketches, 3D models, and other artifacts from code.** A standalone PyQt6-based editor for creating visual artifacts. Designed to integrate with discussion tools, documentation systems, and IDEs. ## Features - **Split-view interface** - Code editor on the left, live preview on the right - **Multi-format support** - PlantUML, Mermaid, OpenSCAD, Code, SVG, and Excalidraw - **Format switching** - Change formats on the fly; file extension updates automatically - **Interactive SVG editing** - Click to select, drag to move, resize with handles - **Elements panel** - View and manage diagram elements - **Visual editing** - Add, edit, and delete elements via dialogs or directly in preview - **Templates** - Start from pre-built templates for common diagrams - **Syntax highlighting** - Format-specific code highlighting - **Live preview** - See changes as you type (bidirectional sync) - **Undo/Redo** - Works for both code and visual changes - **3D controls** - Rotate/pan OpenSCAD models with mouse - **AI-powered generation** - Describe what you want, AI generates the code - **Voice input** - Dictation with visual countdown timer (10 seconds) - **Save & Exit** - Quick toolbar button for integration workflows ## Supported Artifact Types | Type | Description | Features | |------|-------------|----------| | `plantuml` | UML diagrams (class, sequence, component, etc.) | Element editing, relationships, click-to-select | | `mermaid` | Flowcharts, sequence, ER, state diagrams | Node editing with shapes, connections | | `openscad` | 3D parametric CAD models | Transform controls (translate/rotate/scale), module insertion | | `code` | Syntax-highlighted code snippets | 500+ languages, multiple themes, line numbers, font size | | `svg` | Direct SVG graphics editing | Interactive visual editing, drag/resize, UI wireframes | | `excalidraw` | Hand-drawn style diagrams | Sketch-like visuals, AI-readable JSON, whiteboard style | ## Installation ```bash # Clone and install git clone https://gitea.brrd.tech/rob/artifact-editor.git cd artifact-editor pip install -e . # Or just install dependencies pip install PyQt6 # Optional renderers sudo apt install plantuml # For PlantUML npm install -g @mermaid-js/mermaid-cli # For Mermaid sudo apt install openscad # For 3D CAD pip install pygments pillow # For code syntax highlighting ``` ## Docker Run without installing anything locally (all dependencies included): ```bash # Clone the repo git clone https://gitea.brrd.tech/rob/artifact-editor.git cd artifact-editor # Build (automatically clones CmdForge from Gitea) docker-compose build # Run tests docker-compose run --rm test # Use the CLI tools docker-compose run --rm cli artifact-ai --format plantuml --instruction "Create a class diagram" echo "@startuml\nA->B\n@enduml" | docker-compose run --rm cli artifact-export --format plantuml --to /dev/stdout # Launch GUI (requires X11: xhost +local:docker) docker-compose run --rm gui # Interactive shell docker-compose run --rm shell ``` ## Usage ### Launch the GUI Editor ```bash # Launch with default (PlantUML) artifact-editor # Launch for specific format artifact-editor --type mermaid artifact-editor --type openscad artifact-editor --type code artifact-editor --type svg artifact-editor --type excalidraw # Open existing file artifact-editor --type plantuml --initial-file diagram.puml ``` ### GUI Features **Elements Panel (right sidebar):** - **+Element** - Add new elements (nodes, shapes, primitives) - **+Connection** - Add relationships between elements - **Double-click** - Edit existing elements in a dialog - **Delete** - Remove selected elements **For PlantUML:** - Add classes, interfaces, actors, components, etc. - Define relationships (inheritance, composition, etc.) - Click on elements in the preview to select in code **For Mermaid:** - Add flowchart nodes with various shapes (rectangle, diamond, circle, etc.) - Add sequence diagram participants - Create connections between nodes **For OpenSCAD:** - Add 3D primitives (cube, sphere, cylinder) - Add 2D shapes (circle, square) - Boolean operations (union, difference, intersection) - Transform wrappers (translate, rotate, scale) - Insert at cursor, end of file, or inside modules - 3D preview with mouse rotation **For Code:** - Syntax highlighting for 500+ programming languages - Multiple color themes (Monokai, Dracula, GitHub, etc.) - Line numbers toggle - Adjustable font size - Live preview as you type **For SVG:** - **Interactive visual editing** - Click elements to select, drag to move, resize with corner handles - Direct vector graphics editing in code or visually - UI wireframe templates (login forms, dashboards, mobile screens) - Pre-built UI components (buttons, inputs, cards, modals, navbars) - System architecture and flowchart templates - Pixel-perfect element positioning using SVG renderer bounds - Delete key removes selected elements - All visual changes are undoable with Ctrl+Z **For Excalidraw:** - Hand-drawn/sketch-style diagrams - AI-readable JSON format (perfect for AI collaboration) - Whiteboard-style visuals that invite discussion - Flowcharts, mind maps, and wireframe templates - Exports to SVG or native .excalidraw format ## Architecture ``` artifact-editor/ ├── src/artifact_editor/ │ ├── cli.py # CLI entry point │ ├── gui.py # PyQt6 main window │ ├── dialogs.py # Element/relationship dialogs │ ├── parser.py # PlantUML parser │ ├── mermaid_parser.py # Mermaid parser │ ├── openscad_parser.py # OpenSCAD parser │ ├── templates.py # Diagram templates │ └── renderers/ # Convert source to visual output │ ├── plantuml.py │ ├── mermaid.py │ ├── openscad.py │ ├── code.py # Pygments-based syntax highlighting │ ├── svg.py # Direct SVG editing with UI components │ └── excalidraw.py # Hand-drawn style diagrams └── cmdforge/ # CLI tools following Unix philosophy ├── artifact-ai/ # AI-powered artifact generation/modification └── artifact-export/ # Render source to binary formats ``` ## CLI CmdForge Tools In addition to the GUI, artifact-editor provides command-line CmdForge tools: ### artifact-ai Generate or modify artifacts using AI: ```bash # Create new artifact echo "" | artifact-ai --format plantuml --instruction "Create a sequence diagram for user login" # Modify existing artifact cat diagram.puml | artifact-ai --format plantuml --instruction "Add a cache layer between API and database" # Supported formats: plantuml, mermaid, openscad, svg, excalidraw, code ``` ### artifact-export Render artifacts to binary formats: ```bash # PlantUML to SVG cat diagram.puml | artifact-export --format plantuml --to output.svg # OpenSCAD to PNG cat model.scad | artifact-export --format openscad --to output.png # Mermaid to PDF cat flowchart.mmd | artifact-export --format mermaid --to output.pdf ``` Install CmdForge tools with `./install.sh` (requires CmdForge framework). ## Keyboard Shortcuts - **Ctrl+S** - Save file - **Ctrl+Z** - Undo (works for both code and visual edits) - **Ctrl+Y** - Redo - **Ctrl+R** - Force re-render preview - **Delete** - Remove selected element (SVG mode) - **Ctrl+Mouse wheel** - Zoom preview - **Click+Drag** - Move elements in SVG preview - **Corner handles** - Resize selected elements in SVG preview ## AI Input Panel The bottom panel provides AI-assisted artifact creation: - **Text input** - Describe what you want in natural language - **Dictate button** - Voice input with 10-second countdown timer - Shows `🎤 9s`, `🎤 8s`, etc. while recording - Transcription appears in the input field for editing - **AI Generate button** - Generates or modifies the artifact based on your description - For new artifacts: Creates complete diagram code - For existing content: Modifies based on instructions - Handles retry with error context if generation fails ## Integration The editor can be launched from other applications: ```bash # Launch and specify output artifact-editor --type TYPE --output /path/to/output.svg # Exit codes: # 0 - Saved successfully (stdout: "ARTIFACT_SAVED:/path/to/output.svg") # 1 - Cancelled by user # 2 - Error (stderr: error message) ``` Example Python integration: ```python import subprocess result = subprocess.run([ "artifact-editor", "--type", "mermaid", "--output", "/tmp/diagram.svg", ], capture_output=True, text=True) if result.returncode == 0: for line in result.stdout.split('\n'): if line.startswith("ARTIFACT_SAVED:"): artifact_path = line.split(":", 1)[1] print(f"Created: {artifact_path}") ``` ## License MIT