@growthub/cli 0.8.0 → 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-agency-portal-starter-v1/.env.example +53 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/QUICKSTART.md +98 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/.env.example +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/README.md +36 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/api/settings/integrations/route.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/api/workspace/route.js +27 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/globals.css +237 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/layout.jsx +14 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/page.jsx +165 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/settings/integrations/page.jsx +134 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/auth/index.js +21 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/env.js +28 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/integrations/growthub-connection-normalizer.js +95 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/integrations/index.js +178 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/payments/index.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/index.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/postgres.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/provider-managed.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/qstash-kv.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/domain/integrations.js +185 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/domain/portal.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/next.config.js +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/package-lock.json +976 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/package.json +17 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/postcss.config.mjs +3 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/vercel.json +5 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/NEW-CLIENT.md +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/_template/brand-kit.md +27 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/growthub/brand-kit.md +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/bundles/growthub-agency-portal-starter-v1.json +65 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/adapter-contracts.md +79 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/fork-sync-integration.md +32 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/governed-workspace-primitives.md +182 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/starter-kit-overview.md +30 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/vercel-serverless-deployment.md +46 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/vite-ui-shell-guide.md +24 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/examples/portal-brief-sample.md +44 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/examples/workspace-sample.md +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/growthub-meta/README.md +11 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/growthub-meta/kit-standard.md +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/helpers/README.md +49 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/kit.json +156 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/output/README.md +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/output-standards.md +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/runtime-assumptions.md +15 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/setup/check-deps.sh +20 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/setup/verify-env.mjs +92 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/skills/README.md +55 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/skills.md +133 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/index.html +12 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/package-lock.json +1677 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/package.json +20 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/serve.mjs +42 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/App.jsx +162 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/app.css +138 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/main.jsx +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/vite.config.js +8 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/agent-contract.md +9 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/client-onboarding-plan.md +56 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/deployment-handoff.md +61 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/deployment-plan.md +22 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/portal-brief.md +65 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/project.md +55 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/supabase-setup-plan.md +26 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/workspace-brief.md +11 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/validation-checklist.md +32 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/workers/agency-portal-operator/CLAUDE.md +75 -0
- 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 +42 -33
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
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
|
+
cursor: pointer;
|
|
64
|
+
}
|
|
65
|
+
.nav a:hover { background: #172133; color: white; }
|
|
66
|
+
.sidebar-footer { margin-top: auto; display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 13px; }
|
|
67
|
+
.status-dot { width: 8px; height: 8px; border-radius: 999px; background: var(--good); box-shadow: 0 0 0 4px rgba(34, 197, 94, 0.12); }
|
|
68
|
+
.main { width: min(100%, 1180px); padding: 30px; }
|
|
69
|
+
.utility-bar {
|
|
70
|
+
display: flex;
|
|
71
|
+
justify-content: space-between;
|
|
72
|
+
gap: 16px;
|
|
73
|
+
align-items: center;
|
|
74
|
+
margin-bottom: 20px;
|
|
75
|
+
padding: 12px 14px;
|
|
76
|
+
border: 1px solid var(--line);
|
|
77
|
+
border-radius: 8px;
|
|
78
|
+
background: rgba(17, 24, 39, 0.82);
|
|
79
|
+
}
|
|
80
|
+
.utility-bar strong { display: block; font-size: 14px; }
|
|
81
|
+
.utility-bar span, .page-heading p, .card p, .stage-card p, .setup-card p { color: var(--muted); line-height: 1.5; }
|
|
82
|
+
.utility-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
83
|
+
.utility-actions a, .pill {
|
|
84
|
+
display: inline-flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
min-height: 28px;
|
|
87
|
+
border: 1px solid var(--line);
|
|
88
|
+
border-radius: 999px;
|
|
89
|
+
padding: 5px 10px;
|
|
90
|
+
background: #0c1320;
|
|
91
|
+
color: #c9d7e8;
|
|
92
|
+
text-decoration: none;
|
|
93
|
+
font-size: 12px;
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
}
|
|
96
|
+
.page-heading { margin-bottom: 22px; }
|
|
97
|
+
.page-heading h1 { margin: 4px 0 8px; font-size: clamp(32px, 5vw, 58px); line-height: 0.98; letter-spacing: 0; }
|
|
98
|
+
.page-heading p { max-width: 780px; margin: 0; }
|
|
99
|
+
.eyebrow { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; }
|
|
100
|
+
|
|
101
|
+
/* Pipeline strip — three stages */
|
|
102
|
+
.pipeline-strip {
|
|
103
|
+
display: grid;
|
|
104
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
105
|
+
gap: 14px;
|
|
106
|
+
margin-bottom: 22px;
|
|
107
|
+
}
|
|
108
|
+
.stage-card {
|
|
109
|
+
border: 1px solid var(--line);
|
|
110
|
+
border-radius: 8px;
|
|
111
|
+
background: rgba(17, 24, 39, 0.9);
|
|
112
|
+
padding: 18px;
|
|
113
|
+
}
|
|
114
|
+
.stage-step { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
115
|
+
.stage-card strong { display: block; margin: 8px 0 6px; font-size: 18px; }
|
|
116
|
+
.stage-card code { display: block; margin-top: 10px; color: #9ab8d8; font-size: 11px; word-break: break-all; }
|
|
117
|
+
|
|
118
|
+
.hero-grid { display: grid; grid-template-columns: 1.2fr 0.9fr 0.9fr; gap: 14px; margin-bottom: 16px; }
|
|
119
|
+
.hero-card {
|
|
120
|
+
min-height: 160px;
|
|
121
|
+
padding: 18px;
|
|
122
|
+
border: 1px solid var(--line);
|
|
123
|
+
border-radius: 8px;
|
|
124
|
+
background: rgba(17, 24, 39, 0.9);
|
|
125
|
+
}
|
|
126
|
+
.hero-card.primary { background: linear-gradient(135deg, rgba(56, 189, 248, 0.18), rgba(17, 24, 39, 0.95)); }
|
|
127
|
+
.hero-card span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
128
|
+
.hero-card strong { display: block; margin-top: 10px; font-size: 28px; line-height: 1; }
|
|
129
|
+
.hero-card p { margin: 10px 0 0; color: var(--muted); line-height: 1.5; font-size: 13px; }
|
|
130
|
+
|
|
131
|
+
.adapter-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; }
|
|
132
|
+
.card { min-height: 100px; padding: 16px; border: 1px solid var(--line); border-radius: 8px; background: rgba(17, 24, 39, 0.9); }
|
|
133
|
+
.card h3 { margin: 0 0 8px; font-size: 14px; color: var(--accent); }
|
|
134
|
+
|
|
135
|
+
.ops-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 22px; }
|
|
136
|
+
.ops-strip article { padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(13, 20, 32, 0.88); }
|
|
137
|
+
.ops-strip span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
138
|
+
.ops-strip strong { display: block; margin: 7px 0; font-size: 14px; }
|
|
139
|
+
|
|
140
|
+
/* Settings panel */
|
|
141
|
+
.settings-panel {
|
|
142
|
+
border: 1px solid var(--line);
|
|
143
|
+
border-radius: 8px;
|
|
144
|
+
background: rgba(13, 20, 32, 0.95);
|
|
145
|
+
padding: 22px;
|
|
146
|
+
margin-bottom: 22px;
|
|
147
|
+
}
|
|
148
|
+
.settings-header { margin-bottom: 18px; }
|
|
149
|
+
.settings-header h2 { margin: 0 0 8px; font-size: 20px; }
|
|
150
|
+
.settings-header p { color: var(--muted); margin: 0; }
|
|
151
|
+
.setup-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 18px; }
|
|
152
|
+
.setup-card { padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: rgba(13, 20, 32, 0.88); }
|
|
153
|
+
.setup-card span { color: var(--accent); font-size: 12px; font-weight: 800; text-transform: uppercase; }
|
|
154
|
+
.setup-card strong { display: block; margin: 7px 0; font-size: 14px; }
|
|
155
|
+
.setup-card code { color: #d7e8ff; word-break: break-word; font-size: 12px; }
|
|
156
|
+
.key-list { display: grid; gap: 8px; }
|
|
157
|
+
.key-row { padding: 12px 14px; border: 1px solid var(--line); border-radius: 8px; background: #0a101b; }
|
|
158
|
+
.key-row div { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
|
|
159
|
+
.key-row p { margin: 0; color: var(--muted); font-size: 13px; }
|
|
160
|
+
.key-badge {
|
|
161
|
+
border-radius: 999px;
|
|
162
|
+
padding: 2px 7px;
|
|
163
|
+
font-size: 11px;
|
|
164
|
+
font-weight: 700;
|
|
165
|
+
}
|
|
166
|
+
.key-badge.required { background: rgba(56, 189, 248, 0.15); color: var(--accent); border: 1px solid rgba(56, 189, 248, 0.3); }
|
|
167
|
+
.key-badge.optional { background: rgba(147, 163, 184, 0.1); color: var(--muted); border: 1px solid var(--line); }
|
|
168
|
+
.settings-note { margin: 14px 0 0; color: var(--muted); font-size: 13px; }
|
|
169
|
+
|
|
170
|
+
.quick-actions { position: fixed; right: 20px; bottom: 20px; display: grid; gap: 8px; width: 200px; }
|
|
171
|
+
.quick-actions button {
|
|
172
|
+
border: 1px solid var(--line);
|
|
173
|
+
border-radius: 8px;
|
|
174
|
+
padding: 10px 12px;
|
|
175
|
+
background: #0d1420;
|
|
176
|
+
color: var(--ink);
|
|
177
|
+
text-align: left;
|
|
178
|
+
font: inherit;
|
|
179
|
+
cursor: pointer;
|
|
180
|
+
}
|
|
181
|
+
.quick-actions button:hover { background: #172133; }
|
|
182
|
+
|
|
183
|
+
@media (max-width: 1020px) {
|
|
184
|
+
.shell { grid-template-columns: 1fr; }
|
|
185
|
+
.sidebar { position: static; height: auto; }
|
|
186
|
+
.pipeline-strip, .hero-grid, .adapter-grid, .ops-strip, .setup-grid { grid-template-columns: 1fr; }
|
|
187
|
+
.quick-actions { position: static; width: auto; margin: 20px 30px; }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
@media (max-width: 720px) {
|
|
191
|
+
.main { padding: 20px; }
|
|
192
|
+
.utility-bar { display: block; }
|
|
193
|
+
.utility-actions { margin-top: 10px; }
|
|
194
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Edit Plan — [CLIENT] / [PROJECT]
|
|
2
|
+
> Stage 3 planning artifact. Hand this to the video-use agent alongside `pipeline-brief.md`.
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Source clips
|
|
7
|
+
|
|
8
|
+
| # | File | Duration | Scene | From manifest |
|
|
9
|
+
|---|---|---|---|---|
|
|
10
|
+
| 1 | generative/scene1-hook-a.mp4 | 5s | Hook A | manifest.json #id |
|
|
11
|
+
| 2 | generative/scene2.mp4 | 8s | Problem | manifest.json #id |
|
|
12
|
+
| N | generative/sceneN.mp4 | 5s | CTA | manifest.json #id |
|
|
13
|
+
|
|
14
|
+
VIDEO_USE_HOME staging path: `${VIDEO_USE_HOME}/<project>/`
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Cut strategy
|
|
19
|
+
|
|
20
|
+
- **Target duration:** [N]s
|
|
21
|
+
- **Opening hook:** Scene 1 (Hook [A–E] selected for this cut)
|
|
22
|
+
- **Core through-line:** Problem → Solution → CTA
|
|
23
|
+
- **Pacing bias:** tight (cut every ~3s) / breathing / mixed
|
|
24
|
+
- **Word-boundary cuts:** always — never cut inside a word
|
|
25
|
+
- **30 ms audio fades** at every segment boundary
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Overlay plan
|
|
30
|
+
|
|
31
|
+
| Time | Overlay | Tool | Notes |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| 0:00 | On-screen text: "[hook text]" | Manim / PIL | From brief Scene 1 |
|
|
34
|
+
| 0:05 | Caption track starts | FFmpeg subtitle filter | Subtitles applied last |
|
|
35
|
+
| 0:25 | CTA card: "[cta text]", [phone], [url] | Manim / PIL | From brand kit |
|
|
36
|
+
|
|
37
|
+
Subtitles are applied **last** — after all overlays. `setpts=PTS-STARTPTS+T/TB` for timing.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Music direction
|
|
42
|
+
|
|
43
|
+
- **Style:** [description]
|
|
44
|
+
- **Tempo:** [BPM guidance]
|
|
45
|
+
- **Fade in/out:** [direction]
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Render target
|
|
50
|
+
|
|
51
|
+
| Format | Codec | Resolution | Aspect |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| MP4 | h264 | 1080×1920 | 9:16 |
|
|
54
|
+
| MP4 | h264 | 1080×1080 | 1:1 (if required) |
|
|
55
|
+
|
|
56
|
+
Output: `output/<client>/<project>/final/final.mp4`
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## QA pass criteria
|
|
61
|
+
|
|
62
|
+
- [ ] Duration within ±10% of target
|
|
63
|
+
- [ ] Audio fades present at every segment boundary
|
|
64
|
+
- [ ] Subtitles applied last and aligned to phrase transcript
|
|
65
|
+
- [ ] No API keys or secrets in rendered output
|
|
66
|
+
- [ ] All 12 video-use production rules pass (see video-use qa-checklist.md)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Generative Plan — [CLIENT] / [PROJECT]
|
|
2
|
+
> Stage 2 planning artifact. Fill before running `helpers/run-pipeline.sh` or BYOK execution.
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Adapter
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
CREATIVE_VIDEO_PIPELINE_GENERATIVE_ADAPTER=
|
|
10
|
+
VIDEO_MODEL_PROVIDER= (if byo-api-key)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Node bindings
|
|
16
|
+
|
|
17
|
+
| Scene | Type | Model | Prompt (from brief Appendix) | Duration | Aspect |
|
|
18
|
+
|---|---|---|---|---|---|
|
|
19
|
+
| Scene 1 (Hook A) | video | veo-3.1-generate-001 | | 5s | 9:16 |
|
|
20
|
+
| Scene 2 | video | veo-3.1-generate-001 | | 8s | 9:16 |
|
|
21
|
+
| Scene N | image | (image capability) | | — | 9:16 |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Reference images
|
|
26
|
+
|
|
27
|
+
> Bind as typed data URLs: `data:image/jpeg;base64,<base64>` per `@growthub/api-contract` ref spec.
|
|
28
|
+
> Never pass raw URLs as `refs[].dataUrl`.
|
|
29
|
+
|
|
30
|
+
| Name | Source | Purpose |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| brand_reference | brands/<client>/assets/logo.jpg | Brand anchor |
|
|
33
|
+
| scene_reference | brands/<client>/assets/reference.jpg | Visual style |
|
|
34
|
+
|
|
35
|
+
Shell command to convert a local image to a typed data URL:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python3 -c "
|
|
39
|
+
import base64, sys
|
|
40
|
+
with open(sys.argv[1], 'rb') as f:
|
|
41
|
+
b64 = base64.b64encode(f.read()).decode()
|
|
42
|
+
print(f'data:image/{sys.argv[2]};base64,{b64}')
|
|
43
|
+
" brands/<client>/assets/logo.jpg jpeg
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Pipeline payload (growthub-pipeline adapter)
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"pipelineId": "",
|
|
53
|
+
"executionMode": "hosted",
|
|
54
|
+
"nodes": [
|
|
55
|
+
{
|
|
56
|
+
"nodeId": "video-gen-1",
|
|
57
|
+
"slug": "video-generation",
|
|
58
|
+
"bindings": {
|
|
59
|
+
"videoModel": "veo-3.1-generate-001",
|
|
60
|
+
"prompt": "",
|
|
61
|
+
"seconds": 8,
|
|
62
|
+
"aspectRatio": "9:16",
|
|
63
|
+
"creativeCount": 1,
|
|
64
|
+
"refs": [
|
|
65
|
+
{ "name": "brand_reference", "dataUrl": "" }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Expected output
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
output/<client>/<project>/generative/
|
|
79
|
+
├── manifest.json
|
|
80
|
+
├── scene1-hook-a.mp4
|
|
81
|
+
├── scene2.mp4
|
|
82
|
+
└── scene-n-bg.jpg
|
|
83
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Pipeline Brief — [CLIENT NAME] / [CAMPAIGN NAME]
|
|
2
|
+
> Stage 1 output. Write this file to `output/<client-slug>/<project-slug>/brief/pipeline-brief.md`.
|
|
3
|
+
> Pull all brand values from `brands/<client-slug>/brand-kit.md`. Do not invent brand detail.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## BRAND CONSTRAINTS
|
|
8
|
+
|
|
9
|
+
> ⚠️ This ad must NEVER:
|
|
10
|
+
> - [Pull from brand-kit.md `messaging_guardrails`]
|
|
11
|
+
> - [Pull from brand-kit.md `do_not_attract`]
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## BRIEF OVERVIEW
|
|
16
|
+
|
|
17
|
+
| Field | Value |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Client | |
|
|
20
|
+
| Campaign | |
|
|
21
|
+
| Date | |
|
|
22
|
+
| Format | (UGC / AI Avatar / Explainer / Performance) |
|
|
23
|
+
| Length | (seconds) |
|
|
24
|
+
| Primary Goal | (Conversion / Awareness / Education) |
|
|
25
|
+
| Hook Variations | (default 5 — A through E) |
|
|
26
|
+
| Scene Count | |
|
|
27
|
+
| Aspect Ratios | (9:16 + 1:1 minimum) |
|
|
28
|
+
| Captions | ON |
|
|
29
|
+
| CTA Offer | |
|
|
30
|
+
| Landing Page | |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## SCENE STRUCTURE
|
|
35
|
+
|
|
36
|
+
| Scene | Name | Timecode | Beat |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| 1 | Hook | 0:00–0:05 | N hook variations A–E |
|
|
39
|
+
| 2 | Problem | 0:05–0:15 | Consistent across all hooks |
|
|
40
|
+
| 3 | Solution | 0:15–0:25 | Consistent across all hooks |
|
|
41
|
+
| N | CTA | 0:25–0:30 | Consistent across all hooks |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## SCENE 1 — HOOK (N VARIATIONS)
|
|
46
|
+
|
|
47
|
+
> All variations share the same Scene 2–N structure. Only Scene 1 differs.
|
|
48
|
+
|
|
49
|
+
### Hook A — [Type]
|
|
50
|
+
**Visual:**
|
|
51
|
+
**On-Screen Text:**
|
|
52
|
+
**VO:**
|
|
53
|
+
|
|
54
|
+
### Hook B — [Type]
|
|
55
|
+
**Visual:**
|
|
56
|
+
**On-Screen Text:**
|
|
57
|
+
**VO:**
|
|
58
|
+
|
|
59
|
+
### Hook C — [Type]
|
|
60
|
+
**Visual:**
|
|
61
|
+
**On-Screen Text:**
|
|
62
|
+
**VO:**
|
|
63
|
+
|
|
64
|
+
### Hook D — [Type]
|
|
65
|
+
**Visual:**
|
|
66
|
+
**On-Screen Text:**
|
|
67
|
+
**VO:**
|
|
68
|
+
|
|
69
|
+
### Hook E — [Type]
|
|
70
|
+
**Visual:**
|
|
71
|
+
**On-Screen Text:**
|
|
72
|
+
**VO:**
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## SCENES 2–N (CONSISTENT ACROSS ALL HOOK VARIATIONS)
|
|
77
|
+
|
|
78
|
+
### Scene 2 — [Name]
|
|
79
|
+
**Visual:**
|
|
80
|
+
**On-Screen Text:**
|
|
81
|
+
**VO:**
|
|
82
|
+
|
|
83
|
+
### Scene 3 — [Name]
|
|
84
|
+
**Visual:**
|
|
85
|
+
**On-Screen Text:**
|
|
86
|
+
**VO:**
|
|
87
|
+
|
|
88
|
+
### Scene N — CTA
|
|
89
|
+
**Visual:**
|
|
90
|
+
**On-Screen Text:**
|
|
91
|
+
**VO:** `[CTA text from brand kit]`
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## EDITING GUIDELINES
|
|
96
|
+
|
|
97
|
+
- **Pacing:** Cut every ~3s unless specified otherwise
|
|
98
|
+
- **Music:** [direction]
|
|
99
|
+
- **Captions:** ON — match VO rhythm
|
|
100
|
+
- **Color grade:** [direction]
|
|
101
|
+
- **Aspect ratios:** 9:16 primary, 1:1 secondary
|
|
102
|
+
- **NO list:** [pull from brand-kit.md messaging_guardrails]
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## APPENDIX — AI GENERATION PROMPTS (OPTIONAL)
|
|
107
|
+
|
|
108
|
+
> These prompts feed Stage 2 of the pipeline. Each prompt maps to one scene / one clip.
|
|
109
|
+
> Keep prompts in this appendix only. Never inline in scene blocks above.
|
|
110
|
+
|
|
111
|
+
### Video prompt — Scene 1 (Hook A)
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
[Scene description for video-generation CMS node]
|
|
115
|
+
Brand: [brand name], style: [style from brand kit], no text overlays,
|
|
116
|
+
[aspect ratio], [duration]s
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Video prompt — Scene 2
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
[Scene description]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Image prompt — [Scene N background / reference]
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
[Image description]
|
|
129
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
# .growthub-fork/project.md — session memory primitive (v1)
|
|
3
|
+
#
|
|
4
|
+
# Seeded by `growthub kit fork register` from this template.
|
|
5
|
+
# Replaceable tokens: {{KIT_ID}} {{FORK_ID}} {{STARTED_AT}} {{SOURCE}} {{SOURCE_REF}}
|
|
6
|
+
|
|
7
|
+
kitId: "{{KIT_ID}}"
|
|
8
|
+
forkId: "{{FORK_ID}}"
|
|
9
|
+
startedAt: "{{STARTED_AT}}"
|
|
10
|
+
source: "{{SOURCE}}"
|
|
11
|
+
sourceRef: "{{SOURCE_REF}}"
|
|
12
|
+
skillManifestVersion: 1
|
|
13
|
+
approvals: []
|
|
14
|
+
selfEvalHistory: []
|
|
15
|
+
subSkillRuns: []
|
|
16
|
+
|
|
17
|
+
# Pipeline state (update after each stage)
|
|
18
|
+
pipelineState:
|
|
19
|
+
stage1Brief:
|
|
20
|
+
status: pending # pending | in_progress | complete
|
|
21
|
+
clientSlug: ""
|
|
22
|
+
projectSlug: ""
|
|
23
|
+
briefPath: ""
|
|
24
|
+
sceneCount: 0
|
|
25
|
+
hookVariations: 0
|
|
26
|
+
completedAt: ""
|
|
27
|
+
stage2Generative:
|
|
28
|
+
status: pending # pending | in_progress | complete
|
|
29
|
+
adapter: "" # growthub-pipeline | byo-api-key
|
|
30
|
+
provider: ""
|
|
31
|
+
artifactCount: 0
|
|
32
|
+
manifestPath: ""
|
|
33
|
+
completedAt: ""
|
|
34
|
+
stage3Edit:
|
|
35
|
+
status: pending # pending | in_progress | complete
|
|
36
|
+
videoUseForkPath: ""
|
|
37
|
+
finalVideoPath: ""
|
|
38
|
+
durationTarget: ""
|
|
39
|
+
qaPass: false
|
|
40
|
+
completedAt: ""
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# Project journal — fork `{{FORK_ID}}`
|
|
44
|
+
|
|
45
|
+
Baseline primitive: `{{KIT_ID}}`. Seeded at `{{STARTED_AT}}` from `{{SOURCE}}` (`{{SOURCE_REF}}`).
|
|
46
|
+
|
|
47
|
+
## How to use this file
|
|
48
|
+
|
|
49
|
+
1. **Session start.** Read the last 3 entries below + tail 20 events in `.growthub-fork/trace.jsonl`. Update `pipelineState` to reflect actual completion.
|
|
50
|
+
2. **Stage completion.** Record a dated entry in "Session log" with: stage, client, project, key paths, self-eval outcome.
|
|
51
|
+
3. **Material change.** Append a dated bullet here AND a typed event to `trace.jsonl`.
|
|
52
|
+
4. **Self-eval boundary.** Append to `selfEvalHistory`: `attempt`, `criteria`, `outcome`, `notes`.
|
|
53
|
+
5. **Sub-skill spawn.** Append to `subSkillRuns`: `subSkill`, `startedAt`, `result`.
|
|
54
|
+
|
|
55
|
+
## Session log
|
|
56
|
+
|
|
57
|
+
<!-- Append entries below, newest at the bottom.
|
|
58
|
+
|
|
59
|
+
### YYYY-MM-DD HH:mm UTC · creative-video-pipeline-operator
|
|
60
|
+
- **Plan.** What you intend to do this session.
|
|
61
|
+
- **Stage.** Which stage (1/2/3) and what sub-task.
|
|
62
|
+
- **Changes.** What you actually did (each must correspond to a trace event).
|
|
63
|
+
- **Outcome.** Pass / fail / parked. Reference the selfEval criteria checked.
|
|
64
|
+
- **Next.** What the next session should pick up.
|
|
65
|
+
|
|
66
|
+
-->
|
|
67
|
+
|
|
68
|
+
_No sessions recorded yet. This block is populated as the fork is operated._
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Self-evaluation template — v1 primitive (Growthub, capability-agnostic)
|
|
2
|
+
|
|
3
|
+
A skill's `selfEval` contract declares **what good looks like** (`criteria[]`) and **the retry ceiling** (`maxRetries`). The agent drives the loop; this file is the pattern the agent follows at every unit of work.
|
|
4
|
+
|
|
5
|
+
The contract is defined in `@growthub/api-contract/skills::SkillSelfEval` and is **capability-agnostic** — the same primitive applies to code edits, copy drafts, CRM rules, API payloads, asset renders, audit passes, and every other domain. The "unit of work" is the smallest reversible change the skill operates on; concrete boundaries are defined in the kit's own `skills.md` operator runbook, not here.
|
|
6
|
+
|
|
7
|
+
## Loop
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
for attempt in 1..maxRetries: # default maxRetries = 3
|
|
11
|
+
generate — produce a proposal (whatever the skill produces)
|
|
12
|
+
apply — materialise the proposal against the fork
|
|
13
|
+
self-evaluate — for each criterion in skill.selfEval.criteria:
|
|
14
|
+
check → pass / fail / needs-confirmation
|
|
15
|
+
record — append to project.md (human) + trace.jsonl (machine)
|
|
16
|
+
|
|
17
|
+
if all criteria pass: break
|
|
18
|
+
if attempt == maxRetries: park with needs_confirmation note. Stop.
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## What each attempt writes
|
|
22
|
+
|
|
23
|
+
### Human row — append to `.growthub-fork/project.md` "Session log"
|
|
24
|
+
|
|
25
|
+
```md
|
|
26
|
+
### 2026-04-24 · creative-video-pipeline-operator
|
|
27
|
+
- **Plan.** What you intend to do this unit of work.
|
|
28
|
+
- **Changes.** Material change applied (must correspond to a trace event).
|
|
29
|
+
- **Self-eval.** attempt 2/3 — criterion "<one of skill.selfEval.criteria>" ✗ (<note>). Retrying.
|
|
30
|
+
- **Outcome.** retry-pending / pass / parked.
|
|
31
|
+
- **Next.** What the next attempt (or next session) should pick up.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Machine row — append to `.growthub-fork/trace.jsonl`
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"ts": "2026-04-24T00:00:00.000Z",
|
|
39
|
+
"forkId": "<fork-id>",
|
|
40
|
+
"kitId": "growthub-creative-video-pipeline-v1",
|
|
41
|
+
"type": "self_eval_recorded",
|
|
42
|
+
"summary": "attempt 2/3 failed on <criterion>",
|
|
43
|
+
"detail": {
|
|
44
|
+
"skill": "<skill-slug>",
|
|
45
|
+
"attempt": 2,
|
|
46
|
+
"maxRetries": 3,
|
|
47
|
+
"criterion": "<one of skill.selfEval.criteria>",
|
|
48
|
+
"outcome": "fail",
|
|
49
|
+
"notes": "<short explanation>"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Hard rules
|
|
55
|
+
|
|
56
|
+
1. **Never exceed `maxRetries`.** At the ceiling, park with a `needs_confirmation` note and stop.
|
|
57
|
+
2. **Record every attempt.** Even the first pass.
|
|
58
|
+
3. **Keep `project.md` and `trace.jsonl` in sync.**
|
|
59
|
+
4. **Preserve prior entries.** Append-only. Never rewrite history.
|
|
60
|
+
|
|
61
|
+
## Kit-specific self-eval units
|
|
62
|
+
|
|
63
|
+
| Stage | Unit of work |
|
|
64
|
+
|---|---|
|
|
65
|
+
| Stage 1 — Brief | Completed `pipeline-brief.md` for one creative concept |
|
|
66
|
+
| Stage 2 — Generate | `manifest.json` with one artifact URL per scene |
|
|
67
|
+
| Stage 3 — Edit | `final.mp4` exists, duration ±10% of target, QA pass |
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Validation Checklist — Creative Video Pipeline
|
|
2
|
+
|
|
3
|
+
Run before calling the kit v1-ready or before a Vercel deployment.
|
|
4
|
+
|
|
5
|
+
## Environment
|
|
6
|
+
|
|
7
|
+
- [ ] `bash setup/check-deps.sh` passes (FFmpeg, Python 3, pip, git, node)
|
|
8
|
+
- [ ] `node setup/verify-env.mjs` passes
|
|
9
|
+
- [ ] `bash helpers/check-generative-adapter.sh` shows expected adapter and keys
|
|
10
|
+
- [ ] `VIDEO_USE_HOME` resolves to an existing `video-use` clone
|
|
11
|
+
|
|
12
|
+
## Growthub CLI (growthub-pipeline adapter)
|
|
13
|
+
|
|
14
|
+
- [ ] `growthub auth whoami --json` returns authenticated user
|
|
15
|
+
- [ ] `growthub kit list --family studio` includes `growthub-creative-video-pipeline-v1`
|
|
16
|
+
- [ ] `growthub kit fork status <fork-id>` shows no unexpected drift
|
|
17
|
+
|
|
18
|
+
## Stage 1 — Brief
|
|
19
|
+
|
|
20
|
+
- [ ] Brand kit exists at `brands/<client-slug>/brand-kit.md`
|
|
21
|
+
- [ ] `pipeline-brief.md` written to `output/<client>/<project>/brief/`
|
|
22
|
+
- [ ] Brief contains: brand constraints box, scene table, hook variations A–E, editing guidelines
|
|
23
|
+
- [ ] AI generation prompts in Appendix only (not inline in scene blocks)
|
|
24
|
+
|
|
25
|
+
## Stage 2 — Generate
|
|
26
|
+
|
|
27
|
+
- [ ] `output/<client>/<project>/generative/manifest.json` exists and is valid JSON
|
|
28
|
+
- [ ] Each manifest entry has `id`, `type`, `provider`, `url`, `prompt`
|
|
29
|
+
- [ ] No API keys appear in any artifact file
|
|
30
|
+
- [ ] Artifact count matches scene count in brief
|
|
31
|
+
|
|
32
|
+
## Stage 3 — Edit
|
|
33
|
+
|
|
34
|
+
- [ ] `output/<client>/<project>/final/final.mp4` exists
|
|
35
|
+
- [ ] Duration within ±10% of target from edit plan
|
|
36
|
+
- [ ] Audio fades at segment boundaries (30 ms)
|
|
37
|
+
- [ ] Subtitles applied last
|
|
38
|
+
- [ ] No secrets in any output artifact
|
|
39
|
+
|
|
40
|
+
## Local shell
|
|
41
|
+
|
|
42
|
+
- [ ] `cd studio && npm install && npm run build` succeeds
|
|
43
|
+
- [ ] `cd apps/creative-video-pipeline && npm install && npm run build` succeeds
|
|
44
|
+
- [ ] Studio Vite shell renders pipeline stage status without errors
|
|
45
|
+
- [ ] Next.js `/settings/keys` page renders adapter config
|
|
46
|
+
|
|
47
|
+
## Governed primitives
|
|
48
|
+
|
|
49
|
+
- [ ] `.growthub-fork/project.md` has entries for all completed stages
|
|
50
|
+
- [ ] `.growthub-fork/trace.jsonl` has typed events for all material changes
|
|
51
|
+
- [ ] `growthub skills validate` passes
|
|
52
|
+
- [ ] `growthub skills list` shows this kit's SKILL.md tree
|