@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 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.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"
@@ -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.4', code.includes("version: '2.4.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.4', cfWorker.includes("'2.4.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,
@@ -1637,7 +1637,7 @@ Allows the agent in Claude Code, Cursor, or any IDE to inspect the visual output
1637
1637
 
1638
1638
  const SERVER_INFO = {
1639
1639
  name: 'video-pipeline',
1640
- version: '2.4.4',
1640
+ version: '2.4.6',
1641
1641
  };
1642
1642
 
1643
1643
  const CAPABILITIES = {
@@ -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