makaron-cli 0.13.7 → 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.7",
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.7",
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
@@ -140,6 +140,20 @@ npx makaron-cli chat --project auto --image selfie.jpg --skill <marketplace-id-o
140
140
 
141
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.
142
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
+
143
157
  ### With additional images (existing project)
144
158
 
145
159
  ```bash
@@ -246,7 +260,7 @@ npx makaron-cli chat --project <id> --video party.mp4 --image kid.jpg -b "make t
246
260
  npx makaron-cli chat --project <id> --video clip1.mp4 --video clip2.mp4 -b "splice these into one seamless video"
247
261
  ```
248
262
 
249
- 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.
250
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.
251
265
  Use `chat --project <id|auto> --video ...` for any project/timeline video work. Direct `video create` is standalone and does not write timeline entries.
252
266
 
package/bin/makaron.mjs CHANGED
@@ -43,7 +43,7 @@ const SUPABASE_ANON_KEY = 'sb_publishable_FJFN2YYaWaQjABUKLqxQcA_fhxPLFDY';
43
43
 
44
44
  const MAX_VIDEO_UPLOAD_FILE_SIZE_MB = 50;
45
45
  const MAX_VIDEO_UPLOAD_FILE_SIZE = MAX_VIDEO_UPLOAD_FILE_SIZE_MB * 1024 * 1024;
46
- const MAX_VIDEO_UPLOAD_DURATION = 120;
46
+ const MAX_VIDEO_UPLOAD_DURATION = 900;
47
47
  const MAX_VIDEO_UPLOAD_DURATION_TOLERANCE = 1;
48
48
  const MAX_VIDEO_PROVIDER_REFERENCE_DURATION = 15;
49
49
  const MAX_VIDEO_PROVIDER_REFERENCE_DURATION_TOLERANCE = 0.5;
@@ -392,6 +392,11 @@ What you can ask:
392
392
  Marketplace skill
393
393
  makaron chat --project auto --image selfie.jpg --skill "Football Captain" "make this cinematic"
394
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
+
395
400
  Fix one video moment from a screenshot
396
401
  makaron chat --project <id> --image screenshot.png "@4 this frame should be Paris; only fix this moment"
397
402
 
@@ -1174,12 +1179,29 @@ async function fetchBuiltInSkills(baseUrl) {
1174
1179
  return (data.skills || []).filter(skill => skill.builtIn);
1175
1180
  }
1176
1181
 
1177
- 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 = {}) {
1178
1199
  if (!skills.length) {
1179
1200
  console.log('No built-in skills found.');
1180
1201
  return;
1181
1202
  }
1182
- console.log(`Built-in skills: ${skills.length}\n`);
1203
+ const heading = opts.heading || 'Built-in skills';
1204
+ console.log(`${heading}: ${skills.length}\n`);
1183
1205
  for (const skill of skills) {
1184
1206
  const recipe = skill.studioRunRecipe ? ` [Studio Run: ${skill.studioRunRecipe}]` : '';
1185
1207
  const source = skill.sourceMediaRequired ? ' [source media required]' : '';
@@ -1189,6 +1211,30 @@ function printBuiltInSkills(skills) {
1189
1211
  console.log(` ${skill.name}${recipe}${source}${adapter}`);
1190
1212
  if (skill.description) console.log(` ${String(skill.description).replace(/\s+/g, ' ').trim()}`);
1191
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"`);
1192
1238
  }
1193
1239
 
1194
1240
  function marketplaceSearchText(skill) {
@@ -1846,20 +1892,25 @@ function printHelp(topic, subtopic) {
1846
1892
  } else if (topic === 'install-skill') {
1847
1893
  console.log('Usage: makaron install-skill [--global] [--agent <agent>] [--yes]');
1848
1894
  } else if (topic === 'skills') {
1849
- if (subtopic === 'list') console.log('Usage: makaron skills list [--built-in] [--json]');
1850
- else if (subtopic === 'search') console.log('Usage: makaron skills search <query> [--json]');
1851
- 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]');
1852
1898
  else if (subtopic === 'install') console.log('Usage: makaron skills install <marketplace-id|label> [--json]');
1853
1899
  else console.log(`Skill commands:
1854
- 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
1855
1902
  skills list List marketplace skills
1856
1903
  skills search <query> Search marketplace skills
1904
+ skills search <query> --built-in Find a built-in skill by task or keyword
1857
1905
  skills show <id|label> --built-in Show a built-in skill
1858
1906
  skills show <id|label> Show a marketplace skill
1859
1907
  skills install <id|label> Install a marketplace skill to your workspace
1860
1908
 
1861
1909
  Use with chat:
1862
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
1863
1914
  `);
1864
1915
  } else if (topic === 'materialize') {
1865
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]`);
@@ -2257,7 +2308,8 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2257
2308
  uploadedTurnVideoCount += videoSnaps.length;
2258
2309
  uploadedTurnMediaCount += videoSnaps.length;
2259
2310
  } else {
2260
- 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);
2261
2313
  }
2262
2314
  }
2263
2315
 
@@ -2485,22 +2537,41 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2485
2537
 
2486
2538
  if (sub === 'list') {
2487
2539
  const builtIn = args.includes('--built-in');
2488
- 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;
2489
2545
  if (jsonOutput) console.log(JSON.stringify({ skills }, null, 2));
2490
- 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
+ });
2491
2549
  else printMarketplaceSkills(skills);
2492
2550
  } else if (sub === 'search') {
2493
- const query = args.filter((arg, index) => index > 1 && arg !== '--json').join(' ').trim();
2494
- 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); }
2495
2555
  const lowerQuery = query.toLowerCase();
2496
2556
  const slugQuery = slugifySkill(query);
2497
- const skills = (await fetchMarketplaceSkills(baseUrl))
2498
- .filter(skill => {
2499
- const rawMatch = marketplaceSkillTokens(skill).some(token => token.includes(lowerQuery));
2500
- const slugMatch = slugQuery ? marketplaceSearchText(skill).includes(slugQuery) : false;
2501
- return rawMatch || slugMatch;
2502
- });
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
+ });
2503
2573
  if (jsonOutput) console.log(JSON.stringify({ skills }, null, 2));
2574
+ else if (builtIn) printBuiltInSkills(skills, { heading: `Built-in skill matches for "${query}"` });
2504
2575
  else printMarketplaceSkills(skills);
2505
2576
  } else if (sub === 'show') {
2506
2577
  const identifier = args[2];
@@ -2512,7 +2583,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2512
2583
  : findMarketplaceSkill(skills, identifier);
2513
2584
  if (!skill) { console.error(`Skill not found: ${identifier}`); process.exit(1); }
2514
2585
  if (jsonOutput) console.log(JSON.stringify(skill, null, 2));
2515
- else if (builtIn) printBuiltInSkills([skill]);
2586
+ else if (builtIn) printBuiltInSkill(skill);
2516
2587
  else printMarketplaceSkill(skill);
2517
2588
  } else if (sub === 'install') {
2518
2589
  const identifier = args[2];
@@ -2526,9 +2597,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2526
2597
  else console.log(data.skillName);
2527
2598
  } else {
2528
2599
  console.log(`Skill commands:
2529
- 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
2530
2602
  skills list List marketplace skills
2531
2603
  skills search <query> Search marketplace skills
2604
+ skills search <query> --built-in Find a built-in skill by task or keyword
2532
2605
  skills show <id|label> --built-in Show a built-in skill
2533
2606
  skills show <id|label> Show a marketplace skill
2534
2607
  skills install <id|label> Install a marketplace skill to your workspace
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.13.7",
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": {
@@ -109,6 +109,33 @@ Returns immediately:
109
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"` |
110
110
  | Create motion design | `npx makaron-cli chat --project <id> "make an animated Instagram story with this image"` |
111
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
+
112
139
  ### Marketplace skills
113
140
 
114
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.
@@ -184,7 +211,7 @@ npx makaron-cli chat --project <id> --video clip1.mp4 --video clip2.mp4 -b "comb
184
211
  npx makaron-cli chat --project auto --video https://example.com/dance.mp4 -b "extend this to 15 seconds"
185
212
  ```
186
213
 
187
- 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.
188
215
 
189
216
  Use `chat --project <id|auto> --video ...` for any project/timeline video work. Direct video commands are standalone raw-tool calls.
190
217