vidpipe 1.3.7 → 1.3.8
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 +113 -16
- package/dist/cli.js +39 -7
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
╚═══╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
**Your AI video editor — turn raw recordings into shorts, reels, captions, social posts, and blog posts.
|
|
12
|
+
**Your AI video editor and content ideation engine — turn raw recordings into shorts, reels, captions, social posts, and blog posts. Ideate, record, edit, publish.**
|
|
13
13
|
|
|
14
|
-
An agentic video editor that watches for new recordings and edits them into social-media-ready content — shorts, reels, captions, blog posts, and platform-tailored social posts — using [GitHub Copilot SDK](https://github.com/github/copilot-sdk) AI agents and
|
|
14
|
+
An agentic video editor and content ideation platform that watches for new recordings and edits them into social-media-ready content — shorts, reels, captions, blog posts, and platform-tailored social posts — using [GitHub Copilot SDK](https://github.com/github/copilot-sdk) AI agents, OpenAI Whisper, and Google Gemini.
|
|
15
15
|
|
|
16
16
|
[](https://github.com/htekdev/vidpipe/actions/workflows/ci.yml)
|
|
17
17
|
[](https://www.npmjs.com/package/vidpipe)
|
|
18
18
|
[](https://nodejs.org/)
|
|
19
19
|
[](./LICENSE)
|
|
20
20
|
[](https://htekdev.github.io/vidpipe/)
|
|
21
|
-
[](.)
|
|
22
22
|
|
|
23
23
|
</div>
|
|
24
24
|
|
|
@@ -38,28 +38,32 @@ npm install -g vidpipe
|
|
|
38
38
|
|
|
39
39
|
<table>
|
|
40
40
|
<tr>
|
|
41
|
+
<td>💡 <b>Content Ideation (ID8)</b> — AI-generated, trend-backed video ideas</td>
|
|
41
42
|
<td>🎙️ <b>Whisper Transcription</b> — Word-level timestamps</td>
|
|
42
|
-
<td>📐 <b>Split-Screen Layouts</b> — Portrait, square, and feed</td>
|
|
43
43
|
</tr>
|
|
44
44
|
<tr>
|
|
45
|
+
<td>📐 <b>Split-Screen Layouts</b> — Portrait, square, and feed</td>
|
|
45
46
|
<td>🔇 <b>AI Silence Removal</b> — Context-aware, capped at 20%</td>
|
|
47
|
+
</tr>
|
|
48
|
+
<tr>
|
|
46
49
|
<td>💬 <b>Karaoke Captions</b> — Word-by-word highlighting</td>
|
|
50
|
+
<td>✂️ <b>Short Clips</b> — Best 15–60s moments, hook-first ordering</td>
|
|
47
51
|
</tr>
|
|
48
52
|
<tr>
|
|
49
|
-
<td>✂️ <b>Short Clips</b> — Best 15–60s moments, multi-segment</td>
|
|
50
53
|
<td>🎞️ <b>Medium Clips</b> — 1–3 min with crossfade transitions</td>
|
|
54
|
+
<td>📑 <b>Chapter Detection</b> — JSON, Markdown, YouTube, FFmeta</td>
|
|
51
55
|
</tr>
|
|
52
56
|
<tr>
|
|
53
|
-
<td>📑 <b>Chapter Detection</b> — JSON, Markdown, YouTube, FFmeta</td>
|
|
54
57
|
<td>📱 <b>Social Posts</b> — TikTok, YouTube, Instagram, LinkedIn, X</td>
|
|
58
|
+
<td>📰 <b>Blog Post</b> — Dev.to style with web-sourced links</td>
|
|
55
59
|
</tr>
|
|
56
60
|
<tr>
|
|
57
|
-
<td>📰 <b>Blog Post</b> — Dev.to style with web-sourced links</td>
|
|
58
61
|
<td>🎨 <b>Brand Voice</b> — Custom tone, hashtags via brand.json</td>
|
|
62
|
+
<td>🔍 <b>Face Detection</b> — ONNX-based webcam cropping</td>
|
|
59
63
|
</tr>
|
|
60
64
|
<tr>
|
|
61
|
-
<td
|
|
62
|
-
<td
|
|
65
|
+
<td>🚀 <b>Auto-Publish</b> — Scheduled posting via Late API</td>
|
|
66
|
+
<td>👁️ <b>Gemini Vision</b> — AI video analysis and scene detection</td>
|
|
63
67
|
</tr>
|
|
64
68
|
</table>
|
|
65
69
|
|
|
@@ -118,28 +122,46 @@ vidpipe [options] [video-path]
|
|
|
118
122
|
vidpipe init # Interactive setup wizard
|
|
119
123
|
vidpipe review # Open post review web app
|
|
120
124
|
vidpipe schedule # View posting schedule
|
|
125
|
+
vidpipe realign # Realign scheduled posts to match schedule.json
|
|
121
126
|
vidpipe ideate # Generate or list saved content ideas
|
|
127
|
+
vidpipe chat # Interactive schedule management agent
|
|
128
|
+
vidpipe doctor # Check all prerequisites
|
|
122
129
|
```
|
|
123
130
|
|
|
131
|
+
### Process Options
|
|
132
|
+
|
|
124
133
|
| Option | Description |
|
|
125
134
|
|--------|-------------|
|
|
126
|
-
| `--doctor` | Check that all prerequisites (FFmpeg, API keys, etc.) are installed and configured |
|
|
127
135
|
| `[video-path]` | Process a specific video file (implies `--once`) |
|
|
128
136
|
| `--watch-dir <path>` | Folder to watch for new recordings |
|
|
129
137
|
| `--output-dir <path>` | Output directory (default: `./recordings`) |
|
|
130
138
|
| `--openai-key <key>` | OpenAI API key |
|
|
131
139
|
| `--exa-key <key>` | Exa AI key for web search in social posts |
|
|
132
140
|
| `--brand <path>` | Path to `brand.json` (default: `./brand.json`) |
|
|
141
|
+
| `--ideas <ids>` | Comma-separated idea IDs to link to this video |
|
|
133
142
|
| `--once` | Process next video and exit |
|
|
134
143
|
| `--no-silence-removal` | Skip silence removal |
|
|
135
144
|
| `--no-shorts` | Skip short clip extraction |
|
|
136
145
|
| `--no-medium-clips` | Skip medium clip generation |
|
|
137
146
|
| `--no-social` | Skip social media posts |
|
|
138
147
|
| `--no-social-publish` | Skip social media queue-build stage |
|
|
139
|
-
| `--late-api-key <key>` | Override Late API key |
|
|
140
148
|
| `--no-captions` | Skip caption generation/burning |
|
|
141
149
|
| `--no-git` | Skip git commit/push |
|
|
150
|
+
| `--late-api-key <key>` | Override Late API key |
|
|
142
151
|
| `-v, --verbose` | Debug-level logging |
|
|
152
|
+
| `--doctor` | Check that all prerequisites are installed |
|
|
153
|
+
|
|
154
|
+
### Ideate Options
|
|
155
|
+
|
|
156
|
+
| Option | Description |
|
|
157
|
+
|--------|-------------|
|
|
158
|
+
| `--topics <topics>` | Comma-separated seed topics for trend research |
|
|
159
|
+
| `--count <n>` | Number of ideas to generate (default: 5) |
|
|
160
|
+
| `--list` | List existing ideas instead of generating |
|
|
161
|
+
| `--status <status>` | Filter by status: `draft`, `ready`, `recorded`, `published` |
|
|
162
|
+
| `--format <format>` | Output format: `table` (default) or `json` |
|
|
163
|
+
| `--output <dir>` | Ideas directory (default: `./ideas`) |
|
|
164
|
+
| `--brand <path>` | Brand config path (default: `./brand.json`) |
|
|
143
165
|
|
|
144
166
|
---
|
|
145
167
|
|
|
@@ -190,6 +212,54 @@ recordings/
|
|
|
190
212
|
|
|
191
213
|
---
|
|
192
214
|
|
|
215
|
+
## 💡 Content Ideation (ID8)
|
|
216
|
+
|
|
217
|
+
VidPipe includes a research-backed content ideation engine that generates video ideas before you record. Ideas are stored as GitHub Issues for full lifecycle tracking.
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# Generate ideas backed by trend research
|
|
221
|
+
vidpipe ideate --topics "GitHub Copilot, TypeScript" --count 4
|
|
222
|
+
|
|
223
|
+
# List all saved ideas
|
|
224
|
+
vidpipe ideate --list
|
|
225
|
+
|
|
226
|
+
# Filter by status
|
|
227
|
+
vidpipe ideate --list --status ready
|
|
228
|
+
|
|
229
|
+
# JSON output for programmatic access (e.g., VidRecord integration)
|
|
230
|
+
vidpipe ideate --list --format json
|
|
231
|
+
|
|
232
|
+
# Link ideas to a recording
|
|
233
|
+
vidpipe process video.mp4 --ideas 12,15
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### How It Works
|
|
237
|
+
|
|
238
|
+
The **IdeationAgent** uses MCP tools (Exa web search, YouTube, Perplexity) to research trending topics in your niche before generating ideas. Each idea includes:
|
|
239
|
+
|
|
240
|
+
- **Topic & hook** — The angle that makes it compelling
|
|
241
|
+
- **Audience & key takeaway** — Who it's for and what they'll learn
|
|
242
|
+
- **Talking points** — Structured bullet points to guide your recording
|
|
243
|
+
- **Publish-by date** — Based on timeliness (3–5 days for hot trends, months for evergreen)
|
|
244
|
+
- **Trend context** — The research findings that back the idea
|
|
245
|
+
|
|
246
|
+
### Idea Lifecycle
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
draft → ready → recorded → published
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
| Status | Meaning |
|
|
253
|
+
|--------|---------|
|
|
254
|
+
| `draft` | Generated by AI, awaiting your review |
|
|
255
|
+
| `ready` | Approved — ready to record |
|
|
256
|
+
| `recorded` | Linked to a video via `--ideas` flag |
|
|
257
|
+
| `published` | Content from this idea has been published |
|
|
258
|
+
|
|
259
|
+
Ideas automatically influence downstream content — when you link ideas to a recording with `--ideas`, the pipeline's agents (shorts, social posts, summaries, blog) reference your intended topic and hook for more focused output.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
193
263
|
## 📺 Review App
|
|
194
264
|
|
|
195
265
|
VidPipe includes a built-in web app for reviewing, editing, and scheduling social media posts before publishing.
|
|
@@ -290,6 +360,8 @@ OUTPUT_DIR=/path/to/output
|
|
|
290
360
|
# FFMPEG_PATH=/usr/local/bin/ffmpeg
|
|
291
361
|
# FFPROBE_PATH=/usr/local/bin/ffprobe
|
|
292
362
|
# LATE_API_KEY=sk_your_key_here # Optional: Late API for social publishing
|
|
363
|
+
# GITHUB_TOKEN=ghp_... # Optional: GitHub token for ID8 idea storage
|
|
364
|
+
# IDEAS_REPO=owner/repo # Optional: GitHub repo for storing ideas as Issues
|
|
293
365
|
```
|
|
294
366
|
|
|
295
367
|
Social media publishing is configured via `schedule.json` and the Late API. See [Social Publishing Guide](./docs/social-publishing.md) for details.
|
|
@@ -305,12 +377,29 @@ Social media publishing is configured via `schedule.json` and the Late API. See
|
|
|
305
377
|
| [FFmpeg Setup](./docs/ffmpeg-setup.md) | Platform-specific install (Windows, macOS, Linux, ARM64) |
|
|
306
378
|
| [Brand Customization](./docs/brand-customization.md) | Customize AI voice, vocabulary, hashtags, and content style |
|
|
307
379
|
| [Social Publishing](./docs/social-publishing.md) | Review, schedule, and publish social posts via Late API |
|
|
380
|
+
| [Architecture (L0–L7)](./docs/architecture/layers.md) | Layer hierarchy, import rules, and testing strategy |
|
|
381
|
+
| [Platform Content Strategy](./docs/platform-content-strategy.md) | Research-backed recommendations per social platform |
|
|
382
|
+
|
|
383
|
+
Full reference docs are available at [htekdev.github.io/vidpipe](https://htekdev.github.io/vidpipe/).
|
|
308
384
|
|
|
309
385
|
---
|
|
310
386
|
|
|
311
387
|
## 🏗️ Architecture
|
|
312
388
|
|
|
313
|
-
|
|
389
|
+
VidPipe uses a strict **L0–L7 layered architecture** where each layer can only import from specific lower layers. This enforces clean separation of concerns and makes every layer independently testable.
|
|
390
|
+
|
|
391
|
+
```
|
|
392
|
+
L7-app CLI, servers, watchers → L0, L1, L3, L6
|
|
393
|
+
L6-pipeline Stage orchestration → L0, L1, L5
|
|
394
|
+
L5-assets Lazy-loaded asset + bridges → L0, L1, L4
|
|
395
|
+
L4-agents LLM agents (BaseAgent) → L0, L1, L3
|
|
396
|
+
L3-services Business logic + cost tracking → L0, L1, L2
|
|
397
|
+
L2-clients External API/process wrappers → L0, L1
|
|
398
|
+
L1-infra Infrastructure (config, logger) → L0
|
|
399
|
+
L0-pure Pure functions, zero I/O → (nothing)
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Each editing task is handled by a specialized AI agent built on the [GitHub Copilot SDK](https://github.com/github/copilot-sdk):
|
|
314
403
|
|
|
315
404
|
```mermaid
|
|
316
405
|
graph TD
|
|
@@ -321,6 +410,7 @@ graph TD
|
|
|
321
410
|
BP --> CA[ChapterAgent]
|
|
322
411
|
BP --> SMA[SocialMediaAgent]
|
|
323
412
|
BP --> BA[BlogAgent]
|
|
413
|
+
BP --> IA[IdeationAgent]
|
|
324
414
|
|
|
325
415
|
SRA -->|tools| T1[detect_silence, decide_removals]
|
|
326
416
|
SHA -->|tools| T2[plan_shorts]
|
|
@@ -329,11 +419,13 @@ graph TD
|
|
|
329
419
|
SA -->|tools| T5[capture_frame, write_summary]
|
|
330
420
|
SMA -->|tools| T6[search_links, create_posts]
|
|
331
421
|
BA -->|tools| T7[search_web, write_blog]
|
|
422
|
+
IA -->|tools| T8[web_search, youtube_search, generate_ideas]
|
|
332
423
|
|
|
333
424
|
style BP fill:#1e3a5f,stroke:#60a5fa,color:#fff
|
|
425
|
+
style IA fill:#5a4d27,stroke:#fbbf24,color:#fff
|
|
334
426
|
```
|
|
335
427
|
|
|
336
|
-
Each agent communicates with the LLM through structured tool calls, ensuring reliable, parseable outputs.
|
|
428
|
+
Each agent communicates with the LLM through structured tool calls, ensuring reliable, parseable outputs. See the [Architecture Guide](./docs/architecture/layers.md) for full details on layer rules and import enforcement.
|
|
337
429
|
|
|
338
430
|
---
|
|
339
431
|
|
|
@@ -344,23 +436,28 @@ Each agent communicates with the LLM through structured tool calls, ensuring rel
|
|
|
344
436
|
| [TypeScript](https://www.typescriptlang.org/) | Language (ES2022, ESM) |
|
|
345
437
|
| [GitHub Copilot SDK](https://github.com/github/copilot-sdk) | AI agent framework |
|
|
346
438
|
| [OpenAI Whisper](https://platform.openai.com/docs/guides/speech-to-text) | Speech-to-text |
|
|
439
|
+
| [Google Gemini](https://ai.google.dev/) | Vision-based video analysis |
|
|
347
440
|
| [FFmpeg](https://ffmpeg.org/) | Video/audio processing |
|
|
348
441
|
| [Sharp](https://sharp.pixelplumbing.com/) | Image analysis (webcam detection) |
|
|
442
|
+
| [Octokit](https://github.com/octokit/octokit.js) | GitHub API (idea storage as Issues) |
|
|
349
443
|
| [Commander.js](https://github.com/tj/commander.js) | CLI framework |
|
|
350
444
|
| [Chokidar](https://github.com/paulmillr/chokidar) | File system watching |
|
|
351
445
|
| [Winston](https://github.com/winstonjs/winston) | Logging |
|
|
352
|
-
| [Exa AI](https://exa.ai/) | Web search for social posts and
|
|
446
|
+
| [Exa AI](https://exa.ai/) | Web search for social posts, blog, and ideation |
|
|
353
447
|
|
|
354
448
|
---
|
|
355
449
|
|
|
356
450
|
## 🗺️ Roadmap
|
|
357
451
|
|
|
358
452
|
- [x] **Automated social posting** — Publish directly to platforms via Late API
|
|
453
|
+
- [x] **Content ideation (ID8)** — AI-generated, trend-backed video ideas with lifecycle tracking
|
|
454
|
+
- [x] **Gemini Vision integration** — AI-powered video analysis and scene detection
|
|
455
|
+
- [x] **L0–L7 layered architecture** — Strict separation of concerns with import enforcement
|
|
456
|
+
- [x] **GitHub agentic workflows** — Automated issue and PR triage via GitHub Actions
|
|
457
|
+
- [x] **Hook-first clip ordering** — Most engaging moment plays first in shorts
|
|
359
458
|
- [ ] **Multi-language support** — Transcription and summaries in multiple languages
|
|
360
459
|
- [ ] **Custom templates** — User-defined Markdown & social post templates
|
|
361
|
-
- [ ] **Web dashboard** — Browser UI for reviewing and editing outputs
|
|
362
460
|
- [ ] **Batch processing** — Process an entire folder of existing videos
|
|
363
|
-
- [ ] **Custom short criteria** — Configure what makes a "good" short for your content
|
|
364
461
|
- [ ] **Thumbnail generation** — Auto-generate branded thumbnails for shorts
|
|
365
462
|
|
|
366
463
|
---
|
package/dist/cli.js
CHANGED
|
@@ -13166,6 +13166,19 @@ async function runIdeate(options = {}) {
|
|
|
13166
13166
|
if (options.list) {
|
|
13167
13167
|
const ideas2 = await listIdeas();
|
|
13168
13168
|
const filtered = options.status ? ideas2.filter((idea) => idea.status === options.status) : ideas2;
|
|
13169
|
+
if (options.format === "json") {
|
|
13170
|
+
const jsonIdeas = filtered.map((idea) => ({
|
|
13171
|
+
issueNumber: idea.issueNumber,
|
|
13172
|
+
id: idea.id,
|
|
13173
|
+
topic: idea.topic,
|
|
13174
|
+
hook: idea.hook,
|
|
13175
|
+
audience: idea.audience,
|
|
13176
|
+
platforms: idea.platforms,
|
|
13177
|
+
status: idea.status
|
|
13178
|
+
}));
|
|
13179
|
+
console.log(JSON.stringify(jsonIdeas, null, 2));
|
|
13180
|
+
return;
|
|
13181
|
+
}
|
|
13169
13182
|
if (filtered.length === 0) {
|
|
13170
13183
|
console.log("No ideas found.");
|
|
13171
13184
|
if (options.status) {
|
|
@@ -13188,12 +13201,14 @@ ${filtered.length} idea(s) total`);
|
|
|
13188
13201
|
}
|
|
13189
13202
|
const seedTopics = options.topics?.split(",").map((t) => t.trim()).filter(Boolean);
|
|
13190
13203
|
const count = options.count ? parseInt(options.count, 10) : 5;
|
|
13191
|
-
|
|
13192
|
-
|
|
13193
|
-
|
|
13194
|
-
|
|
13195
|
-
|
|
13204
|
+
if (options.format !== "json") {
|
|
13205
|
+
console.log("\n\u{1F9E0} Generating content ideas...\n");
|
|
13206
|
+
if (seedTopics?.length) {
|
|
13207
|
+
console.log(`Seed topics: ${seedTopics.join(", ")}`);
|
|
13208
|
+
}
|
|
13209
|
+
console.log(`Target count: ${count}
|
|
13196
13210
|
`);
|
|
13211
|
+
}
|
|
13197
13212
|
const ideas = await generateIdeas3({
|
|
13198
13213
|
seedTopics,
|
|
13199
13214
|
count,
|
|
@@ -13201,7 +13216,24 @@ ${filtered.length} idea(s) total`);
|
|
|
13201
13216
|
brandPath: options.brand
|
|
13202
13217
|
});
|
|
13203
13218
|
if (ideas.length === 0) {
|
|
13204
|
-
|
|
13219
|
+
if (options.format === "json") {
|
|
13220
|
+
console.log(JSON.stringify([], null, 2));
|
|
13221
|
+
} else {
|
|
13222
|
+
console.log("No ideas were generated. Check your API key configuration.");
|
|
13223
|
+
}
|
|
13224
|
+
return;
|
|
13225
|
+
}
|
|
13226
|
+
if (options.format === "json") {
|
|
13227
|
+
const jsonIdeas = ideas.map((idea) => ({
|
|
13228
|
+
issueNumber: idea.issueNumber,
|
|
13229
|
+
id: idea.id,
|
|
13230
|
+
topic: idea.topic,
|
|
13231
|
+
hook: idea.hook,
|
|
13232
|
+
audience: idea.audience,
|
|
13233
|
+
platforms: idea.platforms,
|
|
13234
|
+
status: idea.status
|
|
13235
|
+
}));
|
|
13236
|
+
console.log(JSON.stringify(jsonIdeas, null, 2));
|
|
13205
13237
|
return;
|
|
13206
13238
|
}
|
|
13207
13239
|
console.log(`
|
|
@@ -13853,7 +13885,7 @@ program.command("chat").description("Interactive chat session with the schedule
|
|
|
13853
13885
|
program.command("doctor").description("Check all prerequisites and dependencies").action(async () => {
|
|
13854
13886
|
await runDoctor();
|
|
13855
13887
|
});
|
|
13856
|
-
program.command("ideate").description("Generate AI-powered content ideas using trend research").option("--topics <topics>", "Comma-separated seed topics").option("--count <n>", "Number of ideas to generate (default: 5)", "5").option("--output <dir>", "Ideas directory (default: ./ideas)").option("--brand <path>", "Brand config path (default: ./brand.json)").option("--list", "List existing ideas instead of generating").option("--status <status>", "Filter by status when listing (draft|ready|recorded|published)").action(async (opts) => {
|
|
13888
|
+
program.command("ideate").description("Generate AI-powered content ideas using trend research").option("--topics <topics>", "Comma-separated seed topics").option("--count <n>", "Number of ideas to generate (default: 5)", "5").option("--output <dir>", "Ideas directory (default: ./ideas)").option("--brand <path>", "Brand config path (default: ./brand.json)").option("--list", "List existing ideas instead of generating").option("--status <status>", "Filter by status when listing (draft|ready|recorded|published)").option("--format <format>", "Output format: table (default) or json").action(async (opts) => {
|
|
13857
13889
|
initConfig();
|
|
13858
13890
|
await runIdeate(opts);
|
|
13859
13891
|
process.exit(0);
|