Welcome to Vangard Pro
+Professional interface for DAZ Studio automation
+Select a command from the sidebar to get started
+diff --git a/MANIFEST.in b/MANIFEST.in
index af36243..7a711b1 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -9,6 +9,9 @@ include pytest.ini
# Include DAZ Studio scripts
recursive-include vangard/scripts *.dsa
+# Include Pro mode static files
+recursive-include vangard/static *.html *.css *.js *.png *.jpg *.svg *.ico
+
# Include test files (for source distributions)
recursive-include tests *.py
diff --git a/PARAMETER_FIX_SUMMARY.md b/PARAMETER_FIX_SUMMARY.md
new file mode 100644
index 0000000..7790996
--- /dev/null
+++ b/PARAMETER_FIX_SUMMARY.md
@@ -0,0 +1,232 @@
+# Parameter Display Fix - Summary
+
+## Problem Identified
+
+The Pro mode interface was showing "This command has no parameters" for all commands, even though they had parameters defined in `config.yaml`.
+
+### Root Cause
+
+The JavaScript `extractParameters()` function wasn't resolving OpenAPI `$ref` references. FastAPI generates schemas like:
+
+```json
+{
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Load_sceneRequest"
+ }
+ }
+ }
+ }
+}
+```
+
+The actual parameter definitions were in `components.schemas.Load_sceneRequest.properties`, but the code wasn't looking there.
+
+## Solution Implemented
+
+### 1. Fixed JavaScript Parameter Extraction
+
+**File: `vangard/static/js/app.js`**
+
+**Changes:**
+- Added `openApiSchema` to state to store full schema
+- Modified `extractParameters()` to:
+ - Accept full schema as parameter
+ - Resolve `$ref` references by traversing the schema
+ - Handle `anyOf` pattern for optional nullable fields
+ - Support `x-uiclass` extension for special UI widgets
+
+**Before:**
+```javascript
+function extractParameters(operation) {
+ const schema = operation.requestBody.content['application/json'].schema;
+ const properties = schema.properties || {};
+ // ... (would fail if schema has $ref)
+}
+```
+
+**After:**
+```javascript
+function extractParameters(operation, fullSchema) {
+ let schema = operation.requestBody.content['application/json'].schema;
+
+ // Resolve $ref if present
+ if (schema.$ref) {
+ const refPath = schema.$ref.split('/').slice(1);
+ schema = refPath.reduce((obj, key) => obj[key], fullSchema);
+ }
+
+ const properties = schema.properties || {};
+ // ... (now works with $ref)
+}
+```
+
+### 2. Added UIClass Support
+
+**Feature:** Special UI widgets for file/folder selection
+
+**Supported UIClass Values:**
+- `pick-file` - File browser button
+- `pick-folder` - Folder browser button
+
+**UI Implementation:**
+- Text input field (user can type path manually)
+- Browse button (for future native file picker)
+- Styled wrapper with icon buttons
+
+**CSS Added:**
+```css
+.file-picker-wrapper {
+ display: flex;
+ gap: var(--spacing-sm);
+ align-items: stretch;
+}
+
+.file-picker-input {
+ flex: 1;
+}
+
+.file-picker-button {
+ white-space: nowrap;
+ padding: var(--spacing-md) var(--spacing-lg);
+}
+```
+
+## How to Use UIClass (Optional Feature)
+
+### Adding UIClass to config.yaml
+
+You can now add a `uiclass` field to any argument to get special UI widgets in Pro mode:
+
+```yaml
+commands:
+ - name: "load-scene"
+ class: "vangard.commands.LoadMergeSU.LoadMergeSU"
+ help: "Load or merge DAZ Studio scene files"
+ arguments:
+ - names: ["scene_file"]
+ dest: "scene_file"
+ type: "str"
+ required: true
+ help: "Path to the DAZ Studio scene file"
+ uiclass: "pick-file" # ← Add this for file picker UI
+
+ - names: ["-m", "--merge"]
+ dest: "merge"
+ action: "store_true"
+ help: "Merge with existing scene instead of replacing"
+```
+
+### UIClass in Action
+
+**Without UIClass (standard text input):**
+```
+┌─────────────────────────────────────┐
+│ /path/to/scene.duf │
+└─────────────────────────────────────┘
+```
+
+**With `uiclass: "pick-file"`:**
+```
+┌─────────────────────────────┬──────────────────┐
+│ /path/to/scene.duf │ 📄 Browse File │
+└─────────────────────────────┴──────────────────┘
+```
+
+**With `uiclass: "pick-folder"`:**
+```
+┌─────────────────────────────┬──────────────────┐
+│ /path/to/output/directory │ 📁 Browse Folder │
+└─────────────────────────────┴──────────────────┘
+```
+
+## Test Results
+
+Tested with multiple commands:
+
+- ✅ **load-scene**: 2 parameters (scene_file, merge)
+- ✅ **batch-render**: 13 parameters (all extracting correctly)
+- ✅ **create-cam**: 3 parameters (cam_name, cam_class, focus)
+- ✅ **help**: 1 parameter (command_name)
+
+All commands now display their parameters correctly!
+
+## Implementation Status
+
+### ✅ Completed
+- [x] JavaScript $ref resolution
+- [x] anyOf pattern handling for optional fields
+- [x] UIClass support in form generation
+- [x] File picker UI widget
+- [x] Folder picker UI widget
+- [x] CSS styling for pickers
+- [x] Documentation (UICLASS_GUIDE.md)
+
+### 🚧 Future Enhancements
+- [ ] Native file/folder browser dialogs (HTML5 File API)
+- [ ] Drag-and-drop file support
+- [ ] Path autocomplete
+- [ ] Recent paths history
+- [ ] Additional UIClass types (color picker, slider, dropdown, etc.)
+
+## Files Modified
+
+1. **vangard/static/js/app.js**
+ - Added `openApiSchema` to state
+ - Fixed `extractParameters()` to resolve $ref
+ - Added UIClass widget generation
+ - Updated `loadCommands()` to pass full schema
+
+2. **vangard/static/css/styles.css**
+ - Added `.file-picker-wrapper` styling
+ - Added `.file-picker-input` styling
+ - Added `.file-picker-button` styling
+
+3. **New Documentation**
+ - `UICLASS_GUIDE.md` - Complete guide for UIClass feature
+
+## Testing
+
+To verify the fix works:
+
+1. Start Pro mode:
+ ```bash
+ vangard-pro
+ ```
+
+2. Open browser to: http://127.0.0.1:8000/ui
+
+3. Click any command (e.g., "load-scene")
+
+4. **Expected:** You should now see parameter fields:
+ - "Scene File" with a text input (required field marked with *)
+ - "Merge" with a checkbox
+
+5. Commands without parameters will show "This command has no parameters"
+
+## Benefits
+
+1. **Fixed Core Issue**: All command parameters now display correctly
+2. **Better UX**: Added special widgets for file/folder selection
+3. **Extensible**: Easy to add more UIClass types in the future
+4. **Backwards Compatible**: UIClass is optional, existing commands work fine
+5. **CLI Unaffected**: UIClass only affects Pro mode, other modes unchanged
+
+## Next Steps (Optional)
+
+If you want to add file/folder pickers to your commands:
+
+1. Edit `config.yaml`
+2. Add `uiclass: "pick-file"` or `uiclass: "pick-folder"` to relevant arguments
+3. Restart the Pro server
+4. The UI will automatically show browse buttons for those fields
+
+See `UICLASS_GUIDE.md` for complete examples and documentation.
+
+---
+
+**Status: ✅ FIXED AND TESTED**
+
+Parameters now display correctly in Vangard Pro mode!
diff --git a/PRO_IMPLEMENTATION_SUMMARY.md b/PRO_IMPLEMENTATION_SUMMARY.md
new file mode 100644
index 0000000..ae3f228
--- /dev/null
+++ b/PRO_IMPLEMENTATION_SUMMARY.md
@@ -0,0 +1,352 @@
+# Vangard Pro Mode - Implementation Summary
+
+## What We Built
+
+A professional, colorful web interface for Vangard that provides a visual, form-based alternative to command-line interaction. This is designed for users who are less comfortable with CLI tools and prefer point-and-click interfaces.
+
+## 🎯 Key Features
+
+### 1. **Visual Command Discovery**
+- Sidebar with all commands displayed as cards with icons
+- Search functionality to filter commands
+- Alphabetically sorted for easy navigation
+- Command count badge
+
+### 2. **Dynamic Form Generation**
+- Forms automatically generated from `config.yaml`
+- Type-aware input fields (text, number, checkbox, array)
+- Required field indicators
+- Help tooltips for parameter descriptions
+- File browser support (ready for future enhancement)
+
+### 3. **Professional Design**
+- **Dark theme by default** (professional for 3D work)
+- Glassmorphism effects and modern UI patterns
+- Smooth animations and transitions
+- **Colorful** with vibrant accent colors
+- Responsive layout (works on desktop and tablet)
+
+### 4. **User Experience**
+- Loading overlays during command execution
+- Toast notifications (success/error/info)
+- Real-time output display with syntax highlighting
+- Theme toggle (dark/light mode)
+- Collapsible output panel
+
+### 5. **Technical Excellence**
+- **Zero framework dependencies** on frontend (vanilla JS)
+- Leverages existing FastAPI infrastructure
+- Works with existing command system
+- Auto-generates forms from OpenAPI schema
+
+## 📁 Files Created
+
+### Backend
+- **`vangard/pro.py`** - FastAPI server that serves both API and static files
+ - Extends existing `vangard.server` functionality
+ - Serves static HTML/CSS/JS
+ - Provides fallback if static files missing
+
+### Frontend
+- **`vangard/static/index.html`** - Main HTML structure
+ - Header with search and theme toggle
+ - Sidebar for command list
+ - Main content area for forms and output
+ - Toast notification container
+ - Loading overlay
+
+- **`vangard/static/css/styles.css`** - Professional stylesheet (300+ lines)
+ - CSS custom properties for theming
+ - Dark/light theme support
+ - Glassmorphism effects
+ - Responsive design
+ - Smooth transitions and animations
+ - Custom scrollbars
+
+- **`vangard/static/js/app.js`** - Application logic (500+ lines)
+ - Fetches commands from OpenAPI schema
+ - Generates command list dynamically
+ - Creates forms based on parameter types
+ - Handles form submission via Fetch API
+ - Manages state (selected command, theme, etc.)
+ - Toast notifications
+ - Search functionality
+
+### Documentation
+- **`PRO_MODE.md`** - User guide for Pro mode
+ - Quick start instructions
+ - Feature overview
+ - Usage guide
+ - Customization tips
+ - Troubleshooting
+
+- **`PRO_IMPLEMENTATION_SUMMARY.md`** - This file
+ - Technical overview
+ - Implementation details
+ - Testing instructions
+
+### Configuration Updates
+- **`setup.py`** - Added `vangard-pro` console script and static files
+- **`pyproject.toml`** - Added `vangard-pro` script entry
+- **`MANIFEST.in`** - Include static files in distribution
+- **`vangard/main.py`** - Added 'pro' mode option
+
+## 🎨 Design System
+
+### Color Palette
+```
+Primary: #6366f1 (Indigo - professional but vibrant)
+Success: #10b981 (Emerald green)
+Warning: #f59e0b (Amber)
+Error: #ef4444 (Red)
+Accent: #8b5cf6 (Purple - for highlights)
+
+Dark Theme:
+ Background: #0f172a (Dark slate)
+ Surface: #1e293b (Lighter slate)
+ Text: #f1f5f9 (Light gray)
+
+Light Theme:
+ Background: #f8fafc (Very light blue)
+ Surface: #ffffff (White)
+ Text: #0f172a (Dark slate)
+```
+
+### Visual Style
+- **Glassmorphism**: Frosted glass effect on cards
+- **Gradient accents**: Linear gradients on logo and headings
+- **Shadow depth**: Multiple shadow levels for hierarchy
+- **Border radius**: Rounded corners throughout
+- **Smooth animations**: 150ms-300ms transitions
+
+### Typography
+- **System fonts**: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto
+- **Monospace**: Monaco, Courier New (for output)
+- **Font weights**: 400 (normal), 600 (semi-bold), 700 (bold)
+
+## 🏗️ Architecture
+
+```
+┌─────────────────────────────────────────────────┐
+│ Browser (http://localhost:8000) │
+│ │
+│ index.html → app.js → styles.css │
+│ ↓ ↓ │
+│ Fetches Generates Applies │
+│ /openapi.json forms themes │
+└──────────────────┬────────────────────────────┘
+ │ HTTP POST
+ ↓
+┌─────────────────────────────────────────────────┐
+│ FastAPI Server (vangard/pro.py) │
+│ │
+│ GET / → Serves index.html │
+│ GET /static/* → Serves CSS/JS │
+│ GET /docs → Swagger UI │
+│ POST /api/* → Command endpoints │
+└──────────────────┬────────────────────────────┘
+ │
+ ↓
+┌─────────────────────────────────────────────────┐
+│ Command Classes (vangard/commands/) │
+│ │
+│ LoadMergeSU, BatchRenderSU, etc. │
+└──────────────────┬────────────────────────────┘
+ │
+ ↓
+┌─────────────────────────────────────────────────┐
+│ DAZ Studio (subprocess) │
+│ │
+│ Executes .dsa scripts │
+└─────────────────────────────────────────────────┘
+```
+
+## 🚀 How to Use
+
+### Launch Pro Mode
+
+```bash
+# Method 1: Direct command
+vangard-pro
+
+# Method 2: Through main launcher
+vangard pro
+```
+
+### Access the Interface
+
+Open your browser to: **http://127.0.0.1:8000**
+
+### Workflow
+
+1. **Browse Commands**: Scroll through the sidebar or use search
+2. **Select Command**: Click on a command card
+3. **Fill Form**: Enter required parameters (marked with *)
+4. **Execute**: Click "Execute Command" button
+5. **View Output**: Results appear in the output panel below
+
+## 🧪 Testing Checklist
+
+### Functional Tests
+
+- [ ] **Launch**: `vangard-pro` starts server successfully
+- [ ] **Load Page**: Browser loads interface at http://127.0.0.1:8000
+- [ ] **Commands Load**: Sidebar populates with commands from config.yaml
+- [ ] **Search**: Filter commands by typing in search box
+- [ ] **Select Command**: Click command card shows form
+- [ ] **Form Generation**: Form fields match command parameters
+- [ ] **Required Fields**: Red asterisk appears on required fields
+- [ ] **Help Tooltips**: Info icon shows parameter description
+- [ ] **Form Submission**: Execute button sends data to API
+- [ ] **Output Display**: Results appear in output panel
+- [ ] **Loading State**: Loading overlay appears during execution
+- [ ] **Toast Notification**: Success/error toast appears
+- [ ] **Theme Toggle**: Switch between dark and light themes
+- [ ] **Close Command**: X button returns to welcome screen
+
+### Visual Tests
+
+- [ ] **Responsive**: Layout adapts to different screen sizes
+- [ ] **Animations**: Smooth transitions on hover and clicks
+- [ ] **Scrolling**: Custom scrollbar appears in sidebar
+- [ ] **Colors**: Professional color scheme matches design
+- [ ] **Typography**: Fonts render correctly and are readable
+- [ ] **Icons**: Command icons display properly
+
+### Edge Cases
+
+- [ ] **No Parameters**: Commands without params show "no parameters" message
+- [ ] **Array Inputs**: Comma-separated values work correctly
+- [ ] **Boolean Inputs**: Checkboxes toggle properly
+- [ ] **Number Inputs**: Number fields accept integers/floats
+- [ ] **Empty Search**: Shows all commands when search is cleared
+- [ ] **API Error**: Error toast appears if API request fails
+
+## 🔄 Integration with Existing System
+
+### What's Reused
+✅ Entire FastAPI server infrastructure (`vangard.server`)
+✅ Command classes and execution logic
+✅ Config.yaml for command definitions
+✅ OpenAPI schema generation
+✅ DAZ Studio integration
+
+### What's New
+✨ Static file serving
+✨ Frontend HTML/CSS/JS
+✨ Professional UI/UX
+✨ Visual command browser
+
+### No Breaking Changes
+- CLI mode: Still works exactly the same
+- Interactive mode: Unchanged
+- Server mode: Unchanged (Pro uses same endpoints)
+- GUI mode: Unchanged
+
+## 📊 Comparison with Other Modes
+
+| Feature | CLI | Interactive | GUI (tkinter) | Server | **Pro** |
+|----------------------|-----|-------------|---------------|--------|---------|
+| No command syntax | ❌ | ❌ | ✅ | ✅ | ✅ |
+| Visual interface | ❌ | ❌ | ✅ | ❌ | ✅ |
+| Modern design | ❌ | ❌ | ❌ | N/A | ✅ |
+| Form-based input | ❌ | ❌ | ✅ | ✅ | ✅ |
+| Command discovery | ❌ | ⚠️ | ⚠️ | ✅ | ✅ |
+| Searchable commands | ❌ | ❌ | ❌ | ❌ | ✅ |
+| Real-time feedback | ✅ | ✅ | ✅ | ✅ | ✅ |
+| Remote access | ❌ | ❌ | ❌ | ✅ | ✅ |
+| API documentation | ❌ | ❌ | ❌ | ✅ | ✅ |
+| Theme customization | ❌ | ❌ | ❌ | ❌ | ✅ |
+
+## 🎯 Target Users
+
+**Perfect for:**
+- Artists and content creators
+- Users uncomfortable with command-line tools
+- Visual learners
+- Users who prefer clicking over typing
+- Teams that need a shared web interface
+- Users who want to discover commands visually
+
+**Still use CLI/Interactive for:**
+- Quick one-off commands
+- Scripting and automation
+- SSH/remote terminal sessions
+- Power users comfortable with command-line
+
+## 🔮 Future Enhancements
+
+### Phase 2 (Near Future)
+- [ ] Command favorites/recents
+- [ ] File path browser widget
+- [ ] WebSocket for real-time output streaming
+- [ ] Command history
+- [ ] Keyboard shortcuts
+
+### Phase 3 (Future)
+- [ ] Batch command execution
+- [ ] Command templates/presets
+- [ ] Multi-user authentication
+- [ ] Desktop app packaging (pywebview or Electron)
+- [ ] Progress bars for long operations
+- [ ] Command scheduling
+
+## 🐛 Known Limitations
+
+1. **Output Streaming**: Currently shows results after completion (not real-time)
+2. **File Picker**: Uses text input for file paths (no native file browser yet)
+3. **Large Outputs**: Very large outputs might slow down the browser
+4. **Single User**: No authentication/multi-user support yet
+
+## 📝 Code Quality
+
+### Frontend
+- **Vanilla JavaScript**: No build step required, easy to understand
+- **Modular Structure**: Clear separation of concerns (state, UI, API)
+- **Documented**: Comments explain complex logic
+- **ES6+**: Modern JavaScript features (async/await, arrow functions)
+
+### Backend
+- **Extends Existing**: Builds on proven `vangard.server` code
+- **Type Hints**: Python type annotations throughout
+- **Error Handling**: Proper try/catch and HTTP status codes
+- **Separation**: Static serving separated from API logic
+
+### Styling
+- **CSS Variables**: Easy theming via custom properties
+- **BEM-like Naming**: Consistent class naming convention
+- **Responsive**: Mobile-first with media queries
+- **No Frameworks**: Pure CSS for maximum control
+
+## 🎓 Learning Resources
+
+If you want to extend or customize Pro mode:
+
+### Frontend
+- **JavaScript**: [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
+- **Fetch API**: [Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
+- **CSS Grid/Flexbox**: [CSS Tricks Guide](https://css-tricks.com/)
+
+### Backend
+- **FastAPI**: [Official Docs](https://fastapi.tiangolo.com/)
+- **Uvicorn**: [Uvicorn Docs](https://www.uvicorn.org/)
+
+## 🎉 Summary
+
+We've successfully created a **professional, colorful, web-based interface** for Vangard that:
+
+✅ Provides visual command discovery
+✅ Generates forms automatically from config
+✅ Offers a modern, polished user experience
+✅ Works alongside existing CLI/GUI modes
+✅ Requires zero changes to existing commands
+✅ Uses proven web technologies
+✅ Can be extended and customized easily
+
+**Launch it now and see it in action:**
+```bash
+vangard-pro
+# Then open http://127.0.0.1:8000 in your browser
+```
+
+Enjoy your new professional interface! 🚀
diff --git a/PRO_MODE.md b/PRO_MODE.md
new file mode 100644
index 0000000..bf62238
--- /dev/null
+++ b/PRO_MODE.md
@@ -0,0 +1,259 @@
+# Vangard Pro Mode
+
+Professional web interface for DAZ Studio automation - designed for users who prefer visual, form-based interactions over command-line interfaces.
+
+## Overview
+
+Vangard Pro is a modern, colorful web interface that provides:
+
+- **Visual Command Discovery**: Browse all available commands with icons and descriptions
+- **Dynamic Form Generation**: Automatically generated forms based on command parameters
+- **Real-time Validation**: Instant feedback on required fields and input types
+- **Professional Design**: Dark theme with glassmorphism effects and smooth animations
+- **User-Friendly**: No command-line knowledge required
+
+## Quick Start
+
+### 1. Install the Package
+
+```bash
+pip install -e .
+```
+
+### 2. Launch Pro Mode
+
+```bash
+# Direct launch
+vangard-pro
+
+# Or through the main launcher
+vangard pro
+```
+
+The server will start at: **http://127.0.0.1:8000**
+
+### 3. Open in Browser
+
+Navigate to http://127.0.0.1:8000 in your web browser to access the Pro interface.
+
+## Features
+
+### Command Browser
+
+- **Searchable Command List**: Quickly find commands by name or description
+- **Command Icons**: Visual indicators for different command types
+- **Organized Categories**: Commands are alphabetically sorted for easy navigation
+
+### Dynamic Forms
+
+- **Auto-generated Forms**: Forms are created automatically from command definitions
+- **Input Validation**: Required fields are clearly marked
+- **Type-specific Inputs**: Different input types (text, number, checkbox, etc.) based on parameter types
+- **Help Tooltips**: Hover over the info icon to see parameter descriptions
+
+### Output Display
+
+- **Real-time Feedback**: See command execution results immediately
+- **Syntax Highlighting**: Color-coded output (success, error, info)
+- **Collapsible Output**: Hide/show output panel as needed
+- **Timestamped Logs**: Each output line includes a timestamp
+
+### User Experience
+
+- **Loading Indicators**: Visual feedback during command execution
+- **Toast Notifications**: Non-intrusive success/error messages
+- **Theme Toggle**: Switch between dark and light themes
+- **Responsive Design**: Works on desktop and tablet devices
+
+## Architecture
+
+```
+User Browser
+ ↓
+vangard/static/index.html (Frontend)
+ ↓
+JavaScript App (app.js)
+ ↓ (HTTP POST)
+FastAPI Server (vangard/pro.py)
+ ↓
+Command Classes
+ ↓
+DAZ Studio
+```
+
+### Technology Stack
+
+**Backend:**
+- FastAPI (Web server)
+- Python command classes
+- Existing Vangard infrastructure
+
+**Frontend:**
+- Vanilla JavaScript (no framework dependencies)
+- CSS3 with custom properties for theming
+- HTML5 semantic markup
+
+### Design System
+
+**Color Palette:**
+- Primary: Indigo (#6366f1)
+- Success: Emerald Green (#10b981)
+- Warning: Amber (#f59e0b)
+- Error: Red (#ef4444)
+- Accent: Purple (#8b5cf6)
+
+**Visual Style:**
+- Dark theme by default (professional for 3D work)
+- Glassmorphism effects
+- Smooth transitions and animations
+- Icon-based visual language
+
+## Usage Guide
+
+### Selecting a Command
+
+1. Browse the command list in the left sidebar
+2. Use the search box to filter commands by name or description
+3. Click on a command to view its details and form
+
+### Filling Out Forms
+
+1. **Required Fields**: Marked with a red asterisk (*)
+2. **Optional Fields**: Can be left empty
+3. **Help Icons**: Click the ⓘ icon to see parameter descriptions
+4. **Array Inputs**: Enter comma-separated values for array parameters
+
+### Executing Commands
+
+1. Fill out the form with the required parameters
+2. Click the "Execute Command" button
+3. Watch the loading indicator while the command runs
+4. View the results in the output panel below the form
+
+### Viewing Output
+
+- **Success Output**: Displayed in green
+- **Error Output**: Displayed in red
+- **Info Output**: Displayed in blue
+- **Clear Output**: Click the trash icon to clear the output
+- **Collapse/Expand**: Click the arrow icon to toggle the output panel
+
+## API Documentation
+
+While using Pro mode, you can also access the interactive API documentation:
+
+- **Swagger UI**: http://127.0.0.1:8000/docs
+- **OpenAPI Schema**: http://127.0.0.1:8000/openapi.json
+
+## Customization
+
+### Adding Custom Icons
+
+Edit `/vangard/static/js/app.js` and update the `COMMAND_ICONS` object:
+
+```javascript
+const COMMAND_ICONS = {
+ 'your-command': '🎨', // Add your custom icon mapping
+ // ...
+};
+```
+
+### Changing Colors
+
+Edit `/vangard/static/css/styles.css` and modify the CSS variables in the `:root` selector:
+
+```css
+:root {
+ --color-primary: #your-color;
+ /* ... */
+}
+```
+
+### Custom Styling
+
+All styles are in `/vangard/static/css/styles.css`. The CSS is organized into sections:
+
+- Base Styles
+- Header
+- Sidebar
+- Main Content
+- Forms
+- Output
+- Utilities
+
+## Comparison with Other Modes
+
+| Feature | CLI | Interactive | GUI | Server | **Pro** |
+|---------|-----|-------------|-----|--------|---------|
+| Visual Interface | ❌ | ❌ | ✅ | ❌ | ✅ |
+| No Command Syntax | ❌ | ❌ | ✅ | ✅ | ✅ |
+| Form-based Input | ❌ | ❌ | ✅ | ✅ | ✅ |
+| Modern Design | ❌ | ❌ | ❌ | N/A | ✅ |
+| Real-time Feedback | ✅ | ✅ | ✅ | ✅ | ✅ |
+| Command Discovery | ❌ | ⚠️ | ⚠️ | ✅ | ✅ |
+| API Access | ❌ | ❌ | ❌ | ✅ | ✅ |
+| Web-based | ❌ | ❌ | ❌ | ✅ | ✅ |
+
+## Troubleshooting
+
+### Port Already in Use
+
+If port 8000 is already in use, you can modify the port in `/vangard/pro.py`:
+
+```python
+uvicorn.run(
+ "vangard.pro:app",
+ host="127.0.0.1",
+ port=8001, # Change to your preferred port
+ # ...
+)
+```
+
+### Static Files Not Loading
+
+Ensure the static files are properly included in your installation:
+
+```bash
+pip install -e . --force-reinstall
+```
+
+### Browser Compatibility
+
+Pro mode works best with modern browsers:
+- Chrome/Edge 90+
+- Firefox 88+
+- Safari 14+
+
+## Future Enhancements
+
+Potential features for future versions:
+
+- [ ] Command history and favorites
+- [ ] Batch command execution
+- [ ] WebSocket support for real-time output streaming
+- [ ] File upload widget for file path parameters
+- [ ] Command templates and presets
+- [ ] Multi-language support
+- [ ] Keyboard shortcuts
+- [ ] Desktop app packaging (via pywebview or Electron)
+
+## Contributing
+
+To contribute to Pro mode:
+
+1. Frontend code: `/vangard/static/`
+2. Backend code: `/vangard/pro.py`
+3. Follow the existing code style and design patterns
+4. Test in multiple browsers before submitting PRs
+
+## License
+
+Same as the main Vangard project - GNU Affero General Public License v3.0.
+
+---
+
+**Questions or Issues?**
+
+- Check the main [README.md](README.md) for general project information
+- Review [CLAUDE.md](CLAUDE.md) for development guidance
+- Open an issue on the project repository
diff --git a/PRO_VISUAL_REFERENCE.md b/PRO_VISUAL_REFERENCE.md
new file mode 100644
index 0000000..dd56779
--- /dev/null
+++ b/PRO_VISUAL_REFERENCE.md
@@ -0,0 +1,358 @@
+# Vangard Pro - Visual Reference
+
+## Interface Overview
+
+```
+╔════════════════════════════════════════════════════════════════════════╗
+║ 🎬 Vangard Pro 🔍 [Search...] 🌙 📚 ║
+╠═══════════════════╦════════════════════════════════════════════════════╣
+║ ║ ║
+║ Commands [38] ║ Welcome to Vangard Pro ║
+║ ─────────────── ║ ║
+║ ║ 🎨 (Floating Icon) ║
+║ 🔍 [________] ║ ║
+║ ║ Professional interface for DAZ Studio automation ║
+║ ┌─────────────┐ ║ ║
+║ │ 📦 action │ ║ ┌──────┐ ┌──────┐ ┌──────┐ ║
+║ │ Execute... │ ║ │ ⚡ │ │ 🎯 │ │ 🔄 │ ║
+║ └─────────────┘ ║ │ Fast │ │Visual│ │Real- │ ║
+║ ║ │ & │ │ Cmd │ │ time │ ║
+║ ┌─────────────┐ ║ │Intui-│ │Build-│ │Feed- │ ║
+║ │ 🎬 batch... │ ║ │ tive │ │ er │ │ back │ ║
+║ │ Batch re... │ ║ └──────┘ └──────┘ └──────┘ ║
+║ └─────────────┘ ║ ║
+║ ║ Select a command from the sidebar to get started║
+║ ┌─────────────┐ ║ ║
+║ │ 📷 create...│ ║ ║
+║ │ Create a... │ ║ ║
+║ └─────────────┘ ║ ║
+║ ║ ║
+║ ┌─────────────┐ ║ ║
+║ │ 💾 save... │ ║ ║
+║ │ Save sce... │ ║ ║
+║ └─────────────┘ ║ ║
+║ ⋮ ║ ║
+║ ║ ║
+║ ║ ║
+╚═══════════════════╩════════════════════════════════════════════════════╝
+```
+
+## Command Form View
+
+```
+╔════════════════════════════════════════════════════════════════════════╗
+║ 🎬 Vangard Pro 🔍 [load] 🌙 📚 ║
+╠═══════════════════╦════════════════════════════════════════════════════╣
+║ ║ ║
+║ Commands [38] ║ 📂 Load Scene ✕ ║
+║ ─────────────── ║ Load or merge DAZ Studio scene files ║
+║ ║ ───────────────────────────────────────────── ║
+║ 🔍 [load____] ║ ║
+║ ║ ┌───────────────────────────────────────────┐ ║
+║ ┌─────────────┐ ║ │ │ ║
+║ │ 📂 load-... │ ║ │ Scene File * ⓘ │ ║
+║ │ Load or ... │ ║ │ [________________________________] │ ║
+║ └─────────────┘ ║ │ │ ║
+║ (ACTIVE) ║ │ ☐ Merge with existing scene │ ║
+║ ║ │ │ ║
+║ ┌─────────────┐ ║ │ │ ║
+║ │ 📂 saveas │ ║ │ │ ║
+║ │ Make a c... │ ║ │ │ ║
+║ └─────────────┘ ║ │ [Reset] [ ▶ Execute Command]│ ║
+║ ║ └───────────────────────────────────────────┘ ║
+║ ║ ║
+║ ║ ┌───────────────────────────────────────────┐ ║
+║ ║ │ Output 🗑️ ▼ │ ║
+║ ║ ├───────────────────────────────────────────┤ ║
+║ ║ │ [14:23:45] Executing load-scene... │ ║
+║ ║ │ [14:23:46] ✓ Scene loaded successfully │ ║
+║ ║ │ │ ║
+║ ║ └───────────────────────────────────────────┘ ║
+║ ║ ║
+╚═══════════════════╩════════════════════════════════════════════════════╝
+
+ ┌─────────────────┐
+ │ ✓ Command │
+ │ executed │
+ │ successfully │
+ └─────────────────┘
+ (Toast Notification)
+```
+
+## Color Scheme Examples
+
+### Dark Theme (Default)
+```
+Header: ████ #1e293b (Slate)
+Sidebar: ████ #1e293b (Slate)
+Background:████ #0f172a (Dark Slate)
+Primary: ████ #6366f1 (Indigo)
+Success: ████ #10b981 (Green)
+Error: ████ #ef4444 (Red)
+Accent: ████ #8b5cf6 (Purple)
+Text: ████ #f1f5f9 (Light)
+```
+
+### Light Theme
+```
+Header: ████ #ffffff (White)
+Sidebar: ████ #ffffff (White)
+Background:████ #f8fafc (Very Light Blue)
+Primary: ████ #6366f1 (Indigo)
+Success: ████ #10b981 (Green)
+Error: ████ #ef4444 (Red)
+Accent: ████ #8b5cf6 (Purple)
+Text: ████ #0f172a (Dark)
+```
+
+## Component Examples
+
+### Command Card (Hover State)
+```
+┌──────────────────────────────┐
+│ 📦 action │ ← Icon + Name
+│ Execute the specified... │ ← Description (truncated)
+└──────────────────────────────┘
+
+Hover Effect:
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ← Indigo background
+┃ 📦 action ┃ ← White text
+┃ Execute the specified... ┃ ← Semi-transparent white
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ← Shadow + Slide right
+```
+
+### Form Field Types
+
+**Text Input:**
+```
+Label * ⓘ
+┌────────────────────────────┐
+│ Enter value here... │
+└────────────────────────────┘
+```
+
+**Number Input:**
+```
+Quantity * ⓘ
+┌────────────────────────────┐
+│ 42 ▲▼ │
+└────────────────────────────┘
+```
+
+**Checkbox:**
+```
+☑ Merge with existing scene
+```
+
+**Array Input:**
+```
+Files * ⓘ
+┌────────────────────────────┐
+│ file1.duf, file2.duf │
+└────────────────────────────┘
+Enter multiple values separated by commas
+```
+
+### Button States
+
+**Primary Button (Normal):**
+```
+┌──────────────────────┐
+│ ▶ Execute Command │ ← Indigo background
+└──────────────────────┘
+```
+
+**Primary Button (Hover):**
+```
+┏━━━━━━━━━━━━━━━━━━━━━━┓
+┃ ▶ Execute Command ┃ ← Darker indigo + shadow + lift
+┗━━━━━━━━━━━━━━━━━━━━━━┛
+```
+
+**Secondary Button:**
+```
+┌──────────────────────┐
+│ Reset │ ← Gray background
+└──────────────────────┘
+```
+
+### Output Panel
+
+**Collapsed:**
+```
+┌────────────────────────────────────┐
+│ Output 🗑️ ▶ │
+└────────────────────────────────────┘
+```
+
+**Expanded:**
+```
+┌────────────────────────────────────┐
+│ Output 🗑️ ▼ │
+├────────────────────────────────────┤
+│ [14:23:45] Executing command... │ ← Info (blue)
+│ [14:23:46] ✓ Success message │ ← Success (green)
+│ [14:23:47] ✕ Error message │ ← Error (red)
+│ │
+└────────────────────────────────────┘
+```
+
+### Toast Notifications
+
+**Success:**
+```
+┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃ │ ✓ Command executed ┃ ← Green left border
+┃ │ successfully ┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
+```
+
+**Error:**
+```
+┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃ │ ✕ Command failed ┃ ← Red left border
+┃ │ Try again ┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
+```
+
+**Info:**
+```
+┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃ │ ⓘ Loading commands... ┃ ← Blue left border
+┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
+```
+
+### Loading Overlay
+```
+╔════════════════════════════════════╗
+║ ║
+║ ◐ (Spinning) ║ ← Animated spinner
+║ ║
+║ Executing command... ║
+║ ║
+╚════════════════════════════════════╝
+ (Semi-transparent backdrop)
+```
+
+## Icon Mapping
+
+```
+Command Type Icon Example Commands
+─────────────────────────────────────────────
+Help/Info ❓ help
+Load/Open 📂 load-scene, load-merge
+Save 💾 save-scene, saveas
+Render 🎬 scene-render, batch-render
+Batch Operations 📦 batch-render
+Create/New ✨ create-light
+Camera 📷 create-cam, copy-camera
+Scene 🎭 scene-render
+Rotate 🔄 rotate-render
+Transform 🔀 transform-copy
+Copy 📋 copy-camera
+Paste 📌 paste-transform
+Group 🗂️ create-group
+Node 🔗 create-node
+Apply ✅ apply-pose
+Pose/Character 🧍 apply-pose
+Product/List 🛍️ listproducts
+Export 📤 export-scene
+Import 📥 import-assets
+Action/Execute ⚡ action
+Default 📦 (fallback for unmatched)
+```
+
+## Responsive Breakpoints
+
+### Desktop (> 768px)
+```
+┌─────────┬────────────────────────┐
+│ Sidebar │ Main Content │
+│ (320px) │ (flexible) │
+│ │ │
+└─────────┴────────────────────────┘
+```
+
+### Tablet/Mobile (< 768px)
+```
+┌────────────────────────────────┐
+│ Sidebar │
+│ (40vh max) │
+├────────────────────────────────┤
+│ Main Content │
+│ (scrollable) │
+│ │
+└────────────────────────────────┘
+```
+
+## Animation Examples
+
+### Card Hover
+- **Transform**: `translateX(4px)` (slide right)
+- **Duration**: `150ms`
+- **Easing**: `cubic-bezier(0.4, 0, 0.2, 1)`
+- **Background**: Color transition to primary
+- **Shadow**: Increase shadow depth
+
+### Button Hover
+- **Transform**: `translateY(-2px)` (lift up)
+- **Duration**: `150ms`
+- **Shadow**: Add shadow underneath
+- **Background**: Darken color
+
+### Toast Slide-In
+- **Initial**: `translateX(400px)` + `opacity: 0`
+- **Final**: `translateX(0)` + `opacity: 1`
+- **Duration**: `300ms`
+- **Easing**: `ease-out`
+
+### Loading Spinner
+- **Animation**: `rotate(360deg)`
+- **Duration**: `1s`
+- **Timing**: `linear`
+- **Iteration**: `infinite`
+
+## Typography Scale
+
+```
+Logo/Hero: 32px / 2rem (Bold, Gradient)
+Page Title: 30px / 1.875rem (Bold)
+Section Header: 24px / 1.5rem (Semi-bold)
+Card Title: 18px / 1.125rem (Semi-bold)
+Body Text: 16px / 1rem (Normal)
+Small Text: 14px / 0.875rem (Normal)
+Tiny Text: 12px / 0.75rem (Normal)
+Code/Output: 14px / 0.875rem (Monospace)
+```
+
+## Shadow Depth System
+
+```
+Level 1 (sm): 0 1px 2px rgba(0,0,0,0.05) [Subtle elements]
+Level 2 (md): 0 4px 6px rgba(0,0,0,0.1) [Cards, inputs]
+Level 3 (lg): 0 10px 15px rgba(0,0,0,0.1) [Modals, panels]
+Level 4 (xl): 0 20px 25px rgba(0,0,0,0.1) [Overlays, toasts]
+```
+
+## Border Radius System
+
+```
+Small: 6px / 0.375rem [Tags, badges]
+Medium: 8px / 0.5rem [Inputs, buttons]
+Large: 12px / 0.75rem [Cards]
+XLarge: 16px / 1rem [Panels, modals]
+```
+
+## Spacing System
+
+```
+XS: 4px / 0.25rem [Tight spacing]
+SM: 8px / 0.5rem [Related items]
+MD: 16px / 1rem [Standard spacing]
+LG: 24px / 1.5rem [Section gaps]
+XL: 32px / 2rem [Major sections]
+```
+
+---
+
+**Note**: This is a text-based representation. The actual interface has smooth animations, glassmorphism effects, and vibrant colors that create a professional, modern appearance.
diff --git a/UICLASS_GUIDE.md b/UICLASS_GUIDE.md
new file mode 100644
index 0000000..de488c9
--- /dev/null
+++ b/UICLASS_GUIDE.md
@@ -0,0 +1,220 @@
+# UIClass Field Guide - Special UI Widgets for Pro Mode
+
+The `uiclass` field in `config.yaml` allows you to specify special UI widgets for parameters in Vangard Pro mode.
+
+## Overview
+
+When you add a `uiclass` field to a command argument in `config.yaml`, the Pro interface will render a specialized UI widget instead of a plain text input.
+
+## Supported UIClass Values
+
+### `pick-folder`
+Renders a text input with a "Browse Folder" button for selecting directories.
+
+**Use case:** When the parameter expects a folder/directory path.
+
+**Example:**
+```yaml
+arguments:
+ - names: ["output_dir"]
+ dest: "output_dir"
+ type: "str"
+ required: true
+ help: "Output directory for rendered images"
+ uiclass: "pick-folder"
+```
+
+**Renders as:**
+```
+Output Dir * ⓘ
+┌────────────────────────────────┬──────────────────┐
+│ /path/to/output/directory │ 📁 Browse Folder │
+└────────────────────────────────┴──────────────────┘
+```
+
+---
+
+### `pick-file`
+Renders a text input with a "Browse File" button for selecting files.
+
+**Use case:** When the parameter expects a file path.
+
+**Example:**
+```yaml
+arguments:
+ - names: ["scene_file"]
+ dest: "scene_file"
+ type: "str"
+ required: true
+ help: "Path to the DAZ Studio scene file (.duf)"
+ uiclass: "pick-file"
+```
+
+**Renders as:**
+```
+Scene File * ⓘ
+┌────────────────────────────────┬────────────────┐
+│ /path/to/scene.duf │ 📄 Browse File │
+└────────────────────────────────┴────────────────┘
+```
+
+---
+
+## How It Works
+
+### In config.yaml
+
+Add the `uiclass` field to any argument:
+
+```yaml
+commands:
+ - name: "my-command"
+ class: "vangard.commands.MyCommand.MyCommand"
+ help: "Example command with special UI widgets"
+ arguments:
+ # Regular text input
+ - names: ["name"]
+ dest: "name"
+ type: "str"
+ required: true
+ help: "Name of the item"
+
+ # File picker widget
+ - names: ["input_file"]
+ dest: "input_file"
+ type: "str"
+ required: true
+ help: "Input file path"
+ uiclass: "pick-file"
+
+ # Folder picker widget
+ - names: ["-o", "--output"]
+ dest: "output"
+ type: "str"
+ default: null
+ help: "Output directory"
+ uiclass: "pick-folder"
+```
+
+### In the Pro Interface
+
+When a user selects this command:
+
+1. **Regular parameters** render as standard text inputs
+2. **Parameters with `uiclass: "pick-file"`** render with a file browser button
+3. **Parameters with `uiclass: "pick-folder"`** render with a folder browser button
+
+The user can either:
+- Type the path directly in the text field
+- Click the browse button to select via GUI (coming soon)
+
+### Technical Details
+
+The `uiclass` value is passed to the frontend via OpenAPI schema using the `x-uiclass` extension field. The JavaScript form generator recognizes these values and creates the appropriate UI widgets.
+
+## Current Implementation Status
+
+### ✅ Implemented
+- Backend support for reading `uiclass` from config.yaml
+- OpenAPI schema includes `x-uiclass` extension
+- Frontend recognizes and renders file/folder picker widgets
+- Styled buttons and layout for pickers
+
+### 🚧 Coming Soon
+- Native file/folder browser dialogs (using HTML5 File API)
+- Drag-and-drop support for file inputs
+- Path validation and autocomplete
+- Recently used paths history
+
+### 💡 Future UIClass Types (Planned)
+
+#### `pick-color`
+Color picker widget for color parameters
+```yaml
+uiclass: "pick-color"
+```
+
+#### `slider`
+Slider widget for numeric ranges
+```yaml
+uiclass: "slider"
+# Optional: Add min, max, step
+```
+
+#### `dropdown`
+Dropdown menu for enum/choice parameters
+```yaml
+uiclass: "dropdown"
+# Optional: Add choices list
+```
+
+#### `multiline`
+Textarea for long text input
+```yaml
+uiclass: "multiline"
+```
+
+#### `date-picker`
+Date selection widget
+```yaml
+uiclass: "date-picker"
+```
+
+## Example: Complete Command with UIClass
+
+Here's a complete example of a command using multiple uiclass values:
+
+```yaml
+commands:
+ - name: "batch-process"
+ class: "vangard.commands.BatchProcess.BatchProcess"
+ help: "Batch process multiple scene files"
+ arguments:
+ # Folder picker for input directory
+ - names: ["input_dir"]
+ dest: "input_dir"
+ type: "str"
+ required: true
+ help: "Directory containing scene files to process"
+ uiclass: "pick-folder"
+
+ # Folder picker for output directory
+ - names: ["-o", "--output"]
+ dest: "output"
+ type: "str"
+ required: true
+ help: "Output directory for processed files"
+ uiclass: "pick-folder"
+
+ # Regular text input for pattern
+ - names: ["-p", "--pattern"]
+ dest: "pattern"
+ type: "str"
+ default: "*.duf"
+ help: "File pattern to match (e.g., *.duf)"
+
+ # Boolean checkbox
+ - names: ["--recursive"]
+ dest: "recursive"
+ action: "store_true"
+ help: "Process subdirectories recursively"
+```
+
+## Benefits
+
+1. **Better UX**: Users can browse for files/folders instead of typing paths
+2. **Less Errors**: Reduces typos and invalid paths
+3. **Discoverability**: Makes it obvious which parameters expect paths
+4. **Platform Native**: Can use native file dialogs (when implemented)
+5. **Backwards Compatible**: CLI/server modes ignore uiclass, only Pro mode uses it
+
+## Notes
+
+- The `uiclass` field is **optional** and only affects the Pro web interface
+- Other modes (CLI, Interactive, Server) ignore this field
+- If `uiclass` is not specified, the parameter uses the default UI for its type
+- The text input is always available, so users can type paths if they prefer
+
+---
+
+**Ready to use!** Just add `uiclass` fields to your command arguments in `config.yaml` and they'll automatically render as special widgets in Pro mode.
diff --git a/config.yaml b/config.yaml
index e453326..30e0454 100644
--- a/config.yaml
+++ b/config.yaml
@@ -387,4 +387,79 @@ commands:
dest: "iray_config_file"
type: "str"
default: null
- help: "For target iray-server the configuration options file to use for iRay server/master configuration. Values in this file can be overridden by additional command line arguments"
\ No newline at end of file
+ help: "For target iray-server the configuration options file to use for iRay server/master configuration. Values in this file can be overridden by additional command line arguments"
+
+ - name: "save-viewport"
+ class: "vangard.commands.SaveViewportSU.SaveViewportSU"
+ help: "Capture and save the active viewport to image files for a range of frames"
+ arguments:
+ - names: ["-f", "--save-file"]
+ dest: "save_file"
+ type: "str"
+ required: true
+ help: "Output file path root (without extension). Frame number and extension will be appended."
+ - names: ["-c", "--view-camera"]
+ dest: "view_camera"
+ type: "str"
+ default: null
+ help: "Name of the camera to set in the viewport before capturing. If not specified, uses the current viewport camera."
+ - names: ["-e", "--image-format"]
+ dest: "image_format"
+ type: "str"
+ default: "png"
+ help: "Image file format/extension (e.g. png, jpg). Default is png."
+ - names: ["-s", "--frame-start"]
+ dest: "frame_start"
+ type: "int"
+ default: null
+ help: "First frame to capture. Defaults to the current scene frame."
+ - names: ["-n", "--frame-end"]
+ dest: "frame_end"
+ type: "int"
+ default: null
+ help: "End frame (exclusive) for capture range. Defaults to frame_start + 1 (single frame)."
+
+ - name: "face-render-lora"
+ class: "vangard.commands.FaceRenderLoraSU.FaceRenderLoraSU"
+ help: "Render a series of orbital camera angles around a figure's face for LoRA training image generation"
+ arguments:
+ - names: ["-o", "--output-dir"]
+ dest: "output_dir"
+ type: "str"
+ default: "y:/ai/charflow/output/face_lora/"
+ help: "Directory to write rendered images to."
+ - names: ["-p", "--file-prefix"]
+ dest: "file_prefix"
+ type: "str"
+ default: "face"
+ help: "Filename prefix for output images. Angle label and extension are appended."
+ - names: ["-W", "--wid"]
+ dest: "wid"
+ type: "int"
+ default: 768
+ help: "Render width in pixels."
+ - names: ["-H", "--height"]
+ dest: "height"
+ type: "int"
+ default: 768
+ help: "Render height in pixels."
+ - names: ["-d", "--camera-distance"]
+ dest: "camera_distance"
+ type: "int"
+ default: 80
+ help: "Camera distance from the face center in DAZ scene units (cm)."
+ - names: ["-y", "--face-y-offset"]
+ dest: "face_y_offset"
+ type: "int"
+ default: 5
+ help: "Vertical offset from the head bone origin toward eye/nose level."
+ - names: ["-n", "--node-label"]
+ dest: "node_label"
+ type: "str"
+ default: null
+ help: "Label of the figure node to target. If not specified, the first skeleton in the scene is used."
+ - names: ["-t", "--test-mode"]
+ dest: "test_mode"
+ action: "store_true"
+ default: false
+ help: "If set, show a message box at each angle instead of rendering."
\ No newline at end of file
diff --git a/config_reference.md b/config_reference.md
new file mode 100644
index 0000000..2b17c07
--- /dev/null
+++ b/config_reference.md
@@ -0,0 +1,26 @@
+# Command Line Utility Reference
+
+| Command Name | Description | Arguments |
+|---|---|---|
+| `action` | Execute the specified action with optional settings as a series of key=value pairs separated by commas | View 2 Arguments
Arg Name Description Type Optional action_classClass name of the action to execute str No -s, --settingsSettings for the action as a series of key=value pairs separated by commas str Yes View 2 Arguments
Arg Name Description Type Optional pose_fileAbsolute path to the pose file to be applied str No -t, --target-nodeLabel of the node to apply the pose to. If not specified, apply to the currently selected node. str Yes View 13 Arguments
Arg Name Description Type Optional -s, --scene-filesPattern of scene files to load, including glob support. See README for examples str Yes -o, --output-pathPath to directory where output files are to be written. If not specified, use the location of the scene file. str Yes -t, --targetTarget of the render. Allowed values are local-to-file, local-to-window, or iray-server-bridge str Yes -r, --resolutionResolution to render, overriding the resolution of the scene file, in WxH format (e.g. 1920x1080) str Yes -c, --camerasCameras to render for. Can be one of 'all_visible', 'viewport', or a pattern that maps to one or more visible cameras str Yes -j, --job-name-patternPattern to use for naming job names or render output files. In the pattern, %s refers to the scene name, %c the camera name, %f the frame number, and %r the render count str Yes -f, --framesFrames to render. Comma-separated list of frames that can include ranges and range patterns. See README for full detail and example. str Yes --iray-serverFor target iray-server the IP address or hostname of the iRay server/master to use. str Yes --iray-protocolSets the http protocol to use. Allowed values are http or https. str Yes --iray-portFor target iray-server the TCP port of the iRay server/master. str Yes --iray-userFor target iray-server the username to connect to the iRay server/master. Must be specified here or in config file specified by --iray-config-file str Yes --iray-passwordFor target iray-server the password to connect to the iRay server/master. Must be specified here or in config file specified by --iray-config-file str Yes --iray-config-fileFor target iray-server the configuration options file to use for iRay server/master configuration. Values in this file can be overridden by additional command line arguments str Yes View 2 Arguments
Arg Name Description Type Optional -s, --source-cameraCamera to copy from str Yes -t, --target-cameraCamera to copy to (optional) str Yes View 3 Arguments
Arg Name Description Type Optional cam_nameName of the camera str No cam_classClass (type) of camera str No -f, --focusIf true, turn DOF on the new camera flag (boolean) Yes View 1 Argument
Arg Name Description Type Optional group_nameName of the new group. str No View 2 Arguments
Arg Name Description Type Optional source_nodeLabel of the object to be dropped str No target_nodeLabel of the object to be dropped onto str No View 8 Arguments
Arg Name Description Type Optional -o, --output-dirDirectory to write rendered images to. str Yes -p, --file-prefixFilename prefix for output images. Angle label and extension are appended. str Yes -W, --widRender width in pixels. int Yes -H, --heightRender height in pixels. int Yes -d, --camera-distanceCamera distance from the face center in DAZ scene units (cm). int Yes -y, --face-y-offsetVertical offset from the head bone origin toward eye/nose level. int Yes -n, --node-labelLabel of the figure node to target. If not specified, the first skeleton in the scene is used. str Yes -t, --test-modeIf set, show a message box at each angle instead of rendering. flag (boolean) Yes View 1 Argument
Arg Name Description Type Optional command_nameThe specific command to get help for. str Yes View 2 Arguments
Arg Name Description Type Optional -n, --numberIf specified, replace the numeric suffix at the end of the scene file name with the given number (or add it if one doesn't exist). int Yes -i, --incrementIf specified, increment the scene file suffix by the given amount (default = 1). int Yes View 1 Argument
Arg Name Description Type Optional output_filePath to save output to str No View 2 Arguments
Arg Name Description Type Optional scene_filePath to scene file to load str No -m, --mergeIf specified, merge the new scene into the current scene instead of replacing. flag (boolean) Yes View 2 Arguments
Arg Name Description Type Optional scene_filesA glob pattern that identifies the scene files to load. Each scene file should include a single model which has the hair and clothing applied str No lora_trainer_configPath to config file defining the render matrix of shots x poses x expressions str No View 3 Arguments
Arg Name Description Type Optional -t, --target-fileFile to write output information to str Yes -n, --node-contextIf specified, present the output in the context of nodes. Otherwise the default is to present output in the context of products. flag (boolean) Yes -s, --selected-onlyOnly identify products for the currently selected node. flag (boolean) Yes View 2 Arguments
Arg Name Description Type Optional object_nameLabel of the object to rotate prior to rendering str No lowerStarting rotation (in degrees) int Yes View 6 Arguments
Arg Name Description Type Optional object_nameLabel of the object to rotate prior to rendering str No lowerStarting rotation (in degrees) int Yes upperEnding rotation (in degrees). rotation-start must be smaller than rotation-end int Yes slicesHow many rotations between start and end to rotate. If set to zero, only render, do not rotate. int Yes -o, --output-fileAbsolute path to directory to render images in. Default is to generate one from the scene file name. str Yes -s, --skip-renderFlag whether to render or the rotated character or not. Setting this flag skips the rendering step. flag (boolean) Yes View 1 Argument
Arg Name Description Type Optional target_dirLocation to save content item to str No View 3 Arguments
Arg Name Description Type Optional subset_fileLocation to save content item to str No -d, --directoryDirectory to store the subset file in str Yes -c, --categoryCategory to associate subset with str Yes View 5 Arguments
Arg Name Description Type Optional -f, --save-fileOutput file path root (without extension). Frame number and extension will be appended. str No -c, --view-cameraName of the camera to set in the viewport before capturing. If not specified, uses the current viewport camera. str Yes -e, --image-formatImage file format/extension (e.g. png, jpg). Default is png. str Yes -s, --frame-startFirst frame to capture. Defaults to the current scene frame. int Yes -n, --frame-endEnd frame (exclusive) for capture range. Defaults to frame_start + 1 (single frame). int Yes View 1 Argument
Arg Name Description Type Optional save_filePath to save a copy of the current scene file to str No View 2 Arguments
Arg Name Description Type Optional -s, --scene-fileName of the scene file to load. str Yes -o, --output-filePath to output file to save to str Yes View 6 Arguments
Arg Name Description Type Optional source_nodeNode to translate from str No target_nodeNode to translate to str No -r, --rotateApply the rotation transform flag (boolean) Yes -t, --translateApply the translation transform flag (boolean) Yes -s, --scaleApply the scaling transform flag (boolean) Yes -a, --allApply rotation, translation, and scaling trasforms flag (boolean) Yes
Static files not found. Please ensure the static/ directory exists.
+API documentation available at: /docs
+ + + """) + + # Override the root to redirect to UI + from fastapi.responses import RedirectResponse + + @app.get("/pro", response_class=HTMLResponse, include_in_schema=False) + async def redirect_to_ui(): + """Redirect /pro to /ui for convenience.""" + return RedirectResponse(url="/ui") + + return app + +# Create the app instance +app = create_pro_app() + +def main(): + """ + Main entry point for Vangard Pro mode. + Launches the FastAPI server with the Pro web interface. + """ + print("=" * 60) + print("🚀 Vangard Pro - Professional Interface") + print("=" * 60) + print() + print("Starting server...") + print() + print("📱 Pro Interface: http://127.0.0.1:8000/ui") + print("📚 API Docs: http://127.0.0.1:8000/docs") + print("💡 Health Check: http://127.0.0.1:8000/") + print() + print("Press Ctrl+C to stop the server") + print("=" * 60) + + uvicorn.run( + "vangard.pro:app", + host="127.0.0.1", + port=8000, + reload=False, + log_level="info" + ) + +if __name__ == "__main__": + main() diff --git a/vangard/scripts/CreateGroupNodeSU.dsa b/vangard/scripts/CreateGroupNodeSU.dsa index 798b8eb..fa32d01 100644 --- a/vangard/scripts/CreateGroupNodeSU.dsa +++ b/vangard/scripts/CreateGroupNodeSU.dsa @@ -15,7 +15,7 @@ * along with this program. If not, seeProfessional interface for DAZ Studio automation
+Select a command from the sidebar to get started
+No commands available
This command has no parameters
'; + } else { + formFields.innerHTML = command.parameters.map(param => + generateFormField(param) + ).join(''); + } + + // Hide output panel initially + document.getElementById('outputPanel').style.display = 'none'; +} + +function generateFormField(param) { + const isRequired = param.required; + const fieldId = `field_${param.name}`; + + let inputHtml = ''; + + // Check for special UI classes first + if (param.uiclass === 'pick-folder' || param.uiclass === 'pick-file') { + const buttonText = param.uiclass === 'pick-folder' ? '📁 Browse Folder' : '📄 Browse File'; + inputHtml = ` +