@remotion/cli 4.0.501 → 4.0.503

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/dist/benchmark.js CHANGED
@@ -104,11 +104,14 @@ const benchmarkCommand = async (remotionRoot, args, logLevel) => {
104
104
  process.exit(1);
105
105
  }
106
106
  const fullEntryPoint = (0, convert_entry_point_to_serve_url_1.convertEntryPointToServeUrl)(file);
107
- const { inputProps, envVariables, frameRange: defaultFrameRange, ffmpegOverride, } = (0, get_cli_options_1.getCliOptions)({
107
+ const { inputProps, envVariables, frameRange: defaultFrameRange, selectedFrames, ffmpegOverride, } = (0, get_cli_options_1.getCliOptions)({
108
108
  isStill: false,
109
109
  logLevel,
110
110
  indent: false,
111
111
  });
112
+ if (selectedFrames !== null) {
113
+ throw new Error('Comma-separated frame selections are only supported by the `render` command.');
114
+ }
112
115
  const unparsedConcurrency = concurrencyOption.getValue({
113
116
  commandLine: parsed_cli_1.parsedCli,
114
117
  }).value;
@@ -1,5 +1,5 @@
1
1
  import type { BundlerOverrideFn, RspackConfiguration, RspackOverrideFn, WebpackConfiguration, WebpackOverrideFn } from '@remotion/bundler';
2
- import type { BrowserExecutable, ChromeMode, CodecOrUndefined, ColorSpace, Crf, DeleteAfter, FrameRange, NumberOfGifLoops, StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
+ import type { BrowserExecutable, ChromeMode, CodecOrUndefined, ColorSpace, Crf, DeleteAfter, DefaultEditor, FrameRange, NumberOfGifLoops, StillImageFormat, VideoImageFormat } from '@remotion/renderer';
3
3
  import type { HardwareAccelerationOption } from '@remotion/renderer/client';
4
4
  import type { Concurrency } from './concurrency';
5
5
  export type { BundlerOverrideFn, Concurrency, RspackConfiguration, RspackOverrideFn, WebpackConfiguration, WebpackOverrideFn, };
@@ -66,10 +66,14 @@ declare global {
66
66
  */
67
67
  readonly setAllowHtmlInCanvasEnabled: (enabled: boolean) => void;
68
68
  /**
69
- * Enable experimental Rspack bundler instead of Webpack.
69
+ * Enable the Rspack bundler instead of Webpack.
70
70
  * @param enabled Boolean whether to enable the Rspack bundler
71
71
  * @default false
72
72
  */
73
+ readonly setRspack: (enabled: boolean) => void;
74
+ /**
75
+ * @deprecated Use `setRspack()` instead: https://www.remotion.dev/docs/config#setrspack
76
+ */
73
77
  readonly setExperimentalRspackEnabled: (enabled: boolean) => void;
74
78
  /**
75
79
  * Set number of shared audio tags. https://www.remotion.dev/docs/player/autoplay#using-the-numberofsharedaudiotags-prop
@@ -380,6 +384,10 @@ type FlatConfig = RemotionConfigObject & RemotionBundlingOptions & {
380
384
  * Default: false
381
385
  */
382
386
  setForceNewStudioEnabled: (forceNew: boolean) => void;
387
+ /**
388
+ * Set the editor used when opening files from Remotion Studio.
389
+ */
390
+ setDefaultEditor: (editor: DefaultEditor) => void;
383
391
  setDeleteAfter: (day: DeleteAfter | null) => void;
384
392
  /**
385
393
  * Set whether S3 buckets should be allowed to expire.
@@ -18,7 +18,7 @@ const preview_server_1 = require("./preview-server");
18
18
  const still_frame_1 = require("./still-frame");
19
19
  const webpack_caching_1 = require("./webpack-caching");
20
20
  const webpack_poll_1 = require("./webpack-poll");
21
- const { benchmarkConcurrenciesOption, concurrencyOption, offthreadVideoCacheSizeInBytesOption, x264Option, audioBitrateOption, videoBitrateOption, scaleOption, crfOption, jpegQualityOption, enforceAudioOption, overwriteOption, chromeModeOption, mutedOption, videoCodecOption, colorSpaceOption, disallowParallelEncodingOption, deleteAfterOption, folderExpiryOption, enableMultiprocessOnLinuxOption, glOption, gopSizeOption, headlessOption, numberOfGifLoopsOption, beepOnFinishOption, encodingMaxRateOption, encodingBufferSizeOption, reproOption, enableLambdaInsights, logLevelOption, delayRenderTimeoutInMillisecondsOption, publicDirOption, binariesDirectoryOption, preferLosslessOption, framesOption, forSeamlessAacConcatenationOption, audioCodecOption, publicPathOption, hardwareAccelerationOption, audioLatencyHintOption, enableCrossSiteIsolationOption, imageSequencePatternOption, darkModeOption, askAIOption, publicLicenseKeyOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, pixelFormatOption, browserExecutableOption, everyNthFrameOption, proResProfileOption, stillImageFormatOption, videoImageFormatOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, rspackOption, outDirOption, webpackPollOption, imageSequenceOption, bundleCacheOption, envFileOption, runsOption, noOpenOption, sampleRateOption, previewSampleRateOption, } = client_1.BrowserSafeApis.options;
21
+ const { benchmarkConcurrenciesOption, concurrencyOption, offthreadVideoCacheSizeInBytesOption, x264Option, audioBitrateOption, videoBitrateOption, scaleOption, crfOption, jpegQualityOption, enforceAudioOption, overwriteOption, chromeModeOption, mutedOption, videoCodecOption, colorSpaceOption, disallowParallelEncodingOption, deleteAfterOption, folderExpiryOption, enableMultiprocessOnLinuxOption, glOption, gopSizeOption, headlessOption, numberOfGifLoopsOption, beepOnFinishOption, encodingMaxRateOption, encodingBufferSizeOption, reproOption, enableLambdaInsights, logLevelOption, delayRenderTimeoutInMillisecondsOption, publicDirOption, binariesDirectoryOption, preferLosslessOption, framesOption, forSeamlessAacConcatenationOption, audioCodecOption, publicPathOption, hardwareAccelerationOption, audioLatencyHintOption, enableCrossSiteIsolationOption, imageSequencePatternOption, darkModeOption, defaultEditorOption, askAIOption, publicLicenseKeyOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, pixelFormatOption, browserExecutableOption, everyNthFrameOption, proResProfileOption, stillImageFormatOption, videoImageFormatOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, rspackOption, outDirOption, webpackPollOption, imageSequenceOption, bundleCacheOption, envFileOption, runsOption, noOpenOption, sampleRateOption, previewSampleRateOption, } = client_1.BrowserSafeApis.options;
22
22
  const setAllowHtmlInCanvasEnabled = (_enabled) => {
23
23
  log_1.Log.warn({ indent: false, logLevel: 'info' }, 'Config.setAllowHtmlInCanvasEnabled() is now a no-op because HTML-in-canvas is enabled by default when supported. You can remove this option from your config file.');
24
24
  };
@@ -45,6 +45,7 @@ exports.Config = {
45
45
  setKeyboardShortcutsEnabled: keyboardShortcutsOption.setConfig,
46
46
  setInteractivityEnabled: interactivityOption.setConfig,
47
47
  setAllowHtmlInCanvasEnabled,
48
+ setRspack: rspackOption.setConfig,
48
49
  setExperimentalRspackEnabled: rspackOption.setConfig,
49
50
  setNumberOfSharedAudioTags: numberOfSharedAudioTagsOption.setConfig,
50
51
  setWebpackPollingInMilliseconds: webpackPollOption.setConfig,
@@ -127,6 +128,7 @@ exports.Config = {
127
128
  setEnableCrossSiteIsolation: enableCrossSiteIsolationOption.setConfig,
128
129
  setAskAIEnabled: askAIOption.setConfig,
129
130
  setPublicLicenseKey: publicLicenseKeyOption.setConfig,
131
+ setDefaultEditor: defaultEditorOption.setConfig,
130
132
  setForceNewStudioEnabled: forceNewStudioOption.setConfig,
131
133
  setIPv4: ipv4Option.setConfig,
132
134
  setBundleOutDir: outDirOption.setConfig,
@@ -0,0 +1,2 @@
1
+ export { detectOutdatedRemotionSkills, parseRemotionSkillVersion, } from '@remotion/studio-server';
2
+ export type { RemotionSkillsScope, RemotionSkillsStatus, } from '@remotion/studio-server';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRemotionSkillVersion = exports.detectOutdatedRemotionSkills = void 0;
4
+ const studio_server_1 = require("@remotion/studio-server");
5
+ Object.defineProperty(exports, "detectOutdatedRemotionSkills", { enumerable: true, get: function () { return studio_server_1.detectOutdatedRemotionSkills; } });
6
+ Object.defineProperty(exports, "parseRemotionSkillVersion", { enumerable: true, get: function () { return studio_server_1.parseRemotionSkillVersion; } });
@@ -1,13 +1,15 @@
1
+ import type { FfmpegOverrideFn, FrameRange } from '@remotion/renderer';
1
2
  export declare const getAndValidateAbsoluteOutputFile: (relativeOutputLocation: string, overwrite: boolean, logLevel: "error" | "info" | "trace" | "verbose" | "warn") => string;
2
3
  export declare const getCliOptions: (options: {
3
4
  isStill: boolean;
4
5
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
5
6
  indent: boolean;
6
7
  }) => {
7
- frameRange: import("@remotion/renderer").FrameRange | null;
8
+ frameRange: FrameRange | null;
9
+ selectedFrames: number[] | null;
8
10
  shouldOutputImageSequence: boolean;
9
11
  inputProps: Record<string, unknown>;
10
12
  envVariables: Record<string, string>;
11
13
  stillFrame: number;
12
- ffmpegOverride: import("@remotion/renderer").FfmpegOverrideFn;
14
+ ffmpegOverride: FfmpegOverrideFn;
13
15
  };
@@ -13,15 +13,21 @@ const get_input_props_1 = require("./get-input-props");
13
13
  const log_1 = require("./log");
14
14
  const parsed_cli_1 = require("./parsed-cli");
15
15
  const getAndValidateFrameRange = (logLevel, indent) => {
16
- const frameRange = client_1.BrowserSafeApis.options.framesOption.getValue({
16
+ const frameSelection = client_1.BrowserSafeApis.options.framesOption.getValue({
17
17
  commandLine: parsed_cli_1.parsedCli,
18
18
  }).value;
19
+ const selectedFrames = typeof frameSelection === 'object' &&
20
+ frameSelection !== null &&
21
+ !Array.isArray(frameSelection)
22
+ ? frameSelection.frames
23
+ : null;
24
+ const frameRange = selectedFrames === null ? frameSelection : null;
19
25
  if (typeof frameRange === 'number') {
20
26
  log_1.Log.warn({ logLevel, indent }, 'Selected a single frame. Assuming you want to output an image.');
21
27
  log_1.Log.warn({ logLevel, indent }, `If you want to render a video, pass a range: '--frames=${frameRange}-${frameRange}'.`);
22
28
  log_1.Log.warn({ indent, logLevel }, "To dismiss this message, add the '--sequence' flag explicitly.");
23
29
  }
24
- return frameRange;
30
+ return { frameRange, selectedFrames };
25
31
  };
26
32
  const getAndValidateAbsoluteOutputFile = (relativeOutputLocation, overwrite, logLevel) => {
27
33
  const absoluteOutputFile = node_path_1.default.resolve(process.cwd(), relativeOutputLocation);
@@ -34,15 +40,18 @@ const getAndValidateAbsoluteOutputFile = (relativeOutputLocation, overwrite, log
34
40
  exports.getAndValidateAbsoluteOutputFile = getAndValidateAbsoluteOutputFile;
35
41
  const getCliOptions = (options) => {
36
42
  var _a;
37
- const frameRange = getAndValidateFrameRange(options.logLevel, false);
43
+ const { frameRange, selectedFrames } = getAndValidateFrameRange(options.logLevel, false);
38
44
  const imageSequence = client_1.BrowserSafeApis.options.imageSequenceOption.getValue({
39
45
  commandLine: parsed_cli_1.parsedCli,
40
46
  }).value;
41
47
  const shouldOutputImageSequence = options.isStill
42
48
  ? true
43
- : imageSequence || typeof frameRange === 'number';
49
+ : imageSequence ||
50
+ typeof frameRange === 'number' ||
51
+ selectedFrames !== null;
44
52
  return {
45
53
  frameRange,
54
+ selectedFrames,
46
55
  shouldOutputImageSequence,
47
56
  inputProps: (0, get_input_props_1.getInputProps)(null, options.logLevel),
48
57
  envVariables: (0, get_env_1.getEnvironmentVariables)(null, options.logLevel, options.indent),
@@ -7,10 +7,11 @@ exports.reloadConfig = exports.loadConfig = exports.getLoadedConfigFile = void 0
7
7
  const node_fs_1 = require("node:fs");
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const client_1 = require("@remotion/renderer/client");
10
+ const config_1 = require("./config");
10
11
  const load_config_1 = require("./load-config");
11
12
  const log_1 = require("./log");
12
13
  const parsed_cli_1 = require("./parsed-cli");
13
- const { configOption } = client_1.BrowserSafeApis.options;
14
+ const { configOption, logLevelOption, rspackOption } = client_1.BrowserSafeApis.options;
14
15
  const defaultConfigFileJavascript = 'remotion.config.js';
15
16
  const defaultConfigFileTypescript = 'remotion.config.ts';
16
17
  let loadedConfigFile = null;
@@ -19,9 +20,32 @@ const getLoadedConfigFile = () => {
19
20
  return (_a = loadedConfigFile === null || loadedConfigFile === void 0 ? void 0 : loadedConfigFile.resolved) !== null && _a !== void 0 ? _a : null;
20
21
  };
21
22
  exports.getLoadedConfigFile = getLoadedConfigFile;
23
+ const warnAboutBundlerOverride = () => {
24
+ const useRspack = rspackOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
25
+ const hasWebpackOverride = config_1.ConfigInternals.getWebpackOverrideFn() !==
26
+ config_1.ConfigInternals.defaultOverrideFunction;
27
+ const hasRspackOverride = config_1.ConfigInternals.getRspackOverrideFn() !==
28
+ config_1.ConfigInternals.defaultRspackOverrideFunction;
29
+ if ((useRspack && !hasWebpackOverride) ||
30
+ (!useRspack && !hasRspackOverride)) {
31
+ return;
32
+ }
33
+ const selectedBundler = useRspack ? 'Rspack' : 'Webpack';
34
+ const ignoredBundler = useRspack ? 'Webpack' : 'Rspack';
35
+ const selectedOverride = useRspack
36
+ ? 'overrideRspackConfig'
37
+ : 'overrideWebpackConfig';
38
+ const ignoredOverride = useRspack
39
+ ? 'overrideWebpackConfig'
40
+ : 'overrideRspackConfig';
41
+ const logLevel = logLevelOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
42
+ log_1.Log.warn({ indent: false, logLevel }, `You have selected ${selectedBundler} as the bundler, but Config.${ignoredOverride}() was called. The ${ignoredBundler} override will be ignored. Use Config.${selectedOverride}() or Config.overrideBundlerConfig() instead.`);
43
+ };
22
44
  const loadInitialConfigFile = async (remotionRoot, configFileName, isJavascript) => {
23
45
  try {
24
- return await (0, load_config_1.loadConfigFile)(remotionRoot, configFileName, isJavascript);
46
+ const config = await (0, load_config_1.loadConfigFile)(remotionRoot, configFileName, isJavascript);
47
+ warnAboutBundlerOverride();
48
+ return config;
25
49
  }
26
50
  catch (error) {
27
51
  log_1.Log.error({ indent: false, logLevel: 'error' }, error instanceof Error ? error.message : String(error));
@@ -72,6 +96,7 @@ const reloadConfig = async ({ resetConfigOptions, }) => {
72
96
  try {
73
97
  (0, load_config_1.executeConfigFile)(nextConfigFile);
74
98
  loadedConfigFile = nextConfigFile;
99
+ warnAboutBundlerOverride();
75
100
  return true;
76
101
  }
77
102
  catch (error) {
@@ -0,0 +1,4 @@
1
+ export declare const getVideoImageFormat: ({ codec, uiImageFormat, }: {
2
+ codec: import("@remotion/renderer").CodecOrUndefined;
3
+ uiImageFormat: "jpeg" | "none" | "png" | null;
4
+ }) => "jpeg" | "none" | "png";
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getVideoImageFormat = void 0;
4
+ const client_1 = require("@remotion/renderer/client");
5
+ const pure_1 = require("@remotion/renderer/pure");
6
+ const parsed_cli_1 = require("./parsed-cli");
7
+ const getVideoImageFormat = ({ codec, uiImageFormat, }) => {
8
+ if (uiImageFormat !== null) {
9
+ return uiImageFormat;
10
+ }
11
+ const configured = client_1.BrowserSafeApis.options.videoImageFormatOption.getValue({
12
+ commandLine: parsed_cli_1.parsedCli,
13
+ }).value;
14
+ if (configured !== null) {
15
+ return configured;
16
+ }
17
+ if (pure_1.NoReactAPIs.isAudioCodec(codec)) {
18
+ return 'none';
19
+ }
20
+ if (codec === 'h264' ||
21
+ codec === 'h264-mkv' ||
22
+ codec === 'h264-ts' ||
23
+ codec === 'h265' ||
24
+ codec === 'av1' ||
25
+ codec === 'vp8' ||
26
+ codec === 'vp9' ||
27
+ codec === 'prores' ||
28
+ codec === 'gif') {
29
+ return 'jpeg';
30
+ }
31
+ if (codec === undefined) {
32
+ return 'png';
33
+ }
34
+ throw new Error('Unrecognized codec ' + codec);
35
+ };
36
+ exports.getVideoImageFormat = getVideoImageFormat;
package/dist/index.d.ts CHANGED
@@ -82,6 +82,7 @@ export declare const CliInternals: {
82
82
  indent: boolean;
83
83
  }) => {
84
84
  frameRange: import("@remotion/renderer").FrameRange | null;
85
+ selectedFrames: number[] | null;
85
86
  shouldOutputImageSequence: boolean;
86
87
  inputProps: Record<string, unknown>;
87
88
  envVariables: Record<string, string>;
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ const still_1 = require("./still");
46
46
  const studio_1 = require("./studio");
47
47
  const upgrade_1 = require("./upgrade");
48
48
  const versions_1 = require("./versions");
49
- const { packageManagerOption, versionFlagOption } = client_1.BrowserSafeApis.options;
49
+ const { packageManagerOption, skipSkillsOption, versionFlagOption } = client_1.BrowserSafeApis.options;
50
50
  const cli = async () => {
51
51
  var _a;
52
52
  const [command, ...args] = parsed_cli_1.parsedCli._;
@@ -113,6 +113,7 @@ const cli = async () => {
113
113
  remotionRoot,
114
114
  packageManager: packageManager !== null && packageManager !== void 0 ? packageManager : undefined,
115
115
  version: (_a = versionFlagOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value) !== null && _a !== void 0 ? _a : undefined,
116
+ skipSkills: skipSkillsOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value,
116
117
  logLevel,
117
118
  args,
118
119
  });
@@ -134,7 +135,10 @@ const cli = async () => {
134
135
  });
135
136
  }
136
137
  else if (command === 'skills') {
137
- await (0, skills_1.skillsCommand)(args, logLevel);
138
+ await (0, skills_1.skillsCommand)(args, logLevel, {
139
+ cwd: process.cwd(),
140
+ environment: process.env,
141
+ });
138
142
  }
139
143
  else if (command === versions_1.VERSIONS_COMMAND) {
140
144
  await (0, versions_1.versionsCommand)(remotionRoot, logLevel);
@@ -12,7 +12,6 @@ exports.listOfRemotionPackages = [
12
12
  '@remotion/brand',
13
13
  '@remotion/bundler',
14
14
  '@remotion/browser-studio',
15
- '@remotion/canvas-capture',
16
15
  '@remotion/claude-code-plugin',
17
16
  '@remotion/cli',
18
17
  '@remotion/cloudrun',
@@ -98,7 +97,7 @@ exports.listOfRemotionPackages = [
98
97
  '@remotion/remotion-media',
99
98
  '@remotion/web-renderer',
100
99
  '@remotion/design',
101
- '@remotion/drag-and-drop',
100
+ '@remotion/studio-protocol',
102
101
  '@remotion/light-leaks',
103
102
  '@remotion/rough-notation',
104
103
  '@remotion/starburst',
@@ -6,6 +6,9 @@ const config_1 = require("./config");
6
6
  const parsed_cli_1 = require("./parsed-cli");
7
7
  const { licenseKeyOption } = client_1.BrowserSafeApis.options;
8
8
  const parseCommandLine = () => {
9
+ if (parsed_cli_1.parsedCli['experimental-rspack'] !== undefined) {
10
+ throw new Error('The --experimental-rspack flag has been removed. Use --rspack from now on.');
11
+ }
9
12
  if (parsed_cli_1.parsedCli.png) {
10
13
  throw new Error('The --png flag has been removed. Use --sequence --image-format=png from now on.');
11
14
  }
@@ -351,6 +351,21 @@ declare const benchmarkConcurrenciesOption: {
351
351
  };
352
352
  setConfig: (value: boolean) => void;
353
353
  id: "dark-mode";
354
+ }, defaultEditorOption: {
355
+ name: string;
356
+ cliFlag: "editor";
357
+ description: () => import("react/jsx-runtime").JSX.Element;
358
+ ssrName: null;
359
+ docLink: string;
360
+ type: import("@remotion/renderer").DefaultEditor | null;
361
+ getValue: ({ commandLine }: {
362
+ commandLine: Record<string, unknown>;
363
+ }) => {
364
+ value: import("@remotion/renderer").DefaultEditor | null;
365
+ source: string;
366
+ };
367
+ setConfig(value: import("@remotion/renderer").DefaultEditor | null): void;
368
+ id: "editor";
354
369
  }, publicLicenseKeyOption: {
355
370
  name: string;
356
371
  cliFlag: "public-license-key";
@@ -983,14 +998,14 @@ declare const benchmarkConcurrenciesOption: {
983
998
  description: () => import("react/jsx-runtime").JSX.Element;
984
999
  ssrName: "frameRange";
985
1000
  docLink: string;
986
- type: import("@remotion/renderer").FrameRange | null;
1001
+ type: import("@remotion/renderer").FrameSelection;
987
1002
  getValue: ({ commandLine }: {
988
1003
  commandLine: Record<string, unknown>;
989
1004
  }) => {
990
1005
  source: string;
991
- value: import("@remotion/renderer").FrameRange | null;
1006
+ value: import("@remotion/renderer").FrameSelection;
992
1007
  };
993
- setConfig: (value: import("@remotion/renderer").FrameRange | null) => void;
1008
+ setConfig: (value: import("@remotion/renderer").FrameSelection) => void;
994
1009
  id: "frames";
995
1010
  }, isProductionOption: {
996
1011
  name: string;
@@ -1131,6 +1146,39 @@ declare const benchmarkConcurrenciesOption: {
1131
1146
  };
1132
1147
  setConfig: (value: number | null) => void;
1133
1148
  id: "preview-sample-rate";
1149
+ }, rspackOption: {
1150
+ name: string;
1151
+ cliFlag: "rspack";
1152
+ description: () => import("react/jsx-runtime").JSX.Element;
1153
+ ssrName: null;
1154
+ docLink: null;
1155
+ type: boolean;
1156
+ getValue: ({ commandLine }: {
1157
+ commandLine: Record<string, unknown>;
1158
+ }) => {
1159
+ value: boolean;
1160
+ source: string;
1161
+ };
1162
+ setConfig(value: boolean): void;
1163
+ id: "rspack";
1164
+ }, skipSkillsOption: {
1165
+ name: string;
1166
+ cliFlag: "skip-skills";
1167
+ description: () => import("react/jsx-runtime").JSX.Element;
1168
+ ssrName: null;
1169
+ docLink: string;
1170
+ getValue: ({ commandLine }: {
1171
+ commandLine: Record<string, unknown>;
1172
+ }) => {
1173
+ source: string;
1174
+ value: true;
1175
+ } | {
1176
+ source: string;
1177
+ value: false;
1178
+ };
1179
+ setConfig: () => never;
1180
+ type: boolean;
1181
+ id: "skip-skills";
1134
1182
  };
1135
1183
  export type CommandLineOptions = {
1136
1184
  [browserExecutableOption.cliFlag]: TypeOfOption<typeof browserExecutableOption>;
@@ -1142,6 +1190,7 @@ export type CommandLineOptions = {
1142
1190
  [envFileOption.cliFlag]: TypeOfOption<typeof envFileOption>;
1143
1191
  [ignoreCertificateErrorsOption.cliFlag]: TypeOfOption<typeof ignoreCertificateErrorsOption> | null;
1144
1192
  [darkModeOption.cliFlag]: TypeOfOption<typeof darkModeOption> | null;
1193
+ [defaultEditorOption.cliFlag]: TypeOfOption<typeof defaultEditorOption>;
1145
1194
  [disableWebSecurityOption.cliFlag]: TypeOfOption<typeof disableWebSecurityOption> | null;
1146
1195
  [everyNthFrameOption.cliFlag]: TypeOfOption<typeof everyNthFrameOption>;
1147
1196
  [numberOfGifLoopsOption.cliFlag]: TypeOfOption<typeof numberOfGifLoopsOption>;
@@ -1210,7 +1259,10 @@ export type CommandLineOptions = {
1210
1259
  [forceNewStudioOption.cliFlag]: TypeOfOption<typeof forceNewStudioOption> | null;
1211
1260
  [sampleRateOption.cliFlag]: TypeOfOption<typeof sampleRateOption>;
1212
1261
  [previewSampleRateOption.cliFlag]: TypeOfOption<typeof previewSampleRateOption>;
1262
+ [rspackOption.cliFlag]: TypeOfOption<typeof rspackOption> | null;
1263
+ 'experimental-rspack'?: unknown;
1213
1264
  [isProductionOption.cliFlag]: TypeOfOption<typeof isProductionOption> | null;
1265
+ [skipSkillsOption.cliFlag]: TypeOfOption<typeof skipSkillsOption>;
1214
1266
  };
1215
1267
  export declare const BooleanFlags: string[];
1216
1268
  export declare const parsedCli: CommandLineOptions & {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.quietFlagProvided = exports.parsedCli = exports.BooleanFlags = void 0;
7
7
  const client_1 = require("@remotion/renderer/client");
8
8
  const minimist_1 = __importDefault(require("minimist"));
9
- const { benchmarkConcurrenciesOption, beepOnFinishOption, colorSpaceOption, concurrencyOption, disallowParallelEncodingOption, offthreadVideoCacheSizeInBytesOption, encodingBufferSizeOption, encodingMaxRateOption, deleteAfterOption, folderExpiryOption, enableMultiprocessOnLinuxOption, numberOfGifLoopsOption, x264Option, enforceAudioOption, jpegQualityOption, audioBitrateOption, videoBitrateOption, audioCodecOption, publicPathOption, audioLatencyHintOption, darkModeOption, publicLicenseKeyOption, forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, pixelFormatOption, browserExecutableOption, everyNthFrameOption, proResProfileOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, outDirOption, packageManagerOption, webpackPollOption, keyboardShortcutsOption, interactivityOption, imageSequencePatternOption, scaleOption, overwriteOption, crfOption, logLevelOption, videoCodecOption, stillFrameOption, imageSequenceOption, versionFlagOption, bundleCacheOption, envFileOption, glOption, gopSizeOption, runsOption, reproOption, mutedOption, headlessOption, disableGitSourceOption, delayRenderTimeoutInMillisecondsOption, framesOption, forSeamlessAacConcatenationOption, isProductionOption, noOpenOption, portOption, propsOption, configOption, browserOption, sampleRateOption, previewSampleRateOption, } = client_1.BrowserSafeApis.options;
9
+ const { benchmarkConcurrenciesOption, beepOnFinishOption, colorSpaceOption, concurrencyOption, disallowParallelEncodingOption, offthreadVideoCacheSizeInBytesOption, encodingBufferSizeOption, encodingMaxRateOption, deleteAfterOption, folderExpiryOption, enableMultiprocessOnLinuxOption, numberOfGifLoopsOption, x264Option, enforceAudioOption, jpegQualityOption, audioBitrateOption, videoBitrateOption, audioCodecOption, publicPathOption, audioLatencyHintOption, darkModeOption, defaultEditorOption, publicLicenseKeyOption, forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, pixelFormatOption, browserExecutableOption, everyNthFrameOption, proResProfileOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, outDirOption, packageManagerOption, webpackPollOption, keyboardShortcutsOption, interactivityOption, imageSequencePatternOption, scaleOption, overwriteOption, crfOption, logLevelOption, videoCodecOption, stillFrameOption, imageSequenceOption, versionFlagOption, bundleCacheOption, envFileOption, glOption, gopSizeOption, runsOption, reproOption, mutedOption, headlessOption, disableGitSourceOption, delayRenderTimeoutInMillisecondsOption, framesOption, forSeamlessAacConcatenationOption, isProductionOption, noOpenOption, portOption, propsOption, configOption, browserOption, sampleRateOption, previewSampleRateOption, rspackOption, skipSkillsOption, } = client_1.BrowserSafeApis.options;
10
10
  exports.BooleanFlags = [
11
11
  overwriteOption.cliFlag,
12
12
  imageSequenceOption.cliFlag,
@@ -30,6 +30,8 @@ exports.BooleanFlags = [
30
30
  isProductionOption.cliFlag,
31
31
  forceNewStudioOption.cliFlag,
32
32
  bundleCacheOption.cliFlag,
33
+ rspackOption.cliFlag,
34
+ skipSkillsOption.cliFlag,
33
35
  ];
34
36
  exports.parsedCli = (0, minimist_1.default)(process.argv.slice(2), {
35
37
  boolean: exports.BooleanFlags,
@@ -50,6 +52,7 @@ exports.parsedCli = (0, minimist_1.default)(process.argv.slice(2), {
50
52
  [isProductionOption.cliFlag]: null,
51
53
  [forceNewStudioOption.cliFlag]: null,
52
54
  [mutedOption.cliFlag]: null,
55
+ [rspackOption.cliFlag]: null,
53
56
  },
54
57
  });
55
58
  const quietFlagProvided = () => exports.parsedCli.quiet || exports.parsedCli.q;
@@ -0,0 +1,2 @@
1
+ export { remotionSkillNames } from '@remotion/studio-server';
2
+ export type { RemotionSkillName } from '@remotion/studio-server';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remotionSkillNames = void 0;
4
+ const studio_server_1 = require("@remotion/studio-server");
5
+ Object.defineProperty(exports, "remotionSkillNames", { enumerable: true, get: function () { return studio_server_1.remotionSkillNames; } });
@@ -1,7 +1,7 @@
1
1
  import type { BundlerOverrideFn, RspackOverrideFn, WebpackOverrideFn } from '@remotion/bundler';
2
2
  import type { BrowserExecutable, CancelSignal, ChromiumOptions, Crf, FfmpegOverrideFn, FrameRange, NumberOfGifLoops } from '@remotion/renderer';
3
3
  import type { JobProgressCallback } from '@remotion/studio-server';
4
- export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }: {
4
+ export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }: {
5
5
  remotionRoot: string;
6
6
  fullEntryPoint: string;
7
7
  entryPointReason: string;
@@ -28,6 +28,7 @@ export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, l
28
28
  quiet: boolean;
29
29
  concurrency: string | number | null;
30
30
  frameRange: FrameRange | null;
31
+ selectedFrames: number[] | null;
31
32
  everyNthFrame: number;
32
33
  jpegQuality: number | undefined;
33
34
  onProgress: JobProgressCallback;
@@ -61,7 +61,7 @@ const should_use_non_overlaying_logger_1 = require("../should-use-non-overlaying
61
61
  const truthy_1 = require("../truthy");
62
62
  const user_passed_output_location_1 = require("../user-passed-output-location");
63
63
  const add_log_to_aggregate_progress_1 = require("./add-log-to-aggregate-progress");
64
- const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }) => {
64
+ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }) => {
65
65
  var _a;
66
66
  renderer_1.RenderInternals.validateConcurrency({
67
67
  value: concurrency,
@@ -326,8 +326,12 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
326
326
  const audioExists = absoluteSeparateAudioTo
327
327
  ? (0, node_fs_1.existsSync)(absoluteSeparateAudioTo)
328
328
  : false;
329
- const realFrameRange = renderer_1.RenderInternals.getRealFrameRange(config.durationInFrames, frameRange);
330
- const totalFrames = renderer_1.RenderInternals.getFramesToRender(realFrameRange, everyNthFrame);
329
+ const totalFrames = selectedFrames
330
+ ? renderer_1.RenderInternals.validateSelectedFrames({
331
+ frames: selectedFrames,
332
+ durationInFrames: config.durationInFrames,
333
+ })
334
+ : renderer_1.RenderInternals.getFramesToRender(renderer_1.RenderInternals.getRealFrameRanges(config.durationInFrames, frameRange), everyNthFrame);
331
335
  renderingProgress = {
332
336
  frames: 0,
333
337
  totalFrames: totalFrames.length,
@@ -392,6 +396,8 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
392
396
  everyNthFrame,
393
397
  envVariables,
394
398
  frameRange,
399
+ frames: selectedFrames,
400
+ outputFramesInSequence: false,
395
401
  concurrency: resolvedConcurrency,
396
402
  puppeteerInstance,
397
403
  jpegQuality: jpegQuality !== null && jpegQuality !== void 0 ? jpegQuality : renderer_1.RenderInternals.DEFAULT_JPEG_QUALITY,
@@ -59,6 +59,7 @@ const processVideoJob = async ({ job, remotionRoot, entryPoint, onProgress, addC
59
59
  concurrency: job.concurrency,
60
60
  everyNthFrame: job.type === 'video' ? job.everyNthFrame : 1,
61
61
  frameRange: [job.startFrame, job.endFrame],
62
+ selectedFrames: null,
62
63
  quiet: false,
63
64
  shouldOutputImageSequence: job.type === 'sequence',
64
65
  addCleanupCallback,
package/dist/render.js CHANGED
@@ -25,7 +25,7 @@ const render = async (remotionRoot, args, logLevel) => {
25
25
  log_1.Log.error({ indent: false, logLevel }, '--frame flag was passed to the `render` command. This flag only works with the `still` command. Did you mean `--frames`? See reference: https://www.remotion.dev/docs/cli/');
26
26
  process.exit(1);
27
27
  }
28
- const { frameRange, shouldOutputImageSequence, inputProps, envVariables, ffmpegOverride, } = (0, get_cli_options_1.getCliOptions)({
28
+ const { frameRange, selectedFrames, shouldOutputImageSequence, inputProps, envVariables, ffmpegOverride, } = (0, get_cli_options_1.getCliOptions)({
29
29
  isStill: false,
30
30
  logLevel,
31
31
  indent: false,
@@ -49,6 +49,9 @@ const render = async (remotionRoot, args, logLevel) => {
49
49
  const everyNthFrame = everyNthFrameOption.getValue({
50
50
  commandLine: parsed_cli_1.parsedCli,
51
51
  }).value;
52
+ if (selectedFrames !== null && everyNthFrame !== 1) {
53
+ throw new Error('Comma-separated `--frames` cannot be combined with `--every-nth-frame`.');
54
+ }
52
55
  const userAgent = userAgentOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
53
56
  const disableWebSecurity = disableWebSecurityOption.getValue({
54
57
  commandLine: parsed_cli_1.parsedCli,
@@ -188,6 +191,7 @@ const render = async (remotionRoot, args, logLevel) => {
188
191
  concurrency,
189
192
  everyNthFrame,
190
193
  frameRange,
194
+ selectedFrames,
191
195
  jpegQuality,
192
196
  onProgress: () => undefined,
193
197
  addCleanupCallback: (label, c) => {
package/dist/skills.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  export declare const printSkillsHelp: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
2
- export declare const skillsCommand: (args: string[], logLevel: "error" | "info" | "trace" | "verbose" | "warn") => Promise<void> | undefined;
2
+ export declare const skillsCommand: (args: string[], logLevel: "error" | "info" | "trace" | "verbose" | "warn", { cwd, environment, }: {
3
+ cwd: string;
4
+ environment: NodeJS.ProcessEnv;
5
+ }) => Promise<void> | undefined;
package/dist/skills.js CHANGED
@@ -4,6 +4,7 @@ exports.skillsCommand = exports.printSkillsHelp = void 0;
4
4
  const node_child_process_1 = require("node:child_process");
5
5
  const chalk_1 = require("./chalk");
6
6
  const log_1 = require("./log");
7
+ const remotion_skill_names_1 = require("./remotion-skill-names");
7
8
  const printSkillsHelp = (logLevel) => {
8
9
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue('remotion skills'));
9
10
  log_1.Log.info({ indent: false, logLevel }, 'Install or update skills from remotion-dev/skills.');
@@ -17,7 +18,7 @@ const printSkillsHelp = (logLevel) => {
17
18
  log_1.Log.info({ indent: false, logLevel }, 'Update skills from remotion-dev/skills.');
18
19
  };
19
20
  exports.printSkillsHelp = printSkillsHelp;
20
- const skillsCommand = (args, logLevel) => {
21
+ const skillsCommand = (args, logLevel, { cwd, environment, }) => {
21
22
  const subcommand = args[0];
22
23
  const restArgs = args.slice(1);
23
24
  if (!subcommand || !['add', 'update'].includes(subcommand)) {
@@ -25,15 +26,26 @@ const skillsCommand = (args, logLevel) => {
25
26
  return;
26
27
  }
27
28
  const command = process.platform === 'win32' ? 'npx.cmd' : 'npx';
28
- const fullArgs = [
29
- '-y',
30
- '--loglevel=error',
31
- 'skills@1.2.0',
32
- subcommand,
33
- 'remotion-dev/skills',
34
- ...restArgs,
35
- ];
29
+ const fullArgs = subcommand === 'add'
30
+ ? [
31
+ '--loglevel=error',
32
+ 'skills@1.5.20',
33
+ 'add',
34
+ 'remotion-dev/skills',
35
+ ...restArgs,
36
+ '--yes',
37
+ ]
38
+ : [
39
+ '--loglevel=error',
40
+ 'skills',
41
+ 'update',
42
+ ...remotion_skill_names_1.remotionSkillNames,
43
+ ...restArgs,
44
+ '--yes',
45
+ ];
36
46
  const child = (0, node_child_process_1.spawn)(command, fullArgs, {
47
+ cwd,
48
+ env: environment,
37
49
  stdio: 'inherit',
38
50
  });
39
51
  return new Promise((resolve, reject) => {
package/dist/studio.js CHANGED
@@ -15,7 +15,7 @@ const get_render_defaults_1 = require("./get-render-defaults");
15
15
  const log_1 = require("./log");
16
16
  const parsed_cli_1 = require("./parsed-cli");
17
17
  const queue_1 = require("./render-queue/queue");
18
- const { binariesDirectoryOption, publicDirOption, disableGitSourceOption, enableCrossSiteIsolationOption, askAIOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, audioLatencyHintOption, ipv4Option, rspackOption, webpackPollOption, noOpenOption, portOption, browserOption, previewSampleRateOption, } = client_1.BrowserSafeApis.options;
18
+ const { binariesDirectoryOption, publicDirOption, disableGitSourceOption, enableCrossSiteIsolationOption, askAIOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, audioLatencyHintOption, ipv4Option, rspackOption, webpackPollOption, noOpenOption, portOption, browserOption, previewSampleRateOption, defaultEditorOption, } = client_1.BrowserSafeApis.options;
19
19
  const studioCommand = async (remotionRoot, args, logLevel) => {
20
20
  var _a, _b, _c;
21
21
  const { file, reason } = (0, entry_point_1.findEntryPoint)({
@@ -101,9 +101,7 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
101
101
  const bundlerOverride = config_1.ConfigInternals.getBundlerOverrideFn();
102
102
  const rspackOverride = config_1.ConfigInternals.getRspackOverrideFn();
103
103
  const webpackOverride = config_1.ConfigInternals.getWebpackOverrideFn();
104
- if (useRspack) {
105
- log_1.Log.warn({ indent: false, logLevel }, 'Enabling experimental Rspack bundler.');
106
- }
104
+ log_1.Log.verbose({ indent: false, logLevel }, `Using ${useRspack ? 'Rspack' : 'Webpack'} bundler.`);
107
105
  const getStudioRuntimeConfig = () => ({
108
106
  maxTimelineTracks: config_1.ConfigInternals.getMaxTimelineTracks(),
109
107
  askAIEnabled: askAIOption.getValue({
@@ -120,6 +118,7 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
120
118
  const getNumberOfAudioTags = () => numberOfSharedAudioTagsOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
121
119
  const getAudioLatencyHint = () => audioLatencyHintOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
122
120
  const getPreviewSampleRate = () => previewSampleRateOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
121
+ const getDefaultEditor = () => defaultEditorOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
123
122
  const result = await studio_server_1.StudioServerInternals.startStudio({
124
123
  previewEntry: require.resolve('@remotion/studio/previewEntry'),
125
124
  browserArgs: parsed_cli_1.parsedCli['browser-args'],
@@ -159,6 +158,7 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
159
158
  forceIPv4: ipv4Option.getValue({ commandLine: parsed_cli_1.parsedCli }).value,
160
159
  getAudioLatencyHint,
161
160
  getPreviewSampleRate,
161
+ getDefaultEditor,
162
162
  enableCrossSiteIsolation,
163
163
  forceNew: forceNewStudioOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value,
164
164
  rspack: useRspack,
@@ -0,0 +1,8 @@
1
+ export declare const updateRemotionSkills: ({ currentVersion, cwd, homeDirectory, skipSkills, logLevel, environment, }: {
2
+ currentVersion: string;
3
+ cwd: string;
4
+ homeDirectory: string;
5
+ skipSkills: boolean;
6
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
7
+ environment: NodeJS.ProcessEnv;
8
+ }) => Promise<void>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateRemotionSkills = void 0;
4
+ const detect_outdated_remotion_skills_1 = require("./detect-outdated-remotion-skills");
5
+ const log_1 = require("./log");
6
+ const skills_1 = require("./skills");
7
+ const updateRemotionSkills = async ({ currentVersion, cwd, homeDirectory, skipSkills, logLevel, environment, }) => {
8
+ if (skipSkills) {
9
+ return;
10
+ }
11
+ const skillsStatuses = (0, detect_outdated_remotion_skills_1.detectOutdatedRemotionSkills)({
12
+ currentVersion,
13
+ cwd,
14
+ homeDirectory,
15
+ });
16
+ if (skillsStatuses.project.type === 'outdated') {
17
+ log_1.Log.info({ indent: false, logLevel }, 'Updating project Remotion Agent Skills...');
18
+ await (0, skills_1.skillsCommand)(['update', '--project'], logLevel, {
19
+ cwd,
20
+ environment,
21
+ });
22
+ }
23
+ };
24
+ exports.updateRemotionSkills = updateRemotionSkills;
package/dist/upgrade.d.ts CHANGED
@@ -20,10 +20,11 @@ export declare const getPackagesToUpgrade: ({ depsWithVersions, catalogEntries,
20
20
  version: string;
21
21
  }[];
22
22
  };
23
- export declare const upgradeCommand: ({ remotionRoot, packageManager, version, logLevel, args, }: {
23
+ export declare const upgradeCommand: ({ remotionRoot, packageManager, version, skipSkills, logLevel, args, }: {
24
24
  remotionRoot: string;
25
25
  packageManager: string | undefined;
26
26
  version: string | undefined;
27
+ skipSkills: boolean;
27
28
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
28
29
  args: string[];
29
30
  }) => Promise<void>;
package/dist/upgrade.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.upgradeCommand = exports.getPackagesToUpgrade = exports.resolveExtraPackageVersions = void 0;
4
4
  const node_child_process_1 = require("node:child_process");
5
+ const node_os_1 = require("node:os");
5
6
  const renderer_1 = require("@remotion/renderer");
6
7
  const studio_server_1 = require("@remotion/studio-server");
7
8
  const catalog_utils_1 = require("./catalog-utils");
@@ -9,6 +10,7 @@ const chalk_1 = require("./chalk");
9
10
  const extra_packages_1 = require("./extra-packages");
10
11
  const list_of_remotion_packages_1 = require("./list-of-remotion-packages");
11
12
  const log_1 = require("./log");
13
+ const update_remotion_skills_1 = require("./update-remotion-skills");
12
14
  const resolveExtraPackageVersions = (dependencies) => {
13
15
  const extraVersions = { ...extra_packages_1.EXTRA_PACKAGES };
14
16
  for (const pkg of Object.keys(extra_packages_1.EXTRA_PACKAGES)) {
@@ -64,7 +66,7 @@ const getPackagesToUpgrade = ({ depsWithVersions, catalogEntries, targetVersion,
64
66
  return { normalPackages, catalogPackages: catalogPackagesToUpgrade };
65
67
  };
66
68
  exports.getPackagesToUpgrade = getPackagesToUpgrade;
67
- const upgradeCommand = async ({ remotionRoot, packageManager, version, logLevel, args, }) => {
69
+ const upgradeCommand = async ({ remotionRoot, packageManager, version, skipSkills, logLevel, args, }) => {
68
70
  const depsWithVersions = studio_server_1.StudioServerInternals.getInstalledDependenciesWithVersions(remotionRoot);
69
71
  let targetVersion;
70
72
  if (version) {
@@ -152,6 +154,14 @@ const upgradeCommand = async ({ remotionRoot, packageManager, version, logLevel,
152
154
  logLevel,
153
155
  });
154
156
  }
157
+ await (0, update_remotion_skills_1.updateRemotionSkills)({
158
+ currentVersion: targetVersion,
159
+ cwd: remotionRoot,
160
+ homeDirectory: (0, node_os_1.homedir)(),
161
+ skipSkills,
162
+ logLevel,
163
+ environment: process.env,
164
+ });
155
165
  log_1.Log.info({ indent: false, logLevel }, '⏫ Remotion has been upgraded!');
156
166
  log_1.Log.info({ indent: false, logLevel }, 'https://remotion.dev/changelog');
157
167
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cli"
4
4
  },
5
5
  "name": "@remotion/cli",
6
- "version": "4.0.501",
6
+ "version": "4.0.503",
7
7
  "description": "Control Remotion features using the `npx remotion` command",
8
8
  "main": "dist/index.js",
9
9
  "bin": {
@@ -36,17 +36,18 @@
36
36
  "author": "Jonny Burger <jonny@remotion.dev>",
37
37
  "license": "SEE LICENSE IN LICENSE.md",
38
38
  "dependencies": {
39
- "@remotion/bundler": "4.0.501",
40
- "@remotion/media-utils": "4.0.501",
41
- "@remotion/player": "4.0.501",
42
- "@remotion/renderer": "4.0.501",
43
- "@remotion/studio-shared": "4.0.501",
44
- "@remotion/studio-server": "4.0.501",
45
- "@remotion/studio": "4.0.501",
39
+ "@remotion/bundler": "4.0.503",
40
+ "@remotion/media-utils": "4.0.503",
41
+ "@remotion/player": "4.0.503",
42
+ "@remotion/renderer": "4.0.503",
43
+ "@remotion/studio-shared": "4.0.503",
44
+ "@remotion/studio-server": "4.0.503",
45
+ "@remotion/studio": "4.0.503",
46
46
  "dotenv": "17.3.1",
47
47
  "minimist": "1.2.6",
48
48
  "prompts": "2.4.2",
49
- "remotion": "4.0.501"
49
+ "semver": "7.5.3",
50
+ "remotion": "4.0.503"
50
51
  },
51
52
  "peerDependencies": {
52
53
  "react": ">=16.8.0",
@@ -56,15 +57,16 @@
56
57
  "@types/minimist": "1.2.2",
57
58
  "@types/prompts": "2.4.9",
58
59
  "@types/prettier": "2.7.2",
60
+ "@types/semver": "7.5.3",
59
61
  "@types/node": "20.12.14",
60
- "@remotion/zod-types": "4.0.501",
61
- "@remotion/tailwind-v4": "4.0.501",
62
- "@remotion/enable-scss": "4.0.501",
63
- "@remotion/skia": "4.0.501",
62
+ "@remotion/zod-types": "4.0.503",
63
+ "@remotion/tailwind-v4": "4.0.503",
64
+ "@remotion/enable-scss": "4.0.503",
65
+ "@remotion/skia": "4.0.503",
64
66
  "react": "19.2.3",
65
67
  "react-dom": "19.2.3",
66
68
  "zod": "4.4.3",
67
- "@remotion/eslint-config-internal": "4.0.501",
69
+ "@remotion/eslint-config-internal": "4.0.503",
68
70
  "eslint": "9.19.0",
69
71
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
70
72
  },