@growthub/cli 0.8.1 → 0.9.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/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 +124 -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 +87 -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 +9 -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/check-pipeline-health.sh +154 -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 +154 -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/pipeline.manifest.json +83 -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/e2e-reference.md +166 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/validation-checklist.md +56 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/workers/creative-video-pipeline-operator/CLAUDE.md +109 -0
- package/assets/worker-kits/growthub-creative-video-pipeline-v1/workspace.dependencies.json +26 -0
- package/dist/index.js +3032 -1676
- package/package.json +2 -2
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readAdapterConfig } from "@/lib/adapters/env";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
|
|
4
|
+
const KEYS = [
|
|
5
|
+
{
|
|
6
|
+
env: "CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER",
|
|
7
|
+
label: "Generative Adapter",
|
|
8
|
+
badge: "required",
|
|
9
|
+
note: "growthub-pipeline (default) or byo-api-key",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
env: "GROWTHUB_BRIDGE_ACCESS_TOKEN",
|
|
13
|
+
label: "Bridge Access Token",
|
|
14
|
+
badge: "required",
|
|
15
|
+
note: "Required for growthub-pipeline adapter. Obtain from Growthub dashboard.",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
env: "GROWTHUB_BRIDGE_BASE_URL",
|
|
19
|
+
label: "Bridge Base URL",
|
|
20
|
+
badge: "required",
|
|
21
|
+
note: "Required for growthub-pipeline adapter. e.g. https://api.growthub.ai",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
env: "ELEVENLABS_API_KEY",
|
|
25
|
+
label: "ElevenLabs API Key",
|
|
26
|
+
badge: "required",
|
|
27
|
+
note: "Required for Stage 3 word-level transcription via Scribe.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
env: "VIDEO_MODEL_PROVIDER",
|
|
31
|
+
label: "Video Model Provider",
|
|
32
|
+
badge: "conditional",
|
|
33
|
+
note: "Required for byo-api-key adapter. One of: veo | fal | runway",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
env: "GOOGLE_AI_API_KEY",
|
|
37
|
+
label: "Google AI API Key",
|
|
38
|
+
badge: "conditional",
|
|
39
|
+
note: "Required when VIDEO_MODEL_PROVIDER=veo",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
env: "FAL_API_KEY",
|
|
43
|
+
label: "Fal API Key",
|
|
44
|
+
badge: "conditional",
|
|
45
|
+
note: "Required when VIDEO_MODEL_PROVIDER=fal",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
env: "RUNWAY_API_KEY",
|
|
49
|
+
label: "Runway API Key",
|
|
50
|
+
badge: "conditional",
|
|
51
|
+
note: "Required when VIDEO_MODEL_PROVIDER=runway",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
env: "VIDEO_USE_HOME",
|
|
55
|
+
label: "VIDEO_USE_HOME",
|
|
56
|
+
badge: "required",
|
|
57
|
+
note: "Absolute path to the video-use fork clone. Required for Stage 3.",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
env: "CREATIVE_VIDEO_PIPELINE_HOME",
|
|
61
|
+
label: "Pipeline Home",
|
|
62
|
+
badge: "conditional",
|
|
63
|
+
note: "Override workspace root. Defaults to $HOME/creative-video-pipeline",
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
const SETUP_CARDS = [
|
|
68
|
+
{
|
|
69
|
+
step: "01",
|
|
70
|
+
label: "Copy .env.example",
|
|
71
|
+
code: "cp .env.example .env.local",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
step: "02",
|
|
75
|
+
label: "Set adapter",
|
|
76
|
+
code: "CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=growthub-pipeline",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
step: "03",
|
|
80
|
+
label: "Clone video-use fork",
|
|
81
|
+
code: "bash setup/clone-fork.sh",
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
function KeysPage() {
|
|
86
|
+
const config = readAdapterConfig();
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<main className="shell">
|
|
90
|
+
<aside className="sidebar">
|
|
91
|
+
<div className="brand">
|
|
92
|
+
<span className="brand-mark">CV</span>
|
|
93
|
+
<span>Creative Video Pipeline</span>
|
|
94
|
+
</div>
|
|
95
|
+
<nav className="nav">
|
|
96
|
+
<Link href="/">Pipeline</Link>
|
|
97
|
+
<Link href="/settings/keys">API Keys</Link>
|
|
98
|
+
</nav>
|
|
99
|
+
<div className="sidebar-footer">
|
|
100
|
+
<span className="status-dot" />
|
|
101
|
+
Governed worker kit
|
|
102
|
+
</div>
|
|
103
|
+
</aside>
|
|
104
|
+
|
|
105
|
+
<section className="main">
|
|
106
|
+
<div className="toolbar-strip">
|
|
107
|
+
<div>
|
|
108
|
+
<strong>API Key Configuration</strong>
|
|
109
|
+
<p>Adapter: <code>{config.generativeAdapter}</code> — Bridge: {config.hasBridgeToken ? "set" : "missing"} — ElevenLabs: {config.hasElevenLabsKey ? "set" : "missing"}</p>
|
|
110
|
+
</div>
|
|
111
|
+
<Link href="/">← Back to Pipeline</Link>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div className="page-heading">
|
|
115
|
+
<p className="eyebrow">Configuration</p>
|
|
116
|
+
<h1>API Keys</h1>
|
|
117
|
+
<p>
|
|
118
|
+
Set these variables in <code>.env.local</code> (local dev) or Vercel environment settings (production).
|
|
119
|
+
Growthub-pipeline adapter requires the Bridge token. BYOK requires a provider key. Stage 3 always requires ElevenLabs.
|
|
120
|
+
</p>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<div className="setup-grid">
|
|
124
|
+
{SETUP_CARDS.map((card) => (
|
|
125
|
+
<article className="setup-card" key={card.step}>
|
|
126
|
+
<span>{card.step}</span>
|
|
127
|
+
<strong>{card.label}</strong>
|
|
128
|
+
<code>{card.code}</code>
|
|
129
|
+
</article>
|
|
130
|
+
))}
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div className="key-board">
|
|
134
|
+
{KEYS.map((key) => (
|
|
135
|
+
<div className="key-row" key={key.env}>
|
|
136
|
+
<div className="key-row-top">
|
|
137
|
+
<code>{key.env}</code>
|
|
138
|
+
<span className={`key-badge ${key.badge}`}>{key.badge}</span>
|
|
139
|
+
</div>
|
|
140
|
+
<p>{key.note}</p>
|
|
141
|
+
</div>
|
|
142
|
+
))}
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<p className="settings-note">
|
|
146
|
+
Never commit secrets. Use <code>.env.local</code> locally and Vercel environment variables for deployment.
|
|
147
|
+
The <code>.env.example</code> file in the kit root documents all variables without values.
|
|
148
|
+
</p>
|
|
149
|
+
</section>
|
|
150
|
+
</main>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export default KeysPage;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function readAdapterConfig() {
|
|
2
|
+
return {
|
|
3
|
+
generativeAdapter: process.env.CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER || "growthub-pipeline",
|
|
4
|
+
pipelineHome: process.env.CREATIVE_VIDEO_PIPELINE_HOME || null,
|
|
5
|
+
videoUseHome: process.env.VIDEO_USE_HOME || null,
|
|
6
|
+
hasElevenLabsKey: Boolean(process.env.ELEVENLABS_API_KEY),
|
|
7
|
+
hasBridgeToken: Boolean(process.env.GROWTHUB_BRIDGE_ACCESS_TOKEN),
|
|
8
|
+
bridgeBaseUrl: process.env.GROWTHUB_BRIDGE_BASE_URL || null,
|
|
9
|
+
videoModelProvider: process.env.VIDEO_MODEL_PROVIDER || null,
|
|
10
|
+
hasGoogleKey: Boolean(process.env.GOOGLE_AI_API_KEY),
|
|
11
|
+
hasFalKey: Boolean(process.env.FAL_API_KEY),
|
|
12
|
+
hasRunwayKey: Boolean(process.env.RUNWAY_API_KEY),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const ADAPTERS = {
|
|
2
|
+
"growthub-pipeline": {
|
|
3
|
+
id: "growthub-pipeline",
|
|
4
|
+
label: "growthub-pipeline",
|
|
5
|
+
description: "Hosted CMS video-generation node via growthub pipeline execute. Requires GROWTHUB_BRIDGE_ACCESS_TOKEN + authenticated session.",
|
|
6
|
+
requiredEnv: ["GROWTHUB_BRIDGE_ACCESS_TOKEN", "GROWTHUB_BRIDGE_BASE_URL"],
|
|
7
|
+
cliCommand: "growthub pipeline execute '<DynamicRegistryPipeline JSON>'",
|
|
8
|
+
sdkContract: "@growthub/api-contract — DynamicRegistryPipeline, ExecutionEvent, isExecutionEvent",
|
|
9
|
+
},
|
|
10
|
+
"byo-api-key": {
|
|
11
|
+
id: "byo-api-key",
|
|
12
|
+
label: "byo-api-key",
|
|
13
|
+
description: "Direct provider SDK calls. Set VIDEO_MODEL_PROVIDER (veo | fal | runway) + provider key.",
|
|
14
|
+
requiredEnv: ["VIDEO_MODEL_PROVIDER"],
|
|
15
|
+
cliCommand: null,
|
|
16
|
+
sdkContract: "provider SDK — Google AI / Fal / Runway",
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export function describeGenerativeAdapter() {
|
|
21
|
+
const id = process.env.CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER || "growthub-pipeline";
|
|
22
|
+
return ADAPTERS[id] ?? ADAPTERS["growthub-pipeline"];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function readGenerativeConfig() {
|
|
26
|
+
const adapter = describeGenerativeAdapter();
|
|
27
|
+
return {
|
|
28
|
+
adapter,
|
|
29
|
+
missingEnv: adapter.requiredEnv.filter((k) => !process.env[k]),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const pipelineStages = [
|
|
2
|
+
{
|
|
3
|
+
id: "brief",
|
|
4
|
+
step: "01",
|
|
5
|
+
label: "Brief",
|
|
6
|
+
description: "Brand-grounded creative brief sourced from brand-kit.md. Scene structure, hooks, and constraints locked before generation.",
|
|
7
|
+
outputPath: "output/<client>/<project>/brief/pipeline-brief.md",
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "generate",
|
|
11
|
+
step: "02",
|
|
12
|
+
label: "Generate",
|
|
13
|
+
description: "Generative image/video via adapter (growthub-pipeline or byo-api-key). Normalised to GenerativeArtifact[] + manifest.json.",
|
|
14
|
+
outputPath: "output/<client>/<project>/generative/manifest.json",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "edit",
|
|
18
|
+
step: "03",
|
|
19
|
+
label: "Edit",
|
|
20
|
+
description: "ElevenLabs Scribe transcription → word-boundary EDL → FFmpeg render via video-use fork. Final output: final.mp4.",
|
|
21
|
+
outputPath: "output/<client>/<project>/final/final.mp4",
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export const stageStatus = {
|
|
26
|
+
PENDING: "pending",
|
|
27
|
+
ACTIVE: "active",
|
|
28
|
+
COMPLETE: "complete",
|
|
29
|
+
ERROR: "error",
|
|
30
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "growthub-creative-video-pipeline-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "growthub-creative-video-pipeline-app",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"next": "16.2.4",
|
|
12
|
+
"react": "^19.0.0",
|
|
13
|
+
"react-dom": "^19.0.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "growthub-creative-video-pipeline-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start",
|
|
10
|
+
"lint": "next lint"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"next": "16.2.4",
|
|
14
|
+
"react": "19.2.4",
|
|
15
|
+
"react-dom": "19.2.4"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# New Client — Onboarding
|
|
2
|
+
|
|
3
|
+
When the operator starts a new project:
|
|
4
|
+
|
|
5
|
+
1. Create `brands/<client-slug>/brand-kit.md` from the `_template` scaffold.
|
|
6
|
+
2. Fill in all YAML fields — Identity, Audience, Messaging, Brand Design, Talent, Assets, Platform.
|
|
7
|
+
3. Create `brands/<client-slug>/assets/` for logo and reference images.
|
|
8
|
+
4. Append a `registered` event to `.growthub-fork/trace.jsonl` with `{clientSlug}` in the detail.
|
|
9
|
+
5. Run `growthub kit fork status <fork-id>` to confirm no drift was introduced.
|
|
10
|
+
|
|
11
|
+
The `_template/` brand is upstream-owned; all real client work lives under `brands/<client-slug>/`.
|
|
12
|
+
|
|
13
|
+
## Quick scaffold
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
SLUG=<client-slug>
|
|
17
|
+
cp brands/_template/brand-kit.md brands/${SLUG}/brand-kit.md
|
|
18
|
+
mkdir -p brands/${SLUG}/assets
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Fill every field. Use "N/A" or "TBD" if unknown — do not delete keys.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Brand Kit — [CLIENT NAME]
|
|
2
|
+
> Copy this file to `brands/<client-slug>/brand-kit.md` and fill in every field.
|
|
3
|
+
> Leave no field blank. Use "N/A" or "TBD" if unknown — do not delete the key.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## IDENTITY
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
client_name: "" # Full legal/brand name
|
|
11
|
+
slug: "" # kebab-case folder name e.g. "greentree-wellness"
|
|
12
|
+
industry: "" # e.g. Healthcare / Med Spa / Legal / Real Estate
|
|
13
|
+
primary_service: "" # The ONE service this campaign promotes
|
|
14
|
+
campaign_name: "" # e.g. "Regenerative Medicine — Spring 2026"
|
|
15
|
+
date_onboarded: "" # YYYY-MM-DD
|
|
16
|
+
account_owner: "" # Internal contact name
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## AUDIENCE
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
target_age_range: "" # e.g. "55–70"
|
|
25
|
+
target_gender: "" # e.g. "All" / "Female-skewing" / "Male"
|
|
26
|
+
target_pain_point: "" # e.g. "Chronic joint pain — knees, hips, shoulders"
|
|
27
|
+
target_intent: "" # e.g. "Actively seeking non-surgical treatment options"
|
|
28
|
+
geographic_target: "" # e.g. "New Jersey — Bergen/Morris/Essex County"
|
|
29
|
+
do_not_attract: "" # Who we explicitly DO NOT want — critical for ad targeting
|
|
30
|
+
# e.g. "Pain medication / opioid patients. People seeking prescriptions."
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## MESSAGING
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
core_message: "" # One sentence — what the brand promises
|
|
39
|
+
emotional_arc: "" # e.g. "Struggle → Recognition → Transformation → Action"
|
|
40
|
+
tone: [] # 3–5 adjectives e.g. ["warm", "credible", "science-informed", "hopeful"]
|
|
41
|
+
approved_phrases: [] # Language that IS approved for use
|
|
42
|
+
# e.g. ["natural healing", "body's own repair process", "results within weeks"]
|
|
43
|
+
messaging_guardrails: [] # Language that is NEVER allowed
|
|
44
|
+
# e.g. ["pain management", "medication", "prescriptions", "opioids"]
|
|
45
|
+
cta_text: "" # Primary CTA e.g. "Schedule Your Free Consultation"
|
|
46
|
+
cta_offer: "" # Offer text e.g. "Free Initial Assessment" / "50% off first visit"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## BRAND DESIGN
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
colors:
|
|
55
|
+
primary: "" # Hex e.g. "2D6A4F"
|
|
56
|
+
secondary: "" # Hex e.g. "40916C"
|
|
57
|
+
light_accent: "" # Hex e.g. "D8F3DC"
|
|
58
|
+
dark: "" # Hex e.g. "1B1B1B"
|
|
59
|
+
white: "FFFFFF"
|
|
60
|
+
mid_gray: "6B7280"
|
|
61
|
+
|
|
62
|
+
fonts:
|
|
63
|
+
primary: "Arial" # Default — change only if brand font is embedded
|
|
64
|
+
heading_size: 56 # Half-points. 56 = 28pt heading
|
|
65
|
+
body_size: 20 # Half-points. 20 = 10pt body
|
|
66
|
+
|
|
67
|
+
logo_file: "" # Relative path e.g. "assets/logo.png"
|
|
68
|
+
logo_on_dark: "" # Version for dark backgrounds e.g. "assets/logo-white.png"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## TALENT & PRODUCTION
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
doctor_or_founder_name: "" # Full name + credentials e.g. "Dr. Anthony Carabasi, DO"
|
|
77
|
+
founder_on_camera: "" # Yes / No / Available on request
|
|
78
|
+
ai_avatar_type: "" # Photoreal / Talking Head / UGC / None
|
|
79
|
+
ai_actor_age_range: "" # e.g. "55–65"
|
|
80
|
+
ai_actor_notes: "" # e.g. "Warm, relatable, diverse — 2 actors per creative"
|
|
81
|
+
ugc_inspiration: "" # Link to reference actors/style
|
|
82
|
+
vo_style: "" # e.g. "Warm credible male, 40–55, calm pace — NOT announcer"
|
|
83
|
+
broll_cadence: "" # e.g. "Cut every ~3 seconds — never >3s of uninterrupted talking head"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## ASSET LINKS
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
brand_assets_air: "" # e.g. "https://app.air.inc/a/b302d671b"
|
|
92
|
+
broll_library: "" # e.g. "https://app.air.inc/a/b9bf52f3b"
|
|
93
|
+
ugc_inspiration: "" # e.g. "https://app.air.inc/a/bb21113fd"
|
|
94
|
+
google_drive: "" # Drive folder link if applicable
|
|
95
|
+
instagram: "" # Instagram handle or URL
|
|
96
|
+
tiktok: "" # TikTok handle or URL
|
|
97
|
+
website: "" # Main website URL
|
|
98
|
+
landing_page: "" # Specific campaign landing page URL
|
|
99
|
+
phone_number: "" # Contact number for CTA overlays
|
|
100
|
+
previous_ads: [] # List of previous ad files/links for reference
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## PLATFORM & FORMAT
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
primary_platforms: [] # e.g. ["Meta Feed", "Instagram Reels", "YouTube Pre-Roll"]
|
|
109
|
+
aspect_ratios: [] # e.g. ["9:16", "1:1", "16:9"]
|
|
110
|
+
caption_default: "ON" # ON / OFF — always ON unless client specifies otherwise
|
|
111
|
+
compliance_notes: "" # Any legal/regulatory constraints
|
|
112
|
+
# e.g. "No before/after guarantees. 'Results may vary' required if specific claims made."
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## DELIVERABLES LOG
|
|
118
|
+
|
|
119
|
+
> Append a new line each time a deliverable is completed.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
- YYYY-MM-DD | [Asset Type] v[N] | [file path or link]
|
|
123
|
+
```
|