makefx 0.2.7 → 0.2.8

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 (3) hide show
  1. package/README.md +1 -1
  2. package/makefx.mjs +237 -18
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -176,4 +176,4 @@ Run `makefx --help` or `makefx help <command>` for command-specific options.
176
176
  - Media generation guide: https://makefx.app/docs/media-playbooks
177
177
  - Source: https://github.com/krasnoperov/inventory
178
178
 
179
- Version: 0.2.7
179
+ Version: 0.2.8
package/makefx.mjs CHANGED
@@ -19831,6 +19831,19 @@ var SpaceRoleSchema = _enum([
19831
19831
  "editor",
19832
19832
  "viewer"
19833
19833
  ]);
19834
+ var SpaceAccessRoleSchema = _enum(["editor", "viewer"]);
19835
+ var SpaceAccessRequestStatusSchema = _enum([
19836
+ "pending",
19837
+ "approved",
19838
+ "rejected",
19839
+ "canceled"
19840
+ ]);
19841
+ var SpaceInvitationStatusSchema = _enum([
19842
+ "pending",
19843
+ "accepted",
19844
+ "revoked",
19845
+ "expired"
19846
+ ]);
19834
19847
  var SpaceSchema = object({
19835
19848
  id: string$1(),
19836
19849
  name: string$1(),
@@ -19861,6 +19874,98 @@ var SpaceIdParamsSchema = object({ id: string$1().openapi({ param: {
19861
19874
  name: "id",
19862
19875
  in: "path"
19863
19876
  } }) });
19877
+ var SpaceAccessRequestParamsSchema = SpaceIdParamsSchema.extend({ requestId: string$1().openapi({ param: {
19878
+ name: "requestId",
19879
+ in: "path"
19880
+ } }) });
19881
+ var SpaceInvitationParamsSchema = SpaceIdParamsSchema.extend({ invitationId: string$1().openapi({ param: {
19882
+ name: "invitationId",
19883
+ in: "path"
19884
+ } }) });
19885
+ var SpaceSharingUserSchema = object({
19886
+ id: string$1(),
19887
+ email: string$1(),
19888
+ name: string$1().nullable()
19889
+ }).openapi("SpaceSharingUser");
19890
+ var SpaceSharingMemberSchema = object({
19891
+ user_id: string$1(),
19892
+ role: SpaceRoleSchema,
19893
+ joined_at: number$1(),
19894
+ user: SpaceSharingUserSchema
19895
+ }).openapi("SpaceSharingMember");
19896
+ var SpaceAccessRequestSchema = object({
19897
+ id: string$1(),
19898
+ space_id: string$1(),
19899
+ requester_user_id: string$1(),
19900
+ requested_role: SpaceAccessRoleSchema,
19901
+ status: SpaceAccessRequestStatusSchema,
19902
+ message: string$1().nullable(),
19903
+ created_at: string$1(),
19904
+ updated_at: string$1(),
19905
+ resolved_at: string$1().nullable(),
19906
+ resolved_by_user_id: string$1().nullable()
19907
+ }).openapi("SpaceAccessRequest");
19908
+ var SpaceAccessRequestWithRequesterSchema = SpaceAccessRequestSchema.extend({ requester: SpaceSharingUserSchema }).openapi("SpaceAccessRequestWithRequester");
19909
+ var SpaceInvitationSchema = object({
19910
+ id: string$1(),
19911
+ space_id: string$1(),
19912
+ email: string$1(),
19913
+ normalized_email: string$1(),
19914
+ role: SpaceAccessRoleSchema,
19915
+ status: SpaceInvitationStatusSchema,
19916
+ invited_by_user_id: string$1(),
19917
+ accepted_by_user_id: string$1().nullable(),
19918
+ created_at: string$1(),
19919
+ updated_at: string$1(),
19920
+ expires_at: string$1().nullable(),
19921
+ resolved_at: string$1().nullable()
19922
+ }).openapi("SpaceInvitation");
19923
+ var SpaceInvitationWithUsersSchema = SpaceInvitationSchema.extend({
19924
+ invitedBy: SpaceSharingUserSchema.nullable(),
19925
+ acceptedBy: SpaceSharingUserSchema.nullable()
19926
+ }).openapi("SpaceInvitationWithUsers");
19927
+ var SpaceAccessStateSchema = object({
19928
+ status: _enum([
19929
+ "member",
19930
+ "pending_request",
19931
+ "pending_invitation",
19932
+ "none"
19933
+ ]),
19934
+ member: SpaceSharingMemberSchema.nullable(),
19935
+ pendingRequest: SpaceAccessRequestSchema.nullable(),
19936
+ pendingInvitation: SpaceInvitationSchema.nullable()
19937
+ }).openapi("SpaceAccessState");
19938
+ var GetSpaceAccessResponseSchema = object({
19939
+ success: literal(true),
19940
+ access: SpaceAccessStateSchema
19941
+ }).openapi("GetSpaceAccessResponse");
19942
+ var CreateSpaceAccessRequestRequestSchema = object({
19943
+ requestedRole: SpaceAccessRoleSchema.default("viewer").optional(),
19944
+ message: string$1().nullable().optional()
19945
+ }).openapi("CreateSpaceAccessRequestRequest");
19946
+ var SpaceAccessRequestResponseSchema = object({
19947
+ success: literal(true),
19948
+ request: SpaceAccessRequestSchema
19949
+ }).openapi("SpaceAccessRequestResponse");
19950
+ var ApproveSpaceAccessRequestRequestSchema = object({ role: SpaceAccessRoleSchema.optional() }).openapi("ApproveSpaceAccessRequestRequest");
19951
+ var CancelSpaceAccessRequestResponseSchema = object({
19952
+ success: literal(true),
19953
+ request: SpaceAccessRequestSchema.nullable()
19954
+ }).openapi("CancelSpaceAccessRequestResponse");
19955
+ var SpaceSharingResponseSchema = object({
19956
+ success: literal(true),
19957
+ members: array(SpaceSharingMemberSchema),
19958
+ pendingAccessRequests: array(SpaceAccessRequestWithRequesterSchema),
19959
+ pendingInvitations: array(SpaceInvitationWithUsersSchema)
19960
+ }).openapi("SpaceSharingResponse");
19961
+ var CreateSpaceInvitationRequestSchema = object({
19962
+ email: string$1().trim().email(),
19963
+ role: SpaceAccessRoleSchema
19964
+ }).openapi("CreateSpaceInvitationRequest");
19965
+ var SpaceInvitationResponseSchema = object({
19966
+ success: literal(true),
19967
+ invitation: SpaceInvitationSchema
19968
+ }).openapi("SpaceInvitationResponse");
19864
19969
  var ProductionIdParamsSchema = SpaceIdParamsSchema.extend({ productionId: string$1().openapi({ param: {
19865
19970
  name: "productionId",
19866
19971
  in: "path"
@@ -20692,6 +20797,63 @@ var apiEndpoints = {
20692
20797
  paramsSchema: SpaceIdParamsSchema,
20693
20798
  responseSchema: GetSpaceResponseSchema
20694
20799
  },
20800
+ "GET /api/spaces/:id/access": {
20801
+ method: "GET",
20802
+ path: "/api/spaces/:id/access",
20803
+ paramsSchema: SpaceIdParamsSchema,
20804
+ responseSchema: GetSpaceAccessResponseSchema
20805
+ },
20806
+ "POST /api/spaces/:id/access-requests": {
20807
+ method: "POST",
20808
+ path: "/api/spaces/:id/access-requests",
20809
+ paramsSchema: SpaceIdParamsSchema,
20810
+ jsonSchema: CreateSpaceAccessRequestRequestSchema,
20811
+ responseSchema: SpaceAccessRequestResponseSchema
20812
+ },
20813
+ "DELETE /api/spaces/:id/access-requests/me": {
20814
+ method: "DELETE",
20815
+ path: "/api/spaces/:id/access-requests/me",
20816
+ paramsSchema: SpaceIdParamsSchema,
20817
+ responseSchema: CancelSpaceAccessRequestResponseSchema
20818
+ },
20819
+ "GET /api/spaces/:id/sharing": {
20820
+ method: "GET",
20821
+ path: "/api/spaces/:id/sharing",
20822
+ paramsSchema: SpaceIdParamsSchema,
20823
+ responseSchema: SpaceSharingResponseSchema
20824
+ },
20825
+ "POST /api/spaces/:id/invitations": {
20826
+ method: "POST",
20827
+ path: "/api/spaces/:id/invitations",
20828
+ paramsSchema: SpaceIdParamsSchema,
20829
+ jsonSchema: CreateSpaceInvitationRequestSchema,
20830
+ responseSchema: SpaceInvitationResponseSchema
20831
+ },
20832
+ "POST /api/spaces/:id/access-requests/:requestId/approve": {
20833
+ method: "POST",
20834
+ path: "/api/spaces/:id/access-requests/:requestId/approve",
20835
+ paramsSchema: SpaceAccessRequestParamsSchema,
20836
+ jsonSchema: ApproveSpaceAccessRequestRequestSchema.optional(),
20837
+ responseSchema: SpaceAccessRequestResponseSchema
20838
+ },
20839
+ "POST /api/spaces/:id/access-requests/:requestId/reject": {
20840
+ method: "POST",
20841
+ path: "/api/spaces/:id/access-requests/:requestId/reject",
20842
+ paramsSchema: SpaceAccessRequestParamsSchema,
20843
+ responseSchema: SpaceAccessRequestResponseSchema
20844
+ },
20845
+ "POST /api/spaces/:id/invitations/:invitationId/revoke": {
20846
+ method: "POST",
20847
+ path: "/api/spaces/:id/invitations/:invitationId/revoke",
20848
+ paramsSchema: SpaceInvitationParamsSchema,
20849
+ responseSchema: SpaceInvitationResponseSchema
20850
+ },
20851
+ "POST /api/spaces/:id/invitations/:invitationId/accept": {
20852
+ method: "POST",
20853
+ path: "/api/spaces/:id/invitations/:invitationId/accept",
20854
+ paramsSchema: SpaceInvitationParamsSchema,
20855
+ responseSchema: SpaceInvitationResponseSchema
20856
+ },
20695
20857
  "GET /api/support/spaces/:id": {
20696
20858
  method: "GET",
20697
20859
  path: "/api/support/spaces/:id",
@@ -23181,6 +23343,7 @@ async function executeForgeCommand(command, parsed, deps = defaultDeps$10, optio
23181
23343
  validateImageCommandReferenceCount(command, parsed, mediaKind, parseImageGenerationOptions(parsed, mediaKind).model);
23182
23344
  validateVideoAudioOptions(parsed, mediaKind);
23183
23345
  parseVideoGenerationOptions(parsed, mediaKind);
23346
+ validateVideoFrameReferenceOptions(command, parsed, mediaKind);
23184
23347
  if (command !== "batch") validateProductionMetadataOptions(parsed);
23185
23348
  const ctx = await buildContext$7(parsed, deps);
23186
23349
  const client = await deps.createClient(ctx.env, ctx.spaceId);
@@ -23247,10 +23410,13 @@ async function executeGenerate(parsed, ctx, client, deps, mediaKind, followOptio
23247
23410
  const assetType = requireOption(parsed, "type");
23248
23411
  const musicProvider = parseMusicProviderOption(parsed, mediaKind, assetType);
23249
23412
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
23413
+ const videoFrameRefs = parseVideoFrameReferenceOptions(parsed, "generate", mediaKind).refs;
23414
+ const state = videoFrameRefs.length > 0 ? await requestSpaceState(client) : void 0;
23415
+ const referenceVariantIds = videoFrameRefs.length > 0 ? await resolveReferenceVariantIds(videoFrameRefs, ctx, deps, state?.variants, CLI_GENERATION_MEDIA_KIND) : [];
23250
23416
  const scene = parseSceneMetadata(parsed, {
23251
23417
  prompt,
23252
- refs: [],
23253
- referenceVariantIds: [],
23418
+ refs: videoFrameRefs,
23419
+ referenceVariantIds,
23254
23420
  mediaKind
23255
23421
  });
23256
23422
  const imageOptions = parseImageGenerationOptions(parsed, mediaKind);
@@ -23258,6 +23424,7 @@ async function executeGenerate(parsed, ctx, client, deps, mediaKind, followOptio
23258
23424
  const videoAudioOptions = parseVideoAudioOptions(parsed, mediaKind);
23259
23425
  const videoOptions = parseVideoGenerationOptions(parsed, mediaKind);
23260
23426
  const styleSelection = await resolveStyleSelection(parsed, ctx, deps);
23427
+ const disableStyle = parsed.options["no-style"] === "true" || videoFrameRefs.length > 0;
23261
23428
  await printPreflightEstimate(client, {
23262
23429
  operation: "generate",
23263
23430
  assetType,
@@ -23277,10 +23444,11 @@ async function executeGenerate(parsed, ctx, client, deps, mediaKind, followOptio
23277
23444
  name,
23278
23445
  assetType,
23279
23446
  prompt,
23447
+ ...referenceVariantIds.length > 0 ? { referenceVariantIds } : {},
23280
23448
  ...imageOptions,
23281
23449
  ...audioModelOptions,
23282
23450
  aspectRatio: imageOptions.aspectRatio ?? videoOptions.aspectRatio,
23283
- disableStyle: parsed.options["no-style"] === "true",
23451
+ disableStyle,
23284
23452
  ...styleSelection.stylePresetId ? { stylePresetId: styleSelection.stylePresetId } : {},
23285
23453
  mediaKind,
23286
23454
  ...audioVoiceOptions,
@@ -23308,8 +23476,8 @@ async function executeGenerate(parsed, ctx, client, deps, mediaKind, followOptio
23308
23476
  name,
23309
23477
  assetType,
23310
23478
  startedAt,
23311
- refs: [],
23312
- referenceVariantIds: [],
23479
+ refs: videoFrameRefs,
23480
+ referenceVariantIds,
23313
23481
  scene
23314
23482
  });
23315
23483
  await downloadResult(result, outputPath, ctx, deps);
@@ -23413,20 +23581,24 @@ async function executeDerive(parsed, ctx, client, deps, mediaKind, followOptions
23413
23581
  const outputPath = getOutputPath$1(parsed);
23414
23582
  const name = requireOption(parsed, "name");
23415
23583
  const assetType = requireOption(parsed, "type");
23416
- const refs = parseRefs(requireOption(parsed, "refs"));
23584
+ const videoFrameRefs = parseVideoFrameReferenceOptions(parsed, "derive", mediaKind).refs;
23585
+ const refs = parsed.options.refs ? parseRefs(requireOption(parsed, "refs")) : [];
23586
+ const referenceRefs = videoFrameRefs.length > 0 ? videoFrameRefs : refs;
23587
+ if (referenceRefs.length === 0) throw new Error("--refs is required");
23417
23588
  const imageOptions = parseImageGenerationOptions(parsed, mediaKind);
23418
- if (mediaKind === "image") validateImageReferenceCount(imageOptions.model, refs.length);
23419
- const referenceVariantIds = await resolveReferenceVariantIds(refs, ctx, deps, (await requestSpaceState(client)).variants, mediaKind);
23589
+ if (mediaKind === "image") validateImageReferenceCount(imageOptions.model, referenceRefs.length);
23590
+ const referenceVariantIds = await resolveReferenceVariantIds(referenceRefs, ctx, deps, (await requestSpaceState(client)).variants, videoFrameRefs.length > 0 ? CLI_GENERATION_MEDIA_KIND : mediaKind);
23420
23591
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
23421
23592
  const scene = parseSceneMetadata(parsed, {
23422
23593
  prompt,
23423
- refs,
23594
+ refs: referenceRefs,
23424
23595
  referenceVariantIds,
23425
23596
  mediaKind
23426
23597
  });
23427
23598
  const videoAudioOptions = parseVideoAudioOptions(parsed, mediaKind);
23428
23599
  const videoOptions = parseVideoGenerationOptions(parsed, mediaKind);
23429
23600
  const styleSelection = await resolveStyleSelection(parsed, ctx, deps);
23601
+ const disableStyle = parsed.options["no-style"] === "true" || videoFrameRefs.length > 0;
23430
23602
  await printPreflightEstimate(client, {
23431
23603
  operation: "derive",
23432
23604
  assetType,
@@ -23447,7 +23619,7 @@ async function executeDerive(parsed, ctx, client, deps, mediaKind, followOptions
23447
23619
  referenceVariantIds,
23448
23620
  ...imageOptions,
23449
23621
  aspectRatio: imageOptions.aspectRatio ?? videoOptions.aspectRatio,
23450
- disableStyle: parsed.options["no-style"] === "true",
23622
+ disableStyle,
23451
23623
  ...styleSelection.stylePresetId ? { stylePresetId: styleSelection.stylePresetId } : {},
23452
23624
  mediaKind,
23453
23625
  ...videoAudioOptions,
@@ -23473,7 +23645,7 @@ async function executeDerive(parsed, ctx, client, deps, mediaKind, followOptions
23473
23645
  name,
23474
23646
  assetType,
23475
23647
  startedAt,
23476
- refs,
23648
+ refs: referenceRefs,
23477
23649
  referenceVariantIds,
23478
23650
  scene
23479
23651
  });
@@ -24110,6 +24282,31 @@ function parseVideoGenerationOptions(parsed, mediaKind) {
24110
24282
  ...videoTier ? { videoTier } : {}
24111
24283
  };
24112
24284
  }
24285
+ function parseVideoFrameReferenceOptions(parsed, command, mediaKind) {
24286
+ validateVideoFrameReferenceOptions(command, parsed, mediaKind);
24287
+ const firstFrame = readVideoFrameOption(parsed, "first-frame", "firstFrame");
24288
+ const lastFrame = readVideoFrameOption(parsed, "last-frame", "lastFrame");
24289
+ return { refs: [...firstFrame ? [firstFrame] : [], ...lastFrame ? [lastFrame] : []] };
24290
+ }
24291
+ function validateVideoFrameReferenceOptions(command, parsed, mediaKind) {
24292
+ const firstFrame = readVideoFrameOption(parsed, "first-frame", "firstFrame");
24293
+ const lastFrame = readVideoFrameOption(parsed, "last-frame", "lastFrame");
24294
+ if (!firstFrame && !lastFrame) return;
24295
+ if (mediaKind !== "video") throw new Error("--first-frame and --last-frame are only supported for video generation");
24296
+ if (command !== "generate" && command !== "derive") throw new Error("--first-frame and --last-frame are only supported for video generate and video derive");
24297
+ if (lastFrame && !firstFrame) throw new Error("--last-frame requires --first-frame");
24298
+ if (parsed.options.refs) throw new Error("--first-frame and --last-frame cannot be combined with --refs");
24299
+ if (readStylePresetOption(parsed)) throw new Error("--first-frame and --last-frame cannot be combined with --style-preset");
24300
+ }
24301
+ function readVideoFrameOption(parsed, kebabName, camelName) {
24302
+ const value = parsed.options[kebabName] ?? parsed.options[camelName];
24303
+ if (value === void 0) return void 0;
24304
+ const flag = `--${kebabName}`;
24305
+ if (value === "true") throw new Error(`${flag} requires a variant ID or local image path`);
24306
+ const trimmed = value.trim();
24307
+ if (!trimmed) throw new Error(`${flag} requires a variant ID or local image path`);
24308
+ return trimmed;
24309
+ }
24113
24310
  function parseDialogueVoiceIds(value) {
24114
24311
  const normalized = normalizeCliOption(value);
24115
24312
  if (!normalized) return void 0;
@@ -24441,11 +24638,12 @@ function printUsage$8() {
24441
24638
  const resolutionByTier = VIDEO_GENERATION_TIERS.map((tier) => `${tier}: ${getVideoGenerationResolutionsForTier(tier).join(", ")}`).join("; ");
24442
24639
  console.log(`
24443
24640
  Usage:
24444
- makefx video generate "prompt" --name <name> --type <type> -o <file> [--aspect ${aspectValues}] [--resolution ${resolutionValues}] [--duration ${durationValues}] [--tier ${tierValues}] [--audio] [--space <id>]
24641
+ makefx video generate "prompt" --name <name> --type <type> -o <file> [--first-frame <variant_or_file>] [--last-frame <variant_or_file>] [--aspect ${aspectValues}] [--resolution ${resolutionValues}] [--duration ${durationValues}] [--tier ${tierValues}] [--audio] [--space <id>]
24445
24642
  makefx video generate --follow <variant_id> -o <file> [--space <id>]
24446
24643
  makefx video refine --variant <variant_id> "prompt" -o <file> [--aspect ${aspectValues}] [--resolution ${resolutionValues}] [--duration ${durationValues}] [--tier ${tierValues}] [--audio] [--space <id>]
24447
24644
  makefx video refine --follow <variant_id> -o <file> [--space <id>]
24448
24645
  makefx video derive --refs <variant_or_file,variant_or_file> --name <name> --type <type> "prompt" -o <file> [--aspect ${aspectValues}] [--resolution ${resolutionValues}] [--duration ${durationValues}] [--tier ${tierValues}] [--audio] [--space <id>]
24646
+ makefx video derive --first-frame <variant_or_file> [--last-frame <variant_or_file>] --name <name> --type <type> "prompt" -o <file> [--aspect ${aspectValues}] [--resolution ${resolutionValues}] [--duration ${durationValues}] [--tier ${tierValues}] [--audio] [--space <id>]
24449
24647
  makefx video derive --follow <variant_id> -o <file> [--space <id>]
24450
24648
 
24451
24649
  Video:
@@ -24453,6 +24651,15 @@ Video:
24453
24651
  --resolution <value> Veo output resolution (${resolutionByTier})
24454
24652
  --duration <seconds> Veo output duration: ${durationValues}
24455
24653
  --tier <tier> Veo model tier: ${tierValues}
24654
+ --first-frame <ref> Veo start frame image variant or local image path
24655
+ --last-frame <ref> Veo final frame image variant or local image path
24656
+
24657
+ Veo 3.1 frames:
24658
+ --first-frame resolves to the first referenceVariantId and becomes the Veo top-level image input.
24659
+ --last-frame resolves to the second referenceVariantId and becomes Veo config.lastFrame.
24660
+ Use both flags together for first/last-frame generation; --last-frame requires --first-frame.
24661
+ Frame flags disable style injection so style refs cannot be prepended ahead of the start/end frames.
24662
+ Do not combine frame flags with --refs or --style-preset. Use --refs when you want generic Veo reference images instead of first/last-frame inputs.
24456
24663
 
24457
24664
  Audio:
24458
24665
  --audio Request native synchronized Veo audio (default)
@@ -26566,7 +26773,7 @@ Options:
26566
26773
  }
26567
26774
  //#endregion
26568
26775
  //#region src/cli/index.ts
26569
- var CLI_VERSION = "0.2.7+1943b2e5248a";
26776
+ var CLI_VERSION = "0.2.8+62a28e206c2a";
26570
26777
  async function main() {
26571
26778
  const argv = process$1.argv.slice(2);
26572
26779
  if (argv[0] === "--") argv.shift();
@@ -26636,7 +26843,16 @@ function videoCapabilityHelp() {
26636
26843
  --aspect <ratio> Veo aspect ratio: ${videoAspectValues()}
26637
26844
  --resolution <value> Veo output resolution (${resolutionLines})
26638
26845
  --duration <seconds> Veo output duration: ${videoDurationValues()}
26639
- --tier <tier> Veo model tier: ${videoTierValues()}`;
26846
+ --tier <tier> Veo model tier: ${videoTierValues()}
26847
+ --first-frame <ref> Veo start frame image variant or local image path
26848
+ --last-frame <ref> Veo final frame image variant or local image path
26849
+
26850
+ Veo 3.1 frames:
26851
+ --first-frame resolves to the first referenceVariantId and becomes the Veo top-level image input.
26852
+ --last-frame resolves to the second referenceVariantId and becomes Veo config.lastFrame.
26853
+ Use both flags together for first/last-frame generation; --last-frame requires --first-frame.
26854
+ Frame flags disable style injection so style refs cannot be prepended ahead of the start/end frames.
26855
+ Do not combine frame flags with --refs or --style-preset. Use --refs when you want generic Veo reference images instead of first/last-frame inputs.`;
26640
26856
  }
26641
26857
  function configureLocalTls(args) {
26642
26858
  if (args.includes("--local") || args.includes("--env") && args[args.indexOf("--env") + 1] === "local") process$1.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
@@ -26820,10 +27036,10 @@ Audio:
26820
27036
  audio sfx generate "prompt" --name <name> -o <file>
26821
27037
 
26822
27038
  Video:
26823
- video generate "prompt" --name <name> --type <type> -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio]
27039
+ video generate "prompt" --name <name> --type <type> -o <file> [--first-frame <variant_or_file>] [--last-frame <variant_or_file>] [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio]
26824
27040
  video generate --follow <variant_id> -o <file>
26825
27041
  video refine --variant <variant_id> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio]
26826
- video derive --refs <variant_or_file,variant_or_file> --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio]
27042
+ video derive (--refs <variant_or_file,variant_or_file> | --first-frame <variant_or_file> [--last-frame <variant_or_file>]) --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio]
26827
27043
 
26828
27044
  Options:
26829
27045
  --env <environment> Target environment (production|stage|local), default: production
@@ -26844,6 +27060,7 @@ Examples:
26844
27060
  makefx batch "Three Russafa market keyframes" --name "Market Keyframe" --type scene --count 3 --output-dir keyframes
26845
27061
  makefx audio sfx generate "A short brass victory sting" --name "Victory Sting" -o victory.wav
26846
27062
  makefx video generate "A looping idle animation" --name "Idle Animation" --type animation --duration 6 --resolution 1080p --tier fast -o idle.mp4
27063
+ makefx video derive --first-frame keyframes/start.png --last-frame keyframes/end.png --name "Camera Move" --type animation "slow dolly from start to end" -o move.mp4
26847
27064
  makefx productions export --production-id s01e01-a2
26848
27065
  makefx upload hero.png --name "Hero" --collection collection_cast
26849
27066
  makefx upload hero.png --name "Hero" --collection-name "Cast" --json
@@ -27129,7 +27346,7 @@ function printVideoHelp(positionals) {
27129
27346
  if (subcommand === "generate") {
27130
27347
  console.log(`
27131
27348
  Usage:
27132
- makefx video generate "prompt" --name <name> --type <type> -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27349
+ makefx video generate "prompt" --name <name> --type <type> -o <file> [--first-frame <variant_or_file>] [--last-frame <variant_or_file>] [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27133
27350
  makefx video generate --follow <variant_id> -o <file> [--space <id>]
27134
27351
 
27135
27352
  ${videoCapabilityHelp()}
@@ -27164,6 +27381,7 @@ Production metadata:
27164
27381
  console.log(`
27165
27382
  Usage:
27166
27383
  makefx video derive --refs <variant_or_file,variant_or_file> --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27384
+ makefx video derive --first-frame <variant_or_file> [--last-frame <variant_or_file>] --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27167
27385
  makefx video derive --follow <variant_id> -o <file> [--space <id>]
27168
27386
 
27169
27387
  ${videoCapabilityHelp()}
@@ -27179,10 +27397,11 @@ Production metadata:
27179
27397
  }
27180
27398
  console.log(`
27181
27399
  Usage:
27182
- makefx video generate "prompt" --name <name> --type <type> -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27400
+ makefx video generate "prompt" --name <name> --type <type> -o <file> [--first-frame <variant_or_file>] [--last-frame <variant_or_file>] [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27183
27401
  makefx video generate --follow <variant_id> -o <file> [--space <id>]
27184
27402
  makefx video refine --variant <variant_id> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27185
27403
  makefx video derive --refs <variant_or_file,variant_or_file> --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27404
+ makefx video derive --first-frame <variant_or_file> [--last-frame <variant_or_file>] --name <name> --type <type> "prompt" -o <file> [--aspect ${videoAspectValues()}] [--resolution ${videoResolutionValues()}] [--duration ${videoDurationValues()}] [--tier ${videoTierValues()}] [--audio] [--space <id>]
27186
27405
 
27187
27406
  ${videoCapabilityHelp()}
27188
27407
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makefx",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "Command-line interface for AI-assisted game asset production with Make Effects.",
5
5
  "license": "MIT",
6
6
  "type": "module",