@kenkaiiii/gg-editor 0.6.7 → 0.7.1
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/dist/cli.js +64 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/audio-mix.d.ts.map +1 -1
- package/dist/core/audio-mix.js +8 -1
- package/dist/core/audio-mix.js.map +1 -1
- package/dist/core/audio-mix.test.js +1 -1
- package/dist/core/audio-mix.test.js.map +1 -1
- package/dist/core/auth/api-keys.d.ts +1 -1
- package/dist/core/auth/api-keys.d.ts.map +1 -1
- package/dist/core/auth/api-keys.js +2 -1
- package/dist/core/auth/api-keys.js.map +1 -1
- package/dist/core/auth/index.d.ts +18 -5
- package/dist/core/auth/index.d.ts.map +1 -1
- package/dist/core/auth/index.js +16 -4
- package/dist/core/auth/index.js.map +1 -1
- package/dist/core/auth/login.d.ts.map +1 -1
- package/dist/core/auth/login.js +4 -31
- package/dist/core/auth/login.js.map +1 -1
- package/dist/core/beats.d.ts +59 -0
- package/dist/core/beats.d.ts.map +1 -0
- package/dist/core/beats.js +122 -0
- package/dist/core/beats.js.map +1 -0
- package/dist/core/beats.test.d.ts +2 -0
- package/dist/core/beats.test.d.ts.map +1 -0
- package/dist/core/beats.test.js +86 -0
- package/dist/core/beats.test.js.map +1 -0
- package/dist/core/brand-kit.d.ts +80 -0
- package/dist/core/brand-kit.d.ts.map +1 -0
- package/dist/core/brand-kit.js +96 -0
- package/dist/core/brand-kit.js.map +1 -0
- package/dist/core/brand-kit.test.d.ts +2 -0
- package/dist/core/brand-kit.test.d.ts.map +1 -0
- package/dist/core/brand-kit.test.js +76 -0
- package/dist/core/brand-kit.test.js.map +1 -0
- package/dist/core/bundled-sfx.d.ts +64 -0
- package/dist/core/bundled-sfx.d.ts.map +1 -0
- package/dist/core/bundled-sfx.js +218 -0
- package/dist/core/bundled-sfx.js.map +1 -0
- package/dist/core/bundled-sfx.test.d.ts +2 -0
- package/dist/core/bundled-sfx.test.d.ts.map +1 -0
- package/dist/core/bundled-sfx.test.js +81 -0
- package/dist/core/bundled-sfx.test.js.map +1 -0
- package/dist/core/child-abort.d.ts +57 -0
- package/dist/core/child-abort.d.ts.map +1 -0
- package/dist/core/child-abort.js +95 -0
- package/dist/core/child-abort.js.map +1 -0
- package/dist/core/child-abort.test.d.ts +2 -0
- package/dist/core/child-abort.test.d.ts.map +1 -0
- package/dist/core/child-abort.test.js +88 -0
- package/dist/core/child-abort.test.js.map +1 -0
- package/dist/core/clip-scoring.d.ts +44 -0
- package/dist/core/clip-scoring.d.ts.map +1 -0
- package/dist/core/clip-scoring.js +165 -0
- package/dist/core/clip-scoring.js.map +1 -0
- package/dist/core/clip-scoring.test.d.ts +2 -0
- package/dist/core/clip-scoring.test.d.ts.map +1 -0
- package/dist/core/clip-scoring.test.js +113 -0
- package/dist/core/clip-scoring.test.js.map +1 -0
- package/dist/core/emoji-captions.d.ts +45 -0
- package/dist/core/emoji-captions.d.ts.map +1 -0
- package/dist/core/emoji-captions.js +121 -0
- package/dist/core/emoji-captions.js.map +1 -0
- package/dist/core/face-reframe.d.ts +91 -0
- package/dist/core/face-reframe.d.ts.map +1 -0
- package/dist/core/face-reframe.js +141 -0
- package/dist/core/face-reframe.js.map +1 -0
- package/dist/core/face-reframe.test.d.ts +2 -0
- package/dist/core/face-reframe.test.d.ts.map +1 -0
- package/dist/core/face-reframe.test.js +171 -0
- package/dist/core/face-reframe.test.js.map +1 -0
- package/dist/core/filler-words.d.ts +57 -9
- package/dist/core/filler-words.d.ts.map +1 -1
- package/dist/core/filler-words.js +61 -9
- package/dist/core/filler-words.js.map +1 -1
- package/dist/core/filler-words.test.js +91 -17
- package/dist/core/filler-words.test.js.map +1 -1
- package/dist/core/hook-rewrite.d.ts +48 -0
- package/dist/core/hook-rewrite.d.ts.map +1 -0
- package/dist/core/hook-rewrite.js +151 -0
- package/dist/core/hook-rewrite.js.map +1 -0
- package/dist/core/hook-rewrite.test.d.ts +2 -0
- package/dist/core/hook-rewrite.test.d.ts.map +1 -0
- package/dist/core/hook-rewrite.test.js +58 -0
- package/dist/core/hook-rewrite.test.js.map +1 -0
- package/dist/core/hosts/lazy.d.ts.map +1 -1
- package/dist/core/hosts/lazy.js +2 -0
- package/dist/core/hosts/lazy.js.map +1 -1
- package/dist/core/hosts/premiere/adapter.d.ts +1 -0
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -1
- package/dist/core/hosts/premiere/adapter.js.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/premiere/bridge-source.js +6 -3
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/adapter.d.ts +1 -0
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -1
- package/dist/core/hosts/resolve/adapter.js.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge-source.js +31 -4
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.d.ts +2 -19
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -1
- package/dist/core/hosts/resolve/bridge.js +70 -41
- package/dist/core/hosts/resolve/bridge.js.map +1 -1
- package/dist/core/hosts/resolve/bridge.test.js +130 -0
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -1
- package/dist/core/hosts/types.d.ts +6 -0
- package/dist/core/hosts/types.d.ts.map +1 -1
- package/dist/core/hosts/types.js.map +1 -1
- package/dist/core/logger.d.ts +32 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +188 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/loop-match.d.ts +57 -0
- package/dist/core/loop-match.d.ts.map +1 -0
- package/dist/core/loop-match.js +91 -0
- package/dist/core/loop-match.js.map +1 -0
- package/dist/core/media/ffmpeg.d.ts.map +1 -1
- package/dist/core/media/ffmpeg.js +14 -3
- package/dist/core/media/ffmpeg.js.map +1 -1
- package/dist/core/multi-format.d.ts +67 -0
- package/dist/core/multi-format.d.ts.map +1 -0
- package/dist/core/multi-format.js +127 -0
- package/dist/core/multi-format.js.map +1 -0
- package/dist/core/multi-format.test.d.ts +2 -0
- package/dist/core/multi-format.test.d.ts.map +1 -0
- package/dist/core/multi-format.test.js +151 -0
- package/dist/core/multi-format.test.js.map +1 -0
- package/dist/core/python/beats.py +61 -0
- package/dist/core/python/face_reframe.py +163 -0
- package/dist/core/python/sidecar-path.d.ts +13 -0
- package/dist/core/python/sidecar-path.d.ts.map +1 -0
- package/dist/core/python/sidecar-path.js +24 -0
- package/dist/core/python/sidecar-path.js.map +1 -0
- package/dist/core/python.d.ts +57 -0
- package/dist/core/python.d.ts.map +1 -0
- package/dist/core/python.js +107 -0
- package/dist/core/python.js.map +1 -0
- package/dist/core/python.test.d.ts +2 -0
- package/dist/core/python.test.d.ts.map +1 -0
- package/dist/core/python.test.js +129 -0
- package/dist/core/python.test.js.map +1 -0
- package/dist/core/retention-structure.d.ts +81 -0
- package/dist/core/retention-structure.d.ts.map +1 -0
- package/dist/core/retention-structure.js +206 -0
- package/dist/core/retention-structure.js.map +1 -0
- package/dist/core/retention-structure.test.d.ts +2 -0
- package/dist/core/retention-structure.test.d.ts.map +1 -0
- package/dist/core/retention-structure.test.js +88 -0
- package/dist/core/retention-structure.test.js.map +1 -0
- package/dist/core/review.d.ts +17 -0
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +20 -24
- package/dist/core/review.js.map +1 -1
- package/dist/core/safe-paths.d.ts +11 -0
- package/dist/core/safe-paths.d.ts.map +1 -1
- package/dist/core/safe-paths.js +26 -10
- package/dist/core/safe-paths.js.map +1 -1
- package/dist/core/safe-paths.test.js +16 -0
- package/dist/core/safe-paths.test.js.map +1 -1
- package/dist/core/skills-loader.d.ts +48 -2
- package/dist/core/skills-loader.d.ts.map +1 -1
- package/dist/core/skills-loader.js +97 -19
- package/dist/core/skills-loader.js.map +1 -1
- package/dist/core/skills-loader.test.js +63 -1
- package/dist/core/skills-loader.test.js.map +1 -1
- package/dist/core/srt.d.ts +42 -7
- package/dist/core/srt.d.ts.map +1 -1
- package/dist/core/srt.js +101 -32
- package/dist/core/srt.js.map +1 -1
- package/dist/core/srt.test.js +54 -1
- package/dist/core/srt.test.js.map +1 -1
- package/dist/core/thumbnail-compose.d.ts +58 -0
- package/dist/core/thumbnail-compose.d.ts.map +1 -0
- package/dist/core/thumbnail-compose.js +101 -0
- package/dist/core/thumbnail-compose.js.map +1 -0
- package/dist/core/thumbnail-promise.d.ts +46 -0
- package/dist/core/thumbnail-promise.d.ts.map +1 -0
- package/dist/core/thumbnail-promise.js +133 -0
- package/dist/core/thumbnail-promise.js.map +1 -0
- package/dist/core/thumbnail-promise.test.d.ts +2 -0
- package/dist/core/thumbnail-promise.test.d.ts.map +1 -0
- package/dist/core/thumbnail-promise.test.js +52 -0
- package/dist/core/thumbnail-promise.test.js.map +1 -0
- package/dist/core/viral-moments.d.ts +70 -0
- package/dist/core/viral-moments.d.ts.map +1 -0
- package/dist/core/viral-moments.js +192 -0
- package/dist/core/viral-moments.js.map +1 -0
- package/dist/core/viral-moments.test.d.ts +2 -0
- package/dist/core/viral-moments.test.d.ts.map +1 -0
- package/dist/core/viral-moments.test.js +153 -0
- package/dist/core/viral-moments.test.js.map +1 -0
- package/dist/core/whisper.d.ts +16 -0
- package/dist/core/whisper.d.ts.map +1 -1
- package/dist/core/whisper.js +72 -5
- package/dist/core/whisper.js.map +1 -1
- package/dist/core/whisper.test.js +111 -1
- package/dist/core/whisper.test.js.map +1 -1
- package/dist/core/youtube-metadata.d.ts +44 -0
- package/dist/core/youtube-metadata.d.ts.map +1 -0
- package/dist/core/youtube-metadata.js +168 -0
- package/dist/core/youtube-metadata.js.map +1 -0
- package/dist/core/youtube-metadata.test.d.ts +2 -0
- package/dist/core/youtube-metadata.test.d.ts.map +1 -0
- package/dist/core/youtube-metadata.test.js +132 -0
- package/dist/core/youtube-metadata.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/prompt-commands.d.ts +24 -0
- package/dist/prompt-commands.d.ts.map +1 -0
- package/dist/prompt-commands.js +243 -0
- package/dist/prompt-commands.js.map +1 -0
- package/dist/prompt-commands.test.d.ts +2 -0
- package/dist/prompt-commands.test.d.ts.map +1 -0
- package/dist/prompt-commands.test.js +46 -0
- package/dist/prompt-commands.test.js.map +1 -0
- package/dist/skills.d.ts +6 -6
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +1426 -445
- package/dist/skills.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +108 -0
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/add-fades.d.ts.map +1 -1
- package/dist/tools/add-fades.js +2 -1
- package/dist/tools/add-fades.js.map +1 -1
- package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -1
- package/dist/tools/add-sfx-at-cuts.js +36 -11
- package/dist/tools/add-sfx-at-cuts.js.map +1 -1
- package/dist/tools/add-sfx-to-timeline.d.ts +34 -0
- package/dist/tools/add-sfx-to-timeline.d.ts.map +1 -0
- package/dist/tools/add-sfx-to-timeline.js +169 -0
- package/dist/tools/add-sfx-to-timeline.js.map +1 -0
- package/dist/tools/add-sfx-to-timeline.test.d.ts +2 -0
- package/dist/tools/add-sfx-to-timeline.test.d.ts.map +1 -0
- package/dist/tools/add-sfx-to-timeline.test.js +181 -0
- package/dist/tools/add-sfx-to-timeline.test.js.map +1 -0
- package/dist/tools/audit-first-frame.d.ts +36 -0
- package/dist/tools/audit-first-frame.d.ts.map +1 -0
- package/dist/tools/audit-first-frame.js +181 -0
- package/dist/tools/audit-first-frame.js.map +1 -0
- package/dist/tools/audit-retention-structure.d.ts +20 -0
- package/dist/tools/audit-retention-structure.d.ts.map +1 -0
- package/dist/tools/audit-retention-structure.js +95 -0
- package/dist/tools/audit-retention-structure.js.map +1 -0
- package/dist/tools/audit-retention-structure.test.d.ts +2 -0
- package/dist/tools/audit-retention-structure.test.d.ts.map +1 -0
- package/dist/tools/audit-retention-structure.test.js +93 -0
- package/dist/tools/audit-retention-structure.test.js.map +1 -0
- package/dist/tools/bleep-words.d.ts +59 -0
- package/dist/tools/bleep-words.d.ts.map +1 -0
- package/dist/tools/bleep-words.js +211 -0
- package/dist/tools/bleep-words.js.map +1 -0
- package/dist/tools/bleep-words.test.d.ts +2 -0
- package/dist/tools/bleep-words.test.d.ts.map +1 -0
- package/dist/tools/bleep-words.test.js +96 -0
- package/dist/tools/bleep-words.test.js.map +1 -0
- package/dist/tools/burn-subtitles.d.ts.map +1 -1
- package/dist/tools/burn-subtitles.js +10 -5
- package/dist/tools/burn-subtitles.js.map +1 -1
- package/dist/tools/clean-audio.d.ts.map +1 -1
- package/dist/tools/clean-audio.js +2 -1
- package/dist/tools/clean-audio.js.map +1 -1
- package/dist/tools/cluster-takes.js +2 -1
- package/dist/tools/cluster-takes.js.map +1 -1
- package/dist/tools/compose-thumbnail-variants.d.ts +70 -0
- package/dist/tools/compose-thumbnail-variants.d.ts.map +1 -0
- package/dist/tools/compose-thumbnail-variants.js +274 -0
- package/dist/tools/compose-thumbnail-variants.js.map +1 -0
- package/dist/tools/compose-thumbnail.d.ts +6 -13
- package/dist/tools/compose-thumbnail.d.ts.map +1 -1
- package/dist/tools/compose-thumbnail.js +44 -81
- package/dist/tools/compose-thumbnail.js.map +1 -1
- package/dist/tools/concat-videos.d.ts.map +1 -1
- package/dist/tools/concat-videos.js +12 -5
- package/dist/tools/concat-videos.js.map +1 -1
- package/dist/tools/concat-videos.test.d.ts +2 -0
- package/dist/tools/concat-videos.test.d.ts.map +1 -0
- package/dist/tools/concat-videos.test.js +103 -0
- package/dist/tools/concat-videos.test.js.map +1 -0
- package/dist/tools/crossfade-videos.d.ts.map +1 -1
- package/dist/tools/crossfade-videos.js +2 -1
- package/dist/tools/crossfade-videos.js.map +1 -1
- package/dist/tools/cut-filler-words.d.ts.map +1 -1
- package/dist/tools/cut-filler-words.js +24 -8
- package/dist/tools/cut-filler-words.js.map +1 -1
- package/dist/tools/detect-speaker-changes.js +2 -1
- package/dist/tools/detect-speaker-changes.js.map +1 -1
- package/dist/tools/extract-audio.d.ts.map +1 -1
- package/dist/tools/extract-audio.js +13 -7
- package/dist/tools/extract-audio.js.map +1 -1
- package/dist/tools/face-reframe.d.ts +30 -0
- package/dist/tools/face-reframe.d.ts.map +1 -0
- package/dist/tools/face-reframe.js +143 -0
- package/dist/tools/face-reframe.js.map +1 -0
- package/dist/tools/face-reframe.test.d.ts +2 -0
- package/dist/tools/face-reframe.test.d.ts.map +1 -0
- package/dist/tools/face-reframe.test.js +139 -0
- package/dist/tools/face-reframe.test.js.map +1 -0
- package/dist/tools/find-viral-moments.d.ts +23 -0
- package/dist/tools/find-viral-moments.d.ts.map +1 -0
- package/dist/tools/find-viral-moments.js +176 -0
- package/dist/tools/find-viral-moments.js.map +1 -0
- package/dist/tools/find-viral-moments.test.d.ts +2 -0
- package/dist/tools/find-viral-moments.test.d.ts.map +1 -0
- package/dist/tools/find-viral-moments.test.js +144 -0
- package/dist/tools/find-viral-moments.test.js.map +1 -0
- package/dist/tools/generate-gif.d.ts.map +1 -1
- package/dist/tools/generate-gif.js +47 -40
- package/dist/tools/generate-gif.js.map +1 -1
- package/dist/tools/generate-gif.test.d.ts +2 -0
- package/dist/tools/generate-gif.test.d.ts.map +1 -0
- package/dist/tools/generate-gif.test.js +115 -0
- package/dist/tools/generate-gif.test.js.map +1 -0
- package/dist/tools/generate-outro.d.ts +18 -0
- package/dist/tools/generate-outro.d.ts.map +1 -0
- package/dist/tools/generate-outro.js +175 -0
- package/dist/tools/generate-outro.js.map +1 -0
- package/dist/tools/generate-youtube-metadata.d.ts +23 -0
- package/dist/tools/generate-youtube-metadata.d.ts.map +1 -0
- package/dist/tools/generate-youtube-metadata.js +103 -0
- package/dist/tools/generate-youtube-metadata.js.map +1 -0
- package/dist/tools/generate-youtube-metadata.test.d.ts +2 -0
- package/dist/tools/generate-youtube-metadata.test.d.ts.map +1 -0
- package/dist/tools/generate-youtube-metadata.test.js +118 -0
- package/dist/tools/generate-youtube-metadata.test.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +130 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.js +27 -1
- package/dist/tools/index.test.js.map +1 -1
- package/dist/tools/ken-burns.d.ts.map +1 -1
- package/dist/tools/ken-burns.js +2 -1
- package/dist/tools/ken-burns.js.map +1 -1
- package/dist/tools/loop-match-short.d.ts +22 -0
- package/dist/tools/loop-match-short.d.ts.map +1 -0
- package/dist/tools/loop-match-short.js +107 -0
- package/dist/tools/loop-match-short.js.map +1 -0
- package/dist/tools/mix-audio.d.ts.map +1 -1
- package/dist/tools/mix-audio.js +2 -1
- package/dist/tools/mix-audio.js.map +1 -1
- package/dist/tools/normalize-loudness.d.ts.map +1 -1
- package/dist/tools/normalize-loudness.js +2 -1
- package/dist/tools/normalize-loudness.js.map +1 -1
- package/dist/tools/path-traversal.test.d.ts +15 -0
- package/dist/tools/path-traversal.test.d.ts.map +1 -0
- package/dist/tools/path-traversal.test.js +223 -0
- package/dist/tools/path-traversal.test.js.map +1 -0
- package/dist/tools/pick-best-takes.js +2 -1
- package/dist/tools/pick-best-takes.js.map +1 -1
- package/dist/tools/punch-in.d.ts.map +1 -1
- package/dist/tools/punch-in.js +2 -1
- package/dist/tools/punch-in.js.map +1 -1
- package/dist/tools/read-transcript.js +2 -1
- package/dist/tools/read-transcript.js.map +1 -1
- package/dist/tools/render-multi-format.d.ts +35 -0
- package/dist/tools/render-multi-format.d.ts.map +1 -0
- package/dist/tools/render-multi-format.js +206 -0
- package/dist/tools/render-multi-format.js.map +1 -0
- package/dist/tools/render-multi-format.test.d.ts +2 -0
- package/dist/tools/render-multi-format.test.d.ts.map +1 -0
- package/dist/tools/render-multi-format.test.js +312 -0
- package/dist/tools/render-multi-format.test.js.map +1 -0
- package/dist/tools/render.d.ts.map +1 -1
- package/dist/tools/render.js +2 -2
- package/dist/tools/render.js.map +1 -1
- package/dist/tools/rewrite-hook.d.ts +32 -0
- package/dist/tools/rewrite-hook.d.ts.map +1 -0
- package/dist/tools/rewrite-hook.js +65 -0
- package/dist/tools/rewrite-hook.js.map +1 -0
- package/dist/tools/score-clip.d.ts +30 -0
- package/dist/tools/score-clip.d.ts.map +1 -0
- package/dist/tools/score-clip.js +109 -0
- package/dist/tools/score-clip.js.map +1 -0
- package/dist/tools/score-clip.test.d.ts +2 -0
- package/dist/tools/score-clip.test.d.ts.map +1 -0
- package/dist/tools/score-clip.test.js +110 -0
- package/dist/tools/score-clip.test.js.map +1 -0
- package/dist/tools/search-tools.d.ts +34 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +86 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/search-tools.test.d.ts +2 -0
- package/dist/tools/search-tools.test.d.ts.map +1 -0
- package/dist/tools/search-tools.test.js +60 -0
- package/dist/tools/search-tools.test.js.map +1 -0
- package/dist/tools/snap-cuts-to-beats.d.ts +18 -0
- package/dist/tools/snap-cuts-to-beats.d.ts.map +1 -0
- package/dist/tools/snap-cuts-to-beats.js +110 -0
- package/dist/tools/snap-cuts-to-beats.js.map +1 -0
- package/dist/tools/snap-cuts-to-beats.test.d.ts +2 -0
- package/dist/tools/snap-cuts-to-beats.test.d.ts.map +1 -0
- package/dist/tools/snap-cuts-to-beats.test.js +99 -0
- package/dist/tools/snap-cuts-to-beats.test.js.map +1 -0
- package/dist/tools/speed-ramp.d.ts.map +1 -1
- package/dist/tools/speed-ramp.js +2 -1
- package/dist/tools/speed-ramp.js.map +1 -1
- package/dist/tools/stabilize-video.d.ts.map +1 -1
- package/dist/tools/stabilize-video.js +2 -1
- package/dist/tools/stabilize-video.js.map +1 -1
- package/dist/tools/suggest-broll.d.ts +34 -0
- package/dist/tools/suggest-broll.d.ts.map +1 -0
- package/dist/tools/suggest-broll.js +367 -0
- package/dist/tools/suggest-broll.js.map +1 -0
- package/dist/tools/suggest-broll.test.d.ts +2 -0
- package/dist/tools/suggest-broll.test.d.ts.map +1 -0
- package/dist/tools/suggest-broll.test.js +217 -0
- package/dist/tools/suggest-broll.test.js.map +1 -0
- package/dist/tools/text-based-cut.d.ts +33 -0
- package/dist/tools/text-based-cut.d.ts.map +1 -0
- package/dist/tools/text-based-cut.js +172 -0
- package/dist/tools/text-based-cut.js.map +1 -0
- package/dist/tools/text-based-cut.test.d.ts +2 -0
- package/dist/tools/text-based-cut.test.d.ts.map +1 -0
- package/dist/tools/text-based-cut.test.js +32 -0
- package/dist/tools/text-based-cut.test.js.map +1 -0
- package/dist/tools/transcribe.d.ts +1 -1
- package/dist/tools/transition-videos.d.ts +1 -1
- package/dist/tools/transition-videos.d.ts.map +1 -1
- package/dist/tools/transition-videos.js +2 -1
- package/dist/tools/transition-videos.js.map +1 -1
- package/dist/tools/trim-dead-air.d.ts +59 -0
- package/dist/tools/trim-dead-air.d.ts.map +1 -0
- package/dist/tools/trim-dead-air.js +215 -0
- package/dist/tools/trim-dead-air.js.map +1 -0
- package/dist/tools/trim-dead-air.test.d.ts +2 -0
- package/dist/tools/trim-dead-air.test.d.ts.map +1 -0
- package/dist/tools/trim-dead-air.test.js +75 -0
- package/dist/tools/trim-dead-air.test.js.map +1 -0
- package/dist/tools/verify-thumbnail-promise.d.ts +33 -0
- package/dist/tools/verify-thumbnail-promise.d.ts.map +1 -0
- package/dist/tools/verify-thumbnail-promise.js +112 -0
- package/dist/tools/verify-thumbnail-promise.js.map +1 -0
- package/dist/tools/verify-thumbnail-promise.test.d.ts +2 -0
- package/dist/tools/verify-thumbnail-promise.test.d.ts.map +1 -0
- package/dist/tools/verify-thumbnail-promise.test.js +38 -0
- package/dist/tools/verify-thumbnail-promise.test.js.map +1 -0
- package/dist/tools/write-keyword-captions.d.ts +7 -0
- package/dist/tools/write-keyword-captions.d.ts.map +1 -1
- package/dist/tools/write-keyword-captions.js +35 -4
- package/dist/tools/write-keyword-captions.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +75 -11
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/tool-formatters.d.ts +30 -0
- package/dist/ui/tool-formatters.d.ts.map +1 -0
- package/dist/ui/tool-formatters.js +461 -0
- package/dist/ui/tool-formatters.js.map +1 -0
- package/dist/ui/tool-formatters.test.d.ts +2 -0
- package/dist/ui/tool-formatters.test.d.ts.map +1 -0
- package/dist/ui/tool-formatters.test.js +143 -0
- package/dist/ui/tool-formatters.test.js.map +1 -0
- package/package.json +10 -9
package/dist/core/review.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,qBAAqB,CAAC;AAG5D,OAAO,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,17 @@ export interface SafeResolveResult {
|
|
|
42
42
|
* user-visible output dir so that NLE host processes (which run outside Node's
|
|
43
43
|
* sandbox) can read the result back. Use for stills / thumbnails / GIFs that
|
|
44
44
|
* the host might import.
|
|
45
|
+
*
|
|
46
|
+
* Order matters here: we check the sandbox-redirect FIRST. Sandbox roots
|
|
47
|
+
* (`/tmp`, `/var/folders/…`, `/private/var/…`) are trusted OS-managed temp
|
|
48
|
+
* locations — we always want to remap them into the user-visible output dir,
|
|
49
|
+
* even when they don't happen to match the runner's `tmpdir()` allow-root
|
|
50
|
+
* (e.g. `/tmp/foo.jpg` when `tmpdir()` is `/var/folders/…`). After redirect,
|
|
51
|
+
* the resulting path is under `userOutputDir()` and is implicitly safe.
|
|
52
|
+
*
|
|
53
|
+
* Non-sandbox paths fall through to the regular `safeOutputPath()` traversal
|
|
54
|
+
* check, so escapes like `../../etc/passwd` or absolute `/etc/hosts` are still
|
|
55
|
+
* rejected exactly as before.
|
|
45
56
|
*/
|
|
46
57
|
export declare function safeResolveOutputPath(cwd: string, requested: string, opts?: SafeOutputOptions): SafeResolveResult;
|
|
47
58
|
//# sourceMappingURL=safe-paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-paths.d.ts","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,4DAA4D;AAC5D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAuBD,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAY/F;AA2BD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED
|
|
1
|
+
{"version":3,"file":"safe-paths.d.ts","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,4DAA4D;AAC5D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAuBD,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAY/F;AA2BD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,iBAAiB,GACvB,iBAAiB,CAgBnB"}
|
package/dist/core/safe-paths.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* through tool output so the agent can surface it.
|
|
18
18
|
*/
|
|
19
19
|
import { homedir, tmpdir } from "node:os";
|
|
20
|
-
import { basename,
|
|
20
|
+
import { basename, resolve as resolvePath } from "node:path";
|
|
21
21
|
/** Default user-visible output directory for sandbox-redirected files. */
|
|
22
22
|
export const USER_OUTPUT_DIR_NAME = "gg-editor-out";
|
|
23
23
|
/** Build the full path of the per-user output directory. */
|
|
@@ -86,17 +86,33 @@ function isSandboxPath(absPath) {
|
|
|
86
86
|
* user-visible output dir so that NLE host processes (which run outside Node's
|
|
87
87
|
* sandbox) can read the result back. Use for stills / thumbnails / GIFs that
|
|
88
88
|
* the host might import.
|
|
89
|
+
*
|
|
90
|
+
* Order matters here: we check the sandbox-redirect FIRST. Sandbox roots
|
|
91
|
+
* (`/tmp`, `/var/folders/…`, `/private/var/…`) are trusted OS-managed temp
|
|
92
|
+
* locations — we always want to remap them into the user-visible output dir,
|
|
93
|
+
* even when they don't happen to match the runner's `tmpdir()` allow-root
|
|
94
|
+
* (e.g. `/tmp/foo.jpg` when `tmpdir()` is `/var/folders/…`). After redirect,
|
|
95
|
+
* the resulting path is under `userOutputDir()` and is implicitly safe.
|
|
96
|
+
*
|
|
97
|
+
* Non-sandbox paths fall through to the regular `safeOutputPath()` traversal
|
|
98
|
+
* check, so escapes like `../../etc/passwd` or absolute `/etc/hosts` are still
|
|
99
|
+
* rejected exactly as before.
|
|
89
100
|
*/
|
|
90
101
|
export function safeResolveOutputPath(cwd, requested, opts) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
if (!requested || typeof requested !== "string") {
|
|
103
|
+
throw new Error("output path is empty");
|
|
104
|
+
}
|
|
105
|
+
const abs = resolvePath(cwd, requested);
|
|
106
|
+
if (isSandboxPath(abs)) {
|
|
107
|
+
const out = resolvePath(userOutputDir(), basename(abs));
|
|
108
|
+
return {
|
|
109
|
+
path: out,
|
|
110
|
+
redirected: true,
|
|
111
|
+
reason: `original path '${abs}' is in a sandboxed temp directory and would be invisible to the host process`,
|
|
112
|
+
};
|
|
94
113
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
redirected: true,
|
|
99
|
-
reason: `original path '${abs}' is in a sandboxed temp directory and would be invisible to the host process`,
|
|
100
|
-
};
|
|
114
|
+
// Non-sandbox path: enforce the traversal allow-list.
|
|
115
|
+
const safe = safeOutputPath(cwd, requested, opts);
|
|
116
|
+
return { path: safe, redirected: false };
|
|
101
117
|
}
|
|
102
118
|
//# sourceMappingURL=safe-paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-paths.js","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"safe-paths.js","sourceRoot":"","sources":["../../src/core/safe-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,5 +72,21 @@ describe("safeResolveOutputPath", () => {
|
|
|
72
72
|
expect(USER_OUTPUT_DIR_NAME).toBe("gg-editor-out");
|
|
73
73
|
expect(userOutputDir().endsWith(USER_OUTPUT_DIR_NAME)).toBe(true);
|
|
74
74
|
});
|
|
75
|
+
// Regression: absolute escape paths must be rejected even when given to
|
|
76
|
+
// the redirect-aware variant. Earlier versions returned `{ path: requested,
|
|
77
|
+
// redirected: false }` for any non-sandbox absolute path, bypassing the
|
|
78
|
+
// cwd-confinement guard. The current implementation falls through to
|
|
79
|
+
// safeOutputPath() for non-sandbox paths so escapes throw.
|
|
80
|
+
it("rejects an absolute path outside the allowlist (e.g. /etc/passwd)", () => {
|
|
81
|
+
expect(() => safeResolveOutputPath("/tmp/cwd", "/etc/passwd")).toThrow(/outside allowed roots/);
|
|
82
|
+
});
|
|
83
|
+
it("accepts an absolute path that resolves under cwd", () => {
|
|
84
|
+
// Use a non-sandbox cwd so the result isn't redirected. ~/sample-project
|
|
85
|
+
// is the suite-wide cwd; an absolute path inside it should round-trip.
|
|
86
|
+
const target = resolvePath(cwd, "output.mp4");
|
|
87
|
+
const r = safeResolveOutputPath(cwd, target);
|
|
88
|
+
expect(r.redirected).toBe(false);
|
|
89
|
+
expect(r.path).toBe(target);
|
|
90
|
+
});
|
|
75
91
|
});
|
|
76
92
|
//# sourceMappingURL=safe-paths.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-paths.test.js","sourceRoot":"","sources":["../../src/core/safe-paths.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"safe-paths.test.js","sourceRoot":"","sources":["../../src/core/safe-paths.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,32 @@ import type { BundledSkill } from "../skills.js";
|
|
|
4
4
|
*
|
|
5
5
|
* Priority (last wins on name collisions):
|
|
6
6
|
* bundled (compiled into the package)
|
|
7
|
-
* → project (<cwd>/.gg/editor-skills
|
|
8
|
-
* → user (~/.gg/editor-skills
|
|
7
|
+
* → project (<cwd>/.gg/editor-skills/ OR <cwd>/.gg/skills/)
|
|
8
|
+
* → user (~/.gg/editor-skills/ OR ~/.gg/skills/)
|
|
9
9
|
*
|
|
10
10
|
* Silent override is the intended behaviour. The system prompt's skill list
|
|
11
11
|
* tags overridden entries so the agent (and the user) can see the layering.
|
|
12
|
+
*
|
|
13
|
+
* Two on-disk layouts are supported, identical to the Anthropic skill spec:
|
|
14
|
+
*
|
|
15
|
+
* - Flat: <dir>/<name>.md
|
|
16
|
+
* - Bundle: <dir>/<name>/SKILL.md (+ optional support files / scripts)
|
|
17
|
+
*
|
|
18
|
+
* Both forms accept optional YAML frontmatter (3-dash delimited):
|
|
19
|
+
*
|
|
20
|
+
* ---
|
|
21
|
+
* name: my-skill
|
|
22
|
+
* description: One-line description for the agent.
|
|
23
|
+
* ---
|
|
24
|
+
*
|
|
25
|
+
* When frontmatter is absent, the skill name falls back to the basename and
|
|
26
|
+
* the description is heuristically extracted from the first non-heading line.
|
|
27
|
+
*
|
|
28
|
+
* Two project / user dirs are searched in order — `.gg/editor-skills/` (the
|
|
29
|
+
* legacy gg-editor location) then `.gg/skills/` (the broader ecosystem
|
|
30
|
+
* convention used by ggcoder + skills.sh installs). Same for ~/.gg/. This
|
|
31
|
+
* means a creator who has done `npx skills add kenkaiiii/agent-skills` into
|
|
32
|
+
* `~/.gg/skills/` automatically gets the editor skills too.
|
|
12
33
|
*/
|
|
13
34
|
export interface SkillSource {
|
|
14
35
|
name: string;
|
|
@@ -24,6 +45,30 @@ export interface DiscoverSkillsOptions {
|
|
|
24
45
|
bundled: BundledSkill[];
|
|
25
46
|
}
|
|
26
47
|
export declare function discoverSkills(opts: DiscoverSkillsOptions): SkillSource[];
|
|
48
|
+
/**
|
|
49
|
+
* Parse a skill markdown into a SkillSource. Supports optional
|
|
50
|
+
* 3-dash-delimited YAML frontmatter (only `name:` and `description:` are
|
|
51
|
+
* inspected — additional keys are tolerated and ignored).
|
|
52
|
+
*
|
|
53
|
+
* The parsed `content` retains the frontmatter when present, so consumers
|
|
54
|
+
* (read_skill / agent prompts) see the full file as authored. This matches
|
|
55
|
+
* how ggcoder and the skills.sh ecosystem treat skill files.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseSkill(raw: string, origin: "bundled" | "project" | "user", path: string, fallbackName: string): SkillSource;
|
|
58
|
+
interface Frontmatter {
|
|
59
|
+
name?: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read a YAML-ish frontmatter block at the start of a file. Only supports the
|
|
64
|
+
* tiny subset we care about — `key: value` lines, no nesting, no lists. That
|
|
65
|
+
* matches the Anthropic skill spec exactly. Multi-line `description: |` is
|
|
66
|
+
* NOT supported by design (skill descriptions should fit on one line so the
|
|
67
|
+
* system-prompt index reads cleanly).
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseFrontmatter(raw: string): Frontmatter;
|
|
70
|
+
/** Drop the frontmatter block (if any), return body only. */
|
|
71
|
+
export declare function stripFrontmatter(raw: string): string;
|
|
27
72
|
/**
|
|
28
73
|
* Extract a one-line description from a skill markdown.
|
|
29
74
|
*
|
|
@@ -31,4 +76,5 @@ export declare function discoverSkills(opts: DiscoverSkillsOptions): SkillSource
|
|
|
31
76
|
* 200 chars. Falls back to "(no description)" if absent.
|
|
32
77
|
*/
|
|
33
78
|
export declare function extractDescription(content: string): string;
|
|
79
|
+
export {};
|
|
34
80
|
//# sourceMappingURL=skills-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-loader.d.ts","sourceRoot":"","sources":["../../src/core/skills-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD
|
|
1
|
+
{"version":3,"file":"skills-loader.d.ts","sourceRoot":"","sources":["../../src/core/skills-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,WAAW,EAAE,CAwBzE;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,EACtC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,WAAW,CASb;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAuBzD;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW1D"}
|
|
@@ -3,16 +3,19 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { basename, join, resolve as resolvePath } from "node:path";
|
|
4
4
|
export function discoverSkills(opts) {
|
|
5
5
|
const home = opts.homeDir ?? homedir();
|
|
6
|
-
const
|
|
7
|
-
|
|
6
|
+
const projectDirs = [
|
|
7
|
+
resolvePath(opts.cwd, ".gg/editor-skills"),
|
|
8
|
+
resolvePath(opts.cwd, ".gg/skills"),
|
|
9
|
+
];
|
|
10
|
+
const userDirs = [resolvePath(home, ".gg/editor-skills"), resolvePath(home, ".gg/skills")];
|
|
8
11
|
const bundled = opts.bundled.map((s) => ({
|
|
9
12
|
name: s.name,
|
|
10
13
|
description: s.description,
|
|
11
14
|
content: s.content,
|
|
12
15
|
origin: "bundled",
|
|
13
16
|
}));
|
|
14
|
-
const project = readSkillDir(
|
|
15
|
-
const user = readSkillDir(
|
|
17
|
+
const project = projectDirs.flatMap((d) => readSkillDir(d, "project"));
|
|
18
|
+
const user = userDirs.flatMap((d) => readSkillDir(d, "user"));
|
|
16
19
|
// last-wins by name across [bundled, project, user]
|
|
17
20
|
const byName = new Map();
|
|
18
21
|
for (const s of [...bundled, ...project, ...user]) {
|
|
@@ -32,29 +35,104 @@ function readSkillDir(dir, origin) {
|
|
|
32
35
|
}
|
|
33
36
|
const out = [];
|
|
34
37
|
for (const e of entries) {
|
|
35
|
-
if (!e.endsWith(".md"))
|
|
36
|
-
continue;
|
|
37
38
|
const path = join(dir, e);
|
|
39
|
+
let st;
|
|
38
40
|
try {
|
|
39
|
-
|
|
40
|
-
if (!st.isFile())
|
|
41
|
-
continue;
|
|
42
|
-
const content = readFileSync(path, "utf8");
|
|
43
|
-
const name = basename(e, ".md");
|
|
44
|
-
out.push({
|
|
45
|
-
name,
|
|
46
|
-
description: extractDescription(content),
|
|
47
|
-
content,
|
|
48
|
-
origin,
|
|
49
|
-
path,
|
|
50
|
-
});
|
|
41
|
+
st = statSync(path);
|
|
51
42
|
}
|
|
52
43
|
catch {
|
|
53
|
-
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Flat layout: <name>.md
|
|
47
|
+
if (st.isFile() && e.endsWith(".md")) {
|
|
48
|
+
try {
|
|
49
|
+
const content = readFileSync(path, "utf8");
|
|
50
|
+
out.push(parseSkill(content, origin, path, basename(e, ".md")));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* skip unreadable */
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Bundle layout: <name>/SKILL.md (Anthropic skill spec / skills.sh).
|
|
58
|
+
if (st.isDirectory()) {
|
|
59
|
+
const skillFile = join(path, "SKILL.md");
|
|
60
|
+
try {
|
|
61
|
+
const fst = statSync(skillFile);
|
|
62
|
+
if (!fst.isFile())
|
|
63
|
+
continue;
|
|
64
|
+
const content = readFileSync(skillFile, "utf8");
|
|
65
|
+
out.push(parseSkill(content, origin, skillFile, e));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
/* no SKILL.md — skip */
|
|
69
|
+
}
|
|
54
70
|
}
|
|
55
71
|
}
|
|
56
72
|
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
57
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse a skill markdown into a SkillSource. Supports optional
|
|
76
|
+
* 3-dash-delimited YAML frontmatter (only `name:` and `description:` are
|
|
77
|
+
* inspected — additional keys are tolerated and ignored).
|
|
78
|
+
*
|
|
79
|
+
* The parsed `content` retains the frontmatter when present, so consumers
|
|
80
|
+
* (read_skill / agent prompts) see the full file as authored. This matches
|
|
81
|
+
* how ggcoder and the skills.sh ecosystem treat skill files.
|
|
82
|
+
*/
|
|
83
|
+
export function parseSkill(raw, origin, path, fallbackName) {
|
|
84
|
+
const fm = parseFrontmatter(raw);
|
|
85
|
+
return {
|
|
86
|
+
name: fm.name ?? fallbackName,
|
|
87
|
+
description: fm.description ?? extractDescription(stripFrontmatter(raw)),
|
|
88
|
+
content: raw,
|
|
89
|
+
origin,
|
|
90
|
+
path,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Read a YAML-ish frontmatter block at the start of a file. Only supports the
|
|
95
|
+
* tiny subset we care about — `key: value` lines, no nesting, no lists. That
|
|
96
|
+
* matches the Anthropic skill spec exactly. Multi-line `description: |` is
|
|
97
|
+
* NOT supported by design (skill descriptions should fit on one line so the
|
|
98
|
+
* system-prompt index reads cleanly).
|
|
99
|
+
*/
|
|
100
|
+
export function parseFrontmatter(raw) {
|
|
101
|
+
if (!raw.startsWith("---"))
|
|
102
|
+
return {};
|
|
103
|
+
const end = raw.indexOf("\n---", 3);
|
|
104
|
+
if (end < 0)
|
|
105
|
+
return {};
|
|
106
|
+
const block = raw.slice(3, end).trim();
|
|
107
|
+
const out = {};
|
|
108
|
+
for (const line of block.split(/\r?\n/)) {
|
|
109
|
+
const colon = line.indexOf(":");
|
|
110
|
+
if (colon < 0)
|
|
111
|
+
continue;
|
|
112
|
+
const key = line.slice(0, colon).trim().toLowerCase();
|
|
113
|
+
let value = line.slice(colon + 1).trim();
|
|
114
|
+
// Strip surrounding quotes (YAML allows either) — single OR double — so
|
|
115
|
+
// descriptions that contain colons can be quoted defensively.
|
|
116
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
117
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
118
|
+
value = value.slice(1, -1);
|
|
119
|
+
}
|
|
120
|
+
if (key === "name")
|
|
121
|
+
out.name = value;
|
|
122
|
+
else if (key === "description")
|
|
123
|
+
out.description = value;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
/** Drop the frontmatter block (if any), return body only. */
|
|
128
|
+
export function stripFrontmatter(raw) {
|
|
129
|
+
if (!raw.startsWith("---"))
|
|
130
|
+
return raw;
|
|
131
|
+
const end = raw.indexOf("\n---", 3);
|
|
132
|
+
if (end < 0)
|
|
133
|
+
return raw;
|
|
134
|
+
return raw.slice(end + 4).replace(/^\r?\n/, "");
|
|
135
|
+
}
|
|
58
136
|
/**
|
|
59
137
|
* Extract a one-line description from a skill markdown.
|
|
60
138
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-loader.js","sourceRoot":"","sources":["../../src/core/skills-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-loader.js","sourceRoot":"","sources":["../../src/core/skills-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { discoverSkills, extractDescription } from "./skills-loader.js";
|
|
5
|
+
import { discoverSkills, extractDescription, parseFrontmatter, stripFrontmatter, } from "./skills-loader.js";
|
|
6
6
|
const BUNDLED = [
|
|
7
7
|
{ name: "alpha", description: "bundled alpha", content: "# alpha\nbundled body" },
|
|
8
8
|
{ name: "beta", description: "bundled beta", content: "# beta\nbundled body" },
|
|
@@ -64,5 +64,67 @@ describe("discoverSkills", () => {
|
|
|
64
64
|
const alpha = r.find((s) => s.name === "alpha");
|
|
65
65
|
expect(alpha?.origin).toBe("user");
|
|
66
66
|
});
|
|
67
|
+
it("reads YAML frontmatter for name + description", () => {
|
|
68
|
+
const cwd = tmp("gg-skills-cwd-");
|
|
69
|
+
const home = tmp("gg-skills-home-");
|
|
70
|
+
mkdirSync(join(cwd, ".gg/editor-skills"), { recursive: true });
|
|
71
|
+
const md = '---\nname: my-skill\ndescription: "Use when X happens."\n---\n\n# My Skill\n\nBody.\n';
|
|
72
|
+
writeFileSync(join(cwd, ".gg/editor-skills/anything.md"), md);
|
|
73
|
+
const r = discoverSkills({ cwd, homeDir: home, bundled: BUNDLED });
|
|
74
|
+
const s = r.find((s) => s.name === "my-skill");
|
|
75
|
+
expect(s).toBeTruthy();
|
|
76
|
+
expect(s?.description).toBe("Use when X happens.");
|
|
77
|
+
// Content retains the frontmatter as authored — read_skill returns the
|
|
78
|
+
// full file so the agent can see metadata if it cares to.
|
|
79
|
+
expect(s?.content.startsWith("---\nname:")).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it("frontmatter falls back to filename + body extraction when keys missing", () => {
|
|
82
|
+
const cwd = tmp("gg-skills-cwd-");
|
|
83
|
+
const home = tmp("gg-skills-home-");
|
|
84
|
+
mkdirSync(join(cwd, ".gg/editor-skills"), { recursive: true });
|
|
85
|
+
writeFileSync(join(cwd, ".gg/editor-skills/foo.md"), "---\nother: stuff\n---\n\nA body line.\n");
|
|
86
|
+
const r = discoverSkills({ cwd, homeDir: home, bundled: BUNDLED });
|
|
87
|
+
const s = r.find((s) => s.name === "foo");
|
|
88
|
+
expect(s?.description).toBe("A body line.");
|
|
89
|
+
});
|
|
90
|
+
it("loads bundle-layout skill (<name>/SKILL.md)", () => {
|
|
91
|
+
const cwd = tmp("gg-skills-cwd-");
|
|
92
|
+
const home = tmp("gg-skills-home-");
|
|
93
|
+
mkdirSync(join(cwd, ".gg/editor-skills/bundled-name"), { recursive: true });
|
|
94
|
+
writeFileSync(join(cwd, ".gg/editor-skills/bundled-name/SKILL.md"), "---\nname: real-name\ndescription: From SKILL.md\n---\n\nBody.\n");
|
|
95
|
+
const r = discoverSkills({ cwd, homeDir: home, bundled: BUNDLED });
|
|
96
|
+
const s = r.find((s) => s.name === "real-name");
|
|
97
|
+
expect(s?.origin).toBe("project");
|
|
98
|
+
expect(s?.description).toBe("From SKILL.md");
|
|
99
|
+
expect(s?.path?.endsWith("SKILL.md")).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it("discovers from .gg/skills/ as well as legacy .gg/editor-skills/", () => {
|
|
102
|
+
const cwd = tmp("gg-skills-cwd-");
|
|
103
|
+
const home = tmp("gg-skills-home-");
|
|
104
|
+
mkdirSync(join(cwd, ".gg/skills"), { recursive: true });
|
|
105
|
+
writeFileSync(join(cwd, ".gg/skills/ecosystem.md"), "---\nname: ecosystem\ndescription: skills.sh format\n---\nBody\n");
|
|
106
|
+
const r = discoverSkills({ cwd, homeDir: home, bundled: BUNDLED });
|
|
107
|
+
expect(r.find((s) => s.name === "ecosystem")?.origin).toBe("project");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe("parseFrontmatter / stripFrontmatter", () => {
|
|
111
|
+
it("empty frontmatter when no leading ---", () => {
|
|
112
|
+
expect(parseFrontmatter("# heading\n\nbody")).toEqual({});
|
|
113
|
+
});
|
|
114
|
+
it("unterminated frontmatter is ignored", () => {
|
|
115
|
+
expect(parseFrontmatter("---\nname: x\n")).toEqual({});
|
|
116
|
+
});
|
|
117
|
+
it("strips quotes around values", () => {
|
|
118
|
+
const fm = parseFrontmatter("---\nname: \"with: colon\"\ndescription: 'single'\n---\n");
|
|
119
|
+
expect(fm.name).toBe("with: colon");
|
|
120
|
+
expect(fm.description).toBe("single");
|
|
121
|
+
});
|
|
122
|
+
it("stripFrontmatter removes the block + leading newline", () => {
|
|
123
|
+
const md = "---\nname: x\n---\n# heading\n";
|
|
124
|
+
expect(stripFrontmatter(md)).toBe("# heading\n");
|
|
125
|
+
});
|
|
126
|
+
it("stripFrontmatter is a no-op when no frontmatter", () => {
|
|
127
|
+
expect(stripFrontmatter("# h\n")).toBe("# h\n");
|
|
128
|
+
});
|
|
67
129
|
});
|
|
68
130
|
//# sourceMappingURL=skills-loader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-loader.test.js","sourceRoot":"","sources":["../../src/core/skills-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,
|
|
1
|
+
{"version":3,"file":"skills-loader.test.js","sourceRoot":"","sources":["../../src/core/skills-loader.test.ts"],"names":[],"mappings":"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"}
|
package/dist/core/srt.d.ts
CHANGED
|
@@ -14,13 +14,31 @@
|
|
|
14
14
|
* CRLF line endings are NOT required by the spec — most parsers accept LF
|
|
15
15
|
* (we emit LF for simplicity and cross-platform sanity).
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* ── Precision policy ─────────────────────────────────────────
|
|
18
|
+
* SRT's wire precision is exactly 1ms. We canonicalise every timestamp to a
|
|
19
|
+
* non-negative INTEGER millisecond at the boundary of this module:
|
|
20
|
+
*
|
|
21
|
+
* secondsToMs(s) = Math.max(0, Math.round(s * 1000))
|
|
22
|
+
*
|
|
23
|
+
* All downstream math (cue ordering, gap extension, end>start validation,
|
|
24
|
+
* grouping) runs on those ms-ints. This eliminates two whole classes of
|
|
25
|
+
* float-arithmetic bugs:
|
|
26
|
+
*
|
|
27
|
+
* 1. Cues whose float `end > start` but whose ms-rounded values collide
|
|
28
|
+
* (e.g. start=0.1001, end=0.1004 → both round to 100). The float check
|
|
29
|
+
* would pass, then we'd emit `00:00:00,100 --> 00:00:00,100` — invalid.
|
|
30
|
+
* 2. Drift when extending a cue's end up to the next cue's start: float
|
|
31
|
+
* assignment can carry a 1e-15 epsilon that flips a Math.round at the
|
|
32
|
+
* ms boundary. Integer assignment is exact.
|
|
33
|
+
*
|
|
34
|
+
* Callers pass seconds (the natural unit for whisper / OpenAI output); the
|
|
35
|
+
* conversion happens exactly once per timestamp, here. If you already have
|
|
36
|
+
* ms-ints upstream, use `formatSrtTimeMs` directly to skip the round trip.
|
|
19
37
|
*/
|
|
20
38
|
export interface SrtCue {
|
|
21
|
-
/** Start time in seconds. */
|
|
39
|
+
/** Start time in seconds. Internally rounded to ms-int. */
|
|
22
40
|
start: number;
|
|
23
|
-
/** End time in seconds. Must be > start. */
|
|
41
|
+
/** End time in seconds. Must be > start AFTER ms-rounding (see policy above). */
|
|
24
42
|
end: number;
|
|
25
43
|
/** Caption text. Multi-line OK. Trimmed. */
|
|
26
44
|
text: string;
|
|
@@ -39,7 +57,9 @@ export interface WordCue {
|
|
|
39
57
|
* captions where each word pops as it's spoken.
|
|
40
58
|
*
|
|
41
59
|
* Behaviour:
|
|
42
|
-
* - Skips empty / zero-duration words.
|
|
60
|
+
* - Skips empty / zero-duration words (post-rounding, so 0.1001s/0.1004s
|
|
61
|
+
* pairs that collapse to the same ms are dropped instead of producing
|
|
62
|
+
* invalid same-stamp cues).
|
|
43
63
|
* - Optional `groupSize` clusters N consecutive words into one cue (e.g. 2-3
|
|
44
64
|
* words at a time for a more readable rhythm). Default 1.
|
|
45
65
|
* - Optional `gapSec` extends a cue's end up to the next cue's start so the
|
|
@@ -49,8 +69,23 @@ export declare function buildWordLevelSrt(words: WordCue[], opts?: {
|
|
|
49
69
|
groupSize?: number;
|
|
50
70
|
gapSec?: number;
|
|
51
71
|
}): string;
|
|
52
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* Build an SRT string from cues. Cues are emitted in input order. Throws on
|
|
74
|
+
* cues that collapse to zero or negative duration AFTER ms-rounding —
|
|
75
|
+
* upstream code is expected to handle that ahead of time.
|
|
76
|
+
*/
|
|
53
77
|
export declare function buildSrt(cues: SrtCue[]): string;
|
|
54
|
-
/** Format seconds → "HH:MM:SS,mmm" (SRT timestamp). */
|
|
78
|
+
/** Format seconds → "HH:MM:SS,mmm" (SRT timestamp). Single rounding step. */
|
|
55
79
|
export declare function formatSrtTime(seconds: number): string;
|
|
80
|
+
/**
|
|
81
|
+
* Format ms-int → "HH:MM:SS,mmm". Use this when you already have ms-int
|
|
82
|
+
* timing (e.g. straight off whisper.cpp's `offsets.from`) to avoid an
|
|
83
|
+
* unnecessary round-trip through float seconds.
|
|
84
|
+
*/
|
|
85
|
+
export declare function msToSrtTime(ms: number): string;
|
|
86
|
+
/**
|
|
87
|
+
* Convert float seconds → integer milliseconds with the same rounding rule
|
|
88
|
+
* used everywhere in this module. Negative inputs and NaN clamp to 0.
|
|
89
|
+
*/
|
|
90
|
+
export declare function secondsToMs(seconds: number): number;
|
|
56
91
|
//# sourceMappingURL=srt.d.ts.map
|
package/dist/core/srt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"srt.d.ts","sourceRoot":"","sources":["../../src/core/srt.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"srt.d.ts","sourceRoot":"","sources":["../../src/core/srt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,WAAW,MAAM;IACrB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EAAE,EAChB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAsCR;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAoB/C;AAkBD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAS9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|