@amg555/frameforge-mcp 2.3.2 → 2.3.4
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/.mcp.json +2 -4
- package/CHANGELOG.md +24 -1
- package/CLAUDE.md +104 -26
- package/README.md +17 -12
- package/SECURITY.md +1 -3
- package/package.json +7 -3
- package/plugins/video-pipeline/.claude-plugin/plugin.json +19 -0
- package/plugins/video-pipeline/skills/html-renderer/SKILL.md +292 -0
- package/plugins/video-pipeline/skills/video-pipeline/SKILL.md +308 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/ANIMATION_GUIDE.md +257 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/STORYBOARD.md +77 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/index.html +80 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/diagram-author.md +43 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/orchestrator.md +56 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/scene-author.md +42 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/reel/engine.css +140 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/reel/engine.js +870 -0
- package/plugins/video-pipeline/skills/video-pipeline/assets/project/reel/virtual-clock.js +138 -0
- package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +167 -0
- package/plugins/video-pipeline/skills/video-pipeline/references/providers.md +174 -0
- package/scripts/db-migrate.js +112 -0
- package/scripts/deep-validate.js +326 -0
- package/scripts/generate-initial-assets.js +342 -0
- package/scripts/html-renderer/new-project.mjs +408 -0
- package/scripts/html-renderer/transcribe.py +294 -0
- package/src/asset-library/README.md +2 -2
- package/src/asset-library/asset-library.js +1 -1
- package/src/cli/doctor.js +12 -5
- package/src/cli/make.js +52 -71
- package/src/cli/setup-keys.js +15 -17
- package/src/fact-checker/review-gate.js +5 -1
- package/src/harness/bin/harness.mjs +324 -0
- package/src/harness/lib/browser.mjs +137 -0
- package/src/harness/lib/capture.mjs +161 -0
- package/src/harness/lib/encode.mjs +89 -0
- package/src/harness/lib/jobs.mjs +135 -0
- package/src/harness/lib/pixels.mjs +137 -0
- package/src/harness/lib/sheets.mjs +164 -0
- package/src/harness/lib/verify-purity.mjs +119 -0
- package/src/harness/test/fixtures/broken-scene.html +27 -0
- package/src/harness/test/fixtures/reference-scene.html +23 -0
- package/src/harness/test/fixtures/sample-script.json +18 -0
- package/src/mcp-server/server.js +285 -144
- package/src/pipeline/telemetry.js +1 -0
- package/src/utils/log-redaction.js +5 -3
- package/src/video-renderer/renderer.js +12 -4
- package/src/worker/server-render-free.js +2 -3
- package/src/workflows/assets.js +20 -43
- package/src/workflows/ingest.js +5 -5
package/.mcp.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"remote": "CLOUDFLARE REMOTE MCP: Connects via edge URL. Saves ~80% prompt context tokens in your IDE."
|
|
7
7
|
},
|
|
8
8
|
"_paths": {
|
|
9
|
-
"agent-first": "Path 1 — your IDE writes scenes, FrameForge renders. Only TTS
|
|
9
|
+
"agent-first": "Path 1 — your IDE writes scenes, FrameForge renders with code-driven animations & user media. Only TTS needed. No LLM key.",
|
|
10
10
|
"auto-research": "Path 2 — FrameForge researches and scripts autonomously. Requires PROVIDER_LLM + its key."
|
|
11
11
|
},
|
|
12
12
|
|
|
@@ -17,8 +17,7 @@
|
|
|
17
17
|
"command": "node",
|
|
18
18
|
"args": ["src/mcp-server/stdio.js"],
|
|
19
19
|
"env": {
|
|
20
|
-
"PROVIDER_TTS": "edge-tts"
|
|
21
|
-
"PROVIDER_IMAGE": "pollinations"
|
|
20
|
+
"PROVIDER_TTS": "edge-tts"
|
|
22
21
|
}
|
|
23
22
|
},
|
|
24
23
|
|
|
@@ -28,7 +27,6 @@
|
|
|
28
27
|
"args": ["src/mcp-server/server.js"],
|
|
29
28
|
"env": {
|
|
30
29
|
"PROVIDER_TTS": "edge-tts",
|
|
31
|
-
"PROVIDER_IMAGE": "pollinations",
|
|
32
30
|
"MCP_PORT": "3210"
|
|
33
31
|
}
|
|
34
32
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ All notable changes to FrameForge are documented here.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [2.3.4] — 2026-11-09
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Full Code-Driven Video Production Harness** (`src/harness/`, `bin/harness.mjs`, `npx frameforge-harness`):
|
|
11
|
+
- H1 Browser resolution & GPU auto-selection (Direct3D11 / Metal / ANGLE)
|
|
12
|
+
- H2 Deterministic frame stepper & virtual clock injection
|
|
13
|
+
- H3 Resumable atomic frame worker pool (`.tmp` + `renameSync`, <1000B corruption checks)
|
|
14
|
+
- H4 Visual review generators: contact sheets, motion strips, 9:16 mobile crop previews
|
|
15
|
+
- H5 3-point history-leak & frame purity verification gate ($a === b \land a === c$) with `frames_sha256` digest
|
|
16
|
+
- H6 Pixel luminance and blind-spot frame math (blank, blown, corner-confined detection)
|
|
17
|
+
- H7 Determinism primitives in `engine.js` (`boilSeed`, `kf`, `onTwos`, `seg`, `pulse`, `shots`)
|
|
18
|
+
- H8 Broadcast-grade BT.709 color encoding & x264 VUI parameter tags
|
|
19
|
+
- H9 Unified CLI commands (`doctor`, `storyboard`, `verify`, `sheet`, `strip`, `crop`, `pixels`, `frames`, `encode`, `all`)
|
|
20
|
+
- **MCP `render_animation` parity**: added `verify`, `doctor`, `pixels` modes and structured `purityReport` return object.
|
|
21
|
+
- **VoxForge**: added `VOXFORGE_URL` detection to system doctor and documented in all provider tables.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- Fixed relative module imports in scaffolded projects (`./browser.mjs`, etc.).
|
|
25
|
+
- Enforced BT.709 color tags across all procedural scene fallbacks in `renderer.js`.
|
|
26
|
+
- Included `plugins/` skill templates and assets in npm package distribution.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
7
30
|
## [2.3.2] — 2026-11-06
|
|
8
31
|
|
|
9
32
|
### Added
|
|
@@ -51,7 +74,7 @@ All notable changes to FrameForge are documented here.
|
|
|
51
74
|
- `scripts/verify.py` — 7-gate quality verification (same gates as `QualityGate`)
|
|
52
75
|
- `scripts/transcribe.py` — Whisper word-level caption outline generator (`openai-whisper`, free local)
|
|
53
76
|
- `scripts/capture.mjs` — headless Playwright screenshot for b-roll (site, tweet, URL)
|
|
54
|
-
- `scripts/stock.py` — Pexels stock footage/image downloader (free API key)
|
|
77
|
+
- `scripts/stock.py` — Pexels stock footage/image downloader (free API key) with user media asset stubs
|
|
55
78
|
- `scripts/html-renderer/new-project.mjs` updated: copies real engine files instead of writing stubs; includes all 8 scripts
|
|
56
79
|
- **Tool 14: `get_job_status`** — MCP tool to poll a job queued by `queue_full_pipeline`. Returns `{ status, stage, result, error }`. Added to `src/mcp-server/server.js`; automatically available on stdio transport. 5 new tests.
|
|
57
80
|
- **Cloudflare KV rate limiter** — sliding-window 100 req/hr per bearer token. SHA-256-hashed key stored in `RATE_LIMITS` KV namespace. Returns HTTP 429 + `Retry-After` when exceeded. KV binding documented in `cloudflare-mcp/wrangler.toml`. Rate-limiting skipped when KV not bound (local dev).
|
package/CLAUDE.md
CHANGED
|
@@ -50,7 +50,7 @@ If you're not sure what a tool does — call it with the obvious parameters. The
|
|
|
50
50
|
|
|
51
51
|
1. **Never write driver/helper scripts** to work around a tool's missing parameter. If you think a parameter is missing, check the tool schema again — it's probably there (`voice`, `language`, `orientation`, `parallelism`, `skipImages`, `skipTts`).
|
|
52
52
|
2. **Never write a v2 or v3 of a script.** If the first approach fails, report the error and ask the user what to do.
|
|
53
|
-
3. **Never retry a provider failure yourself.** The pipeline has retry logic built in. If
|
|
53
|
+
3. **Never retry a provider failure yourself.** The pipeline has retry logic built in. If a provider fails: report it and stop.
|
|
54
54
|
4. **Never restart the MCP server.** The server picks up env from its launch context. If a voice or provider needs to change, set the right parameter in the tool call — `voice`, `language`, `parallelism`.
|
|
55
55
|
5. **One tool call, then wait for the result.** Do not queue multiple tool calls before seeing what the first one returned.
|
|
56
56
|
|
|
@@ -60,9 +60,9 @@ If you're not sure what a tool does — call it with the obvious parameters. The
|
|
|
60
60
|
|
|
61
61
|
> **The primary path is Path 2 (code-driven animation).** Every frame is a pure function of time `t`, rendered by Playwright + FFmpeg. This is what produces the high-quality, viral-style motion graphics clips. Path 1 (FFmpeg + AI images) is the fast fallback when Playwright is unavailable or the user wants a quick draft. Path 3 (auto-research) is for unattended batch.
|
|
62
62
|
|
|
63
|
-
### Path 1 — You write the scenes
|
|
63
|
+
### Path 1 — You write the scenes (code animation & user media)
|
|
64
64
|
|
|
65
|
-
Your IDE model writes the scenes. FrameForge
|
|
65
|
+
Your IDE model writes the scenes. FrameForge synthesizes TTS, binds user media (`image_path` / `video_path`) or procedural kinetic typography, and renders with FFmpeg.
|
|
66
66
|
|
|
67
67
|
```
|
|
68
68
|
create_video_from_script({
|
|
@@ -70,15 +70,16 @@ create_video_from_script({
|
|
|
70
70
|
{
|
|
71
71
|
narration: "Text spoken aloud by the voice.",
|
|
72
72
|
caption: "OVERLAY TEXT", // max 40 chars, burned into video
|
|
73
|
-
visual_description: "
|
|
73
|
+
visual_description: "concept description", // used for card styling
|
|
74
|
+
image_path: "assets/photo.jpg", // optional: user manual image
|
|
75
|
+
video_path: "assets/clip.mp4" // optional: user manual video clip
|
|
74
76
|
}
|
|
75
77
|
],
|
|
76
78
|
title: "My Video",
|
|
77
79
|
orientation: "landscape", // "landscape" (1920×1080) or "portrait" (1080×1920 for Shorts/Reels)
|
|
78
80
|
voice: "ml-IN-MidhunNeural", // optional: any edge-tts voice ID (auto-selected from language if omitted)
|
|
79
81
|
language: "ml", // optional: BCP-47 code — auto-selects voice (ml, hi, ta, te, zh, ja, ...)
|
|
80
|
-
|
|
81
|
-
parallelism: 1, // keep at 1 for Pollinations; raise to 4 only with falai/replicate
|
|
82
|
+
parallelism: 1,
|
|
82
83
|
withMusic: true
|
|
83
84
|
})
|
|
84
85
|
```
|
|
@@ -90,13 +91,13 @@ Output files appear in `.frameforge-files/`:
|
|
|
90
91
|
- `short_1_<id>.mp4` — auto-extracted vertical Short
|
|
91
92
|
- `video_meta.json` — title, description, tags
|
|
92
93
|
|
|
93
|
-
> **No API keys needed.** `edge-tts` (voice) and
|
|
94
|
+
> **No API keys needed.** `edge-tts` (voice) runs offline and visual cards render procedurally with FFmpeg/Playwright. 100% deterministic, zero diffusion artifacts.
|
|
94
95
|
|
|
95
96
|
---
|
|
96
97
|
|
|
97
98
|
### Path 2 — Code-driven animated video (Playwright + FFmpeg, no AI images)
|
|
98
99
|
|
|
99
|
-
Use this when: the user wants motion graphics,
|
|
100
|
+
Use this when: the user wants motion graphics, explainer, reel, or YouTube-style video. Every frame is a pure function of time `t`.
|
|
100
101
|
|
|
101
102
|
> **Iron rule:** Never use `Math.random()`, `Date.now()`, `setTimeout`, or module-level mutable state in scene code. Use `hash(i)` from `reel/engine.js` for deterministic randomness.
|
|
102
103
|
|
|
@@ -218,9 +219,9 @@ get_job_status({ jobId }) // poll every 30s until status = "SUCCEEDED"
|
|
|
218
219
|
| `scaffold_animation_project` | Scaffold a Playwright + FFmpeg animation project (engine, render scripts, STORYBOARD.md) |
|
|
219
220
|
| `validate_storyboard` | Enforce the 4 hard gates before any scene code |
|
|
220
221
|
| `render_animation` | Playwright renderer: `sheet` / `strip` / `storyboard` / `crop` / `full` / `mux` / `kit` / `look` |
|
|
221
|
-
| `multi_voice_tts` | TTS per-call: `edge-tts` ·
|
|
222
|
+
| `multi_voice_tts` | TTS per-call: `edge-tts` · `elevenlabs` · `voxforge` · `azure` · `openai` · `webhook` |
|
|
222
223
|
| `export_to_editor` | Send finished animation to Premiere / Resolve / CapCut / After Effects / Remotion |
|
|
223
|
-
| `external_platform_call` | HTTP bridge to
|
|
224
|
+
| `external_platform_call` | HTTP bridge to **any** app — pass `platformUrl` directly, no env setup needed |
|
|
224
225
|
|
|
225
226
|
**Secondary — FFmpeg + AI images (fast draft, no Playwright needed):**
|
|
226
227
|
|
|
@@ -270,29 +271,106 @@ VOXFORGE_VOICE=my-cloned-voice-id
|
|
|
270
271
|
|
|
271
272
|
---
|
|
272
273
|
|
|
273
|
-
##
|
|
274
|
+
## CUSTOM APP MCP — connect any app instantly
|
|
274
275
|
|
|
275
|
-
|
|
276
|
+
`external_platform_call` connects to any HTTP app **without touching `.env`** — pass `platformUrl` directly:
|
|
276
277
|
|
|
277
278
|
```
|
|
278
|
-
//
|
|
279
|
-
|
|
279
|
+
// Connect any custom app or MCP-enabled tool right now
|
|
280
|
+
external_platform_call({
|
|
281
|
+
action: "ingest",
|
|
282
|
+
platformUrl: "http://localhost:8080", // your app's base URL
|
|
283
|
+
platformKey: "optional-api-key", // omit if no auth
|
|
284
|
+
files: [".frameforge-files/final.mp4"]
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
// Drive editing operations in your custom app
|
|
288
|
+
external_platform_call({
|
|
289
|
+
action: "edit",
|
|
290
|
+
platformUrl: "http://localhost:8080",
|
|
291
|
+
operations: [
|
|
292
|
+
{ op: "cut", at: 4.5 },
|
|
293
|
+
{ op: "color", clip: 0, lut: "/luts/film.cube" },
|
|
294
|
+
{ op: "caption", at: 2.0, duration: 3.0, text: "Intro", position: "bottom" },
|
|
295
|
+
{ op: "transition", between: [0, 1], type: "dissolve", duration: 0.5 }
|
|
296
|
+
]
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
// Use a named preset (auto-fills default paths for known apps)
|
|
300
|
+
external_platform_call({
|
|
301
|
+
action: "render",
|
|
302
|
+
platformName: "resolve", // premiere | resolve | runway | voxforge | capcut | ...
|
|
303
|
+
metadata: { exportPath: "/exports/final.mp4" }
|
|
304
|
+
})
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**Your app only needs to accept POST JSON.** FrameForge sends:
|
|
308
|
+
- `ingest` → `multipart/form-data` with the files
|
|
309
|
+
- `edit` → `{ operations: [...], source: "frameforge" }`
|
|
310
|
+
- `render` → `{ scenes: [...], productionId: "...", ...metadata }`
|
|
311
|
+
- `status` → `GET /<statusPath>/<jobId>`
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## EDITOR BRIDGES — import and edit in external apps
|
|
316
|
+
|
|
317
|
+
`export_to_editor` supports four actions: **import**, **edit**, **render**, **status**.
|
|
318
|
+
|
|
319
|
+
### Import a finished animation
|
|
280
320
|
|
|
281
|
-
|
|
282
|
-
|
|
321
|
+
```
|
|
322
|
+
// Auto-generates EDL and imports MP4 + EDL into DaVinci Resolve
|
|
323
|
+
export_to_editor({ editor: "resolve", action: "import", projectDir: ".frameforge-files/my-anim/" })
|
|
324
|
+
|
|
325
|
+
// Premiere Pro (requires CEP companion server)
|
|
326
|
+
export_to_editor({ editor: "premiere", action: "import", projectDir: "..." })
|
|
327
|
+
|
|
328
|
+
// Explicit video path (no projectDir needed)
|
|
329
|
+
export_to_editor({ editor: "resolve", action: "import", videoPath: "/path/to/output.mp4" })
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Apply editing operations
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
export_to_editor({
|
|
336
|
+
editor: "resolve",
|
|
337
|
+
action: "edit",
|
|
338
|
+
timelineName: "MyFilm",
|
|
339
|
+
operations: [
|
|
340
|
+
{ op: "cut", at: 4.5 },
|
|
341
|
+
{ op: "transition", between: [0, 1], type: "dissolve", duration: 0.5 },
|
|
342
|
+
{ op: "color", clip: 0, lut: "/path/to/film.cube" },
|
|
343
|
+
{ op: "caption", at: 2.0, duration: 3.0, text: "Chapter 1", position: "bottom" },
|
|
344
|
+
{ op: "trim", clip: 1, startDelta: 0.3 },
|
|
345
|
+
{ op: "speed", clip: 2, factor: 0.5 },
|
|
346
|
+
{ op: "mute", clip: 3 },
|
|
347
|
+
{ op: "swap", clip: 0, newPath: "/new/take.mp4" }
|
|
348
|
+
]
|
|
349
|
+
})
|
|
350
|
+
```
|
|
283
351
|
|
|
284
|
-
|
|
285
|
-
export_to_editor({ projectDir: "...", editor: "premiere" })
|
|
352
|
+
### Trigger the editor's own render/export
|
|
286
353
|
|
|
287
|
-
|
|
288
|
-
export_to_editor({
|
|
354
|
+
```
|
|
355
|
+
export_to_editor({ editor: "resolve", action: "render", exportPath: "/exports/final.mp4" })
|
|
356
|
+
// → returns { jobId }
|
|
289
357
|
|
|
290
|
-
|
|
291
|
-
|
|
358
|
+
export_to_editor({ editor: "resolve", action: "status", jobId: "..." })
|
|
359
|
+
// → returns { status, outputUrl }
|
|
292
360
|
```
|
|
293
361
|
|
|
294
|
-
|
|
295
|
-
|
|
362
|
+
### What's supported per editor
|
|
363
|
+
|
|
364
|
+
| Editor | import | edit ops | render | Notes |
|
|
365
|
+
|--------|--------|----------|--------|-------|
|
|
366
|
+
| `resolve` | ✅ | ✅ | ✅ | Built-in REST API (Resolve 18.6+). Enable in Preferences → System → General → "IP Remote Control". No bridge install needed. |
|
|
367
|
+
| `premiere` | ✅ | ✅ | ✅ | Requires CEP companion panel. See `docs/editor-bridges/premiere.md`. |
|
|
368
|
+
| `aftereffects` | ✅ | ✅ | ✅ | Requires AE REST bridge. See `docs/editor-bridges/aftereffects.md`. |
|
|
369
|
+
| `remotion` | ✅ | ✅ | ✅ | Remotion is code — operations patch composition props + trigger CLI render. No bridge. |
|
|
370
|
+
| `capcut` | ✅ | ❌ | ✅ | No public desktop edit API. Import + export only. |
|
|
371
|
+
| `custom` | ✅ | ✅ | ✅ | You define what the endpoint handles. |
|
|
372
|
+
|
|
373
|
+
**Override ports:** `RESOLVE_BRIDGE_URL`, `PREMIERE_BRIDGE_URL`, `CAPCUT_BRIDGE_URL`, `AE_BRIDGE_URL`
|
|
296
374
|
|
|
297
375
|
---
|
|
298
376
|
|
|
@@ -358,9 +436,9 @@ Supply any of these per scene — FrameForge only generates what you don't suppl
|
|
|
358
436
|
**`create_video_from_script` returns `passed: false`:** Check `qcReport.checks` for the failed gate:
|
|
359
437
|
- `resolution`: an `image_path` file has wrong dimensions — use `visual_description` instead
|
|
360
438
|
- `no_audio`: TTS failed — check `edge-tts` is installed
|
|
361
|
-
- `black_frames`:
|
|
439
|
+
- `black_frames`: visual asset invalid — verify image_path / video_path file paths or use default code-driven visual cards
|
|
362
440
|
|
|
363
|
-
**
|
|
441
|
+
**Visual fallback:** FrameForge renders crisp code-driven animated cards automatically when no manual media is supplied. The video always renders cleanly.
|
|
364
442
|
|
|
365
443
|
**Any other tool error:** Report the exact error message to the user. Do not attempt to fix it by editing source files.
|
|
366
444
|
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](https://www.npmjs.com/package/@amg555/frameforge-mcp)
|
|
10
10
|
[](LICENSE)
|
|
11
11
|
[](https://nodejs.org/)
|
|
12
|
-
[](CHANGELOG.md)
|
|
13
13
|
[](https://modelcontextprotocol.io/)
|
|
14
14
|
[](#testing)
|
|
15
15
|
|
|
@@ -135,7 +135,7 @@ short_1_<id>.mp4 → auto-extracted 9:16 vertical Short
|
|
|
135
135
|
video_meta.json → title, description, tags, chapters
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
-
**No API keys required for this path.** `edge-tts` (voice)
|
|
138
|
+
**No API keys required for this path.** `edge-tts` (voice) runs offline and visual cards render procedurally via FFmpeg/Playwright. 100% deterministic, zero diffusion flaws.
|
|
139
139
|
|
|
140
140
|
---
|
|
141
141
|
|
|
@@ -143,7 +143,7 @@ video_meta.json → title, description, tags, chapters
|
|
|
143
143
|
|
|
144
144
|
### Your IDE writes the script — no LLM key needed
|
|
145
145
|
|
|
146
|
-
Your IDE's model writes the scenes. FrameForge
|
|
146
|
+
Your IDE's model writes the scenes. FrameForge runs FFmpeg, TTS, and code-driven kinetic animations or user media. Use `create_video_from_script`. This is the fastest path and what most people want.
|
|
147
147
|
|
|
148
148
|
### FrameForge researches and scripts itself
|
|
149
149
|
|
|
@@ -219,6 +219,7 @@ Switch any provider with one `.env` change — no code changes.
|
|
|
219
219
|
| Provider | Free? | Key needed |
|
|
220
220
|
|----------|-------|------------|
|
|
221
221
|
| `edge-tts` | ✅ free, offline | none — **default** |
|
|
222
|
+
| `voxforge` | ✅ free, local/private | none — `VOXFORGE_URL` ([VoxForge](https://github.com/AMG555/VoxForge)) |
|
|
222
223
|
| `elevenlabs` | paid | `ELEVENLABS_API_KEY` |
|
|
223
224
|
| `azure` | paid | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION` |
|
|
224
225
|
| `openai` | paid | `OPENAI_API_KEY` |
|
|
@@ -226,17 +227,21 @@ Switch any provider with one `.env` change — no code changes.
|
|
|
226
227
|
|
|
227
228
|
Set `PROVIDER_TTS=<name>`.
|
|
228
229
|
|
|
229
|
-
**
|
|
230
|
+
**Visuals & Media**
|
|
230
231
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
|
234
|
-
|
|
235
|
-
| `
|
|
236
|
-
| `
|
|
237
|
-
| `
|
|
232
|
+
FrameForge is **code-driven first**: scenes render via crisp vector animations, kinetic typography, and user-provided media (clips, b-roll, photos) — zero diffusion artifacts, zero AI slop, 100% deterministic.
|
|
233
|
+
|
|
234
|
+
| Visual Mode / Provider | Type | Key needed |
|
|
235
|
+
|------------------------|------|------------|
|
|
236
|
+
| `code-driven` | **Default** — kinetic cards, typography, spring motion | none — **recommended default** |
|
|
237
|
+
| `user-media` | User-supplied `image_path` or `video_path` in scene | none |
|
|
238
|
+
| `pollinations` | Optional AI diffusion (opt-in via `--ai-images`) | none |
|
|
239
|
+
| `falai` | Optional AI diffusion (fast FLUX) | `FALAI_API_KEY` at fal.ai |
|
|
240
|
+
| `replicate` | Optional AI diffusion (FLUX-schnell) | `REPLICATE_API_KEY` |
|
|
241
|
+
| `dalle` | Optional AI diffusion (DALL-E 3) | `OPENAI_API_KEY` |
|
|
242
|
+
| `webhook` | Custom image/video generation endpoint | `WEBHOOK_IMAGE_URL` |
|
|
238
243
|
|
|
239
|
-
Set `
|
|
244
|
+
Set `ENABLE_AI_IMAGES=true` or pass `--ai-images` only if you explicitly want AI diffusion images. Default is clean code-driven animation.
|
|
240
245
|
|
|
241
246
|
**LLM — only for the auto-research path**
|
|
242
247
|
|
package/SECURITY.md
CHANGED
|
@@ -49,7 +49,7 @@ prefer to remain anonymous.
|
|
|
49
49
|
|
|
50
50
|
### Network
|
|
51
51
|
- FFmpeg calls use `-nostdin` to prevent interactive prompts from blocking.
|
|
52
|
-
- All outbound HTTP calls (
|
|
52
|
+
- All outbound HTTP calls (search APIs, webhook endpoints) use
|
|
53
53
|
Node.js `https` with explicit timeouts and no silent redirects beyond 5 hops.
|
|
54
54
|
|
|
55
55
|
### Cloudflare Workers
|
|
@@ -64,8 +64,6 @@ prefer to remain anonymous.
|
|
|
64
64
|
- The LLM fallback in `FactChecker._querySources()` produces synthesized
|
|
65
65
|
sources when no `SEARCH_API_KEY` is set. These are not real citations and
|
|
66
66
|
should not be presented as authoritative without a real search provider.
|
|
67
|
-
- Pollinations.ai image requests are unauthenticated — do not include
|
|
68
|
-
private or sensitive content in image prompts.
|
|
69
67
|
- `PUBLISH_WEBHOOK_URL` and `REVIEW_NOTIFY_URL` receivers are trusted
|
|
70
68
|
endpoints; ensure they are authenticated on your side before deploying
|
|
71
69
|
to production.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amg555/frameforge-mcp",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.4",
|
|
4
4
|
"description": "FrameForge — AI video production engine for agentic IDEs. npx @amg555/frameforge-mcp. FFmpeg + TTS run on your machine. 17 MCP tools.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
"frameforge": "src/cli/make.js",
|
|
11
11
|
"frameforge-mcp": "src/mcp-server/stdio.js",
|
|
12
12
|
"frameforge-setup": "src/cli/setup-keys.js",
|
|
13
|
-
"frameforge-doctor": "src/cli/doctor.js"
|
|
13
|
+
"frameforge-doctor": "src/cli/doctor.js",
|
|
14
|
+
"frameforge-harness": "src/harness/bin/harness.mjs"
|
|
14
15
|
},
|
|
15
16
|
"scripts": {
|
|
16
17
|
"make": "node src/cli/make.js",
|
|
18
|
+
"harness": "node src/harness/bin/harness.mjs",
|
|
19
|
+
"harness:doctor": "node src/harness/bin/harness.mjs doctor",
|
|
20
|
+
"harness:verify": "node src/harness/bin/harness.mjs verify",
|
|
17
21
|
"setup": "node src/cli/setup-keys.js",
|
|
18
22
|
"setup:check": "node src/cli/setup-keys.js --check",
|
|
19
23
|
"doctor": "node src/cli/doctor.js",
|
|
@@ -26,7 +30,7 @@
|
|
|
26
30
|
"start:local-render": "cross-env RENDER_MODE=full WORKER_PORT=3211 node src/worker/server-render-free.js",
|
|
27
31
|
"db:migrate": "node scripts/db-migrate.js",
|
|
28
32
|
"validate": "node scripts/deep-validate.js",
|
|
29
|
-
"test": "node --test src/pipeline/retry-policy.test.js src/pipeline/telemetry.test.js src/pipeline/artifact-manifest.test.js src/pipeline/artifact-retention.test.js src/pipeline/external-adapter.test.js src/workflows/publishing.test.js src/workflows/script.test.js src/animation/animation-system.test.js src/fact-checker/review-gate.test.js src/fact-checker/checker.test.js src/utils/log-redaction.test.js src/worker/server-render-free.test.js src/worker/server.test.js src/mcp-server/server.test.js src/quality-gate/gate.test.js src/shorts-extractor/extractor.test.js src/audio-mixer/mixer.test.js src/video-renderer/renderer.test.js plugins/video-pipeline/skills/video-pipeline/assets/project/reel/engine.test.js src/integration.test.js",
|
|
33
|
+
"test": "node --test src/pipeline/retry-policy.test.js src/pipeline/telemetry.test.js src/pipeline/artifact-manifest.test.js src/pipeline/artifact-retention.test.js src/pipeline/external-adapter.test.js src/workflows/publishing.test.js src/workflows/script.test.js src/animation/animation-system.test.js src/fact-checker/review-gate.test.js src/fact-checker/checker.test.js src/utils/log-redaction.test.js src/worker/server-render-free.test.js src/worker/server.test.js src/mcp-server/server.test.js src/quality-gate/gate.test.js src/shorts-extractor/extractor.test.js src/audio-mixer/mixer.test.js src/video-renderer/renderer.test.js plugins/video-pipeline/skills/video-pipeline/assets/project/reel/engine.test.js src/harness/lib/pixels.test.js src/harness/lib/verify-purity.test.js src/harness/harness.test.js src/integration.test.js",
|
|
30
34
|
"lint": "echo 'No linter configured — add eslint for production'",
|
|
31
35
|
"check-credentials": "node src/utils/log-redaction.js",
|
|
32
36
|
"generate-assets": "node scripts/generate-initial-assets.js",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "video-pipeline",
|
|
3
|
+
"displayName": "FrameForge Video Pipeline",
|
|
4
|
+
"version": "2.3.1",
|
|
5
|
+
"description": "End-to-end AI video production. IDE writes scenes → FrameForge renders. Or: scaffold a Playwright+ffmpeg code-driven animation. Or: auto-research and script the video.",
|
|
6
|
+
"skills": [
|
|
7
|
+
{
|
|
8
|
+
"name": "video-pipeline",
|
|
9
|
+
"path": "skills/video-pipeline/SKILL.md",
|
|
10
|
+
"displayName": "Video Pipeline",
|
|
11
|
+
"description": "17 MCP tools: create_video_from_script, scaffold_animation_project, render_animation, validate_storyboard, multi_voice_tts, ingest_media, edit_scenes, research_topic, write_script, queue_full_pipeline, and more."
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"mcpServer": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["--yes", "--package=@amg555/frameforge-mcp", "frameforge-mcp"],
|
|
17
|
+
"description": "Starts the FrameForge MCP server. No install needed — npx pulls from npm."
|
|
18
|
+
}
|
|
19
|
+
}
|