@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.
Files changed (63) hide show
  1. package/assets/worker-kits/growthub-creative-video-pipeline-v1/.env.example +28 -0
  2. package/assets/worker-kits/growthub-creative-video-pipeline-v1/QUICKSTART.md +118 -0
  3. package/assets/worker-kits/growthub-creative-video-pipeline-v1/SKILL.md +103 -0
  4. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/.env.example +20 -0
  5. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/README.md +33 -0
  6. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/api/pipeline/route.js +27 -0
  7. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/globals.css +203 -0
  8. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/layout.jsx +14 -0
  9. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/page.jsx +131 -0
  10. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/app/settings/keys/page.jsx +154 -0
  11. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/adapters/env.js +14 -0
  12. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/adapters/generative/index.js +31 -0
  13. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/lib/domain/pipeline.js +30 -0
  14. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/next.config.js +10 -0
  15. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/package-lock.json +17 -0
  16. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/package.json +17 -0
  17. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/postcss.config.mjs +3 -0
  18. package/assets/worker-kits/growthub-creative-video-pipeline-v1/apps/creative-video-pipeline/vercel.json +5 -0
  19. package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/NEW-CLIENT.md +21 -0
  20. package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/_template/brand-kit.md +123 -0
  21. package/assets/worker-kits/growthub-creative-video-pipeline-v1/brands/growthub/brand-kit.md +123 -0
  22. package/assets/worker-kits/growthub-creative-video-pipeline-v1/bundles/growthub-creative-video-pipeline-v1.json +83 -0
  23. package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/adapter-contracts.md +73 -0
  24. package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/governed-workspace-primitives.md +50 -0
  25. package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/pipeline-architecture.md +61 -0
  26. package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/starter-kit-overview.md +33 -0
  27. package/assets/worker-kits/growthub-creative-video-pipeline-v1/docs/vercel-deployment.md +42 -0
  28. package/assets/worker-kits/growthub-creative-video-pipeline-v1/examples/pipeline-brief-sample.md +56 -0
  29. package/assets/worker-kits/growthub-creative-video-pipeline-v1/growthub-meta/README.md +9 -0
  30. package/assets/worker-kits/growthub-creative-video-pipeline-v1/growthub-meta/kit-standard.md +24 -0
  31. package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/README.md +8 -0
  32. package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/check-generative-adapter.sh +41 -0
  33. package/assets/worker-kits/growthub-creative-video-pipeline-v1/helpers/run-pipeline.sh +30 -0
  34. package/assets/worker-kits/growthub-creative-video-pipeline-v1/kit.json +148 -0
  35. package/assets/worker-kits/growthub-creative-video-pipeline-v1/output/README.md +23 -0
  36. package/assets/worker-kits/growthub-creative-video-pipeline-v1/output-standards.md +63 -0
  37. package/assets/worker-kits/growthub-creative-video-pipeline-v1/runtime-assumptions.md +61 -0
  38. package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/check-deps.sh +63 -0
  39. package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/clone-fork.sh +18 -0
  40. package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/install-skill.sh +10 -0
  41. package/assets/worker-kits/growthub-creative-video-pipeline-v1/setup/verify-env.mjs +50 -0
  42. package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/README.md +11 -0
  43. package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/brief-generation/SKILL.md +42 -0
  44. package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/generative-execution/SKILL.md +86 -0
  45. package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills/video-edit/SKILL.md +41 -0
  46. package/assets/worker-kits/growthub-creative-video-pipeline-v1/skills.md +302 -0
  47. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/index.html +12 -0
  48. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/package-lock.json +20 -0
  49. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/package.json +20 -0
  50. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/serve.mjs +41 -0
  51. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/App.jsx +210 -0
  52. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/app.css +194 -0
  53. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/src/main.jsx +10 -0
  54. package/assets/worker-kits/growthub-creative-video-pipeline-v1/studio/vite.config.js +8 -0
  55. package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/edit-plan.md +66 -0
  56. package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/generative-plan.md +83 -0
  57. package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/pipeline-brief.md +129 -0
  58. package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/project.md +68 -0
  59. package/assets/worker-kits/growthub-creative-video-pipeline-v1/templates/self-eval.md +67 -0
  60. package/assets/worker-kits/growthub-creative-video-pipeline-v1/validation-checklist.md +52 -0
  61. package/assets/worker-kits/growthub-creative-video-pipeline-v1/workers/creative-video-pipeline-operator/CLAUDE.md +109 -0
  62. package/dist/index.js +9 -0
  63. 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
+ };