@kenkaiiii/gg-editor 0.1.0
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/LICENSE +21 -0
- package/README.md +453 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/ass.d.ts +75 -0
- package/dist/core/ass.d.ts.map +1 -0
- package/dist/core/ass.js +128 -0
- package/dist/core/ass.js.map +1 -0
- package/dist/core/ass.test.d.ts +2 -0
- package/dist/core/ass.test.d.ts.map +1 -0
- package/dist/core/ass.test.js +112 -0
- package/dist/core/ass.test.js.map +1 -0
- package/dist/core/audio-cleanup.d.ts +16 -0
- package/dist/core/audio-cleanup.d.ts.map +1 -0
- package/dist/core/audio-cleanup.js +79 -0
- package/dist/core/audio-cleanup.js.map +1 -0
- package/dist/core/audio-cleanup.test.d.ts +2 -0
- package/dist/core/audio-cleanup.test.d.ts.map +1 -0
- package/dist/core/audio-cleanup.test.js +41 -0
- package/dist/core/audio-cleanup.test.js.map +1 -0
- package/dist/core/audio-mix.d.ts +89 -0
- package/dist/core/audio-mix.d.ts.map +1 -0
- package/dist/core/audio-mix.js +156 -0
- package/dist/core/audio-mix.js.map +1 -0
- package/dist/core/audio-mix.test.d.ts +2 -0
- package/dist/core/audio-mix.test.d.ts.map +1 -0
- package/dist/core/audio-mix.test.js +91 -0
- package/dist/core/audio-mix.test.js.map +1 -0
- package/dist/core/auth/anthropic.d.ts +4 -0
- package/dist/core/auth/anthropic.d.ts.map +1 -0
- package/dist/core/auth/anthropic.js +78 -0
- package/dist/core/auth/anthropic.js.map +1 -0
- package/dist/core/auth/index.d.ts +7 -0
- package/dist/core/auth/index.d.ts.map +1 -0
- package/dist/core/auth/index.js +6 -0
- package/dist/core/auth/index.js.map +1 -0
- package/dist/core/auth/login.d.ts +13 -0
- package/dist/core/auth/login.d.ts.map +1 -0
- package/dist/core/auth/login.js +188 -0
- package/dist/core/auth/login.js.map +1 -0
- package/dist/core/auth/openai.d.ts +4 -0
- package/dist/core/auth/openai.d.ts.map +1 -0
- package/dist/core/auth/openai.js +170 -0
- package/dist/core/auth/openai.js.map +1 -0
- package/dist/core/auth/pkce.d.ts +5 -0
- package/dist/core/auth/pkce.d.ts.map +1 -0
- package/dist/core/auth/pkce.js +17 -0
- package/dist/core/auth/pkce.js.map +1 -0
- package/dist/core/auth/storage.d.ts +29 -0
- package/dist/core/auth/storage.d.ts.map +1 -0
- package/dist/core/auth/storage.js +127 -0
- package/dist/core/auth/storage.js.map +1 -0
- package/dist/core/auth/types.d.ts +22 -0
- package/dist/core/auth/types.d.ts.map +1 -0
- package/dist/core/auth/types.js +12 -0
- package/dist/core/auth/types.js.map +1 -0
- package/dist/core/clustering.d.ts +52 -0
- package/dist/core/clustering.d.ts.map +1 -0
- package/dist/core/clustering.js +163 -0
- package/dist/core/clustering.js.map +1 -0
- package/dist/core/clustering.test.d.ts +2 -0
- package/dist/core/clustering.test.d.ts.map +1 -0
- package/dist/core/clustering.test.js +112 -0
- package/dist/core/clustering.test.js.map +1 -0
- package/dist/core/color-match.d.ts +19 -0
- package/dist/core/color-match.d.ts.map +1 -0
- package/dist/core/color-match.js +118 -0
- package/dist/core/color-match.js.map +1 -0
- package/dist/core/color-match.test.d.ts +2 -0
- package/dist/core/color-match.test.d.ts.map +1 -0
- package/dist/core/color-match.test.js +40 -0
- package/dist/core/color-match.test.js.map +1 -0
- package/dist/core/ducking.d.ts +37 -0
- package/dist/core/ducking.d.ts.map +1 -0
- package/dist/core/ducking.js +71 -0
- package/dist/core/ducking.js.map +1 -0
- package/dist/core/ducking.test.d.ts +2 -0
- package/dist/core/ducking.test.d.ts.map +1 -0
- package/dist/core/ducking.test.js +38 -0
- package/dist/core/ducking.test.js.map +1 -0
- package/dist/core/edl-roundtrip.test.d.ts +2 -0
- package/dist/core/edl-roundtrip.test.d.ts.map +1 -0
- package/dist/core/edl-roundtrip.test.js +171 -0
- package/dist/core/edl-roundtrip.test.js.map +1 -0
- package/dist/core/edl.d.ts +41 -0
- package/dist/core/edl.d.ts.map +1 -0
- package/dist/core/edl.js +56 -0
- package/dist/core/edl.js.map +1 -0
- package/dist/core/edl.test.d.ts +2 -0
- package/dist/core/edl.test.d.ts.map +1 -0
- package/dist/core/edl.test.js +62 -0
- package/dist/core/edl.test.js.map +1 -0
- package/dist/core/envelope-sync.d.ts +52 -0
- package/dist/core/envelope-sync.d.ts.map +1 -0
- package/dist/core/envelope-sync.js +169 -0
- package/dist/core/envelope-sync.js.map +1 -0
- package/dist/core/envelope-sync.test.d.ts +2 -0
- package/dist/core/envelope-sync.test.d.ts.map +1 -0
- package/dist/core/envelope-sync.test.js +70 -0
- package/dist/core/envelope-sync.test.js.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts +2 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.js +251 -0
- package/dist/core/fcpxml-roundtrip.test.js.map +1 -0
- package/dist/core/fcpxml.d.ts +172 -0
- package/dist/core/fcpxml.d.ts.map +1 -0
- package/dist/core/fcpxml.js +406 -0
- package/dist/core/fcpxml.js.map +1 -0
- package/dist/core/fcpxml.test.d.ts +2 -0
- package/dist/core/fcpxml.test.d.ts.map +1 -0
- package/dist/core/fcpxml.test.js +360 -0
- package/dist/core/fcpxml.test.js.map +1 -0
- package/dist/core/filler-words.d.ts +107 -0
- package/dist/core/filler-words.d.ts.map +1 -0
- package/dist/core/filler-words.js +221 -0
- package/dist/core/filler-words.js.map +1 -0
- package/dist/core/filler-words.test.d.ts +2 -0
- package/dist/core/filler-words.test.d.ts.map +1 -0
- package/dist/core/filler-words.test.js +177 -0
- package/dist/core/filler-words.test.js.map +1 -0
- package/dist/core/format.d.ts +36 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +57 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/format.test.d.ts +2 -0
- package/dist/core/format.test.d.ts.map +1 -0
- package/dist/core/format.test.js +81 -0
- package/dist/core/format.test.js.map +1 -0
- package/dist/core/frames.d.ts +35 -0
- package/dist/core/frames.d.ts.map +1 -0
- package/dist/core/frames.js +64 -0
- package/dist/core/frames.js.map +1 -0
- package/dist/core/hook-analysis.d.ts +90 -0
- package/dist/core/hook-analysis.d.ts.map +1 -0
- package/dist/core/hook-analysis.js +222 -0
- package/dist/core/hook-analysis.js.map +1 -0
- package/dist/core/hook-analysis.test.d.ts +2 -0
- package/dist/core/hook-analysis.test.d.ts.map +1 -0
- package/dist/core/hook-analysis.test.js +130 -0
- package/dist/core/hook-analysis.test.js.map +1 -0
- package/dist/core/hosts/detect.d.ts +17 -0
- package/dist/core/hosts/detect.d.ts.map +1 -0
- package/dist/core/hosts/detect.js +64 -0
- package/dist/core/hosts/detect.js.map +1 -0
- package/dist/core/hosts/detect.test.d.ts +2 -0
- package/dist/core/hosts/detect.test.d.ts.map +1 -0
- package/dist/core/hosts/detect.test.js +17 -0
- package/dist/core/hosts/detect.test.js.map +1 -0
- package/dist/core/hosts/index.d.ts +13 -0
- package/dist/core/hosts/index.d.ts.map +1 -0
- package/dist/core/hosts/index.js +30 -0
- package/dist/core/hosts/index.js.map +1 -0
- package/dist/core/hosts/lazy.d.ts +53 -0
- package/dist/core/hosts/lazy.d.ts.map +1 -0
- package/dist/core/hosts/lazy.js +125 -0
- package/dist/core/hosts/lazy.js.map +1 -0
- package/dist/core/hosts/lazy.test.d.ts +2 -0
- package/dist/core/hosts/lazy.test.d.ts.map +1 -0
- package/dist/core/hosts/lazy.test.js +117 -0
- package/dist/core/hosts/lazy.test.js.map +1 -0
- package/dist/core/hosts/none/adapter.d.ts +74 -0
- package/dist/core/hosts/none/adapter.d.ts.map +1 -0
- package/dist/core/hosts/none/adapter.js +99 -0
- package/dist/core/hosts/none/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/adapter.d.ts +87 -0
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -0
- package/dist/core/hosts/premiere/adapter.js +218 -0
- package/dist/core/hosts/premiere/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts +26 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.js +326 -0
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts +2 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.js +36 -0
- package/dist/core/hosts/premiere/bridge-source.test.js.map +1 -0
- package/dist/core/hosts/premiere/bridge.d.ts +38 -0
- package/dist/core/hosts/premiere/bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge.js +238 -0
- package/dist/core/hosts/premiere/bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts +47 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.js +82 -0
- package/dist/core/hosts/premiere/http-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.js +113 -0
- package/dist/core/hosts/premiere/http-bridge.test.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts +91 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.js +303 -0
- package/dist/core/hosts/premiere/ws-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js +146 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js.map +1 -0
- package/dist/core/hosts/resolve/adapter.d.ts +99 -0
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -0
- package/dist/core/hosts/resolve/adapter.js +187 -0
- package/dist/core/hosts/resolve/adapter.js.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts +17 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.js +660 -0
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.d.ts +51 -0
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js +472 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.js +270 -0
- package/dist/core/hosts/resolve/bridge.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.js +50 -0
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -0
- package/dist/core/hosts/types.d.ts +167 -0
- package/dist/core/hosts/types.d.ts.map +1 -0
- package/dist/core/hosts/types.js +27 -0
- package/dist/core/hosts/types.js.map +1 -0
- package/dist/core/keyframes.d.ts +35 -0
- package/dist/core/keyframes.d.ts.map +1 -0
- package/dist/core/keyframes.js +90 -0
- package/dist/core/keyframes.js.map +1 -0
- package/dist/core/keyframes.test.d.ts +2 -0
- package/dist/core/keyframes.test.d.ts.map +1 -0
- package/dist/core/keyframes.test.js +73 -0
- package/dist/core/keyframes.test.js.map +1 -0
- package/dist/core/keyword-captions.d.ts +75 -0
- package/dist/core/keyword-captions.d.ts.map +1 -0
- package/dist/core/keyword-captions.js +285 -0
- package/dist/core/keyword-captions.js.map +1 -0
- package/dist/core/keyword-captions.test.d.ts +2 -0
- package/dist/core/keyword-captions.test.d.ts.map +1 -0
- package/dist/core/keyword-captions.test.js +90 -0
- package/dist/core/keyword-captions.test.js.map +1 -0
- package/dist/core/loudness.d.ts +52 -0
- package/dist/core/loudness.d.ts.map +1 -0
- package/dist/core/loudness.js +120 -0
- package/dist/core/loudness.js.map +1 -0
- package/dist/core/loudness.test.d.ts +2 -0
- package/dist/core/loudness.test.d.ts.map +1 -0
- package/dist/core/loudness.test.js +34 -0
- package/dist/core/loudness.test.js.map +1 -0
- package/dist/core/marker-colors.d.ts +39 -0
- package/dist/core/marker-colors.d.ts.map +1 -0
- package/dist/core/marker-colors.js +83 -0
- package/dist/core/marker-colors.js.map +1 -0
- package/dist/core/marker-colors.test.d.ts +2 -0
- package/dist/core/marker-colors.test.d.ts.map +1 -0
- package/dist/core/marker-colors.test.js +116 -0
- package/dist/core/marker-colors.test.js.map +1 -0
- package/dist/core/media/ffmpeg.d.ts +27 -0
- package/dist/core/media/ffmpeg.d.ts.map +1 -0
- package/dist/core/media/ffmpeg.js +53 -0
- package/dist/core/media/ffmpeg.js.map +1 -0
- package/dist/core/multicam.d.ts +40 -0
- package/dist/core/multicam.d.ts.map +1 -0
- package/dist/core/multicam.js +77 -0
- package/dist/core/multicam.js.map +1 -0
- package/dist/core/multicam.test.d.ts +2 -0
- package/dist/core/multicam.test.d.ts.map +1 -0
- package/dist/core/multicam.test.js +56 -0
- package/dist/core/multicam.test.js.map +1 -0
- package/dist/core/punch-in.d.ts +72 -0
- package/dist/core/punch-in.d.ts.map +1 -0
- package/dist/core/punch-in.js +133 -0
- package/dist/core/punch-in.js.map +1 -0
- package/dist/core/punch-in.test.d.ts +2 -0
- package/dist/core/punch-in.test.d.ts.map +1 -0
- package/dist/core/punch-in.test.js +118 -0
- package/dist/core/punch-in.test.js.map +1 -0
- package/dist/core/reformat.d.ts +26 -0
- package/dist/core/reformat.d.ts.map +1 -0
- package/dist/core/reformat.js +31 -0
- package/dist/core/reformat.js.map +1 -0
- package/dist/core/reformat.test.d.ts +2 -0
- package/dist/core/reformat.test.d.ts.map +1 -0
- package/dist/core/reformat.test.js +29 -0
- package/dist/core/reformat.test.js.map +1 -0
- package/dist/core/reorder.d.ts +42 -0
- package/dist/core/reorder.d.ts.map +1 -0
- package/dist/core/reorder.js +80 -0
- package/dist/core/reorder.js.map +1 -0
- package/dist/core/reorder.test.d.ts +2 -0
- package/dist/core/reorder.test.d.ts.map +1 -0
- package/dist/core/reorder.test.js +88 -0
- package/dist/core/reorder.test.js.map +1 -0
- package/dist/core/review.d.ts +38 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +128 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/review.test.d.ts +2 -0
- package/dist/core/review.test.d.ts.map +1 -0
- package/dist/core/review.test.js +76 -0
- package/dist/core/review.test.js.map +1 -0
- package/dist/core/sessions.d.ts +40 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +61 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/sfx-on-cuts.d.ts +60 -0
- package/dist/core/sfx-on-cuts.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.js +90 -0
- package/dist/core/sfx-on-cuts.js.map +1 -0
- package/dist/core/sfx-on-cuts.test.d.ts +2 -0
- package/dist/core/sfx-on-cuts.test.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.test.js +53 -0
- package/dist/core/sfx-on-cuts.test.js.map +1 -0
- package/dist/core/silence.d.ts +41 -0
- package/dist/core/silence.d.ts.map +1 -0
- package/dist/core/silence.js +104 -0
- package/dist/core/silence.js.map +1 -0
- package/dist/core/silence.test.d.ts +2 -0
- package/dist/core/silence.test.d.ts.map +1 -0
- package/dist/core/silence.test.js +143 -0
- package/dist/core/silence.test.js.map +1 -0
- package/dist/core/skills-loader.d.ts +34 -0
- package/dist/core/skills-loader.d.ts.map +1 -0
- package/dist/core/skills-loader.js +80 -0
- package/dist/core/skills-loader.js.map +1 -0
- package/dist/core/skills-loader.test.d.ts +2 -0
- package/dist/core/skills-loader.test.d.ts.map +1 -0
- package/dist/core/skills-loader.test.js +68 -0
- package/dist/core/skills-loader.test.js.map +1 -0
- package/dist/core/skin-grade.d.ts +62 -0
- package/dist/core/skin-grade.d.ts.map +1 -0
- package/dist/core/skin-grade.js +270 -0
- package/dist/core/skin-grade.js.map +1 -0
- package/dist/core/skin-grade.test.d.ts +2 -0
- package/dist/core/skin-grade.test.d.ts.map +1 -0
- package/dist/core/skin-grade.test.js +182 -0
- package/dist/core/skin-grade.test.js.map +1 -0
- package/dist/core/speaker-changes.d.ts +30 -0
- package/dist/core/speaker-changes.d.ts.map +1 -0
- package/dist/core/speaker-changes.js +19 -0
- package/dist/core/speaker-changes.js.map +1 -0
- package/dist/core/speaker-changes.test.d.ts +2 -0
- package/dist/core/speaker-changes.test.d.ts.map +1 -0
- package/dist/core/speaker-changes.test.js +46 -0
- package/dist/core/speaker-changes.test.js.map +1 -0
- package/dist/core/speed-ramp.d.ts +60 -0
- package/dist/core/speed-ramp.d.ts.map +1 -0
- package/dist/core/speed-ramp.js +113 -0
- package/dist/core/speed-ramp.js.map +1 -0
- package/dist/core/speed-ramp.test.d.ts +2 -0
- package/dist/core/speed-ramp.test.d.ts.map +1 -0
- package/dist/core/speed-ramp.test.js +74 -0
- package/dist/core/speed-ramp.test.js.map +1 -0
- package/dist/core/srt.d.ts +56 -0
- package/dist/core/srt.d.ts.map +1 -0
- package/dist/core/srt.js +90 -0
- package/dist/core/srt.js.map +1 -0
- package/dist/core/srt.test.d.ts +2 -0
- package/dist/core/srt.test.d.ts.map +1 -0
- package/dist/core/srt.test.js +107 -0
- package/dist/core/srt.test.js.map +1 -0
- package/dist/core/stabilize.d.ts +15 -0
- package/dist/core/stabilize.d.ts.map +1 -0
- package/dist/core/stabilize.js +69 -0
- package/dist/core/stabilize.js.map +1 -0
- package/dist/core/styles-loader.d.ts +33 -0
- package/dist/core/styles-loader.d.ts.map +1 -0
- package/dist/core/styles-loader.js +67 -0
- package/dist/core/styles-loader.js.map +1 -0
- package/dist/core/styles-loader.test.d.ts +2 -0
- package/dist/core/styles-loader.test.d.ts.map +1 -0
- package/dist/core/styles-loader.test.js +72 -0
- package/dist/core/styles-loader.test.js.map +1 -0
- package/dist/core/text-overlay.d.ts +76 -0
- package/dist/core/text-overlay.d.ts.map +1 -0
- package/dist/core/text-overlay.js +233 -0
- package/dist/core/text-overlay.js.map +1 -0
- package/dist/core/text-overlay.test.d.ts +2 -0
- package/dist/core/text-overlay.test.d.ts.map +1 -0
- package/dist/core/text-overlay.test.js +103 -0
- package/dist/core/text-overlay.test.js.map +1 -0
- package/dist/core/vision.d.ts +53 -0
- package/dist/core/vision.d.ts.map +1 -0
- package/dist/core/vision.js +150 -0
- package/dist/core/vision.js.map +1 -0
- package/dist/core/vision.test.d.ts +2 -0
- package/dist/core/vision.test.d.ts.map +1 -0
- package/dist/core/vision.test.js +76 -0
- package/dist/core/vision.test.js.map +1 -0
- package/dist/core/whisper.d.ts +188 -0
- package/dist/core/whisper.d.ts.map +1 -0
- package/dist/core/whisper.js +380 -0
- package/dist/core/whisper.js.map +1 -0
- package/dist/core/whisper.test.d.ts +2 -0
- package/dist/core/whisper.test.d.ts.map +1 -0
- package/dist/core/whisper.test.js +262 -0
- package/dist/core/whisper.test.js.map +1 -0
- package/dist/director/delegate-tool.d.ts +22 -0
- package/dist/director/delegate-tool.d.ts.map +1 -0
- package/dist/director/delegate-tool.js +62 -0
- package/dist/director/delegate-tool.js.map +1 -0
- package/dist/director/delegate-tool.test.d.ts +2 -0
- package/dist/director/delegate-tool.test.d.ts.map +1 -0
- package/dist/director/delegate-tool.test.js +38 -0
- package/dist/director/delegate-tool.test.js.map +1 -0
- package/dist/director/director-prompt.d.ts +7 -0
- package/dist/director/director-prompt.d.ts.map +1 -0
- package/dist/director/director-prompt.js +52 -0
- package/dist/director/director-prompt.js.map +1 -0
- package/dist/director/director.d.ts +16 -0
- package/dist/director/director.d.ts.map +1 -0
- package/dist/director/director.js +28 -0
- package/dist/director/director.js.map +1 -0
- package/dist/director/executor.d.ts +19 -0
- package/dist/director/executor.d.ts.map +1 -0
- package/dist/director/executor.js +93 -0
- package/dist/director/executor.js.map +1 -0
- package/dist/director/index.d.ts +6 -0
- package/dist/director/index.d.ts.map +1 -0
- package/dist/director/index.js +5 -0
- package/dist/director/index.js.map +1 -0
- package/dist/director/types.d.ts +38 -0
- package/dist/director/types.d.ts.map +1 -0
- package/dist/director/types.js +2 -0
- package/dist/director/types.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/skills.d.ts +18 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +674 -0
- package/dist/skills.js.map +1 -0
- package/dist/system-prompt.d.ts +35 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +478 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/system-prompt.test.d.ts +2 -0
- package/dist/system-prompt.test.d.ts.map +1 -0
- package/dist/system-prompt.test.js +87 -0
- package/dist/system-prompt.test.js.map +1 -0
- package/dist/tools/add-fades.d.ts +13 -0
- package/dist/tools/add-fades.d.ts.map +1 -0
- package/dist/tools/add-fades.js +88 -0
- package/dist/tools/add-fades.js.map +1 -0
- package/dist/tools/add-marker.d.ts +31 -0
- package/dist/tools/add-marker.d.ts.map +1 -0
- package/dist/tools/add-marker.js +56 -0
- package/dist/tools/add-marker.js.map +1 -0
- package/dist/tools/add-sfx-at-cuts.d.ts +24 -0
- package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -0
- package/dist/tools/add-sfx-at-cuts.js +120 -0
- package/dist/tools/add-sfx-at-cuts.js.map +1 -0
- package/dist/tools/add-track.d.ts +13 -0
- package/dist/tools/add-track.d.ts.map +1 -0
- package/dist/tools/add-track.js +26 -0
- package/dist/tools/add-track.js.map +1 -0
- package/dist/tools/analyze-hook.d.ts +28 -0
- package/dist/tools/analyze-hook.d.ts.map +1 -0
- package/dist/tools/analyze-hook.js +126 -0
- package/dist/tools/analyze-hook.js.map +1 -0
- package/dist/tools/append-clip.d.ts +10 -0
- package/dist/tools/append-clip.d.ts.map +1 -0
- package/dist/tools/append-clip.js +27 -0
- package/dist/tools/append-clip.js.map +1 -0
- package/dist/tools/apply-lut.d.ts +11 -0
- package/dist/tools/apply-lut.d.ts.map +1 -0
- package/dist/tools/apply-lut.js +33 -0
- package/dist/tools/apply-lut.js.map +1 -0
- package/dist/tools/burn-subtitles.d.ts +28 -0
- package/dist/tools/burn-subtitles.d.ts.map +1 -0
- package/dist/tools/burn-subtitles.js +87 -0
- package/dist/tools/burn-subtitles.js.map +1 -0
- package/dist/tools/clean-audio.d.ts +18 -0
- package/dist/tools/clean-audio.d.ts.map +1 -0
- package/dist/tools/clean-audio.js +54 -0
- package/dist/tools/clean-audio.js.map +1 -0
- package/dist/tools/clone-timeline.d.ts +9 -0
- package/dist/tools/clone-timeline.d.ts.map +1 -0
- package/dist/tools/clone-timeline.js +28 -0
- package/dist/tools/clone-timeline.js.map +1 -0
- package/dist/tools/cluster-takes.d.ts +11 -0
- package/dist/tools/cluster-takes.d.ts.map +1 -0
- package/dist/tools/cluster-takes.js +71 -0
- package/dist/tools/cluster-takes.js.map +1 -0
- package/dist/tools/color-match.d.ts +16 -0
- package/dist/tools/color-match.d.ts.map +1 -0
- package/dist/tools/color-match.js +55 -0
- package/dist/tools/color-match.js.map +1 -0
- package/dist/tools/compose-layered.d.ts +47 -0
- package/dist/tools/compose-layered.d.ts.map +1 -0
- package/dist/tools/compose-layered.js +103 -0
- package/dist/tools/compose-layered.js.map +1 -0
- package/dist/tools/compose-thumbnail.d.ts +35 -0
- package/dist/tools/compose-thumbnail.d.ts.map +1 -0
- package/dist/tools/compose-thumbnail.js +130 -0
- package/dist/tools/compose-thumbnail.js.map +1 -0
- package/dist/tools/concat-videos.d.ts +18 -0
- package/dist/tools/concat-videos.d.ts.map +1 -0
- package/dist/tools/concat-videos.js +79 -0
- package/dist/tools/concat-videos.js.map +1 -0
- package/dist/tools/copy-grade.d.ts +10 -0
- package/dist/tools/copy-grade.d.ts.map +1 -0
- package/dist/tools/copy-grade.js +29 -0
- package/dist/tools/copy-grade.js.map +1 -0
- package/dist/tools/create-timeline.d.ts +12 -0
- package/dist/tools/create-timeline.d.ts.map +1 -0
- package/dist/tools/create-timeline.js +35 -0
- package/dist/tools/create-timeline.js.map +1 -0
- package/dist/tools/crossfade-videos.d.ts +49 -0
- package/dist/tools/crossfade-videos.d.ts.map +1 -0
- package/dist/tools/crossfade-videos.js +121 -0
- package/dist/tools/crossfade-videos.js.map +1 -0
- package/dist/tools/cut-at.d.ts +10 -0
- package/dist/tools/cut-at.d.ts.map +1 -0
- package/dist/tools/cut-at.js +24 -0
- package/dist/tools/cut-at.js.map +1 -0
- package/dist/tools/cut-filler-words.d.ts +27 -0
- package/dist/tools/cut-filler-words.d.ts.map +1 -0
- package/dist/tools/cut-filler-words.js +165 -0
- package/dist/tools/cut-filler-words.js.map +1 -0
- package/dist/tools/detect-silence.d.ts +13 -0
- package/dist/tools/detect-silence.d.ts.map +1 -0
- package/dist/tools/detect-silence.js +98 -0
- package/dist/tools/detect-silence.js.map +1 -0
- package/dist/tools/detect-speaker-changes.d.ts +9 -0
- package/dist/tools/detect-speaker-changes.d.ts.map +1 -0
- package/dist/tools/detect-speaker-changes.js +42 -0
- package/dist/tools/detect-speaker-changes.js.map +1 -0
- package/dist/tools/dry-run.d.ts +23 -0
- package/dist/tools/dry-run.d.ts.map +1 -0
- package/dist/tools/dry-run.js +66 -0
- package/dist/tools/dry-run.js.map +1 -0
- package/dist/tools/dry-run.test.d.ts +2 -0
- package/dist/tools/dry-run.test.d.ts.map +1 -0
- package/dist/tools/dry-run.test.js +66 -0
- package/dist/tools/dry-run.test.js.map +1 -0
- package/dist/tools/duck-audio.d.ts +16 -0
- package/dist/tools/duck-audio.d.ts.map +1 -0
- package/dist/tools/duck-audio.js +73 -0
- package/dist/tools/duck-audio.js.map +1 -0
- package/dist/tools/extract-audio.d.ts +10 -0
- package/dist/tools/extract-audio.d.ts.map +1 -0
- package/dist/tools/extract-audio.js +30 -0
- package/dist/tools/extract-audio.js.map +1 -0
- package/dist/tools/extract-frame.d.ts +12 -0
- package/dist/tools/extract-frame.d.ts.map +1 -0
- package/dist/tools/extract-frame.js +63 -0
- package/dist/tools/extract-frame.js.map +1 -0
- package/dist/tools/generate-gif.d.ts +13 -0
- package/dist/tools/generate-gif.d.ts.map +1 -0
- package/dist/tools/generate-gif.js +94 -0
- package/dist/tools/generate-gif.js.map +1 -0
- package/dist/tools/get-markers.d.ts +13 -0
- package/dist/tools/get-markers.d.ts.map +1 -0
- package/dist/tools/get-markers.js +71 -0
- package/dist/tools/get-markers.js.map +1 -0
- package/dist/tools/get-timeline.d.ts +9 -0
- package/dist/tools/get-timeline.d.ts.map +1 -0
- package/dist/tools/get-timeline.js +43 -0
- package/dist/tools/get-timeline.js.map +1 -0
- package/dist/tools/grade-skin-tones.d.ts +31 -0
- package/dist/tools/grade-skin-tones.d.ts.map +1 -0
- package/dist/tools/grade-skin-tones.js +92 -0
- package/dist/tools/grade-skin-tones.js.map +1 -0
- package/dist/tools/host-info.d.ts +7 -0
- package/dist/tools/host-info.d.ts.map +1 -0
- package/dist/tools/host-info.js +33 -0
- package/dist/tools/host-info.js.map +1 -0
- package/dist/tools/host-tools.test.d.ts +2 -0
- package/dist/tools/host-tools.test.d.ts.map +1 -0
- package/dist/tools/host-tools.test.js +83 -0
- package/dist/tools/host-tools.test.js.map +1 -0
- package/dist/tools/import-edl.d.ts +9 -0
- package/dist/tools/import-edl.d.ts.map +1 -0
- package/dist/tools/import-edl.js +25 -0
- package/dist/tools/import-edl.js.map +1 -0
- package/dist/tools/import-subtitles.d.ts +9 -0
- package/dist/tools/import-subtitles.d.ts.map +1 -0
- package/dist/tools/import-subtitles.js +31 -0
- package/dist/tools/import-subtitles.js.map +1 -0
- package/dist/tools/import-to-media-pool.d.ts +10 -0
- package/dist/tools/import-to-media-pool.d.ts.map +1 -0
- package/dist/tools/import-to-media-pool.js +27 -0
- package/dist/tools/import-to-media-pool.js.map +1 -0
- package/dist/tools/index.d.ts +94 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +242 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +128 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/insert-broll.d.ts +13 -0
- package/dist/tools/insert-broll.d.ts.map +1 -0
- package/dist/tools/insert-broll.js +56 -0
- package/dist/tools/insert-broll.js.map +1 -0
- package/dist/tools/ken-burns.d.ts +26 -0
- package/dist/tools/ken-burns.d.ts.map +1 -0
- package/dist/tools/ken-burns.js +125 -0
- package/dist/tools/ken-burns.js.map +1 -0
- package/dist/tools/list-render-presets.d.ts +7 -0
- package/dist/tools/list-render-presets.d.ts.map +1 -0
- package/dist/tools/list-render-presets.js +30 -0
- package/dist/tools/list-render-presets.js.map +1 -0
- package/dist/tools/match-clip-color.d.ts +29 -0
- package/dist/tools/match-clip-color.d.ts.map +1 -0
- package/dist/tools/match-clip-color.js +99 -0
- package/dist/tools/match-clip-color.js.map +1 -0
- package/dist/tools/measure-loudness.d.ts +8 -0
- package/dist/tools/measure-loudness.d.ts.map +1 -0
- package/dist/tools/measure-loudness.js +40 -0
- package/dist/tools/measure-loudness.js.map +1 -0
- package/dist/tools/mix-audio.d.ts +46 -0
- package/dist/tools/mix-audio.d.ts.map +1 -0
- package/dist/tools/mix-audio.js +101 -0
- package/dist/tools/mix-audio.js.map +1 -0
- package/dist/tools/multicam-sync.d.ts +14 -0
- package/dist/tools/multicam-sync.d.ts.map +1 -0
- package/dist/tools/multicam-sync.js +75 -0
- package/dist/tools/multicam-sync.js.map +1 -0
- package/dist/tools/new-tools.test.d.ts +2 -0
- package/dist/tools/new-tools.test.d.ts.map +1 -0
- package/dist/tools/new-tools.test.js +511 -0
- package/dist/tools/new-tools.test.js.map +1 -0
- package/dist/tools/normalize-loudness.d.ts +21 -0
- package/dist/tools/normalize-loudness.d.ts.map +1 -0
- package/dist/tools/normalize-loudness.js +94 -0
- package/dist/tools/normalize-loudness.js.map +1 -0
- package/dist/tools/open-page.d.ts +17 -0
- package/dist/tools/open-page.d.ts.map +1 -0
- package/dist/tools/open-page.js +27 -0
- package/dist/tools/open-page.js.map +1 -0
- package/dist/tools/overlay-watermark.d.ts +28 -0
- package/dist/tools/overlay-watermark.d.ts.map +1 -0
- package/dist/tools/overlay-watermark.js +98 -0
- package/dist/tools/overlay-watermark.js.map +1 -0
- package/dist/tools/pick-best-takes.d.ts +20 -0
- package/dist/tools/pick-best-takes.d.ts.map +1 -0
- package/dist/tools/pick-best-takes.js +147 -0
- package/dist/tools/pick-best-takes.js.map +1 -0
- package/dist/tools/post-tools.test.d.ts +2 -0
- package/dist/tools/post-tools.test.d.ts.map +1 -0
- package/dist/tools/post-tools.test.js +83 -0
- package/dist/tools/post-tools.test.js.map +1 -0
- package/dist/tools/pre-render-check.d.ts +23 -0
- package/dist/tools/pre-render-check.d.ts.map +1 -0
- package/dist/tools/pre-render-check.js +134 -0
- package/dist/tools/pre-render-check.js.map +1 -0
- package/dist/tools/probe-media.d.ts +8 -0
- package/dist/tools/probe-media.d.ts.map +1 -0
- package/dist/tools/probe-media.js +32 -0
- package/dist/tools/probe-media.js.map +1 -0
- package/dist/tools/punch-in.d.ts +30 -0
- package/dist/tools/punch-in.d.ts.map +1 -0
- package/dist/tools/punch-in.js +130 -0
- package/dist/tools/punch-in.js.map +1 -0
- package/dist/tools/read-skill.d.ts +9 -0
- package/dist/tools/read-skill.d.ts.map +1 -0
- package/dist/tools/read-skill.js +24 -0
- package/dist/tools/read-skill.js.map +1 -0
- package/dist/tools/read-transcript.d.ts +14 -0
- package/dist/tools/read-transcript.d.ts.map +1 -0
- package/dist/tools/read-transcript.js +85 -0
- package/dist/tools/read-transcript.js.map +1 -0
- package/dist/tools/read-transcript.test.d.ts +2 -0
- package/dist/tools/read-transcript.test.d.ts.map +1 -0
- package/dist/tools/read-transcript.test.js +136 -0
- package/dist/tools/read-transcript.test.js.map +1 -0
- package/dist/tools/reformat-timeline.d.ts +25 -0
- package/dist/tools/reformat-timeline.d.ts.map +1 -0
- package/dist/tools/reformat-timeline.js +60 -0
- package/dist/tools/reformat-timeline.js.map +1 -0
- package/dist/tools/render.d.ts +10 -0
- package/dist/tools/render.d.ts.map +1 -0
- package/dist/tools/render.js +26 -0
- package/dist/tools/render.js.map +1 -0
- package/dist/tools/reorder-timeline.d.ts +12 -0
- package/dist/tools/reorder-timeline.d.ts.map +1 -0
- package/dist/tools/reorder-timeline.js +65 -0
- package/dist/tools/reorder-timeline.js.map +1 -0
- package/dist/tools/replace-clip.d.ts +10 -0
- package/dist/tools/replace-clip.d.ts.map +1 -0
- package/dist/tools/replace-clip.js +28 -0
- package/dist/tools/replace-clip.js.map +1 -0
- package/dist/tools/review-edit.d.ts +23 -0
- package/dist/tools/review-edit.d.ts.map +1 -0
- package/dist/tools/review-edit.js +47 -0
- package/dist/tools/review-edit.js.map +1 -0
- package/dist/tools/ripple-delete.d.ts +11 -0
- package/dist/tools/ripple-delete.d.ts.map +1 -0
- package/dist/tools/ripple-delete.js +27 -0
- package/dist/tools/ripple-delete.js.map +1 -0
- package/dist/tools/save-project.d.ts +7 -0
- package/dist/tools/save-project.d.ts.map +1 -0
- package/dist/tools/save-project.js +22 -0
- package/dist/tools/save-project.js.map +1 -0
- package/dist/tools/score-shot.d.ts +18 -0
- package/dist/tools/score-shot.d.ts.map +1 -0
- package/dist/tools/score-shot.js +127 -0
- package/dist/tools/score-shot.js.map +1 -0
- package/dist/tools/set-clip-speed.d.ts +10 -0
- package/dist/tools/set-clip-speed.d.ts.map +1 -0
- package/dist/tools/set-clip-speed.js +28 -0
- package/dist/tools/set-clip-speed.js.map +1 -0
- package/dist/tools/set-clip-volume.d.ts +10 -0
- package/dist/tools/set-clip-volume.d.ts.map +1 -0
- package/dist/tools/set-clip-volume.js +33 -0
- package/dist/tools/set-clip-volume.js.map +1 -0
- package/dist/tools/set-primary-correction.d.ts +14 -0
- package/dist/tools/set-primary-correction.d.ts.map +1 -0
- package/dist/tools/set-primary-correction.js +45 -0
- package/dist/tools/set-primary-correction.js.map +1 -0
- package/dist/tools/smart-reframe.d.ts +22 -0
- package/dist/tools/smart-reframe.d.ts.map +1 -0
- package/dist/tools/smart-reframe.js +39 -0
- package/dist/tools/smart-reframe.js.map +1 -0
- package/dist/tools/speed-ramp.d.ts +14 -0
- package/dist/tools/speed-ramp.d.ts.map +1 -0
- package/dist/tools/speed-ramp.js +71 -0
- package/dist/tools/speed-ramp.js.map +1 -0
- package/dist/tools/stabilize-video.d.ts +12 -0
- package/dist/tools/stabilize-video.d.ts.map +1 -0
- package/dist/tools/stabilize-video.js +63 -0
- package/dist/tools/stabilize-video.js.map +1 -0
- package/dist/tools/transcribe.d.ts +29 -0
- package/dist/tools/transcribe.d.ts.map +1 -0
- package/dist/tools/transcribe.js +116 -0
- package/dist/tools/transcribe.js.map +1 -0
- package/dist/tools/transition-videos.d.ts +29 -0
- package/dist/tools/transition-videos.d.ts.map +1 -0
- package/dist/tools/transition-videos.js +129 -0
- package/dist/tools/transition-videos.js.map +1 -0
- package/dist/tools/write-ass.d.ts +34 -0
- package/dist/tools/write-ass.d.ts.map +1 -0
- package/dist/tools/write-ass.js +101 -0
- package/dist/tools/write-ass.js.map +1 -0
- package/dist/tools/write-edl.d.ts +24 -0
- package/dist/tools/write-edl.d.ts.map +1 -0
- package/dist/tools/write-edl.js +59 -0
- package/dist/tools/write-edl.js.map +1 -0
- package/dist/tools/write-fcpxml.d.ts +20 -0
- package/dist/tools/write-fcpxml.d.ts.map +1 -0
- package/dist/tools/write-fcpxml.js +52 -0
- package/dist/tools/write-fcpxml.js.map +1 -0
- package/dist/tools/write-keyword-captions.d.ts +36 -0
- package/dist/tools/write-keyword-captions.d.ts.map +1 -0
- package/dist/tools/write-keyword-captions.js +183 -0
- package/dist/tools/write-keyword-captions.js.map +1 -0
- package/dist/tools/write-lower-third.d.ts +34 -0
- package/dist/tools/write-lower-third.d.ts.map +1 -0
- package/dist/tools/write-lower-third.js +52 -0
- package/dist/tools/write-lower-third.js.map +1 -0
- package/dist/tools/write-srt.d.ts +20 -0
- package/dist/tools/write-srt.d.ts.map +1 -0
- package/dist/tools/write-srt.js +72 -0
- package/dist/tools/write-srt.js.map +1 -0
- package/dist/tools/write-title-card.d.ts +25 -0
- package/dist/tools/write-title-card.d.ts.map +1 -0
- package/dist/tools/write-title-card.js +57 -0
- package/dist/tools/write-title-card.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +44 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +454 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +13 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +59 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +19 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +20 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/Header.d.ts +16 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +12 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/InputBox.d.ts +21 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -0
- package/dist/ui/components/InputBox.js +81 -0
- package/dist/ui/components/InputBox.js.map +1 -0
- package/dist/ui/components/Message.d.ts +14 -0
- package/dist/ui/components/Message.d.ts.map +1 -0
- package/dist/ui/components/Message.js +24 -0
- package/dist/ui/components/Message.js.map +1 -0
- package/dist/ui/components/SlashMenu.d.ts +19 -0
- package/dist/ui/components/SlashMenu.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.js +33 -0
- package/dist/ui/components/SlashMenu.js.map +1 -0
- package/dist/ui/components/SlashMenu.test.d.ts +2 -0
- package/dist/ui/components/SlashMenu.test.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.test.js +23 -0
- package/dist/ui/components/SlashMenu.test.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +6 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +16 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/ToolCallLine.d.ts +16 -0
- package/dist/ui/components/ToolCallLine.d.ts.map +1 -0
- package/dist/ui/components/ToolCallLine.js +35 -0
- package/dist/ui/components/ToolCallLine.js.map +1 -0
- package/dist/ui/render.d.ts +9 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +56 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/spinner-frames.d.ts +3 -0
- package/dist/ui/spinner-frames.d.ts.map +1 -0
- package/dist/ui/spinner-frames.js +16 -0
- package/dist/ui/spinner-frames.js.map +1 -0
- package/dist/ui/theme.d.ts +27 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +26 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +50 -0
package/dist/skills.js
ADDED
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled skill markdowns. Embedded as TS string constants so they ship in the
|
|
3
|
+
* compiled package without depending on disk layout. Authored in
|
|
4
|
+
* src/skills/*.md — regenerate this file by running `node build-skills.mjs`
|
|
5
|
+
* from the package root if you edit the source markdowns.
|
|
6
|
+
*
|
|
7
|
+
* Skills are exposed through the read_skill tool; their descriptions live in
|
|
8
|
+
* the system prompt. Pattern follows the Anthropic skills convention:
|
|
9
|
+
* description in the prompt, full content on demand.
|
|
10
|
+
*/
|
|
11
|
+
const LONG_FORM_CONTENT_EDIT = `# long-form-content-edit
|
|
12
|
+
|
|
13
|
+
**When to use:** podcasts, interviews, vlogs, courses, talking-head — anything
|
|
14
|
+
where a person speaks for >5 minutes and the editorial work is take-selection,
|
|
15
|
+
filler removal, silence trimming, and pacing.
|
|
16
|
+
|
|
17
|
+
**Goal:** turn a raw recording into a tight, watchable cut without losing the
|
|
18
|
+
speaker's voice or the moments that matter. Captions are non-negotiable.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## The 5-pass method
|
|
23
|
+
|
|
24
|
+
These run in order. Each pass narrows the cut. Don't skip — passes 1–2 are
|
|
25
|
+
where 80% of the time savings live.
|
|
26
|
+
|
|
27
|
+
### Pass 1 — Utterance segmentation
|
|
28
|
+
|
|
29
|
+
\`\`\`
|
|
30
|
+
probe_media(input) → fps, duration
|
|
31
|
+
extract_audio(input, audio.wav, 16000)
|
|
32
|
+
transcribe(audio.wav, transcript.json) → segment-level transcript
|
|
33
|
+
\`\`\`
|
|
34
|
+
|
|
35
|
+
Now you have a segment list keyed by start/end seconds. Treat each segment as
|
|
36
|
+
the smallest editorial unit. Don't cut inside a segment unless the speaker
|
|
37
|
+
changes mid-segment.
|
|
38
|
+
|
|
39
|
+
### Pass 2 — Take detection
|
|
40
|
+
|
|
41
|
+
\`\`\`
|
|
42
|
+
cluster_takes(transcript.json) → groups of similar segments
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
Multi-member clusters mean the speaker re-took a line. Pick the winner per
|
|
46
|
+
cluster:
|
|
47
|
+
|
|
48
|
+
- **Default to the last take** — speaker had practice.
|
|
49
|
+
- **Visual doubt** → \`score_shot(times=[mid of each member])\`, pick highest.
|
|
50
|
+
- **Audio doubt** → \`read_transcript(startSec=A, endSec=B)\` to inspect.
|
|
51
|
+
- Add a marker on each decision: \`add_marker(color="green", note="kept: take 3 of 3 — strongest delivery")\`.
|
|
52
|
+
|
|
53
|
+
### Pass 3 — Filler removal
|
|
54
|
+
|
|
55
|
+
For each kept segment, look for these and add cut markers:
|
|
56
|
+
|
|
57
|
+
- "um", "uh", "like" used as filler (not as comparison)
|
|
58
|
+
- restart phrases: "so the thing is — actually, the thing is…"
|
|
59
|
+
- mid-sentence aborts the speaker self-corrected past
|
|
60
|
+
|
|
61
|
+
Mark each one with \`add_marker(color="red", note="cut: filler 'um'")\`.
|
|
62
|
+
|
|
63
|
+
### Pass 4 — Incomplete-sentence trim
|
|
64
|
+
|
|
65
|
+
Drop segments that:
|
|
66
|
+
|
|
67
|
+
- Trail off with no point ("…and yeah, anyway")
|
|
68
|
+
- Start mid-thought because the previous take was kept
|
|
69
|
+
- Repeat content already covered in a kept take
|
|
70
|
+
|
|
71
|
+
\`add_marker(color="red", note="cut: incomplete; covered in earlier take")\`.
|
|
72
|
+
|
|
73
|
+
### Pass 5 — Silence normalization
|
|
74
|
+
|
|
75
|
+
\`\`\`
|
|
76
|
+
detect_silence(input) → frame-aligned KEEP ranges
|
|
77
|
+
\`\`\`
|
|
78
|
+
|
|
79
|
+
Use the KEEP ranges to remove dead air >1s. Don't kill all silence —
|
|
80
|
+
breathing space matters for pacing. The default threshold usually leaves
|
|
81
|
+
natural pauses intact.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Final assembly
|
|
86
|
+
|
|
87
|
+
Combine pass-2 winners + pass-3/4 surviving segments into a single decision
|
|
88
|
+
list. Each entry is one EDL event.
|
|
89
|
+
|
|
90
|
+
\`\`\`
|
|
91
|
+
write_edl(events=decisions, frameRate=fps)
|
|
92
|
+
import_edl(path)
|
|
93
|
+
\`\`\`
|
|
94
|
+
|
|
95
|
+
Then captions:
|
|
96
|
+
|
|
97
|
+
\`\`\`
|
|
98
|
+
write_srt(cues=transcript.segments mapped to start/end/text)
|
|
99
|
+
import_subtitles(srtPath)
|
|
100
|
+
\`\`\`
|
|
101
|
+
|
|
102
|
+
For long-form: sidecar SRT (don't burn in) so YouTube/podcast players can
|
|
103
|
+
toggle them. Mention this to the user.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Red flags — pause and ask
|
|
108
|
+
|
|
109
|
+
- Cluster has takes that are roughly equal quality — \`add_marker(color="red", note="PAUSE: which take? 1=A, 2=B")\` and stop.
|
|
110
|
+
- Segment is editorial-content-bearing but has bad audio — flag, don't drop.
|
|
111
|
+
- The user said "trim filler" but every "um" is intentional emphasis (rare but real) — confirm.
|
|
112
|
+
|
|
113
|
+
## Don't
|
|
114
|
+
|
|
115
|
+
- Don't render until the user reviews the markers.
|
|
116
|
+
- Don't read full transcript without \`startSec/endSec\` — context blow-up.
|
|
117
|
+
- Don't cut inside a segment unless the speaker changes mid-segment.
|
|
118
|
+
- Don't skip captions for long-form unless explicitly told to.
|
|
119
|
+
`;
|
|
120
|
+
const SHORT_FORM_CONTENT_EDIT = `# short-form-content-edit
|
|
121
|
+
|
|
122
|
+
**When to use:** TikTok / Reels / Shorts / vertical clips. Source is usually
|
|
123
|
+
a longer horizontal video the user wants reframed, captioned, hooked, and
|
|
124
|
+
shipped.
|
|
125
|
+
|
|
126
|
+
**Goal:** the first 2 seconds win or lose retention. The cut, the caption,
|
|
127
|
+
and the hook all serve that one number.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Recipe
|
|
132
|
+
|
|
133
|
+
### 1. Find the moment
|
|
134
|
+
|
|
135
|
+
If the user gives you a horizontal video without timestamps, find the moment
|
|
136
|
+
worth clipping:
|
|
137
|
+
|
|
138
|
+
\`\`\`
|
|
139
|
+
probe_media(input)
|
|
140
|
+
extract_audio(input, audio.wav, 16000)
|
|
141
|
+
transcribe(audio.wav, transcript.json)
|
|
142
|
+
read_transcript(transcript.json, contains="<keyword from user>")
|
|
143
|
+
\`\`\`
|
|
144
|
+
|
|
145
|
+
Or for visual moments: \`score_shot(input, intervalSec=15)\` then inspect tops.
|
|
146
|
+
|
|
147
|
+
Settle on a \`[startSec, endSec]\` window. Aim for **15–60 seconds** for shorts;
|
|
148
|
+
90s max for Reels.
|
|
149
|
+
|
|
150
|
+
### 2. Reformat to vertical
|
|
151
|
+
|
|
152
|
+
Build the vertical timeline as FCPXML and import:
|
|
153
|
+
|
|
154
|
+
\`\`\`
|
|
155
|
+
reformat_timeline(
|
|
156
|
+
output="vertical.fcpxml",
|
|
157
|
+
preset="9:16",
|
|
158
|
+
title="<short name>",
|
|
159
|
+
frameRate=<source fps>,
|
|
160
|
+
events=[{ reel, sourcePath, sourceInFrame, sourceOutFrame }]
|
|
161
|
+
)
|
|
162
|
+
import_edl("vertical.fcpxml")
|
|
163
|
+
\`\`\`
|
|
164
|
+
|
|
165
|
+
Then on Resolve Studio, switch to color page and prompt the user to apply
|
|
166
|
+
Smart Reframe per clip:
|
|
167
|
+
|
|
168
|
+
\`\`\`
|
|
169
|
+
open_page("color")
|
|
170
|
+
add_marker(color="yellow", note="apply Smart Reframe per clip (Resolve Studio: right-click clip → Smart Reframe)")
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
Premiere users: prompt for Auto Reframe via the captions/effects panel.
|
|
174
|
+
|
|
175
|
+
### 3. Hook the first 2 seconds
|
|
176
|
+
|
|
177
|
+
The hook lives in the first 60 frames. Options:
|
|
178
|
+
|
|
179
|
+
- **Cold-open the punchline** — start at the most attention-grabbing line,
|
|
180
|
+
not the setup. Use \`read_transcript\` to find it.
|
|
181
|
+
- **Speed-up the intro** — \`set_clip_speed(clipId, speed=1.5)\` on the opening clip.
|
|
182
|
+
- **Pre-roll text/marker** — \`add_marker(color="yellow", note="add hook text overlay: '<line from transcript>'")\` for the user to add.
|
|
183
|
+
|
|
184
|
+
### 4. Burned-in captions
|
|
185
|
+
|
|
186
|
+
Vertical = burned-in (most viewers watch muted, native captions are tiny).
|
|
187
|
+
|
|
188
|
+
\`\`\`
|
|
189
|
+
write_srt(cues=transcript.segments_in_window)
|
|
190
|
+
import_subtitles(srtPath)
|
|
191
|
+
add_marker(color="yellow", note="style captions: large, center-bottom, high-contrast — burn in via Resolve subtitle track styling")
|
|
192
|
+
\`\`\`
|
|
193
|
+
|
|
194
|
+
If the user is on Resolve Studio, they can right-click the subtitle track →
|
|
195
|
+
"Convert Subtitles to Text+" and style it. Note this to them.
|
|
196
|
+
|
|
197
|
+
### 5. Render
|
|
198
|
+
|
|
199
|
+
Don't render until the user reviews. When they say "render":
|
|
200
|
+
|
|
201
|
+
\`\`\`
|
|
202
|
+
render(preset=<host preset>, output="<name>.mp4")
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
Common presets: H.264 Master, YouTube 1080p (works for Shorts too),
|
|
206
|
+
Vimeo 1080p.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Defaults for short-form
|
|
211
|
+
|
|
212
|
+
| Knob | Default | Why |
|
|
213
|
+
|---|---|---|
|
|
214
|
+
| Aspect | 9:16 (TikTok/Reels/Shorts) | Most platforms |
|
|
215
|
+
| Length | 15–60s | Algorithm sweet spot |
|
|
216
|
+
| Captions | burned-in | Watched muted |
|
|
217
|
+
| First 2s | the hook | Retention curve |
|
|
218
|
+
| Music | not added by you | Style decision; ask the user |
|
|
219
|
+
|
|
220
|
+
## Red flags — pause and ask
|
|
221
|
+
|
|
222
|
+
- User wants 9:16 but the source has critical wide-shot framing → \`add_marker(color="red", note="PAUSE: source is composed for 16:9. 9:16 will crop heads/sides. Confirm reframe vs. letterbox.")\`.
|
|
223
|
+
- Window selection is ambiguous → propose 2–3 candidates as red markers, stop.
|
|
224
|
+
- No clear hook in the chosen window → say so, suggest a different start.
|
|
225
|
+
|
|
226
|
+
## Don't
|
|
227
|
+
|
|
228
|
+
- Don't render until the user reviews markers.
|
|
229
|
+
- Don't burn captions before the user approves the SRT text.
|
|
230
|
+
- Don't pick a hook blindly — surface options.
|
|
231
|
+
- Don't leave silence >0.4s in the first 2 seconds.
|
|
232
|
+
`;
|
|
233
|
+
const CHAPTER_MARKERS = `# chapter-markers
|
|
234
|
+
|
|
235
|
+
**When to use:** YouTube videos, podcasts, courses, long-form interviews. The
|
|
236
|
+
user wants chapter timestamps the audience can jump to.
|
|
237
|
+
|
|
238
|
+
**Goal:** derive 5–15 semantic chapter boundaries from a transcript, drop a
|
|
239
|
+
timeline marker at each one, and (optionally) emit a YouTube-formatted
|
|
240
|
+
description block.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Recipe
|
|
245
|
+
|
|
246
|
+
### 1. Get a transcript
|
|
247
|
+
|
|
248
|
+
\`\`\`
|
|
249
|
+
probe_media(input)
|
|
250
|
+
extract_audio(input, audio.wav, 16000)
|
|
251
|
+
transcribe(audio.wav, transcript.json)
|
|
252
|
+
\`\`\`
|
|
253
|
+
|
|
254
|
+
### 2. Read with topic-shift framing
|
|
255
|
+
|
|
256
|
+
DON'T dump the whole transcript. Read in 60–120 second windows and look for
|
|
257
|
+
**topic shifts** — sentences that change subject, introduce a new question,
|
|
258
|
+
move from setup to payoff, etc.
|
|
259
|
+
|
|
260
|
+
\`\`\`
|
|
261
|
+
read_transcript(transcript.json, startSec=0, endSec=120)
|
|
262
|
+
read_transcript(transcript.json, startSec=120, endSec=240)
|
|
263
|
+
...
|
|
264
|
+
\`\`\`
|
|
265
|
+
|
|
266
|
+
For each window, identify ZERO or ONE chapter start. Skip windows with no
|
|
267
|
+
clear topic boundary.
|
|
268
|
+
|
|
269
|
+
### 3. Constraints (YouTube specifics)
|
|
270
|
+
|
|
271
|
+
- First chapter MUST be \`00:00\` (YouTube's rule).
|
|
272
|
+
- Chapters must be ≥10 seconds apart.
|
|
273
|
+
- Aim for 5–15 chapters total. Fewer is fine; more crowds the scrubber.
|
|
274
|
+
- Title each chapter with **3–6 words**, plain language, no clickbait.
|
|
275
|
+
- ✅ \`"Why most edits fail"\`
|
|
276
|
+
- ❌ \`"You won't believe this insane editing tip!!"\`
|
|
277
|
+
|
|
278
|
+
### 4. Drop markers + emit description
|
|
279
|
+
|
|
280
|
+
For each chapter:
|
|
281
|
+
|
|
282
|
+
\`\`\`
|
|
283
|
+
add_marker(frame=<sec * fps>, color="purple", note="Chapter: <title>")
|
|
284
|
+
\`\`\`
|
|
285
|
+
|
|
286
|
+
Then output a YouTube-formatted block to the user as a chat message:
|
|
287
|
+
|
|
288
|
+
\`\`\`
|
|
289
|
+
00:00 Intro
|
|
290
|
+
01:42 Why most edits fail
|
|
291
|
+
04:30 The 3-pass method
|
|
292
|
+
...
|
|
293
|
+
\`\`\`
|
|
294
|
+
|
|
295
|
+
This block lives in the YouTube description; markers in the timeline help the
|
|
296
|
+
user verify before publishing.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Defaults
|
|
301
|
+
|
|
302
|
+
| Knob | Default | Why |
|
|
303
|
+
|---|---|---|
|
|
304
|
+
| Marker color | purple | Distinct from take/cut markers |
|
|
305
|
+
| Min chapter length | 30s | YouTube standard |
|
|
306
|
+
| Max chapters | 15 | Audience scrubber readability |
|
|
307
|
+
| Window size for reading | 90s | Balances context vs. token cost |
|
|
308
|
+
|
|
309
|
+
## Red flags — pause and ask
|
|
310
|
+
|
|
311
|
+
- Transcript is monologue with no clear topic shifts → tell the user; suggest
|
|
312
|
+
manual chapter input rather than fabricating boundaries.
|
|
313
|
+
- Video is <5 minutes total — chapters add noise. Tell the user; ask to skip.
|
|
314
|
+
- User wants "chapters that match my outline" without supplying one → ask for
|
|
315
|
+
the outline. Don't guess from headings in the script alone.
|
|
316
|
+
|
|
317
|
+
## Don't
|
|
318
|
+
|
|
319
|
+
- Don't invent topic boundaries to hit a target count.
|
|
320
|
+
- Don't use timestamps you didn't verify with \`read_transcript\` (including the
|
|
321
|
+
text at that timestamp). Drift kills the feature.
|
|
322
|
+
- Don't burn chapters into video — markers + description block only.
|
|
323
|
+
- Don't render until the user reviews the chapters.
|
|
324
|
+
`;
|
|
325
|
+
const KEYFRAMING_AND_TITLES = `# keyframing-and-titles
|
|
326
|
+
|
|
327
|
+
**When to use:** the user asks to reorder clips, animate fades / pans /
|
|
328
|
+
zooms, add lower-thirds or title cards, build coordinated multi-track
|
|
329
|
+
B-roll compositions, or do speed ramps.
|
|
330
|
+
|
|
331
|
+
**Goal:** these are the seven gaps neither Resolve nor Premiere exposes
|
|
332
|
+
through their scripting APIs. The agent's path is FCPXML rebuild for
|
|
333
|
+
timeline-shape changes (reorder, lanes, keyframes, titles) and
|
|
334
|
+
file-only ffmpeg passes for content-shape changes (speed ramps, mixing,
|
|
335
|
+
zoom-on-stills, transitions).
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Recipe 1 — Reorder clips on the timeline
|
|
340
|
+
|
|
341
|
+
The user says "move clip 5 to the start" or "swap clips 2 and 3".
|
|
342
|
+
|
|
343
|
+
\`\`\`
|
|
344
|
+
get_timeline # discover clipIds in order
|
|
345
|
+
clone_timeline(newName="<original>-v2") # safety net
|
|
346
|
+
reorder_timeline(newOrder=["c5","c1","c2","c3","c4"])
|
|
347
|
+
\`\`\`
|
|
348
|
+
|
|
349
|
+
\`reorder_timeline\` reads the current timeline, emits a permuted FCPXML,
|
|
350
|
+
and \`import_timeline\`s it. Clips not listed in \`newOrder\` keep their
|
|
351
|
+
original relative order and append at the end.
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## Recipe 2 — Multi-track B-roll composition
|
|
356
|
+
|
|
357
|
+
The user wants several B-roll cutaways stacked above the main A-roll
|
|
358
|
+
with per-clip opacity and timing.
|
|
359
|
+
|
|
360
|
+
\`\`\`
|
|
361
|
+
clone_timeline(newName="<original>-broll")
|
|
362
|
+
compose_layered(
|
|
363
|
+
title="<sequence name>",
|
|
364
|
+
frameRate=<source fps>,
|
|
365
|
+
layers=[
|
|
366
|
+
# Main spine (lane 0)
|
|
367
|
+
{ reel:"main", sourcePath:"main.mov", sourceInFrame:0, sourceOutFrame:1800,
|
|
368
|
+
lane:0, recordOffsetFrame:0 },
|
|
369
|
+
# B-roll on lane 1 with a 30-frame opacity fade-in
|
|
370
|
+
{ reel:"broll1", sourcePath:"broll-coffee.mov", sourceInFrame:0,
|
|
371
|
+
sourceOutFrame:120, lane:1, recordOffsetFrame:300,
|
|
372
|
+
opacity:{ keyframes:[
|
|
373
|
+
{ frame:0, value:0 },
|
|
374
|
+
{ frame:30, value:1, interp:"easeOut" },
|
|
375
|
+
{ frame:90, value:1 },
|
|
376
|
+
{ frame:120, value:0, interp:"easeIn" }
|
|
377
|
+
] } }
|
|
378
|
+
]
|
|
379
|
+
)
|
|
380
|
+
\`\`\`
|
|
381
|
+
|
|
382
|
+
For single-clip layers without keyframes, \`insert_broll\` is simpler.
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Recipe 3 — Lower-thirds + title cards
|
|
387
|
+
|
|
388
|
+
Both go through \`.ass\` (Advanced SubStation Alpha) files because stock
|
|
389
|
+
Homebrew ffmpeg doesn't ship \`drawtext\`. Pair with \`burn_subtitles\` to
|
|
390
|
+
bake into a finished video.
|
|
391
|
+
|
|
392
|
+
\`\`\`
|
|
393
|
+
write_lower_third(
|
|
394
|
+
output="lt.ass", width=1920, height=1080,
|
|
395
|
+
items=[{
|
|
396
|
+
primaryText:"Jane Doe",
|
|
397
|
+
secondaryText:"Director, Cinema Co.",
|
|
398
|
+
startSec:8, durationSec:4,
|
|
399
|
+
position:"bottom-left",
|
|
400
|
+
animation:"slide-left",
|
|
401
|
+
primaryColor:"FFFFFF", accentColor:"000000"
|
|
402
|
+
}]
|
|
403
|
+
)
|
|
404
|
+
write_title_card(
|
|
405
|
+
output="cards.ass", width=1920, height=1080,
|
|
406
|
+
items=[{ text:"Chapter 1", startSec:0, durationSec:3,
|
|
407
|
+
animation:"fade-in-out", fontSize:140 }]
|
|
408
|
+
)
|
|
409
|
+
burn_subtitles(input="rough.mp4", subtitles="lt.ass", output="rough+lt.mp4")
|
|
410
|
+
burn_subtitles(input="rough+lt.mp4", subtitles="cards.ass", output="final.mp4")
|
|
411
|
+
\`\`\`
|
|
412
|
+
|
|
413
|
+
To keep titles editable inside the NLE instead of baked, use
|
|
414
|
+
\`write_fcpxml\` with the \`titles\` field, then \`import_edl\`.
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Recipe 4 — Speed ramps
|
|
419
|
+
|
|
420
|
+
Cinematic slow-down-then-resume:
|
|
421
|
+
|
|
422
|
+
\`\`\`
|
|
423
|
+
speed_ramp(
|
|
424
|
+
input="action.mp4", output="action.ramped.mp4",
|
|
425
|
+
points=[
|
|
426
|
+
{ atSec:0, speed:1 }, # normal
|
|
427
|
+
{ atSec:2.5, speed:0.4 }, # slow-mo
|
|
428
|
+
{ atSec:4.0, speed:1 } # back to normal
|
|
429
|
+
]
|
|
430
|
+
)
|
|
431
|
+
\`\`\`
|
|
432
|
+
|
|
433
|
+
Audio is time-stretched via atempo, no pitch shift. For ramps where
|
|
434
|
+
you want video without audio: pass \`muteAudio=true\`.
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Recipe 5 — Audio mixing per clip
|
|
439
|
+
|
|
440
|
+
Voice-preset:
|
|
441
|
+
|
|
442
|
+
\`\`\`
|
|
443
|
+
mix_audio(
|
|
444
|
+
input="raw.wav", output="raw.mixed.wav",
|
|
445
|
+
eq=[
|
|
446
|
+
{ type:"high", freqHz:80 }, # rumble
|
|
447
|
+
{ type:"peak", freqHz:4000, gainDb:3, q:1.5 } # presence
|
|
448
|
+
],
|
|
449
|
+
compressor={ thresholdDb:-18, ratio:4, attackMs:20, releaseMs:250, makeupDb:3 },
|
|
450
|
+
deess={ freqHz:6500, thresholdDb:-25 },
|
|
451
|
+
limiter={ ceilingDb:-1 }
|
|
452
|
+
)
|
|
453
|
+
\`\`\`
|
|
454
|
+
|
|
455
|
+
Order: \`clean_audio\` (denoise) → \`mix_audio\` (shape) →
|
|
456
|
+
\`normalize_loudness\` (target platform LUFS).
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## Recipe 6 — Ken-Burns on stills
|
|
461
|
+
|
|
462
|
+
For photo galleries / quote cards / book covers:
|
|
463
|
+
|
|
464
|
+
\`\`\`
|
|
465
|
+
ken_burns(input="photo.jpg", output="photo.kb.mp4",
|
|
466
|
+
durationSec=4, startZoom=1, endZoom=1.4, direction="ne")
|
|
467
|
+
\`\`\`
|
|
468
|
+
|
|
469
|
+
Output is a silent libx264 clip. Then \`concat_videos\` it with main
|
|
470
|
+
footage, or \`insert_broll\` it onto a higher track via \`compose_layered\`.
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Recipe 7 — Named transitions
|
|
475
|
+
|
|
476
|
+
For energetic cuts:
|
|
477
|
+
|
|
478
|
+
\`\`\`
|
|
479
|
+
transition_videos(inputA="a.mp4", inputB="b.mp4", output="ab.mp4",
|
|
480
|
+
preset="whip-left") # 0.15s wipe
|
|
481
|
+
transition_videos(..., preset="smash-cut") # 1-frame blend, jump-cut feel
|
|
482
|
+
transition_videos(..., preset="dip-to-black", durationSec=0.8)
|
|
483
|
+
\`\`\`
|
|
484
|
+
|
|
485
|
+
For raw xfade names beyond the preset list, use \`crossfade_videos\`.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Don't
|
|
490
|
+
|
|
491
|
+
- Don't render before the user reviews the rebuilt timeline.
|
|
492
|
+
- Don't run reorder_timeline / compose_layered without
|
|
493
|
+
\`clone_timeline\` first — the import is destructive.
|
|
494
|
+
- Don't try to drawtext on a still frame; ffmpeg doesn't have it on
|
|
495
|
+
most installs. Always go through ASS.
|
|
496
|
+
- Don't keyframe opacity / position on Premiere via UXP — it's not
|
|
497
|
+
exposed; emit FCPXML with the keyframes baked in instead.
|
|
498
|
+
`;
|
|
499
|
+
const SKIN_TONE_MATCHING = `# skin-tone-matching
|
|
500
|
+
|
|
501
|
+
**When to use:** the host's face looks different across clips — warmer in
|
|
502
|
+
one shot, cooler / paler in the next. Different camera, different
|
|
503
|
+
location, different white-balance setting, sun behind a cloud. The user
|
|
504
|
+
wants the faces to match.
|
|
505
|
+
|
|
506
|
+
**Goal:** bring the target clip's skin tones toward a reference clip
|
|
507
|
+
without re-grading the whole frame. Skin lives in the reds and yellows;
|
|
508
|
+
that's where we operate.
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## Two paths
|
|
513
|
+
|
|
514
|
+
| Path | When | Where the grade lives |
|
|
515
|
+
|---|---|---|
|
|
516
|
+
| \`grade_skin_tones\` | works on every host (Resolve, Premiere, no-NLE) | baked into a new file |
|
|
517
|
+
| \`match_clip_color\` | Resolve only | non-destructive, in the clip's grade node |
|
|
518
|
+
|
|
519
|
+
Pick **\`grade_skin_tones\`** when the user is on Premiere, when there's no
|
|
520
|
+
NLE, or when they want a finished file they can drop anywhere. Pair with
|
|
521
|
+
\`replace_clip\` to swap it onto the timeline.
|
|
522
|
+
|
|
523
|
+
Pick **\`match_clip_color\`** when the user is on Resolve and wants to keep
|
|
524
|
+
the grade tweakable. The tool pipes the CDL through
|
|
525
|
+
\`set_primary_correction\`, so the colorist can adjust after.
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## Recipe
|
|
530
|
+
|
|
531
|
+
### 1. Pick the frames (most important step)
|
|
532
|
+
|
|
533
|
+
Vision is only as good as what you show it. For BOTH the reference and
|
|
534
|
+
the target:
|
|
535
|
+
|
|
536
|
+
- The face must be visible and large enough (not a wide shot from across
|
|
537
|
+
the room).
|
|
538
|
+
- The lighting on the face must be representative (not the one frame
|
|
539
|
+
where they walked through a shadow).
|
|
540
|
+
- Eyes open, mouth not in a weird shape, no motion blur.
|
|
541
|
+
|
|
542
|
+
Use \`score_shot(input, intervalSec=15)\` or \`extract_frame\` to find good
|
|
543
|
+
candidates. If the user already pointed at a moment ("match shot 3 to
|
|
544
|
+
shot 1") use those timestamps directly.
|
|
545
|
+
|
|
546
|
+
### 2. Run the grade
|
|
547
|
+
|
|
548
|
+
**File-only path (works in every host):**
|
|
549
|
+
|
|
550
|
+
\`\`\`
|
|
551
|
+
grade_skin_tones(
|
|
552
|
+
referenceVideo="<ref.mp4>",
|
|
553
|
+
referenceAtSec=<face-forward time>,
|
|
554
|
+
targetVideo="<tgt.mp4>",
|
|
555
|
+
targetAtSec=<face-forward time>,
|
|
556
|
+
output="<tgt-graded.mp4>"
|
|
557
|
+
)
|
|
558
|
+
\`\`\`
|
|
559
|
+
|
|
560
|
+
Returns \`{path, confidence, why, grade}\`. Then:
|
|
561
|
+
|
|
562
|
+
\`\`\`
|
|
563
|
+
replace_clip(clipId="<target clip id>", mediaPath="<tgt-graded.mp4>")
|
|
564
|
+
add_marker(color="yellow", note="skin grade: <why>")
|
|
565
|
+
\`\`\`
|
|
566
|
+
|
|
567
|
+
**Resolve non-baked path:**
|
|
568
|
+
|
|
569
|
+
\`\`\`
|
|
570
|
+
match_clip_color(
|
|
571
|
+
referenceVideo="<ref.mp4>",
|
|
572
|
+
referenceAtSec=<face-forward time>,
|
|
573
|
+
targetClipId="<target clip id>",
|
|
574
|
+
targetAtSec=<face-forward time>,
|
|
575
|
+
applyAutomatically=true
|
|
576
|
+
)
|
|
577
|
+
\`\`\`
|
|
578
|
+
|
|
579
|
+
Returns \`{applied, confidence, why, grade}\`. The CDL goes into node 1
|
|
580
|
+
(or \`nodeIndex=N\` if you want a specific node).
|
|
581
|
+
|
|
582
|
+
### 3. Check confidence
|
|
583
|
+
|
|
584
|
+
The model's confidence is the most important field. Always inspect it:
|
|
585
|
+
|
|
586
|
+
- \`confidence ≥ 0.7\` — apply. Trust the result.
|
|
587
|
+
- \`0.4 ≤ confidence < 0.7\` — apply but flag for review:
|
|
588
|
+
\`add_marker(color="yellow", note="skin grade: review — confidence <X>")\`.
|
|
589
|
+
- \`confidence < 0.4\` — DO NOT apply. The model is guessing. Tell the
|
|
590
|
+
user what you saw, suggest they grade the shot manually or pick a
|
|
591
|
+
better reference frame.
|
|
592
|
+
|
|
593
|
+
\`match_clip_color\` enforces this: with \`applyAutomatically=true\`,
|
|
594
|
+
confidence < 0.4 returns \`{applied: false}\` and the grade is surfaced
|
|
595
|
+
without writing to the node. \`grade_skin_tones\` always bakes the file
|
|
596
|
+
because the agent asked for an output path — but you can re-run with a
|
|
597
|
+
better reference frame if confidence was low.
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## Defaults
|
|
602
|
+
|
|
603
|
+
| Knob | Default | Why |
|
|
604
|
+
|---|---|---|
|
|
605
|
+
| Vision detail | \`low\` | cheap; skin balance doesn't need pixel-peeping |
|
|
606
|
+
| Vision model | \`gpt-4o-mini\` | well-calibrated for color comparisons |
|
|
607
|
+
| Output codec | \`libx264 crf=18\` | visually lossless |
|
|
608
|
+
| Reference frame width | 768px | enough for skin-tone discrimination |
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## What this is NOT
|
|
613
|
+
|
|
614
|
+
- NOT a deterministic ColorChecker match. There's no chart, no
|
|
615
|
+
colorimetry — it's a vision pass.
|
|
616
|
+
- NOT a substitute for a colorist. Power windows / qualifiers / curves
|
|
617
|
+
are out of scope. If skin needs to be isolated from a colored
|
|
618
|
+
background, surface that and stop.
|
|
619
|
+
- NOT for whole-look matching across a project. For session-wide LUT
|
|
620
|
+
application use \`apply_lut\` + \`copy_grade\`.
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## Red flags — pause and ask
|
|
625
|
+
|
|
626
|
+
- Reference and target are filmed under fundamentally different
|
|
627
|
+
lighting (tungsten vs daylight) → confidence will be low. Tell the
|
|
628
|
+
user and suggest a less aggressive match (or LUT-based correction
|
|
629
|
+
first).
|
|
630
|
+
- Target shot has multiple people with different skin tones → the
|
|
631
|
+
vision model averages. Pick the primary face's frame and warn the
|
|
632
|
+
user the secondary face may shift.
|
|
633
|
+
- User wants pixel-perfect match across 50 clips → run on a hero pair,
|
|
634
|
+
then \`copy_grade(sourceClipId=hero, targetClipIds=[...])\` instead of
|
|
635
|
+
re-running vision on every clip.
|
|
636
|
+
|
|
637
|
+
## Don't
|
|
638
|
+
|
|
639
|
+
- Don't pick a target frame where the face is in shadow or motion blur.
|
|
640
|
+
- Don't apply low-confidence grades silently.
|
|
641
|
+
- Don't run on top of an existing aggressive grade — clean state first
|
|
642
|
+
or expect compounding shifts.
|
|
643
|
+
- Don't bake \`grade_skin_tones\` over the original target file. Always
|
|
644
|
+
write to a new path.
|
|
645
|
+
`;
|
|
646
|
+
export const SKILLS = {
|
|
647
|
+
"long-form-content-edit": {
|
|
648
|
+
name: "long-form-content-edit",
|
|
649
|
+
description: "Recipe for podcasts, interviews, vlogs, courses, talking-head. Five-pass method: utterance segmentation → take detection → filler removal → incomplete-sentence trim → silence normalization. Wires our tools (transcribe, cluster_takes, detect_silence, write_edl, import_edl, write_srt, add_marker) into a single workflow.",
|
|
650
|
+
content: LONG_FORM_CONTENT_EDIT,
|
|
651
|
+
},
|
|
652
|
+
"short-form-content-edit": {
|
|
653
|
+
name: "short-form-content-edit",
|
|
654
|
+
description: "Recipe for TikTok / Reels / Shorts. Find the moment → reformat 9:16 → hook the first 2 seconds → burn captions → render. Uses reformat_timeline, import_edl, set_clip_speed, write_srt, import_subtitles, open_page (Resolve).",
|
|
655
|
+
content: SHORT_FORM_CONTENT_EDIT,
|
|
656
|
+
},
|
|
657
|
+
"chapter-markers": {
|
|
658
|
+
name: "chapter-markers",
|
|
659
|
+
description: "Recipe for YouTube/podcast chapter timestamps. Reads transcript in 90s windows, identifies topic shifts, drops purple markers, and emits a YouTube-formatted description block. Constraints: first chapter at 00:00, 5–15 chapters, ≥30s apart.",
|
|
660
|
+
content: CHAPTER_MARKERS,
|
|
661
|
+
},
|
|
662
|
+
"keyframing-and-titles": {
|
|
663
|
+
name: "keyframing-and-titles",
|
|
664
|
+
description: "Recipes for the seven gaps neither Resolve nor Premiere expose via scripting: timeline reordering, multi-track / lane composition, lower-thirds and title cards (via ASS), keyframed opacity / position / volume ramps, audio mixing chains (EQ + comp + gate + de-esser + limiter), speed ramps, Ken-Burns on stills, and named transitions (smash-cut, whip-pan, dip-to-black). Wires reorder_timeline, compose_layered, write_lower_third, write_title_card, mix_audio, speed_ramp, ken_burns, transition_videos.",
|
|
665
|
+
content: KEYFRAMING_AND_TITLES,
|
|
666
|
+
},
|
|
667
|
+
"skin-tone-matching": {
|
|
668
|
+
name: "skin-tone-matching",
|
|
669
|
+
description: "Recipe for matching faces across clips when host scripting can't reach power windows or qualifiers. Two paths: grade_skin_tones (file-only, every host — bakes a vision-derived colorbalance + selectivecolor + eq grade into a new mp4, pair with replace_clip) and match_clip_color (Resolve only — derives the same grade as a CDL and pipes it through set_primary_correction, non-baked). Both share one vision pass over a reference frame and a target frame; below confidence 0.4 the grade is unreliable.",
|
|
670
|
+
content: SKIN_TONE_MATCHING,
|
|
671
|
+
},
|
|
672
|
+
};
|
|
673
|
+
export const SKILL_NAMES = Object.keys(SKILLS);
|
|
674
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G9B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgH/B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FvB,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K7B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJ1B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,wBAAwB,EAAE;QACxB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,iUAAiU;QACnU,OAAO,EAAE,sBAAsB;KAChC;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,gOAAgO;QAClO,OAAO,EAAE,uBAAuB;KACjC;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,iPAAiP;QACnP,OAAO,EAAE,eAAe;KACzB;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,sfAAsf;QACxf,OAAO,EAAE,qBAAqB;KAC/B;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,ofAAof;QACtf,OAAO,EAAE,kBAAkB;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
|