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.
Files changed (44) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/commands/charms.md +1 -1
  4. package/commands/finish.md +1 -1
  5. package/commands/go.md +1 -1
  6. package/commands/helpers.md +1 -1
  7. package/commands/home.md +1 -1
  8. package/commands/leaderboard.md +1 -1
  9. package/commands/merge.md +1 -1
  10. package/commands/next.md +1 -1
  11. package/commands/overlaps.md +1 -1
  12. package/commands/plan.md +1 -1
  13. package/commands/skills.md +1 -1
  14. package/commands/start.md +1 -1
  15. package/commands/status.md +1 -1
  16. package/commands/updates.md +1 -1
  17. package/commands/vouch.md +1 -1
  18. package/commands/wishes.md +1 -1
  19. package/package.json +1 -1
  20. package/references/vocabulary.md +1 -1
  21. package/skills/luckiest-charms/SKILL.md +1 -1
  22. package/skills/luckiest-finish/SKILL.md +1 -1
  23. package/skills/luckiest-go/SKILL.md +1 -1
  24. package/skills/luckiest-helpers/SKILL.md +1 -1
  25. package/skills/luckiest-home/SKILL.md +1 -1
  26. package/skills/luckiest-leaderboard/SKILL.md +1 -1
  27. package/skills/luckiest-merge/SKILL.md +1 -1
  28. package/skills/luckiest-next/SKILL.md +1 -1
  29. package/skills/luckiest-overlaps/SKILL.md +1 -1
  30. package/skills/luckiest-plan/SKILL.md +1 -1
  31. package/skills/luckiest-skills/SKILL.md +1 -1
  32. package/skills/luckiest-start/SKILL.md +1 -1
  33. package/skills/luckiest-status/SKILL.md +1 -1
  34. package/skills/luckiest-updates/SKILL.md +1 -1
  35. package/skills/luckiest-video-studio/ATTRIBUTION.md +4 -0
  36. package/skills/luckiest-video-studio/CHANGELOG.md +21 -0
  37. package/skills/luckiest-video-studio/SECURITY.md +1 -0
  38. package/skills/luckiest-video-studio/SKILL.md +43 -21
  39. package/skills/luckiest-video-studio/references/concat.md +63 -0
  40. package/skills/luckiest-video-studio/references/step-2b-storyboard.md +70 -0
  41. package/skills/luckiest-video-studio/scripts/assemble-concat.mjs +127 -0
  42. package/skills/luckiest-video-studio/scripts/assemble-concat.test.mjs +36 -0
  43. package/skills/luckiest-vouch/SKILL.md +1 -1
  44. package/skills/luckiest-wishes/SKILL.md +1 -1
@@ -9,7 +9,7 @@
9
9
  "name": "luckiest",
10
10
  "source": "./",
11
11
  "description": "Plan, go, finish, plus bundled free Luckiest skills that work in Claude Code, web chat, and Cowork.",
12
- "version": "0.1.25",
12
+ "version": "0.1.26",
13
13
  "author": { "name": "Luckiest" }
14
14
  }
15
15
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "luckiest",
3
3
  "description": "Plan, go, finish. Guided planning, progress dashboards, and your luckiest.co tribe inside Claude Code.",
4
- "version": "0.1.25",
4
+ "version": "0.1.26",
5
5
  "author": { "name": "Luckiest" }
6
6
  }
@@ -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>`. 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.
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
 
@@ -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>`. 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.
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>`. 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.
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
@@ -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>`. 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.
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>`. 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.
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
 
@@ -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>`. 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.
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>`. 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.
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>`. 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.
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
 
@@ -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>`. 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.
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>`. 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.
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
@@ -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>`. 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.
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>`. 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.
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
 
@@ -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>`. 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.
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
 
@@ -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>`. 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.
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>`. 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.
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
 
@@ -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>`. 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.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "luckiest-co",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "Luckiest for Claude Code: plan, go, finish. Your luckiest.co skills and tribe, inside Claude.",
5
5
  "bin": {
6
6
  "luckiest-co": "./bin/install.js"
@@ -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, an OpenScreen timeline project to trim and re-zoom, 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."
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.6.0"
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.5.1" }`. If it returns
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.6.0", matched: true, success: <true if the skill completed, false otherwise> }`.
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 both for the editing handoff | `openscreen` |
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.openscreen.txt path to the OpenScreen timeline in ~/Movies/Openscreen/<slug>/
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 demo recordings and timeline editing, OpenScreen 1.13.0 at
108
- `/Applications/Openscreen.app` is optional. Report what is missing in one line and
109
- continue with what exists: without OpenScreen the run still produces `final.mp4`
110
- and `storyboard.json`.
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/openscreen.md](references/openscreen.md)
262
+ **Read:** [references/concat.md](references/concat.md)
246
263
 
247
- Write the OpenScreen timeline with `scripts/assemble-openscreen.mjs`. Tell the user the
248
- three ways to edit, in this order:
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.openscreen.txt` in OpenScreen to trim, reorder, re-zoom,
253
- caption, and click **Export**.
254
- With `--editor diffusion`, run `scripts/assemble-diffusion.mjs <run-dir> --open`
255
- instead (or as well): logo scenes become native Diffusion Studio scenes with
256
- inspector controls, and export runs without clicking. See
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-openscreen.mjs`. Never
267
- rebuild untouched scenes. With `--editor diffusion`, rerun
268
- `scripts/assemble-diffusion.mjs` too.
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