makaron-cli 0.13.6 → 0.13.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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +23 -4
- package/bin/makaron.mjs +147 -28
- package/package.json +1 -1
- package/skills/makaron/SKILL.md +35 -4
package/README.md
CHANGED
|
@@ -98,7 +98,12 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
|
|
|
98
98
|
npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
`chat`
|
|
101
|
+
`chat` routes image and video models automatically, but you may select the Agent LLM with `--agent-model`. Accepted values are exactly `auto`, `gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.5`, and `deepseek-v4-pro`; `auto` currently resolves to `gpt-5.6-terra`. This flag changes only the reasoning/tool-calling Agent LLM. The CLI still rejects `--image-model`, `--video-model`, and the legacy `--model` flag before starting a chat run, so image/video model names cannot be mistaken for Agent models.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Explicit lower-cost Agent LLM for a controlled comparison
|
|
105
|
+
npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
|
|
106
|
+
```
|
|
102
107
|
|
|
103
108
|
Returns immediately:
|
|
104
109
|
```json
|
|
@@ -135,6 +140,20 @@ npx makaron-cli chat --project auto --image selfie.jpg --skill <marketplace-id-o
|
|
|
135
140
|
|
|
136
141
|
`--skill` accepts an installed skill name, a marketplace UUID, or a unique marketplace label. If a marketplace skill is matched, the CLI installs or reuses it and sends `[Active skill: <installed-skill-name>]` to Makaron Agent. Ordinary users do not need admin commands, and the CLI intentionally does not expose skill deletion.
|
|
137
142
|
|
|
143
|
+
### Built-in production skills
|
|
144
|
+
|
|
145
|
+
Discover the available production workflows before choosing `--skill`:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npx makaron-cli skills list --built-in
|
|
149
|
+
npx makaron-cli skills search "talking head captions" --built-in
|
|
150
|
+
npx makaron-cli skills show talking-head --built-in
|
|
151
|
+
npx makaron-cli chat --project auto --video talk.mp4 --skill talking-head -b "make a tight captioned edit"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The default list shows callable/discoverable skills with their purpose and input
|
|
155
|
+
requirements. Add `--all` to include internal adapters and helper skills.
|
|
156
|
+
|
|
138
157
|
### With additional images (existing project)
|
|
139
158
|
|
|
140
159
|
```bash
|
|
@@ -241,7 +260,7 @@ npx makaron-cli chat --project <id> --video party.mp4 --image kid.jpg -b "make t
|
|
|
241
260
|
npx makaron-cli chat --project <id> --video clip1.mp4 --video clip2.mp4 -b "splice these into one seamless video"
|
|
242
261
|
```
|
|
243
262
|
|
|
244
|
-
Video files are uploaded via signed URL. CLI local video uploads support `.mp4`, `.mov`, or `.webm`, max 50MB, max
|
|
263
|
+
Video files are uploaded via signed URL. CLI local video uploads support `.mp4`, `.mov`, or `.webm`, max 50MB, max 900s (15 minutes) with 1s metadata tolerance, and <=1080p / 2,086,876 frame pixels. The frontend can transcode larger videos before upload; the CLI uploads directly to Storage and rejects videos above those limits.
|
|
245
264
|
The agent understands video content natively — it can analyze scenes, edit, extend, and compose videos. Seedance video-reference editing is still limited to ~15s provider references, so longer uploaded videos should be split/prepared by the agent before model submission; Kling remains the base/direct edit path.
|
|
246
265
|
Use `chat --project <id|auto> --video ...` for any project/timeline video work. Direct `video create` is standalone and does not write timeline entries.
|
|
247
266
|
|
|
@@ -342,7 +361,7 @@ npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_
|
|
|
342
361
|
|
|
343
362
|
# 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
|
|
344
363
|
npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
|
|
345
|
-
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --
|
|
364
|
+
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
|
|
346
365
|
|
|
347
366
|
# 3c. Edit a video from a local file or public URL
|
|
348
367
|
npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
|
|
@@ -358,7 +377,7 @@ For project/timeline video editing, use:
|
|
|
358
377
|
npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
|
|
359
378
|
```
|
|
360
379
|
|
|
361
|
-
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. H3 defaults to
|
|
380
|
+
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
|
|
362
381
|
|
|
363
382
|
Seedance 2.5: use `--video-model seedance-2.5` for 4-30 second output at 480p/720p. `--image` accepts local files or URLs (up to 30), while repeatable `--video` and `--audio` accept up to 10 each. Use `--video-operation generate|edit|extend`, `--extend-direction forward|backward`, `--output-format mp4|mov`, `--web-search`, `--generated-audio` / `--no-generated-audio`, and `--relaxed-content-filter`. Edit/extend require a video reference. The Evolink route does not currently expose 4K output.
|
|
364
383
|
|
package/bin/makaron.mjs
CHANGED
|
@@ -28,6 +28,14 @@ const NPM_PACKAGE_NAME = 'makaron-cli';
|
|
|
28
28
|
const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
29
29
|
const UPDATE_CHECK_TIMEOUT_MS = 400;
|
|
30
30
|
const AGENT_WAIT_TIMEOUT_SECONDS = Math.max(900, Number(process.env.MAKARON_AGENT_WAIT_TIMEOUT_SECONDS || 10_800));
|
|
31
|
+
const CHAT_AGENT_MODELS = [
|
|
32
|
+
'auto',
|
|
33
|
+
'gpt-5.6-terra',
|
|
34
|
+
'gpt-5.6-sol',
|
|
35
|
+
'gpt-5.6-luna',
|
|
36
|
+
'grok-4.5',
|
|
37
|
+
'deepseek-v4-pro',
|
|
38
|
+
];
|
|
31
39
|
|
|
32
40
|
// Public anon key (safe to embed — only enables auth, not data access)
|
|
33
41
|
const SUPABASE_URL = 'https://sdyrtztrjgmmpnirswxt.supabase.co';
|
|
@@ -35,7 +43,7 @@ const SUPABASE_ANON_KEY = 'sb_publishable_FJFN2YYaWaQjABUKLqxQcA_fhxPLFDY';
|
|
|
35
43
|
|
|
36
44
|
const MAX_VIDEO_UPLOAD_FILE_SIZE_MB = 50;
|
|
37
45
|
const MAX_VIDEO_UPLOAD_FILE_SIZE = MAX_VIDEO_UPLOAD_FILE_SIZE_MB * 1024 * 1024;
|
|
38
|
-
const MAX_VIDEO_UPLOAD_DURATION =
|
|
46
|
+
const MAX_VIDEO_UPLOAD_DURATION = 900;
|
|
39
47
|
const MAX_VIDEO_UPLOAD_DURATION_TOLERANCE = 1;
|
|
40
48
|
const MAX_VIDEO_PROVIDER_REFERENCE_DURATION = 15;
|
|
41
49
|
const MAX_VIDEO_PROVIDER_REFERENCE_DURATION_TOLERANCE = 0.5;
|
|
@@ -59,6 +67,16 @@ function warnLegacyModelFlag(replacement) {
|
|
|
59
67
|
process.stderr.write(`⚠️ --model is deprecated here; use ${replacement}.\n`);
|
|
60
68
|
}
|
|
61
69
|
|
|
70
|
+
function validateChatAgentModel(value) {
|
|
71
|
+
if (!value || !CHAT_AGENT_MODELS.includes(value)) {
|
|
72
|
+
process.stderr.write(`❌ Unknown Agent LLM: ${value || '(missing value)'}\n`);
|
|
73
|
+
process.stderr.write(`Choose one of: ${CHAT_AGENT_MODELS.join(', ')}\n`);
|
|
74
|
+
process.stderr.write('--agent-model selects only the Agent LLM. Put image/video model preferences in the chat prompt, or use the explicit edit/video commands.\n');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
|
|
62
80
|
function getCliVersion() {
|
|
63
81
|
try {
|
|
64
82
|
const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
@@ -351,13 +369,15 @@ Options:
|
|
|
351
369
|
--audio <file|url> Attach a song, beat, or voice reference. MP3/WAV, repeatable.
|
|
352
370
|
--media-manifest <file|-> Import source_url + start + end + description clips before this run.
|
|
353
371
|
--skill <id|label|name> Use an installed skill or auto-install a matched marketplace skill.
|
|
372
|
+
--agent-model <id> Agent LLM only: auto, gpt-5.6-terra, gpt-5.6-sol,
|
|
373
|
+
gpt-5.6-luna, grok-4.5, or deepseek-v4-pro.
|
|
354
374
|
--background, -b Submit and print a runId.
|
|
355
375
|
--json Output structured JSON.
|
|
356
376
|
--stream Legacy live SSE stream.
|
|
357
377
|
--help, -h Show this help.
|
|
358
378
|
|
|
359
|
-
|
|
360
|
-
--video-model,
|
|
379
|
+
Agent LLM defaults to auto (currently gpt-5.6-terra). Image/video model routing
|
|
380
|
+
stays automatic in chat; --image-model, --video-model, and --model are rejected.
|
|
361
381
|
|
|
362
382
|
What you can ask:
|
|
363
383
|
Image edit
|
|
@@ -372,6 +392,11 @@ What you can ask:
|
|
|
372
392
|
Marketplace skill
|
|
373
393
|
makaron chat --project auto --image selfie.jpg --skill "Football Captain" "make this cinematic"
|
|
374
394
|
|
|
395
|
+
Built-in production skill
|
|
396
|
+
makaron skills list --built-in
|
|
397
|
+
makaron skills show talking-head --built-in
|
|
398
|
+
makaron chat --project auto --video talk.mp4 --skill talking-head "make a tight captioned edit"
|
|
399
|
+
|
|
375
400
|
Fix one video moment from a screenshot
|
|
376
401
|
makaron chat --project <id> --image screenshot.png "@4 this frame should be Paris; only fix this moment"
|
|
377
402
|
|
|
@@ -381,6 +406,9 @@ What you can ask:
|
|
|
381
406
|
Agent-to-agent source-range handoff
|
|
382
407
|
makaron chat --project auto --media-manifest set-01.json -b --json "make a 30s vertical video"
|
|
383
408
|
|
|
409
|
+
Compare Agent LLMs with identical inputs
|
|
410
|
+
makaron chat --project auto --agent-model deepseek-v4-pro -b --json "make a 20s badminton video"
|
|
411
|
+
|
|
384
412
|
Music
|
|
385
413
|
makaron chat --project <id> "add calm piano background music"
|
|
386
414
|
|
|
@@ -422,6 +450,7 @@ async function streamAgent(baseUrl, headers, projectId, prompt, opts = {}) {
|
|
|
422
450
|
projectId,
|
|
423
451
|
prompt,
|
|
424
452
|
headless: true,
|
|
453
|
+
...(opts.agentModel ? { agentModel: opts.agentModel } : {}),
|
|
425
454
|
...(opts.uploadedVideoCount ? { uploadedVideoCount: opts.uploadedVideoCount } : {}),
|
|
426
455
|
...(opts.turnMediaCount ? { turnMediaCount: opts.turnMediaCount } : {}),
|
|
427
456
|
}),
|
|
@@ -530,6 +559,7 @@ async function streamAgent(baseUrl, headers, projectId, prompt, opts = {}) {
|
|
|
530
559
|
|
|
531
560
|
async function submitRun(baseUrl, headers, projectId, prompt, opts = {}) {
|
|
532
561
|
const body = { projectId, prompt };
|
|
562
|
+
if (opts.agentModel) body.agentModel = opts.agentModel;
|
|
533
563
|
if (opts.currentSnapshotIndex != null) body.currentSnapshotIndex = opts.currentSnapshotIndex;
|
|
534
564
|
if (opts.isNsfw) body.isNsfw = opts.isNsfw;
|
|
535
565
|
if (opts.audioAttachments?.length) body.audioAttachments = opts.audioAttachments;
|
|
@@ -1149,12 +1179,29 @@ async function fetchBuiltInSkills(baseUrl) {
|
|
|
1149
1179
|
return (data.skills || []).filter(skill => skill.builtIn);
|
|
1150
1180
|
}
|
|
1151
1181
|
|
|
1152
|
-
function
|
|
1182
|
+
function isDiscoverableBuiltInSkill(skill) {
|
|
1183
|
+
return skill.userSelectable !== false || skill.manifestVisible === true;
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
function builtInSkillSearchText(skill) {
|
|
1187
|
+
return [
|
|
1188
|
+
skill.name,
|
|
1189
|
+
skill.label,
|
|
1190
|
+
skill.description,
|
|
1191
|
+
skill.studioRunRecipe,
|
|
1192
|
+
skill.studioRunProfile,
|
|
1193
|
+
skill.canonicalSkill,
|
|
1194
|
+
...(Array.isArray(skill.tags) ? skill.tags : []),
|
|
1195
|
+
].filter(Boolean).join(' ').toLowerCase();
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
function printBuiltInSkills(skills, opts = {}) {
|
|
1153
1199
|
if (!skills.length) {
|
|
1154
1200
|
console.log('No built-in skills found.');
|
|
1155
1201
|
return;
|
|
1156
1202
|
}
|
|
1157
|
-
|
|
1203
|
+
const heading = opts.heading || 'Built-in skills';
|
|
1204
|
+
console.log(`${heading}: ${skills.length}\n`);
|
|
1158
1205
|
for (const skill of skills) {
|
|
1159
1206
|
const recipe = skill.studioRunRecipe ? ` [Studio Run: ${skill.studioRunRecipe}]` : '';
|
|
1160
1207
|
const source = skill.sourceMediaRequired ? ' [source media required]' : '';
|
|
@@ -1164,6 +1211,30 @@ function printBuiltInSkills(skills) {
|
|
|
1164
1211
|
console.log(` ${skill.name}${recipe}${source}${adapter}`);
|
|
1165
1212
|
if (skill.description) console.log(` ${String(skill.description).replace(/\s+/g, ' ').trim()}`);
|
|
1166
1213
|
}
|
|
1214
|
+
if (opts.hint !== false) {
|
|
1215
|
+
console.log('\nInspect and use a skill:');
|
|
1216
|
+
console.log(' makaron skills show <name> --built-in');
|
|
1217
|
+
console.log(' makaron chat --project auto --skill <name> "your request"');
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
function printBuiltInSkill(skill) {
|
|
1222
|
+
const description = String(skill.description || '').replace(/\s+/g, ' ').trim();
|
|
1223
|
+
console.log(`${skill.label || skill.name} (${skill.name})`);
|
|
1224
|
+
if (description) console.log(`\nPurpose:\n ${description}`);
|
|
1225
|
+
console.log('\nBest input:');
|
|
1226
|
+
console.log(` ${skill.inputHint || (skill.sourceMediaRequired ? 'Source media is required. Attach it with --video, --image, or --audio as appropriate.' : 'Start from a clear brief; attach source media when the request depends on existing footage or assets.')}`);
|
|
1227
|
+
if (skill.studioRunRecipe || skill.studioRunProfile) {
|
|
1228
|
+
console.log('\nWorkflow:');
|
|
1229
|
+
if (skill.studioRunRecipe) console.log(` Studio Run recipe: ${skill.studioRunRecipe}`);
|
|
1230
|
+
if (skill.studioRunProfile) console.log(` Profile: ${skill.studioRunProfile}`);
|
|
1231
|
+
}
|
|
1232
|
+
if (Array.isArray(skill.tags) && skill.tags.length) {
|
|
1233
|
+
console.log(`\nKeywords:\n ${skill.tags.join(', ')}`);
|
|
1234
|
+
}
|
|
1235
|
+
console.log('\nUse with chat:');
|
|
1236
|
+
const media = skill.sourceMediaRequired ? ' --video <file>' : '';
|
|
1237
|
+
console.log(` makaron chat --project auto${media} --skill ${skill.name} "describe the result you want"`);
|
|
1167
1238
|
}
|
|
1168
1239
|
|
|
1169
1240
|
function marketplaceSearchText(skill) {
|
|
@@ -1693,6 +1764,8 @@ Commands:
|
|
|
1693
1764
|
|
|
1694
1765
|
chat --project <id> "message" Chat (non-blocking, polls for result)
|
|
1695
1766
|
chat --project <id> --skill <id> Use a built-in or marketplace skill
|
|
1767
|
+
chat --project <id> --agent-model <id> "message"
|
|
1768
|
+
Select only the Agent LLM (strict allowlist)
|
|
1696
1769
|
chat --project <id> --video <file> Attach video to conversation
|
|
1697
1770
|
chat --project <id> --audio <file> Attach song/beat/voice reference
|
|
1698
1771
|
chat --project auto --media-manifest <file> "message"
|
|
@@ -1726,7 +1799,8 @@ Examples:
|
|
|
1726
1799
|
makaron chat --project <id> "turn this into a short video"
|
|
1727
1800
|
|
|
1728
1801
|
Run makaron <command> --help for command-specific options.
|
|
1729
|
-
Chat
|
|
1802
|
+
Chat defaults the Agent LLM automatically; --agent-model can select an exact
|
|
1803
|
+
Agent LLM. Image and video model routing remains automatic in chat.
|
|
1730
1804
|
|
|
1731
1805
|
Environment:
|
|
1732
1806
|
MAKARON_API_KEY API key (mk_live_xxx) — recommended for agents
|
|
@@ -1818,20 +1892,25 @@ function printHelp(topic, subtopic) {
|
|
|
1818
1892
|
} else if (topic === 'install-skill') {
|
|
1819
1893
|
console.log('Usage: makaron install-skill [--global] [--agent <agent>] [--yes]');
|
|
1820
1894
|
} else if (topic === 'skills') {
|
|
1821
|
-
if (subtopic === 'list') console.log('Usage: makaron skills list [--built-in] [--json]');
|
|
1822
|
-
else if (subtopic === 'search') console.log('Usage: makaron skills search <query> [--json]');
|
|
1823
|
-
else if (subtopic === 'show') console.log('Usage: makaron skills show <
|
|
1895
|
+
if (subtopic === 'list') console.log('Usage: makaron skills list [--built-in] [--all] [--json]');
|
|
1896
|
+
else if (subtopic === 'search') console.log('Usage: makaron skills search <query> [--built-in] [--all] [--json]');
|
|
1897
|
+
else if (subtopic === 'show') console.log('Usage: makaron skills show <id|label|name> [--built-in] [--json]');
|
|
1824
1898
|
else if (subtopic === 'install') console.log('Usage: makaron skills install <marketplace-id|label> [--json]');
|
|
1825
1899
|
else console.log(`Skill commands:
|
|
1826
|
-
skills list --built-in List
|
|
1900
|
+
skills list --built-in List user-facing built-in skills and what they do
|
|
1901
|
+
skills list --built-in --all Include internal/adapted helper skills
|
|
1827
1902
|
skills list List marketplace skills
|
|
1828
1903
|
skills search <query> Search marketplace skills
|
|
1904
|
+
skills search <query> --built-in Find a built-in skill by task or keyword
|
|
1829
1905
|
skills show <id|label> --built-in Show a built-in skill
|
|
1830
1906
|
skills show <id|label> Show a marketplace skill
|
|
1831
1907
|
skills install <id|label> Install a marketplace skill to your workspace
|
|
1832
1908
|
|
|
1833
1909
|
Use with chat:
|
|
1834
1910
|
makaron chat --project auto --skill <id|label> "your request"
|
|
1911
|
+
|
|
1912
|
+
Not sure which built-in skill to use? Start with:
|
|
1913
|
+
makaron skills list --built-in
|
|
1835
1914
|
`);
|
|
1836
1915
|
} else if (topic === 'materialize') {
|
|
1837
1916
|
console.log(`Usage: makaron materialize --project <id> (--media <N> | --snapshot <snapshotId> | --design-path <path> | --design-json <file|->) [--wait] [--publish|--no-publish] [--profile fast_720p|source] [--pick url|job_id|status]`);
|
|
@@ -1854,7 +1933,7 @@ Use with chat:
|
|
|
1854
1933
|
else console.log(`Video commands:
|
|
1855
1934
|
video script --image <file> [--image <file>] "direction" Write video script
|
|
1856
1935
|
video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
|
|
1857
|
-
video create --script "..." --video-model minimax-h3
|
|
1936
|
+
video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
|
|
1858
1937
|
video create --script "..." --image <url> [--duration 10] Submit video task
|
|
1859
1938
|
video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|google-omni|minimax-h3] Edit/reference a video (Grok does not support video refs)
|
|
1860
1939
|
video status <taskId> Check video status
|
|
@@ -1968,6 +2047,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
1968
2047
|
let jsonOutput = false;
|
|
1969
2048
|
let activeSkill = undefined;
|
|
1970
2049
|
let mediaManifestPath = undefined;
|
|
2050
|
+
let agentModel = undefined;
|
|
1971
2051
|
for (let i = 1; i < args.length; i++) {
|
|
1972
2052
|
if (args[i] === '--project' && args[i + 1]) projectId = args[++i];
|
|
1973
2053
|
else if (args[i] === '--image' && args[i + 1]) chatImages.push(args[++i]);
|
|
@@ -1983,6 +2063,21 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
1983
2063
|
else if (args[i].startsWith('--media-manifest=')) mediaManifestPath = args[i].slice('--media-manifest='.length);
|
|
1984
2064
|
else if (args[i] === '--skill' && args[i + 1]) activeSkill = args[++i];
|
|
1985
2065
|
else if (args[i].startsWith('--skill=')) activeSkill = args[i].slice('--skill='.length);
|
|
2066
|
+
else if (args[i] === '--agent-model') {
|
|
2067
|
+
if (agentModel !== undefined) {
|
|
2068
|
+
process.stderr.write('❌ Pass --agent-model only once per chat run.\n');
|
|
2069
|
+
process.exit(1);
|
|
2070
|
+
}
|
|
2071
|
+
if (!args[i + 1] || args[i + 1].startsWith('--')) validateChatAgentModel('');
|
|
2072
|
+
agentModel = validateChatAgentModel(args[++i]);
|
|
2073
|
+
}
|
|
2074
|
+
else if (args[i].startsWith('--agent-model=')) {
|
|
2075
|
+
if (agentModel !== undefined) {
|
|
2076
|
+
process.stderr.write('❌ Pass --agent-model only once per chat run.\n');
|
|
2077
|
+
process.exit(1);
|
|
2078
|
+
}
|
|
2079
|
+
agentModel = validateChatAgentModel(args[i].slice('--agent-model='.length));
|
|
2080
|
+
}
|
|
1986
2081
|
else if (args[i] === '--stream') useStream = true;
|
|
1987
2082
|
else if (args[i] === '--background' || args[i] === '-b') background = true;
|
|
1988
2083
|
else if (args[i] === '--json') jsonOutput = true;
|
|
@@ -1991,11 +2086,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
1991
2086
|
process.exit(1);
|
|
1992
2087
|
}
|
|
1993
2088
|
else if (
|
|
1994
|
-
['--
|
|
1995
|
-
|| ['--
|
|
2089
|
+
['--image-model', '--video-model', '--model'].includes(args[i])
|
|
2090
|
+
|| ['--image-model=', '--video-model=', '--model='].some(prefix => args[i].startsWith(prefix))
|
|
1996
2091
|
) {
|
|
1997
2092
|
const flag = args[i].split('=')[0];
|
|
1998
|
-
process.stderr.write(`❌ makaron chat
|
|
2093
|
+
process.stderr.write(`❌ ${flag} is not valid for makaron chat. Only --agent-model may select the Agent LLM; image/video routing stays automatic. Remove ${flag} and retry.\n`);
|
|
1999
2094
|
process.exit(1);
|
|
2000
2095
|
}
|
|
2001
2096
|
else promptParts.push(args[i]);
|
|
@@ -2213,7 +2308,8 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2213
2308
|
uploadedTurnVideoCount += videoSnaps.length;
|
|
2214
2309
|
uploadedTurnMediaCount += videoSnaps.length;
|
|
2215
2310
|
} else {
|
|
2216
|
-
process.stderr.write(
|
|
2311
|
+
process.stderr.write(`❌ Failed to add videos to the project timeline: ${await res.text()}\n`);
|
|
2312
|
+
process.exit(1);
|
|
2217
2313
|
}
|
|
2218
2314
|
}
|
|
2219
2315
|
|
|
@@ -2222,6 +2318,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2222
2318
|
if (useStream) {
|
|
2223
2319
|
// Legacy SSE mode
|
|
2224
2320
|
const { results } = await streamAgent(baseUrl, headers, projectId, finalPrompt, {
|
|
2321
|
+
agentModel,
|
|
2225
2322
|
uploadedVideoCount: uploadedTurnVideoCount,
|
|
2226
2323
|
turnMediaCount: uploadedTurnMediaCount,
|
|
2227
2324
|
});
|
|
@@ -2234,6 +2331,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2234
2331
|
} else {
|
|
2235
2332
|
// Default: fire-and-forget + poll
|
|
2236
2333
|
const { runId } = await submitRun(baseUrl, headers, projectId, finalPrompt, {
|
|
2334
|
+
agentModel,
|
|
2237
2335
|
audioAttachments,
|
|
2238
2336
|
uploadedVideoCount: uploadedTurnVideoCount,
|
|
2239
2337
|
turnMediaCount: uploadedTurnMediaCount,
|
|
@@ -2439,22 +2537,41 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2439
2537
|
|
|
2440
2538
|
if (sub === 'list') {
|
|
2441
2539
|
const builtIn = args.includes('--built-in');
|
|
2442
|
-
const
|
|
2540
|
+
const allBuiltIn = args.includes('--all');
|
|
2541
|
+
const fetchedSkills = builtIn ? await fetchBuiltInSkills(baseUrl) : await fetchMarketplaceSkills(baseUrl);
|
|
2542
|
+
const skills = builtIn && !allBuiltIn
|
|
2543
|
+
? fetchedSkills.filter(isDiscoverableBuiltInSkill)
|
|
2544
|
+
: fetchedSkills;
|
|
2443
2545
|
if (jsonOutput) console.log(JSON.stringify({ skills }, null, 2));
|
|
2444
|
-
else if (builtIn) printBuiltInSkills(skills
|
|
2546
|
+
else if (builtIn) printBuiltInSkills(skills, {
|
|
2547
|
+
heading: allBuiltIn ? 'All built-in skills' : 'Built-in skills available to use',
|
|
2548
|
+
});
|
|
2445
2549
|
else printMarketplaceSkills(skills);
|
|
2446
2550
|
} else if (sub === 'search') {
|
|
2447
|
-
const
|
|
2448
|
-
|
|
2551
|
+
const builtIn = args.includes('--built-in');
|
|
2552
|
+
const allBuiltIn = args.includes('--all');
|
|
2553
|
+
const query = args.filter((arg, index) => index > 1 && !['--json', '--built-in', '--all'].includes(arg)).join(' ').trim();
|
|
2554
|
+
if (!query) { console.error('Usage: makaron skills search <query> [--built-in] [--all] [--json]'); process.exit(1); }
|
|
2449
2555
|
const lowerQuery = query.toLowerCase();
|
|
2450
2556
|
const slugQuery = slugifySkill(query);
|
|
2451
|
-
const
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2557
|
+
const builtInQueryTokens = slugQuery.split('-').filter(Boolean);
|
|
2558
|
+
const skills = builtIn
|
|
2559
|
+
? (await fetchBuiltInSkills(baseUrl))
|
|
2560
|
+
.filter(skill => allBuiltIn || isDiscoverableBuiltInSkill(skill))
|
|
2561
|
+
.filter(skill => {
|
|
2562
|
+
const searchText = builtInSkillSearchText(skill);
|
|
2563
|
+
const slugText = slugifySkill(searchText);
|
|
2564
|
+
return searchText.includes(lowerQuery)
|
|
2565
|
+
|| (builtInQueryTokens.length > 0 && builtInQueryTokens.every(token => slugText.includes(token)));
|
|
2566
|
+
})
|
|
2567
|
+
: (await fetchMarketplaceSkills(baseUrl))
|
|
2568
|
+
.filter(skill => {
|
|
2569
|
+
const rawMatch = marketplaceSkillTokens(skill).some(token => token.includes(lowerQuery));
|
|
2570
|
+
const slugMatch = slugQuery ? marketplaceSearchText(skill).includes(slugQuery) : false;
|
|
2571
|
+
return rawMatch || slugMatch;
|
|
2572
|
+
});
|
|
2457
2573
|
if (jsonOutput) console.log(JSON.stringify({ skills }, null, 2));
|
|
2574
|
+
else if (builtIn) printBuiltInSkills(skills, { heading: `Built-in skill matches for "${query}"` });
|
|
2458
2575
|
else printMarketplaceSkills(skills);
|
|
2459
2576
|
} else if (sub === 'show') {
|
|
2460
2577
|
const identifier = args[2];
|
|
@@ -2466,7 +2583,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2466
2583
|
: findMarketplaceSkill(skills, identifier);
|
|
2467
2584
|
if (!skill) { console.error(`Skill not found: ${identifier}`); process.exit(1); }
|
|
2468
2585
|
if (jsonOutput) console.log(JSON.stringify(skill, null, 2));
|
|
2469
|
-
else if (builtIn)
|
|
2586
|
+
else if (builtIn) printBuiltInSkill(skill);
|
|
2470
2587
|
else printMarketplaceSkill(skill);
|
|
2471
2588
|
} else if (sub === 'install') {
|
|
2472
2589
|
const identifier = args[2];
|
|
@@ -2480,9 +2597,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2480
2597
|
else console.log(data.skillName);
|
|
2481
2598
|
} else {
|
|
2482
2599
|
console.log(`Skill commands:
|
|
2483
|
-
skills list --built-in List
|
|
2600
|
+
skills list --built-in List user-facing built-in skills and what they do
|
|
2601
|
+
skills list --built-in --all Include internal/adapted helper skills
|
|
2484
2602
|
skills list List marketplace skills
|
|
2485
2603
|
skills search <query> Search marketplace skills
|
|
2604
|
+
skills search <query> --built-in Find a built-in skill by task or keyword
|
|
2486
2605
|
skills show <id|label> --built-in Show a built-in skill
|
|
2487
2606
|
skills show <id|label> Show a marketplace skill
|
|
2488
2607
|
skills install <id|label> Install a marketplace skill to your workspace
|
|
@@ -2776,7 +2895,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
|
|
|
2776
2895
|
console.log(`Video commands:
|
|
2777
2896
|
video script --image <file> [--image <file>] "direction" Write video script
|
|
2778
2897
|
video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
|
|
2779
|
-
video create --script "..." --video-model minimax-h3
|
|
2898
|
+
video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
|
|
2780
2899
|
video create --script "..." --image <url> [--duration 10] Submit video task
|
|
2781
2900
|
video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|google-omni|minimax-h3] Edit/reference a video (Grok does not support video refs)
|
|
2782
2901
|
video status <taskId> Check video status
|
package/package.json
CHANGED
package/skills/makaron/SKILL.md
CHANGED
|
@@ -85,7 +85,11 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
|
|
|
85
85
|
npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
`chat`
|
|
88
|
+
`chat` routes image and video models automatically. Use `--agent-model` only when the user explicitly asks to select or compare the reasoning/tool-calling Agent LLM. Accepted values are exactly `auto`, `gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.5`, and `deepseek-v4-pro`; `auto` currently resolves to `gpt-5.6-terra`. Never put an image or video model ID in `--agent-model`. The CLI rejects unknown Agent IDs plus `--image-model`, `--video-model`, and legacy `--model` before starting a chat run.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
|
|
92
|
+
```
|
|
89
93
|
|
|
90
94
|
Returns immediately:
|
|
91
95
|
```json
|
|
@@ -105,6 +109,33 @@ Returns immediately:
|
|
|
105
109
|
| Beat-sync video from audio | `npx makaron-cli chat --project auto --audio beat.mp3 "use Seedance Mini at 480p to make a beat-synced video"` |
|
|
106
110
|
| Create motion design | `npx makaron-cli chat --project <id> "make an animated Instagram story with this image"` |
|
|
107
111
|
|
|
112
|
+
### Built-in production skills
|
|
113
|
+
|
|
114
|
+
When the request names a production format or the correct workflow is unclear,
|
|
115
|
+
discover the current built-in skills before starting. Do not guess a skill slug
|
|
116
|
+
from memory: the server list is the source of truth.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Short list of callable/discoverable production skills and their purpose
|
|
120
|
+
npx makaron-cli skills list --built-in
|
|
121
|
+
|
|
122
|
+
# Search by task, format, or keyword
|
|
123
|
+
npx makaron-cli skills search "talking head captions" --built-in
|
|
124
|
+
|
|
125
|
+
# Inspect input requirements, workflow, keywords, and exact invocation
|
|
126
|
+
npx makaron-cli skills show talking-head --built-in
|
|
127
|
+
|
|
128
|
+
# Use the exact slug returned by list/show
|
|
129
|
+
npx makaron-cli chat --project auto --video talk.mp4 \
|
|
130
|
+
--skill talking-head -b "remove false starts, add synced captions and useful B-roll"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Use `--all` only when debugging adapters or looking for an internal helper Skill.
|
|
134
|
+
For ordinary creative work, choose from the default built-in list. A named
|
|
135
|
+
destination takes priority over a generic source workflow: for example,
|
|
136
|
+
explicit TikTok/Douyin work uses `tiktok-video`; ordinary speech-led cleanup
|
|
137
|
+
uses `talking-head`; broader mixed-footage editing uses `source-video-studio`.
|
|
138
|
+
|
|
108
139
|
### Marketplace skills
|
|
109
140
|
|
|
110
141
|
Use marketplace skills when the user asks for a named Makaron effect, template, or skill such as "Football Captain", "足球队长", "World Cup MVP", or a marketplace UUID.
|
|
@@ -180,7 +211,7 @@ npx makaron-cli chat --project <id> --video clip1.mp4 --video clip2.mp4 -b "comb
|
|
|
180
211
|
npx makaron-cli chat --project auto --video https://example.com/dance.mp4 -b "extend this to 15 seconds"
|
|
181
212
|
```
|
|
182
213
|
|
|
183
|
-
Supported formats: MP4, MOV, WebM. CLI local video uploads support max 50MB, max
|
|
214
|
+
Supported formats: MP4, MOV, WebM. CLI local video uploads support max 50MB, max 900s (15 minutes) with 1s metadata tolerance, and <=1080p / 2,086,876 frame pixels. The frontend can transcode larger videos before upload; the CLI uploads directly to Storage and rejects videos above those limits. Videos are uploaded to the project timeline. The Agent can analyze scenes, edit content, compose multiple clips, extend duration, and add effects — all via natural language. Seedance reference-video limits remain provider-specific, so longer uploaded videos should be split/prepared by the agent before model submission; Kling remains the base/direct edit path.
|
|
184
215
|
|
|
185
216
|
Use `chat --project <id|auto> --video ...` for any project/timeline video work. Direct video commands are standalone raw-tool calls.
|
|
186
217
|
|
|
@@ -280,7 +311,7 @@ npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_
|
|
|
280
311
|
|
|
281
312
|
# 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
|
|
282
313
|
npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
|
|
283
|
-
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --
|
|
314
|
+
npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
|
|
284
315
|
|
|
285
316
|
# 3c. Edit a video from a local file or public URL
|
|
286
317
|
npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
|
|
@@ -296,7 +327,7 @@ npx makaron-cli video status <taskId>
|
|
|
296
327
|
npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
|
|
297
328
|
```
|
|
298
329
|
|
|
299
|
-
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. H3 defaults to
|
|
330
|
+
Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
|
|
300
331
|
|
|
301
332
|
Seedance 2.5 uses `--video-model seedance-2.5` and supports 4-30s at 480p/720p, up to 30 images + 10 videos + 10 audios, repeatable local/URL references, `--video-operation generate|edit|extend`, `--extend-direction`, `--output-format mp4|mov`, and `--web-search`. The Evolink route does not currently expose 4K output.
|
|
302
333
|
|