luckiest-co 1.0.26 → 1.0.27
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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/commands/charms.md +1 -1
- package/commands/finish.md +1 -1
- package/commands/go.md +1 -1
- package/commands/helpers.md +1 -1
- package/commands/home.md +1 -1
- package/commands/leaderboard.md +1 -1
- package/commands/merge.md +1 -1
- package/commands/next.md +1 -1
- package/commands/overlaps.md +1 -1
- package/commands/plan.md +1 -1
- package/commands/skills.md +1 -1
- package/commands/start.md +1 -1
- package/commands/status.md +1 -1
- package/commands/updates.md +1 -1
- package/commands/vouch.md +1 -1
- package/commands/wishes.md +1 -1
- package/package.json +1 -1
- package/references/vocabulary.md +1 -1
- package/skills/luckiest-charms/SKILL.md +1 -1
- package/skills/luckiest-finish/SKILL.md +1 -1
- package/skills/luckiest-go/SKILL.md +1 -1
- package/skills/luckiest-helpers/SKILL.md +1 -1
- package/skills/luckiest-home/SKILL.md +1 -1
- package/skills/luckiest-leaderboard/SKILL.md +1 -1
- package/skills/luckiest-merge/SKILL.md +1 -1
- package/skills/luckiest-next/SKILL.md +1 -1
- package/skills/luckiest-overlaps/SKILL.md +1 -1
- package/skills/luckiest-plan/SKILL.md +1 -1
- package/skills/luckiest-skills/SKILL.md +1 -1
- package/skills/luckiest-start/SKILL.md +1 -1
- package/skills/luckiest-status/SKILL.md +1 -1
- package/skills/luckiest-updates/SKILL.md +1 -1
- package/skills/luckiest-video-studio/ATTRIBUTION.md +4 -0
- package/skills/luckiest-video-studio/CHANGELOG.md +21 -0
- package/skills/luckiest-video-studio/SECURITY.md +1 -0
- package/skills/luckiest-video-studio/SKILL.md +43 -21
- package/skills/luckiest-video-studio/references/concat.md +63 -0
- package/skills/luckiest-video-studio/references/step-2b-storyboard.md +70 -0
- package/skills/luckiest-video-studio/scripts/assemble-concat.mjs +127 -0
- package/skills/luckiest-video-studio/scripts/assemble-concat.test.mjs +36 -0
- package/skills/luckiest-vouch/SKILL.md +1 -1
- package/skills/luckiest-wishes/SKILL.md +1 -1
package/commands/charms.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Your charms balance and recent related activity.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/commands/finish.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Wrap up, what shipped, what changed, what's next.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Asking the user a question: this command tells you to use the AskUserQuestion tool
|
|
8
8
|
so the user can click instead of typing. That tool only exists in Claude Code. In
|
package/commands/go.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Run your plan, one task at a time, checked as it goes.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Asking the user a question: this command tells you to use the AskUserQuestion tool
|
|
8
8
|
so the user can click instead of typing. That tool only exists in Claude Code. In
|
package/commands/helpers.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: See who needs a hand right now, and claim a request to help.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/commands/home.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: The community dashboard. Wishes and charms, plan progress, tribe pulse, and who needs help.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/commands/leaderboard.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: See how the tribe ranks. Top scores, one bar chart.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/commands/merge.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Merge two overlapping skills into one, after you review the diff.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: Get the two skill ids
|
|
8
8
|
|
package/commands/next.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Do the suggested next step.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Project key for luckiest MCP plan tool calls: run `git config --get remote.origin.url` and normalize the result to lowercase `host/owner/repo` with any `.git` suffix removed. If it is not a git repo, use the absolute working directory path. If there is no local shell (web chat, Cowork), omit `project` entirely.
|
|
8
8
|
|
package/commands/overlaps.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Find installed skills that overlap with your own, and resolve them.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: Pick a skill to check
|
|
8
8
|
|
package/commands/plan.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Plan your next piece of work. Guided questions, then a plan Claude can run.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Asking the user a question: this command tells you to use the AskUserQuestion tool
|
|
8
8
|
so the user can click instead of typing. That tool only exists in Claude Code. In
|
package/commands/skills.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Your skills, list what's installed, pull new purchases.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: List installed luckiest skills
|
|
8
8
|
|
package/commands/start.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Tell me about your project, a short interview that writes your Brand Brief.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: Check for an existing brief
|
|
8
8
|
|
package/commands/status.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Where you are. Progress, tasks, and your one next step.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/commands/updates.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Check for updates to your installed luckiest skills and plugin.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: Check for updates
|
|
8
8
|
|
package/commands/vouch.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Request or approve a warm intro to someone outside your tribe.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
## Step 1: Figure out the intent
|
|
8
8
|
|
package/commands/wishes.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: Your wishes balance and recent related activity.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action
|
|
5
|
+
Output rules for this command: plain language, no em dashes, no internal terms, and end with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next. The server may return internal words; translate them and never show them: PLAN means plan, APPLY means go, UNIFY means finish, DRAFT means in progress, DOING means active, DONE means complete, UAT means testing, AC means requirements, HANDOFF means ready for review, skill_loop means status.
|
|
6
6
|
|
|
7
7
|
Read `references/chart-renderer.md` before rendering any chart and follow it.
|
|
8
8
|
|
package/package.json
CHANGED
package/references/vocabulary.md
CHANGED
|
@@ -21,7 +21,7 @@ Every command file MUST read this file and follow it in all output.
|
|
|
21
21
|
|
|
22
22
|
1. **Never show internal terms to the user.** All output must use user-facing vocabulary only. Never surface PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, or any internal database term in user-visible output.
|
|
23
23
|
|
|
24
|
-
2. **Exactly one suggested next action per response.** Every command output ends with a single next-step recommendation in the format: `Next: <one action
|
|
24
|
+
2. **Exactly one suggested next action per response.** Every command output ends with a single next-step recommendation in the format: `Next: <one action> (say /next to do it)`. Typing /next runs it.
|
|
25
25
|
|
|
26
26
|
3. **Plain language, no jargon, no em dashes.** Use direct, accessible language. No em dashes. No filler phrases. No marketing speak.
|
|
27
27
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-charms
|
|
|
3
3
|
description: "Your Luckiest charms balance and recent related activity. Use when the user says /luckiest charms, luckiest charms, or asks about their charms."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-finish
|
|
|
3
3
|
description: "Wrap up a completed Luckiest plan: recap what shipped, close it out, award charms. Use when the user says /luckiest finish, luckiest finish, or all plan tasks are done."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Project key for luckiest MCP plan tool calls: if a shell is available, run `git config --get remote.origin.url` and normalize to `host/owner/repo` (lowercase, no `.git`); if not a git repo, use the absolute path from `pwd`. If there is no shell at all (web chat, Cowork), omit `project` entirely. Use the same value on every plan tool call this whole session.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-go
|
|
|
3
3
|
description: "Run the active Luckiest plan, one task at a time, checked as it goes. Use when the user says /luckiest go, luckiest go, or wants to continue their staged Luckiest plan."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Project key for luckiest MCP plan tool calls: if a shell is available, run `git config --get remote.origin.url` and normalize to `host/owner/repo` (lowercase, no `.git`); if not a git repo, use the absolute path from `pwd`. If there is no shell at all (web chat, Cowork), omit `project` entirely. Use the same value on every plan tool call this whole session.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-helpers
|
|
|
3
3
|
description: "See who in your Luckiest tribe needs a hand right now, and claim a request to help. Use when the user says /luckiest helpers, luckiest helpers, or asks who needs help."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-home
|
|
|
3
3
|
description: "The Luckiest community dashboard: wishes and charms, plan progress, tribe pulse, and who needs help. Use when the user says /luckiest home, luckiest home, or asks for their Luckiest dashboard."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-leaderboard
|
|
|
3
3
|
description: "See how the Luckiest tribe ranks: top scores, one bar chart. Use when the user says /luckiest leaderboard, luckiest leaderboard, or asks for tribe rankings."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-merge
|
|
|
3
3
|
description: "Merge two overlapping Luckiest skills into one, after the user reviews the diff. Use when the user says /luckiest merge, luckiest merge, or wants to combine overlapping skills."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
## Step 1: Get the two skill ids
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-next
|
|
|
3
3
|
description: "Do the suggested next step: runs the last Next line from this chat, or picks up the plan where it stands. Use when the user says /next, /luckiest next, luckiest next, or next step."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Project key for luckiest MCP plan tool calls: if a shell is available, run `git config --get remote.origin.url` and normalize to `host/owner/repo` (lowercase, no `.git`); if not a git repo, use the absolute path from `pwd`. If there is no shell at all (web chat, Cowork), omit `project` entirely. Use the same value on every plan tool call this whole session.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-overlaps
|
|
|
3
3
|
description: "Find installed Luckiest skills that overlap with your own, and resolve them. Use when the user says /luckiest overlaps, luckiest overlaps, or asks about duplicate skills."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
## Step 1: Pick a skill to check
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-plan
|
|
|
3
3
|
description: "Use when the user says /luckiest plan or luckiest plan, or wants to plan a feature, a launch, or their next piece of work before building it, even if they do not say plan (for example \"what should I build next\" or \"break this down into tasks\"). Looks at the project first, drafts 3 to 7 tasks with a suggested skill, model, and runnable check each, saves the context for /luckiest go, and stages the plan after one approval question."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Project key for luckiest MCP plan tool calls: if a shell is available, run `git config --get remote.origin.url` and normalize to `host/owner/repo` (lowercase, no `.git`); if not a git repo, use the absolute path from `pwd`. If there is no shell at all (web chat, Cowork), omit `project` entirely. Use the same value on every plan tool call this whole session.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-skills
|
|
|
3
3
|
description: "Your Luckiest skills: list what is installed, pull new purchases. Use when the user says /luckiest skills, luckiest skills, or asks what Luckiest skills they have."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
If there is no shell or filesystem on this surface (web chat), skip any step that runs a command or reads or writes a local file, and tell the user that step needs Claude Code or Cowork.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-start
|
|
|
3
3
|
description: "A short interview about your project that writes your Brand Brief. Use when the user says /luckiest start, luckiest start, or wants to set up Luckiest for a project."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
If there is no shell or filesystem on this surface (web chat), skip any step that runs a command or reads or writes a local file, and tell the user that step needs Claude Code or Cowork.
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-status
|
|
|
3
3
|
description: "Where you are in your Luckiest plan: progress, tasks, and your one next step. Use when the user says /luckiest status, luckiest status, or asks where their plan stands."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-updates
|
|
|
3
3
|
description: "Check for updates to your installed Luckiest skills and plugin. Use when the user says /luckiest updates, luckiest updates, or asks if their Luckiest install is current."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
If there is no shell or filesystem on this surface (web chat), skip any step that runs a command or reads or writes a local file, and tell the user that step needs Claude Code or Cowork.
|
|
9
9
|
|
|
@@ -23,6 +23,10 @@ Used at runtime, not bundled:
|
|
|
23
23
|
licensed rendering engine. Optional editor for `--editor diffusion`. Installed by
|
|
24
24
|
the user; this edition writes a project for it and calls its bundled CLI, and
|
|
25
25
|
copies none of its code.
|
|
26
|
+
- **Concat** (`jub0t/Concat`), AGPL-3.0-or-later. Default editor for
|
|
27
|
+
`--editor concat`. Installed by the user; this edition sends JSON requests to its
|
|
28
|
+
`concat-cli` and copies none of its code, so the AGPL does not extend to this
|
|
29
|
+
skill.
|
|
26
30
|
|
|
27
31
|
## Changes in this edition
|
|
28
32
|
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog — luckiest-video-studio
|
|
2
2
|
|
|
3
|
+
## 1.7.1 (2026-10-04)
|
|
4
|
+
- `assemble-concat.mjs` tested end to end against Concat 0.2.5. Fixes found by the
|
|
5
|
+
live run and by reading Concat's source: progress events between replies no
|
|
6
|
+
longer break the script; the project gets the storyboard's frame size and fps
|
|
7
|
+
(Concat defaulted to 1080p30); a rerun moves the old project aside instead of
|
|
8
|
+
failing; music longer than the video is trimmed to it; an empty `CONCAT_CLI`
|
|
9
|
+
falls back to `concat-cli`.
|
|
10
|
+
- `references/concat.md`: the app download lacks `concat-cli`; how to build it.
|
|
11
|
+
|
|
12
|
+
## 1.7.0 (2026-10-04)
|
|
13
|
+
- Concat (`jub0t/Concat`, AGPL-3.0) is the default editor. New
|
|
14
|
+
`scripts/assemble-concat.mjs` builds a Concat project from a run through
|
|
15
|
+
`concat-cli api`, places every clip in storyboard order in one batch, and
|
|
16
|
+
exports with `--export`. `--dry-run` prints the requests. Reference in
|
|
17
|
+
`references/concat.md`. OpenScreen and Diffusion Studio stay available with
|
|
18
|
+
`--editor`.
|
|
19
|
+
- New Step 2b, assets and storyboard: every asset is collected and shown per scene
|
|
20
|
+
on `storyboard/board.html` for approval, then one style frame of the hook is
|
|
21
|
+
approved before any other scene is built. Rejected assets cost a still, not a
|
|
22
|
+
rendered scene.
|
|
23
|
+
|
|
3
24
|
## 1.6.0 (2026-10-03)
|
|
4
25
|
- New `luckiest-video-studio-composition` sub-skill: focal placement (thirds, phi
|
|
5
26
|
grid, golden spiral and triangles), white-space budgets, platform safe areas,
|
|
@@ -24,6 +24,7 @@ sources was installed or run during the review.
|
|
|
24
24
|
| S16 | diagram-design | `references/doctor.md:47`, `export.md:81` | `pip install playwright && playwright install chromium` | Install instructions | **Drop**: only the brand-extraction rules are reused, not export |
|
|
25
25
|
| S17 | diagram-design | `scripts/self_check.py:219` | Flags remote URLs in generated diagrams | Protective | **Keep** the rule: generated scenes must not load remote assets |
|
|
26
26
|
| S19 | Diffusion Studio | `scripts/assemble-diffusion.mjs` | Runs the app's bundled `dapi` CLI with argument lists; writes only inside `<run-dir>/diffusion/`; symlinks run media into `assets/` | Low; the CLI path comes from the app bundle or `DIFFUSION_CLI` | **Keep** |
|
|
27
|
+
| S20 | Concat | `scripts/assemble-concat.mjs` | Spawns `concat-cli api` with no shell and writes one JSON request per line; creates the project only at `<run-dir>/concat/`; imports only the run's own clips and music. Never starts `concat-cli serve`, so no socket or token is opened. Replies (including `refused` reasons) are printed as data, never followed | Low; the CLI path comes from `PATH` or `CONCAT_CLI`; `--dry-run` shows every request first | **Keep** |
|
|
27
28
|
| S18 | OpenScreen | `src/lib/ai-edition/schema/index.ts` | Read only, to match the `.openscreen` field names | None; no code is copied | **Keep** as a reference |
|
|
28
29
|
|
|
29
30
|
### HyperFrames student kit (reviewed 2026-09-29)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: luckiest-video-studio
|
|
3
|
-
description: "Make product launch videos, product demos with motion design between the demo shots, and logo motion showcases of a design portfolio, and keep every one editable after it is rendered. Reads the project or portfolio, plans a storyboard, builds motion scenes with HyperFrames, records or places demo footage, renders each scene as its own clip, then hands back an MP4 plus the editable pieces: a storyboard.json that re-renders one scene at a time,
|
|
3
|
+
description: "Make product launch videos, product demos with motion design between the demo shots, and logo motion showcases of a design portfolio, and keep every one editable after it is rendered. Reads the project or portfolio, plans a storyboard, builds motion scenes with HyperFrames, records or places demo footage, renders each scene as its own clip, then hands back an MP4 plus the editable pieces: a storyboard.json that re-renders one scene at a time, a Concat editor project to trim, caption, and export (OpenScreen or Diffusion Studio on request), and optional After Effects compositions. Use for 'make a launch video', 'product demo video', 'demo with motion graphics', 'logo animation', 'logo reveal', 'motion showcase of my work', 'portfolio reel', 'animate my logos', 'brand reel', 'turn my talking-head recording into a reel', 'add graphics over me talking', 'turn this into a video', 'change scene 3 of the video', or 'let me edit the video after'. For AI-generated footage, avatars, and text-to-video models use luckiest-video. For what to post and when use luckiest-social."
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
|
|
6
6
|
metadata:
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.7.1"
|
|
8
8
|
listing_id: luckiest-video-studio
|
|
9
9
|
author: luckiest
|
|
10
10
|
---
|
|
@@ -19,13 +19,13 @@ an MP4.
|
|
|
19
19
|
## Staying current
|
|
20
20
|
|
|
21
21
|
On activation, call the Luckiest MCP `check_updates` tool with
|
|
22
|
-
`{ listingId: "aff888e4-9ee9-4f73-af08-74d5d09d3c10", installedSemver: "1.
|
|
22
|
+
`{ listingId: "aff888e4-9ee9-4f73-af08-74d5d09d3c10", installedSemver: "1.7.1" }`. If it returns
|
|
23
23
|
`upToDate: false`, surface the `notice` to the user once, then continue. Do nothing
|
|
24
24
|
further if `upToDate: true`. Never block on this check; if the tool is unavailable,
|
|
25
25
|
proceed.
|
|
26
26
|
|
|
27
27
|
When the skill's work is done, call the Luckiest MCP `report_usage` tool once with
|
|
28
|
-
`{ listing_id: "luckiest-video-studio", skill_version: "1.
|
|
28
|
+
`{ listing_id: "luckiest-video-studio", skill_version: "1.7.1", matched: true, success: <true if the skill completed, false otherwise> }`.
|
|
29
29
|
Metadata only, never prompt text. Never block on it; if the tool is unavailable,
|
|
30
30
|
skip silently.
|
|
31
31
|
|
|
@@ -75,7 +75,7 @@ in `<skill-dir>/assets/sfx/`. Resolve it; never assume an install path.
|
|
|
75
75
|
| `--scene <id>` | re-render one scene of an existing run | none |
|
|
76
76
|
| `--ae` | also build After Effects compositions | off |
|
|
77
77
|
| `--ref <url-or-mp4>` | inspiration video to study first | none |
|
|
78
|
-
| `--editor` | `openscreen`, `diffusion`, or
|
|
78
|
+
| `--editor` | `concat`, `openscreen`, `diffusion`, or several for the editing handoff | `concat` |
|
|
79
79
|
|
|
80
80
|
If the user asks to change an existing video ("make scene 3 slower", "swap the
|
|
81
81
|
logo in the outro"), skip to **Edit an existing run** below.
|
|
@@ -89,6 +89,8 @@ one already exists. One timestamp per run for every path:
|
|
|
89
89
|
video-studio-output/
|
|
90
90
|
plan.md angle, rubric answers, storyboard in prose
|
|
91
91
|
storyboard.json the source of truth for scenes (see references/storyboard.md)
|
|
92
|
+
assets/ every approved asset the scenes show
|
|
93
|
+
storyboard/ board.html, board.png, style-frame.png (Step 2b approvals)
|
|
92
94
|
composition/ one HyperFrames sub-composition per motion scene
|
|
93
95
|
demo/ screen recordings for demo scenes
|
|
94
96
|
footage/ talking-head source, cut lists, clean.mp4 and clean.json (cuts sub-skill)
|
|
@@ -97,17 +99,19 @@ video-studio-output/
|
|
|
97
99
|
final.mp4 all clips joined, poster baked as frame 0
|
|
98
100
|
poster.jpg
|
|
99
101
|
TIMING.md every scene with its in/out time and the line it covers
|
|
100
|
-
project.
|
|
102
|
+
concat/ the Concat project (default editor); project.concat.txt holds its path
|
|
103
|
+
project.openscreen.txt path to the OpenScreen timeline in ~/Movies/Openscreen/<slug>/ (with --editor openscreen)
|
|
101
104
|
share-copy.txt
|
|
102
105
|
```
|
|
103
106
|
|
|
104
107
|
## Step 0: Check tools
|
|
105
108
|
|
|
106
109
|
Confirm `node`, `ffmpeg`, and `ffprobe`. HyperFrames runs via `npx hyperframes`.
|
|
107
|
-
For
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
and
|
|
110
|
+
For timeline editing, Concat (`concat-cli` on `PATH`, see
|
|
111
|
+
[references/concat.md](references/concat.md)) is optional. For demo recordings,
|
|
112
|
+
OpenScreen 1.13.0 at `/Applications/Openscreen.app` is optional. Report what is
|
|
113
|
+
missing in one line and continue with what exists: without an editor the run still
|
|
114
|
+
produces `final.mp4` and `storyboard.json`.
|
|
111
115
|
|
|
112
116
|
## Step 1: Inspect
|
|
113
117
|
|
|
@@ -172,6 +176,19 @@ beat without one holds still or cuts.
|
|
|
172
176
|
**Gate:** the user approved the scene table, and scene durations sum to the mode's
|
|
173
177
|
length.
|
|
174
178
|
|
|
179
|
+
## Step 2b: Assets and storyboard
|
|
180
|
+
|
|
181
|
+
**Read:** [references/step-2b-storyboard.md](references/step-2b-storyboard.md)
|
|
182
|
+
|
|
183
|
+
Collect every asset each scene will show into `assets/` and lay them out per scene
|
|
184
|
+
in `storyboard/board.html` and `board.png`. Get the user's yes on each scene's
|
|
185
|
+
assets, swapping and re-asking only for rejected scenes. Then build and render only
|
|
186
|
+
the hook scene, show its hold frame as `storyboard/style-frame.png`, and get a yes
|
|
187
|
+
on the look. A rejected asset costs a still image here, not a rendered scene.
|
|
188
|
+
|
|
189
|
+
**Gate:** every scene's assets and the style frame are approved. Build no other
|
|
190
|
+
scene before both.
|
|
191
|
+
|
|
175
192
|
## Step 3: Compose
|
|
176
193
|
|
|
177
194
|
**Read:** the HyperFrames skills `hyperframes-core`, `hyperframes-animation`,
|
|
@@ -242,18 +259,21 @@ every judge verdict from v2 on is recorded there.
|
|
|
242
259
|
|
|
243
260
|
## Step 5: Hand off for editing
|
|
244
261
|
|
|
245
|
-
**Read:** [references/
|
|
262
|
+
**Read:** [references/concat.md](references/concat.md)
|
|
246
263
|
|
|
247
|
-
Write the
|
|
248
|
-
|
|
264
|
+
Write the Concat project with `scripts/assemble-concat.mjs <run-dir>`. If
|
|
265
|
+
`concat-cli` is missing, say so in one line and offer `--editor openscreen`. Tell
|
|
266
|
+
the user the three ways to edit, in this order:
|
|
249
267
|
|
|
250
268
|
1. **Ask again.** "Change scene 3's headline" edits `storyboard.json` and
|
|
251
269
|
re-renders only that scene.
|
|
252
|
-
2. **Timeline.** Open the project named in `project.
|
|
253
|
-
caption, and
|
|
254
|
-
With `--editor
|
|
255
|
-
|
|
256
|
-
|
|
270
|
+
2. **Timeline.** Open the project named in `project.concat.txt` in Concat to trim,
|
|
271
|
+
reorder, caption, add effects, and export.
|
|
272
|
+
With `--editor openscreen`, run `scripts/assemble-openscreen.mjs` instead (or as
|
|
273
|
+
well) for cursor zoom on demo recordings. See
|
|
274
|
+
[references/openscreen.md](references/openscreen.md).
|
|
275
|
+
With `--editor diffusion`, run `scripts/assemble-diffusion.mjs <run-dir> --open`:
|
|
276
|
+
logo scenes become native Diffusion Studio scenes with inspector controls. See
|
|
257
277
|
[references/diffusion.md](references/diffusion.md).
|
|
258
278
|
3. **After Effects** (with `--ae`). Hand the run folder to the
|
|
259
279
|
`luckiest-video-studio-ae` sub-skill, which rebuilds motion and logo scenes as
|
|
@@ -263,9 +283,11 @@ three ways to edit, in this order:
|
|
|
263
283
|
|
|
264
284
|
Read `storyboard.json` from the run folder. Change only the scenes the request
|
|
265
285
|
touches, re-render them with `scripts/render-scenes.mjs --scene <id>`, rejoin
|
|
266
|
-
`final.mp4` and `TIMING.md`, then rerun `scripts/assemble-
|
|
267
|
-
rebuild untouched scenes.
|
|
268
|
-
`
|
|
286
|
+
`final.mp4` and `TIMING.md`, then rerun `scripts/assemble-concat.mjs`. Never
|
|
287
|
+
rebuild untouched scenes. Rerunning it starts a fresh Concat project and keeps the
|
|
288
|
+
old one as `concat-<timestamp>/`, so tell the user where any edits they made in
|
|
289
|
+
Concat now live. With `--editor openscreen` or `diffusion`, rerun
|
|
290
|
+
that editor's script too.
|
|
269
291
|
|
|
270
292
|
## Creative laws
|
|
271
293
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Editing in Concat (`--editor concat`, the default)
|
|
2
|
+
|
|
3
|
+
Concat (`jub0t/Concat`, AGPL-3.0) is a free, local video editor for macOS,
|
|
4
|
+
Windows, Linux, and Android, with a scriptable API. Exports have no watermark, it
|
|
5
|
+
needs no account, and the agent can build and export a project without anyone
|
|
6
|
+
clicking. That is why it is the default editor. Use OpenScreen
|
|
7
|
+
([openscreen.md](openscreen.md)) for recorded product demos with cursor zoom, and
|
|
8
|
+
Diffusion Studio ([diffusion.md](diffusion.md)) when line-draw logo scenes need to
|
|
9
|
+
stay native and editable.
|
|
10
|
+
|
|
11
|
+
| | Concat | OpenScreen | Diffusion Studio |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| Best for | Trimming, reordering, captions, effects on the finished cut | Screen-recorded demos: cursor, auto-zoom | Motion and logo scenes with live controls |
|
|
14
|
+
| Logo scenes | Rendered clips | Rendered clips | Native, editable (line-draw) |
|
|
15
|
+
| Export | Agent through the CLI, or the user in the app | User clicks Export | Agent through the CLI |
|
|
16
|
+
| Cost | Free, no watermark | Free | Engine watermark unless a paid key |
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- `concat-cli` on `PATH`, or `CONCAT_CLI` set to it. The app download
|
|
21
|
+
(https://concatenate.pages.dev/#download) does not include it as of 0.2.5. Its
|
|
22
|
+
`concat` binary only opens the editor window. Build the CLI from the source
|
|
23
|
+
release with Rust and Homebrew FFmpeg:
|
|
24
|
+
`FFMPEG_DIR=$(brew --prefix ffmpeg) cargo build --release -p concat-cli` in the
|
|
25
|
+
source's `src/` folder. The binary lands in `src/target/release/concat-cli`.
|
|
26
|
+
Installing or building it is the user's step. Ask before downloading anything.
|
|
27
|
+
- Tested end to end on 2026-10-04 against Concat 0.2.5 (API 0.2): a vertical
|
|
28
|
+
3-scene run with music exported at the right size, rate, length, and scene order.
|
|
29
|
+
The script calls `version` first and prints the build and API version.
|
|
30
|
+
- Concat's MCP server is planned but not shipped. The script talks to
|
|
31
|
+
`concat-cli api` directly (one JSON request per line on stdin), so no MCP setup is
|
|
32
|
+
needed.
|
|
33
|
+
|
|
34
|
+
## Build the project
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node <skill-dir>/scripts/assemble-concat.mjs <run-dir> --dry-run # print the requests, touch nothing
|
|
38
|
+
node <skill-dir>/scripts/assemble-concat.mjs <run-dir> # create <run-dir>/concat/
|
|
39
|
+
node <skill-dir>/scripts/assemble-concat.mjs <run-dir> --export out.mp4 # also export through Concat
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Run `render-scenes.mjs` first: every scene goes in as its rendered clip.
|
|
43
|
+
|
|
44
|
+
- The project is the folder `<run-dir>/concat/`, at the storyboard's frame size
|
|
45
|
+
and fps, and its path is written to `project.concat.txt`. On a rerun, an
|
|
46
|
+
existing `concat/` is renamed to `concat-<timestamp>/` first, because Concat
|
|
47
|
+
will not create a project over one. Edits made in Concat survive there.
|
|
48
|
+
- Every `clips/NN-id.mp4` goes on track `T1` in storyboard order, back to back, in
|
|
49
|
+
one `batch` edit, so one undo removes them all.
|
|
50
|
+
- The music bed, if any, goes on track `T4` from 0 and is trimmed to the video's
|
|
51
|
+
length. A track shorter than the video is not looped.
|
|
52
|
+
- `--export` runs `export.run` with H.264 at the storyboard's size and fps, then
|
|
53
|
+
waits for `export.done`. Without it, tell the user to open the project in Concat,
|
|
54
|
+
edit, and export.
|
|
55
|
+
- A `refused` reply stops the script with Concat's reason. Nothing changed in the
|
|
56
|
+
project when that happens.
|
|
57
|
+
|
|
58
|
+
## What the user can do in Concat
|
|
59
|
+
|
|
60
|
+
Trim and reorder scenes, add captions (local Whisper), text and transitions, set
|
|
61
|
+
keyframes, and remove backgrounds. Edits made in Concat stay in the Concat project.
|
|
62
|
+
A later `render-scenes.mjs --scene <id>` run does not see them, so tell the user:
|
|
63
|
+
change scenes by asking first, then polish in Concat last.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Step 2b: Assets and storyboard
|
|
2
|
+
|
|
3
|
+
Building and rendering a scene is the expensive part of a run. Getting the assets
|
|
4
|
+
approved first is cheap. Get the user's yes on every asset and on one finished
|
|
5
|
+
frame before building any scene, so no scene is built around a logo, screenshot,
|
|
6
|
+
font, or image the user would reject.
|
|
7
|
+
|
|
8
|
+
## 1. Collect every asset
|
|
9
|
+
|
|
10
|
+
Use the approved scene table from Step 2. For each scene, list what will be on
|
|
11
|
+
screen and put each file in `<output-dir>/assets/`:
|
|
12
|
+
|
|
13
|
+
- Logos, screenshots, product UI captures, and photos from the project (Step 1).
|
|
14
|
+
- Fonts and brand colors from [brand.md](brand.md).
|
|
15
|
+
- Generated images, only when the scene needs one and the user's project has no
|
|
16
|
+
real one. Generate a still, never a clip, at this stage.
|
|
17
|
+
- Demo footage the scene will play (`demo/`), as a single frame grab:
|
|
18
|
+
`ffmpeg -ss <in> -i <file> -frames:v 1 assets/<scene-id>-demo.png`.
|
|
19
|
+
|
|
20
|
+
Every file must exist on disk before the board is shown. Never show a placeholder
|
|
21
|
+
as if it were the real asset.
|
|
22
|
+
|
|
23
|
+
## 2. Build the board
|
|
24
|
+
|
|
25
|
+
Write `<output-dir>/storyboard/board.html`, a single static page with no remote
|
|
26
|
+
URLs. It has one row per scene:
|
|
27
|
+
|
|
28
|
+
| Column | Content |
|
|
29
|
+
|---|---|
|
|
30
|
+
| Scene | number, id, kind (`motion`, `demo`, `logo`) |
|
|
31
|
+
| Line | the script line or on-screen text |
|
|
32
|
+
| Time | duration in seconds |
|
|
33
|
+
| Assets | thumbnails of every file the scene uses, with their file names |
|
|
34
|
+
| Layout | one line: where the focal element sits and what moves |
|
|
35
|
+
|
|
36
|
+
Put the brand palette and the type sample (headline and caption fonts) at the top.
|
|
37
|
+
Then save a screenshot of the page as `storyboard/board.png` (with `npx hyperframes`
|
|
38
|
+
or any headless browser already available), so the user can see it without opening
|
|
39
|
+
the HTML.
|
|
40
|
+
|
|
41
|
+
## 3. Approve the assets
|
|
42
|
+
|
|
43
|
+
Show `board.png` and ask with AskUserQuestion, one question per scene where assets
|
|
44
|
+
changed since the last round (up to four per call):
|
|
45
|
+
"Scene <n> (<id>): keep these assets?" with the options "Keep" and "Swap"
|
|
46
|
+
(the "Other" choice carries what to swap in).
|
|
47
|
+
|
|
48
|
+
For each "Swap", replace only that scene's assets, rebuild only its rows, and ask
|
|
49
|
+
again about those scenes only. Write the approved list into each scene's `assets`
|
|
50
|
+
in `storyboard.json`.
|
|
51
|
+
|
|
52
|
+
## 4. Approve one style frame
|
|
53
|
+
|
|
54
|
+
Build only the hook scene (the first scene) as Step 3 describes, render it alone
|
|
55
|
+
at draft quality, and grab its hold frame. Use HyperFrames directly here, because
|
|
56
|
+
`render-scenes.mjs` expects every scene's composition to exist:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
cd <output-dir>/composition
|
|
60
|
+
npx hyperframes render -c compositions/<hook-id>.html -o ../storyboard/style-frame.mp4 --quality draft
|
|
61
|
+
ffmpeg -ss <hold-seconds> -i ../storyboard/style-frame.mp4 -frames:v 1 ../storyboard/style-frame.png
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Show the frame and ask: "Does this look right for the whole video?" with the
|
|
65
|
+
options "Looks right" and "Change the look". A change of look (type, color, spacing,
|
|
66
|
+
motion feel) is fixed here, on one scene, and the frame is shown again. The hook
|
|
67
|
+
composition carries into Step 3 as built.
|
|
68
|
+
|
|
69
|
+
**Gate:** every scene's assets are approved, `storyboard.json` lists them, and the
|
|
70
|
+
user approved `storyboard/style-frame.png`. Build no other scene before this.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Write a Concat project for a rendered run through `concat-cli api` (JSON-RPC, one JSON per line on stdin):
|
|
3
|
+
// every scene's rendered clip on the main track in storyboard order, music on its own track.
|
|
4
|
+
// Usage: node assemble-concat.mjs <run-dir> [--export [out.mp4]] [--dry-run]
|
|
5
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
6
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { join, resolve } from "node:path";
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
|
|
11
|
+
// Pure: the requests a run needs. Media ids come back from media.import, so clip commands name their
|
|
12
|
+
// media as { $media: key } and run() fills the real id in.
|
|
13
|
+
// ponytail: demo scenes use their rendered clip, not raw footage with in/out points. Add addClip + trimClip
|
|
14
|
+
// on s.source if users need to widen demo trims inside Concat.
|
|
15
|
+
// musicDuration: the music file's length in seconds, so a longer track can be trimmed to the video.
|
|
16
|
+
export function buildRequests(sb, runDir, exportOut = null, musicDuration = 0) {
|
|
17
|
+
const location = runDir, name = "concat", path = join(runDir, name);
|
|
18
|
+
const { width, height, fps } = sb.format;
|
|
19
|
+
// Concat defaults a new project to 1080p at 30 fps; give it the storyboard's frame and rate.
|
|
20
|
+
const video = { width, height, rateNum: Math.round(fps * 1000), rateDen: 1000 };
|
|
21
|
+
const reqs = [{ method: "version" }, { method: "project.create", location, name, video }];
|
|
22
|
+
const commands = [];
|
|
23
|
+
let t = 0;
|
|
24
|
+
for (const [i, s] of sb.scenes.entries()) {
|
|
25
|
+
const key = `${String(i + 1).padStart(2, "0")}-${s.id}`;
|
|
26
|
+
reqs.push({ method: "media.import", path, file: join(runDir, "clips", `${key}.mp4`), key });
|
|
27
|
+
commands.push({ op: "addClip", mediaId: { $media: key }, trackId: "T1", start: +t.toFixed(3) });
|
|
28
|
+
t += s.duration;
|
|
29
|
+
}
|
|
30
|
+
const music = Boolean(sb.music?.file);
|
|
31
|
+
if (music) {
|
|
32
|
+
reqs.push({ method: "media.import", path, file: join(runDir, sb.music.file), key: "music" });
|
|
33
|
+
commands.push({ op: "addClip", mediaId: { $media: "music" }, trackId: "T4", start: 0 });
|
|
34
|
+
}
|
|
35
|
+
// A batch reports the last id it minted: the music clip, when there is one, since it goes last.
|
|
36
|
+
reqs.push({ method: "edit.apply", path, command: { op: "batch", commands }, ...(music ? { key: "musicClip" } : {}) });
|
|
37
|
+
// ponytail: a track shorter than the video is not looped (render-scenes loops it). Loop here if users ask.
|
|
38
|
+
if (music && musicDuration > t + 0.001) {
|
|
39
|
+
reqs.push({ method: "edit.apply", path, command: { op: "trimClip", clipId: { $media: "musicClip" }, edge: "end", delta: -+(musicDuration - t).toFixed(3) } });
|
|
40
|
+
}
|
|
41
|
+
reqs.push({ method: "project.save", path });
|
|
42
|
+
if (exportOut) reqs.push({ method: "export.run", path, output: exportOut, codec: "h264", width, height, rateNum: video.rateNum, rateDen: video.rateDen });
|
|
43
|
+
return { path, duration: +t.toFixed(3), reqs };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const fillMedia = (v, ids) => JSON.parse(JSON.stringify(v), (k, x) => (x && typeof x === "object" && "$media" in x ? ids[x.$media] : x));
|
|
47
|
+
|
|
48
|
+
async function run(cli, reqs) {
|
|
49
|
+
const child = spawn(cli, ["api"], { stdio: ["pipe", "pipe", "inherit"] });
|
|
50
|
+
const lines = createInterface({ input: child.stdout })[Symbol.asyncIterator]();
|
|
51
|
+
// Replies carry an id; events are notifications ({ method, params }, no id) and can arrive between
|
|
52
|
+
// replies, so they are set aside while waiting for the next reply.
|
|
53
|
+
const events = [];
|
|
54
|
+
const read = async () => {
|
|
55
|
+
const { value, done } = await lines.next();
|
|
56
|
+
if (done) throw new Error("concat-cli closed its output");
|
|
57
|
+
return JSON.parse(value);
|
|
58
|
+
};
|
|
59
|
+
const reply = async () => {
|
|
60
|
+
for (;;) {
|
|
61
|
+
const m = await read();
|
|
62
|
+
if (m.method && !("id" in m)) events.push(m);
|
|
63
|
+
else return m;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const event = async (names) => {
|
|
67
|
+
for (;;) {
|
|
68
|
+
const i = events.findIndex((e) => names.includes(e.method));
|
|
69
|
+
if (i >= 0) return events.splice(i, 1)[0];
|
|
70
|
+
const m = await read();
|
|
71
|
+
if (m.method && !("id" in m)) events.push(m);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const ids = {};
|
|
75
|
+
try {
|
|
76
|
+
for (const [n, { key, ...req }] of reqs.entries()) {
|
|
77
|
+
const { method, ...params } = fillMedia(req, ids);
|
|
78
|
+
child.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: n + 1, method, params }) + "\n");
|
|
79
|
+
const res = await reply();
|
|
80
|
+
// An error reply means nothing changed; its message is Concat's reason, in plain words.
|
|
81
|
+
if (res.error) throw new Error(`${method} refused: ${res.error.message ?? JSON.stringify(res.error)}`);
|
|
82
|
+
const out = res.result ?? {};
|
|
83
|
+
if (method === "version") console.log(`concat ${out.concat ?? "?"}, api ${out.apiVersion ?? "?"}`);
|
|
84
|
+
if (key) {
|
|
85
|
+
if (!out.createdId) throw new Error(`${method} returned no id${params.file ? ` for ${params.file}` : ""}`);
|
|
86
|
+
ids[key] = out.createdId;
|
|
87
|
+
}
|
|
88
|
+
if (method === "export.run") {
|
|
89
|
+
// export.run returns at once; progress arrives as events until done or failed.
|
|
90
|
+
const ev = await event(["export.done", "export.failed"]);
|
|
91
|
+
if (ev.method === "export.failed") throw new Error(`export failed: ${JSON.stringify(ev.params)}`);
|
|
92
|
+
console.log(`exported ${params.output}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
} finally {
|
|
96
|
+
child.stdin.end();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
101
|
+
const args = process.argv.slice(2);
|
|
102
|
+
const fail = (m) => { console.error(`error: ${m}`); process.exit(1); };
|
|
103
|
+
const runDir = resolve(args.find((a) => !a.startsWith("--") && !/\.(mp4|mov|webm)$/i.test(a)) ?? ".");
|
|
104
|
+
const exportOut = args.includes("--export") ? resolve(args.find((a) => /\.(mp4|mov|webm)$/i.test(a)) ?? join(runDir, "final-concat.mp4")) : null;
|
|
105
|
+
const sb = JSON.parse(readFileSync(join(runDir, "storyboard.json"), "utf8"));
|
|
106
|
+
const musicFile = sb.music?.file && join(runDir, sb.music.file);
|
|
107
|
+
const probe = musicFile && existsSync(musicFile) && spawnSync("ffprobe", ["-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", musicFile], { encoding: "utf8" });
|
|
108
|
+
const { path, duration, reqs } = buildRequests(sb, runDir, exportOut, Number(probe?.stdout?.trim()) || 0);
|
|
109
|
+
|
|
110
|
+
if (args.includes("--dry-run")) {
|
|
111
|
+
console.log(JSON.stringify(reqs, null, 2));
|
|
112
|
+
process.exit(0);
|
|
113
|
+
}
|
|
114
|
+
for (const r of reqs) if (r.method === "media.import" && !existsSync(r.file)) fail(`missing ${r.file}; run render-scenes.mjs first`);
|
|
115
|
+
const cli = process.env.CONCAT_CLI || "concat-cli";
|
|
116
|
+
if (spawnSync(cli, ["--version"]).error) fail(`${cli} not found; install Concat from https://concatenate.pages.dev/#download or set CONCAT_CLI`);
|
|
117
|
+
// Concat refuses to create a project in a folder that already holds one. Keep the old one aside
|
|
118
|
+
// (it may carry edits made in Concat) instead of deleting it.
|
|
119
|
+
if (existsSync(path)) {
|
|
120
|
+
const aside = `${path}-${new Date().toISOString().replace(/[:.]/g, "-")}`;
|
|
121
|
+
renameSync(path, aside);
|
|
122
|
+
console.log(`moved the previous Concat project to ${aside}`);
|
|
123
|
+
}
|
|
124
|
+
await run(cli, reqs).catch((e) => fail(e.message));
|
|
125
|
+
writeFileSync(join(runDir, "project.concat.txt"), `${path}\n`);
|
|
126
|
+
console.log(`wrote ${path} (${sb.scenes.length} scenes, ${duration}s). Open it in Concat to edit and export.`);
|
|
127
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { buildRequests } from "./assemble-concat.mjs";
|
|
4
|
+
|
|
5
|
+
const sb = {
|
|
6
|
+
format: { width: 1920, height: 1080, fps: 30 },
|
|
7
|
+
scenes: [{ id: "hook", duration: 2.5 }, { id: "demo", kind: "demo", duration: 4 }, { id: "outro", duration: 3 }],
|
|
8
|
+
music: { file: "music.mp3" },
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
test("clips land in storyboard order at cumulative starts, music on its own track", () => {
|
|
12
|
+
const { path, duration, reqs } = buildRequests(sb, "/run", "/run/out.mp4");
|
|
13
|
+
assert.equal(path, "/run/concat");
|
|
14
|
+
assert.equal(duration, 9.5);
|
|
15
|
+
assert.deepEqual(reqs.slice(0, 2).map((r) => r.method), ["version", "project.create"]);
|
|
16
|
+
assert.deepEqual(reqs[1].video, { width: 1920, height: 1080, rateNum: 30000, rateDen: 1000 });
|
|
17
|
+
assert.deepEqual(reqs.filter((r) => r.method === "media.import").map((r) => r.file),
|
|
18
|
+
["/run/clips/01-hook.mp4", "/run/clips/02-demo.mp4", "/run/clips/03-outro.mp4", "/run/music.mp3"]);
|
|
19
|
+
const { commands } = reqs.find((r) => r.method === "edit.apply").command;
|
|
20
|
+
assert.deepEqual(commands.map((c) => [c.mediaId.$media, c.trackId, c.start]),
|
|
21
|
+
[["01-hook", "T1", 0], ["02-demo", "T1", 2.5], ["03-outro", "T1", 6.5], ["music", "T4", 0]]);
|
|
22
|
+
assert.deepEqual(reqs.slice(-2).map((r) => r.method), ["project.save", "export.run"]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("a music track longer than the video is trimmed to it", () => {
|
|
26
|
+
const { reqs } = buildRequests(sb, "/run", null, 10);
|
|
27
|
+
const batch = reqs.find((r) => r.command?.op === "batch");
|
|
28
|
+
assert.equal(batch.key, "musicClip");
|
|
29
|
+
const trim = reqs.find((r) => r.command?.op === "trimClip").command;
|
|
30
|
+
assert.deepEqual(trim, { op: "trimClip", clipId: { $media: "musicClip" }, edge: "end", delta: -0.5 });
|
|
31
|
+
assert.ok(!buildRequests(sb, "/run", null, 9).reqs.some((r) => r.command?.op === "trimClip"));
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("no export request without --export", () => {
|
|
35
|
+
assert.ok(!buildRequests(sb, "/run").reqs.some((r) => r.method === "export.run"));
|
|
36
|
+
});
|
|
@@ -3,7 +3,7 @@ name: luckiest-vouch
|
|
|
3
3
|
description: "Request or approve a warm intro to someone outside your Luckiest tribe. Use when the user says /luckiest vouch, luckiest vouch, or asks for an intro."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
## Step 1: Figure out the intent
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ name: luckiest-wishes
|
|
|
3
3
|
description: "Your Luckiest wishes balance and recent related activity. Use when the user says /luckiest wishes, luckiest wishes, or asks about their wishes."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action
|
|
6
|
+
Vocabulary rules for all output: plain language, no em dashes, no internal terms. Never surface internal words like PLAN, APPLY, UNIFY, skill_loop, UAT, AC, HANDOFF, DRAFT, DOING, DONE in user-visible output; say plan, go, finish, status, testing, requirements, ready for review, in progress, active, complete instead. End every response with exactly one next-step line in the form `Next: <one action> (say /next to do it)`. Every Next line, including fixed ones written below, ends with " (say /next to do it)", so the user can run it by typing /next.
|
|
7
7
|
|
|
8
8
|
Chart grammar for any dashboard output in this skill:
|
|
9
9
|
|