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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.13.6",
3
+ "version": "0.13.8",
4
4
  "description": "Give Claude Code a creative agent. Pass complete creative requests and source media to Makaron Chat.",
5
5
  "author": {
6
6
  "name": "Versa AI",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.13.6",
3
+ "version": "0.13.8",
4
4
  "description": "Give Codex a creative agent. Pass complete creative requests and source media to Makaron Chat.",
5
5
  "author": {
6
6
  "name": "Versa AI",
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` always routes agent, image, and video models automatically. Never pass `--agent-model`, `--image-model`, `--video-model`, or the legacy `--model` flag to `chat`; the CLI rejects them before starting a run. Model flags remain available only on explicit low-level commands such as `edit` and `video create`.
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 120s 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.
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 --video-resolution 2k --aspect 16:9
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 public 2k output; 768p requires provider preview access plus `MINIMAX_H3_ENABLE_768P=true` on the Makaron server. 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.
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 = 120;
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
- Model routing is automatic in chat. Do not pass --agent-model, --image-model,
360
- --video-model, or the legacy --model flag.
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 printBuiltInSkills(skills) {
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
- console.log(`Built-in skills: ${skills.length}\n`);
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 chooses agent, image, and video models automatically.
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 <marketplace-id|label> [--json]');
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 all built-in Makaron skills and Studio Run recipes
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 --video-resolution 2k MiniMax H3 native 2K text-to-video
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
- ['--agent-model', '--image-model', '--video-model', '--model'].includes(args[i])
1995
- || ['--agent-model=', '--image-model=', '--video-model=', '--model='].some(prefix => args[i].startsWith(prefix))
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 chooses agent, image, and video models automatically. Remove ${flag} and retry.\n`);
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(`⚠️ Failed to add videos: ${await res.text()}\n`);
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 skills = builtIn ? await fetchBuiltInSkills(baseUrl) : await fetchMarketplaceSkills(baseUrl);
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 query = args.filter((arg, index) => index > 1 && arg !== '--json').join(' ').trim();
2448
- if (!query) { console.error('Usage: makaron skills search <query> [--json]'); process.exit(1); }
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 skills = (await fetchMarketplaceSkills(baseUrl))
2452
- .filter(skill => {
2453
- const rawMatch = marketplaceSkillTokens(skill).some(token => token.includes(lowerQuery));
2454
- const slugMatch = slugQuery ? marketplaceSearchText(skill).includes(slugQuery) : false;
2455
- return rawMatch || slugMatch;
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) printBuiltInSkills([skill]);
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 all built-in Makaron skills and Studio Run recipes
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 --video-resolution 2k MiniMax H3 native 2K text-to-video
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.13.6",
3
+ "version": "0.13.8",
4
4
  "description": "Talk to Makaron Agent from the terminal — create projects, edit images, generate videos",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -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` always routes agent, image, and video models automatically. Never pass `--agent-model`, `--image-model`, `--video-model`, or the legacy `--model` flag to `chat`; the CLI rejects them before starting a run. Model flags remain available only on explicit low-level commands such as `edit` and `video create`.
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 120s 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 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.
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 --video-resolution 2k --aspect 16:9
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 public 2k output; 768p requires provider preview access plus `MINIMAX_H3_ENABLE_768P=true` on the Makaron server. 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.
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