@amg555/frameforge-mcp 2.4.4 → 2.4.6
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 +49 -0
- package/package.json +1 -1
- package/scripts/deep-validate.js +2 -2
- package/src/cli/make.js +5 -0
- package/src/mcp-server/server.js +1 -1
- package/src/video-renderer/renderer.js +9 -0
- package/src/video-renderer/scene-animator.js +1216 -418
- package/src/workflows/assets.js +2 -1
- package/src/workflows/ingest.js +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,55 @@ All notable changes to FrameForge are documented here.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [2.4.6] — 2026-11-10
|
|
8
|
+
|
|
9
|
+
### Enhanced
|
|
10
|
+
- **High-Quality Volumetric 2D Character Anatomy (`src/video-renderer/scene-animator.js`)**:
|
|
11
|
+
- Replaced all single-stroke stick limbs with solid anatomical contoured polygons:
|
|
12
|
+
- Contoured muscular thighs (quadriceps curve), articulated knee joints, gastrocnemius calf curves, and realistic ankles.
|
|
13
|
+
- Solid contoured upper arms and forearms tapering to wrists; fully articulated hands with solid palms, opposable thumbs, and 4 individual fingers for each pose (`natural`, `dress_shirt`, `hold_spear`, `sewing`, `thinker`, `peace_gesture`, `shiver`, `cover_body`).
|
|
14
|
+
- Anatomical head contour with cranium dome, temples, cheekbones, sculpted jawline, chin, and ears with antihelix and lobe.
|
|
15
|
+
- Almond eyes with sclera, colored iris, pupil, specular catchlights, eyelid crease, and blinking animation over pure-$t$.
|
|
16
|
+
- Sculpted nose bridge and nostril curves; expressive lips with oral cavity and teeth line modulated by sine speech waves.
|
|
17
|
+
- Layered volumetric styled hair: modern textured pompadour/fade, or lush flowing prehistoric locks.
|
|
18
|
+
- Modern tailored suit jacket/blazer with notched lapels, shirt collar, silk tie, belt with polished buckle, trousers with center pressed crease, and leather oxford shoes.
|
|
19
|
+
- Prehistoric animal hide tunic with ragged deckle hem, rawhide stitching, and carved bone toggle buckle, or bare human body with natural skin contours and 5 distinct toes.
|
|
20
|
+
- **Production-Grade Environmental Backdrops**:
|
|
21
|
+
- `doodle_dressing`: Hardwood herringbone parquet floor with individual planks and specular reflection sheen, architectural wainscoting trim, luxury dark walnut wardrobe closet with warm internal LED downlight, upper storage shelf, and 4 styled garments on wooden hangers, alongside an arched full-length brass mirror with crystal reflection.
|
|
22
|
+
- `doodle_modern_vs_prehistoric`: Split-screen comparison featuring a modern penthouse with twilight city skyline and illuminated skyscrapers on the left, an African savannah sunset with volcanic mountain ridges and flat-canopy acacia trees on the right, joined by a central glowing timeline rift (`300,000 BCE ───▶ PRESENT`).
|
|
23
|
+
- `doodle_shiver_cold`: Frigid Ice Age glacial valley with jagged snow-covered crags, wind-carved snow dunes, howling blizzard streaks, breath condensation plumes, and volumetric golden dawn sunbeams.
|
|
24
|
+
- `doodle_hunter_savannah`: Wide African savannah horizon under glowing sun with swaying golden grass stalks and flaked obsidian/flint spear.
|
|
25
|
+
- `doodle_sewing_needle`: Prehistoric cavern shelter with stone cave walls, ancient cave paintings, glowing campfire hearth with red embers, and high-precision inspection loupe showing extreme close-up of drilled ivory bone needle and sinew stitching.
|
|
26
|
+
- `doodle_shame_reflection`: Tranquil forest pool with mossy river rocks, water ripples, mirrored reflection, and radiant cognitive awareness halo.
|
|
27
|
+
- `doodle_tribe_meeting`: Misty valley with monolithic standing stones, two tribal figures meeting in peace, and glowing golden connection arc.
|
|
28
|
+
- `doodle_thinking_future`: Primeval starlit night sky with crescent moon, granite boulder, and luminous thought constellation.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## [2.4.5] — 2026-11-10
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
- **Browser Code Animation Dispatch in `src/video-renderer/renderer.js`**:
|
|
36
|
+
- Fixed `ReferenceError: camera is not defined` inside `_renderCodeAnimationScene`. Previously, missing parameter destructuring caused the browser animation engine to throw on every scene, silently falling back to static FFmpeg image slideshows.
|
|
37
|
+
- Added full pass-through of `camera`, `visualType`, and `focalPoint` into `_renderCodeAnimationScene`.
|
|
38
|
+
- **Manifest Ingest Preservation (`src/workflows/ingest.js`, `src/workflows/assets.js`)**:
|
|
39
|
+
- `normaliseIngestScene` now retains `prompt`, `style`, and `theme`, and falls back to `raw.prompt` for `visual_description`.
|
|
40
|
+
- Added `--theme` and `--aesthetic` CLI options to `src/cli/make.js`.
|
|
41
|
+
|
|
42
|
+
### Enhanced
|
|
43
|
+
- **Audio-Driven Continuous Camera Director (`src/video-renderer/scene-animator.js`)**:
|
|
44
|
+
- Replaced hardcoded timer modulo cuts with continuous trajectory over `p = t / window.DURATION`.
|
|
45
|
+
- Camera movements (`slow_zoom_in`, `slow_zoom_out`, `pan_left`, `pan_right`, `tilt_up`, `tilt_down`, `ken_burns`, `static`, and `auto`) now smoothly scale to exact narration length.
|
|
46
|
+
- **Max-Quality Organic Doodle Anatomy (`src/video-renderer/scene-animator.js`)**:
|
|
47
|
+
- Overhauled `drawDoodleCharacter`: replaced straight vertical spine line with contoured human torso (shoulders, ribcage, waist, hips), clavicle accents, articulated knees, and planted feet.
|
|
48
|
+
- Removed forced ground drop shadows, forced rosy cheek blush, and forced specular eye highlights.
|
|
49
|
+
- **Light Parchment Hand-Drawn Inking Aesthetic (`hand_drawn_doodle`)**:
|
|
50
|
+
- Warm parchment paper backgrounds (`#faf7f2`, `#f6f1e8`, `#fdfbf7`) with dark charcoal inking (`#1c1917`), subtle line grain, and organic 12fps line boil.
|
|
51
|
+
- Removed all unwanted text stamps and banners (`NOT FOR COLD`, `THEORY OF MIND`, etc.) from narrative doodle themes.
|
|
52
|
+
- Added `doodle_modern_vs_prehistoric` split-screen comparison theme.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
7
56
|
## [2.4.4] — 2026-11-09
|
|
8
57
|
|
|
9
58
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amg555/frameforge-mcp",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.6",
|
|
4
4
|
"description": "FrameForge — AI video production engine for agentic IDEs. npx @amg555/frameforge-mcp. FFmpeg + TTS run on your machine. 21 MCP tools.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
package/scripts/deep-validate.js
CHANGED
|
@@ -20,7 +20,7 @@ check('batch handling', code.includes('Array.isArray(body)'));
|
|
|
20
20
|
check('ping handler', code.includes("method === 'ping'"));
|
|
21
21
|
check('notifications/init', code.includes("notifications/initialized"));
|
|
22
22
|
check('body size limit', code.includes('MAX_BODY_BYTES'));
|
|
23
|
-
check('SERVER_INFO version 2.4.
|
|
23
|
+
check('SERVER_INFO version 2.4.6', code.includes("version: '2.4.6'"));
|
|
24
24
|
check('18 tools defined (incl get_job_status)', code.includes('get_job_status'));
|
|
25
25
|
check('export_to_editor tool defined', code.includes('export_to_editor'));
|
|
26
26
|
check('edit_video tool defined', code.includes('edit_video'));
|
|
@@ -299,7 +299,7 @@ check('cf-worker has checkRateLimit', cfWorker.includes('checkRateLimit'));
|
|
|
299
299
|
check('cf-worker hashes token (SHA-256)', cfWorker.includes('SHA-256'));
|
|
300
300
|
check('cf-worker uses RATE_LIMITS KV', cfWorker.includes('env.RATE_LIMITS'));
|
|
301
301
|
check('cf-worker returns 429 on limit', cfWorker.includes('429'));
|
|
302
|
-
check('cf-worker version 2.4.
|
|
302
|
+
check('cf-worker version 2.4.6', cfWorker.includes("'2.4.6'"));
|
|
303
303
|
check('wrangler.toml has kv_namespaces',fs.readFileSync('./cloudflare-mcp/wrangler.toml','utf8').includes('kv_namespaces'));
|
|
304
304
|
|
|
305
305
|
// ── plugins/skills present ────────────────────────────────────────────────
|
package/src/cli/make.js
CHANGED
|
@@ -98,6 +98,7 @@ function parseArgs(argv) {
|
|
|
98
98
|
mode: 'full-auto',
|
|
99
99
|
topic: '', topicsFile: '', language: 'en',
|
|
100
100
|
style: 'educational comedy', channels: ['file'],
|
|
101
|
+
theme: '',
|
|
101
102
|
orientation: 'landscape',
|
|
102
103
|
captions: false, subtitles: false,
|
|
103
104
|
scenesFile: '', scriptFile: '', mediaDir: '',
|
|
@@ -120,6 +121,8 @@ function parseArgs(argv) {
|
|
|
120
121
|
case '--subtitles':
|
|
121
122
|
case '--with-captions': args.captions = true; break;
|
|
122
123
|
case '--style': args.style = argv[++i] || args.style; break;
|
|
124
|
+
case '--theme':
|
|
125
|
+
case '--aesthetic': args.theme = argv[++i] || ''; break;
|
|
123
126
|
case '--channels': args.channels = (argv[++i] || 'file').split(',').map(s => s.trim()); break;
|
|
124
127
|
case '--no-research': args.noResearch = true; break;
|
|
125
128
|
case '--no-script': args.noScript = true; break;
|
|
@@ -423,6 +426,7 @@ async function runSingleVideo(args, topic, outDir, workflows) {
|
|
|
423
426
|
topic,
|
|
424
427
|
title,
|
|
425
428
|
style: args.style || '',
|
|
429
|
+
theme: args.theme || '',
|
|
426
430
|
language: args.language,
|
|
427
431
|
voice: resolvedVoice,
|
|
428
432
|
});
|
|
@@ -439,6 +443,7 @@ async function runSingleVideo(args, topic, outDir, workflows) {
|
|
|
439
443
|
topic,
|
|
440
444
|
title,
|
|
441
445
|
style: args.style || '',
|
|
446
|
+
theme: args.theme || '',
|
|
442
447
|
language: args.language,
|
|
443
448
|
showCaptions: Boolean(args.captions || args.subtitles),
|
|
444
449
|
renderWidth,
|
package/src/mcp-server/server.js
CHANGED
|
@@ -278,11 +278,14 @@ class VideoRenderer {
|
|
|
278
278
|
caption,
|
|
279
279
|
narration,
|
|
280
280
|
visualDescription,
|
|
281
|
+
visualType,
|
|
281
282
|
topic,
|
|
282
283
|
style,
|
|
283
284
|
theme,
|
|
284
285
|
title,
|
|
285
286
|
language,
|
|
287
|
+
camera,
|
|
288
|
+
focalPoint,
|
|
286
289
|
html,
|
|
287
290
|
code,
|
|
288
291
|
clampedDur,
|
|
@@ -360,11 +363,14 @@ class VideoRenderer {
|
|
|
360
363
|
caption,
|
|
361
364
|
narration,
|
|
362
365
|
visualDescription,
|
|
366
|
+
visualType = 'code_animation',
|
|
363
367
|
topic = '',
|
|
364
368
|
style = '',
|
|
365
369
|
theme = '',
|
|
366
370
|
title = '',
|
|
367
371
|
language = '',
|
|
372
|
+
camera = 'auto',
|
|
373
|
+
focalPoint = null,
|
|
368
374
|
html = null,
|
|
369
375
|
code = null,
|
|
370
376
|
clampedDur,
|
|
@@ -393,6 +399,7 @@ class VideoRenderer {
|
|
|
393
399
|
topic,
|
|
394
400
|
});
|
|
395
401
|
} else {
|
|
402
|
+
const effectiveCam = camera || selectCameraHint(sceneIndex, focalPoint || {});
|
|
396
403
|
htmlContent = generateSceneHtml({
|
|
397
404
|
caption,
|
|
398
405
|
narration,
|
|
@@ -409,6 +416,8 @@ class VideoRenderer {
|
|
|
409
416
|
sceneIndex,
|
|
410
417
|
musicMood,
|
|
411
418
|
showCaptions,
|
|
419
|
+
camera: effectiveCam,
|
|
420
|
+
cameraHint: effectiveCam,
|
|
412
421
|
});
|
|
413
422
|
}
|
|
414
423
|
|