@growthub/cli 0.8.1 → 0.8.2
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/assets/worker-kits/growthub-creative-video-pipeline-v1/.env.example +28 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/QUICKSTART.md +118 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/SKILL.md +103 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/.env.example +20 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/README.md +33 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/api/pipeline/route.js +27 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/globals.css +203 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/layout.jsx +14 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/page.jsx +131 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/settings/keys/page.jsx +154 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/adapters/env.js +14 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/adapters/generative/index.js +31 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/domain/pipeline.js +30 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/next.config.js +10 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/package-lock.json +17 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/package.json +17 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/postcss.config.mjs +3 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/vercel.json +5 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/NEW-CLIENT.md +21 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/_template/brand-kit.md +123 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/growthub/brand-kit.md +123 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/bundles/growthub-creative-video-pipeline-v1.json +83 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/adapter-contracts.md +73 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/governed-workspace-primitives.md +50 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/pipeline-architecture.md +61 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/starter-kit-overview.md +33 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/vercel-deployment.md +42 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/examples/pipeline-brief-sample.md +56 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/growthub-meta/README.md +9 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/growthub-meta/kit-standard.md +24 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/README.md +8 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/check-generative-adapter.sh +41 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/run-pipeline.sh +30 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/kit.json +148 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/output/README.md +23 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/output-standards.md +63 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/runtime-assumptions.md +61 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/check-deps.sh +63 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/clone-fork.sh +18 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/install-skill.sh +10 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/verify-env.mjs +50 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/README.md +11 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/brief-generation/SKILL.md +42 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/generative-execution/SKILL.md +86 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/video-edit/SKILL.md +41 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills.md +302 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/index.html +12 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/package-lock.json +20 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/package.json +20 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/serve.mjs +41 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/App.jsx +210 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/app.css +194 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/main.jsx +10 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/vite.config.js +8 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/edit-plan.md +66 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/generative-plan.md +83 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/pipeline-brief.md +129 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/project.md +68 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/validation-checklist.md +52 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/workers/creative-video-pipeline-operator/CLAUDE.md +109 -0
- package/dist/index.js +9 -0
- package/package.json +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Growthub Creative Video Pipeline — governed workspace env template
|
|
2
|
+
#
|
|
3
|
+
# Keep real provider secrets in your local .env.local or deployment provider.
|
|
4
|
+
|
|
5
|
+
# Local workspace placement
|
|
6
|
+
CREATIVE_VIDEO_PIPELINE_HOME=
|
|
7
|
+
CREATIVE_STRATEGIST_HOME=
|
|
8
|
+
VIDEO_USE_HOME=
|
|
9
|
+
|
|
10
|
+
# Local studio shell
|
|
11
|
+
CREATIVE_VIDEO_PIPELINE_STUDIO_PORT=5180
|
|
12
|
+
|
|
13
|
+
# Stage 2 adapter
|
|
14
|
+
# Supported values: growthub-pipeline, byo-api-key
|
|
15
|
+
CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=growthub-pipeline
|
|
16
|
+
GROWTHUB_BRIDGE_BASE_URL=
|
|
17
|
+
GROWTHUB_BRIDGE_ACCESS_TOKEN=
|
|
18
|
+
|
|
19
|
+
# BYOK adapter values, only used when CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=byo-api-key
|
|
20
|
+
# Supported values: veo, fal, runway
|
|
21
|
+
VIDEO_MODEL_PROVIDER=
|
|
22
|
+
GOOGLE_AI_API_KEY=
|
|
23
|
+
FAL_KEY=
|
|
24
|
+
RUNWAY_API_KEY=
|
|
25
|
+
|
|
26
|
+
# Stage 3 video-use fork
|
|
27
|
+
ELEVENLABS_API_KEY=
|
|
28
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Creative Video Pipeline — Quickstart
|
|
2
|
+
|
|
3
|
+
This kit is a governed Growthub workspace with three runtime surfaces:
|
|
4
|
+
|
|
5
|
+
- `studio/` — local-first Vite operator shell.
|
|
6
|
+
- `apps/creative-video-pipeline/` — Vercel-ready pipeline dashboard and API key settings.
|
|
7
|
+
- Three-stage pipeline: Brief → Generate → Edit.
|
|
8
|
+
|
|
9
|
+
## 0. Discover, export, and register
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
growthub discover
|
|
13
|
+
growthub kit list --family studio
|
|
14
|
+
growthub kit download growthub-creative-video-pipeline-v1 --out ./creative-video-pipeline --yes
|
|
15
|
+
growthub kit fork register ./creative-video-pipeline
|
|
16
|
+
growthub kit fork status <fork-id>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Natural-language prompt for an agent after export:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
Read SKILL.md, skills.md, QUICKSTART.md, docs/adapter-contracts.md, and
|
|
23
|
+
workers/creative-video-pipeline-operator/CLAUDE.md. Run setup checks, verify
|
|
24
|
+
the generative adapter, and confirm the video-use fork path before starting work.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 1. Verify the governed workspace
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
cp .env.example .env
|
|
31
|
+
bash setup/check-deps.sh
|
|
32
|
+
node setup/verify-env.mjs
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Set adapter env in `.env`. Defaults are documented in `.env.example`.
|
|
36
|
+
|
|
37
|
+
## 2. Clone the video-use fork (Stage 3 dependency)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
bash setup/clone-fork.sh
|
|
41
|
+
bash setup/install-skill.sh
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This clones `browser-use/video-use` into `${VIDEO_USE_HOME:-$HOME/video-use}` and installs it as a Claude Code skill.
|
|
45
|
+
|
|
46
|
+
## 3. Configure the generative adapter
|
|
47
|
+
|
|
48
|
+
### Option A — Growthub pipeline (primary, recommended)
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
growthub auth login
|
|
52
|
+
growthub auth whoami
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
In `.env`:
|
|
56
|
+
```
|
|
57
|
+
CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=growthub-pipeline
|
|
58
|
+
GROWTHUB_BRIDGE_ACCESS_TOKEN=<token from growthub auth>
|
|
59
|
+
GROWTHUB_BRIDGE_BASE_URL=<growthub hosted base url>
|
|
60
|
+
ELEVENLABS_API_KEY=<your key>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Option B — BYOK
|
|
64
|
+
|
|
65
|
+
In `.env`:
|
|
66
|
+
```
|
|
67
|
+
CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=byo-api-key
|
|
68
|
+
VIDEO_MODEL_PROVIDER=veo # veo | fal | runway
|
|
69
|
+
GOOGLE_AI_API_KEY=<your key> # if VIDEO_MODEL_PROVIDER=veo
|
|
70
|
+
ELEVENLABS_API_KEY=<your key>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Both options normalize to the same `GenerativeArtifact[]` object shape.
|
|
74
|
+
|
|
75
|
+
## 4. Run the local Vite shell
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
cd studio
|
|
79
|
+
npm install
|
|
80
|
+
npm run dev
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Open `http://localhost:5180`. The shell shows the three-stage pipeline status, output viewer, and settings panel.
|
|
84
|
+
|
|
85
|
+
## 5. Run the Vercel app locally
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cd apps/creative-video-pipeline
|
|
89
|
+
npm install
|
|
90
|
+
npm run dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Open `http://localhost:3000`. Navigate to `/settings/keys` to configure the generative adapter and API keys.
|
|
94
|
+
|
|
95
|
+
## 6. Run the pipeline
|
|
96
|
+
|
|
97
|
+
Follow `skills.md` for the complete three-stage runbook:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Stage 1 — Brief brand-kit.md → scene structure → hooks → pipeline-brief.md
|
|
101
|
+
Stage 2 — Generate growthub pipeline execute OR BYOK → generative/manifest.json
|
|
102
|
+
Stage 3 — Edit video-use fork → EDL → FFmpeg → final/final.mp4
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 7. Deploy to Vercel
|
|
106
|
+
|
|
107
|
+
Use `apps/creative-video-pipeline` as the Vercel project root.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
cd apps/creative-video-pipeline
|
|
111
|
+
npm run build
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Connect to Vercel with root directory `apps/creative-video-pipeline`. Set adapter env per `docs/adapter-contracts.md` and `docs/vercel-deployment.md`.
|
|
115
|
+
|
|
116
|
+
## 8. Governed operation
|
|
117
|
+
|
|
118
|
+
Read `SKILL.md`, `skills.md`, and `workers/creative-video-pipeline-operator/CLAUDE.md` before material changes. Record every stage completion to `.growthub-fork/project.md` and `.growthub-fork/trace.jsonl`.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: growthub-creative-video-pipeline-v1
|
|
3
|
+
description: "Chainable worker kit that composes a creative brief, generative image/video via the growthub pipeline or BYOK, and video editing via the video-use fork into a single governed pipeline. Use when the user says: \"creative video pipeline\", \"brief to video\", \"generative video pipeline\", \"fork growthub-creative-video-pipeline-v1\"."
|
|
4
|
+
triggers:
|
|
5
|
+
- creative video pipeline
|
|
6
|
+
- brief to video
|
|
7
|
+
- generative video pipeline
|
|
8
|
+
- video content pipeline
|
|
9
|
+
- fork growthub-creative-video-pipeline-v1
|
|
10
|
+
progressiveDisclosure: true
|
|
11
|
+
sessionMemory:
|
|
12
|
+
path: .growthub-fork/project.md
|
|
13
|
+
selfEval:
|
|
14
|
+
criteria:
|
|
15
|
+
- Stage 1 brief is grounded in brand-kit.md — scene structure, hooks, and guardrails sourced from file, not memory.
|
|
16
|
+
- Stage 2 generative execution routes through growthub pipeline execute (primary) or explicit BYOK adapter — no ad-hoc API calls outside the adapter contract.
|
|
17
|
+
- Stage 3 video edit delegates to VIDEO_USE_HOME fork — edit-plan.md is the handoff artifact, final.mp4 lands at output/<client>/<project>/final/.
|
|
18
|
+
- .growthub-fork/project.md is appended to at each stage boundary and self-eval outcome.
|
|
19
|
+
- .growthub-fork/trace.jsonl receives a typed event for each material change.
|
|
20
|
+
maxRetries: 3
|
|
21
|
+
traceTo: .growthub-fork/trace.jsonl
|
|
22
|
+
helpers:
|
|
23
|
+
- path: helpers/run-pipeline.sh
|
|
24
|
+
description: Auth pre-flight + growthub pipeline execute passthrough
|
|
25
|
+
- path: helpers/check-generative-adapter.sh
|
|
26
|
+
description: Print current adapter mode and which provider keys are set
|
|
27
|
+
subSkills:
|
|
28
|
+
- name: brief-generation
|
|
29
|
+
path: skills/brief-generation/SKILL.md
|
|
30
|
+
- name: generative-execution
|
|
31
|
+
path: skills/generative-execution/SKILL.md
|
|
32
|
+
- name: video-edit
|
|
33
|
+
path: skills/video-edit/SKILL.md
|
|
34
|
+
mcpTools: []
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Creative Video Pipeline — Governed Workspace
|
|
38
|
+
|
|
39
|
+
Discovery entry and routing menu for `growthub-creative-video-pipeline-v1`. Family: `studio`. Agent contract: `workers/creative-video-pipeline-operator/CLAUDE.md`.
|
|
40
|
+
|
|
41
|
+
## When to use this skill
|
|
42
|
+
|
|
43
|
+
When the user's intent matches any trigger above, or when an agent is dropped into a fork whose `.growthub-fork/fork.json` declares `kitId: "growthub-creative-video-pipeline-v1"`.
|
|
44
|
+
|
|
45
|
+
## Decision tree
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Fork exists (.growthub-fork/fork.json)?
|
|
49
|
+
├── No → growthub kit download growthub-creative-video-pipeline-v1 --out <path>
|
|
50
|
+
│ growthub kit fork register <path>
|
|
51
|
+
│
|
|
52
|
+
└── Yes → read in this order:
|
|
53
|
+
1. .growthub-fork/project.md — session memory (primitive #3)
|
|
54
|
+
2. SKILL.md (this file) — routing menu (primitive #1)
|
|
55
|
+
3. skills.md — operator runbook
|
|
56
|
+
4. workers/creative-video-pipeline-operator/CLAUDE.md — agent contract
|
|
57
|
+
5. QUICKSTART.md — first-run steps
|
|
58
|
+
6. runtime-assumptions.md — host requirements
|
|
59
|
+
7. .growthub-fork/policy.json — what you may touch
|
|
60
|
+
8. .growthub-fork/trace.jsonl (tail 20) — recent machine history
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Three-stage pipeline
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Stage 1 — Brief brand-kit.md → hooks → scene structure
|
|
67
|
+
output: output/<client>/<project>/brief/pipeline-brief.md
|
|
68
|
+
|
|
69
|
+
Stage 2 — Generate growthub pipeline execute (primary)
|
|
70
|
+
OR BYOK provider adapter (secondary)
|
|
71
|
+
output: output/<client>/<project>/generative/
|
|
72
|
+
|
|
73
|
+
Stage 3 — Edit video-use fork (VIDEO_USE_HOME)
|
|
74
|
+
ElevenLabs Scribe → EDL → FFmpeg
|
|
75
|
+
output: output/<client>/<project>/final/final.mp4
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Activation
|
|
79
|
+
|
|
80
|
+
Primary: `growthub pipeline execute` with the `video-generation` CMS node (veo-3.1-generate-001).
|
|
81
|
+
Secondary: BYOK path via `CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=byo-api-key`.
|
|
82
|
+
|
|
83
|
+
Both normalize to the same `GenerativeArtifact[]` object. The UI shell renders whichever path produced the artifacts.
|
|
84
|
+
|
|
85
|
+
## The six primitives (same shape across every Growthub worker kit)
|
|
86
|
+
|
|
87
|
+
1. **`SKILL.md`** — this file.
|
|
88
|
+
2. **Symlinked pointer** — repo-root `AGENTS.md` is authoritative.
|
|
89
|
+
3. **`.growthub-fork/project.md`** — session memory, seeded at init from `templates/project.md`.
|
|
90
|
+
4. **Self-evaluation** — generate → apply → evaluate → record; retry up to `maxRetries` (3); mirrors the Fork Sync Agent loop.
|
|
91
|
+
5. **`skills/`** — sub-skill lanes: `brief-generation`, `generative-execution`, `video-edit`.
|
|
92
|
+
6. **`helpers/`** — `run-pipeline.sh`, `check-generative-adapter.sh`.
|
|
93
|
+
|
|
94
|
+
## Related files
|
|
95
|
+
|
|
96
|
+
- `skills.md` — full 3-stage operator runbook
|
|
97
|
+
- `QUICKSTART.md` — first-run steps
|
|
98
|
+
- `runtime-assumptions.md` — host requirements (FFmpeg, ElevenLabs, CLI, video-use fork)
|
|
99
|
+
- `output-standards.md` — output dir structure
|
|
100
|
+
- `docs/adapter-contracts.md` — generative adapter contracts
|
|
101
|
+
- `docs/pipeline-architecture.md` — chain composition detail
|
|
102
|
+
- `templates/project.md` — session-memory seed
|
|
103
|
+
- `templates/self-eval.md` — self-evaluation pattern
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Creative Video Pipeline app — deployment env template
|
|
2
|
+
|
|
3
|
+
# Supported values: growthub-pipeline, byo-api-key
|
|
4
|
+
CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=growthub-pipeline
|
|
5
|
+
|
|
6
|
+
# growthub-pipeline adapter
|
|
7
|
+
GROWTHUB_BRIDGE_BASE_URL=
|
|
8
|
+
GROWTHUB_BRIDGE_ACCESS_TOKEN=
|
|
9
|
+
|
|
10
|
+
# byo-api-key adapter
|
|
11
|
+
# Supported values: veo, fal, runway
|
|
12
|
+
VIDEO_MODEL_PROVIDER=
|
|
13
|
+
GOOGLE_AI_API_KEY=
|
|
14
|
+
FAL_KEY=
|
|
15
|
+
RUNWAY_API_KEY=
|
|
16
|
+
|
|
17
|
+
# Stage 3 edit pipeline handoff
|
|
18
|
+
VIDEO_USE_HOME=
|
|
19
|
+
ELEVENLABS_API_KEY=
|
|
20
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# creative-video-pipeline — Next.js App
|
|
2
|
+
|
|
3
|
+
Next.js 16 + React 19 app for the Growthub Creative Video Pipeline worker kit. Vercel-deployable.
|
|
4
|
+
|
|
5
|
+
## Dev
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run dev
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Build
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run build
|
|
16
|
+
npm start
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Deploy
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
vercel --prod
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
See `docs/vercel-deployment.md` for environment variable configuration.
|
|
26
|
+
|
|
27
|
+
## Routes
|
|
28
|
+
|
|
29
|
+
| Route | Purpose |
|
|
30
|
+
|-------|---------|
|
|
31
|
+
| `/` | Pipeline dashboard — stage status, adapter state |
|
|
32
|
+
| `/settings/keys` | API key configuration reference |
|
|
33
|
+
| `/api/pipeline` | GET — returns live adapter config + pipeline stage state |
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { readAdapterConfig } from "@/lib/adapters/env";
|
|
3
|
+
import { describeGenerativeAdapter } from "@/lib/adapters/generative/index";
|
|
4
|
+
import { pipelineStages, stageStatus } from "@/lib/domain/pipeline";
|
|
5
|
+
|
|
6
|
+
export const dynamic = "force-dynamic";
|
|
7
|
+
|
|
8
|
+
export function GET() {
|
|
9
|
+
const config = readAdapterConfig();
|
|
10
|
+
const generative = describeGenerativeAdapter();
|
|
11
|
+
|
|
12
|
+
return NextResponse.json({
|
|
13
|
+
kit: "growthub-creative-video-pipeline-v1",
|
|
14
|
+
adapter: generative,
|
|
15
|
+
config: {
|
|
16
|
+
generativeAdapter: config.generativeAdapter,
|
|
17
|
+
videoUseHome: config.videoUseHome,
|
|
18
|
+
hasElevenLabsKey: config.hasElevenLabsKey,
|
|
19
|
+
hasBridgeToken: config.hasBridgeToken,
|
|
20
|
+
videoModelProvider: config.videoModelProvider,
|
|
21
|
+
},
|
|
22
|
+
stages: pipelineStages.map((s) => ({
|
|
23
|
+
...s,
|
|
24
|
+
status: stageStatus.PENDING,
|
|
25
|
+
})),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: dark;
|
|
3
|
+
--bg: #080b12;
|
|
4
|
+
--sidebar: #0d1118;
|
|
5
|
+
--panel: #111827;
|
|
6
|
+
--panel-soft: #0d1420;
|
|
7
|
+
--ink: #f7fafc;
|
|
8
|
+
--muted: #93a3b8;
|
|
9
|
+
--line: #223047;
|
|
10
|
+
--accent: #38bdf8;
|
|
11
|
+
--accent-soft: rgba(56, 189, 248, 0.12);
|
|
12
|
+
--good: #22c55e;
|
|
13
|
+
--warn: #f59e0b;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
html { scroll-behavior: smooth; }
|
|
18
|
+
body {
|
|
19
|
+
margin: 0;
|
|
20
|
+
background: var(--bg);
|
|
21
|
+
color: var(--ink);
|
|
22
|
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
23
|
+
}
|
|
24
|
+
a { color: inherit; }
|
|
25
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9em; }
|
|
26
|
+
|
|
27
|
+
.shell {
|
|
28
|
+
min-height: 100vh;
|
|
29
|
+
display: grid;
|
|
30
|
+
grid-template-columns: 232px minmax(0, 1fr);
|
|
31
|
+
background: radial-gradient(circle at top right, rgba(56, 189, 248, 0.12), transparent 360px), var(--bg);
|
|
32
|
+
}
|
|
33
|
+
.sidebar {
|
|
34
|
+
position: sticky;
|
|
35
|
+
top: 0;
|
|
36
|
+
height: 100vh;
|
|
37
|
+
display: flex;
|
|
38
|
+
flex-direction: column;
|
|
39
|
+
gap: 22px;
|
|
40
|
+
background: rgba(13, 17, 24, 0.96);
|
|
41
|
+
border-right: 1px solid var(--line);
|
|
42
|
+
padding: 22px 16px;
|
|
43
|
+
}
|
|
44
|
+
.brand { display: flex; align-items: center; gap: 10px; font-weight: 800; }
|
|
45
|
+
.brand-mark {
|
|
46
|
+
width: 34px;
|
|
47
|
+
height: 34px;
|
|
48
|
+
display: grid;
|
|
49
|
+
place-items: center;
|
|
50
|
+
border-radius: 8px;
|
|
51
|
+
background: var(--accent);
|
|
52
|
+
color: #06111d;
|
|
53
|
+
font-size: 13px;
|
|
54
|
+
font-weight: 900;
|
|
55
|
+
}
|
|
56
|
+
.nav { display: grid; gap: 5px; }
|
|
57
|
+
.nav a {
|
|
58
|
+
color: #c6d1e1;
|
|
59
|
+
text-decoration: none;
|
|
60
|
+
padding: 9px 10px;
|
|
61
|
+
border-radius: 7px;
|
|
62
|
+
font-size: 14px;
|
|
63
|
+
}
|
|
64
|
+
.nav a.active, .nav a:hover { background: #172133; color: white; }
|
|
65
|
+
.sidebar-footer {
|
|
66
|
+
margin-top: auto;
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 8px;
|
|
70
|
+
color: var(--muted);
|
|
71
|
+
font-size: 13px;
|
|
72
|
+
}
|
|
73
|
+
.status-dot {
|
|
74
|
+
width: 8px;
|
|
75
|
+
height: 8px;
|
|
76
|
+
border-radius: 999px;
|
|
77
|
+
background: var(--good);
|
|
78
|
+
box-shadow: 0 0 0 4px rgba(34, 197, 94, 0.12);
|
|
79
|
+
}
|
|
80
|
+
.main { width: min(100%, 1180px); padding: 30px; }
|
|
81
|
+
.utility-bar {
|
|
82
|
+
display: flex;
|
|
83
|
+
justify-content: space-between;
|
|
84
|
+
gap: 16px;
|
|
85
|
+
align-items: center;
|
|
86
|
+
margin-bottom: 20px;
|
|
87
|
+
padding: 12px 14px;
|
|
88
|
+
border: 1px solid var(--line);
|
|
89
|
+
border-radius: 8px;
|
|
90
|
+
background: rgba(17, 24, 39, 0.82);
|
|
91
|
+
}
|
|
92
|
+
.utility-bar strong { display: block; font-size: 14px; }
|
|
93
|
+
.utility-bar span, .page-heading p, .panel-copy, .card p, .setup-card p, .key-row p { color: var(--muted); line-height: 1.5; }
|
|
94
|
+
.utility-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
95
|
+
.utility-actions a, .pill, .badge {
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
min-height: 28px;
|
|
99
|
+
border: 1px solid var(--line);
|
|
100
|
+
border-radius: 999px;
|
|
101
|
+
padding: 5px 10px;
|
|
102
|
+
background: #0c1320;
|
|
103
|
+
color: #c9d7e8;
|
|
104
|
+
text-decoration: none;
|
|
105
|
+
font-size: 12px;
|
|
106
|
+
}
|
|
107
|
+
.page-heading { position: relative; margin-bottom: 22px; }
|
|
108
|
+
.page-heading h1 { margin: 4px 0 8px; font-size: clamp(32px, 5vw, 58px); line-height: 0.98; letter-spacing: 0; }
|
|
109
|
+
.page-heading p { max-width: 780px; margin: 0 0 12px; }
|
|
110
|
+
.eyebrow { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; }
|
|
111
|
+
|
|
112
|
+
/* Pipeline strip */
|
|
113
|
+
.pipeline-strip {
|
|
114
|
+
display: grid;
|
|
115
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
116
|
+
gap: 14px;
|
|
117
|
+
margin-bottom: 22px;
|
|
118
|
+
}
|
|
119
|
+
.stage-card {
|
|
120
|
+
border: 1px solid var(--line);
|
|
121
|
+
border-radius: 8px;
|
|
122
|
+
background: rgba(17, 24, 39, 0.9);
|
|
123
|
+
padding: 18px;
|
|
124
|
+
}
|
|
125
|
+
.stage-card.complete { border-color: rgba(34, 197, 94, 0.4); background: rgba(34, 197, 94, 0.05); }
|
|
126
|
+
.stage-card.active { border-color: rgba(56, 189, 248, 0.4); background: rgba(56, 189, 248, 0.06); }
|
|
127
|
+
.stage-step { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
128
|
+
.stage-card strong { display: block; margin: 8px 0 6px; font-size: 16px; }
|
|
129
|
+
.stage-card code { display: block; margin-top: 8px; font-size: 11px; color: #9ab8d8; word-break: break-all; }
|
|
130
|
+
.stage-status { display: inline-block; margin-top: 8px; border-radius: 999px; padding: 3px 8px; font-size: 11px; font-weight: 700; }
|
|
131
|
+
.stage-status.pending { color: var(--muted); background: #0a101b; border: 1px solid var(--line); }
|
|
132
|
+
.stage-status.complete { color: var(--good); background: rgba(34, 197, 94, 0.1); border: 1px solid rgba(34, 197, 94, 0.3); }
|
|
133
|
+
|
|
134
|
+
.hero-grid { display: grid; grid-template-columns: 1.2fr 0.9fr 0.9fr; gap: 14px; margin-bottom: 16px; }
|
|
135
|
+
.hero-card { min-height: 150px; padding: 18px; border: 1px solid var(--line); border-radius: 8px; background: rgba(17, 24, 39, 0.9); }
|
|
136
|
+
.hero-card.primary { background: linear-gradient(135deg, rgba(56, 189, 248, 0.18), rgba(17, 24, 39, 0.95)); }
|
|
137
|
+
.hero-card span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
138
|
+
.hero-card strong { display: block; margin-top: 10px; font-size: 28px; line-height: 1; }
|
|
139
|
+
.hero-card p { margin: 10px 0 0; color: var(--muted); font-size: 13px; line-height: 1.5; }
|
|
140
|
+
.card-label { color: var(--accent) !important; font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
141
|
+
.muted { color: var(--muted) !important; }
|
|
142
|
+
|
|
143
|
+
.ops-strip {
|
|
144
|
+
display: grid;
|
|
145
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
146
|
+
gap: 12px;
|
|
147
|
+
margin-bottom: 18px;
|
|
148
|
+
}
|
|
149
|
+
.ops-strip article { padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(13, 20, 32, 0.88); }
|
|
150
|
+
.ops-strip span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
151
|
+
.ops-strip strong { display: block; margin: 7px 0; font-size: 14px; }
|
|
152
|
+
.ops-strip p { margin: 0; font-size: 13px; color: var(--muted); }
|
|
153
|
+
|
|
154
|
+
.adapter-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; }
|
|
155
|
+
.card { min-height: 100px; padding: 16px; border: 1px solid var(--line); border-radius: 8px; background: rgba(17, 24, 39, 0.9); }
|
|
156
|
+
.card h3 { margin: 0 0 8px; font-size: 14px; color: var(--accent); }
|
|
157
|
+
|
|
158
|
+
/* Settings — /settings/keys */
|
|
159
|
+
.setup-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; }
|
|
160
|
+
.setup-card { padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(13, 20, 32, 0.88); }
|
|
161
|
+
.setup-card span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
162
|
+
.setup-card strong { display: block; margin: 7px 0; font-size: 14px; }
|
|
163
|
+
.setup-card code { color: #d7e8ff; word-break: break-word; }
|
|
164
|
+
|
|
165
|
+
.key-board { display: grid; gap: 10px; }
|
|
166
|
+
.key-row { padding: 14px 16px; border: 1px solid var(--line); border-radius: 8px; background: #0d1420; }
|
|
167
|
+
.key-row-top { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
|
|
168
|
+
.key-badge { border-radius: 999px; padding: 2px 8px; font-size: 11px; font-weight: 700; }
|
|
169
|
+
.key-badge.required { background: rgba(56, 189, 248, 0.15); color: var(--accent); border: 1px solid rgba(56, 189, 248, 0.3); }
|
|
170
|
+
.key-badge.conditional { background: rgba(147, 163, 184, 0.1); color: var(--muted); border: 1px solid var(--line); }
|
|
171
|
+
.settings-note { margin-top: 14px; color: var(--muted); font-size: 13px; }
|
|
172
|
+
.toolbar-strip { display: flex; justify-content: space-between; align-items: center; gap: 14px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(17, 24, 39, 0.9); margin-bottom: 18px; }
|
|
173
|
+
.toolbar-strip p { margin: 4px 0 0; color: var(--muted); font-size: 14px; }
|
|
174
|
+
|
|
175
|
+
.quick-actions {
|
|
176
|
+
position: fixed;
|
|
177
|
+
right: 20px;
|
|
178
|
+
bottom: 20px;
|
|
179
|
+
display: grid;
|
|
180
|
+
gap: 8px;
|
|
181
|
+
width: 200px;
|
|
182
|
+
}
|
|
183
|
+
.quick-actions button {
|
|
184
|
+
border: 1px solid var(--line);
|
|
185
|
+
border-radius: 8px;
|
|
186
|
+
padding: 10px 12px;
|
|
187
|
+
background: #0d1420;
|
|
188
|
+
color: var(--ink);
|
|
189
|
+
text-align: left;
|
|
190
|
+
font: inherit;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
@media (max-width: 1020px) {
|
|
194
|
+
.shell { grid-template-columns: 1fr; }
|
|
195
|
+
.sidebar { position: static; height: auto; }
|
|
196
|
+
.pipeline-strip, .hero-grid, .adapter-grid, .ops-strip, .setup-grid { grid-template-columns: 1fr; }
|
|
197
|
+
.quick-actions { position: static; width: auto; margin: 20px 30px; }
|
|
198
|
+
}
|
|
199
|
+
@media (max-width: 720px) {
|
|
200
|
+
.main { padding: 20px; }
|
|
201
|
+
.utility-bar { display: block; }
|
|
202
|
+
.utility-actions { margin-top: 10px; }
|
|
203
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "./globals.css";
|
|
2
|
+
const metadata = {
|
|
3
|
+
title: "Creative Video Pipeline",
|
|
4
|
+
description: "Three-stage creative video pipeline: brief, generative, edit — governed workspace with Growthub bridge and BYOK support."
|
|
5
|
+
};
|
|
6
|
+
function RootLayout({ children }) {
|
|
7
|
+
return <html lang="en">
|
|
8
|
+
<body>{children}</body>
|
|
9
|
+
</html>;
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
RootLayout as default,
|
|
13
|
+
metadata
|
|
14
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { readAdapterConfig } from "@/lib/adapters/env";
|
|
2
|
+
import { describeGenerativeAdapter } from "@/lib/adapters/generative/index";
|
|
3
|
+
import { pipelineStages } from "@/lib/domain/pipeline";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
|
|
6
|
+
const nav = [
|
|
7
|
+
{ href: "#pipeline", label: "Pipeline" },
|
|
8
|
+
{ href: "#brief", label: "Brief" },
|
|
9
|
+
{ href: "#generative", label: "Generative" },
|
|
10
|
+
{ href: "#edit", label: "Edit" },
|
|
11
|
+
{ href: "/settings/keys", label: "API Keys" },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
function Home() {
|
|
15
|
+
const config = readAdapterConfig();
|
|
16
|
+
const generative = describeGenerativeAdapter();
|
|
17
|
+
|
|
18
|
+
return <main className="shell">
|
|
19
|
+
<aside className="sidebar">
|
|
20
|
+
<div className="brand">
|
|
21
|
+
<span className="brand-mark">CV</span>
|
|
22
|
+
<span>Creative Video Pipeline</span>
|
|
23
|
+
</div>
|
|
24
|
+
<nav className="nav">
|
|
25
|
+
{nav.map((item) => <Link href={item.href} key={item.href}>{item.label}</Link>)}
|
|
26
|
+
</nav>
|
|
27
|
+
<div className="sidebar-footer">
|
|
28
|
+
<span className="status-dot" />
|
|
29
|
+
Governed worker kit
|
|
30
|
+
</div>
|
|
31
|
+
</aside>
|
|
32
|
+
|
|
33
|
+
<section className="main">
|
|
34
|
+
<div className="utility-bar">
|
|
35
|
+
<div>
|
|
36
|
+
<strong>Creative Video Pipeline</strong>
|
|
37
|
+
<span>Brief → Generate → Edit — governed workspace with local Vite shell and Vercel parity.</span>
|
|
38
|
+
</div>
|
|
39
|
+
<div className="utility-actions">
|
|
40
|
+
<Link href="/settings/keys">API Keys</Link>
|
|
41
|
+
<span className="pill">v1 kit</span>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div className="page-heading" id="pipeline">
|
|
46
|
+
<p className="eyebrow">Three-stage pipeline</p>
|
|
47
|
+
<h1>Brief to final video.</h1>
|
|
48
|
+
<p>
|
|
49
|
+
Brand-grounded brief, generative image/video via{" "}
|
|
50
|
+
<strong>{config.generativeAdapter}</strong>, and transcript-anchored editing
|
|
51
|
+
via the video-use fork — outputs governed across all three stages.
|
|
52
|
+
</p>
|
|
53
|
+
<span className="badge">adapter: {generative.label}</span>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<section className="pipeline-strip" id="pipeline-stages">
|
|
57
|
+
{pipelineStages.map((stage) => <article className="stage-card" id={stage.id} key={stage.id}>
|
|
58
|
+
<span className="stage-step">{stage.step}</span>
|
|
59
|
+
<strong>{stage.label}</strong>
|
|
60
|
+
<p>{stage.description}</p>
|
|
61
|
+
<code>{stage.outputPath}</code>
|
|
62
|
+
<span className="stage-status pending">pending</span>
|
|
63
|
+
</article>)}
|
|
64
|
+
</section>
|
|
65
|
+
|
|
66
|
+
<section className="hero-grid">
|
|
67
|
+
<article className="hero-card primary">
|
|
68
|
+
<p className="card-label">Generative adapter</p>
|
|
69
|
+
<strong>{config.generativeAdapter}</strong>
|
|
70
|
+
<p>{generative.description}</p>
|
|
71
|
+
</article>
|
|
72
|
+
<article className="hero-card">
|
|
73
|
+
<p className="card-label">Video-use fork</p>
|
|
74
|
+
<strong>{config.videoUseHome ? "configured" : "not set"}</strong>
|
|
75
|
+
<p className="muted">VIDEO_USE_HOME resolves the video-use clone for Stage 3.</p>
|
|
76
|
+
</article>
|
|
77
|
+
<article className="hero-card">
|
|
78
|
+
<p className="card-label">ElevenLabs Scribe</p>
|
|
79
|
+
<strong>{config.hasElevenLabsKey ? "key set" : "key missing"}</strong>
|
|
80
|
+
<p className="muted">Required for Stage 3 word-level transcription.</p>
|
|
81
|
+
</article>
|
|
82
|
+
</section>
|
|
83
|
+
|
|
84
|
+
<section className="ops-strip">
|
|
85
|
+
<article>
|
|
86
|
+
<span>01</span>
|
|
87
|
+
<strong>Brand Kit</strong>
|
|
88
|
+
<p>Scene structure and hooks sourced from brand-kit.md only.</p>
|
|
89
|
+
</article>
|
|
90
|
+
<article>
|
|
91
|
+
<span>02</span>
|
|
92
|
+
<strong>CLI Pipeline</strong>
|
|
93
|
+
<p>growthub pipeline execute → CMS video-generation node.</p>
|
|
94
|
+
</article>
|
|
95
|
+
<article>
|
|
96
|
+
<span>03</span>
|
|
97
|
+
<strong>video-use Fork</strong>
|
|
98
|
+
<p>Scribe → word-boundary EDL → FFmpeg → final.mp4.</p>
|
|
99
|
+
</article>
|
|
100
|
+
<article>
|
|
101
|
+
<span>04</span>
|
|
102
|
+
<strong>Governed</strong>
|
|
103
|
+
<p>project.md + trace.jsonl at every stage boundary.</p>
|
|
104
|
+
</article>
|
|
105
|
+
</section>
|
|
106
|
+
|
|
107
|
+
<section className="adapter-grid" aria-label="Adapter paths">
|
|
108
|
+
<article className="card">
|
|
109
|
+
<h3>growthub-pipeline (primary)</h3>
|
|
110
|
+
<p>Routes through hosted CMS video-generation node. Requires GROWTHUB_BRIDGE_ACCESS_TOKEN + auth.</p>
|
|
111
|
+
</article>
|
|
112
|
+
<article className="card">
|
|
113
|
+
<h3>byo-api-key (secondary)</h3>
|
|
114
|
+
<p>Explicit provider SDK calls. Set VIDEO_MODEL_PROVIDER (veo | fal | runway) + key. Same artifact contract.</p>
|
|
115
|
+
</article>
|
|
116
|
+
</section>
|
|
117
|
+
</section>
|
|
118
|
+
|
|
119
|
+
<aside className="quick-actions">
|
|
120
|
+
<button type="button">Run Stage 1 — Brief</button>
|
|
121
|
+
<button type="button">Run Stage 2 — Generate</button>
|
|
122
|
+
<button type="button">Run Stage 3 — Edit</button>
|
|
123
|
+
<button type="button">
|
|
124
|
+
<Link href="/settings/keys">Configure API Keys</Link>
|
|
125
|
+
</button>
|
|
126
|
+
</aside>
|
|
127
|
+
</main>;
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
Home as default
|
|
131
|
+
};
|