@openvidstudio/mcp-server 0.1.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.
Files changed (94) hide show
  1. package/dist/beats.d.ts +47 -0
  2. package/dist/beats.js +9 -0
  3. package/dist/capture.d.ts +116 -0
  4. package/dist/capture.js +148 -0
  5. package/dist/config.d.ts +58 -0
  6. package/dist/config.js +130 -0
  7. package/dist/paths.d.ts +20 -0
  8. package/dist/paths.js +57 -0
  9. package/dist/scenes/pngSize.d.ts +11 -0
  10. package/dist/scenes/pngSize.js +75 -0
  11. package/dist/scenes/templates.d.ts +42 -0
  12. package/dist/scenes/templates.js +468 -0
  13. package/dist/server.d.ts +16 -0
  14. package/dist/server.js +37 -0
  15. package/dist/stdio.d.ts +2 -0
  16. package/dist/stdio.js +33 -0
  17. package/dist/tools/captureScreenRecording.d.ts +28 -0
  18. package/dist/tools/captureScreenRecording.js +181 -0
  19. package/dist/tools/captureScreenshot.d.ts +34 -0
  20. package/dist/tools/captureScreenshot.js +148 -0
  21. package/dist/tools/contactSheet.d.ts +36 -0
  22. package/dist/tools/contactSheet.js +116 -0
  23. package/dist/tools/generateNarration.d.ts +54 -0
  24. package/dist/tools/generateNarration.js +185 -0
  25. package/dist/tools/importHiggsfieldClip.d.ts +41 -0
  26. package/dist/tools/importHiggsfieldClip.js +108 -0
  27. package/dist/tools/index.d.ts +13 -0
  28. package/dist/tools/index.js +47 -0
  29. package/dist/tools/initProject.d.ts +37 -0
  30. package/dist/tools/initProject.js +166 -0
  31. package/dist/tools/mcp.d.ts +33 -0
  32. package/dist/tools/mcp.js +36 -0
  33. package/dist/tools/planBeats.d.ts +40 -0
  34. package/dist/tools/planBeats.js +143 -0
  35. package/dist/tools/preflight.d.ts +30 -0
  36. package/dist/tools/preflight.js +170 -0
  37. package/dist/tools/qcExtractFrames.d.ts +25 -0
  38. package/dist/tools/qcExtractFrames.js +129 -0
  39. package/dist/tools/renderVideo.d.ts +43 -0
  40. package/dist/tools/renderVideo.js +120 -0
  41. package/dist/tools/scaffoldScene.d.ts +23 -0
  42. package/dist/tools/scaffoldScene.js +147 -0
  43. package/dist/tools/stitchComposition.d.ts +24 -0
  44. package/dist/tools/stitchComposition.js +230 -0
  45. package/dist/tools/validateBeats.d.ts +14 -0
  46. package/dist/tools/validateBeats.js +164 -0
  47. package/dist/tools/validateScenes.d.ts +31 -0
  48. package/dist/tools/validateScenes.js +191 -0
  49. package/dist/tools/writeBeatsFile.d.ts +20 -0
  50. package/dist/tools/writeBeatsFile.js +81 -0
  51. package/dist/util.d.ts +43 -0
  52. package/dist/util.js +163 -0
  53. package/docs/API.md +344 -0
  54. package/docs/CAPTURE.md +106 -0
  55. package/docs/HIGGSFIELD.md +118 -0
  56. package/docs/NARRATION.md +111 -0
  57. package/docs/OVERVIEW.md +112 -0
  58. package/docs/PIPELINE.md +173 -0
  59. package/docs/PLANNING.md +206 -0
  60. package/docs/SCRIPT.md +50 -0
  61. package/docs/STYLE.md +88 -0
  62. package/package.json +54 -0
  63. package/templates/default/CLAUDE.md +63 -0
  64. package/templates/default/openvidstudio-core/package.json +51 -0
  65. package/templates/default/openvidstudio-core/scripts/gen-sfx.sh +74 -0
  66. package/templates/default/openvidstudio-core/src/ChecklistPanel.tsx +97 -0
  67. package/templates/default/openvidstudio-core/src/CinematicScene.tsx +53 -0
  68. package/templates/default/openvidstudio-core/src/CodePanel.tsx +122 -0
  69. package/templates/default/openvidstudio-core/src/CursorActor.tsx +90 -0
  70. package/templates/default/openvidstudio-core/src/DeviceFrame.tsx +74 -0
  71. package/templates/default/openvidstudio-core/src/KineticText.tsx +142 -0
  72. package/templates/default/openvidstudio-core/src/RepoCta.tsx +128 -0
  73. package/templates/default/openvidstudio-core/src/TerminalReplay.tsx +263 -0
  74. package/templates/default/openvidstudio-core/src/camera.tsx +141 -0
  75. package/templates/default/openvidstudio-core/src/index.ts +60 -0
  76. package/templates/default/openvidstudio-core/src/look.tsx +90 -0
  77. package/templates/default/openvidstudio-core/src/motion.ts +50 -0
  78. package/templates/default/openvidstudio-core/src/sfx.tsx +106 -0
  79. package/templates/default/openvidstudio-core/src/tokens.ts +41 -0
  80. package/templates/default/package.json +31 -0
  81. package/templates/default/public/sfx/bell.wav +0 -0
  82. package/templates/default/public/sfx/blip.wav +0 -0
  83. package/templates/default/public/sfx/click.wav +0 -0
  84. package/templates/default/public/sfx/key_a.wav +0 -0
  85. package/templates/default/public/sfx/key_b.wav +0 -0
  86. package/templates/default/public/sfx/key_c.wav +0 -0
  87. package/templates/default/public/sfx/key_enter.wav +0 -0
  88. package/templates/default/public/sfx/music-bed.mp3 +0 -0
  89. package/templates/default/public/sfx/success.wav +0 -0
  90. package/templates/default/public/sfx/whoosh.wav +0 -0
  91. package/templates/default/remotion.config.ts +13 -0
  92. package/templates/default/src/Root.tsx +9 -0
  93. package/templates/default/src/index.ts +4 -0
  94. package/templates/default/tsconfig.json +16 -0
@@ -0,0 +1,50 @@
1
+ // Easing + spring presets. Linear easing is banned (STYLE.md). Always pick from here.
2
+
3
+ import { Easing, interpolate, spring } from "remotion";
4
+
5
+ export const E = {
6
+ // default cinematic move: slow-out, soft landing
7
+ cinematic: Easing.bezier(0.33, 0.0, 0.13, 1.0),
8
+ // aggressive whip (cuts, fast pans)
9
+ whip: Easing.bezier(0.8, 0.0, 0.1, 1.0),
10
+ // gentle drift (ambient motion inside a shot)
11
+ drift: Easing.bezier(0.4, 0.0, 0.6, 1.0),
12
+ // snappy UI reaction (button press, blip reveal)
13
+ snap: Easing.bezier(0.2, 0.9, 0.25, 1.0),
14
+ } as const;
15
+
16
+ export const SPRING = {
17
+ soft: { damping: 26, stiffness: 90, mass: 1 },
18
+ pop: { damping: 14, stiffness: 160, mass: 0.8 },
19
+ heavy: { damping: 30, stiffness: 60, mass: 1.4 },
20
+ } as const;
21
+
22
+ /** interpolate with a mandatory named easing and clamped edges. */
23
+ export const tween = (
24
+ frame: number,
25
+ range: [number, number],
26
+ out: [number, number],
27
+ easing: (t: number) => number = E.cinematic,
28
+ ) =>
29
+ interpolate(frame, range, out, {
30
+ easing,
31
+ extrapolateLeft: "clamp",
32
+ extrapolateRight: "clamp",
33
+ });
34
+
35
+ /** spring entrance helper */
36
+ export const pop = (
37
+ frame: number,
38
+ fps: number,
39
+ delay = 0,
40
+ config: { damping: number; stiffness: number; mass: number } = SPRING.pop,
41
+ ) => spring({ frame: frame - delay, fps, config });
42
+
43
+ /** deterministic per-frame pseudo-random (for grain jitter etc.) */
44
+ export const jitter = (frame: number, seed = 1) => {
45
+ const x = Math.sin(frame * 127.1 + seed * 311.7) * 43758.5453;
46
+ return x - Math.floor(x); // 0..1
47
+ };
48
+
49
+ /** stagger helper: frame offset for item i */
50
+ export const staggerDelay = (i: number, step = 3) => i * step;
@@ -0,0 +1,106 @@
1
+ // SFX sequencer. All sounds live in public/sfx/ (generated by scripts/gen-sfx.sh).
2
+ // Components emit sounds by rendering these helpers at computed frames, audio stays
3
+ // perfectly in sync with visuals because both derive from the same frame math.
4
+
5
+ import React from "react";
6
+ import { Audio, Sequence, staticFile } from "remotion";
7
+ import { jitter } from "./motion";
8
+
9
+ const KEYS = ["key_a.wav", "key_b.wav", "key_c.wav"];
10
+
11
+ export const KeySound: React.FC<{ at: number; seed?: number; volume?: number }> = ({
12
+ at,
13
+ seed = 0,
14
+ volume = 0.16,
15
+ }) => (
16
+ <Sequence from={at} durationInFrames={6}>
17
+ <Audio
18
+ src={staticFile(`sfx/${KEYS[Math.floor(jitter(at, seed) * KEYS.length)]}`)}
19
+ volume={volume}
20
+ />
21
+ </Sequence>
22
+ );
23
+
24
+ /** One KeySound per typed character. charFrames = absolute frame each char appears. */
25
+ export const TypingSfx: React.FC<{ charFrames: number[]; volume?: number }> = ({
26
+ charFrames,
27
+ volume = 0.16,
28
+ }) => (
29
+ <>
30
+ {charFrames.map((f, i) => (
31
+ <KeySound key={i} at={f} seed={i} volume={volume} />
32
+ ))}
33
+ </>
34
+ );
35
+
36
+ export const Click: React.FC<{ at: number; volume?: number }> = ({
37
+ at,
38
+ volume = 0.4,
39
+ }) => (
40
+ <Sequence from={at} durationInFrames={8}>
41
+ <Audio src={staticFile("sfx/click.wav")} volume={volume} />
42
+ </Sequence>
43
+ );
44
+
45
+ export const Whoosh: React.FC<{ at: number; volume?: number }> = ({
46
+ at,
47
+ volume = 0.35,
48
+ }) => (
49
+ <Sequence from={at} durationInFrames={20}>
50
+ <Audio src={staticFile("sfx/whoosh.wav")} volume={volume} />
51
+ </Sequence>
52
+ );
53
+
54
+ export const Blip: React.FC<{ at: number; volume?: number }> = ({
55
+ at,
56
+ volume = 0.3,
57
+ }) => (
58
+ <Sequence from={at} durationInFrames={8}>
59
+ <Audio src={staticFile("sfx/blip.wav")} volume={volume} />
60
+ </Sequence>
61
+ );
62
+
63
+ export const SuccessChime: React.FC<{ at: number; volume?: number }> = ({
64
+ at,
65
+ volume = 0.35,
66
+ }) => (
67
+ <Sequence from={at} durationInFrames={20}>
68
+ <Audio src={staticFile("sfx/success.wav")} volume={volume} />
69
+ </Sequence>
70
+ );
71
+
72
+ /** Struck bell, for a completion moment that wants more weight than a chime. */
73
+ export const Bell: React.FC<{ at: number; volume?: number }> = ({
74
+ at,
75
+ volume = 0.3,
76
+ }) => (
77
+ <Sequence from={at} durationInFrames={48}>
78
+ <Audio src={staticFile("sfx/bell.wav")} volume={volume} />
79
+ </Sequence>
80
+ );
81
+
82
+ /** Enter key. Deeper and heavier than a letter key, for the end of a typed command. */
83
+ export const EnterKey: React.FC<{ at: number; volume?: number }> = ({
84
+ at,
85
+ volume = 0.2,
86
+ }) => (
87
+ <Sequence from={at} durationInFrames={8}>
88
+ <Audio src={staticFile("sfx/key_enter.wav")} volume={volume} />
89
+ </Sequence>
90
+ );
91
+
92
+ /**
93
+ * Ambient bed under the whole composition.
94
+ *
95
+ * Synthesized by scripts/gen-sfx.sh rather than licensed, so a rendered video
96
+ * carries no third-party audio rights. The source is 60s; `durationInFrames` loops
97
+ * it to cover the composition.
98
+ */
99
+ export const MusicBed: React.FC<{ durationInFrames: number; volume?: number }> = ({
100
+ durationInFrames,
101
+ volume = 0.16,
102
+ }) => (
103
+ <Sequence from={0} durationInFrames={durationInFrames}>
104
+ <Audio src={staticFile("sfx/music-bed.mp3")} volume={volume} loop />
105
+ </Sequence>
106
+ );
@@ -0,0 +1,41 @@
1
+ // Design tokens: single source for every scene. Per-video themes may override via themes/.
2
+
3
+ export const color = {
4
+ // dark stage
5
+ bg0: "#0B0E14",
6
+ bg1: "#11151F",
7
+ panel: "#151A24",
8
+ panelBorder: "#232B3A",
9
+ textPrimary: "#E6EAF2",
10
+ textSecondary: "#8A94A6",
11
+ // accents
12
+ accent: "#4E9EFF",
13
+ accentAlt: "#9D6BFF",
14
+ success: "#3ECF8E",
15
+ warn: "#F5A623",
16
+ danger: "#F26D6D",
17
+ // light scenes
18
+ lightBg: "#F4F6F9",
19
+ lightCard: "#FFFFFF",
20
+ lightShadow: "rgba(15,23,42,0.12)",
21
+ } as const;
22
+
23
+ export const font = {
24
+ ui: "Inter",
25
+ mono: "JetBrains Mono",
26
+ } as const;
27
+
28
+ export const glow = (c: string, strength = 1) => ({
29
+ textShadow: `0 0 ${8 * strength}px ${c}88, 0 0 ${24 * strength}px ${c}44`,
30
+ });
31
+
32
+ export const panelShadow = (dark = true) =>
33
+ dark
34
+ ? "0 24px 80px rgba(0,0,0,0.55), 0 4px 16px rgba(0,0,0,0.4)"
35
+ : `0 24px 80px ${color.lightShadow}, 0 4px 16px rgba(15,23,42,0.08)`;
36
+
37
+ export const radius = {
38
+ window: 12,
39
+ card: 10,
40
+ pill: 999,
41
+ } as const;
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "openvidstudio-project",
3
+ "version": "0.1.0",
4
+ "description": "An openvidstudio video project, scaffolded from templates/default.",
5
+ "private": true,
6
+ "dependencies": {
7
+ "@openvidstudio/core": "file:./openvidstudio-core",
8
+ "@remotion/cli": "4.0.490",
9
+ "@remotion/google-fonts": "^4.0.490",
10
+ "@remotion/shapes": "^4.0.490",
11
+ "@remotion/tailwind-v4": "4.0.490",
12
+ "@remotion/transitions": "^4.0.490",
13
+ "react": "19.2.3",
14
+ "react-dom": "19.2.3",
15
+ "remotion": "4.0.490",
16
+ "tailwindcss": "4.0.0"
17
+ },
18
+ "devDependencies": {
19
+ "@types/react": "19.2.7",
20
+ "@types/web": "0.0.166",
21
+ "typescript": "5.9.3"
22
+ },
23
+ "scripts": {
24
+ "dev": "remotion studio",
25
+ "build": "remotion bundle",
26
+ "upgrade": "remotion upgrade"
27
+ },
28
+ "sideEffects": [
29
+ "*.css"
30
+ ]
31
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Note: When using the Node.JS APIs, the config file
3
+ * doesn't apply. Instead, pass options directly to the APIs.
4
+ *
5
+ * All configuration options: https://remotion.dev/docs/config
6
+ */
7
+
8
+ import { Config } from "@remotion/cli/config";
9
+ import { enableTailwind } from "@remotion/tailwind-v4";
10
+
11
+ Config.setVideoImageFormat("jpeg");
12
+ Config.setOverwriteOutput(true);
13
+ Config.overrideWebpackConfig(enableTailwind);
@@ -0,0 +1,9 @@
1
+ // Bare Remotion root. No compositions registered yet. stitch_composition
2
+ // (not init_project) populates this file, via src/videos/.registry.json,
3
+ // once at least one video has been scaffolded and stitched.
4
+
5
+ import React from "react";
6
+
7
+ export const RemotionRoot: React.FC = () => {
8
+ return null;
9
+ };
@@ -0,0 +1,4 @@
1
+ import { registerRoot } from "remotion";
2
+ import { RemotionRoot } from "./Root";
3
+
4
+ registerRoot(RemotionRoot);
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "jsx": "react-jsx",
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "lib": ["ES2020", "DOM"],
9
+ "esModuleInterop": true,
10
+ "resolveJsonModule": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "noUnusedLocals": true
14
+ },
15
+ "exclude": ["remotion.config.ts"]
16
+ }