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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +15 -1
- package/bin/makaron.mjs +93 -20
- package/package.json +1 -1
- package/skills/makaron/SKILL.md +28 -1
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 <
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
2494
|
-
|
|
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
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
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)
|
|
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
|
|
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
package/skills/makaron/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|