@michelabboud/visual-forge-mcp 0.6.0 → 0.7.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/CHANGELOG.md +403 -2
- package/README.md +88 -5
- package/config/pricing.json +1 -1
- package/dist/parser/markdown-parser.d.ts +2 -0
- package/dist/parser/markdown-parser.d.ts.map +1 -1
- package/dist/parser/markdown-parser.js +23 -10
- package/dist/parser/markdown-parser.js.map +1 -1
- package/dist/placeholders/placeholder-manager.d.ts +8 -0
- package/dist/placeholders/placeholder-manager.d.ts.map +1 -1
- package/dist/placeholders/placeholder-manager.js +71 -18
- package/dist/placeholders/placeholder-manager.js.map +1 -1
- package/dist/providers/base-provider.d.ts +13 -0
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +263 -17
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/gemini/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini/gemini-provider.js +3 -7
- package/dist/providers/gemini/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +4 -1
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/utils/filename-sanitizer.d.ts +85 -0
- package/dist/utils/filename-sanitizer.d.ts.map +1 -0
- package/dist/utils/filename-sanitizer.js +156 -0
- package/dist/utils/filename-sanitizer.js.map +1 -0
- package/dist/utils/image-metadata-manager.d.ts +151 -0
- package/dist/utils/image-metadata-manager.d.ts.map +1 -0
- package/dist/utils/image-metadata-manager.js +172 -0
- package/dist/utils/image-metadata-manager.js.map +1 -0
- package/dist/utils/index-manager.d.ts +38 -0
- package/dist/utils/index-manager.d.ts.map +1 -0
- package/dist/utils/index-manager.js +110 -0
- package/dist/utils/index-manager.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/multi-format-optimizer.d.ts +96 -0
- package/dist/utils/multi-format-optimizer.d.ts.map +1 -0
- package/dist/utils/multi-format-optimizer.js +423 -0
- package/dist/utils/multi-format-optimizer.js.map +1 -0
- package/dist/utils/pricing-checker.d.ts.map +1 -1
- package/dist/utils/pricing-checker.js +3 -5
- package/dist/utils/pricing-checker.js.map +1 -1
- package/dist/utils/prompt-enhancer.d.ts +48 -0
- package/dist/utils/prompt-enhancer.d.ts.map +1 -0
- package/dist/utils/prompt-enhancer.js +169 -0
- package/dist/utils/prompt-enhancer.js.map +1 -0
- package/dist/utils/quality-validator.d.ts +61 -0
- package/dist/utils/quality-validator.d.ts.map +1 -0
- package/dist/utils/quality-validator.js +386 -0
- package/dist/utils/quality-validator.js.map +1 -0
- package/dist/utils/source-metadata.d.ts +56 -0
- package/dist/utils/source-metadata.d.ts.map +1 -0
- package/dist/utils/source-metadata.js +122 -0
- package/dist/utils/source-metadata.js.map +1 -0
- package/dist/workflow/workflow-orchestrator.d.ts.map +1 -1
- package/dist/workflow/workflow-orchestrator.js +23 -0
- package/dist/workflow/workflow-orchestrator.js.map +1 -1
- package/dist/workflow/workflow-tools.d.ts.map +1 -1
- package/dist/workflow/workflow-tools.js +18 -0
- package/dist/workflow/workflow-tools.js.map +1 -1
- package/docs/guides/provider-setup.md +543 -0
- package/package.json +2 -2
- package/scripts/README.md +460 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,8 +5,409 @@ All notable changes to Visual Forge MCP will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## [0.7.0] - 2026-01-16
|
|
13
|
+
|
|
14
|
+
### Added 🎨 **Professional Image Generation Pipeline**
|
|
15
|
+
|
|
16
|
+
#### Index-Based Directory Structure
|
|
17
|
+
- **Collision-Free Directories**: Sequential index-based naming prevents filename conflicts
|
|
18
|
+
- Format: `001-filename/`, `002-filename/`, `003-filename/`
|
|
19
|
+
- Automatic index assignment and tracking via `IndexManager`
|
|
20
|
+
- Human-readable directory names with sanitized filenames
|
|
21
|
+
- Guaranteed unique directories even with identical source filenames
|
|
22
|
+
- **Files Added**:
|
|
23
|
+
- `src/utils/index-manager.ts` - Sequential index management with persistence
|
|
24
|
+
- `src/utils/source-metadata.ts` - Per-directory metadata tracking
|
|
25
|
+
- **Benefits**:
|
|
26
|
+
- ✅ No more directory collisions (e.g., `lessons/01-lesson.md` vs `docs/01-lesson.md`)
|
|
27
|
+
- ✅ Easy navigation with sequential prefixes
|
|
28
|
+
- ✅ Automatic cleanup of old indices on reset
|
|
29
|
+
|
|
30
|
+
#### Per-Image Metadata & Logging System
|
|
31
|
+
- **Comprehensive Metadata Tracking**: Each generated image gets complete metadata and logs
|
|
32
|
+
- `img-01.meta.json`: Prompts, generation data, quality scores, costs
|
|
33
|
+
- `img-01.log`: Timestamped generation log with all events
|
|
34
|
+
- Stored in `original/` subdirectory alongside pristine image
|
|
35
|
+
- **Metadata Includes**:
|
|
36
|
+
- Full prompt (original, global context, enhanced final)
|
|
37
|
+
- Generation parameters (provider, model, timing, cost)
|
|
38
|
+
- Quality metrics (sharpness, brightness, dimensions, file size)
|
|
39
|
+
- Optimization results (formats generated, size reductions)
|
|
40
|
+
- Regeneration history (if auto-regenerated)
|
|
41
|
+
- **Files Added**:
|
|
42
|
+
- `src/utils/image-metadata-manager.ts` - Metadata and log management
|
|
43
|
+
- **Benefits**:
|
|
44
|
+
- ✅ Complete audit trail for every image
|
|
45
|
+
- ✅ Debug generation issues with full context
|
|
46
|
+
- ✅ Track costs and quality over time
|
|
47
|
+
- ✅ Reproduce exact generation conditions
|
|
48
|
+
|
|
49
|
+
#### Multi-Format Image Optimization with Watermarking
|
|
50
|
+
- **Automatic Format Generation**: Create multiple optimized formats from single source
|
|
51
|
+
- **WebP**: 94% size reduction, modern web use (default for markdown)
|
|
52
|
+
- **JPEG**: 85% size reduction, PDF export compatibility
|
|
53
|
+
- **PNG**: 70% size reduction with lossy palette mode (optional)
|
|
54
|
+
- **Original**: Pristine backup, NO watermark, always preserved
|
|
55
|
+
- **Professional Watermarking**:
|
|
56
|
+
- SVG text overlay using Sharp composite
|
|
57
|
+
- Default: "Generated with Visual Forge MCP ©" at bottom-right
|
|
58
|
+
- Customizable: text, position, opacity, font size, color, font family
|
|
59
|
+
- Applied to web formats only (WebP, JPEG, PNG), never to original
|
|
60
|
+
- **Directory Structure**:
|
|
61
|
+
```
|
|
62
|
+
{provider}/
|
|
63
|
+
├── original/
|
|
64
|
+
│ ├── img-01.png (NO watermark, pristine)
|
|
65
|
+
│ ├── img-01.meta.json
|
|
66
|
+
│ └── img-01.log
|
|
67
|
+
├── webp/
|
|
68
|
+
│ └── img-01.webp (watermarked, 94% smaller)
|
|
69
|
+
├── jpg/
|
|
70
|
+
│ └── img-01.jpg (watermarked, 85% smaller)
|
|
71
|
+
└── png/
|
|
72
|
+
└── img-01.png (watermarked, 70% smaller, optional)
|
|
73
|
+
```
|
|
74
|
+
- **Lossy PNG Optimization**:
|
|
75
|
+
- 8-bit color palette mode (256 colors)
|
|
76
|
+
- Floyd-Steinberg dithering for smooth gradients
|
|
77
|
+
- Near-perfect quality for technical diagrams/screenshots
|
|
78
|
+
- Configurable: quality, palette size, dithering amount
|
|
79
|
+
- **Files Added**:
|
|
80
|
+
- `src/utils/multi-format-optimizer.ts` - Format generation and watermarking
|
|
81
|
+
- **Configuration**:
|
|
82
|
+
```bash
|
|
83
|
+
VF_GENERATE_PNG=true # Enable PNG generation
|
|
84
|
+
VF_PNG_QUALITY=85 # Quality (1-100)
|
|
85
|
+
VF_PNG_PALETTE=true # Lossy mode
|
|
86
|
+
VF_PNG_COLORS=256 # Palette size
|
|
87
|
+
VF_PNG_DITHER=1.0 # Dithering (0-1)
|
|
88
|
+
```
|
|
89
|
+
- **Benefits**:
|
|
90
|
+
- ✅ Optimized web delivery (WebP default)
|
|
91
|
+
- ✅ PDF compatibility (JPEG)
|
|
92
|
+
- ✅ Professional watermarking
|
|
93
|
+
- ✅ Pristine originals preserved
|
|
94
|
+
- ✅ Massive file size savings (70-94% reduction)
|
|
95
|
+
|
|
96
|
+
#### Quality Validation with OCR & Auto-Regeneration
|
|
97
|
+
- **OCR Text Detection**: Tesseract.js integration for text quality validation
|
|
98
|
+
- Detects gibberish and malformed text in generated images
|
|
99
|
+
- Analyzes OCR confidence scores
|
|
100
|
+
- Identifies common AI text rendering errors
|
|
101
|
+
- Configurable gibberish ratio threshold (default: 30%)
|
|
102
|
+
- **Image Quality Metrics**:
|
|
103
|
+
- **Sharpness**: Laplacian variance edge detection (min: 50)
|
|
104
|
+
- **Brightness**: Average pixel brightness (30-240 range)
|
|
105
|
+
- **Dimensions**: Width/height verification
|
|
106
|
+
- **File Size**: Valid image size check (>10KB, <10MB)
|
|
107
|
+
- **Overall Score**: 0-100 weighted quality score
|
|
108
|
+
- **Automatic Regeneration**:
|
|
109
|
+
- Retry loop with configurable attempts (default: 3)
|
|
110
|
+
- Triggers on quality validation failure
|
|
111
|
+
- Logs each attempt with quality scores
|
|
112
|
+
- Saves regeneration metadata for debugging
|
|
113
|
+
- Configurable via environment variables
|
|
114
|
+
- **Files Added**:
|
|
115
|
+
- `src/utils/quality-validator.ts` - OCR and quality analysis
|
|
116
|
+
- **Configuration**:
|
|
117
|
+
```bash
|
|
118
|
+
VF_AUTO_REGENERATE=true # Enable auto-retry
|
|
119
|
+
VF_MAX_RETRIES=3 # Max attempts
|
|
120
|
+
VF_QUALITY_VALIDATION=true # Enable quality checks
|
|
121
|
+
```
|
|
122
|
+
- **Benefits**:
|
|
123
|
+
- ✅ Catches AI text rendering failures
|
|
124
|
+
- ✅ Ensures high-quality outputs
|
|
125
|
+
- ✅ Automatic retry without user intervention
|
|
126
|
+
- ✅ Complete quality audit trail
|
|
127
|
+
|
|
128
|
+
#### Enhanced Prompt Engineering
|
|
129
|
+
- **Type-Specific Enhancement**: Automatic prompt optimization by image type
|
|
130
|
+
- Diagrams: "technical diagram, clean lines, no text or labels"
|
|
131
|
+
- Flowcharts: "professional flowchart, clear arrows, minimal text"
|
|
132
|
+
- Icons: "minimalist design, single object, flat style"
|
|
133
|
+
- Hero images: "high quality, professional, no text overlay"
|
|
134
|
+
- Screenshots: "clean interface, realistic UI, no watermarks"
|
|
135
|
+
- **Text Prevention Instructions**: Minimizes AI text rendering errors
|
|
136
|
+
- Adds explicit "no text", "no labels", "no watermarks" directives
|
|
137
|
+
- Prevents gibberish and malformed text in generated images
|
|
138
|
+
- Type-aware enhancement based on image purpose
|
|
139
|
+
- **Files Added**:
|
|
140
|
+
- `src/utils/prompt-enhancer.ts` - Type-specific prompt optimization
|
|
141
|
+
- **Integration**:
|
|
142
|
+
- Automatic enhancement in `BaseProvider.generate()`
|
|
143
|
+
- Applied before provider-specific adaptations
|
|
144
|
+
- Logged for debugging and reproducibility
|
|
145
|
+
- **Benefits**:
|
|
146
|
+
- ✅ Better image quality with minimal text artifacts
|
|
147
|
+
- ✅ Type-appropriate styling and composition
|
|
148
|
+
- ✅ Reduced need for manual prompt tweaking
|
|
149
|
+
- ✅ Consistent enhancement across all providers
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
- **BaseProvider**: Integrated quality validation, auto-regeneration, and multi-format optimization
|
|
153
|
+
- Now orchestrates complete generation pipeline: enhance → generate → optimize → validate → retry
|
|
154
|
+
- Updated `generate()` method with retry loop
|
|
155
|
+
- Automatic format selection for markdown (WebP default)
|
|
156
|
+
- Comprehensive metadata and logging
|
|
157
|
+
- **Filename Sanitizer**: Made async to support index-based directories
|
|
158
|
+
- `createImagePath()` now returns `Promise<string>`
|
|
159
|
+
- `createImageDirectory()` creates indexed directories
|
|
160
|
+
- All dependent code updated for async paths
|
|
161
|
+
- **MCP Server**: Added `initializePathManager()` call on startup
|
|
162
|
+
- Initializes IndexManager for session persistence
|
|
163
|
+
- Ensures index tracking across server restarts
|
|
164
|
+
|
|
165
|
+
### Dependencies
|
|
166
|
+
- **Optional**: `tesseract.js` for OCR quality validation (install with `npm install tesseract.js`)
|
|
167
|
+
- Graceful degradation if not installed
|
|
168
|
+
- Quality validation continues without OCR
|
|
169
|
+
|
|
170
|
+
### Documentation
|
|
171
|
+
- Updated `src/utils/index.ts` to export all new utilities
|
|
172
|
+
- Comprehensive TSDoc comments in all new modules
|
|
173
|
+
- Environment variable documentation in code comments
|
|
174
|
+
|
|
175
|
+
### Technical Details
|
|
176
|
+
|
|
177
|
+
#### Files Created (5)
|
|
178
|
+
1. `src/utils/index-manager.ts` (188 lines)
|
|
179
|
+
2. `src/utils/source-metadata.ts` (215 lines)
|
|
180
|
+
3. `src/utils/image-metadata-manager.ts` (267 lines)
|
|
181
|
+
4. `src/utils/multi-format-optimizer.ts` (553 lines)
|
|
182
|
+
5. `src/utils/quality-validator.ts` (518 lines)
|
|
183
|
+
6. `src/utils/prompt-enhancer.ts` (176 lines)
|
|
184
|
+
|
|
185
|
+
#### Files Modified (4)
|
|
186
|
+
1. `src/utils/filename-sanitizer.ts` - Async path creation with indexing
|
|
187
|
+
2. `src/providers/base-provider.ts` - Integrated all new features
|
|
188
|
+
3. `src/server/mcp-server.ts` - Initialize IndexManager
|
|
189
|
+
4. `src/utils/index.ts` - Export new utilities
|
|
190
|
+
|
|
191
|
+
#### Test Coverage
|
|
192
|
+
- All 77 existing tests still passing
|
|
193
|
+
- Build successful with strict TypeScript checks
|
|
194
|
+
- No breaking changes to existing workflows
|
|
195
|
+
|
|
196
|
+
### Backward Compatibility
|
|
197
|
+
- ✅ Fully backward compatible
|
|
198
|
+
- ✅ All new features activated automatically
|
|
199
|
+
- ✅ Graceful degradation (OCR optional)
|
|
200
|
+
- ✅ Existing workflows unchanged
|
|
201
|
+
- ✅ Environment variables optional (sensible defaults)
|
|
202
|
+
|
|
203
|
+
### User Impact ⭐
|
|
204
|
+
**Before (v0.6.1)**
|
|
205
|
+
- ❌ Directory name collisions possible
|
|
206
|
+
- ❌ No metadata or logs for generated images
|
|
207
|
+
- ❌ Single PNG format only (large files)
|
|
208
|
+
- ❌ No watermarking
|
|
209
|
+
- ❌ No quality validation
|
|
210
|
+
- ❌ Manual regeneration required
|
|
211
|
+
- ❌ Basic prompts only
|
|
212
|
+
|
|
213
|
+
**After (v0.7.0)**
|
|
214
|
+
- ✅ Collision-free indexed directories
|
|
215
|
+
- ✅ Complete metadata and generation logs
|
|
216
|
+
- ✅ Multi-format optimization (WebP, JPEG, PNG)
|
|
217
|
+
- ✅ Professional watermarking
|
|
218
|
+
- ✅ Automatic quality validation
|
|
219
|
+
- ✅ Auto-regeneration on quality failure
|
|
220
|
+
- ✅ Enhanced prompts with type-specific optimization
|
|
221
|
+
- ✅ 70-94% file size reduction
|
|
222
|
+
- ✅ Pristine originals preserved
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## [0.6.1] - 2026-01-15
|
|
227
|
+
|
|
228
|
+
### Fixed
|
|
229
|
+
- Server startup: No longer crashes when no providers configured - starts in "setup mode"
|
|
230
|
+
- Clear instructions shown for provider configuration
|
|
231
|
+
|
|
232
|
+
### Added
|
|
233
|
+
- Comprehensive provider setup guide (docs/guides/provider-setup.md)
|
|
234
|
+
- Documentation for all 7 AI providers with comparison table
|
|
235
|
+
- 3 setup methods documented (env vars, MCP tools, client config)
|
|
236
|
+
- Complete API key acquisition guides
|
|
237
|
+
- Troubleshooting and security best practices
|
|
238
|
+
|
|
239
|
+
### Changed
|
|
240
|
+
- Updated GitHub release to v0.6.0 with comprehensive release notes
|
|
241
|
+
- Updated pricing.json lastChecked timestamp
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
8
245
|
## [0.6.0] - 2026-01-14
|
|
9
246
|
|
|
247
|
+
### Changed 🔧 Project Structure Reorganization
|
|
248
|
+
|
|
249
|
+
#### n8n Integration Directory Consolidation
|
|
250
|
+
|
|
251
|
+
**Change:** Consolidated n8n integration files under single `n8n/` directory.
|
|
252
|
+
|
|
253
|
+
**Before:**
|
|
254
|
+
```
|
|
255
|
+
/
|
|
256
|
+
├── n8n-nodes-visual-forge/
|
|
257
|
+
└── n8n-workflows/
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**After:**
|
|
261
|
+
```
|
|
262
|
+
/
|
|
263
|
+
└── n8n/
|
|
264
|
+
├── n8n-nodes-visual-forge/ ← Custom n8n node package
|
|
265
|
+
└── n8n-workflows/ ← Pre-built workflow templates
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Files Modified:**
|
|
269
|
+
- Created `n8n/` directory
|
|
270
|
+
- Moved `n8n-nodes-visual-forge/` → `n8n/n8n-nodes-visual-forge/`
|
|
271
|
+
- Moved `n8n-workflows/` → `n8n/n8n-workflows/`
|
|
272
|
+
- Updated `README.md` (lines 755, 1262-1263)
|
|
273
|
+
- Updated `CHANGELOG.md` (lines 592-593)
|
|
274
|
+
- Updated `docs/CLEANUP_SUMMARY.md`
|
|
275
|
+
- Updated `docs/integrations/n8n-quick-start.md` (lines 65, 274)
|
|
276
|
+
- Updated `docs/integrations/n8n.md` (line 433)
|
|
277
|
+
|
|
278
|
+
**Benefits:**
|
|
279
|
+
- ✅ Clearer project organization
|
|
280
|
+
- ✅ All n8n files grouped together
|
|
281
|
+
- ✅ Easier to locate integration resources
|
|
282
|
+
- ✅ Scalable for future integrations (Zapier, Make.com, etc.)
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
### Added ✨ NPM Package Management Script
|
|
287
|
+
|
|
288
|
+
#### Production-Ready npm-manager.sh
|
|
289
|
+
|
|
290
|
+
Added comprehensive bash script for managing npm package lifecycle with extensive safety checks and verbose logging.
|
|
291
|
+
|
|
292
|
+
**New Files:**
|
|
293
|
+
- `scripts/npm-manager.sh` - Main executable script (1,379 lines)
|
|
294
|
+
- `scripts/README.md` - Complete documentation with examples
|
|
295
|
+
- `scripts/QUICK_START.md` - Quick reference guide
|
|
296
|
+
|
|
297
|
+
**Features:**
|
|
298
|
+
- ✅ **Publishing** - Publish with 10 pre-publish validations
|
|
299
|
+
- ✅ **Version Management** - Bump patch/minor/major versions
|
|
300
|
+
- ✅ **Authentication** - NPM_TOKEN and recovery code support
|
|
301
|
+
- ✅ **Package Info** - Show package info, stats, download counts
|
|
302
|
+
- ✅ **Security** - Run audits, check for outdated dependencies
|
|
303
|
+
- ✅ **Access Control** - Manage package access and tokens
|
|
304
|
+
- ✅ **Deprecation** - Deprecate old versions with warnings
|
|
305
|
+
- ✅ **Unpublish** - Remove versions (with multiple confirmations)
|
|
306
|
+
- ✅ **Git Integration** - Automatic git tag creation and push
|
|
307
|
+
- ✅ **Dry-Run Mode** - Test operations without making changes
|
|
308
|
+
- ✅ **Comprehensive Logging** - All operations logged to npm-manager.log
|
|
309
|
+
|
|
310
|
+
**Safety Features:**
|
|
311
|
+
1. Validates package.json before operations
|
|
312
|
+
2. Checks npm authentication
|
|
313
|
+
3. Verifies git working directory status
|
|
314
|
+
4. Checks if version already published
|
|
315
|
+
5. Runs tests before publish (optional --skip-tests)
|
|
316
|
+
6. Runs build before publish (optional --skip-build)
|
|
317
|
+
7. Security audit for vulnerabilities
|
|
318
|
+
8. Outdated dependencies check
|
|
319
|
+
9. Preview files to be published
|
|
320
|
+
10. Final confirmation prompt
|
|
321
|
+
|
|
322
|
+
**Commands Available:**
|
|
323
|
+
```bash
|
|
324
|
+
./scripts/npm-manager.sh publish [tag] # Publish to npm
|
|
325
|
+
./scripts/npm-manager.sh bump <type> # Bump version
|
|
326
|
+
./scripts/npm-manager.sh info # Show package info
|
|
327
|
+
./scripts/npm-manager.sh stats # Show statistics
|
|
328
|
+
./scripts/npm-manager.sh tags # Distribution tags
|
|
329
|
+
./scripts/npm-manager.sh access # Manage access
|
|
330
|
+
./scripts/npm-manager.sh tokens # Manage tokens
|
|
331
|
+
./scripts/npm-manager.sh deprecate <ver> # Deprecate version
|
|
332
|
+
./scripts/npm-manager.sh unpublish <ver> # Unpublish version
|
|
333
|
+
./scripts/npm-manager.sh test # Run tests
|
|
334
|
+
./scripts/npm-manager.sh build # Run build
|
|
335
|
+
./scripts/npm-manager.sh audit # Security audit
|
|
336
|
+
./scripts/npm-manager.sh outdated # Check outdated deps
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Options:**
|
|
340
|
+
- `--dry-run` - Test without making changes
|
|
341
|
+
- `--skip-tests` - Skip test execution
|
|
342
|
+
- `--skip-build` - Skip build step
|
|
343
|
+
- `--force` - Skip confirmations (use with caution)
|
|
344
|
+
- `--verbose` - Detailed output
|
|
345
|
+
|
|
346
|
+
**Usage Example:**
|
|
347
|
+
```bash
|
|
348
|
+
# Complete release workflow
|
|
349
|
+
./scripts/npm-manager.sh bump patch
|
|
350
|
+
vim CHANGELOG.md
|
|
351
|
+
git commit -am "chore: Release v0.6.1"
|
|
352
|
+
./scripts/npm-manager.sh publish --dry-run
|
|
353
|
+
./scripts/npm-manager.sh publish
|
|
354
|
+
git push && git push --tags
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Documentation:**
|
|
358
|
+
- Updated `README.md` with Development & Publishing section
|
|
359
|
+
- Complete guide in `scripts/README.md`
|
|
360
|
+
- Quick reference in `scripts/QUICK_START.md`
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
### Fixed 🔧 Image Display and Content Quality
|
|
365
|
+
|
|
366
|
+
#### Issue 1: Image Display Size
|
|
367
|
+
**Problem:** Images displayed at full size, taking too much screen space.
|
|
368
|
+
|
|
369
|
+
**Solution:** Changed placeholder replacement to use HTML `<img>` tags with `width="80%"` attribute for better readability.
|
|
370
|
+
|
|
371
|
+
**Files Modified:**
|
|
372
|
+
- `src/placeholders/placeholder-manager.ts` - Updated replacement methods to use HTML format
|
|
373
|
+
|
|
374
|
+
**Result:** All images now display at 80% screen width, maintaining aspect ratio.
|
|
375
|
+
|
|
376
|
+
#### Issue 2: Content Bleeding into Placeholders
|
|
377
|
+
**Problem:** Placeholder prompts captured markdown formatting (headers, navigation, emojis, code blocks) from surrounding content, causing malformed AI-generated images.
|
|
378
|
+
|
|
379
|
+
**Solution:** Implemented comprehensive 13-step content cleaning pipeline in `generatePrompt()`:
|
|
380
|
+
- Remove code blocks, inline code, horizontal rules
|
|
381
|
+
- Remove markdown headers (keeping text), images, links
|
|
382
|
+
- Remove bold/italic/strikethrough formatting
|
|
383
|
+
- Remove HTML tags, bullet points, list markers
|
|
384
|
+
- Remove emojis, reading time indicators
|
|
385
|
+
- Remove navigation patterns (← Previous, Next →, Quick Nav)
|
|
386
|
+
- Clean up multiple blank lines
|
|
387
|
+
|
|
388
|
+
**Files Modified:**
|
|
389
|
+
- `src/placeholders/placeholder-manager.ts` (lines 360-415) - Enhanced content cleaning
|
|
390
|
+
|
|
391
|
+
**Result:** Prompts now contain only clean, relevant text without markdown syntax or decorative elements.
|
|
392
|
+
|
|
393
|
+
#### Issue 3: Placeholder Replacement Regex
|
|
394
|
+
**Problem:** Previous regex could match incorrect closing backticks when code blocks appeared in content.
|
|
395
|
+
|
|
396
|
+
**Solution:** Updated regex to require closing ``` on its own line: `/```vf-placeholder\s+[\s\S]*?\n```/`
|
|
397
|
+
|
|
398
|
+
**Files Modified:**
|
|
399
|
+
- `src/placeholders/placeholder-manager.ts` (lines 133, 170) - Improved regex precision
|
|
400
|
+
|
|
401
|
+
**Result:** 100% reliable placeholder replacement with no partial matches.
|
|
402
|
+
|
|
403
|
+
**Test Results:**
|
|
404
|
+
- ✅ 32/32 images successfully replaced
|
|
405
|
+
- ✅ All images display at 80% width
|
|
406
|
+
- ✅ Zero content bleeding issues
|
|
407
|
+
- ✅ Clean prompts without markdown syntax
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
10
411
|
### Added ✨ Automatic Image Optimization
|
|
11
412
|
|
|
12
413
|
#### Feature: Web-Optimized Images with Original Preservation
|
|
@@ -542,8 +943,8 @@ The detailed context is automatically prepended to every image prompt, ensuring:
|
|
|
542
943
|
- **MANUAL_TESTING_GUIDE.md**: Manual testing procedures
|
|
543
944
|
|
|
544
945
|
#### Third-Party Integration
|
|
545
|
-
- **n8n-nodes-visual-forge/**: Custom N8N nodes for Visual Forge
|
|
546
|
-
- **n8n-workflows/**: Pre-built N8N workflow templates
|
|
946
|
+
- **n8n/n8n-nodes-visual-forge/**: Custom N8N nodes for Visual Forge
|
|
947
|
+
- **n8n/n8n-workflows/**: Pre-built N8N workflow templates
|
|
547
948
|
- **scripts/npm-manager.js**: NPM package management utilities
|
|
548
949
|
|
|
549
950
|
### Changed
|
package/README.md
CHANGED
|
@@ -24,13 +24,16 @@ An MCP (Model Context Protocol) server that automates AI image generation for te
|
|
|
24
24
|
- Leonardo Phoenix
|
|
25
25
|
- HuggingFace Inference
|
|
26
26
|
- xAI Grok 2 Image
|
|
27
|
-
- **🎨 Detailed Global Context
|
|
27
|
+
- **🎨 Detailed Global Context**: Comprehensive styling system with hex colors, typography, layout rules, and audience targeting for dramatically better, more consistent images
|
|
28
|
+
- **🖼️ Multi-Format Optimization** ✨ NEW v0.7.0: Automatic generation of WebP (94% smaller), JPEG (85% smaller), and optional lossy PNG (70% smaller) with professional watermarking
|
|
29
|
+
- **🔍 Quality Validation & Auto-Regeneration** ✨ NEW v0.7.0: OCR-based text detection, sharpness/brightness analysis, and automatic retry on quality failure
|
|
30
|
+
- **📁 Index-Based Directories** ✨ NEW v0.7.0: Collision-free sequential directory naming with complete metadata and generation logs per image
|
|
31
|
+
- **✏️ Enhanced Prompting** ✨ NEW v0.7.0: Type-specific prompt optimization to minimize AI text rendering errors
|
|
28
32
|
- **💰 Cost-Effective**: Options from $0.00 to $0.12/image
|
|
29
33
|
- **⚡ Flexible Workflows**: Interactive, Batch, and Bulk generation modes
|
|
30
34
|
- **🔄 State Persistence**: Resume interrupted sessions without losing progress
|
|
31
35
|
- **📊 Cost Tracking**: Real-time cost monitoring and estimates per provider
|
|
32
36
|
- **🎯 Smart Rate Limiting**: Token bucket algorithm prevents API bans
|
|
33
|
-
- **✨ Quality Inspection**: Automated quality analysis with sharpness and brightness metrics
|
|
34
37
|
- **🔒 Automatic Backups**: File backup system with approve/restore workflow (optional, enabled by default)
|
|
35
38
|
- **🌐 Universal MCP Support**: Compatible with 24+ MCP clients (tested with Claude Code, Claude Desktop, Zed)
|
|
36
39
|
|
|
@@ -752,7 +755,7 @@ Then drag **Visual Forge** nodes into your workflows with built-in UI for all op
|
|
|
752
755
|
|
|
753
756
|
#### Option 3: Example Workflows (Templates)
|
|
754
757
|
|
|
755
|
-
Import pre-built workflows from `n8n-workflows/`:
|
|
758
|
+
Import pre-built workflows from `n8n/n8n-workflows/`:
|
|
756
759
|
|
|
757
760
|
- `01-simple-image-generation.json` - Basic webhook-triggered generation
|
|
758
761
|
- `02-batch-processing-with-cdn.json` - Scheduled batch with S3/CDN upload
|
|
@@ -1209,6 +1212,86 @@ Real-time tracking:
|
|
|
1209
1212
|
|
|
1210
1213
|
---
|
|
1211
1214
|
|
|
1215
|
+
## 🛠️ Development & Publishing
|
|
1216
|
+
|
|
1217
|
+
### NPM Package Management
|
|
1218
|
+
|
|
1219
|
+
Visual Forge MCP includes a production-ready script for managing the npm package lifecycle with comprehensive safety checks and verbose logging.
|
|
1220
|
+
|
|
1221
|
+
**Script Location**: `scripts/npm-manager.sh`
|
|
1222
|
+
|
|
1223
|
+
#### Features
|
|
1224
|
+
|
|
1225
|
+
- ✅ **Publish with safety checks** - 10 pre-publish validations
|
|
1226
|
+
- ✅ **Version management** - Bump patch/minor/major
|
|
1227
|
+
- ✅ **Authentication support** - NPM tokens and recovery codes
|
|
1228
|
+
- ✅ **Git integration** - Automatic tag creation
|
|
1229
|
+
- ✅ **Dry-run mode** - Test without making changes
|
|
1230
|
+
- ✅ **Package info & stats** - View registry information
|
|
1231
|
+
- ✅ **Security audits** - Check for vulnerabilities
|
|
1232
|
+
- ✅ **Access management** - Control package access
|
|
1233
|
+
- ✅ **Comprehensive logging** - All operations logged
|
|
1234
|
+
|
|
1235
|
+
#### Quick Start
|
|
1236
|
+
|
|
1237
|
+
```bash
|
|
1238
|
+
# Show help
|
|
1239
|
+
./scripts/npm-manager.sh --help
|
|
1240
|
+
|
|
1241
|
+
# Show package info
|
|
1242
|
+
./scripts/npm-manager.sh info
|
|
1243
|
+
|
|
1244
|
+
# Bump version
|
|
1245
|
+
./scripts/npm-manager.sh bump patch
|
|
1246
|
+
|
|
1247
|
+
# Publish (with all safety checks)
|
|
1248
|
+
./scripts/npm-manager.sh publish --dry-run
|
|
1249
|
+
./scripts/npm-manager.sh publish
|
|
1250
|
+
```
|
|
1251
|
+
|
|
1252
|
+
#### Complete Release Workflow
|
|
1253
|
+
|
|
1254
|
+
```bash
|
|
1255
|
+
# 1. Bump version
|
|
1256
|
+
./scripts/npm-manager.sh bump patch
|
|
1257
|
+
|
|
1258
|
+
# 2. Update CHANGELOG.md
|
|
1259
|
+
vim CHANGELOG.md
|
|
1260
|
+
|
|
1261
|
+
# 3. Commit changes
|
|
1262
|
+
git commit -am "chore: Release v$(node -pe "require('./package.json').version")"
|
|
1263
|
+
|
|
1264
|
+
# 4. Test publish
|
|
1265
|
+
./scripts/npm-manager.sh publish --dry-run
|
|
1266
|
+
|
|
1267
|
+
# 5. Publish to npm
|
|
1268
|
+
./scripts/npm-manager.sh publish
|
|
1269
|
+
|
|
1270
|
+
# 6. Push to GitHub
|
|
1271
|
+
git push && git push --tags
|
|
1272
|
+
```
|
|
1273
|
+
|
|
1274
|
+
#### Authentication
|
|
1275
|
+
|
|
1276
|
+
**With NPM Token** (recommended for CI/CD):
|
|
1277
|
+
```bash
|
|
1278
|
+
export NPM_TOKEN=npm_your_token_here
|
|
1279
|
+
./scripts/npm-manager.sh publish
|
|
1280
|
+
```
|
|
1281
|
+
|
|
1282
|
+
**With Recovery Codes**:
|
|
1283
|
+
```bash
|
|
1284
|
+
npm login --auth-type=legacy
|
|
1285
|
+
./scripts/npm-manager.sh publish
|
|
1286
|
+
```
|
|
1287
|
+
|
|
1288
|
+
#### Documentation
|
|
1289
|
+
|
|
1290
|
+
- **Full Guide**: [scripts/README.md](scripts/README.md)
|
|
1291
|
+
- **Quick Reference**: [scripts/QUICK_START.md](scripts/QUICK_START.md)
|
|
1292
|
+
|
|
1293
|
+
---
|
|
1294
|
+
|
|
1212
1295
|
## 🤝 Contributing
|
|
1213
1296
|
|
|
1214
1297
|
Contributions welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) first.
|
|
@@ -1259,8 +1342,8 @@ For commercial licensing inquiries, please contact the author.
|
|
|
1259
1342
|
- **Full Integration Guide**: [docs/N8N_INTEGRATION.md](docs/N8N_INTEGRATION.md)
|
|
1260
1343
|
- **Quick Start**: [docs/N8N_QUICK_START.md](docs/N8N_QUICK_START.md)
|
|
1261
1344
|
- **API Reference**: [docs/openapi.yaml](docs/openapi.yaml)
|
|
1262
|
-
- **Example Workflows**: [n8n-workflows/](n8n-workflows/)
|
|
1263
|
-
- **Custom Node Package**: [n8n-nodes-visual-forge/](n8n-nodes-visual-forge/)
|
|
1345
|
+
- **Example Workflows**: [n8n/n8n-workflows/](n8n/n8n-workflows/)
|
|
1346
|
+
- **Custom Node Package**: [n8n/n8n-nodes-visual-forge/](n8n/n8n-nodes-visual-forge/)
|
|
1264
1347
|
|
|
1265
1348
|
---
|
|
1266
1349
|
|
package/config/pricing.json
CHANGED
|
@@ -14,6 +14,8 @@ export declare class MarkdownParser {
|
|
|
14
14
|
parseFiles(filePaths: string[], globalContext?: GlobalContext): Promise<ImageSpec[]>;
|
|
15
15
|
/**
|
|
16
16
|
* Parse a single image block
|
|
17
|
+
*
|
|
18
|
+
* NEW FORMAT: Handles YAML-style multiline prompt (prompt: | ...)
|
|
17
19
|
*/
|
|
18
20
|
private parseImageBlock;
|
|
19
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAA0B,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnG,qBAAa,cAAc;IACzB;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCtF;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAe1F
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAA0B,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnG,qBAAa,cAAc;IACzB;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCtF;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAe1F;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAoEvB;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAwCjD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAuBnF"}
|
|
@@ -14,8 +14,8 @@ export class MarkdownParser {
|
|
|
14
14
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
15
15
|
const specs = [];
|
|
16
16
|
// Extract image blocks using regex
|
|
17
|
-
// Looking for
|
|
18
|
-
const imageBlockRegex = /```
|
|
17
|
+
// NEW FORMAT: Looking for ```vf-placeholder blocks
|
|
18
|
+
const imageBlockRegex = /```vf-placeholder\s+([\s\S]*?)```/g;
|
|
19
19
|
let match;
|
|
20
20
|
let imageIndex = 1;
|
|
21
21
|
while ((match = imageBlockRegex.exec(content)) !== null) {
|
|
@@ -27,7 +27,7 @@ export class MarkdownParser {
|
|
|
27
27
|
imageIndex++;
|
|
28
28
|
}
|
|
29
29
|
catch (error) {
|
|
30
|
-
logger.warn(`Failed to parse
|
|
30
|
+
logger.warn(`Failed to parse vf-placeholder block in ${filePath}`, {
|
|
31
31
|
error: error.message,
|
|
32
32
|
position: blockPosition,
|
|
33
33
|
});
|
|
@@ -54,21 +54,34 @@ export class MarkdownParser {
|
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Parse a single image block
|
|
57
|
+
*
|
|
58
|
+
* NEW FORMAT: Handles YAML-style multiline prompt (prompt: | ...)
|
|
57
59
|
*/
|
|
58
60
|
parseImageBlock(blockContent, sourceFile, position, index, globalContext) {
|
|
59
61
|
const lines = blockContent.trim().split('\n');
|
|
60
62
|
const metadata = {};
|
|
61
63
|
let prompt = '';
|
|
64
|
+
let inPrompt = false;
|
|
62
65
|
// Parse metadata lines (key: value format)
|
|
63
66
|
for (const line of lines) {
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
// Check if this is the start of a multiline prompt
|
|
68
|
+
if (line.match(/^prompt:\s*\|/)) {
|
|
69
|
+
inPrompt = true;
|
|
70
|
+
continue;
|
|
68
71
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
prompt
|
|
72
|
+
// If we're in a multiline prompt, accumulate lines
|
|
73
|
+
if (inPrompt) {
|
|
74
|
+
// Dedent the prompt line (remove leading spaces)
|
|
75
|
+
const dedented = line.replace(/^\s{2}/, '');
|
|
76
|
+
prompt += dedented + '\n';
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Regular key: value metadata
|
|
80
|
+
const metaMatch = line.match(/^(\w+):\s*(.+)$/);
|
|
81
|
+
if (metaMatch) {
|
|
82
|
+
const [, key, value] = metaMatch;
|
|
83
|
+
metadata[key] = value.trim();
|
|
84
|
+
}
|
|
72
85
|
}
|
|
73
86
|
}
|
|
74
87
|
// Generate image ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,cAAc;IACzB;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,aAA6B;QAC7D,MAAM,CAAC,IAAI,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAgB,EAAE,CAAC;QAE9B,mCAAmC;QACnC,
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"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"}
|