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,89 @@
|
|
|
1
|
+
# /measure-page — Page Performance Check
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/measure-page /landing # Measure by URL path
|
|
6
|
+
/measure-page page-001 # Measure by page ID
|
|
7
|
+
/measure-page all # Measure all tracked pages
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — **required**: page URL path, page ID, or "all"
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Step 1: Identify Page
|
|
16
|
+
1. Read `data/pages.json`
|
|
17
|
+
2. Find the page by:
|
|
18
|
+
- URL path match (e.g., `/landing`)
|
|
19
|
+
- Page ID match (e.g., `page-001`)
|
|
20
|
+
- If "all", process all pages with status "live"
|
|
21
|
+
3. If page not found, list available pages and exit
|
|
22
|
+
|
|
23
|
+
### Step 2: Gather Metrics
|
|
24
|
+
Check for analytics integration:
|
|
25
|
+
|
|
26
|
+
1. **KPI Adapters** — check `data/business-context.json` for configured analytics adapters
|
|
27
|
+
2. **Manual Input** — if no adapter, ask the user for metrics:
|
|
28
|
+
- Bounce rate (%)
|
|
29
|
+
- Conversion rate (%)
|
|
30
|
+
- Average time on page (seconds)
|
|
31
|
+
- Total visitors (in measurement period)
|
|
32
|
+
|
|
33
|
+
### Step 3: Benchmark Comparison
|
|
34
|
+
Compare metrics against:
|
|
35
|
+
|
|
36
|
+
1. **Industry benchmarks** (use WebSearch if needed):
|
|
37
|
+
- Landing page average bounce rate: 40-60%
|
|
38
|
+
- Landing page average conversion rate: 2-5%
|
|
39
|
+
- Good time on page: >60 seconds
|
|
40
|
+
|
|
41
|
+
2. **Competitor pages** — if competitor data exists in `data/competitors.json`, compare:
|
|
42
|
+
- Our CTA clarity vs. theirs
|
|
43
|
+
- Our social proof depth vs. theirs
|
|
44
|
+
- Our headline specificity vs. theirs
|
|
45
|
+
|
|
46
|
+
### Step 4: Identify Improvements
|
|
47
|
+
Based on metrics and benchmarks, identify specific improvement opportunities:
|
|
48
|
+
|
|
49
|
+
- **High bounce rate (>60%)** → headline mismatch, slow load, unclear value prop
|
|
50
|
+
- **Low conversion (<2%)** → weak CTA, missing social proof, too many options
|
|
51
|
+
- **Low time on page (<30s)** → content not engaging, poor above-the-fold
|
|
52
|
+
- **Good metrics** → consider A/B test variations for further optimization
|
|
53
|
+
|
|
54
|
+
For each issue, provide:
|
|
55
|
+
- The specific problem
|
|
56
|
+
- Evidence from the metrics
|
|
57
|
+
- Recommended fix (referencing positioning data)
|
|
58
|
+
- Expected impact
|
|
59
|
+
|
|
60
|
+
### Step 5: Update Pages Data
|
|
61
|
+
Update `data/pages.json` with the measurements:
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"metrics": {
|
|
65
|
+
"bounce_rate": 45.2,
|
|
66
|
+
"conversion_rate": 3.1,
|
|
67
|
+
"avg_time_on_page": 87,
|
|
68
|
+
"visitors": 1250
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 6: Generate Optimization Ideas
|
|
74
|
+
If metrics are below benchmarks, generate improvement ideas in `data/ideas.json`:
|
|
75
|
+
- Category: "growth" or "ux_design"
|
|
76
|
+
- Tag with page ID
|
|
77
|
+
- Include specific, actionable implementation plan
|
|
78
|
+
- Reference positioning data for copy improvements
|
|
79
|
+
|
|
80
|
+
### Step 7: Output
|
|
81
|
+
Print:
|
|
82
|
+
- Current metrics vs. benchmarks (table format)
|
|
83
|
+
- Performance grade (A/B/C/D/F)
|
|
84
|
+
- Top 3 improvement recommendations
|
|
85
|
+
- Ideas generated (if any)
|
|
86
|
+
|
|
87
|
+
## Output Files
|
|
88
|
+
- `data/pages.json` — updated metrics
|
|
89
|
+
- `data/ideas.json` — new optimization ideas (if applicable)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# /positioning — Positioning & Copy Framework
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/positioning # Full analysis (default)
|
|
6
|
+
/positioning copy-bank # Regenerate copy variations using existing positioning
|
|
7
|
+
/positioning refresh # Re-analyze after new competitor data
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — optional: "copy-bank" or "refresh"
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Step 1: Load Context
|
|
16
|
+
1. Read `data/competitors.json` — all competitor profiles
|
|
17
|
+
2. Read `data/business-context.json` — product info, funnels, monetization
|
|
18
|
+
3. Read `data/positioning.json` — existing positioning (if any)
|
|
19
|
+
4. Determine mode:
|
|
20
|
+
- Empty → full analysis
|
|
21
|
+
- `"copy-bank"` → skip positioning analysis, regenerate copy only
|
|
22
|
+
- `"refresh"` → full re-analysis treating existing positioning as draft
|
|
23
|
+
|
|
24
|
+
### Step 2: Market Landscape Analysis
|
|
25
|
+
**Skip if mode is "copy-bank".**
|
|
26
|
+
|
|
27
|
+
If no competitor data exists, run lightweight WebSearch queries:
|
|
28
|
+
- `"[product category] market landscape [year]"`
|
|
29
|
+
- `"[product category] comparison"`
|
|
30
|
+
|
|
31
|
+
Map all competitors on these axes:
|
|
32
|
+
- **Price vs. Features** — who's premium vs. budget?
|
|
33
|
+
- **Audience segments** — developers, SMBs, enterprise, specific verticals?
|
|
34
|
+
- **Positioning angles** — speed, simplicity, power, price, trust?
|
|
35
|
+
|
|
36
|
+
Identify:
|
|
37
|
+
- Which quadrants are crowded vs. empty?
|
|
38
|
+
- Which audience segments are underserved?
|
|
39
|
+
- What messaging angles are overused?
|
|
40
|
+
|
|
41
|
+
### Step 3: Positioning Definition
|
|
42
|
+
Define or refine:
|
|
43
|
+
|
|
44
|
+
1. **Ideal Customer Profile (ICP)**:
|
|
45
|
+
- Primary audience: who benefits most?
|
|
46
|
+
- Secondary audiences: who else uses this?
|
|
47
|
+
- Anti-personas: who is NOT our customer? (important for focus)
|
|
48
|
+
|
|
49
|
+
2. **Value Proposition**: One clear sentence — what do we do, for whom, and why is it better?
|
|
50
|
+
|
|
51
|
+
3. **Differentiators**: 3-5 specific things that make us different. Each must be:
|
|
52
|
+
- True (we actually do this)
|
|
53
|
+
- Relevant (customers care about this)
|
|
54
|
+
- Unique (competitors don't do this or do it worse)
|
|
55
|
+
|
|
56
|
+
4. **Messaging Pillars**: 3-4 themes that all our messaging reinforces. For each:
|
|
57
|
+
- Pillar name (e.g., "Simplicity", "Speed", "Trust")
|
|
58
|
+
- Proof points (specific evidence)
|
|
59
|
+
- Counter-objections (how to respond when challenged)
|
|
60
|
+
|
|
61
|
+
### Step 4: Generate Copy Bank
|
|
62
|
+
Generate copy variations segmented by funnel stage (TOFU/MOFU/BOFU) and audience:
|
|
63
|
+
|
|
64
|
+
1. **Headlines** (5+ variations):
|
|
65
|
+
- TOFU: awareness/education focused
|
|
66
|
+
- MOFU: consideration/comparison focused
|
|
67
|
+
- BOFU: decision/urgency focused
|
|
68
|
+
|
|
69
|
+
2. **Subheadlines** (3+ variations): support the headline with specifics
|
|
70
|
+
|
|
71
|
+
3. **CTAs** (5+ variations):
|
|
72
|
+
- Primary: main action (e.g., "Start Free Trial")
|
|
73
|
+
- Secondary: lower commitment (e.g., "See Demo")
|
|
74
|
+
- Micro: in-content (e.g., "Learn More")
|
|
75
|
+
|
|
76
|
+
4. **Social Proof** snippets: stats, testimonials, logos, case studies
|
|
77
|
+
|
|
78
|
+
5. **Objection Handlers**: for each common objection, a concise response
|
|
79
|
+
- "Too expensive" → ...
|
|
80
|
+
- "I already use X" → ...
|
|
81
|
+
- "Is it secure?" → ...
|
|
82
|
+
|
|
83
|
+
6. **Pain Points**: ranked by intensity and audience segment
|
|
84
|
+
|
|
85
|
+
### Step 5: Write Output
|
|
86
|
+
Write to `data/positioning.json`:
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"last_updated": "YYYY-MM-DD",
|
|
90
|
+
"current": {
|
|
91
|
+
"tagline": "...",
|
|
92
|
+
"value_proposition": "...",
|
|
93
|
+
"target_audience": {
|
|
94
|
+
"primary": "...",
|
|
95
|
+
"secondary": ["..."],
|
|
96
|
+
"anti_personas": ["..."]
|
|
97
|
+
},
|
|
98
|
+
"differentiators": ["..."],
|
|
99
|
+
"messaging_pillars": [
|
|
100
|
+
{
|
|
101
|
+
"pillar": "...",
|
|
102
|
+
"proof_points": ["..."],
|
|
103
|
+
"counter_objections": ["..."]
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
"copy_bank": {
|
|
108
|
+
"headlines": [{ "text": "...", "audience": "...", "funnel_stage": "tofu" }],
|
|
109
|
+
"subheadlines": [{ "text": "...", "audience": "...", "funnel_stage": "tofu" }],
|
|
110
|
+
"ctas": [{ "text": "...", "context": "...", "conversion_rate": null }],
|
|
111
|
+
"social_proof": [{ "text": "...", "type": "stat" }],
|
|
112
|
+
"objection_handlers": [{ "objection": "...", "response": "..." }],
|
|
113
|
+
"pain_points": [{ "pain": "...", "audience": "...", "intensity": "high" }]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Step 6: Print Summary
|
|
119
|
+
Print a positioning canvas:
|
|
120
|
+
- Tagline and value proposition
|
|
121
|
+
- ICP summary
|
|
122
|
+
- Top 3 differentiators
|
|
123
|
+
- Messaging pillars overview
|
|
124
|
+
- Copy bank stats (N headlines, N CTAs, etc.)
|
|
125
|
+
- Recommendation for next step (usually: run `/build-page`)
|
|
126
|
+
|
|
127
|
+
## Output Files
|
|
128
|
+
- `data/positioning.json` — positioning framework and copy bank
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# /pricing-analysis — Pricing Strategy Analysis
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/pricing-analysis # Full pricing analysis (default)
|
|
6
|
+
/pricing-analysis benchmark # Just benchmark against competitors
|
|
7
|
+
/pricing-analysis optimize # Suggest optimizations for current pricing
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — optional: "benchmark" or "optimize"
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Step 1: Load Context
|
|
16
|
+
1. Read `data/competitors.json` — all competitor pricing data
|
|
17
|
+
2. Read `data/business-context.json` — our current pricing and monetization
|
|
18
|
+
3. Read `data/positioning.json` — our target audience and differentiators
|
|
19
|
+
4. Read `data/hypotheses.json` — existing pricing hypotheses
|
|
20
|
+
|
|
21
|
+
### Step 2: Gather Pricing Data
|
|
22
|
+
If competitor pricing data is incomplete, run WebSearch:
|
|
23
|
+
- `"[product category] pricing [year]"`
|
|
24
|
+
- `"how much does [similar product] cost"`
|
|
25
|
+
- `"[product category] pricing benchmarks SaaS"`
|
|
26
|
+
- For each competitor missing pricing: `"[competitor name] pricing"`
|
|
27
|
+
|
|
28
|
+
### Step 3: Value Metric Analysis
|
|
29
|
+
Identify what customers pay for in this market:
|
|
30
|
+
- Per seat/user?
|
|
31
|
+
- Per usage (API calls, messages, etc.)?
|
|
32
|
+
- Per feature tier?
|
|
33
|
+
- Flat rate?
|
|
34
|
+
|
|
35
|
+
Map value metrics across all competitors:
|
|
36
|
+
|
|
37
|
+
| Competitor | Model | Entry Price | Mid Tier | Enterprise | Free Tier |
|
|
38
|
+
|-----------|-------|------------|----------|------------|-----------|
|
|
39
|
+
| ... | per seat | $X/mo | $Y/mo | Custom | Yes/No |
|
|
40
|
+
|
|
41
|
+
### Step 4: Pricing Gap Analysis
|
|
42
|
+
Identify:
|
|
43
|
+
1. **Underpriced features** — things we offer that competitors charge more for
|
|
44
|
+
2. **Missing tiers** — market segments we're not addressing
|
|
45
|
+
3. **Anchoring opportunities** — how to frame our pricing against competitors
|
|
46
|
+
4. **Value perception** — is our pricing aligned with our positioning?
|
|
47
|
+
|
|
48
|
+
### Step 5: Pricing Psychology
|
|
49
|
+
Apply pricing psychology principles:
|
|
50
|
+
- **Anchoring**: should we add a decoy tier?
|
|
51
|
+
- **Charm pricing**: $99 vs $100 effects
|
|
52
|
+
- **Tier naming**: does our naming match our audience?
|
|
53
|
+
- **Feature gating**: what features should gate each tier?
|
|
54
|
+
- **Annual vs monthly**: optimal discount for annual billing
|
|
55
|
+
|
|
56
|
+
If needed, WebSearch for:
|
|
57
|
+
- `"SaaS pricing psychology best practices [year]"`
|
|
58
|
+
- `"pricing page conversion optimization"`
|
|
59
|
+
|
|
60
|
+
### Step 6: Generate Recommendations
|
|
61
|
+
Create specific pricing recommendations:
|
|
62
|
+
|
|
63
|
+
1. **Quick wins** — changes we can make immediately
|
|
64
|
+
2. **Tier restructuring** — if current tiers are suboptimal
|
|
65
|
+
3. **New pricing page** — if the pricing page needs redesign
|
|
66
|
+
4. **A/B test hypotheses** — experiments to validate pricing changes
|
|
67
|
+
|
|
68
|
+
### Step 7: Create Hypothesis
|
|
69
|
+
If pricing changes are recommended, create a hypothesis in `data/hypotheses.json`:
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"title": "Pricing change: [specific change]",
|
|
73
|
+
"statement": "If we [change], then [metric] will [improve] because [reason]",
|
|
74
|
+
"funnel_stage": "monetization",
|
|
75
|
+
"priority": "high",
|
|
76
|
+
"effort_to_test": "s",
|
|
77
|
+
"tags": ["pricing"]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Step 8: Output
|
|
82
|
+
Print:
|
|
83
|
+
- Competitive pricing comparison table
|
|
84
|
+
- Value metric analysis
|
|
85
|
+
- Current pricing assessment (underpriced / overpriced / well-positioned)
|
|
86
|
+
- Top 3 pricing recommendations with rationale
|
|
87
|
+
- Expected revenue impact
|
|
88
|
+
- A/B test hypothesis (if generated)
|
|
89
|
+
|
|
90
|
+
## Output Files
|
|
91
|
+
- `data/hypotheses.json` — pricing test hypotheses (if applicable)
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# /promo-copy — Positioning-Driven Promotional Copy Generator
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/promo-copy tweet-ship # Ship announcement tweet (≤280 chars)
|
|
6
|
+
/promo-copy tweet-milestone # KPI milestone tweet
|
|
7
|
+
/promo-copy tweet-update # Product update tweet
|
|
8
|
+
/promo-copy tweet-thread # Multi-tweet thread (3-5 tweets)
|
|
9
|
+
/promo-copy ad-google {keyword} # Google Ads copy (3 headlines + 2 descriptions)
|
|
10
|
+
/promo-copy ad-meta {audience} # Meta/Instagram ad copy
|
|
11
|
+
/promo-copy linkedin # LinkedIn post (≤3000 chars)
|
|
12
|
+
/promo-copy landing {slug} # Landing page copy block
|
|
13
|
+
/promo-copy email-subject {campaign} # 5 email subject line variations
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Input
|
|
17
|
+
- `$ARGUMENTS` — required: copy type and optional parameters
|
|
18
|
+
|
|
19
|
+
## Process
|
|
20
|
+
|
|
21
|
+
Parse `$ARGUMENTS` to determine the copy type. The first token is the type, the rest are parameters.
|
|
22
|
+
|
|
23
|
+
## Positioning Integration (Required)
|
|
24
|
+
|
|
25
|
+
Before writing ANY copy, load `data/positioning.json` and extract:
|
|
26
|
+
- **Pain points** — Lead with the most relevant one for this channel/audience
|
|
27
|
+
- **Messaging pillars** — Weave 1-2 into the copy naturally
|
|
28
|
+
- **Objection handlers** — Preempt 1 relevant objection where appropriate
|
|
29
|
+
- **Social proof** — Include 1 credibility anchor (user count, shipped features, market validation)
|
|
30
|
+
- **CTA bank** — Pull CTAs from positioning rather than inventing generic ones
|
|
31
|
+
- **Headlines/Tagline** — Use copy_bank headlines as inspiration
|
|
32
|
+
- **Tone** — Match the founder's voice from positioning (confident, technical, direct)
|
|
33
|
+
|
|
34
|
+
Also load:
|
|
35
|
+
- `data/ideas.json` — For ship/milestone tweets, get specific feature details
|
|
36
|
+
- `data/goals.json` — For milestone copy, get KPI data
|
|
37
|
+
- `data/business-context.json` — Product info, audience, value proposition
|
|
38
|
+
|
|
39
|
+
## Copy Quality Rules
|
|
40
|
+
|
|
41
|
+
These rules apply to ALL copy types. They override generic instincts.
|
|
42
|
+
|
|
43
|
+
### Tone & Voice
|
|
44
|
+
- **Founder voice** — Write as a person, not a brand or marketing department
|
|
45
|
+
- **Confident, not hype** — "This changes how you work" not "We're SO excited!!!"
|
|
46
|
+
- **Technical credibility** — Don't dumb things down for developers
|
|
47
|
+
- **Respect the reader** — If it can be said in fewer words, do it
|
|
48
|
+
- **No corporate speak** — No "leverage", "synergy", "ecosystem", "revolutionize"
|
|
49
|
+
|
|
50
|
+
### CTA Rules
|
|
51
|
+
- First-person verbs: "Start my analysis" not "Get started"
|
|
52
|
+
- Be specific: "Run your first analysis" not "Learn more"
|
|
53
|
+
- One CTA per copy piece (except threads/landing pages)
|
|
54
|
+
|
|
55
|
+
### Banned Phrases
|
|
56
|
+
- "Game-changer", "Revolutionize", "Disrupt"
|
|
57
|
+
- "We're excited to announce"
|
|
58
|
+
- "Stay tuned", "Watch this space"
|
|
59
|
+
- "It's that simple" (if it takes more than 1 step, it's not)
|
|
60
|
+
- Generic hashtags like #startup #entrepreneur (use specific ones)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### Type: `tweet-ship`
|
|
65
|
+
|
|
66
|
+
Generate a "just shipped" tweet for the most recently shipped idea.
|
|
67
|
+
|
|
68
|
+
1. Load the most recently shipped idea from `data/ideas.json`
|
|
69
|
+
2. Write 3 tweet variations (pick the best one):
|
|
70
|
+
- **Hook-first**: Lead with the problem it solves, then reveal the feature
|
|
71
|
+
- **Result-first**: Lead with the outcome, then explain what shipped
|
|
72
|
+
- **Story-first**: Brief build narrative → what shipped → result
|
|
73
|
+
3. Include: the feature name, what it does for users, 1-2 relevant hashtags
|
|
74
|
+
4. Must be ≤280 characters
|
|
75
|
+
5. Tone: excited but authentic, build-in-public energy
|
|
76
|
+
|
|
77
|
+
### Type: `tweet-milestone`
|
|
78
|
+
|
|
79
|
+
Generate a milestone celebration tweet.
|
|
80
|
+
|
|
81
|
+
1. Load KPI data from `data/goals.json` — find KPIs at or above target
|
|
82
|
+
2. Write the tweet: metric + achievement + what it means + hashtag
|
|
83
|
+
3. Include a forward-looking hook: "Next target: ..."
|
|
84
|
+
4. Must be ≤280 characters
|
|
85
|
+
|
|
86
|
+
### Type: `tweet-update`
|
|
87
|
+
|
|
88
|
+
Generate a product update tweet from positioning data.
|
|
89
|
+
|
|
90
|
+
1. Lead with tagline or value proposition hook
|
|
91
|
+
2. Include 1 specific differentiator
|
|
92
|
+
3. End with CTA or hashtag
|
|
93
|
+
4. Must be ≤280 characters
|
|
94
|
+
|
|
95
|
+
### Type: `tweet-thread`
|
|
96
|
+
|
|
97
|
+
Generate a 3-5 tweet thread on a positioning topic.
|
|
98
|
+
|
|
99
|
+
1. Tweet 1: Hook (pain point or bold claim)
|
|
100
|
+
2. Tweet 2-3: Evidence/story (what you built, why it's different)
|
|
101
|
+
3. Tweet 4: Social proof or result
|
|
102
|
+
4. Tweet 5: CTA
|
|
103
|
+
5. Each tweet ≤280 characters, numbered with emoji (1/, 2/, etc.)
|
|
104
|
+
|
|
105
|
+
### Type: `ad-google {keyword}`
|
|
106
|
+
|
|
107
|
+
Generate Google Ads copy for a target keyword.
|
|
108
|
+
|
|
109
|
+
1. **3 Headlines** (max 30 characters each):
|
|
110
|
+
- H1: Keyword + core benefit
|
|
111
|
+
- H2: Differentiator
|
|
112
|
+
- H3: Social proof or urgency
|
|
113
|
+
2. **2 Descriptions** (max 90 characters each):
|
|
114
|
+
- D1: Expand on benefit, address pain point
|
|
115
|
+
- D2: CTA + differentiator
|
|
116
|
+
3. Include the keyword naturally (no keyword stuffing)
|
|
117
|
+
|
|
118
|
+
### Type: `ad-meta {audience}`
|
|
119
|
+
|
|
120
|
+
Generate Meta/Instagram ad copy.
|
|
121
|
+
|
|
122
|
+
1. **Primary text** (125 chars ideal, 250 max): Hook + benefit + CTA
|
|
123
|
+
2. **Headline** (40 chars max): Core value proposition
|
|
124
|
+
3. **Description** (30 chars max): Supporting detail
|
|
125
|
+
4. **CTA button**: Choose from (Learn More, Sign Up, Get Started, Try Free)
|
|
126
|
+
5. Write for the specified audience segment
|
|
127
|
+
|
|
128
|
+
### Type: `linkedin`
|
|
129
|
+
|
|
130
|
+
Generate a LinkedIn post for professional audience.
|
|
131
|
+
|
|
132
|
+
1. **Hook line** (first line visible before "see more"): Bold claim or question
|
|
133
|
+
2. **Body** (500-1500 chars): Problem → solution → proof → insight
|
|
134
|
+
3. **CTA**: Engagement prompt ("What's your take?" or link to product)
|
|
135
|
+
4. Format: Short paragraphs, line breaks between thoughts, 1-2 emoji max
|
|
136
|
+
5. Total ≤3000 characters
|
|
137
|
+
|
|
138
|
+
### Type: `landing {slug}`
|
|
139
|
+
|
|
140
|
+
Generate a landing page copy block.
|
|
141
|
+
|
|
142
|
+
1. **Headline** (8-12 words): Outcome-focused, addresses primary pain point
|
|
143
|
+
2. **Subheadline** (15-25 words): How the product delivers that outcome
|
|
144
|
+
3. **3 Benefits**: Icon-worthy phrases (3-8 words each) with 1-sentence descriptions
|
|
145
|
+
4. **CTA button text**: First-person, specific action
|
|
146
|
+
5. **Social proof line**: One credibility statement
|
|
147
|
+
|
|
148
|
+
### Type: `email-subject {campaign}`
|
|
149
|
+
|
|
150
|
+
Generate 5 email subject line variations for a campaign type.
|
|
151
|
+
|
|
152
|
+
1. Load campaign context from `data/email-campaigns/` if available
|
|
153
|
+
2. Generate 5 variations using these formulas:
|
|
154
|
+
- Curiosity + outcome
|
|
155
|
+
- Specific benefit + number
|
|
156
|
+
- Pattern interrupt
|
|
157
|
+
- Question format
|
|
158
|
+
- FOMO / urgency (authentic, not fake)
|
|
159
|
+
3. Each under 50 characters
|
|
160
|
+
4. Include preview text for each (50-90 chars)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Output
|
|
165
|
+
|
|
166
|
+
Save the generated copy to `data/copy/{type}-{slug}-{YYYY-MM-DD}.md`:
|
|
167
|
+
|
|
168
|
+
```markdown
|
|
169
|
+
# {Type} Copy — {Date}
|
|
170
|
+
|
|
171
|
+
## Metadata
|
|
172
|
+
- Type: {type}
|
|
173
|
+
- Generated: {date}
|
|
174
|
+
- Positioning version: {last_updated from positioning.json}
|
|
175
|
+
- Parameters: {any extra params}
|
|
176
|
+
|
|
177
|
+
## Copy
|
|
178
|
+
|
|
179
|
+
{The generated copy, clearly formatted}
|
|
180
|
+
|
|
181
|
+
## Variations
|
|
182
|
+
|
|
183
|
+
{Alternative versions if applicable}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Print a summary: copy preview, character count, file path.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# /promo-video — Promotional Video Generator (ContentFlow-AI Bridge)
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/promo-video ship {ideaId} # Generate ship announcement video from a shipped idea
|
|
6
|
+
/promo-video ad {topic} # Generate AI ad video (PAS/AIDA carousel → MP4)
|
|
7
|
+
/promo-video status # Check ContentFlow availability and list rendered videos
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — required: video type and parameters
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
Parse `$ARGUMENTS` to determine the video type. The first token is the type, the rest are parameters.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
### Type: `ship {ideaId}`
|
|
20
|
+
|
|
21
|
+
Generate a ship announcement video from idea data.
|
|
22
|
+
|
|
23
|
+
1. Load the idea from `data/ideas.json` by ID (or use the most recently shipped idea if no ID given)
|
|
24
|
+
2. Generate carousel JSON with slides: cover → problem → solution → key changes → CTA
|
|
25
|
+
3. Stage the carousel at `data/videos/staging/{ideaId}-ship.json`
|
|
26
|
+
4. Call ContentFlow-AI Remotion bridge to render MP4
|
|
27
|
+
5. Output saved to `data/videos/{ideaId}-ship.mp4`
|
|
28
|
+
|
|
29
|
+
Requires `contentflow.repo_path` configured in `data/business-context.json`.
|
|
30
|
+
|
|
31
|
+
### Type: `ad {topic}`
|
|
32
|
+
|
|
33
|
+
Generate an AI ad video for a topic.
|
|
34
|
+
|
|
35
|
+
1. Build a 5-slide carousel: cover → problem → solution → statistic → CTA
|
|
36
|
+
2. Stage the carousel at `data/videos/staging/ad-{topic}.json`
|
|
37
|
+
3. Render via ContentFlow
|
|
38
|
+
4. Output saved to `data/videos/`
|
|
39
|
+
|
|
40
|
+
### Type: `status`
|
|
41
|
+
|
|
42
|
+
Check the video pipeline status:
|
|
43
|
+
- Is ContentFlow-AI repo available?
|
|
44
|
+
- How many rendered videos exist?
|
|
45
|
+
- List recent videos with file sizes
|
|
46
|
+
- List staging carousel JSONs
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Prerequisites
|
|
51
|
+
|
|
52
|
+
- **ContentFlow-AI** repo must be cloned and its path set in `data/business-context.json`:
|
|
53
|
+
```json
|
|
54
|
+
{ "contentflow": { "repo_path": "/path/to/contentflow-ai" } }
|
|
55
|
+
```
|
|
56
|
+
- ContentFlow must have Remotion installed (`npx remotion render` must work)
|
|
57
|
+
|
|
58
|
+
## Instructions
|
|
59
|
+
|
|
60
|
+
Execute the video task by calling the skill:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { executePromoVideoTask } from './scripts/skills/promo-video';
|
|
64
|
+
|
|
65
|
+
// Ship video
|
|
66
|
+
await executePromoVideoTask('video-render-ship-{ideaId}', description, businessContext);
|
|
67
|
+
|
|
68
|
+
// Ad video
|
|
69
|
+
await executePromoVideoTask('video-render-ad-{topic}', description, businessContext);
|
|
70
|
+
|
|
71
|
+
// Status check
|
|
72
|
+
await executePromoVideoTask('video-check-status', '', businessContext);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Report the result back to the user. If ContentFlow is not configured, explain the setup steps.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# /research-competitors — Competitor Discovery & Intelligence
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/research-competitors # Discover + deep-research all (default)
|
|
6
|
+
/research-competitors discover # Only discover new competitors
|
|
7
|
+
/research-competitors refresh # Re-research all existing competitors
|
|
8
|
+
/research-competitors "CompetitorName" # Deep-dive on a single competitor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Input
|
|
12
|
+
- `$ARGUMENTS` — optional: "discover", "refresh", or a competitor name
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Step 1: Load Context
|
|
17
|
+
1. Read `data/business-context.json` — extract `product.name`, `product.summary`, and `competitors[]`
|
|
18
|
+
2. Read `data/competitors.json` — check existing competitor profiles
|
|
19
|
+
3. Determine mode from `$ARGUMENTS`:
|
|
20
|
+
- Empty or no args → full discovery + research
|
|
21
|
+
- `"discover"` → discovery only, skip deep research
|
|
22
|
+
- `"refresh"` → re-research all existing competitors
|
|
23
|
+
- Any other string → treat as competitor name for single deep-dive
|
|
24
|
+
|
|
25
|
+
### Step 2: Discovery Phase
|
|
26
|
+
**Skip if mode is "refresh" or single competitor.**
|
|
27
|
+
|
|
28
|
+
Use WebSearch to discover competitors. Run these searches:
|
|
29
|
+
1. `"[product category] competitors [year]"` — e.g., "legal tech platform competitors 2026"
|
|
30
|
+
2. `"[product category] alternatives"` — e.g., "legal tech platform alternatives"
|
|
31
|
+
3. `"best [product category] tools"` — e.g., "best legal tech tools"
|
|
32
|
+
4. Product-specific queries based on `product.summary` — e.g., "AI lawyer tools brazil", "legal tech SaaS"
|
|
33
|
+
|
|
34
|
+
From search results, identify 5-10 relevant competitors. For each, extract:
|
|
35
|
+
- Company name
|
|
36
|
+
- URL
|
|
37
|
+
- Brief description of what they do
|
|
38
|
+
|
|
39
|
+
Merge with any competitors already listed in `business-context.json` or `competitors.json`.
|
|
40
|
+
|
|
41
|
+
### Step 3: Deep Research Phase
|
|
42
|
+
For each competitor (or just the specified one in single mode):
|
|
43
|
+
|
|
44
|
+
1. **WebFetch** their homepage → extract:
|
|
45
|
+
- Headline / tagline
|
|
46
|
+
- Value proposition
|
|
47
|
+
- CTA texts
|
|
48
|
+
- Social proof (testimonials, logos, stats)
|
|
49
|
+
- Target audience signals
|
|
50
|
+
|
|
51
|
+
2. **WebSearch** for:
|
|
52
|
+
- `"[competitor name] pricing"` → pricing tiers, free tier
|
|
53
|
+
- `"[competitor name] reviews"` → strengths/weaknesses from users
|
|
54
|
+
- `"[competitor name] vs"` → how they position against alternatives
|
|
55
|
+
|
|
56
|
+
3. **Analyze** and structure:
|
|
57
|
+
- Positioning: tagline, value proposition, target audience, differentiators
|
|
58
|
+
- Copy: homepage headline, CTAs, social proof, objection handling
|
|
59
|
+
- Growth: channels used (SEO, paid, content, social), content types
|
|
60
|
+
- Product: key features, pricing tiers, free tier details
|
|
61
|
+
- SWOT: strengths, weaknesses, opportunities for us
|
|
62
|
+
|
|
63
|
+
### Step 4: Comparative Analysis
|
|
64
|
+
After researching all competitors:
|
|
65
|
+
1. Build a strengths/weaknesses comparison matrix
|
|
66
|
+
2. Identify positioning gaps — where is no competitor strong?
|
|
67
|
+
3. Identify underserved audience segments
|
|
68
|
+
4. Note opportunities for differentiation
|
|
69
|
+
|
|
70
|
+
### Step 5: Write Output
|
|
71
|
+
Write structured profiles to `data/competitors.json`. Use this schema:
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"last_updated": "YYYY-MM-DD",
|
|
75
|
+
"competitors": [
|
|
76
|
+
{
|
|
77
|
+
"id": "comp-001",
|
|
78
|
+
"name": "CompetitorX",
|
|
79
|
+
"url": "https://competitorx.com",
|
|
80
|
+
"last_researched": "YYYY-MM-DD",
|
|
81
|
+
"positioning": {
|
|
82
|
+
"tagline": "...",
|
|
83
|
+
"value_proposition": "...",
|
|
84
|
+
"target_audience": "...",
|
|
85
|
+
"differentiators": ["..."]
|
|
86
|
+
},
|
|
87
|
+
"copy": {
|
|
88
|
+
"homepage_headline": "...",
|
|
89
|
+
"cta_texts": ["..."],
|
|
90
|
+
"social_proof": ["..."],
|
|
91
|
+
"objection_handling": ["..."]
|
|
92
|
+
},
|
|
93
|
+
"growth": {
|
|
94
|
+
"channels": ["seo", "paid_search", "content"],
|
|
95
|
+
"content_types": ["blog", "ebook"],
|
|
96
|
+
"seo_keywords": ["..."]
|
|
97
|
+
},
|
|
98
|
+
"product": {
|
|
99
|
+
"features": ["..."],
|
|
100
|
+
"pricing_tiers": [{ "name": "...", "price": "...", "features": ["..."] }],
|
|
101
|
+
"free_tier": "..."
|
|
102
|
+
},
|
|
103
|
+
"strengths": ["..."],
|
|
104
|
+
"weaknesses": ["..."],
|
|
105
|
+
"opportunities_for_us": ["..."]
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Merge rules:**
|
|
112
|
+
- If a competitor already exists (match by name, case-insensitive), UPDATE their profile but preserve any manually added notes
|
|
113
|
+
- Generate sequential IDs: `comp-001`, `comp-002`, etc.
|
|
114
|
+
- Set `last_researched` to today's date
|
|
115
|
+
|
|
116
|
+
### Step 6: Print Summary
|
|
117
|
+
Print a competitive landscape summary:
|
|
118
|
+
- Number of competitors discovered/updated
|
|
119
|
+
- Key findings: who's strongest, where the gaps are
|
|
120
|
+
- Top 3 opportunities for differentiation
|
|
121
|
+
- Recommendation for next step (usually: run `/positioning`)
|
|
122
|
+
|
|
123
|
+
## Output Files
|
|
124
|
+
- `data/competitors.json` — structured competitor profiles
|