vidpipe 1.0.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/README.md +243 -0
- package/assets/fonts/Montserrat-Bold.ttf +0 -0
- package/assets/fonts/Montserrat-Regular.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/dist/__tests__/agents.test.d.ts +2 -0
- package/dist/__tests__/agents.test.d.ts.map +1 -0
- package/dist/__tests__/agents.test.js +434 -0
- package/dist/__tests__/agents.test.js.map +1 -0
- package/dist/__tests__/aspectRatio.test.d.ts +2 -0
- package/dist/__tests__/aspectRatio.test.d.ts.map +1 -0
- package/dist/__tests__/aspectRatio.test.js +406 -0
- package/dist/__tests__/aspectRatio.test.js.map +1 -0
- package/dist/__tests__/captionGenerator.test.d.ts +2 -0
- package/dist/__tests__/captionGenerator.test.d.ts.map +1 -0
- package/dist/__tests__/captionGenerator.test.js +435 -0
- package/dist/__tests__/captionGenerator.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +81 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/faceDetection.test.d.ts +2 -0
- package/dist/__tests__/faceDetection.test.d.ts.map +1 -0
- package/dist/__tests__/faceDetection.test.js +372 -0
- package/dist/__tests__/faceDetection.test.js.map +1 -0
- package/dist/__tests__/ffmpegTools.test.d.ts +2 -0
- package/dist/__tests__/ffmpegTools.test.d.ts.map +1 -0
- package/dist/__tests__/ffmpegTools.test.js +464 -0
- package/dist/__tests__/ffmpegTools.test.js.map +1 -0
- package/dist/__tests__/integration/captionBurn.test.d.ts +2 -0
- package/dist/__tests__/integration/captionBurn.test.d.ts.map +1 -0
- package/dist/__tests__/integration/captionBurn.test.js +103 -0
- package/dist/__tests__/integration/captionBurn.test.js.map +1 -0
- package/dist/__tests__/integration/clipComposite.test.d.ts +2 -0
- package/dist/__tests__/integration/clipComposite.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clipComposite.test.js +56 -0
- package/dist/__tests__/integration/clipComposite.test.js.map +1 -0
- package/dist/__tests__/integration/faceDetection.test.d.ts +2 -0
- package/dist/__tests__/integration/faceDetection.test.d.ts.map +1 -0
- package/dist/__tests__/integration/faceDetection.test.js +85 -0
- package/dist/__tests__/integration/faceDetection.test.js.map +1 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.d.ts +2 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.js +88 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.js.map +1 -0
- package/dist/__tests__/integration/fixture.d.ts +19 -0
- package/dist/__tests__/integration/fixture.d.ts.map +1 -0
- package/dist/__tests__/integration/fixture.js +112 -0
- package/dist/__tests__/integration/fixture.js.map +1 -0
- package/dist/__tests__/integration/fixture.test.d.ts +2 -0
- package/dist/__tests__/integration/fixture.test.d.ts.map +1 -0
- package/dist/__tests__/integration/fixture.test.js +27 -0
- package/dist/__tests__/integration/fixture.test.js.map +1 -0
- package/dist/__tests__/integration/realCaptions.test.d.ts +2 -0
- package/dist/__tests__/integration/realCaptions.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realCaptions.test.js +226 -0
- package/dist/__tests__/integration/realCaptions.test.js.map +1 -0
- package/dist/__tests__/integration/realPipeline.test.d.ts +2 -0
- package/dist/__tests__/integration/realPipeline.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realPipeline.test.js +210 -0
- package/dist/__tests__/integration/realPipeline.test.js.map +1 -0
- package/dist/__tests__/integration/silenceRemoval.test.d.ts +2 -0
- package/dist/__tests__/integration/silenceRemoval.test.d.ts.map +1 -0
- package/dist/__tests__/integration/silenceRemoval.test.js +93 -0
- package/dist/__tests__/integration/silenceRemoval.test.js.map +1 -0
- package/dist/__tests__/pipeline.test.d.ts +2 -0
- package/dist/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline.test.js +434 -0
- package/dist/__tests__/pipeline.test.js.map +1 -0
- package/dist/__tests__/services.test.d.ts +2 -0
- package/dist/__tests__/services.test.d.ts.map +1 -0
- package/dist/__tests__/services.test.js +655 -0
- package/dist/__tests__/services.test.js.map +1 -0
- package/dist/__tests__/silenceRemoval.test.d.ts +2 -0
- package/dist/__tests__/silenceRemoval.test.d.ts.map +1 -0
- package/dist/__tests__/silenceRemoval.test.js +266 -0
- package/dist/__tests__/silenceRemoval.test.js.map +1 -0
- package/dist/__tests__/singlePassEdit.test.d.ts +2 -0
- package/dist/__tests__/singlePassEdit.test.d.ts.map +1 -0
- package/dist/__tests__/singlePassEdit.test.js +321 -0
- package/dist/__tests__/singlePassEdit.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +2 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +8 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/utilities.test.d.ts +2 -0
- package/dist/__tests__/utilities.test.d.ts.map +1 -0
- package/dist/__tests__/utilities.test.js +268 -0
- package/dist/__tests__/utilities.test.js.map +1 -0
- package/dist/agents/BaseAgent.d.ts +52 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -0
- package/dist/agents/BaseAgent.js +108 -0
- package/dist/agents/BaseAgent.js.map +1 -0
- package/dist/agents/BlogAgent.d.ts +3 -0
- package/dist/agents/BlogAgent.d.ts.map +1 -0
- package/dist/agents/BlogAgent.js +163 -0
- package/dist/agents/BlogAgent.js.map +1 -0
- package/dist/agents/ChapterAgent.d.ts +11 -0
- package/dist/agents/ChapterAgent.d.ts.map +1 -0
- package/dist/agents/ChapterAgent.js +191 -0
- package/dist/agents/ChapterAgent.js.map +1 -0
- package/dist/agents/MediumVideoAgent.d.ts +3 -0
- package/dist/agents/MediumVideoAgent.d.ts.map +1 -0
- package/dist/agents/MediumVideoAgent.js +219 -0
- package/dist/agents/MediumVideoAgent.js.map +1 -0
- package/dist/agents/ShortsAgent.d.ts +3 -0
- package/dist/agents/ShortsAgent.d.ts.map +1 -0
- package/dist/agents/ShortsAgent.js +243 -0
- package/dist/agents/ShortsAgent.js.map +1 -0
- package/dist/agents/SilenceRemovalAgent.d.ts +9 -0
- package/dist/agents/SilenceRemovalAgent.d.ts.map +1 -0
- package/dist/agents/SilenceRemovalAgent.js +208 -0
- package/dist/agents/SilenceRemovalAgent.js.map +1 -0
- package/dist/agents/SocialMediaAgent.d.ts +4 -0
- package/dist/agents/SocialMediaAgent.d.ts.map +1 -0
- package/dist/agents/SocialMediaAgent.js +248 -0
- package/dist/agents/SocialMediaAgent.js.map +1 -0
- package/dist/agents/SummaryAgent.d.ts +11 -0
- package/dist/agents/SummaryAgent.d.ts.map +1 -0
- package/dist/agents/SummaryAgent.js +333 -0
- package/dist/agents/SummaryAgent.js.map +1 -0
- package/dist/config/brand.d.ts +29 -0
- package/dist/config/brand.d.ts.map +1 -0
- package/dist/config/brand.js +83 -0
- package/dist/config/brand.js.map +1 -0
- package/dist/config/environment.d.ts +36 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +44 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/config/logger.d.ts +5 -0
- package/dist/config/logger.d.ts.map +1 -0
- package/dist/config/logger.js +13 -0
- package/dist/config/logger.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline.d.ts +57 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +287 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/services/captionGeneration.d.ts +7 -0
- package/dist/services/captionGeneration.d.ts.map +1 -0
- package/dist/services/captionGeneration.js +29 -0
- package/dist/services/captionGeneration.js.map +1 -0
- package/dist/services/fileWatcher.d.ts +19 -0
- package/dist/services/fileWatcher.d.ts.map +1 -0
- package/dist/services/fileWatcher.js +120 -0
- package/dist/services/fileWatcher.js.map +1 -0
- package/dist/services/gitOperations.d.ts +3 -0
- package/dist/services/gitOperations.d.ts.map +1 -0
- package/dist/services/gitOperations.js +43 -0
- package/dist/services/gitOperations.js.map +1 -0
- package/dist/services/socialPosting.d.ts +38 -0
- package/dist/services/socialPosting.d.ts.map +1 -0
- package/dist/services/socialPosting.js +102 -0
- package/dist/services/socialPosting.js.map +1 -0
- package/dist/services/transcription.d.ts +3 -0
- package/dist/services/transcription.d.ts.map +1 -0
- package/dist/services/transcription.js +100 -0
- package/dist/services/transcription.js.map +1 -0
- package/dist/services/videoIngestion.d.ts +3 -0
- package/dist/services/videoIngestion.d.ts.map +1 -0
- package/dist/services/videoIngestion.js +103 -0
- package/dist/services/videoIngestion.js.map +1 -0
- package/dist/tools/captions/captionGenerator.d.ts +84 -0
- package/dist/tools/captions/captionGenerator.d.ts.map +1 -0
- package/dist/tools/captions/captionGenerator.js +390 -0
- package/dist/tools/captions/captionGenerator.js.map +1 -0
- package/dist/tools/ffmpeg/aspectRatio.d.ts +101 -0
- package/dist/tools/ffmpeg/aspectRatio.d.ts.map +1 -0
- package/dist/tools/ffmpeg/aspectRatio.js +338 -0
- package/dist/tools/ffmpeg/aspectRatio.js.map +1 -0
- package/dist/tools/ffmpeg/audioExtraction.d.ts +16 -0
- package/dist/tools/ffmpeg/audioExtraction.d.ts.map +1 -0
- package/dist/tools/ffmpeg/audioExtraction.js +86 -0
- package/dist/tools/ffmpeg/audioExtraction.js.map +1 -0
- package/dist/tools/ffmpeg/captionBurning.d.ts +8 -0
- package/dist/tools/ffmpeg/captionBurning.d.ts.map +1 -0
- package/dist/tools/ffmpeg/captionBurning.js +71 -0
- package/dist/tools/ffmpeg/captionBurning.js.map +1 -0
- package/dist/tools/ffmpeg/clipExtraction.d.ts +23 -0
- package/dist/tools/ffmpeg/clipExtraction.d.ts.map +1 -0
- package/dist/tools/ffmpeg/clipExtraction.js +178 -0
- package/dist/tools/ffmpeg/clipExtraction.js.map +1 -0
- package/dist/tools/ffmpeg/faceDetection.d.ts +127 -0
- package/dist/tools/ffmpeg/faceDetection.d.ts.map +1 -0
- package/dist/tools/ffmpeg/faceDetection.js +500 -0
- package/dist/tools/ffmpeg/faceDetection.js.map +1 -0
- package/dist/tools/ffmpeg/frameCapture.d.ts +10 -0
- package/dist/tools/ffmpeg/frameCapture.d.ts.map +1 -0
- package/dist/tools/ffmpeg/frameCapture.js +48 -0
- package/dist/tools/ffmpeg/frameCapture.js.map +1 -0
- package/dist/tools/ffmpeg/silenceDetection.d.ts +10 -0
- package/dist/tools/ffmpeg/silenceDetection.d.ts.map +1 -0
- package/dist/tools/ffmpeg/silenceDetection.js +55 -0
- package/dist/tools/ffmpeg/silenceDetection.js.map +1 -0
- package/dist/tools/ffmpeg/singlePassEdit.d.ts +25 -0
- package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +1 -0
- package/dist/tools/ffmpeg/singlePassEdit.js +123 -0
- package/dist/tools/ffmpeg/singlePassEdit.js.map +1 -0
- package/dist/tools/search/exaClient.d.ts +8 -0
- package/dist/tools/search/exaClient.d.ts.map +1 -0
- package/dist/tools/search/exaClient.js +38 -0
- package/dist/tools/search/exaClient.js.map +1 -0
- package/dist/tools/whisper/whisperClient.d.ts +3 -0
- package/dist/tools/whisper/whisperClient.d.ts.map +1 -0
- package/dist/tools/whisper/whisperClient.js +77 -0
- package/dist/tools/whisper/whisperClient.js.map +1 -0
- package/dist/types/index.d.ts +305 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +44 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +63 -0
package/README.md
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
[](https://github.com/htekdev/vidpipe/actions/workflows/ci.yml)
|
|
2
|
+
[](https://www.npmjs.com/package/vidpipe)
|
|
3
|
+
[](https://nodejs.org/)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
6
|
+
# 🎬 VidPipe
|
|
7
|
+
|
|
8
|
+
**Drop a video. Get transcripts, summaries, short clips, captions, blog posts, and social media posts — automatically.**
|
|
9
|
+
|
|
10
|
+
An AI-powered CLI pipeline that watches for new video recordings and transforms them into rich, structured content using [GitHub Copilot SDK](https://github.com/github/copilot-sdk) agents and OpenAI Whisper.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g vidpipe
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## ✨ Features
|
|
19
|
+
|
|
20
|
+
- 🎬 **14-Stage Automated Pipeline** — Drop a video and walk away; everything runs end-to-end
|
|
21
|
+
- 🎙️ **Whisper Transcription** — Word-level timestamps via OpenAI Whisper API
|
|
22
|
+
- 🔇 **AI-Driven Silence Removal** — Conservative, context-aware dead-air detection (capped at 20% removal)
|
|
23
|
+
- 📐 **Smart Split-Screen Layouts** — Webcam + screen content for 3 aspect ratios: portrait (9:16), square (1:1), and feed (4:5)
|
|
24
|
+
- 🔍 **Edge-Based Webcam Detection** — Detects webcam overlay position via skin-tone analysis and inter-frame edge refinement (no hardcoded margins)
|
|
25
|
+
- 🎯 **Face-Aware AR-Matched Cropping** — Webcam region is aspect-ratio-matched and center-cropped to fill each layout with no black bars
|
|
26
|
+
- 💬 **Karaoke Captions** — Opus Clips-style word-by-word highlighting with green active word on portrait, yellow on landscape
|
|
27
|
+
- 🪝 **Hook Overlays** — Animated title text burned into portrait short clips
|
|
28
|
+
- ✂️ **Short Clips** — AI identifies the best 15–60s moments, supports composite (multi-segment) shorts
|
|
29
|
+
- 🎞️ **Medium Clips** — 1–3 min standalone segments for deeper content with crossfade transitions
|
|
30
|
+
- 📑 **Chapter Detection** — AI-identified topic boundaries in 4 formats (JSON, Markdown, FFmetadata, YouTube timestamps)
|
|
31
|
+
- 📱 **Social Media Posts** — Platform-tailored content for TikTok, YouTube, Instagram, LinkedIn, and X
|
|
32
|
+
- 📰 **Dev.to Blog Post** — Long-form technical blog post with frontmatter and web-sourced links
|
|
33
|
+
- 🔗 **Web Search Integration** — Finds relevant links for social posts and blog content via Exa
|
|
34
|
+
- 🔄 **Git Automation** — Auto-commits and pushes all generated content after each video
|
|
35
|
+
- 🎨 **Brand Voice** — Customize AI tone, vocabulary, hashtags, and content style via `brand.json`
|
|
36
|
+
- 👁️ **Watch Mode** — Monitors a folder and processes new `.mp4` files on arrival
|
|
37
|
+
- 🧠 **Agent Architecture** — Powered by GitHub Copilot SDK with tool-calling agents
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🚀 Quick Start
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Install globally
|
|
45
|
+
npm install -g vidpipe
|
|
46
|
+
|
|
47
|
+
# Process a single video
|
|
48
|
+
vidpipe /path/to/video.mp4
|
|
49
|
+
|
|
50
|
+
# Watch a folder for new recordings
|
|
51
|
+
vidpipe --watch-dir ~/Videos/Recordings
|
|
52
|
+
|
|
53
|
+
# Full example with options
|
|
54
|
+
vidpipe \
|
|
55
|
+
--watch-dir ~/Videos/Recordings \
|
|
56
|
+
--output-dir ~/Content/processed \
|
|
57
|
+
--openai-key sk-... \
|
|
58
|
+
--brand ./brand.json \
|
|
59
|
+
--verbose
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> **Prerequisites:** Node.js 20+, FFmpeg 6.0+, and an OpenAI API key.
|
|
63
|
+
> See [Getting Started](./docs/getting-started.md) for full setup instructions.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 🎮 CLI Usage
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
vidpipe [options] [video-path]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
| Option | Description |
|
|
74
|
+
|--------|-------------|
|
|
75
|
+
| `[video-path]` | Process a specific video file (implies `--once`) |
|
|
76
|
+
| `--watch-dir <path>` | Folder to watch for new recordings |
|
|
77
|
+
| `--output-dir <path>` | Output directory (default: `./recordings`) |
|
|
78
|
+
| `--openai-key <key>` | OpenAI API key |
|
|
79
|
+
| `--exa-key <key>` | Exa AI key for web search in social posts |
|
|
80
|
+
| `--brand <path>` | Path to `brand.json` (default: `./brand.json`) |
|
|
81
|
+
| `--once` | Process next video and exit |
|
|
82
|
+
| `--no-silence-removal` | Skip silence removal |
|
|
83
|
+
| `--no-shorts` | Skip short clip extraction |
|
|
84
|
+
| `--no-medium-clips` | Skip medium clip generation |
|
|
85
|
+
| `--no-social` | Skip social media posts |
|
|
86
|
+
| `--no-captions` | Skip caption generation/burning |
|
|
87
|
+
| `--no-git` | Skip git commit/push |
|
|
88
|
+
| `-v, --verbose` | Debug-level logging |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 📁 Output Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
recordings/
|
|
96
|
+
└── my-awesome-demo/
|
|
97
|
+
├── my-awesome-demo.mp4 # Original video
|
|
98
|
+
├── my-awesome-demo-edited.mp4 # Silence-removed
|
|
99
|
+
├── my-awesome-demo-captioned.mp4 # With burned-in captions
|
|
100
|
+
├── transcript.json # Word-level transcript
|
|
101
|
+
├── transcript-edited.json # Timestamps adjusted for silence removal
|
|
102
|
+
├── README.md # AI-generated summary with screenshots
|
|
103
|
+
├── captions/
|
|
104
|
+
│ ├── captions.srt # SubRip subtitles
|
|
105
|
+
│ ├── captions.vtt # WebVTT subtitles
|
|
106
|
+
│ └── captions.ass # Advanced SSA (karaoke-style)
|
|
107
|
+
├── shorts/
|
|
108
|
+
│ ├── catchy-title.mp4 # Landscape base clip
|
|
109
|
+
│ ├── catchy-title-captioned.mp4 # Landscape + burned captions
|
|
110
|
+
│ ├── catchy-title-portrait.mp4 # 9:16 split-screen
|
|
111
|
+
│ ├── catchy-title-portrait-captioned.mp4 # Portrait + captions + hook overlay
|
|
112
|
+
│ ├── catchy-title-feed.mp4 # 4:5 split-screen
|
|
113
|
+
│ ├── catchy-title-square.mp4 # 1:1 split-screen
|
|
114
|
+
│ ├── catchy-title.md # Clip metadata
|
|
115
|
+
│ └── catchy-title/
|
|
116
|
+
│ └── posts/ # Per-short social posts (5 platforms)
|
|
117
|
+
├── medium-clips/
|
|
118
|
+
│ ├── deep-dive-topic.mp4 # Landscape base clip
|
|
119
|
+
│ ├── deep-dive-topic-captioned.mp4 # With burned captions
|
|
120
|
+
│ ├── deep-dive-topic.md # Clip metadata
|
|
121
|
+
│ └── deep-dive-topic/
|
|
122
|
+
│ └── posts/ # Per-clip social posts (5 platforms)
|
|
123
|
+
├── chapters/
|
|
124
|
+
│ ├── chapters.json # Structured chapter data
|
|
125
|
+
│ ├── chapters.md # Markdown table
|
|
126
|
+
│ ├── chapters.ffmetadata # FFmpeg metadata format
|
|
127
|
+
│ └── chapters-youtube.txt # YouTube description timestamps
|
|
128
|
+
└── social-posts/
|
|
129
|
+
├── tiktok.md # Full-video social posts
|
|
130
|
+
├── youtube.md
|
|
131
|
+
├── instagram.md
|
|
132
|
+
├── linkedin.md
|
|
133
|
+
├── x.md
|
|
134
|
+
└── devto.md # Dev.to blog post
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 🔄 Pipeline
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Ingest → Transcribe → Silence Removal → Captions → Caption Burn → Shorts → Medium Clips → Chapters → Summary → Social Media → Short Posts → Medium Clip Posts → Blog → Git Push
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
| # | Stage | Description |
|
|
146
|
+
|---|-------|-------------|
|
|
147
|
+
| 1 | **Ingestion** | Copies video, extracts metadata with FFprobe |
|
|
148
|
+
| 2 | **Transcription** | Extracts audio → OpenAI Whisper for word-level transcription |
|
|
149
|
+
| 3 | **Silence Removal** | AI detects dead-air segments; context-aware removals capped at 20% |
|
|
150
|
+
| 4 | **Captions** | Generates `.srt`, `.vtt`, and `.ass` subtitle files with karaoke word highlighting |
|
|
151
|
+
| 5 | **Caption Burn** | Burns ASS captions into video (single-pass encode when silence was also removed) |
|
|
152
|
+
| 6 | **Shorts** | AI identifies best 15–60s moments; extracts single and composite clips with 6 variants per short |
|
|
153
|
+
| 7 | **Medium Clips** | AI identifies 1–3 min standalone segments with crossfade transitions |
|
|
154
|
+
| 8 | **Chapters** | AI detects topic boundaries; outputs JSON, Markdown, FFmetadata, and YouTube timestamps |
|
|
155
|
+
| 9 | **Summary** | AI writes a Markdown README with captured screenshots |
|
|
156
|
+
| 10 | **Social Media** | Platform-tailored posts for TikTok, YouTube, Instagram, LinkedIn, and X |
|
|
157
|
+
| 11 | **Short Posts** | Per-short social media posts for all 5 platforms |
|
|
158
|
+
| 12 | **Medium Clip Posts** | Per-medium-clip social media posts for all 5 platforms |
|
|
159
|
+
| 13 | **Blog** | Dev.to blog post with frontmatter, web-sourced links via Exa |
|
|
160
|
+
| 14 | **Git Push** | Auto-commits and pushes to `origin main` |
|
|
161
|
+
|
|
162
|
+
Each stage can be independently skipped with `--no-*` flags. A stage failure does not abort the pipeline — subsequent stages proceed with whatever data is available.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## ⚙️ Configuration
|
|
167
|
+
|
|
168
|
+
Configuration is loaded from CLI flags → environment variables → `.env` file → defaults.
|
|
169
|
+
|
|
170
|
+
```env
|
|
171
|
+
# .env
|
|
172
|
+
OPENAI_API_KEY=sk-your-key-here
|
|
173
|
+
WATCH_FOLDER=/path/to/recordings
|
|
174
|
+
OUTPUT_DIR=/path/to/output
|
|
175
|
+
# EXA_API_KEY=your-exa-key # Optional: enables web search in social/blog posts
|
|
176
|
+
# BRAND_PATH=./brand.json # Optional: path to brand voice config
|
|
177
|
+
# FFMPEG_PATH=/usr/local/bin/ffmpeg
|
|
178
|
+
# FFPROBE_PATH=/usr/local/bin/ffprobe
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 📚 Documentation
|
|
184
|
+
|
|
185
|
+
| Guide | Description |
|
|
186
|
+
|-------|-------------|
|
|
187
|
+
| [Getting Started](./docs/getting-started.md) | Prerequisites, installation, and first run |
|
|
188
|
+
| [Configuration](./docs/configuration.md) | All CLI flags, env vars, skip options, and examples |
|
|
189
|
+
| [FFmpeg Setup](./docs/ffmpeg-setup.md) | Platform-specific install (Windows, macOS, Linux, ARM64) |
|
|
190
|
+
| [Brand Customization](./docs/brand-customization.md) | Customize AI voice, vocabulary, hashtags, and content style |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 🏗️ Architecture
|
|
195
|
+
|
|
196
|
+
Agent-based architecture built on the [GitHub Copilot SDK](https://github.com/github/copilot-sdk):
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
BaseAgent (abstract)
|
|
200
|
+
├── SilenceRemovalAgent → detect_silence, decide_removals
|
|
201
|
+
├── SummaryAgent → capture_frame, write_summary
|
|
202
|
+
├── ShortsAgent → plan_shorts
|
|
203
|
+
├── MediumVideoAgent → plan_medium_clips
|
|
204
|
+
├── ChapterAgent → generate_chapters
|
|
205
|
+
├── SocialMediaAgent → search_links, create_posts
|
|
206
|
+
└── BlogAgent → search_web, write_blog
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Each agent communicates with the LLM through structured tool calls, ensuring reliable, parseable outputs.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 🛠️ Tech Stack
|
|
214
|
+
|
|
215
|
+
| Technology | Purpose |
|
|
216
|
+
|------------|---------|
|
|
217
|
+
| [TypeScript](https://www.typescriptlang.org/) | Language (ES2022, ESM) |
|
|
218
|
+
| [GitHub Copilot SDK](https://github.com/github/copilot-sdk) | AI agent framework |
|
|
219
|
+
| [OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text) | Speech-to-text |
|
|
220
|
+
| [FFmpeg](https://ffmpeg.org/) | Video/audio processing |
|
|
221
|
+
| [Sharp](https://sharp.pixelplumbing.com/) | Image analysis (webcam detection) |
|
|
222
|
+
| [Commander.js](https://github.com/tj/commander.js) | CLI framework |
|
|
223
|
+
| [Chokidar](https://github.com/paulmillr/chokidar) | File system watching |
|
|
224
|
+
| [Winston](https://github.com/winstonjs/winston) | Logging |
|
|
225
|
+
| [Exa AI](https://exa.ai/) | Web search for social posts and blog |
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 🗺️ Roadmap
|
|
230
|
+
|
|
231
|
+
- [ ] **Automated social posting** — Publish directly to platforms via their APIs
|
|
232
|
+
- [ ] **Multi-language support** — Transcription and summaries in multiple languages
|
|
233
|
+
- [ ] **Custom templates** — User-defined Markdown & social post templates
|
|
234
|
+
- [ ] **Web dashboard** — Browser UI for reviewing and editing outputs
|
|
235
|
+
- [ ] **Batch processing** — Process an entire folder of existing videos
|
|
236
|
+
- [ ] **Custom short criteria** — Configure what makes a "good" short for your content
|
|
237
|
+
- [ ] **Thumbnail generation** — Auto-generate branded thumbnails for shorts
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 📄 License
|
|
242
|
+
|
|
243
|
+
ISC © [htekdev](https://github.com/htekdev)
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2024 The Montserrat.Git Project Authors (https://github.com/JulietaUla/Montserrat.git)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
https://openfontlicense.org
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agents.test.ts"],"names":[],"mappings":""}
|