vibebusiness 1.2.80 → 1.2.83
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +31 -31
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +2 -2
- package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new.html +1 -1
- package/.next/standalone/.next/server/app/updates/new.rsc +2 -2
- package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +21 -21
- package/.next/standalone/.next/server/chunks/{3794.js → 7151.js} +27 -27
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/business-context.json +1 -1
- package/.next/standalone/data/heartbeat-sessions.json +228 -0
- package/.next/standalone/data/ideas.json +510 -34
- package/.next/standalone/data/implementations.json +129 -0
- package/.next/standalone/data/videos/staging/while-you-slept-demo.json +66 -0
- package/.next/standalone/data/videos/while-you-slept-demo-feed.mp4 +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/0.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/1.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/2.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack.old +0 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/analyze.ts +1 -15
- package/.next/standalone/templates/commands/build-page.md +163 -0
- package/.next/standalone/templates/commands/email-marketing.md +339 -0
- package/.next/standalone/templates/commands/growth-audit.md +85 -0
- package/.next/standalone/templates/commands/launch-campaign.md +84 -0
- package/.next/standalone/templates/commands/manage.md +147 -0
- package/.next/standalone/templates/commands/measure-page.md +89 -0
- package/.next/standalone/templates/commands/positioning.md +128 -0
- package/.next/standalone/templates/commands/pricing-analysis.md +91 -0
- package/.next/standalone/templates/commands/promo-copy.md +186 -0
- package/.next/standalone/templates/commands/promo-video.md +75 -0
- package/.next/standalone/templates/commands/research-competitors.md +124 -0
- package/.next/standalone/templates/commands/setup-payments.md +107 -0
- package/.next/standalone/templates/commands/setup-posthog.md +116 -0
- package/.next/standalone/templates/commands/social-media.md +47 -0
- package/.next/standalone/templates/commands/status-summary.md +103 -0
- package/.next/standalone/templates/commands/validate-idea.md +102 -0
- package/.next/standalone/templates/emails/__tests__/validate-templates.test.ts +147 -0
- package/.next/standalone/templates/emails/day3-activation-feedback.txt +14 -0
- package/.next/standalone/templates/emails/day30-pmf-feedback.txt +19 -0
- package/.next/static/chunks/429-8f4030371ebef5c3.js +1 -0
- package/.next/static/chunks/827-6cf4bfc10d1ff0c7.js +1 -0
- package/.next/static/chunks/app/goals/[id]/page-231bb4daae0f06eb.js +1 -0
- package/.next/static/chunks/app/ideas/[id]/page-b3dfe1e61fc656a4.js +1 -0
- package/.next/static/chunks/app/roadmap/[id]/page-b93a96f017c8d3dd.js +1 -0
- package/.next/static/chunks/app/social/page-5211c78a5f37df65.js +1 -0
- package/.next/static/chunks/app/updates/new/page-dcc67ffca587dcc2.js +1 -0
- package/.next/static/css/654766eb547c6bab.css +3 -0
- package/dist/scripts/analyze.js +1 -14
- package/dist/scripts/heartbeat.js +224 -130
- package/package.json +1 -1
- package/scripts/lib/video/compositions/DemoVideo.tsx +425 -0
- package/scripts/lib/video/compositions/Root.tsx +24 -1
- package/.next/static/chunks/429-c3cc9856a8a9d0d4.js +0 -1
- package/.next/static/chunks/827-d5a9d09b31d7eb1c.js +0 -1
- package/.next/static/chunks/app/goals/[id]/page-7a60dffb8ee860ed.js +0 -1
- package/.next/static/chunks/app/ideas/[id]/page-565f78e223048e74.js +0 -1
- package/.next/static/chunks/app/roadmap/[id]/page-54f51490662106f5.js +0 -1
- package/.next/static/chunks/app/social/page-574752c4e67413de.js +0 -1
- package/.next/static/chunks/app/updates/new/page-c5da11133140a7f4.js +0 -1
- package/.next/static/css/ba6f5fe78931fee2.css +0 -3
- /package/.next/static/{9C8sbF668J83TlKDjSvQm → wJT1h-ifHTtYVlXZG2PFS}/_buildManifest.js +0 -0
- /package/.next/static/{9C8sbF668J83TlKDjSvQm → wJT1h-ifHTtYVlXZG2PFS}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# /email-marketing — Email Marketing Setup & Campaign Generator
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/email-marketing setup # Guided Loops.so setup wizard
|
|
6
|
+
/email-marketing verify # Verify the email pipeline is working end-to-end
|
|
7
|
+
/email-marketing campaign welcome # Generate a welcome email campaign
|
|
8
|
+
/email-marketing campaign onboarding # Generate an onboarding drip email
|
|
9
|
+
/email-marketing campaign feature-announcement # New feature announcement
|
|
10
|
+
/email-marketing campaign re-engagement # Win-back inactive users
|
|
11
|
+
/email-marketing campaign milestone # User achievement celebration
|
|
12
|
+
/email-marketing sequence {name} # Design a multi-email drip sequence
|
|
13
|
+
/email-marketing blast {slug} # Draft a one-off announcement email
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Input
|
|
17
|
+
- `$ARGUMENTS` — required: one of the modes above
|
|
18
|
+
|
|
19
|
+
## Process
|
|
20
|
+
|
|
21
|
+
Parse `$ARGUMENTS` to determine mode. The first word is the mode, the rest are arguments.
|
|
22
|
+
|
|
23
|
+
## Copy Quality Framework
|
|
24
|
+
|
|
25
|
+
When generating ANY email campaign, follow these rules. They override generic instincts.
|
|
26
|
+
|
|
27
|
+
### Positioning Integration (Required)
|
|
28
|
+
|
|
29
|
+
Before writing, load `data/positioning.json` and extract:
|
|
30
|
+
- **Pain points** — Lead with one that matches the campaign's audience
|
|
31
|
+
- **Messaging pillars** — Weave 1-2 into the body (Autonomous Intelligence, Full Lifecycle Closure, Built for Indie Hackers, Compounding Value)
|
|
32
|
+
- **Objection handlers** — Preempt 1 relevant objection (e.g., "not a ChatGPT wrapper", "can I trust AI?")
|
|
33
|
+
- **Social proof** — Include 1 credibility anchor (user count, autonomous shipping proof, market analysis)
|
|
34
|
+
- **CTA bank** — Pull CTA text from positioning rather than inventing generic ones
|
|
35
|
+
- **Headlines** — Use copy_bank headlines as inspiration for subject lines
|
|
36
|
+
|
|
37
|
+
### Subject Lines
|
|
38
|
+
|
|
39
|
+
Write 3 variations using these formulas:
|
|
40
|
+
1. **Curiosity + outcome**: "The 1 thing that changes how you decide what to build"
|
|
41
|
+
2. **Specific benefit**: "Your first business analysis in 60 seconds"
|
|
42
|
+
3. **Pattern interrupt**: "Every dev tool waits for you. This one doesn't."
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
- Under 50 characters (avoid mobile truncation)
|
|
46
|
+
- No "Welcome to [Product]!" or "We're excited!"
|
|
47
|
+
- Test: would YOU open this from an unknown sender?
|
|
48
|
+
|
|
49
|
+
### Opening Lines
|
|
50
|
+
|
|
51
|
+
NEVER use:
|
|
52
|
+
- "Hey there," / "Hi there," / "Hello,"
|
|
53
|
+
- "Welcome to [Product]!"
|
|
54
|
+
- "We're excited to have you!"
|
|
55
|
+
- "Hope this email finds you well"
|
|
56
|
+
|
|
57
|
+
INSTEAD, use one of these patterns:
|
|
58
|
+
- **Pain-point hook**: "You signed up because you're tired of guessing what to build next."
|
|
59
|
+
- **Outcome statement**: "One command. Your entire business strategy. That's what you just unlocked."
|
|
60
|
+
- **Observation**: "Most dev tools help you write code faster. None of them tell you what code to write."
|
|
61
|
+
- **Direct + warm**: "You're in. Here's the short version of what happens next."
|
|
62
|
+
|
|
63
|
+
### Body Copy Rules
|
|
64
|
+
|
|
65
|
+
- **Length**: 80-150 words for welcome; 150-250 for educational/onboarding
|
|
66
|
+
- **Paragraphs**: Max 2-3 sentences each
|
|
67
|
+
- **One idea per email** — don't feature-dump
|
|
68
|
+
- **Benefits over features**: "decides what to ship next" not "uses AI analysis"
|
|
69
|
+
- **Bold key phrases** for scannability
|
|
70
|
+
- **Address one objection** naturally (not as a FAQ — weave it in)
|
|
71
|
+
- **Include social proof** inline, not as a separate section
|
|
72
|
+
|
|
73
|
+
### CTA Rules
|
|
74
|
+
|
|
75
|
+
- **Primary CTA**: One clear action button. First-person verb: "Start my analysis" not "Get started"
|
|
76
|
+
- **Secondary CTA**: One reply/engagement prompt: "Reply and tell me..."
|
|
77
|
+
- **No vague CTAs**: "Get Started" is banned. Be specific: "Run your first analysis", "See what it finds"
|
|
78
|
+
- **Place primary CTA after the core benefit**, not at the very end
|
|
79
|
+
|
|
80
|
+
### Preview Text
|
|
81
|
+
|
|
82
|
+
Formula: [Pain point or hook] + [time/effort] + [outcome]
|
|
83
|
+
- "Stop guessing what to build. 60 seconds to your first strategy."
|
|
84
|
+
- "Your AI analyst just found 12 ideas you missed."
|
|
85
|
+
|
|
86
|
+
### Tone
|
|
87
|
+
|
|
88
|
+
- **Founder voice** — write as a person, not a brand
|
|
89
|
+
- **Confident, not hype** — "This will change how you work" not "We're SO excited!!!"
|
|
90
|
+
- **Respect the reader's time** — if it can be said in fewer words, do it
|
|
91
|
+
- **Technical credibility** — don't dumb things down for developers
|
|
92
|
+
- **CLI-native language** — reference terminal, commands, repos — not "dashboards" or "platforms"
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### Mode: `setup`
|
|
97
|
+
|
|
98
|
+
Interactive Loops.so setup wizard.
|
|
99
|
+
|
|
100
|
+
1. **Check API Key**: Verify `LOOPS_API_KEY` is set in the environment
|
|
101
|
+
- If not set: print instructions to add it to `.env` and stop
|
|
102
|
+
- If set: call `GET /api/v1/api-key` to verify it's valid
|
|
103
|
+
|
|
104
|
+
2. **Audit Current State**:
|
|
105
|
+
- List existing mailing lists via the Loops API
|
|
106
|
+
- List existing contact properties
|
|
107
|
+
- List existing transactional email templates
|
|
108
|
+
- Print a summary of what's already configured
|
|
109
|
+
|
|
110
|
+
3. **Set Up Contact Properties**: Create recommended properties if they don't exist:
|
|
111
|
+
- `source` (string) — where the contact came from (e.g., "website", "twitter", "producthunt")
|
|
112
|
+
- `userGroup` (string) — segment (e.g., "beta_tester", "waitlist", "customer")
|
|
113
|
+
- `plan` (string) — pricing plan (e.g., "free", "pro", "enterprise")
|
|
114
|
+
|
|
115
|
+
4. **Configure KPI Adapter**: Read `data/business-context.json` and check if a `loops` KPI adapter is configured. If not, add one:
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"id": "loops",
|
|
119
|
+
"type": "loops",
|
|
120
|
+
"field_mapping": {
|
|
121
|
+
"kpi-waitlist-signups": "total_contacts"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
5. **Print Dashboard Setup Checklist**: After the API setup steps above, print a clear checklist of manual steps the user must complete in the Loops dashboard (the Loops API cannot create templates or automations programmatically):
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
## Manual Loops Dashboard Setup Required
|
|
130
|
+
|
|
131
|
+
The Loops API cannot create templates or automations programmatically.
|
|
132
|
+
Complete these steps in the Loops dashboard (https://app.loops.so):
|
|
133
|
+
|
|
134
|
+
### 1. Create Mailing List
|
|
135
|
+
- Go to: Audience → Lists → Create List
|
|
136
|
+
- Name: "Beta Waitlist"
|
|
137
|
+
|
|
138
|
+
### 2. Create Transactional Email Template
|
|
139
|
+
- Go to: Transactional → New Transactional Email
|
|
140
|
+
- Name: "Welcome — Waitlist"
|
|
141
|
+
- Copy subject/body from: data/email-campaigns/welcome-2026-02-20.md
|
|
142
|
+
- Set reply-to: your personal email
|
|
143
|
+
|
|
144
|
+
### 3. Create Automation
|
|
145
|
+
- Go to: Automations → New Automation
|
|
146
|
+
- Trigger: Event → "waitlist_joined"
|
|
147
|
+
- Action: Send transactional email → "Welcome — Waitlist"
|
|
148
|
+
- Activate the automation
|
|
149
|
+
|
|
150
|
+
### 4. Verify Pipeline
|
|
151
|
+
- Run: /email-marketing verify
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
6. **Print Summary**: What was set up, what was already configured, next steps (run `/email-marketing verify` to test the pipeline).
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
### Mode: `verify`
|
|
159
|
+
|
|
160
|
+
Verify that the full email pipeline (API → mailing lists → templates → automations) is working.
|
|
161
|
+
|
|
162
|
+
1. **Verify API Key**: Call `GET /api/v1/api-key` — print PASS or FAIL
|
|
163
|
+
2. **Check Mailing Lists**: Call the Loops API to list mailing lists — print PASS if at least 1 exists, FAIL with instructions otherwise
|
|
164
|
+
3. **Check Transactional Templates**: Call the Loops API to list transactional email templates — print PASS if at least 1 exists, FAIL with instructions otherwise
|
|
165
|
+
4. **Test Pipeline End-to-End**:
|
|
166
|
+
- Create a test contact with email `test-verify-{timestamp}@example.com`
|
|
167
|
+
- Set properties: `source: "verify_test"`, `userGroup: "test"`
|
|
168
|
+
- Send a `waitlist_joined` event for that contact
|
|
169
|
+
- Print PASS if both API calls succeed
|
|
170
|
+
5. **Print Results Checklist**:
|
|
171
|
+
```
|
|
172
|
+
## Email Pipeline Verification
|
|
173
|
+
|
|
174
|
+
[PASS/FAIL] API Key — valid (team: {teamName})
|
|
175
|
+
[PASS/FAIL] Mailing Lists — {count} found
|
|
176
|
+
[PASS/FAIL] Transactional Templates — {count} found
|
|
177
|
+
[PASS/FAIL] Test Event — waitlist_joined sent to test contact
|
|
178
|
+
|
|
179
|
+
{If all pass:}
|
|
180
|
+
All checks passed! Your email pipeline is ready.
|
|
181
|
+
Submit a real email on your waitlist form to confirm delivery.
|
|
182
|
+
|
|
183
|
+
{If any fail:}
|
|
184
|
+
Some checks failed. Complete the manual setup steps above, then re-run /email-marketing verify.
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
### Mode: `campaign {type}`
|
|
190
|
+
|
|
191
|
+
Generate an email campaign draft using positioning data and business context.
|
|
192
|
+
|
|
193
|
+
Supported types: `welcome`, `onboarding`, `feature-announcement`, `re-engagement`, `milestone`
|
|
194
|
+
|
|
195
|
+
1. **Load Context**:
|
|
196
|
+
- Read `data/positioning.json` — headlines, CTAs, pain points, objection handlers, brand voice
|
|
197
|
+
- Read `data/business-context.json` — product info, audience, value proposition
|
|
198
|
+
- Read `data/goals.json` — current business goals for relevance
|
|
199
|
+
|
|
200
|
+
2. **Generate Campaign** based on type:
|
|
201
|
+
|
|
202
|
+
**`welcome`** — First email after waitlist/signup:
|
|
203
|
+
- Subject line (3 variations using formulas above)
|
|
204
|
+
- Preview text (using formula above)
|
|
205
|
+
- Body structure:
|
|
206
|
+
1. Pain-point opening (from positioning pain_points — lead with "decision paralysis")
|
|
207
|
+
2. One-sentence value prop (what they signed up for, in bold)
|
|
208
|
+
3. How it's different (vs Cursor/Copilot — the brain/hands distinction)
|
|
209
|
+
4. What to expect (2-3 bullet points: early access timing, build-in-public updates, no spam)
|
|
210
|
+
5. Engagement CTA: "Reply and tell me: what's the one thing you wish AI could handle?"
|
|
211
|
+
6. Founder sign-off with P.S. (address one objection: BYOK/privacy, cost, or trust)
|
|
212
|
+
- Tone: founder letter, personal, confident — NOT corporate welcome
|
|
213
|
+
- Include personalization tokens: `{{source}}` (no `{{firstName}}` — waitlist form collects email only)
|
|
214
|
+
- DO NOT include: feature lists, setup instructions, or multiple CTAs
|
|
215
|
+
|
|
216
|
+
**`onboarding`** — Guide new users to first value:
|
|
217
|
+
- Subject line (3 variations)
|
|
218
|
+
- Body: acknowledge signup → one quick-win action → expected outcome → CTA to first action
|
|
219
|
+
- Focus on time-to-value: "60 seconds to your first analysis"
|
|
220
|
+
- Include personalization: `{{source}}`
|
|
221
|
+
|
|
222
|
+
**`feature-announcement`** — New feature shipped:
|
|
223
|
+
- Subject line (3 variations)
|
|
224
|
+
- Body: what's new → why it matters → how to use it → CTA to try it
|
|
225
|
+
- Pull differentiators from positioning data
|
|
226
|
+
- If $ARGUMENTS includes an idea ID, load that idea for specific feature details
|
|
227
|
+
|
|
228
|
+
**`re-engagement`** — Win back inactive users:
|
|
229
|
+
- Subject line (3 variations)
|
|
230
|
+
- Body: we miss you → what's new since they left → special offer/incentive → CTA
|
|
231
|
+
- Use objection handlers from positioning to address likely reasons for leaving
|
|
232
|
+
|
|
233
|
+
**`milestone`** — Celebrate user achievements:
|
|
234
|
+
- Subject line (3 variations)
|
|
235
|
+
- Body: congratulations → what they achieved → what's next → CTA to share/upgrade
|
|
236
|
+
- Keep it short and celebratory
|
|
237
|
+
|
|
238
|
+
3. **Write Output**: Save to `data/email-campaigns/{type}-{YYYY-MM-DD}.md` as structured markdown:
|
|
239
|
+
```markdown
|
|
240
|
+
# {Type} Email Campaign — {Date}
|
|
241
|
+
|
|
242
|
+
## Metadata
|
|
243
|
+
- Type: {type}
|
|
244
|
+
- Generated: {date}
|
|
245
|
+
- Positioning version: {last_updated from positioning.json}
|
|
246
|
+
|
|
247
|
+
## Subject Lines
|
|
248
|
+
1. {subject1}
|
|
249
|
+
2. {subject2}
|
|
250
|
+
3. {subject3}
|
|
251
|
+
|
|
252
|
+
## Preview Text
|
|
253
|
+
{preview}
|
|
254
|
+
|
|
255
|
+
## Body
|
|
256
|
+
|
|
257
|
+
{full email body in markdown}
|
|
258
|
+
|
|
259
|
+
## Loops Integration Notes
|
|
260
|
+
- Suggested event trigger: {event_name}
|
|
261
|
+
- Recommended mailing list: {list_name}
|
|
262
|
+
- Personalization tokens used: {list}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
4. **Print Summary**: Preview of subject lines, word count, file path, suggestion to set up in Loops dashboard.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### Mode: `sequence {name}`
|
|
270
|
+
|
|
271
|
+
Design a multi-email drip sequence.
|
|
272
|
+
|
|
273
|
+
1. **Load Context**: Same as campaign mode — positioning, business context, goals.
|
|
274
|
+
|
|
275
|
+
2. **Design Sequence**:
|
|
276
|
+
- Generate 3-5 emails with recommended timing (e.g., Day 0, Day 2, Day 5, Day 10, Day 14)
|
|
277
|
+
- Each email has: subject line, preview text, body, CTA
|
|
278
|
+
- Map a Loops event name to trigger each email
|
|
279
|
+
- Ensure narrative arc: introduce → educate → demonstrate value → convert → reinforce
|
|
280
|
+
|
|
281
|
+
3. **Write Output**: Save to `data/email-campaigns/sequences/{name}.md`:
|
|
282
|
+
```markdown
|
|
283
|
+
# {Name} Email Sequence
|
|
284
|
+
|
|
285
|
+
## Overview
|
|
286
|
+
- Emails: {count}
|
|
287
|
+
- Duration: {total days}
|
|
288
|
+
- Goal: {sequence goal}
|
|
289
|
+
- Trigger event: {initial trigger}
|
|
290
|
+
|
|
291
|
+
## Email 1: {title} (Day 0)
|
|
292
|
+
**Trigger:** {event_name}
|
|
293
|
+
**Subject:** {subject}
|
|
294
|
+
**Preview:** {preview}
|
|
295
|
+
|
|
296
|
+
{body}
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Email 2: {title} (Day 2)
|
|
301
|
+
...
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
4. **Print Summary**: Sequence overview, timing chart, event names to configure in Loops.
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
### Mode: `blast {slug}`
|
|
309
|
+
|
|
310
|
+
Draft a one-off announcement email.
|
|
311
|
+
|
|
312
|
+
1. **Load Context**: Positioning data, business context. If slug matches an idea ID in `data/ideas.json`, load that idea for specific details.
|
|
313
|
+
|
|
314
|
+
2. **Generate Email**:
|
|
315
|
+
- Subject line (3 variations)
|
|
316
|
+
- Preview text
|
|
317
|
+
- Body: announcement → details → why it matters → CTA
|
|
318
|
+
- Keep it concise — one-off emails should be scannable
|
|
319
|
+
|
|
320
|
+
3. **Write Output**: Save to `data/email-campaigns/blasts/{slug}.md`
|
|
321
|
+
|
|
322
|
+
4. **Print Summary**: Preview of subject lines, file path.
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Directory Structure
|
|
327
|
+
|
|
328
|
+
Ensure these directories exist before writing (create if needed):
|
|
329
|
+
```
|
|
330
|
+
data/email-campaigns/
|
|
331
|
+
├── sequences/
|
|
332
|
+
└── blasts/
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## Output Files
|
|
336
|
+
- `data/email-campaigns/{type}-{date}.md` — campaign drafts
|
|
337
|
+
- `data/email-campaigns/sequences/{name}.md` — drip sequences
|
|
338
|
+
- `data/email-campaigns/blasts/{slug}.md` — one-off emails
|
|
339
|
+
- `data/business-context.json` — updated with Loops KPI adapter (setup mode only)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# /growth-audit — Growth Channel Audit
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/growth-audit # Full channel comparison (default)
|
|
6
|
+
/growth-audit seo # Deep-dive on SEO channel
|
|
7
|
+
/growth-audit paid # Deep-dive on paid acquisition
|
|
8
|
+
/growth-audit content # Deep-dive on content marketing
|
|
9
|
+
/growth-audit referral # Deep-dive on referral/partnerships
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Input
|
|
13
|
+
- `$ARGUMENTS` — optional: specific channel to deep-dive
|
|
14
|
+
|
|
15
|
+
## Process
|
|
16
|
+
|
|
17
|
+
### Step 1: Load Context
|
|
18
|
+
1. Read `data/competitors.json` — all competitor growth channel data
|
|
19
|
+
2. Read `data/business-context.json` — our current funnels, channels, KPIs
|
|
20
|
+
3. Read `data/ideas.json` — existing growth ideas (to avoid duplicates)
|
|
21
|
+
|
|
22
|
+
### Step 2: Map Channel Landscape
|
|
23
|
+
If no competitor data exists, run quick WebSearch queries:
|
|
24
|
+
- `"[product category] growth channels"`
|
|
25
|
+
- `"[product category] marketing strategy"`
|
|
26
|
+
- `"how to grow [product category] startup"`
|
|
27
|
+
|
|
28
|
+
Build a channel comparison matrix:
|
|
29
|
+
|
|
30
|
+
| Channel | Us | Competitor A | Competitor B | Competitor C |
|
|
31
|
+
|---------|-----|-------------|-------------|-------------|
|
|
32
|
+
| SEO/Blog | ... | ... | ... | ... |
|
|
33
|
+
| Paid Search | ... | ... | ... | ... |
|
|
34
|
+
| Social Media | ... | ... | ... | ... |
|
|
35
|
+
| Content Marketing | ... | ... | ... | ... |
|
|
36
|
+
| Email/Newsletter | ... | ... | ... | ... |
|
|
37
|
+
| Referral Program | ... | ... | ... | ... |
|
|
38
|
+
| Partnerships | ... | ... | ... | ... |
|
|
39
|
+
| Community | ... | ... | ... | ... |
|
|
40
|
+
|
|
41
|
+
For each channel, note: active/inactive, estimated investment level, content frequency.
|
|
42
|
+
|
|
43
|
+
### Step 3: Gap Analysis
|
|
44
|
+
Identify:
|
|
45
|
+
1. **Channels competitors use that we don't** — potential opportunities
|
|
46
|
+
2. **Channels we use that competitors don't** — potential advantages
|
|
47
|
+
3. **Channels everyone uses** — table stakes, must maintain
|
|
48
|
+
4. **Channels nobody uses** — either untapped opportunity or proven dead-end
|
|
49
|
+
|
|
50
|
+
### Step 4: Channel Deep-Dive
|
|
51
|
+
If `$ARGUMENTS` specifies a channel, or for the top 3 opportunity channels:
|
|
52
|
+
|
|
53
|
+
Run WebSearch for best practices:
|
|
54
|
+
- `"[channel] strategy for [product category] [year]"`
|
|
55
|
+
- `"[channel] benchmarks SaaS [year]"`
|
|
56
|
+
|
|
57
|
+
For each channel, estimate:
|
|
58
|
+
- **Effort**: How much work to start? (1-10)
|
|
59
|
+
- **Time to results**: Weeks/months until impact
|
|
60
|
+
- **Impact potential**: Revenue/traffic uplift estimate
|
|
61
|
+
- **Prerequisites**: What needs to exist first? (e.g., blog infrastructure for content)
|
|
62
|
+
|
|
63
|
+
### Step 5: Generate Growth Experiments
|
|
64
|
+
Create ranked growth experiments as ideas in `data/ideas.json`:
|
|
65
|
+
|
|
66
|
+
For each recommended experiment:
|
|
67
|
+
- Title: specific, actionable (e.g., "Launch SEO blog targeting [keyword cluster]")
|
|
68
|
+
- Category: "growth"
|
|
69
|
+
- Priority: based on effort/impact ratio
|
|
70
|
+
- Implementation plan: step-by-step
|
|
71
|
+
- Success metrics: measurable outcomes
|
|
72
|
+
- Tags: include channel name
|
|
73
|
+
|
|
74
|
+
Generate 3-5 experiments, ranked by estimated ROI.
|
|
75
|
+
|
|
76
|
+
### Step 6: Output
|
|
77
|
+
Print:
|
|
78
|
+
- Channel comparison matrix
|
|
79
|
+
- Gap analysis summary
|
|
80
|
+
- Top 3 growth channel recommendations with rationale
|
|
81
|
+
- Experiments generated (linked to ideas.json)
|
|
82
|
+
- Recommendation for next step
|
|
83
|
+
|
|
84
|
+
## Output Files
|
|
85
|
+
- `data/ideas.json` — new growth experiment ideas
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# /launch-campaign — Multi-Channel Marketing Campaign Orchestrator
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/launch-campaign ship {ideaId} # Full ship campaign
|
|
6
|
+
/launch-campaign milestone {kpiId} # Milestone celebration campaign
|
|
7
|
+
/launch-campaign status # List active/completed campaigns
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — required: campaign type and parameters
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
Parse `$ARGUMENTS` to determine the campaign type.
|
|
16
|
+
|
|
17
|
+
### Type: `ship {ideaId}`
|
|
18
|
+
|
|
19
|
+
Orchestrate a full ship announcement campaign across all configured channels.
|
|
20
|
+
|
|
21
|
+
1. **Load Context**:
|
|
22
|
+
- Read `data/ideas.json` — find the shipped idea by ID
|
|
23
|
+
- Read `data/positioning.json` — for copy quality
|
|
24
|
+
- Read `data/social.json` — check if X is configured
|
|
25
|
+
- Check if Loops email is configured (LOOPS_API_KEY in env)
|
|
26
|
+
- Check `data/business-context.json` — ContentFlow config
|
|
27
|
+
|
|
28
|
+
2. **Generate Campaign Plan**:
|
|
29
|
+
Based on what channels are configured, queue these sub-tasks in TODO.md:
|
|
30
|
+
- `generate-visual-{ideaId}` — Ship card PNG (if not already generated)
|
|
31
|
+
- `video-render-ship-{ideaId}` — Ship video (if ContentFlow configured)
|
|
32
|
+
- `copy-tweet-ship` — Generate positioning-driven tweet copy
|
|
33
|
+
- `social-draft-ship-visual` — Create tweet draft with media (after card/video ready)
|
|
34
|
+
- `email-campaign-feature-announcement` — Email announcement draft
|
|
35
|
+
- `copy-social-linkedin` — LinkedIn post copy
|
|
36
|
+
|
|
37
|
+
3. **Write Campaign State**: Save to `data/campaigns/{ideaId}-{YYYY-MM-DD}.json`:
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"id": "campaign-{ideaId}-{date}",
|
|
41
|
+
"type": "ship",
|
|
42
|
+
"idea_id": "{ideaId}",
|
|
43
|
+
"created_at": "{ISO date}",
|
|
44
|
+
"status": "active",
|
|
45
|
+
"sub_tasks": [
|
|
46
|
+
{ "task_id": "generate-visual-{ideaId}", "status": "queued" },
|
|
47
|
+
{ "task_id": "video-render-ship-{ideaId}", "status": "queued" },
|
|
48
|
+
{ "task_id": "copy-tweet-ship", "status": "queued" },
|
|
49
|
+
{ "task_id": "social-draft-ship-visual", "status": "queued" },
|
|
50
|
+
{ "task_id": "email-campaign-feature-announcement", "status": "queued" },
|
|
51
|
+
{ "task_id": "copy-social-linkedin", "status": "queued" }
|
|
52
|
+
],
|
|
53
|
+
"channels": ["x", "email", "linkedin"]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
4. **Add Sub-Tasks to TODO.md**: Write each sub-task as a high-priority TODO item.
|
|
58
|
+
Sub-tasks execute on subsequent heartbeats (natural pacing, not all at once).
|
|
59
|
+
|
|
60
|
+
5. **Print Campaign Summary**: What was queued, which channels, estimated timeline.
|
|
61
|
+
|
|
62
|
+
### Type: `milestone {kpiId}`
|
|
63
|
+
|
|
64
|
+
Orchestrate a milestone celebration campaign.
|
|
65
|
+
|
|
66
|
+
1. **Load KPI Data**: Find the KPI in `data/goals.json`
|
|
67
|
+
2. **Queue Sub-Tasks**:
|
|
68
|
+
- `copy-tweet-milestone` — Milestone tweet copy
|
|
69
|
+
- `social-draft-milestone` — Tweet draft
|
|
70
|
+
- `email-campaign-milestone` — Celebration email
|
|
71
|
+
3. **Save Campaign State**: Same format as ship, but type "milestone"
|
|
72
|
+
|
|
73
|
+
### Type: `status`
|
|
74
|
+
|
|
75
|
+
List all campaigns and their sub-task completion status.
|
|
76
|
+
|
|
77
|
+
1. Read all files from `data/campaigns/`
|
|
78
|
+
2. For each campaign, check sub-task completion (cross-reference with TODO.md)
|
|
79
|
+
3. Print summary table
|
|
80
|
+
|
|
81
|
+
## Output
|
|
82
|
+
- Campaign state: `data/campaigns/{id}.json`
|
|
83
|
+
- Sub-tasks: Added to `TODO.md` as high-priority items
|
|
84
|
+
- Print: Campaign summary with channel list and task queue
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# /manage — Interactive Data Editor
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/manage show me all ideas with priority=critical
|
|
6
|
+
/manage change the priority of idea-emergency-001 to high
|
|
7
|
+
/manage add a new idea: "Add telemetry dashboard for command usage"
|
|
8
|
+
/manage move idea-003 to approved stage
|
|
9
|
+
/manage update our MRR to 5000 in business context
|
|
10
|
+
/manage show ideas stuck in inbox for more than 7 days
|
|
11
|
+
/manage delete hypothesis hyp-005
|
|
12
|
+
/manage list all goals that are behind
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Input
|
|
16
|
+
- `$ARGUMENTS` — **required**: natural-language request describing what to query, create, update, or delete
|
|
17
|
+
|
|
18
|
+
## Data File Map
|
|
19
|
+
|
|
20
|
+
| File | Structure | Contains |
|
|
21
|
+
|------|-----------|----------|
|
|
22
|
+
| `data/ideas.json` | `{ ideas: BusinessIdea[] }` | Innovation pipeline |
|
|
23
|
+
| `data/goals.json` | `{ goals: BusinessGoal[] }` | Business goals + KPIs |
|
|
24
|
+
| `data/hypotheses.json` | `{ hypotheses: BusinessHypothesis[] }` | Testable hypotheses |
|
|
25
|
+
| `data/business-context.json` | `BusinessConfig` | Product info, funnels, monetization |
|
|
26
|
+
| `data/config.json` | `AnalystConfig` | Repos, schedules, autonomy settings |
|
|
27
|
+
| `data/competitors.json` | `{ competitors[], last_updated }` | Competitor intelligence |
|
|
28
|
+
| `data/positioning.json` | `PositioningData` | Brand positioning & copy bank |
|
|
29
|
+
| `data/sessions.json` | `{ sessions: AnalysisSession[] }` | Analysis session history |
|
|
30
|
+
|
|
31
|
+
## Schema Reference (Valid Enum Values)
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Priority: critical | high | medium | low
|
|
35
|
+
Stage: inbox | under_review | approved | in_progress | testing | shipped | deferred | rejected | rolled_back
|
|
36
|
+
Category: product | ux_design | growth | performance | tech_debt | security | infrastructure | content | analytics | integration
|
|
37
|
+
Effort (size): xs | s | m | l | xl
|
|
38
|
+
Impact (size): xs | s | m | l | xl
|
|
39
|
+
GoalCategory: acquisition | activation | retention | revenue | referral
|
|
40
|
+
GoalStatus: on_track | at_risk | behind | achieved
|
|
41
|
+
HypothesisStatus: stated | testing | validated | invalidated | deferred
|
|
42
|
+
SourceType: codebase_analysis | metrics_review | market_research | seo_audit | manual
|
|
43
|
+
KPISource: manual | rest_api | posthog | firestore | stripe | whatsapp
|
|
44
|
+
KPIDirection: higher_is_better | lower_is_better
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Process
|
|
48
|
+
|
|
49
|
+
### Step 1: Parse Request
|
|
50
|
+
Analyze `$ARGUMENTS` to determine:
|
|
51
|
+
- **Intent**: query, create, update, delete, or bulk operation
|
|
52
|
+
- **Entity type**: idea, goal, hypothesis, business-context, config, competitor, positioning, session
|
|
53
|
+
- **Target**: specific ID (e.g., `idea-emergency-001`) or filter criteria (e.g., `priority=critical`)
|
|
54
|
+
- **Fields to change**: which fields and their new values
|
|
55
|
+
|
|
56
|
+
### Step 2: Load State
|
|
57
|
+
Read **only** the data file(s) needed for this operation. Do NOT read all files.
|
|
58
|
+
|
|
59
|
+
- Idea operations → `data/ideas.json`
|
|
60
|
+
- Goal operations → `data/goals.json`
|
|
61
|
+
- Hypothesis operations → `data/hypotheses.json`
|
|
62
|
+
- Business context → `data/business-context.json`
|
|
63
|
+
- Config changes → `data/config.json`
|
|
64
|
+
- Competitor operations → `data/competitors.json`
|
|
65
|
+
- Positioning operations → `data/positioning.json`
|
|
66
|
+
- Session queries → `data/sessions.json`
|
|
67
|
+
|
|
68
|
+
### Step 3: Execute
|
|
69
|
+
|
|
70
|
+
#### For **queries** (show, list, find, count):
|
|
71
|
+
- Filter the data based on the request criteria
|
|
72
|
+
- Format results as a readable table or summary
|
|
73
|
+
- Include relevant fields (id, title, stage, priority at minimum for ideas)
|
|
74
|
+
- For time-based queries (e.g., "stuck in inbox for 7 days"), compare `created_at` or `updated_at` against current date
|
|
75
|
+
|
|
76
|
+
#### For **create** (add, new, create):
|
|
77
|
+
- Generate an ID following the existing pattern:
|
|
78
|
+
- Ideas: `idea-[slug]-NNN` (e.g., `idea-telemetry-001`)
|
|
79
|
+
- Goals: `goal-NNN` (e.g., `goal-005`)
|
|
80
|
+
- Hypotheses: `hyp-NNN` (e.g., `hyp-010`)
|
|
81
|
+
- Set `created_at` and `updated_at` to current ISO timestamp
|
|
82
|
+
- Set defaults for required fields not specified by the user:
|
|
83
|
+
- Ideas: `stage: "inbox"`, `priority: "medium"`, `source: { type: "manual" }`
|
|
84
|
+
- Hypotheses: `status: "stated"`, `priority: "medium"`
|
|
85
|
+
- Goals: `status: "on_track"`, `kpis: []`
|
|
86
|
+
- Append to the appropriate array in the JSON file
|
|
87
|
+
- Show the full created entity
|
|
88
|
+
|
|
89
|
+
#### For **update** (change, set, move, update):
|
|
90
|
+
- Find the entity by ID (exact match)
|
|
91
|
+
- If ID is ambiguous or not found, search by title substring and ask for confirmation
|
|
92
|
+
- Record the **before** value of changed fields
|
|
93
|
+
- Apply the changes
|
|
94
|
+
- Set `updated_at` to current ISO timestamp
|
|
95
|
+
- Show a before/after diff
|
|
96
|
+
|
|
97
|
+
#### For **delete** (remove, delete):
|
|
98
|
+
- Find the entity by ID
|
|
99
|
+
- Show what will be deleted and ask for confirmation before proceeding
|
|
100
|
+
- Remove the entity from the array
|
|
101
|
+
- Show confirmation of deletion
|
|
102
|
+
|
|
103
|
+
#### For **bulk operations** (e.g., "move all inbox ideas older than 30 days to deferred"):
|
|
104
|
+
- Show all entities that match the criteria
|
|
105
|
+
- Ask for confirmation before applying changes
|
|
106
|
+
- Apply changes to all matching entities
|
|
107
|
+
- Show summary of changes
|
|
108
|
+
|
|
109
|
+
### Step 4: Validate
|
|
110
|
+
Before writing any changes, verify:
|
|
111
|
+
1. **Enum values are valid** — check against the Schema Reference above
|
|
112
|
+
2. **Required fields are present** — id, title, created_at, updated_at at minimum
|
|
113
|
+
3. **IDs are unique** — no duplicate IDs in the array
|
|
114
|
+
4. **Array structure preserved** — the file still has the correct top-level structure (e.g., `{ "ideas": [...] }`)
|
|
115
|
+
5. **Timestamps are ISO 8601** — format: `2026-02-16T12:00:00Z`
|
|
116
|
+
|
|
117
|
+
If validation fails, report the error and do NOT write the file.
|
|
118
|
+
|
|
119
|
+
### Step 5: Report
|
|
120
|
+
After executing, print a summary:
|
|
121
|
+
|
|
122
|
+
**For queries:**
|
|
123
|
+
```
|
|
124
|
+
📋 Found N [entities] matching "[criteria]"
|
|
125
|
+
[formatted table or list]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**For mutations (create/update/delete):**
|
|
129
|
+
```
|
|
130
|
+
✅ [Action] completed
|
|
131
|
+
|
|
132
|
+
Entity: [id]
|
|
133
|
+
File: data/[file].json
|
|
134
|
+
|
|
135
|
+
[Before → After diff for changed fields]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Safety Rules
|
|
139
|
+
1. **Always read before writing** — never modify a file without reading it first
|
|
140
|
+
2. **Preserve structure** — maintain the JSON array wrapper and all unchanged fields
|
|
141
|
+
3. **Validate enums** — reject invalid enum values with a helpful error message listing valid options
|
|
142
|
+
4. **Update timestamps** — set `updated_at` on every mutation
|
|
143
|
+
5. **Confirm destructive actions** — ask before delete or bulk operations
|
|
144
|
+
6. **One file at a time** — avoid writing multiple data files in a single operation unless explicitly requested
|
|
145
|
+
|
|
146
|
+
## Output Files
|
|
147
|
+
- The specific `data/*.json` file(s) modified by the operation
|