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.
Files changed (213) hide show
  1. package/README.md +243 -0
  2. package/assets/fonts/Montserrat-Bold.ttf +0 -0
  3. package/assets/fonts/Montserrat-Regular.ttf +0 -0
  4. package/assets/fonts/OFL.txt +93 -0
  5. package/dist/__tests__/agents.test.d.ts +2 -0
  6. package/dist/__tests__/agents.test.d.ts.map +1 -0
  7. package/dist/__tests__/agents.test.js +434 -0
  8. package/dist/__tests__/agents.test.js.map +1 -0
  9. package/dist/__tests__/aspectRatio.test.d.ts +2 -0
  10. package/dist/__tests__/aspectRatio.test.d.ts.map +1 -0
  11. package/dist/__tests__/aspectRatio.test.js +406 -0
  12. package/dist/__tests__/aspectRatio.test.js.map +1 -0
  13. package/dist/__tests__/captionGenerator.test.d.ts +2 -0
  14. package/dist/__tests__/captionGenerator.test.d.ts.map +1 -0
  15. package/dist/__tests__/captionGenerator.test.js +435 -0
  16. package/dist/__tests__/captionGenerator.test.js.map +1 -0
  17. package/dist/__tests__/config.test.d.ts +2 -0
  18. package/dist/__tests__/config.test.d.ts.map +1 -0
  19. package/dist/__tests__/config.test.js +81 -0
  20. package/dist/__tests__/config.test.js.map +1 -0
  21. package/dist/__tests__/faceDetection.test.d.ts +2 -0
  22. package/dist/__tests__/faceDetection.test.d.ts.map +1 -0
  23. package/dist/__tests__/faceDetection.test.js +372 -0
  24. package/dist/__tests__/faceDetection.test.js.map +1 -0
  25. package/dist/__tests__/ffmpegTools.test.d.ts +2 -0
  26. package/dist/__tests__/ffmpegTools.test.d.ts.map +1 -0
  27. package/dist/__tests__/ffmpegTools.test.js +464 -0
  28. package/dist/__tests__/ffmpegTools.test.js.map +1 -0
  29. package/dist/__tests__/integration/captionBurn.test.d.ts +2 -0
  30. package/dist/__tests__/integration/captionBurn.test.d.ts.map +1 -0
  31. package/dist/__tests__/integration/captionBurn.test.js +103 -0
  32. package/dist/__tests__/integration/captionBurn.test.js.map +1 -0
  33. package/dist/__tests__/integration/clipComposite.test.d.ts +2 -0
  34. package/dist/__tests__/integration/clipComposite.test.d.ts.map +1 -0
  35. package/dist/__tests__/integration/clipComposite.test.js +56 -0
  36. package/dist/__tests__/integration/clipComposite.test.js.map +1 -0
  37. package/dist/__tests__/integration/faceDetection.test.d.ts +2 -0
  38. package/dist/__tests__/integration/faceDetection.test.d.ts.map +1 -0
  39. package/dist/__tests__/integration/faceDetection.test.js +85 -0
  40. package/dist/__tests__/integration/faceDetection.test.js.map +1 -0
  41. package/dist/__tests__/integration/ffmpegPipeline.test.d.ts +2 -0
  42. package/dist/__tests__/integration/ffmpegPipeline.test.d.ts.map +1 -0
  43. package/dist/__tests__/integration/ffmpegPipeline.test.js +88 -0
  44. package/dist/__tests__/integration/ffmpegPipeline.test.js.map +1 -0
  45. package/dist/__tests__/integration/fixture.d.ts +19 -0
  46. package/dist/__tests__/integration/fixture.d.ts.map +1 -0
  47. package/dist/__tests__/integration/fixture.js +112 -0
  48. package/dist/__tests__/integration/fixture.js.map +1 -0
  49. package/dist/__tests__/integration/fixture.test.d.ts +2 -0
  50. package/dist/__tests__/integration/fixture.test.d.ts.map +1 -0
  51. package/dist/__tests__/integration/fixture.test.js +27 -0
  52. package/dist/__tests__/integration/fixture.test.js.map +1 -0
  53. package/dist/__tests__/integration/realCaptions.test.d.ts +2 -0
  54. package/dist/__tests__/integration/realCaptions.test.d.ts.map +1 -0
  55. package/dist/__tests__/integration/realCaptions.test.js +226 -0
  56. package/dist/__tests__/integration/realCaptions.test.js.map +1 -0
  57. package/dist/__tests__/integration/realPipeline.test.d.ts +2 -0
  58. package/dist/__tests__/integration/realPipeline.test.d.ts.map +1 -0
  59. package/dist/__tests__/integration/realPipeline.test.js +210 -0
  60. package/dist/__tests__/integration/realPipeline.test.js.map +1 -0
  61. package/dist/__tests__/integration/silenceRemoval.test.d.ts +2 -0
  62. package/dist/__tests__/integration/silenceRemoval.test.d.ts.map +1 -0
  63. package/dist/__tests__/integration/silenceRemoval.test.js +93 -0
  64. package/dist/__tests__/integration/silenceRemoval.test.js.map +1 -0
  65. package/dist/__tests__/pipeline.test.d.ts +2 -0
  66. package/dist/__tests__/pipeline.test.d.ts.map +1 -0
  67. package/dist/__tests__/pipeline.test.js +434 -0
  68. package/dist/__tests__/pipeline.test.js.map +1 -0
  69. package/dist/__tests__/services.test.d.ts +2 -0
  70. package/dist/__tests__/services.test.d.ts.map +1 -0
  71. package/dist/__tests__/services.test.js +655 -0
  72. package/dist/__tests__/services.test.js.map +1 -0
  73. package/dist/__tests__/silenceRemoval.test.d.ts +2 -0
  74. package/dist/__tests__/silenceRemoval.test.d.ts.map +1 -0
  75. package/dist/__tests__/silenceRemoval.test.js +266 -0
  76. package/dist/__tests__/silenceRemoval.test.js.map +1 -0
  77. package/dist/__tests__/singlePassEdit.test.d.ts +2 -0
  78. package/dist/__tests__/singlePassEdit.test.d.ts.map +1 -0
  79. package/dist/__tests__/singlePassEdit.test.js +321 -0
  80. package/dist/__tests__/singlePassEdit.test.js.map +1 -0
  81. package/dist/__tests__/smoke.test.d.ts +2 -0
  82. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  83. package/dist/__tests__/smoke.test.js +8 -0
  84. package/dist/__tests__/smoke.test.js.map +1 -0
  85. package/dist/__tests__/utilities.test.d.ts +2 -0
  86. package/dist/__tests__/utilities.test.d.ts.map +1 -0
  87. package/dist/__tests__/utilities.test.js +268 -0
  88. package/dist/__tests__/utilities.test.js.map +1 -0
  89. package/dist/agents/BaseAgent.d.ts +52 -0
  90. package/dist/agents/BaseAgent.d.ts.map +1 -0
  91. package/dist/agents/BaseAgent.js +108 -0
  92. package/dist/agents/BaseAgent.js.map +1 -0
  93. package/dist/agents/BlogAgent.d.ts +3 -0
  94. package/dist/agents/BlogAgent.d.ts.map +1 -0
  95. package/dist/agents/BlogAgent.js +163 -0
  96. package/dist/agents/BlogAgent.js.map +1 -0
  97. package/dist/agents/ChapterAgent.d.ts +11 -0
  98. package/dist/agents/ChapterAgent.d.ts.map +1 -0
  99. package/dist/agents/ChapterAgent.js +191 -0
  100. package/dist/agents/ChapterAgent.js.map +1 -0
  101. package/dist/agents/MediumVideoAgent.d.ts +3 -0
  102. package/dist/agents/MediumVideoAgent.d.ts.map +1 -0
  103. package/dist/agents/MediumVideoAgent.js +219 -0
  104. package/dist/agents/MediumVideoAgent.js.map +1 -0
  105. package/dist/agents/ShortsAgent.d.ts +3 -0
  106. package/dist/agents/ShortsAgent.d.ts.map +1 -0
  107. package/dist/agents/ShortsAgent.js +243 -0
  108. package/dist/agents/ShortsAgent.js.map +1 -0
  109. package/dist/agents/SilenceRemovalAgent.d.ts +9 -0
  110. package/dist/agents/SilenceRemovalAgent.d.ts.map +1 -0
  111. package/dist/agents/SilenceRemovalAgent.js +208 -0
  112. package/dist/agents/SilenceRemovalAgent.js.map +1 -0
  113. package/dist/agents/SocialMediaAgent.d.ts +4 -0
  114. package/dist/agents/SocialMediaAgent.d.ts.map +1 -0
  115. package/dist/agents/SocialMediaAgent.js +248 -0
  116. package/dist/agents/SocialMediaAgent.js.map +1 -0
  117. package/dist/agents/SummaryAgent.d.ts +11 -0
  118. package/dist/agents/SummaryAgent.d.ts.map +1 -0
  119. package/dist/agents/SummaryAgent.js +333 -0
  120. package/dist/agents/SummaryAgent.js.map +1 -0
  121. package/dist/config/brand.d.ts +29 -0
  122. package/dist/config/brand.d.ts.map +1 -0
  123. package/dist/config/brand.js +83 -0
  124. package/dist/config/brand.js.map +1 -0
  125. package/dist/config/environment.d.ts +36 -0
  126. package/dist/config/environment.d.ts.map +1 -0
  127. package/dist/config/environment.js +44 -0
  128. package/dist/config/environment.js.map +1 -0
  129. package/dist/config/logger.d.ts +5 -0
  130. package/dist/config/logger.d.ts.map +1 -0
  131. package/dist/config/logger.js +13 -0
  132. package/dist/config/logger.js.map +1 -0
  133. package/dist/index.d.ts +2 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +135 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/pipeline.d.ts +57 -0
  138. package/dist/pipeline.d.ts.map +1 -0
  139. package/dist/pipeline.js +287 -0
  140. package/dist/pipeline.js.map +1 -0
  141. package/dist/services/captionGeneration.d.ts +7 -0
  142. package/dist/services/captionGeneration.d.ts.map +1 -0
  143. package/dist/services/captionGeneration.js +29 -0
  144. package/dist/services/captionGeneration.js.map +1 -0
  145. package/dist/services/fileWatcher.d.ts +19 -0
  146. package/dist/services/fileWatcher.d.ts.map +1 -0
  147. package/dist/services/fileWatcher.js +120 -0
  148. package/dist/services/fileWatcher.js.map +1 -0
  149. package/dist/services/gitOperations.d.ts +3 -0
  150. package/dist/services/gitOperations.d.ts.map +1 -0
  151. package/dist/services/gitOperations.js +43 -0
  152. package/dist/services/gitOperations.js.map +1 -0
  153. package/dist/services/socialPosting.d.ts +38 -0
  154. package/dist/services/socialPosting.d.ts.map +1 -0
  155. package/dist/services/socialPosting.js +102 -0
  156. package/dist/services/socialPosting.js.map +1 -0
  157. package/dist/services/transcription.d.ts +3 -0
  158. package/dist/services/transcription.d.ts.map +1 -0
  159. package/dist/services/transcription.js +100 -0
  160. package/dist/services/transcription.js.map +1 -0
  161. package/dist/services/videoIngestion.d.ts +3 -0
  162. package/dist/services/videoIngestion.d.ts.map +1 -0
  163. package/dist/services/videoIngestion.js +103 -0
  164. package/dist/services/videoIngestion.js.map +1 -0
  165. package/dist/tools/captions/captionGenerator.d.ts +84 -0
  166. package/dist/tools/captions/captionGenerator.d.ts.map +1 -0
  167. package/dist/tools/captions/captionGenerator.js +390 -0
  168. package/dist/tools/captions/captionGenerator.js.map +1 -0
  169. package/dist/tools/ffmpeg/aspectRatio.d.ts +101 -0
  170. package/dist/tools/ffmpeg/aspectRatio.d.ts.map +1 -0
  171. package/dist/tools/ffmpeg/aspectRatio.js +338 -0
  172. package/dist/tools/ffmpeg/aspectRatio.js.map +1 -0
  173. package/dist/tools/ffmpeg/audioExtraction.d.ts +16 -0
  174. package/dist/tools/ffmpeg/audioExtraction.d.ts.map +1 -0
  175. package/dist/tools/ffmpeg/audioExtraction.js +86 -0
  176. package/dist/tools/ffmpeg/audioExtraction.js.map +1 -0
  177. package/dist/tools/ffmpeg/captionBurning.d.ts +8 -0
  178. package/dist/tools/ffmpeg/captionBurning.d.ts.map +1 -0
  179. package/dist/tools/ffmpeg/captionBurning.js +71 -0
  180. package/dist/tools/ffmpeg/captionBurning.js.map +1 -0
  181. package/dist/tools/ffmpeg/clipExtraction.d.ts +23 -0
  182. package/dist/tools/ffmpeg/clipExtraction.d.ts.map +1 -0
  183. package/dist/tools/ffmpeg/clipExtraction.js +178 -0
  184. package/dist/tools/ffmpeg/clipExtraction.js.map +1 -0
  185. package/dist/tools/ffmpeg/faceDetection.d.ts +127 -0
  186. package/dist/tools/ffmpeg/faceDetection.d.ts.map +1 -0
  187. package/dist/tools/ffmpeg/faceDetection.js +500 -0
  188. package/dist/tools/ffmpeg/faceDetection.js.map +1 -0
  189. package/dist/tools/ffmpeg/frameCapture.d.ts +10 -0
  190. package/dist/tools/ffmpeg/frameCapture.d.ts.map +1 -0
  191. package/dist/tools/ffmpeg/frameCapture.js +48 -0
  192. package/dist/tools/ffmpeg/frameCapture.js.map +1 -0
  193. package/dist/tools/ffmpeg/silenceDetection.d.ts +10 -0
  194. package/dist/tools/ffmpeg/silenceDetection.d.ts.map +1 -0
  195. package/dist/tools/ffmpeg/silenceDetection.js +55 -0
  196. package/dist/tools/ffmpeg/silenceDetection.js.map +1 -0
  197. package/dist/tools/ffmpeg/singlePassEdit.d.ts +25 -0
  198. package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +1 -0
  199. package/dist/tools/ffmpeg/singlePassEdit.js +123 -0
  200. package/dist/tools/ffmpeg/singlePassEdit.js.map +1 -0
  201. package/dist/tools/search/exaClient.d.ts +8 -0
  202. package/dist/tools/search/exaClient.d.ts.map +1 -0
  203. package/dist/tools/search/exaClient.js +38 -0
  204. package/dist/tools/search/exaClient.js.map +1 -0
  205. package/dist/tools/whisper/whisperClient.d.ts +3 -0
  206. package/dist/tools/whisper/whisperClient.d.ts.map +1 -0
  207. package/dist/tools/whisper/whisperClient.js +77 -0
  208. package/dist/tools/whisper/whisperClient.js.map +1 -0
  209. package/dist/types/index.d.ts +305 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +44 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,243 @@
1
+ [![CI](https://github.com/htekdev/vidpipe/actions/workflows/ci.yml/badge.svg)](https://github.com/htekdev/vidpipe/actions/workflows/ci.yml)
2
+ [![npm version](https://img.shields.io/npm/v/vidpipe)](https://www.npmjs.com/package/vidpipe)
3
+ [![Node.js 20+](https://img.shields.io/badge/node-20%2B-brightgreen)](https://nodejs.org/)
4
+ [![License: ISC](https://img.shields.io/badge/license-ISC-blue)](./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
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agents.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agents.test.ts"],"names":[],"mappings":""}