@growthub/cli 0.3.56 → 0.3.58
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-zernio-social-v1/QUICKSTART.md +209 -0
- package/assets/worker-kits/growthub-zernio-social-v1/brands/NEW-CLIENT.md +74 -0
- package/assets/worker-kits/growthub-zernio-social-v1/brands/_template/brand-kit.md +131 -0
- package/assets/worker-kits/growthub-zernio-social-v1/brands/growthub/brand-kit.md +141 -0
- package/assets/worker-kits/growthub-zernio-social-v1/bundles/growthub-zernio-social-v1.json +55 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/ai-caption-layer.md +132 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/local-adapters.md +123 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/platform-coverage.md +112 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/postiz-ui-shell-integration.md +166 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/posts-and-queues-layer.md +208 -0
- package/assets/worker-kits/growthub-zernio-social-v1/docs/zernio-api-integration.md +265 -0
- package/assets/worker-kits/growthub-zernio-social-v1/examples/analytics-brief-sample.md +97 -0
- package/assets/worker-kits/growthub-zernio-social-v1/examples/client-proposal-sample.md +106 -0
- package/assets/worker-kits/growthub-zernio-social-v1/examples/content-calendar-sample.md +74 -0
- package/assets/worker-kits/growthub-zernio-social-v1/examples/social-campaign-sample.md +105 -0
- package/assets/worker-kits/growthub-zernio-social-v1/growthub-meta/README.md +146 -0
- package/assets/worker-kits/growthub-zernio-social-v1/growthub-meta/kit-standard.md +120 -0
- package/assets/worker-kits/growthub-zernio-social-v1/kit.json +104 -0
- package/assets/worker-kits/growthub-zernio-social-v1/output/README.md +63 -0
- package/assets/worker-kits/growthub-zernio-social-v1/output-standards.md +132 -0
- package/assets/worker-kits/growthub-zernio-social-v1/runtime-assumptions.md +170 -0
- package/assets/worker-kits/growthub-zernio-social-v1/setup/check-deps.mjs +117 -0
- package/assets/worker-kits/growthub-zernio-social-v1/setup/check-deps.sh +86 -0
- package/assets/worker-kits/growthub-zernio-social-v1/setup/install-mcp.mjs +177 -0
- package/assets/worker-kits/growthub-zernio-social-v1/setup/setup.mjs +247 -0
- package/assets/worker-kits/growthub-zernio-social-v1/setup/verify-env.mjs +138 -0
- package/assets/worker-kits/growthub-zernio-social-v1/skills.md +332 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/analytics-brief.md +101 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/caption-copy-deck.md +105 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/client-proposal.md +98 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/content-calendar.md +70 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/platform-publishing-plan.md +86 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/scheduling-manifest.md +92 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/social-campaign-brief.md +102 -0
- package/assets/worker-kits/growthub-zernio-social-v1/validation-checklist.md +85 -0
- package/assets/worker-kits/growthub-zernio-social-v1/workers/zernio-social-operator/CLAUDE.md +307 -0
- package/package.json +1 -1
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# Zernio Social Media Operator — Master Skill Doc
|
|
2
|
+
|
|
3
|
+
**Source of truth for methodology. Read this file completely before beginning any task.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## QUICK REFERENCE TABLE
|
|
8
|
+
|
|
9
|
+
| Resource | Path |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Agent operating law | `workers/zernio-social-operator/CLAUDE.md` |
|
|
12
|
+
| Brand kit template | `brands/_template/brand-kit.md` |
|
|
13
|
+
| Growthub example brand kit | `brands/growthub/brand-kit.md` |
|
|
14
|
+
| Output contract | `output-standards.md` |
|
|
15
|
+
| Runtime assumptions | `runtime-assumptions.md` |
|
|
16
|
+
| Zernio API integration | `docs/zernio-api-integration.md` |
|
|
17
|
+
| Platform coverage | `docs/platform-coverage.md` |
|
|
18
|
+
| AI caption layer | `docs/ai-caption-layer.md` |
|
|
19
|
+
| Posts + queues layer | `docs/posts-and-queues-layer.md` |
|
|
20
|
+
| Postiz UI shell integration | `docs/postiz-ui-shell-integration.md` |
|
|
21
|
+
| Social campaign brief | `templates/social-campaign-brief.md` |
|
|
22
|
+
| Content calendar | `templates/content-calendar.md` |
|
|
23
|
+
| Platform publishing plan | `templates/platform-publishing-plan.md` |
|
|
24
|
+
| Caption copy deck | `templates/caption-copy-deck.md` |
|
|
25
|
+
| Analytics brief | `templates/analytics-brief.md` |
|
|
26
|
+
| Scheduling manifest | `templates/scheduling-manifest.md` |
|
|
27
|
+
| Client proposal | `templates/client-proposal.md` |
|
|
28
|
+
| Sample campaign | `examples/social-campaign-sample.md` |
|
|
29
|
+
| Sample calendar | `examples/content-calendar-sample.md` |
|
|
30
|
+
| Sample analytics | `examples/analytics-brief-sample.md` |
|
|
31
|
+
| Sample proposal | `examples/client-proposal-sample.md` |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## STEP 0 — BEFORE ANY TASK, ANSWER THESE QUESTIONS
|
|
36
|
+
|
|
37
|
+
Before producing anything, confirm:
|
|
38
|
+
|
|
39
|
+
1. Which client or brand is this campaign for?
|
|
40
|
+
2. Which platforms are in scope (select from `docs/platform-coverage.md`)?
|
|
41
|
+
3. What is the campaign objective: brand awareness / lead generation / engagement / product launch / community growth?
|
|
42
|
+
4. What is the campaign timeframe and posting cadence?
|
|
43
|
+
5. Is `ZERNIO_API_KEY` present and valid (`api-live` or `hybrid` mode) or is this `agent-only`?
|
|
44
|
+
6. Which `ZERNIO_PROFILE_ID` owns the target social accounts?
|
|
45
|
+
|
|
46
|
+
If any of these are unknown after the 4-question gate in CLAUDE.md, stop and ask.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## STEP 1 — LOAD THE BRAND KIT
|
|
51
|
+
|
|
52
|
+
Read `brands/<client-slug>/brand-kit.md` if it exists. Otherwise start from `brands/_template/brand-kit.md`.
|
|
53
|
+
|
|
54
|
+
Extract:
|
|
55
|
+
|
|
56
|
+
- client identity (name, slug, industry)
|
|
57
|
+
- target platforms and primary audience demographics
|
|
58
|
+
- content themes and messaging guardrails
|
|
59
|
+
- campaign objectives and KPI targets
|
|
60
|
+
- competitor accounts for reference
|
|
61
|
+
- agency context (prospect stage, retainer range)
|
|
62
|
+
- existing deliverables log
|
|
63
|
+
|
|
64
|
+
The brand kit drives all output naming, tone calibration, platform selection, and proposal pricing context.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## STEP 2 — CHECK THE WORKING SUBSTRATE
|
|
69
|
+
|
|
70
|
+
If the user has a valid `ZERNIO_API_KEY`, inspect the live account before planning anything.
|
|
71
|
+
|
|
72
|
+
### Source-of-truth checks against the Zernio API
|
|
73
|
+
|
|
74
|
+
1. `GET /api/v1/profiles` — confirm the API key authenticates and list available profiles
|
|
75
|
+
2. `GET /api/v1/profiles/<ZERNIO_PROFILE_ID>` — confirm the target profile exists
|
|
76
|
+
3. `GET /api/v1/accounts?profileId=<id>` — list connected platforms on that profile
|
|
77
|
+
4. `GET /api/v1/queues?profileId=<id>` — check for existing recurring queues and time slots
|
|
78
|
+
5. `GET /api/v1/posts?profileId=<id>&status=scheduled` — inspect currently scheduled posts to avoid collisions
|
|
79
|
+
|
|
80
|
+
All calls use header `Authorization: Bearer ${ZERNIO_API_KEY}`.
|
|
81
|
+
|
|
82
|
+
### What to verify before planning
|
|
83
|
+
|
|
84
|
+
- Which platform integrations are connected and authorized on the profile
|
|
85
|
+
- What the profile's default posting timezone is
|
|
86
|
+
- Whether any queues already exist and are actively publishing
|
|
87
|
+
- Whether the API key has `read-write` permission (required for scheduling) or only `read`
|
|
88
|
+
|
|
89
|
+
If the API cannot be reached, use the frozen assumptions in `runtime-assumptions.md` and label outputs `assumption-based` and `dryRun: true`.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## STEP 3 — COMMAND SELECTION LOGIC
|
|
94
|
+
|
|
95
|
+
Select the narrowest command that satisfies the real job.
|
|
96
|
+
|
|
97
|
+
| Command | Primary Use | Scheduling? | AI Captions? |
|
|
98
|
+
|---|---|---|---|
|
|
99
|
+
| `/zernio campaign` | Full campaign from scratch — brief + calendar + publishing plan + captions | Optional | Yes |
|
|
100
|
+
| `/zernio calendar` | Content calendar for an existing brief | No | Partial |
|
|
101
|
+
| `/zernio captions` | Caption copy deck only — batch or single platform | No | Yes |
|
|
102
|
+
| `/zernio schedule` | Scheduling manifest from an existing calendar | Yes | No |
|
|
103
|
+
| `/zernio queue` | Define or update a recurring queue (time slots) | Yes (recurring) | No |
|
|
104
|
+
| `/zernio analytics` | Analytics briefing from API data or provided metrics | No | No |
|
|
105
|
+
| `/zernio inbox` | Draft replies for DMs, comments, reviews via unified inbox | No | Yes |
|
|
106
|
+
| `/zernio proposal` | Client-ready proposal with platform mix and ROI | No | No |
|
|
107
|
+
| `/zernio platforms` | Platform coverage report for client context | No | No |
|
|
108
|
+
| `/zernio quick` | 30-second campaign snapshot for a domain or brand | No | Minimal |
|
|
109
|
+
|
|
110
|
+
Default selection rules:
|
|
111
|
+
|
|
112
|
+
- "Build a campaign" → `/zernio campaign`
|
|
113
|
+
- "Draft captions for my posts" → `/zernio captions`
|
|
114
|
+
- "Schedule my content calendar" → `/zernio schedule`
|
|
115
|
+
- "Set up a recurring posting plan" → `/zernio queue`
|
|
116
|
+
- "How did my posts perform?" → `/zernio analytics`
|
|
117
|
+
- "Reply to my DMs and comments" → `/zernio inbox`
|
|
118
|
+
- "Pitch this to the client" → `/zernio proposal`
|
|
119
|
+
- "What platforms should I be on?" → `/zernio platforms`
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## STEP 4 — PLATFORM SELECTION LOGIC
|
|
124
|
+
|
|
125
|
+
Select platforms based on: audience demographics, campaign objective, content format, and client capacity.
|
|
126
|
+
|
|
127
|
+
### Primary platform selection rules
|
|
128
|
+
|
|
129
|
+
| Objective | Recommended Primary Platforms |
|
|
130
|
+
|---|---|
|
|
131
|
+
| Brand awareness | Instagram, TikTok, YouTube |
|
|
132
|
+
| Lead generation | LinkedIn, X/Twitter, Facebook |
|
|
133
|
+
| Community growth | Reddit, Threads, Bluesky |
|
|
134
|
+
| Product launch | Instagram, TikTok, X/Twitter, YouTube |
|
|
135
|
+
| Thought leadership | LinkedIn, X/Twitter, Bluesky |
|
|
136
|
+
| Local business | Facebook, Instagram, Google Business |
|
|
137
|
+
| Direct conversation | Telegram, WhatsApp |
|
|
138
|
+
|
|
139
|
+
### Platform capacity rules
|
|
140
|
+
|
|
141
|
+
- Limit active platforms to 5 per campaign unless client explicitly has team capacity for more
|
|
142
|
+
- Always check `docs/platform-coverage.md` for per-platform format constraints before assigning content types
|
|
143
|
+
- Carousel posts: available on Instagram, LinkedIn, Pinterest, Facebook — not TikTok, X, or Bluesky
|
|
144
|
+
- Long-form video (>10 min): YouTube only — short-form elsewhere
|
|
145
|
+
- Thread format: X/Twitter, Bluesky, Threads
|
|
146
|
+
- Local-only: Google Business (tie to physical location verified inside Zernio)
|
|
147
|
+
- Messaging-only: Telegram, WhatsApp (require follower opt-in through the Zernio-connected account)
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## STEP 5 — CAPTION GENERATION LOGIC
|
|
152
|
+
|
|
153
|
+
Apply the AI caption layer for every content calendar entry.
|
|
154
|
+
|
|
155
|
+
### Caption workflow
|
|
156
|
+
|
|
157
|
+
1. Extract key message from content theme pillar
|
|
158
|
+
2. Identify platform tone profile from `docs/ai-caption-layer.md`
|
|
159
|
+
3. Draft 3 variants (A/B/C):
|
|
160
|
+
- Variant A: Direct and factual
|
|
161
|
+
- Variant B: Storytelling or narrative
|
|
162
|
+
- Variant C: Question or engagement-hook opening
|
|
163
|
+
4. Apply platform character limits (full table in `docs/platform-coverage.md`):
|
|
164
|
+
- X/Twitter: 280 characters (aim for ≤240 for re-share space)
|
|
165
|
+
- LinkedIn: 3,000 characters (optimal engagement at 150–300 for opening)
|
|
166
|
+
- Instagram: 2,200 characters (optimal: ≤150 above "more" fold)
|
|
167
|
+
- TikTok: 2,200 characters (engagement hook in first 150)
|
|
168
|
+
- Pinterest: 500 character description
|
|
169
|
+
- Reddit: Variable by subreddit — default to long-form
|
|
170
|
+
- Bluesky: 300 characters
|
|
171
|
+
- Threads: 500 characters
|
|
172
|
+
- Google Business: 1,500 characters
|
|
173
|
+
- Telegram: 4,096 characters
|
|
174
|
+
- WhatsApp: 1,024 characters
|
|
175
|
+
5. Add hashtag sets (platform-appropriate quantity):
|
|
176
|
+
- Instagram: 3–5 primary hashtags
|
|
177
|
+
- LinkedIn: 3–5 relevant professional hashtags
|
|
178
|
+
- TikTok: 3–6 mixing trending and niche
|
|
179
|
+
- Pinterest: 2–3 keyword-focused
|
|
180
|
+
- X/Twitter: 1–2 maximum
|
|
181
|
+
- Bluesky / Threads: none required (use in context only)
|
|
182
|
+
- Google Business / Telegram / WhatsApp: none — discouraged by platform
|
|
183
|
+
6. Flag any captions that require visual assets with specific format requirements
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## STEP 6 — CONTENT CALENDAR STRUCTURE
|
|
188
|
+
|
|
189
|
+
The content calendar template produces one row per scheduled post.
|
|
190
|
+
|
|
191
|
+
### Required columns
|
|
192
|
+
|
|
193
|
+
| Column | Content | Rules |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| Date | YYYY-MM-DD | Must fall within campaign window |
|
|
196
|
+
| Day | Weekday name | Include for readability |
|
|
197
|
+
| Platform | Zernio platform slug (from coverage doc) | Must be in approved platform list |
|
|
198
|
+
| Account | Zernio account id or handle | Must match an account under the active profile |
|
|
199
|
+
| Content Theme | Theme pillar name | Must be one of 3–5 defined pillars |
|
|
200
|
+
| Post Type | image / video / carousel / text / reel / short / story | Must be valid for that platform |
|
|
201
|
+
| Caption Preview | First 100 characters of selected variant | Do not paste full caption |
|
|
202
|
+
| CTA | Call-to-action phrase | Required — never "N/A" |
|
|
203
|
+
| Media Notes | Asset requirements, dimensions, duration | Required for image/video/carousel |
|
|
204
|
+
| Status | draft / approved / scheduled / published | Default: draft |
|
|
205
|
+
|
|
206
|
+
### Cadence rules
|
|
207
|
+
|
|
208
|
+
- Minimum 3 posts per week per platform for meaningful growth signal
|
|
209
|
+
- Maximum 3 posts per day per platform to avoid feed fatigue
|
|
210
|
+
- Space multi-platform posts by at least 30 minutes to avoid simultaneous publishing optics
|
|
211
|
+
- Reserve weekends for engagement/community posts rather than promotional content unless client specifies otherwise
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## STEP 7 — SCHEDULING MANIFEST FORMAT
|
|
216
|
+
|
|
217
|
+
See `docs/posts-and-queues-layer.md` for full format specification. Every manifest is shaped to be a valid body for one or many `POST https://zernio.com/api/v1/posts` calls (one Zernio post per manifest entry; each post fans out to one or more platform+account tuples).
|
|
218
|
+
|
|
219
|
+
Quick format reference:
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{
|
|
223
|
+
"zernioSchedulingManifest": {
|
|
224
|
+
"version": "1.0",
|
|
225
|
+
"profileId": "<ZERNIO_PROFILE_ID>",
|
|
226
|
+
"timezone": "America/New_York",
|
|
227
|
+
"dryRun": false,
|
|
228
|
+
"generatedAt": "<ISO-8601-timestamp>",
|
|
229
|
+
"posts": [
|
|
230
|
+
{
|
|
231
|
+
"clientPostId": "<client-slug>-<YYYYMMDD>-<sequence>",
|
|
232
|
+
"content": "<selected-caption-variant>",
|
|
233
|
+
"scheduledFor": "<ISO-8601-timestamp>",
|
|
234
|
+
"timezone": "America/New_York",
|
|
235
|
+
"media": [{ "mediaId": "<zernio-media-id>" }],
|
|
236
|
+
"platforms": [
|
|
237
|
+
{ "platform": "twitter", "accountId": "<zernio-account-id>" },
|
|
238
|
+
{ "platform": "linkedin", "accountId": "<zernio-account-id>" }
|
|
239
|
+
],
|
|
240
|
+
"status": "pending"
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
In `agent-only` mode, set `dryRun: true` and use placeholder `accountId` values tagged with the account handle for the user to resolve later.
|
|
248
|
+
|
|
249
|
+
Every `POST /api/v1/posts` request must carry an `Idempotency-Key` header set to the entry's `clientPostId`. This makes re-submitting the manifest safe after partial failures.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## STEP 8 — RECURRING QUEUE FORMAT
|
|
254
|
+
|
|
255
|
+
Zernio also supports recurring posting queues — time slots on a profile that auto-schedule added posts. Use `/zernio queue` to manage them.
|
|
256
|
+
|
|
257
|
+
Minimum queue definition the operator must produce (see `docs/posts-and-queues-layer.md` for full format):
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"zernioQueue": {
|
|
262
|
+
"profileId": "<ZERNIO_PROFILE_ID>",
|
|
263
|
+
"name": "<queue-name>",
|
|
264
|
+
"timezone": "America/New_York",
|
|
265
|
+
"slots": [
|
|
266
|
+
{ "day": "mon", "time": "09:00", "platforms": ["twitter", "linkedin"] },
|
|
267
|
+
{ "day": "wed", "time": "12:30", "platforms": ["instagram"] },
|
|
268
|
+
{ "day": "fri", "time": "17:00", "platforms": ["bluesky", "threads"] }
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Queues target `POST /api/v1/queues` (create) or `PUT /api/v1/queues/<queueId>` (update). Posts attached to a queue are scheduled into the next available slot — `scheduledFor` is omitted from the post body.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## STEP 9 — ANALYTICS BRIEFING LOGIC
|
|
279
|
+
|
|
280
|
+
When analytics data is provided (from `GET /api/v1/analytics` or client-provided metrics):
|
|
281
|
+
|
|
282
|
+
### Required metrics to collect per platform
|
|
283
|
+
|
|
284
|
+
| Metric | Source | Notes |
|
|
285
|
+
|---|---|---|
|
|
286
|
+
| Impressions | Zernio analytics or platform export | Total times content was displayed |
|
|
287
|
+
| Reach | Platform native via Zernio pass-through | Unique accounts that saw the content |
|
|
288
|
+
| Engagement rate | Calculated: (likes + comments + shares) / impressions × 100 | Platform-normalized |
|
|
289
|
+
| Follower growth | Platform native via Zernio | Net new followers during period |
|
|
290
|
+
| Link clicks | Zernio UTM tracking or platform bio links | Only for platforms with link support |
|
|
291
|
+
| Top posts | By engagement rate, not raw likes | Surface the 3 best-performing posts |
|
|
292
|
+
| Inbox activity | `GET /api/v1/inbox` | Open conversations, response rate |
|
|
293
|
+
|
|
294
|
+
### Analytics briefing structure
|
|
295
|
+
|
|
296
|
+
1. Period summary (date range, total posts published, platforms)
|
|
297
|
+
2. Per-platform performance table (all collected metrics)
|
|
298
|
+
3. Top 3 performing posts (with engagement rate, format, theme pillar)
|
|
299
|
+
4. Bottom 3 performing posts (with failure mode hypothesis)
|
|
300
|
+
5. Recommendations (3–5 actionable items for next period)
|
|
301
|
+
6. Benchmark comparison (if industry benchmarks are available from brand kit)
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## STEP 10 — OUTPUT ORDER
|
|
306
|
+
|
|
307
|
+
Produce artifacts in this strict order:
|
|
308
|
+
|
|
309
|
+
1. Social Campaign Brief (`templates/social-campaign-brief.md`)
|
|
310
|
+
2. Content Calendar (`templates/content-calendar.md`)
|
|
311
|
+
3. Platform Publishing Plan (`templates/platform-publishing-plan.md`)
|
|
312
|
+
4. Caption Copy Deck (`templates/caption-copy-deck.md`)
|
|
313
|
+
5. Scheduling Manifest (`templates/scheduling-manifest.md`) — only if scheduling requested
|
|
314
|
+
6. Analytics Brief (`templates/analytics-brief.md`) — only if analytics data available
|
|
315
|
+
7. Client Proposal (`templates/client-proposal.md`) — only if requested
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## QUALITY BAR
|
|
320
|
+
|
|
321
|
+
Good output looks like this:
|
|
322
|
+
|
|
323
|
+
- All platform IDs match the official list in `docs/platform-coverage.md` — no invented platform slugs
|
|
324
|
+
- All caption variants respect the character limits for their target platform
|
|
325
|
+
- Content calendar rows contain no empty CTAs — every post must have an explicit call to action
|
|
326
|
+
- Scheduling manifest timestamps are in ISO 8601 format with timezone, and fall within the campaign window
|
|
327
|
+
- Every platform referenced in the manifest is backed by a real Zernio account id (or a clearly-placeholdered handle in `dryRun: true` mode)
|
|
328
|
+
- Analytics briefings derive all metrics from provided data — no invented engagement rates
|
|
329
|
+
- Client proposals ground ROI projections in documented platform benchmark data
|
|
330
|
+
- Every output file can be handed to an operator or client and acted on immediately
|
|
331
|
+
- No filler paragraphs — every sentence either presents data, explains a constraint, or specifies an action
|
|
332
|
+
- No secrets in outputs: `ZERNIO_API_KEY`, `ANTHROPIC_API_KEY`, or OAuth tokens are never rendered into deliverables
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Analytics Brief — [Client Name] · [Project Name]
|
|
2
|
+
|
|
3
|
+
**Kit:** `growthub-zernio-social-v1`
|
|
4
|
+
**Generated:** [YYYY-MM-DD]
|
|
5
|
+
**Mode:** [api-live | agent-only | hybrid]
|
|
6
|
+
**Version:** `v1`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Period Summary
|
|
11
|
+
|
|
12
|
+
| Field | Value |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Period | [YYYY-MM-DD] → [YYYY-MM-DD] |
|
|
15
|
+
| Total posts published | [N] |
|
|
16
|
+
| Platforms in scope | [comma-separated Zernio slugs] |
|
|
17
|
+
| Data source | [Zernio `GET /api/v1/analytics` | client-provided CSV | hybrid] |
|
|
18
|
+
| Zernio profile id | [prof_... or `placeholder`] |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Per-Platform Performance
|
|
23
|
+
|
|
24
|
+
| Platform | Posts | Impressions | Reach | Engagement rate | Follower growth | Link clicks |
|
|
25
|
+
|---|---|---|---|---|---|---|
|
|
26
|
+
| `instagram` | [N] | [N] | [N] | [N%] | [+N] | [N] |
|
|
27
|
+
| `linkedin` | [N] | [N] | [N] | [N%] | [+N] | [N] |
|
|
28
|
+
| `twitter` | [N] | [N] | [N] | [N%] | [+N] | [N] |
|
|
29
|
+
|
|
30
|
+
Engagement rate = (likes + comments + shares) / impressions × 100. Platform-normalized.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Top 3 Posts
|
|
35
|
+
|
|
36
|
+
| clientPostId | Platform | Date | Engagement rate | Why it worked |
|
|
37
|
+
|---|---|---|---|---|
|
|
38
|
+
| [id] | `instagram` | YYYY-MM-DD | [N%] | [one-sentence hypothesis] |
|
|
39
|
+
| [id] | `linkedin` | YYYY-MM-DD | [N%] | [hypothesis] |
|
|
40
|
+
| [id] | `twitter` | YYYY-MM-DD | [N%] | [hypothesis] |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Bottom 3 Posts
|
|
45
|
+
|
|
46
|
+
| clientPostId | Platform | Date | Engagement rate | Hypothesis |
|
|
47
|
+
|---|---|---|---|---|
|
|
48
|
+
| [id] | `tiktok` | YYYY-MM-DD | [N%] | [hypothesis] |
|
|
49
|
+
| [id] | `pinterest` | YYYY-MM-DD | [N%] | [hypothesis] |
|
|
50
|
+
| [id] | `threads` | YYYY-MM-DD | [N%] | [hypothesis] |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Inbox Activity (optional)
|
|
55
|
+
|
|
56
|
+
If `/zernio inbox` was pulled:
|
|
57
|
+
|
|
58
|
+
| Metric | Value |
|
|
59
|
+
|---|---|
|
|
60
|
+
| Open conversations (period start) | [N] |
|
|
61
|
+
| Open conversations (period end) | [N] |
|
|
62
|
+
| Avg first-response time | [minutes] |
|
|
63
|
+
| Replies sent | [N] |
|
|
64
|
+
| Unresolved threads > 48h | [N] |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Recommendations
|
|
69
|
+
|
|
70
|
+
3–5 specific, actionable items. Each must name platform, format, posting time, and expected impact.
|
|
71
|
+
|
|
72
|
+
1. [Recommendation]
|
|
73
|
+
2. [Recommendation]
|
|
74
|
+
3. [Recommendation]
|
|
75
|
+
4. [Recommendation]
|
|
76
|
+
5. [Recommendation]
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Benchmark Comparison (optional)
|
|
81
|
+
|
|
82
|
+
If industry benchmarks are provided in the brand kit:
|
|
83
|
+
|
|
84
|
+
| Platform | Our engagement rate | Benchmark | Delta |
|
|
85
|
+
|---|---|---|---|
|
|
86
|
+
| `instagram` | [N%] | [N%] | [+/- N pts] |
|
|
87
|
+
| `linkedin` | [N%] | [N%] | [+/- N pts] |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Source Queries
|
|
92
|
+
|
|
93
|
+
For reproducibility, log the Zernio queries that produced this brief:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
GET /api/v1/analytics/posts?profileId=<id>&from=<date>&to=<date>
|
|
97
|
+
GET /api/v1/analytics/accounts?profileId=<id>&from=<date>&to=<date>
|
|
98
|
+
GET /api/v1/inbox?profileId=<id>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Never render raw response payloads in this file — summarize only.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Caption Copy Deck — [Client Name] · [Project Name]
|
|
2
|
+
|
|
3
|
+
**Kit:** `growthub-zernio-social-v1`
|
|
4
|
+
**Generated:** [YYYY-MM-DD]
|
|
5
|
+
**Mode:** [api-live | agent-only | hybrid]
|
|
6
|
+
**Version:** `v1`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
One entry per scheduled post. Each entry carries exactly three variants (A direct, B narrative, C question). The operator selects one variant per post for the scheduling manifest; all three variants remain in this deck for client review.
|
|
13
|
+
|
|
14
|
+
Every variant must:
|
|
15
|
+
|
|
16
|
+
- Respect the platform's hard character limit (`docs/platform-coverage.md`)
|
|
17
|
+
- Match the brand voice guardrails (from the brand kit)
|
|
18
|
+
- Carry an explicit CTA
|
|
19
|
+
- Reference a real or clearly-placeholdered media asset when the post is image/video/carousel/reel/short/story
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Post Entry Template
|
|
24
|
+
|
|
25
|
+
### Post: [clientPostId — e.g., urban-cycle-20260501-001]
|
|
26
|
+
|
|
27
|
+
| Field | Value |
|
|
28
|
+
|---|---|
|
|
29
|
+
| clientPostId | `urban-cycle-20260501-001` |
|
|
30
|
+
| Date | [YYYY-MM-DD] |
|
|
31
|
+
| Platform | `instagram` |
|
|
32
|
+
| Account | [@handle or accountId] |
|
|
33
|
+
| Theme pillar | [Pillar name] |
|
|
34
|
+
| Post type | [image / video / carousel / text / reel / short / story] |
|
|
35
|
+
| Media | [mediaId or placeholder, with asset path reference] |
|
|
36
|
+
| CTA | [selected CTA] |
|
|
37
|
+
|
|
38
|
+
**Variant A — Direct**
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
[Direct-hook opening line. Declarative. Leads with benefit or fact.]
|
|
42
|
+
|
|
43
|
+
[Body — 1–2 sentences of supporting detail.]
|
|
44
|
+
|
|
45
|
+
[CTA] · [1–2 hashtags if platform allows]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Character count: [N]
|
|
49
|
+
|
|
50
|
+
**Variant B — Narrative**
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
[Story-beat opening. Anecdote or "we used to..." / "last week..."]
|
|
54
|
+
|
|
55
|
+
[Body — 1–2 sentences, keep the narrative voice.]
|
|
56
|
+
|
|
57
|
+
[CTA] · [hashtags if applicable]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Character count: [N]
|
|
61
|
+
|
|
62
|
+
**Variant C — Question / Hook**
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
[Question or provocation as opener.]
|
|
66
|
+
|
|
67
|
+
[Body — short answer or frame.]
|
|
68
|
+
|
|
69
|
+
[CTA] · [hashtags if applicable]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Character count: [N]
|
|
73
|
+
|
|
74
|
+
**Selection:** Variant [A/B/C] — [One-line reason for selection]
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Post: [next clientPostId]
|
|
79
|
+
|
|
80
|
+
[Repeat the block above for every entry in the Content Calendar.]
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Hashtag Reference
|
|
85
|
+
|
|
86
|
+
| Platform | Count rule | Notes |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| `instagram` | 3–5 | Mix branded + niche |
|
|
89
|
+
| `linkedin` | 3–5 | Professional only |
|
|
90
|
+
| `tiktok` | 3–6 | Trending + niche |
|
|
91
|
+
| `twitter` | 1–2 | One branded max |
|
|
92
|
+
| `bluesky` | 0 | No hashtags |
|
|
93
|
+
| `threads` | 0–1 | Sparse |
|
|
94
|
+
|
|
95
|
+
Full hashtag rules: `docs/ai-caption-layer.md`.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Quality Checks
|
|
100
|
+
|
|
101
|
+
- [ ] All three variants per post are meaningfully different (not minor word swaps)
|
|
102
|
+
- [ ] Every variant ≤ the platform hard limit
|
|
103
|
+
- [ ] Every variant contains the selected CTA
|
|
104
|
+
- [ ] No `[INSERT CAPTION HERE]` style fragments remain
|
|
105
|
+
- [ ] No secrets, API keys, or internal references leaked into copy
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Client Proposal — [Client Name] · [Campaign Name]
|
|
2
|
+
|
|
3
|
+
**Kit:** `growthub-zernio-social-v1`
|
|
4
|
+
**Generated:** [YYYY-MM-DD]
|
|
5
|
+
**Mode:** [api-live | agent-only | hybrid]
|
|
6
|
+
**Version:** `v1`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Campaign Overview
|
|
11
|
+
|
|
12
|
+
| Field | Value |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Client | [Client Name] |
|
|
15
|
+
| Campaign | [Campaign Name] |
|
|
16
|
+
| Window | [YYYY-MM-DD] → [YYYY-MM-DD] |
|
|
17
|
+
| Primary objective | [brand awareness | lead generation | engagement | product launch | community growth] |
|
|
18
|
+
| Platforms in scope | [comma-separated Zernio slugs] |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Platform Mix Rationale
|
|
23
|
+
|
|
24
|
+
| Platform | Role in this campaign | Why selected |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| `instagram` | [Primary visual channel] | [Audience fit + content format fit] |
|
|
27
|
+
| `linkedin` | [B2B thought leadership] | [Rationale] |
|
|
28
|
+
| `twitter` | [Real-time voice + community] | [Rationale] |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Content Strategy
|
|
33
|
+
|
|
34
|
+
- Theme pillars: [list]
|
|
35
|
+
- Format mix: [Per platform]
|
|
36
|
+
- Cadence: [Summary table reference to Platform Publishing Plan]
|
|
37
|
+
- Caption approach: A/B/C variants per post — see Caption Copy Deck
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Deliverables Scope
|
|
42
|
+
|
|
43
|
+
| Deliverable | Included | Notes |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Social Campaign Brief | Yes | One per campaign |
|
|
46
|
+
| Content Calendar | Yes | 30 / 60 / 90 day |
|
|
47
|
+
| Platform Publishing Plan | Yes | One per campaign |
|
|
48
|
+
| Caption Copy Deck | Yes | A/B/C variants for every scheduled post |
|
|
49
|
+
| Scheduling Manifest | Yes | Zernio-shaped JSON + submission to `POST /api/v1/posts` |
|
|
50
|
+
| Recurring Queue | Optional | Only when campaign uses evergreen slots |
|
|
51
|
+
| Analytics Brief | Monthly | Pulled from Zernio API |
|
|
52
|
+
| Inbox reply coverage | Optional | DMs + comments + reviews via unified inbox |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Pricing Tiers
|
|
57
|
+
|
|
58
|
+
| Tier | Scope | Monthly |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Starter | 2 platforms, 3 posts/week, monthly analytics | $[X] |
|
|
61
|
+
| Growth | 4 platforms, daily posts, biweekly analytics, inbox coverage | $[X] |
|
|
62
|
+
| Scale | 6+ platforms, daily posts with queues, weekly analytics, priority inbox | $[X] |
|
|
63
|
+
|
|
64
|
+
All tiers include the full deliverable set scoped to the platform count.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## ROI Projection
|
|
69
|
+
|
|
70
|
+
Ground every number in documented platform benchmarks (see brand kit and `docs/platform-coverage.md`). Never invent metrics.
|
|
71
|
+
|
|
72
|
+
| KPI | Tier 1 target | Tier 2 target | Tier 3 target |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| Impressions / month | [N] | [N] | [N] |
|
|
75
|
+
| Engagement rate | [N%] | [N%] | [N%] |
|
|
76
|
+
| Follower growth | [+N] | [+N] | [+N] |
|
|
77
|
+
| Link clicks | [N] | [N] | [N] |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Onboarding Plan
|
|
82
|
+
|
|
83
|
+
1. Connect target social accounts inside Zernio (`/api/v1/connect/<platform>`)
|
|
84
|
+
2. Confirm `ZERNIO_PROFILE_ID` and scope of the API key
|
|
85
|
+
3. Review Content Theme Pillars in the Social Campaign Brief
|
|
86
|
+
4. Approve the Platform Publishing Plan and cadence
|
|
87
|
+
5. Approve the Caption Copy Deck (A/B/C variants)
|
|
88
|
+
6. Submit the Scheduling Manifest to Zernio with `Idempotency-Key` per post
|
|
89
|
+
7. Cadence review at week 4 alongside the first Analytics Brief
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Terms
|
|
94
|
+
|
|
95
|
+
- Ownership of all content stays with the client
|
|
96
|
+
- API key and account credentials stay inside the client's Zernio account
|
|
97
|
+
- The operator never stores raw Zernio API keys or OAuth tokens
|
|
98
|
+
- Cancellation: [standard terms from retainer agreement]
|