luckiest-co 1.0.19 → 1.0.21
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/status.md +10 -0
- package/hooks/hooks.json +11 -1
- package/hooks/update-notice.mjs +56 -0
- package/package.json +1 -1
- package/skills/luckiest-status/SKILL.md +10 -0
- package/skills/luckiest-video-studio/ATTRIBUTION.md +47 -0
- package/skills/luckiest-video-studio/CHANGELOG.md +64 -0
- package/skills/luckiest-video-studio/LICENSE-brag +21 -0
- package/skills/luckiest-video-studio/LICENSE-diagram-design +21 -0
- package/skills/luckiest-video-studio/LICENSE-motion-graphics +25 -0
- package/skills/luckiest-video-studio/LICENSE-student-kit +32 -0
- package/skills/luckiest-video-studio/LICENSE-student-kit-pipeline +15 -0
- package/skills/luckiest-video-studio/SECURITY.md +74 -0
- package/skills/luckiest-video-studio/SKILL.md +257 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/luckiest-video-studio/assets/sfx/sfx-analysis.md +75 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/luckiest-video-studio/references/audio.md +285 -0
- package/skills/luckiest-video-studio/references/brand.md +55 -0
- package/skills/luckiest-video-studio/references/diffusion.md +75 -0
- package/skills/luckiest-video-studio/references/logo-recipes.md +77 -0
- package/skills/luckiest-video-studio/references/openscreen.md +60 -0
- package/skills/luckiest-video-studio/references/step-1-inspect.md +133 -0
- package/skills/luckiest-video-studio/references/step-2-plan.md +234 -0
- package/skills/luckiest-video-studio/references/step-3-compose.md +210 -0
- package/skills/luckiest-video-studio/references/step-4-deliver.md +168 -0
- package/skills/luckiest-video-studio/references/storyboard.md +78 -0
- package/skills/luckiest-video-studio/references/tones.md +231 -0
- package/skills/luckiest-video-studio/scripts/analyze_music_cues.py +309 -0
- package/skills/luckiest-video-studio/scripts/assemble-diffusion.mjs +161 -0
- package/skills/luckiest-video-studio/scripts/assemble-openscreen.mjs +74 -0
- package/skills/luckiest-video-studio/scripts/pyproject.toml +14 -0
- package/skills/luckiest-video-studio/scripts/qa.mjs +313 -0
- package/skills/luckiest-video-studio/scripts/qa.test.mjs +135 -0
- package/skills/luckiest-video-studio/scripts/render-scenes.mjs +125 -0
- package/skills/luckiest-video-studio/scripts/storyboard.schema.json +52 -0
- package/skills/luckiest-video-studio/scripts/uv.lock +819 -0
- package/skills/luckiest-video-studio/templates/diffusion/line-draw.tsx +132 -0
- package/skills/luckiest-video-studio/templates/logo-line-draw.html +38 -0
- package/skills/luckiest-video-studio-ae/ATTRIBUTION.md +9 -0
- package/skills/luckiest-video-studio-ae/CHANGELOG.md +7 -0
- package/skills/luckiest-video-studio-ae/SKILL.md +133 -0
- package/skills/luckiest-video-studio-cards/ATTRIBUTION.md +22 -0
- package/skills/luckiest-video-studio-cards/CHANGELOG.md +8 -0
- package/skills/luckiest-video-studio-cards/SKILL.md +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/DESIGN.md +50 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-agenda.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-bigtype.html +156 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-board.html +238 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-checklist.html +158 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-compare.html +205 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-deck.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-dossier.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-filmstrip.html +211 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-grid6.html +157 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-indexset.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-maplegend.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-matrix.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-numlist.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-outline.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-phases.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-quad.html +163 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-roadmap.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-stepper.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-toc.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-vtimeline.html +166 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-bracket.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-circle.html +103 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-classified.html +112 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-collage.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-correction.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-crt.html +111 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-cutout.html +87 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-fullbleed.html +78 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-highlight.html +80 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-indexcard.html +85 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-map.html +96 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-markerbox.html +84 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-numeral.html +74 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-split.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-stacked.html +94 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-stamp.html +83 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-ticker.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-tornstrip.html +92 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-annotated.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-arc.html +105 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-axis.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-bar.html +111 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-bracket.html +124 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-calendar.html +219 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-callout.html +100 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-columns.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-corner.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-dots.html +102 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-engraving.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-footnote.html +125 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-frac.html +101 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-heat.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-isotype.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ledger.html +106 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-left.html +109 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-magnifier.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-map.html +326 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-meter.html +153 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-multiplier.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-odo.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pack.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-photo.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pie.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-postage.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pricetag.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-quote.html +113 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ranking.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-receipt.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ribbon.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-semi.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-spotlight.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-stamp.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-steps.html +123 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-tape.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-torn.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-trend.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-vs.html +101 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-window.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat.html +97 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-timeline.html +131 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-label.html +51 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-bracket.html +104 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-caption.html +129 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-circle.html +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-definition.html +152 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-footnote.html +113 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-magnify.html +157 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-pin.html +95 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-pullquote.html +135 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-spotlight.html +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-sticky.html +95 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-tag.html +129 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-underline.html +94 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lower-third.html +66 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-badge.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-barslab.html +126 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-bracket.html +146 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-clapper.html +144 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-highlight.html +128 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-indextab.html +134 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-rail.html +116 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-ribbon.html +140 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-stacked.html +143 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-stamp.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-sticky.html +154 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-typecard.html +137 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/style.json +4463 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/tokens.css +81 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/DESIGN.md +51 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-agenda.html +277 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-beforeafter.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-bento.html +269 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-bigleft.html +221 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-callouts.html +350 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-cardrow5.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-checklist.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-cycle.html +312 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-dashboard.html +414 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-deck2.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-deck3.html +200 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-duallist.html +323 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-featurecompare.html +244 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-featuregrid.html +235 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-flashcards.html +215 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-flow.html +287 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-funnel.html +246 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-gantt.html +290 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-grid6.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-grid9.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-iconlist.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-journey.html +305 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-kpirow.html +275 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-layers.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-legend.html +258 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-levels.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-logowall.html +278 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-mappoints.html +303 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-matrix.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-milestones.html +275 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-mindmap.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-nested.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-network.html +353 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-notifs.html +224 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-numlist.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-orgchart.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-outline.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-phases.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pipeline.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pricing.html +277 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-profiles.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-proscons.html +283 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pyramid.html +181 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-quad.html +226 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-quotegrid.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-ranked.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-roadmap.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-spectrum.html +289 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-split3.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-spotlightcard.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-statgrid.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-steps.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-summary.html +231 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tiercompare.html +295 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-timeline.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-toc.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tree.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tricards.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-venn.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-vstable.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ascend.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-aurora-bars.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-beam.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-boxed.html +172 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-breath.html +151 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-chaptercard.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-column-light.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-constellation.html +220 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-countdown.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-curtain.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-dawn.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-depth.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-divider.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-drift-grid.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-duotone.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-eclipse.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-emblem.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-flare-sweep.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-glow-rule.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-gradient-word.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-gridfloor.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-halo.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-horizon.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-index.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-kinetic.html +159 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-lensflare.html +231 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-liquid.html +181 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-marquee.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-mesh.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-monolith.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-node-title.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-numeral.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-orb.html +146 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-orbit.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-particles.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-pill.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-portal.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-prism.html +265 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-question.html +169 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-quoteopen.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-reveal-mask.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ribbon.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ripple.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-searchbar.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-slab.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-sphere-top.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-split-reveal.html +218 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-splitpanel.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-spotlight-cone.html +245 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-spotlight.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-stack.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-stacked-words.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-starfield.html +213 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-sweep.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-tunnel.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-type-scale.html +170 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-typed.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-underline-grow.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-waveform.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-wordmark.html +172 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-annot.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-beforeafter.html +293 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bigpercent.html +228 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bracketstat.html +210 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bubble.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-cbars.html +313 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-clockface.html +296 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-column.html +382 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-compass.html +305 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-counterpill.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-curve.html +318 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-delta.html +300 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-dial.html +288 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-donut.html +307 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-dotgrid.html +241 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-figure.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-fillshape.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-fraction.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-funnel.html +285 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-growtharrow.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-heatcell.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-isotype.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-layered.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-mega.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-meter.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-milestone.html +260 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-money.html +253 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-multiplier.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-multiring.html +336 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-needle.html +253 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-nodes.html +259 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-odometer.html +301 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-orbitmoons.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-orbitstat.html +319 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-pair.html +244 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-percentile.html +287 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-pictobar.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-polar.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-quotestat.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-radialbars.html +387 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-range.html +300 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-rank.html +264 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-ratio.html +264 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-ring.html +274 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-risewall.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-score.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-segbar.html +262 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-semigauge.html +327 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-sparkline.html +291 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-spectrum.html +245 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-split.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-stackedbars.html +304 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-tickerstat.html +310 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-tiles.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-timer.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-trendline.html +343 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-underscore.html +236 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-versus.html +315 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-waffle.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-waterfall.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-badge.html +170 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-brace.html +239 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-bracket.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-bubble.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-byline.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-callout.html +137 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-category.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-checkmark.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-chipstat.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-comparemini.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-coord.html +271 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-counter.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-crosshair.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-dashed.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-definition.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-deltachip.html +184 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-eyebrow.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-fact.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-flag.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-formula.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-hash.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-highlightbox.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-iconchip.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-info.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-infocard.html +239 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-keycap.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-keyword.html +140 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-leader.html +201 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-legend.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-measure.html +201 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-meterchip.html +238 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-metric.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-micropie.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-minibar.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-node.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-note.html +183 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-numbercallout.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-percent.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-pointer.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-price.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-progress.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-pulse.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-qmark.html +164 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-quote.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-rating.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-ribbon.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-ringmark.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-search.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-sparkchip.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-spec.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-status.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-step.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tag.html +134 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-takeaway.html +154 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tcode.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-timestamp.html +185 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-toast.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tooltip.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-underline.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-warning.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-avatar.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-badgecard.html +219 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-barslide.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-bracket.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-brandbar.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-bug.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-capsule.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-chapterbar.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-chip.html +162 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cinemastrip.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cite.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-clockname.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-coordbar.html +262 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-corner.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cornerframe.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-countbar.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dividername.html +211 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dotline.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-doublecard.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dual.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-edgebar.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-flipcard.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-geopin.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-glasscard.html +152 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-gradient.html +151 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-gradientbar.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-handlebar.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-infochips.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-lensbar.html +213 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-live.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-location.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-logolock.html +214 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-micname.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-minicard.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-minimal.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-nameplate3d.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-neonframe.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-neonpill.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-nowplaying.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-orbitbadge.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-pill.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-portraitframe.html +220 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-progressname.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-quote.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ratingname.html +226 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ribbon.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-sidebracket.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-slidetab.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-social.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-spotlightname.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-stacked.html +158 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-statline.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-tagrow.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-thinstrip.html +185 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ticker.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-titlebar.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-trust.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-typedname.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-underbar.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-waveband.html +235 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/style.json +8608 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/tokens.css +134 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/DESIGN.md +41 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/cards/tier1/t1-stat.html +57 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/cards/tier2/t2-list.html +58 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/style.json +88 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/tokens.css +32 -0
- package/skills/luckiest-video-studio-cards/packs/registry.json +7789 -0
- package/skills/luckiest-video-studio-cards/references/card-contract.md +77 -0
- package/skills/luckiest-video-studio-cards/references/palette-leftovers.md +28 -0
- package/skills/luckiest-video-studio-cards/scripts/apply-brand.mjs +90 -0
- package/skills/luckiest-video-studio-cards/scripts/apply-brand.test.mjs +62 -0
- package/skills/luckiest-video-studio-cards/scripts/build-registry.mjs +54 -0
- package/skills/luckiest-video-studio-cards/scripts/new-pack.mjs +42 -0
- package/skills/luckiest-video-studio-cards/scripts/qa-cards.mjs +126 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/DESIGN.md +24 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/hyperframes.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/index.html +349 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/meta.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/DESIGN.md +25 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/hyperframes.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/index.html +207 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/meta.json +5 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/package.json +10 -0
- package/skills/luckiest-video-studio-cuts/ATTRIBUTION.md +19 -0
- package/skills/luckiest-video-studio-cuts/CHANGELOG.md +6 -0
- package/skills/luckiest-video-studio-cuts/SKILL.md +129 -0
- package/skills/luckiest-video-studio-cuts/scripts/apply-cuts.mjs +174 -0
- package/skills/luckiest-video-studio-cuts/scripts/build-edl-review.mjs +114 -0
- package/skills/luckiest-video-studio-cuts/scripts/cut-silences.mjs +300 -0
- package/skills/luckiest-video-studio-cuts/scripts/find-cut-candidates.mjs +182 -0
- package/skills/luckiest-video-studio-reel/ATTRIBUTION.md +21 -0
- package/skills/luckiest-video-studio-reel/CHANGELOG.md +10 -0
- package/skills/luckiest-video-studio-reel/SKILL.md +177 -0
- package/skills/luckiest-video-studio-reel/references/chapters.md +64 -0
- package/skills/luckiest-video-studio-reel/scripts/beatgrid.mjs +39 -0
- package/skills/luckiest-video-studio-reel/scripts/mix.mjs +42 -0
- package/skills/luckiest-video-studio-reel/scripts/splice-music.mjs +38 -0
- package/skills/luckiest-video-studio-reel/templates/reel.html +116 -0
- package/skills/luckiest-video-studio-reference/ATTRIBUTION.md +7 -0
- package/skills/luckiest-video-studio-reference/CHANGELOG.md +8 -0
- package/skills/luckiest-video-studio-reference/SKILL.md +108 -0
- package/skills/luckiest-video-studio-reference/scripts/shots.mjs +58 -0
- package/skills/luckiest-video-studio-talk/ATTRIBUTION.md +19 -0
- package/skills/luckiest-video-studio-talk/CHANGELOG.md +18 -0
- package/skills/luckiest-video-studio-talk/SKILL.md +161 -0
- package/skills/luckiest-video-studio-talk/references/long-form.md +91 -0
- package/skills/luckiest-video-studio-talk/references/plan-schema.md +54 -0
- package/skills/luckiest-video-studio-talk/references/short-form.md +76 -0
- package/skills/luckiest-video-studio-talk/scripts/grab-evidence.mjs +38 -0
- package/skills/luckiest-video-studio-talk/scripts/validate-footage.mjs +25 -0
- package/skills/luckiest-video-studio-talk/scripts/validate-plan.mjs +49 -0
- package/skills/luckiest-video-studio-talk/templates/talk-overlay.html +40 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate music cue metadata (tempo, beat grid, strong cues) for any track.
|
|
3
|
+
|
|
4
|
+
Used two ways: (1) a maintainer tool to precompute the bundled-track cue
|
|
5
|
+
presets, and (2) an optional runtime "extended" beat-sync path for /brag on
|
|
6
|
+
any track when Python + librosa are available (see references/audio.md ->
|
|
7
|
+
"Beat and cue sources"). When those deps are absent, /brag falls back to
|
|
8
|
+
`npx hyperframes beats`. Takes any audio file as input.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
import librosa
|
|
20
|
+
import numpy as np
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
HOP_LENGTH = 512
|
|
24
|
+
FRAME_LENGTH = 2048
|
|
25
|
+
BASS_N_FFT = 4096
|
|
26
|
+
BASS_MIN_HZ = 30.0
|
|
27
|
+
BASS_MAX_HZ = 180.0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _as_float(value: Any) -> float:
|
|
31
|
+
array = np.asarray(value)
|
|
32
|
+
if array.size == 0:
|
|
33
|
+
return 0.0
|
|
34
|
+
return float(array.reshape(-1)[0])
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _finite_round(value: float, digits: int = 4) -> float:
|
|
38
|
+
if not math.isfinite(value):
|
|
39
|
+
return 0.0
|
|
40
|
+
return round(float(value), digits)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _normalize(values: np.ndarray) -> np.ndarray:
|
|
44
|
+
values = np.asarray(values, dtype=float)
|
|
45
|
+
values = np.nan_to_num(values, nan=0.0, posinf=0.0, neginf=0.0)
|
|
46
|
+
if values.size == 0:
|
|
47
|
+
return values
|
|
48
|
+
values = np.maximum(values, 0.0)
|
|
49
|
+
high = np.percentile(values, 98)
|
|
50
|
+
if high <= 1e-12:
|
|
51
|
+
high = np.max(values)
|
|
52
|
+
if high <= 1e-12:
|
|
53
|
+
return np.zeros_like(values)
|
|
54
|
+
return np.clip(values / high, 0.0, 1.0)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _feature_at(feature: np.ndarray, frame: int) -> float:
|
|
58
|
+
if feature.size == 0:
|
|
59
|
+
return 0.0
|
|
60
|
+
index = int(np.clip(frame, 0, feature.size - 1))
|
|
61
|
+
return float(feature[index])
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _local_contrast(onset_norm: np.ndarray, frame: int, sr: int) -> float:
|
|
65
|
+
radius = max(1, int(round(0.5 * sr / HOP_LENGTH)))
|
|
66
|
+
start = max(0, frame - radius)
|
|
67
|
+
end = min(onset_norm.size, frame + radius + 1)
|
|
68
|
+
local = onset_norm[start:end]
|
|
69
|
+
if local.size == 0:
|
|
70
|
+
return 0.0
|
|
71
|
+
median = float(np.median(local))
|
|
72
|
+
return max(0.0, _feature_at(onset_norm, frame) - median)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _score_frame(
|
|
76
|
+
frame: int,
|
|
77
|
+
onset_norm: np.ndarray,
|
|
78
|
+
contrast_norm: np.ndarray,
|
|
79
|
+
rms_norm: np.ndarray,
|
|
80
|
+
bass_norm: np.ndarray,
|
|
81
|
+
) -> dict[str, float]:
|
|
82
|
+
onset = _feature_at(onset_norm, frame)
|
|
83
|
+
contrast = _feature_at(contrast_norm, frame)
|
|
84
|
+
rms = _feature_at(rms_norm, frame)
|
|
85
|
+
bass = _feature_at(bass_norm, frame)
|
|
86
|
+
intensity = 0.45 * onset + 0.25 * contrast + 0.20 * rms + 0.10 * bass
|
|
87
|
+
return {
|
|
88
|
+
"intensity": float(np.clip(intensity, 0.0, 1.0)),
|
|
89
|
+
"onsetStrength": onset,
|
|
90
|
+
"localOnsetContrast": contrast,
|
|
91
|
+
"rms": rms,
|
|
92
|
+
"bassEnergy": bass,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _dedupe_cues(cues: list[dict[str, Any]], min_gap: float = 0.18) -> list[dict[str, Any]]:
|
|
97
|
+
sorted_by_strength = sorted(cues, key=lambda item: item["intensity"], reverse=True)
|
|
98
|
+
accepted: list[dict[str, Any]] = []
|
|
99
|
+
for cue in sorted_by_strength:
|
|
100
|
+
if all(abs(cue["time"] - existing["time"]) >= min_gap for existing in accepted):
|
|
101
|
+
accepted.append(cue)
|
|
102
|
+
return sorted(accepted, key=lambda item: item["time"])
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _compact_times(items: list[dict[str, Any]], max_items: int = 48) -> str:
|
|
106
|
+
subset = items[:max_items]
|
|
107
|
+
text = ", ".join(f"{item['time']:.2f}" for item in subset)
|
|
108
|
+
if len(items) > max_items:
|
|
109
|
+
text += f", ... (+{len(items) - max_items} more)"
|
|
110
|
+
return text or "none"
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _format_cue(cue: dict[str, Any]) -> str:
|
|
114
|
+
return f"{cue['time']:.2f}s ({cue['intensity']:.2f}, {cue['kind']})"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def analyze_track(
|
|
118
|
+
input_path: Path,
|
|
119
|
+
window_start: float,
|
|
120
|
+
window_duration: float,
|
|
121
|
+
top_cues: int,
|
|
122
|
+
sr: int,
|
|
123
|
+
) -> tuple[dict[str, Any], str]:
|
|
124
|
+
y, actual_sr = librosa.load(input_path, sr=sr, mono=True)
|
|
125
|
+
duration = float(librosa.get_duration(y=y, sr=actual_sr))
|
|
126
|
+
window_end = min(duration, window_start + window_duration)
|
|
127
|
+
|
|
128
|
+
onset_env = librosa.onset.onset_strength(
|
|
129
|
+
y=y,
|
|
130
|
+
sr=actual_sr,
|
|
131
|
+
hop_length=HOP_LENGTH,
|
|
132
|
+
)
|
|
133
|
+
onset_norm = _normalize(onset_env)
|
|
134
|
+
|
|
135
|
+
local_contrast = np.array(
|
|
136
|
+
[_local_contrast(onset_norm, frame, actual_sr) for frame in range(onset_norm.size)]
|
|
137
|
+
)
|
|
138
|
+
contrast_norm = _normalize(local_contrast)
|
|
139
|
+
|
|
140
|
+
rms = librosa.feature.rms(
|
|
141
|
+
y=y,
|
|
142
|
+
frame_length=FRAME_LENGTH,
|
|
143
|
+
hop_length=HOP_LENGTH,
|
|
144
|
+
)[0]
|
|
145
|
+
rms_norm = _normalize(rms)
|
|
146
|
+
|
|
147
|
+
spectrum = np.abs(librosa.stft(y, n_fft=BASS_N_FFT, hop_length=HOP_LENGTH))
|
|
148
|
+
frequencies = librosa.fft_frequencies(sr=actual_sr, n_fft=BASS_N_FFT)
|
|
149
|
+
bass_mask = (frequencies >= BASS_MIN_HZ) & (frequencies <= BASS_MAX_HZ)
|
|
150
|
+
if np.any(bass_mask):
|
|
151
|
+
bass = np.mean(spectrum[bass_mask], axis=0)
|
|
152
|
+
else:
|
|
153
|
+
bass = np.zeros(spectrum.shape[1])
|
|
154
|
+
bass_norm = _normalize(bass)
|
|
155
|
+
|
|
156
|
+
tempo, beat_frames = librosa.beat.beat_track(
|
|
157
|
+
y=y,
|
|
158
|
+
sr=actual_sr,
|
|
159
|
+
onset_envelope=onset_env,
|
|
160
|
+
hop_length=HOP_LENGTH,
|
|
161
|
+
units="frames",
|
|
162
|
+
)
|
|
163
|
+
beat_frames = np.asarray(beat_frames, dtype=int)
|
|
164
|
+
beat_times = librosa.frames_to_time(beat_frames, sr=actual_sr, hop_length=HOP_LENGTH)
|
|
165
|
+
|
|
166
|
+
beats: list[dict[str, Any]] = []
|
|
167
|
+
cue_candidates: list[dict[str, Any]] = []
|
|
168
|
+
for frame, time in zip(beat_frames, beat_times):
|
|
169
|
+
score = _score_frame(frame, onset_norm, contrast_norm, rms_norm, bass_norm)
|
|
170
|
+
beat = {
|
|
171
|
+
"time": _finite_round(float(time)),
|
|
172
|
+
"intensity": _finite_round(score["intensity"]),
|
|
173
|
+
"features": {
|
|
174
|
+
"onsetStrength": _finite_round(score["onsetStrength"]),
|
|
175
|
+
"localOnsetContrast": _finite_round(score["localOnsetContrast"]),
|
|
176
|
+
"rms": _finite_round(score["rms"]),
|
|
177
|
+
"bassEnergy": _finite_round(score["bassEnergy"]),
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
beats.append(beat)
|
|
181
|
+
cue_candidates.append({**beat, "kind": "strong_beat"})
|
|
182
|
+
|
|
183
|
+
onset_frames = librosa.onset.onset_detect(
|
|
184
|
+
onset_envelope=onset_env,
|
|
185
|
+
sr=actual_sr,
|
|
186
|
+
hop_length=HOP_LENGTH,
|
|
187
|
+
backtrack=False,
|
|
188
|
+
units="frames",
|
|
189
|
+
)
|
|
190
|
+
for frame in np.asarray(onset_frames, dtype=int):
|
|
191
|
+
time = float(librosa.frames_to_time(frame, sr=actual_sr, hop_length=HOP_LENGTH))
|
|
192
|
+
score = _score_frame(frame, onset_norm, contrast_norm, rms_norm, bass_norm)
|
|
193
|
+
cue_candidates.append(
|
|
194
|
+
{
|
|
195
|
+
"time": _finite_round(time),
|
|
196
|
+
"intensity": _finite_round(score["intensity"]),
|
|
197
|
+
"kind": "onset_peak",
|
|
198
|
+
"features": {
|
|
199
|
+
"onsetStrength": _finite_round(score["onsetStrength"]),
|
|
200
|
+
"localOnsetContrast": _finite_round(score["localOnsetContrast"]),
|
|
201
|
+
"rms": _finite_round(score["rms"]),
|
|
202
|
+
"bassEnergy": _finite_round(score["bassEnergy"]),
|
|
203
|
+
},
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
strong_cues = [
|
|
208
|
+
cue
|
|
209
|
+
for cue in _dedupe_cues(cue_candidates)
|
|
210
|
+
if cue["intensity"] >= 0.45
|
|
211
|
+
]
|
|
212
|
+
strongest = sorted(strong_cues, key=lambda cue: cue["intensity"], reverse=True)[:64]
|
|
213
|
+
strong_cues = sorted(strongest, key=lambda cue: cue["time"])
|
|
214
|
+
|
|
215
|
+
data = {
|
|
216
|
+
"schemaVersion": 1,
|
|
217
|
+
"source": {
|
|
218
|
+
"filename": input_path.name,
|
|
219
|
+
"trackStem": input_path.stem,
|
|
220
|
+
},
|
|
221
|
+
"duration": _finite_round(duration, 3),
|
|
222
|
+
"tempo": _finite_round(_as_float(tempo), 2),
|
|
223
|
+
"analysis": {
|
|
224
|
+
"sampleRate": actual_sr,
|
|
225
|
+
"hopLength": HOP_LENGTH,
|
|
226
|
+
"windowStart": _finite_round(window_start, 3),
|
|
227
|
+
"windowDuration": _finite_round(window_duration, 3),
|
|
228
|
+
"windowEnd": _finite_round(window_end, 3),
|
|
229
|
+
},
|
|
230
|
+
"scoring": {
|
|
231
|
+
"intensityFormula": "0.45*onset_strength + 0.25*local_onset_contrast + 0.20*rms + 0.10*bass_energy",
|
|
232
|
+
"features": ["onset_strength", "local_onset_contrast", "rms", "bass_energy"],
|
|
233
|
+
"normalization": "Per-track robust normalization to 0-1 using the 98th percentile, then clamped.",
|
|
234
|
+
"strongCueMinimumIntensity": 0.45,
|
|
235
|
+
"strongCueMaxCount": 64,
|
|
236
|
+
},
|
|
237
|
+
"beats": beats,
|
|
238
|
+
"strongCues": strong_cues,
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
window_beats = [
|
|
242
|
+
beat for beat in beats if window_start <= beat["time"] <= window_end
|
|
243
|
+
]
|
|
244
|
+
window_cues = [
|
|
245
|
+
cue for cue in strong_cues if window_start <= cue["time"] <= window_end
|
|
246
|
+
]
|
|
247
|
+
top_window_cues = sorted(window_cues, key=lambda cue: cue["intensity"], reverse=True)[:top_cues]
|
|
248
|
+
reveal_candidates = top_window_cues[: min(5, len(top_window_cues))]
|
|
249
|
+
|
|
250
|
+
markdown = "\n".join(
|
|
251
|
+
[
|
|
252
|
+
f"# Music Cues: {input_path.stem}",
|
|
253
|
+
"",
|
|
254
|
+
f"- Track: `{input_path.name}`",
|
|
255
|
+
f"- Duration: {duration:.2f}s",
|
|
256
|
+
f"- Estimated tempo: {_as_float(tempo):.2f} BPM",
|
|
257
|
+
f"- Planning window: {window_start:.2f}-{window_end:.2f}s",
|
|
258
|
+
"",
|
|
259
|
+
"## Useful Beat Grid",
|
|
260
|
+
"",
|
|
261
|
+
_compact_times(window_beats),
|
|
262
|
+
"",
|
|
263
|
+
"## Strong Cues In Window",
|
|
264
|
+
"",
|
|
265
|
+
"\n".join(f"- {_format_cue(cue)}" for cue in top_window_cues) or "- none",
|
|
266
|
+
"",
|
|
267
|
+
"## Reveal Candidates",
|
|
268
|
+
"",
|
|
269
|
+
"\n".join(f"- {_format_cue(cue)}" for cue in reveal_candidates) or "- none",
|
|
270
|
+
"",
|
|
271
|
+
"## Use Policy",
|
|
272
|
+
"",
|
|
273
|
+
"Use these as optional timing hints. Major reveals may move toward a nearby strong cue within about 0.15s; smaller entrances may align to nearby beats within about 0.10s. Ignore cues when they harm story, readability, or pacing.",
|
|
274
|
+
"",
|
|
275
|
+
]
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
return data, markdown
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def main() -> None:
|
|
282
|
+
parser = argparse.ArgumentParser(
|
|
283
|
+
description="Analyze a bundled music track and write /brag cue presets."
|
|
284
|
+
)
|
|
285
|
+
parser.add_argument("input", type=Path, help="Input audio file.")
|
|
286
|
+
parser.add_argument("--output-json", type=Path, required=True)
|
|
287
|
+
parser.add_argument("--output-md", type=Path, required=True)
|
|
288
|
+
parser.add_argument("--window-start", type=float, default=0.0)
|
|
289
|
+
parser.add_argument("--window-duration", type=float, default=25.0)
|
|
290
|
+
parser.add_argument("--top-cues", type=int, default=10)
|
|
291
|
+
parser.add_argument("--sr", type=int, default=44100)
|
|
292
|
+
args = parser.parse_args()
|
|
293
|
+
|
|
294
|
+
data, markdown = analyze_track(
|
|
295
|
+
input_path=args.input,
|
|
296
|
+
window_start=args.window_start,
|
|
297
|
+
window_duration=args.window_duration,
|
|
298
|
+
top_cues=args.top_cues,
|
|
299
|
+
sr=args.sr,
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
args.output_json.parent.mkdir(parents=True, exist_ok=True)
|
|
303
|
+
args.output_md.parent.mkdir(parents=True, exist_ok=True)
|
|
304
|
+
args.output_json.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
305
|
+
args.output_md.write_text(markdown, encoding="utf-8")
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
if __name__ == "__main__":
|
|
309
|
+
main()
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Write a Diffusion Studio project for a rendered run: line-draw logo scenes become native, editable
|
|
3
|
+
// Diffusion scenes; every other scene plays its rendered clip (demo scenes play the raw footage, trimmed).
|
|
4
|
+
// Usage: node assemble-diffusion.mjs <run-dir> [--open] [--export [out.mp4]]
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
|
|
10
|
+
const args = process.argv.slice(2);
|
|
11
|
+
const runDir = resolve(args.find((a) => !a.startsWith("--") && !/\.(mp4|mov|webm)$/i.test(a)) ?? ".");
|
|
12
|
+
const wantOpen = args.includes("--open") || args.includes("--export");
|
|
13
|
+
const exportOut = args.includes("--export") ? resolve(args.find((a) => /\.(mp4|mov|webm)$/i.test(a)) ?? join(runDir, "final-diffusion.mp4")) : null;
|
|
14
|
+
const skillDir = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
|
+
const cli = process.env.DIFFUSION_CLI ?? "/Applications/Diffusion Studio.app/Contents/Resources/cli/bin/dapi";
|
|
16
|
+
const fail = (m) => { console.error(`error: ${m}`); process.exit(1); };
|
|
17
|
+
|
|
18
|
+
const sb = JSON.parse(readFileSync(join(runDir, "storyboard.json"), "utf8"));
|
|
19
|
+
const brand = existsSync(join(runDir, "brand.json")) ? JSON.parse(readFileSync(join(runDir, "brand.json"), "utf8")) : {};
|
|
20
|
+
const { width: W, height: H, fps } = sb.format;
|
|
21
|
+
const proj = join(runDir, "diffusion");
|
|
22
|
+
mkdirSync(join(proj, "logos"), { recursive: true });
|
|
23
|
+
mkdirSync(join(proj, "assets"), { recursive: true });
|
|
24
|
+
copyFileSync(join(skillDir, "templates", "diffusion", "line-draw.tsx"), join(proj, "line-draw.tsx"));
|
|
25
|
+
|
|
26
|
+
// Media is linked into assets/ and named by library path, as Diffusion's editor guide asks.
|
|
27
|
+
const link = (rel) => {
|
|
28
|
+
const src = join(runDir, rel);
|
|
29
|
+
if (!existsSync(src)) fail(`missing ${rel}`);
|
|
30
|
+
const dst = join(proj, "assets", rel);
|
|
31
|
+
mkdirSync(dirname(dst), { recursive: true });
|
|
32
|
+
rmSync(dst, { force: true });
|
|
33
|
+
symlinkSync(src, dst);
|
|
34
|
+
return rel;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Minimal SVG reader: path data, its fill (attribute or class), and whether it sits under a clipPath.
|
|
38
|
+
// ponytail: handles flat Illustrator-style exports; nested transforms are not applied, flatten those first.
|
|
39
|
+
function readLogo(file) {
|
|
40
|
+
const svg = readFileSync(file, "utf8");
|
|
41
|
+
const classFill = Object.fromEntries([...svg.matchAll(/\.([\w-]+)\s*\{[^}]*?fill:\s*(#[0-9a-fA-F]{3,8}|[a-z]+)/g)].map((m) => [m[1], m[2]]));
|
|
42
|
+
const clipClasses = new Set([...svg.matchAll(/\.([\w-]+)\s*\{[^}]*?clip-path:/g)].map((m) => m[1]));
|
|
43
|
+
const clipRect = svg.match(/<clipPath[\s\S]*?<rect[^>]*?x="([-\d.]+)"[^>]*?y="([-\d.]+)"[^>]*?width="([\d.]+)"[^>]*?height="([\d.]+)"/);
|
|
44
|
+
const paths = [];
|
|
45
|
+
const stack = [];
|
|
46
|
+
for (const m of svg.matchAll(/<(\/?)(g|path|clipPath|defs)\b([^>]*?)(\/?)>/g)) {
|
|
47
|
+
const [, close, tag, attrs, self] = m;
|
|
48
|
+
const cls = (attrs.match(/class="([^"]+)"/) ?? [])[1]?.split(/\s+/) ?? [];
|
|
49
|
+
if (tag === "g" || tag === "clipPath" || tag === "defs") {
|
|
50
|
+
if (close) stack.pop();
|
|
51
|
+
else if (!self) stack.push({ tag, clip: /clip-path=/.test(attrs) || cls.some((c) => clipClasses.has(c)) });
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (close || stack.some((s) => s.tag === "defs" || s.tag === "clipPath")) continue;
|
|
55
|
+
const d = (attrs.match(/\sd="([^"]+)"/) ?? [])[1];
|
|
56
|
+
if (!d) continue;
|
|
57
|
+
const fill = (attrs.match(/fill="([^"]+)"/) ?? [])[1] ?? cls.map((c) => classFill[c]).find(Boolean) ?? "#000000";
|
|
58
|
+
if (fill === "none") continue;
|
|
59
|
+
paths.push({ d, fill, clip: stack.some((s) => s.clip) });
|
|
60
|
+
}
|
|
61
|
+
if (!paths.length) fail(`${file}: no filled paths found`);
|
|
62
|
+
return { paths, clip: clipRect ? clipRect.slice(1, 5).map(Number) : null };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const camel = (id) => id.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
|
|
66
|
+
const inspect = [];
|
|
67
|
+
const imports = [];
|
|
68
|
+
const nodes = [];
|
|
69
|
+
let t = 0;
|
|
70
|
+
for (const [i, s] of sb.scenes.entries()) {
|
|
71
|
+
const name = `${String(i + 1).padStart(2, "0")}-${s.id}.mp4`;
|
|
72
|
+
const start = +t.toFixed(3);
|
|
73
|
+
const end = +(t + s.duration).toFixed(3);
|
|
74
|
+
const svgRel = (s.assets ?? []).find((a) => a.toLowerCase().endsWith(".svg"));
|
|
75
|
+
if (s.kind === "logo" && s.recipe === "line-draw" && svgRel) {
|
|
76
|
+
const art = readLogo(join(runDir, svgRel));
|
|
77
|
+
const v = camel(s.id);
|
|
78
|
+
writeFileSync(join(proj, "logos", `${s.id}.ts`), `import type { LogoArt } from "../line-draw";\n\nconst art: LogoArt = ${JSON.stringify(art)};\nexport default art;\n`);
|
|
79
|
+
imports.push(`import ${v}Art from "./logos/${s.id}";`);
|
|
80
|
+
inspect.push(
|
|
81
|
+
`/** @inspect text path="${s.id}/Caption" */\nconst ${v}Caption = ${JSON.stringify(s.variables?.caption ?? "")};`,
|
|
82
|
+
`/** @inspect number path="${s.id}/Draw seconds" min=0.5 max=4 step=0.1 */\nconst ${v}DrawSeconds = ${s.variables?.drawSeconds ?? 1.9};`,
|
|
83
|
+
`/** @inspect number path="${s.id}/Logo size" min=200 max=${Math.min(W, H)} step=10 */\nconst ${v}LogoSize = ${s.variables?.logoSize ?? Math.round(Math.min(W, H) * 0.52)};`,
|
|
84
|
+
);
|
|
85
|
+
nodes.push(` <LineDrawLogo id="${s.id}" art={${v}Art} start={${start}} duration={${s.duration}} width={${W}} height={${H}} caption={${v}Caption} ink={ink} font={font} drawSeconds={${v}DrawSeconds} logoSize={${v}LogoSize} />`);
|
|
86
|
+
} else if (s.kind === "demo") {
|
|
87
|
+
const src = link(s.source);
|
|
88
|
+
nodes.push(` <video id="${s.id}" src="${src}" width={${W}} height={${H}} objectFit="contain" start={${start}} sourceIn={${s.sourceStart ?? 0}} end={${end}} />`);
|
|
89
|
+
} else {
|
|
90
|
+
const src = link(join("clips", name));
|
|
91
|
+
nodes.push(` <video id="${s.id}" src="${src}" width={${W}} height={${H}} start={${start}} end={${end}} />`);
|
|
92
|
+
}
|
|
93
|
+
t = end;
|
|
94
|
+
}
|
|
95
|
+
if (sb.music?.file) {
|
|
96
|
+
const src = link(sb.music.file);
|
|
97
|
+
const db = (20 * Math.log10(sb.music.volume ?? 0.35)).toFixed(1);
|
|
98
|
+
nodes.push(` <audio id="music" src="${src}" start={0} end={${+t.toFixed(3)}} volume={${db}} />`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const tsx = `/* ${sb.title}: generated by luckiest-video-studio from storyboard.json. Edit here or in the inspector. */
|
|
102
|
+
${imports.length ? `import { LineDrawLogo } from "./line-draw";\n${imports.join("\n")}\n` : ""}
|
|
103
|
+
/** @inspect color path="Brand/Paper" */
|
|
104
|
+
const paper = ${JSON.stringify(brand.paper ?? "#FFFFFF")};
|
|
105
|
+
/** @inspect color path="Brand/Ink" */
|
|
106
|
+
const ink = ${JSON.stringify(brand.ink ?? "#0A0A0A")};
|
|
107
|
+
/** @inspect font path="Brand/Caption font" */
|
|
108
|
+
const font = ${JSON.stringify(brand.text ?? "Inter")};
|
|
109
|
+
|
|
110
|
+
${inspect.join("\n")}
|
|
111
|
+
|
|
112
|
+
export default function Video() {
|
|
113
|
+
return (
|
|
114
|
+
<stage>
|
|
115
|
+
<scene id="main" name=${JSON.stringify(sb.title)} width={${W}} height={${H}} fill={paper} active>
|
|
116
|
+
<sequence id="spine">
|
|
117
|
+
${nodes.join("\n")}
|
|
118
|
+
</sequence>
|
|
119
|
+
</scene>
|
|
120
|
+
</stage>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
writeFileSync(join(proj, "index.tsx"), tsx);
|
|
125
|
+
console.log(`wrote ${join(proj, "index.tsx")} (${sb.scenes.length} scenes, ${t.toFixed(2)}s, ${imports.length} native logo scene(s))`);
|
|
126
|
+
|
|
127
|
+
if (!wantOpen) process.exit(0);
|
|
128
|
+
if (!existsSync(cli)) fail(`Diffusion Studio CLI not found at ${cli}; install the app or set DIFFUSION_CLI`);
|
|
129
|
+
const dapi = (...a) => {
|
|
130
|
+
const r = spawnSync(cli, a, { encoding: "utf8" });
|
|
131
|
+
if (r.status !== 0) fail(`dapi ${a[0]}: ${(r.stderr || r.stdout).trim()}`);
|
|
132
|
+
return r.stdout.trim();
|
|
133
|
+
};
|
|
134
|
+
dapi("open", proj);
|
|
135
|
+
|
|
136
|
+
// Export settings live in the project's package.json, merged after open so Diffusion's own fields stay.
|
|
137
|
+
const pkgPath = join(proj, "package.json");
|
|
138
|
+
const pkg = existsSync(pkgPath) ? JSON.parse(readFileSync(pkgPath, "utf8")) : {};
|
|
139
|
+
pkg.diffusion = { ...(pkg.diffusion ?? {}), export: { ...(pkg.diffusion?.export ?? {}), main: {
|
|
140
|
+
format: "mp4",
|
|
141
|
+
video: { enabled: true, codec: "avc", bitrate: 12000000, fps, resolution: Math.min(W, H) },
|
|
142
|
+
audio: { enabled: true, codec: "aac", sampleRate: 48000, bitrate: 192000 },
|
|
143
|
+
} } };
|
|
144
|
+
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
145
|
+
|
|
146
|
+
// Opening compiles in the background; wait until the scene exists before checking it.
|
|
147
|
+
let check = null;
|
|
148
|
+
for (let i = 0; i < 30 && !check; i++) {
|
|
149
|
+
const r = spawnSync(cli, ["check", "main"], { encoding: "utf8" });
|
|
150
|
+
if (r.status === 0) check = JSON.parse(r.stdout);
|
|
151
|
+
else spawnSync("sleep", ["1"]);
|
|
152
|
+
}
|
|
153
|
+
if (!check) fail(`scene "main" never compiled; run: ${basename(cli)} logs`);
|
|
154
|
+
const errors = check.issues.filter((x) => x.severity === "error");
|
|
155
|
+
console.log(`check: ${check.stats.nodes} nodes, ${check.issues.length} issue(s)${errors.length ? `, ${errors.length} error(s)` : ""}`);
|
|
156
|
+
for (const x of check.issues) console.log(` ${x.severity} ${x.node}: ${x.message}`);
|
|
157
|
+
if (errors.length) process.exit(1);
|
|
158
|
+
if (exportOut) {
|
|
159
|
+
const res = JSON.parse(dapi("export", "main", exportOut));
|
|
160
|
+
console.log(`exported ${res.path} (${res.width}x${res.height}, ${res.duration}s)`);
|
|
161
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Write an OpenScreen 1.13.0 timeline (schemaVersion 7) for a rendered run: motion and logo scenes as their
|
|
3
|
+
// rendered clips, demo scenes as the raw footage with in/out points so trims can be widened in the editor.
|
|
4
|
+
// Usage: node assemble-openscreen.mjs <run-dir> [--dest ~/Movies/Openscreen] [--name <slug>]
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { basename, join, resolve } from "node:path";
|
|
9
|
+
|
|
10
|
+
// ponytail: pinned to OpenScreen 1.13.0, which rejects schemaVersion 8. Bump with the next release after testing.
|
|
11
|
+
const SCHEMA_VERSION = 7;
|
|
12
|
+
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const opt = (k) => (args.includes(k) ? args[args.indexOf(k) + 1] : undefined);
|
|
15
|
+
const runDir = resolve(args.find((a, i) => !a.startsWith("--") && !["--dest", "--name"].includes(args[i - 1])) ?? ".");
|
|
16
|
+
const fail = (msg) => { console.error(`error: ${msg}`); process.exit(1); };
|
|
17
|
+
|
|
18
|
+
const sb = JSON.parse(readFileSync(join(runDir, "storyboard.json"), "utf8"));
|
|
19
|
+
const slug = (opt("--name") ?? sb.title).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "video";
|
|
20
|
+
const destDir = join(resolve((opt("--dest") ?? "~/Movies/Openscreen").replace(/^~/, homedir())), slug);
|
|
21
|
+
mkdirSync(destDir, { recursive: true });
|
|
22
|
+
|
|
23
|
+
const probe = (file) => {
|
|
24
|
+
const r = spawnSync("ffprobe", ["-v", "error", "-select_streams", "v:0", "-show_entries", "stream=codec_name,width,height,r_frame_rate:format=duration", "-of", "json", file], { encoding: "utf8" });
|
|
25
|
+
if (r.status !== 0) fail(`ffprobe failed on ${file}`);
|
|
26
|
+
const j = JSON.parse(r.stdout);
|
|
27
|
+
const v = j.streams?.[0] ?? {};
|
|
28
|
+
const [n, d] = (v.r_frame_rate ?? "0/1").split("/").map(Number);
|
|
29
|
+
return { durationSec: Number(j.format?.duration ?? 0), video: { codec: v.codec_name ?? "unknown", width: v.width ?? 0, height: v.height ?? 0, fps: d ? n / d : 0 } };
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// One asset per distinct media file; demo scenes that share footage share an asset.
|
|
33
|
+
const assets = new Map();
|
|
34
|
+
const assetFor = (src, label) => {
|
|
35
|
+
const key = resolve(src);
|
|
36
|
+
if (assets.has(key)) return assets.get(key);
|
|
37
|
+
if (!existsSync(src)) fail(`missing ${src}`);
|
|
38
|
+
const dest = join(destDir, basename(src));
|
|
39
|
+
if (resolve(src) !== resolve(dest)) copyFileSync(src, dest);
|
|
40
|
+
const cursor = src.replace(/\.[^.]+$/, ".cursor.json");
|
|
41
|
+
if (existsSync(cursor)) copyFileSync(cursor, dest.replace(/\.[^.]+$/, ".cursor.json"));
|
|
42
|
+
const a = { id: `a-${assets.size + 1}-${label}`, kind: "video", label, originalPath: dest, ...probe(dest) };
|
|
43
|
+
assets.set(key, a);
|
|
44
|
+
return a;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
let t = 0;
|
|
48
|
+
const clips = sb.scenes.map((s, i) => {
|
|
49
|
+
const name = `${String(i + 1).padStart(2, "0")}-${s.id}.mp4`;
|
|
50
|
+
const demo = s.kind === "demo";
|
|
51
|
+
const src = demo ? join(runDir, s.source) : join(runDir, "clips", name);
|
|
52
|
+
if (!demo && !existsSync(src)) fail(`scene ${s.id} has no clip; run render-scenes.mjs first`);
|
|
53
|
+
const asset = assetFor(src, demo ? s.id : name.replace(/\.mp4$/, ""));
|
|
54
|
+
const start = demo ? (s.sourceStart ?? 0) : 0;
|
|
55
|
+
const end = Math.min(start + s.duration, asset.durationSec || start + s.duration);
|
|
56
|
+
const clip = { id: `c-${s.id}`, assetId: asset.id, sourceStartSec: start, sourceEndSec: end, timelineStartSec: t, timelineEndSec: t + (end - start), wordRefs: [], origin: "agent", reason: s.line ?? s.kind };
|
|
57
|
+
t = clip.timelineEndSec;
|
|
58
|
+
return clip;
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const now = new Date().toISOString();
|
|
62
|
+
const doc = {
|
|
63
|
+
schemaVersion: SCHEMA_VERSION,
|
|
64
|
+
project: { id: `lvs-${slug}`, title: sb.title, createdAt: now, updatedAt: now, primaryAssetId: clips[0].assetId },
|
|
65
|
+
assets: [...assets.values()],
|
|
66
|
+
timeline: { clips, gaps: [], trimRanges: [], muteRanges: [], speedRanges: [], captionRanges: [] },
|
|
67
|
+
annotations: [],
|
|
68
|
+
zoomRanges: [],
|
|
69
|
+
};
|
|
70
|
+
const projectFile = join(destDir, `${slug}.openscreen`);
|
|
71
|
+
writeFileSync(projectFile, JSON.stringify(doc, null, 2));
|
|
72
|
+
writeFileSync(join(runDir, "project.openscreen.txt"), `${projectFile}\n`);
|
|
73
|
+
console.log(`wrote ${projectFile}`);
|
|
74
|
+
console.log(`${clips.length} clips, ${assets.size} media files, ${t.toFixed(2)}s. Open it in OpenScreen, edit, then click Export.`);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "brag"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Development tooling for the /brag skill."
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"librosa>=0.10.2",
|
|
8
|
+
"numpy>=1.26",
|
|
9
|
+
"scipy>=1.11",
|
|
10
|
+
"soundfile>=0.12",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[tool.uv]
|
|
14
|
+
package = false
|