@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,70 @@
|
|
|
1
|
+
# Content Calendar — [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
|
+
## Calendar Header
|
|
11
|
+
|
|
12
|
+
| Field | Value |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Client | [Client Name] |
|
|
15
|
+
| Zernio profile id | [prof_... or placeholder] |
|
|
16
|
+
| Campaign window | [YYYY-MM-DD] → [YYYY-MM-DD] |
|
|
17
|
+
| Platforms | [comma-separated Zernio platform slugs] |
|
|
18
|
+
| Posting timezone | [IANA tz] |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Calendar Table
|
|
23
|
+
|
|
24
|
+
Column contract (one row per scheduled post):
|
|
25
|
+
|
|
26
|
+
| Date | Day | Platform | Account | Theme | Post Type | Caption Preview | CTA | Media Notes | Status |
|
|
27
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
28
|
+
| YYYY-MM-DD | Mon | `instagram` | [@handle or accountId] | [Pillar] | image | [first 100 chars of variant A] | [CTA] | [dims, duration, overlays] | draft |
|
|
29
|
+
| YYYY-MM-DD | Mon | `twitter` | [@handle or accountId] | [Pillar] | text | [first 100 chars] | [CTA] | — | draft |
|
|
30
|
+
| YYYY-MM-DD | Tue | `linkedin` | [page id or accountId] | [Pillar] | carousel | [first 100 chars] | [CTA] | [slide count + order] | draft |
|
|
31
|
+
| ... | | | | | | | | | |
|
|
32
|
+
|
|
33
|
+
### Rules
|
|
34
|
+
|
|
35
|
+
- One row per scheduled post
|
|
36
|
+
- `Platform` values must exist in `docs/platform-coverage.md`
|
|
37
|
+
- `Post Type` must be valid for the platform
|
|
38
|
+
- `Caption Preview` is the first 100 characters of the selected variant — full captions live in the Caption Copy Deck
|
|
39
|
+
- `CTA` is required and non-empty
|
|
40
|
+
- `Media Notes` are required for image/video/carousel/reel/short/story
|
|
41
|
+
- `Status` defaults to `draft` and moves to `scheduled` once the manifest is submitted
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Posting Cadence Summary
|
|
46
|
+
|
|
47
|
+
| Platform | Posts / week | Best time window | Notes |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| `instagram` | [3] | [12:00–13:00 local] | [rationale] |
|
|
50
|
+
| `linkedin` | [3] | [08:00–09:30 local] | [rationale] |
|
|
51
|
+
| `twitter` | [7] | [spread: 08:00, 12:00, 17:00] | [rationale] |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Theme Pillar Distribution
|
|
56
|
+
|
|
57
|
+
| Pillar | Count | % of calendar |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| [Pillar 1] | [N] | [40%] |
|
|
60
|
+
| [Pillar 2] | [N] | [30%] |
|
|
61
|
+
| [Pillar 3] | [N] | [20%] |
|
|
62
|
+
| [Pillar 4] | [N] | [10%] |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Notes
|
|
67
|
+
|
|
68
|
+
- Cadence must match the Platform Publishing Plan
|
|
69
|
+
- Multi-platform posts spaced ≥30 minutes apart to avoid simultaneous-publishing optics
|
|
70
|
+
- Weekend slots default to community / engagement pillars unless client overrides
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Platform Publishing Plan — [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
|
+
## Per-Platform Rows
|
|
11
|
+
|
|
12
|
+
Produce one row per platform in scope. Every field is required.
|
|
13
|
+
|
|
14
|
+
### [Platform — e.g., Instagram]
|
|
15
|
+
|
|
16
|
+
| Field | Value |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Zernio platform id | `instagram` |
|
|
19
|
+
| Zernio account id | [acc_ig_... or `placeholder_@handle` in agent-only] |
|
|
20
|
+
| Format mix | [e.g., 40% reels, 30% carousel, 20% single image, 10% story] |
|
|
21
|
+
| Posting frequency | [e.g., 3/week + daily stories] |
|
|
22
|
+
| Best posting times (local) | [e.g., Tue 12:00, Thu 12:00, Sat 10:30] |
|
|
23
|
+
| Primary theme pillars | [pillar names] |
|
|
24
|
+
| Caption length target | [e.g., 125–150 chars above the fold] |
|
|
25
|
+
| Hashtag count | [e.g., 3–5 primary] |
|
|
26
|
+
| Content mix rationale | [One paragraph: why this mix fits the audience and objective] |
|
|
27
|
+
|
|
28
|
+
### [Platform — e.g., LinkedIn]
|
|
29
|
+
|
|
30
|
+
| Field | Value |
|
|
31
|
+
|---|---|
|
|
32
|
+
| Zernio platform id | `linkedin` |
|
|
33
|
+
| Zernio account id | [page id or accountId] |
|
|
34
|
+
| Format mix | [e.g., 50% text+image, 30% document carousel, 20% video] |
|
|
35
|
+
| Posting frequency | [e.g., 3/week] |
|
|
36
|
+
| Best posting times (local) | [e.g., Tue 08:30, Wed 08:30, Thu 08:30] |
|
|
37
|
+
| Primary theme pillars | [pillar names] |
|
|
38
|
+
| Caption length target | [e.g., 1,200–2,000 chars for thought leadership] |
|
|
39
|
+
| Hashtag count | [e.g., 3–5 professional] |
|
|
40
|
+
| Content mix rationale | [One paragraph] |
|
|
41
|
+
|
|
42
|
+
### [Platform — e.g., X/Twitter]
|
|
43
|
+
|
|
44
|
+
| Field | Value |
|
|
45
|
+
|---|---|
|
|
46
|
+
| Zernio platform id | `twitter` |
|
|
47
|
+
| Zernio account id | [acc_x_...] |
|
|
48
|
+
| Format mix | [e.g., 60% text, 25% image, 15% thread] |
|
|
49
|
+
| Posting frequency | [e.g., 7/week] |
|
|
50
|
+
| Best posting times (local) | [e.g., 08:00, 12:00, 17:00] |
|
|
51
|
+
| Primary theme pillars | [pillar names] |
|
|
52
|
+
| Caption length target | [e.g., 200–240 chars] |
|
|
53
|
+
| Hashtag count | [1–2] |
|
|
54
|
+
| Content mix rationale | [One paragraph] |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Cross-Platform Orchestration
|
|
59
|
+
|
|
60
|
+
| Rule | Value |
|
|
61
|
+
|---|---|
|
|
62
|
+
| Minimum gap between simultaneous posts | 30 minutes |
|
|
63
|
+
| Collision check | Run against `GET /api/v1/posts?status=scheduled` before submission |
|
|
64
|
+
| Queue in use | [queue name or `none`] |
|
|
65
|
+
| Default timezone | [IANA tz] |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Queue Coverage (if applicable)
|
|
70
|
+
|
|
71
|
+
| Queue name | Platforms covered | Slots per week |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| [weekly-evergreen] | [twitter, linkedin] | [3] |
|
|
74
|
+
| [daily-visual] | [instagram] | [5] |
|
|
75
|
+
|
|
76
|
+
If queues are used, posts scheduled into a queue omit `scheduledFor` from the Zernio body and include `queueId` — see `docs/posts-and-queues-layer.md`.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Go-Live Checklist
|
|
81
|
+
|
|
82
|
+
- [ ] Every platform in this plan is connected on the Zernio profile
|
|
83
|
+
- [ ] Every `accountId` is a real Zernio id (live mode) or a documented placeholder (agent-only)
|
|
84
|
+
- [ ] Posting windows cross-checked against existing scheduled posts
|
|
85
|
+
- [ ] Hashtag and caption rules match `docs/ai-caption-layer.md`
|
|
86
|
+
- [ ] Client approved the plan before any write requests are issued
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Scheduling Manifest — [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
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
This file documents the Zernio-shaped scheduling manifest for this campaign. The machine-readable companion is `scheduling-manifest.json` in the same folder — the operator writes that file alongside this Markdown record.
|
|
13
|
+
|
|
14
|
+
Manifest shape is fully specified in `docs/posts-and-queues-layer.md`. Every post entry is a valid `POST /api/v1/posts` body (minus the two bookkeeping fields `clientPostId` and `status`).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Manifest Header
|
|
19
|
+
|
|
20
|
+
| Field | Value |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `version` | `1.0` |
|
|
23
|
+
| `profileId` | [prof_... or `placeholder`] |
|
|
24
|
+
| `timezone` | [IANA tz, e.g., `America/New_York`] |
|
|
25
|
+
| `dryRun` | [true in agent-only mode, false otherwise] |
|
|
26
|
+
| `generatedAt` | [ISO 8601 with tz offset] |
|
|
27
|
+
| Post count | [N entries] |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Post Entries (reference table)
|
|
32
|
+
|
|
33
|
+
| clientPostId | scheduledFor | platforms (count) | media (count) | status |
|
|
34
|
+
|---|---|---|---|---|
|
|
35
|
+
| `urban-cycle-20260501-001` | 2026-05-01T09:00:00-04:00 | 2 | 1 | pending |
|
|
36
|
+
| `urban-cycle-20260501-002` | 2026-05-01T12:30:00-04:00 | 1 | 0 | pending |
|
|
37
|
+
|
|
38
|
+
Full JSON lives in `scheduling-manifest.json` beside this file.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Reference JSON Block
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"zernioSchedulingManifest": {
|
|
47
|
+
"version": "1.0",
|
|
48
|
+
"profileId": "prof_abc123",
|
|
49
|
+
"timezone": "America/New_York",
|
|
50
|
+
"dryRun": false,
|
|
51
|
+
"generatedAt": "2026-04-15T14:30:00-04:00",
|
|
52
|
+
"posts": [
|
|
53
|
+
{
|
|
54
|
+
"clientPostId": "urban-cycle-20260501-001",
|
|
55
|
+
"content": "Launch day — shipping our spring gravel lineup. Ride it today →",
|
|
56
|
+
"scheduledFor": "2026-05-01T09:00:00-04:00",
|
|
57
|
+
"timezone": "America/New_York",
|
|
58
|
+
"media": [{ "mediaId": "med_HERO_01" }],
|
|
59
|
+
"platforms": [
|
|
60
|
+
{ "platform": "instagram", "accountId": "acc_ig_UrbanCycle" },
|
|
61
|
+
{ "platform": "twitter", "accountId": "acc_x_UrbanCycle" }
|
|
62
|
+
],
|
|
63
|
+
"status": "pending"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Submission Sequence
|
|
73
|
+
|
|
74
|
+
1. Upload every referenced media asset via `POST /api/v1/media`, capturing each returned `mediaId`
|
|
75
|
+
2. Replace placeholder media IDs in `scheduling-manifest.json`
|
|
76
|
+
3. Iterate `posts[]`, issuing one `POST /api/v1/posts` per entry with `Idempotency-Key: <clientPostId>`
|
|
77
|
+
4. Update each entry's `status` from `pending` to `scheduled` on 2xx, or `failed` on non-2xx with the Zernio `requestId`
|
|
78
|
+
5. If the campaign uses a recurring queue, submit `POST /api/v1/queues` first so its id can be referenced by queued post entries
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Validation Before Submit
|
|
83
|
+
|
|
84
|
+
- [ ] Every post in the manifest also exists in the Content Calendar
|
|
85
|
+
- [ ] Every caption is the selected variant from the Caption Copy Deck
|
|
86
|
+
- [ ] Every platform exists in `docs/platform-coverage.md`
|
|
87
|
+
- [ ] Every `scheduledFor` is ISO 8601 with timezone offset
|
|
88
|
+
- [ ] Every `clientPostId` follows `<client-slug>-<YYYYMMDD>-<sequence>`
|
|
89
|
+
- [ ] In api-live mode, every `accountId` is confirmed via `GET /api/v1/accounts`
|
|
90
|
+
- [ ] `dryRun` matches the execution mode declared in the Social Campaign Brief
|
|
91
|
+
|
|
92
|
+
Failure on any of these blocks submission.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Social Campaign 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
|
+
## Project Overview
|
|
11
|
+
|
|
12
|
+
| Field | Value |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Client | [Client Name] |
|
|
15
|
+
| Project | [Project Name] |
|
|
16
|
+
| Campaign window | [YYYY-MM-DD] → [YYYY-MM-DD] |
|
|
17
|
+
| Zernio profile id | [prof_...] or `placeholder` in agent-only mode |
|
|
18
|
+
| Posting timezone | [IANA tz name, e.g., America/New_York] |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Campaign Objective
|
|
23
|
+
|
|
24
|
+
**Primary:** [brand awareness | lead generation | engagement | product launch | community growth]
|
|
25
|
+
|
|
26
|
+
**Why this objective:** [One paragraph grounded in the brand kit's current stage and retainer context.]
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Target Platforms
|
|
31
|
+
|
|
32
|
+
| Platform | Zernio ID | Account | Rationale |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| [Instagram] | `instagram` | [@handle or accountId] | [Why selected — demographics, format fit, client capacity] |
|
|
35
|
+
| [LinkedIn] | `linkedin` | [company page or accountId] | [Why selected] |
|
|
36
|
+
| [X/Twitter] | `twitter` | [@handle] | [Why selected] |
|
|
37
|
+
|
|
38
|
+
Max 5 platforms unless the brand kit documents the team capacity to support more.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Audience Profile
|
|
43
|
+
|
|
44
|
+
### Primary
|
|
45
|
+
|
|
46
|
+
| Attribute | Value |
|
|
47
|
+
|---|---|
|
|
48
|
+
| Age range | [range] |
|
|
49
|
+
| Geography | [regions or countries] |
|
|
50
|
+
| Interests | [top 3–5] |
|
|
51
|
+
| Pain points | [top 3] |
|
|
52
|
+
| Content preferences | [formats + topics] |
|
|
53
|
+
|
|
54
|
+
### Secondary
|
|
55
|
+
|
|
56
|
+
| Attribute | Value |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Age range | [range] |
|
|
59
|
+
| Platforms | [where they are concentrated] |
|
|
60
|
+
| Interests | [top 2–3] |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## KPI Targets
|
|
65
|
+
|
|
66
|
+
| KPI | Metric | Target | Timeline |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| [Brand awareness] | [Impressions] | [50,000/month] | [Month 1] |
|
|
69
|
+
| [Engagement] | [Engagement rate] | [≥3%] | [Rolling] |
|
|
70
|
+
| [Lead generation] | [Link clicks] | [200/month] | [Month 1] |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Content Theme Pillars
|
|
75
|
+
|
|
76
|
+
| Pillar | Description | % of calendar | Primary platforms |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| [Pillar 1] | [One-sentence definition] | [40%] | [platforms] |
|
|
79
|
+
| [Pillar 2] | [Definition] | [30%] | [platforms] |
|
|
80
|
+
| [Pillar 3] | [Definition] | [20%] | [platforms] |
|
|
81
|
+
| [Pillar 4] | [Definition] | [10%] | [platforms] |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Brand Voice Summary
|
|
86
|
+
|
|
87
|
+
| Attribute | Spec |
|
|
88
|
+
|---|---|
|
|
89
|
+
| Tone | [From brand kit] |
|
|
90
|
+
| Words to use | [Top 5–8] |
|
|
91
|
+
| Words to avoid | [Top 5–8] |
|
|
92
|
+
| Emoji rule | [Per platform] |
|
|
93
|
+
| CTA style | [From brand kit] |
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Execution Notes
|
|
98
|
+
|
|
99
|
+
- Caption variants: 3 per post (A direct, B narrative, C question/hook)
|
|
100
|
+
- Every write request to Zernio uses `Idempotency-Key = clientPostId`
|
|
101
|
+
- `dryRun` is `[true/false]` based on execution mode
|
|
102
|
+
- Manifest submission order: media uploads → posts → (optional) queue creation
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Validation Checklist — growthub-zernio-social-v1
|
|
2
|
+
|
|
3
|
+
**Run through this checklist before starting every operator session and before delivering any artifact package.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Pre-Session Checklist
|
|
8
|
+
|
|
9
|
+
### Environment Gate
|
|
10
|
+
|
|
11
|
+
- [ ] Node.js 18+ is installed (`node --version` returns 18+)
|
|
12
|
+
- [ ] `curl` is installed (used for Zernio healthchecks)
|
|
13
|
+
- [ ] Git is installed (`git --version`)
|
|
14
|
+
|
|
15
|
+
### Api-Live Mode (skip if agent-only)
|
|
16
|
+
|
|
17
|
+
- [ ] `ZERNIO_API_KEY` is set in `.env` and matches `sk_` + 64 hex format
|
|
18
|
+
- [ ] `ZERNIO_API_URL` is set (default `https://zernio.com/api/v1`)
|
|
19
|
+
- [ ] `GET /api/v1/profiles` returns 200 with the API key
|
|
20
|
+
- [ ] `ZERNIO_PROFILE_ID` is set and exists on the account
|
|
21
|
+
- [ ] At least one platform account is connected on the profile (`GET /api/v1/accounts`)
|
|
22
|
+
- [ ] API key scope is `read-write` (required for scheduling)
|
|
23
|
+
|
|
24
|
+
### Agent-Only Mode (skip if api-live)
|
|
25
|
+
|
|
26
|
+
- [ ] Mode is confirmed with the user and documented as `agent-only` at the top of all outputs
|
|
27
|
+
- [ ] Scheduling manifests are marked as `"dryRun": true` in the manifest header
|
|
28
|
+
- [ ] Every `platforms[].accountId` is flagged as placeholder tagged with the account handle
|
|
29
|
+
|
|
30
|
+
### Context
|
|
31
|
+
|
|
32
|
+
- [ ] Brand kit exists for the active client (`brands/<client-slug>/brand-kit.md`)
|
|
33
|
+
- [ ] Campaign objective is confirmed (one of: brand awareness / lead generation / engagement / product launch / community growth)
|
|
34
|
+
- [ ] Target platforms are confirmed and in the supported list (`docs/platform-coverage.md`)
|
|
35
|
+
- [ ] Campaign timeframe and posting cadence are confirmed
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Pre-Delivery Checklist
|
|
40
|
+
|
|
41
|
+
### Content Calendar
|
|
42
|
+
|
|
43
|
+
- [ ] All calendar rows have dates within the campaign window
|
|
44
|
+
- [ ] All platform slugs match `docs/platform-coverage.md`
|
|
45
|
+
- [ ] All post types are valid for their target platform
|
|
46
|
+
- [ ] Every row has a non-empty CTA
|
|
47
|
+
- [ ] Media asset notes are present for all image/video/carousel posts
|
|
48
|
+
|
|
49
|
+
### Caption Copy Deck
|
|
50
|
+
|
|
51
|
+
- [ ] All 3 variants (A/B/C) are present for every post entry
|
|
52
|
+
- [ ] All captions respect platform character limits
|
|
53
|
+
- [ ] Hashtag counts are within platform-recommended ranges
|
|
54
|
+
- [ ] No placeholder text remains (no `[INSERT CAPTION HERE]` style fragments)
|
|
55
|
+
|
|
56
|
+
### Scheduling Manifest
|
|
57
|
+
|
|
58
|
+
- [ ] Shape matches `POST /api/v1/posts` body expectations (see `docs/posts-and-queues-layer.md`)
|
|
59
|
+
- [ ] All `scheduledFor` timestamps are ISO 8601 with explicit timezone offset
|
|
60
|
+
- [ ] All `clientPostId` values follow the naming convention
|
|
61
|
+
- [ ] `profileId` is present (or the manifest is `"dryRun": true`)
|
|
62
|
+
- [ ] `platforms[].platform` values all exist in `docs/platform-coverage.md`
|
|
63
|
+
- [ ] Every post in the manifest has a corresponding entry in the ContentCalendar
|
|
64
|
+
|
|
65
|
+
### Output Files
|
|
66
|
+
|
|
67
|
+
- [ ] All files follow the naming convention (`ClientSlug_OutputType_v<N>_<YYYYMMDD>.md`)
|
|
68
|
+
- [ ] All files are saved to `output/<client-slug>/<project-slug>/`
|
|
69
|
+
- [ ] Deliverable is logged in the brand kit DELIVERABLES LOG
|
|
70
|
+
- [ ] No API keys, tokens, or credentials appear in any output file
|
|
71
|
+
- [ ] No partial Zernio request responses with raw auth headers are included
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Kit Integrity Checklist (run after kit changes)
|
|
76
|
+
|
|
77
|
+
- [ ] `kit.json` is valid JSON with `schemaVersion: 2`
|
|
78
|
+
- [ ] All paths in `frozenAssetPaths` exist on disk
|
|
79
|
+
- [ ] All paths in `outputStandard.requiredPaths` exist on disk
|
|
80
|
+
- [ ] Bundle manifest `bundles/growthub-zernio-social-v1.json` exists and matches kit.json
|
|
81
|
+
- [ ] `bundle.kitId` in bundle manifest matches `kit.id` in kit.json
|
|
82
|
+
- [ ] `bundle.workerId` in bundle manifest matches `entrypoint.workerId` in kit.json
|
|
83
|
+
- [ ] All paths in `requiredFrozenAssets` in bundle manifest exist on disk
|
|
84
|
+
- [ ] `node scripts/check-worker-kits.mjs` passes
|
|
85
|
+
- [ ] `bash scripts/check-custom-workspace-kernel.sh` passes
|