vibebusiness 1.2.83 → 1.2.85
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/.env +27 -14
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +87 -70
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +8 -8
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/routes-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +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 +2 -2
- package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/briefing/route.js +1 -0
- package/.next/standalone/.next/server/app/api/briefing/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/checkout/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js +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 +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 +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 +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 +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 +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 +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js +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 +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 +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 +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 +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 +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 +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 +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/investor-updates/generate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/license/route.js +1 -1
- package/.next/standalone/.next/server/app/api/portal/route.js +1 -1
- package/.next/standalone/.next/server/app/api/provider-status/route.js +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 +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 +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/webhook/route.js +1 -1
- package/.next/standalone/.next/server/app/briefing/page.js +1 -0
- package/.next/standalone/.next/server/app/briefing/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/briefing/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/goals/[id]/page.js +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page.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 +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.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page.js.nft.json +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 +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 +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/index.html +1 -0
- package/.next/standalone/.next/server/app/index.meta +6 -0
- package/.next/standalone/.next/server/app/index.rsc +6 -0
- package/.next/standalone/.next/server/app/kanban/page.js +1 -0
- package/.next/standalone/.next/server/app/kanban/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/kanban/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/page.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.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page.js.nft.json +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 +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 +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 +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 +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +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 +3 -3
- package/.next/standalone/.next/server/app/social/page.js +1 -1
- package/.next/standalone/.next/server/app/social/page.js.nft.json +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 +3 -3
- package/.next/standalone/.next/server/app/updates/[id]/page.js +1 -1
- 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.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 +3 -3
- package/.next/standalone/.next/server/app/updates/page.js +1 -1
- 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 +18 -15
- package/.next/standalone/.next/server/chunks/3098.js +1 -0
- package/.next/standalone/.next/server/chunks/3871.js +1 -1
- package/.next/standalone/.next/server/chunks/4355.js +1 -0
- package/.next/standalone/.next/server/chunks/4471.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- 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.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/codebase-snapshot.json +55 -42
- package/.next/standalone/data/config.json +16 -40
- package/.next/standalone/data/positioning.json +10 -127
- package/.next/standalone/data/sessions.json +56 -312
- package/.next/standalone/node_modules/@esbuild/{darwin-arm64 → darwin-x64}/bin/esbuild +0 -0
- package/.next/standalone/node_modules/@esbuild/{darwin-arm64 → darwin-x64}/package.json +3 -3
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/analyze.ts +35 -10
- package/.next/standalone/scripts/implement.ts +67 -17
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/templates/commands/distribution-google-ads.md +86 -0
- package/.next/standalone/templates/commands/distribution-meta-ads.md +106 -0
- package/.next/standalone/templates/commands/distribution-repurpose.md +121 -0
- package/.next/standalone/templates/commands/distribution-seo-content.md +115 -0
- package/.next/standalone/templates/commands/distribution-social-expansion.md +128 -0
- package/.next/static/chunks/147-b00f2ac2bbec93ae.js +1 -0
- package/.next/static/chunks/159-4ce492ccac6de8f7.js +1 -0
- package/.next/static/chunks/47-eba0f8b4f9b17641.js +1 -0
- package/.next/static/chunks/547-921898871311cd72.js +1 -0
- package/.next/static/chunks/619-2b2ff3b9eaef112c.js +1 -0
- package/.next/static/chunks/735-b33805b2b19d17ad.js +1 -0
- package/.next/static/chunks/879-7fbd95e93ddc4636.js +1 -0
- package/.next/static/chunks/930-330300153dfcbfc0.js +1 -0
- package/.next/static/chunks/app/briefing/page-683aba0c52e910d7.js +1 -0
- package/.next/static/chunks/app/goals/[id]/page-40818dc7e710eeda.js +1 -0
- package/.next/static/chunks/app/goals/page-f80a64a68854e357.js +1 -0
- package/.next/static/chunks/app/hypotheses/[id]/page-023c882fa395f3ed.js +1 -0
- package/.next/static/chunks/app/hypotheses/page-168748bde00e7d90.js +1 -0
- package/.next/static/chunks/app/ideas/[id]/page-5f33e0ecf590ddec.js +1 -0
- package/.next/static/chunks/app/kanban/page-4f18f1e4f56948a5.js +1 -0
- package/.next/static/chunks/app/layout-cd1571ba4ed4a0fa.js +1 -0
- package/.next/static/chunks/app/page-0a8b9a7b052e6eac.js +1 -0
- package/.next/static/chunks/app/roadmap/[id]/page-9ba8a537e30c633c.js +1 -0
- package/.next/static/chunks/app/roadmap/investors/{page-0095ea5695573796.js → page-a914223623f56df3.js} +1 -1
- package/.next/static/chunks/app/roadmap/page-30de1fdc304eb572.js +1 -0
- package/.next/static/chunks/app/roadmap/public/page-c481b3f9217919ac.js +1 -0
- package/.next/static/chunks/app/sessions/page-d7eefd2fd42b4d55.js +1 -0
- package/.next/static/chunks/app/settings/{page-3afa908a96ce4e51.js → page-caf6daf930e4f2c6.js} +1 -1
- package/.next/static/chunks/app/social/page-21daeca0cf8af46b.js +1 -0
- package/.next/static/chunks/app/updates/[id]/page-2807cd17ae4938d0.js +1 -0
- package/.next/static/chunks/app/updates/new/{page-dcc67ffca587dcc2.js → page-ac5b966024ce0ddc.js} +1 -1
- package/.next/static/chunks/app/updates/page-b6efcdaae7f4f6d2.js +1 -0
- package/.next/static/chunks/{main-6ee938c5db2d5eb4.js → main-3eb11800bc19ca7f.js} +1 -1
- package/.next/static/chunks/{main-app-f42d9aa726a818bf.js → main-app-06ab73909d2a44c7.js} +1 -1
- package/.next/static/chunks/webpack-616e068a201ad621.js +1 -0
- package/.next/static/css/ff70d16171b1c02c.css +3 -0
- package/dist/bin/vibebusiness.js +1 -0
- package/dist/scripts/analyze.js +128 -8
- package/dist/scripts/heartbeat.js +17 -1
- package/dist/scripts/implement.js +77 -15
- package/package.json +1 -1
- package/templates/commands/distribution-google-ads.md +86 -0
- package/templates/commands/distribution-meta-ads.md +106 -0
- package/templates/commands/distribution-repurpose.md +121 -0
- package/templates/commands/distribution-seo-content.md +115 -0
- package/templates/commands/distribution-social-expansion.md +128 -0
- package/.next/standalone/.next/server/chunks/6299.js +0 -1
- package/.next/standalone/.next/server/chunks/995.js +0 -1
- package/.next/standalone/data/.analysis-prompt.txt +0 -170
- package/.next/standalone/data/business-context.json +0 -187
- package/.next/standalone/data/competitors.json +0 -576
- package/.next/standalone/data/copy/landing-improvements-2026-02-20.md +0 -111
- package/.next/standalone/data/copy/landing-landing-page-2026-02-20.md +0 -68
- package/.next/standalone/data/email-campaigns/sequences/onboarding.md +0 -183
- package/.next/standalone/data/email-campaigns/welcome-2026-02-20.md +0 -42
- package/.next/standalone/data/goals.json +0 -439
- package/.next/standalone/data/heartbeat-sessions.json +0 -7550
- package/.next/standalone/data/hypotheses.json +0 -269
- package/.next/standalone/data/ideas.json +0 -10747
- package/.next/standalone/data/implementations.json +0 -3304
- package/.next/standalone/data/pages.json +0 -22
- package/.next/standalone/data/payments.json +0 -33
- package/.next/standalone/data/reports/visuals/idea-first-tweet-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-lp-hero-specificity-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-lp-og-meta-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-lp-social-proof-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-readme-landing-url-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-stripe-integration-card.png +0 -0
- package/.next/standalone/data/reports/visuals/promo-launch.png +0 -0
- package/.next/standalone/data/reports/visuals/promo-ship-fast.png +0 -0
- package/.next/standalone/data/reports/visuals/promo-while-you-slept-v2.png +0 -0
- package/.next/standalone/data/reports/visuals/promo-while-you-slept-v3.png +0 -0
- package/.next/standalone/data/reports/visuals/promo-while-you-slept.png +0 -0
- package/.next/standalone/data/social.json +0 -179
- package/.next/standalone/data/videos/ad-solo-founder-burnout.mp4 +0 -0
- package/.next/standalone/data/videos/staging/ad-solo-founder-burnout.json +0 -54
- 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/48519e014fdef8bfe40a0d447e90c96c/0.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/index.pack +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/static/chunks/280-fd1092f75f985b1e.js +0 -1
- package/.next/static/chunks/354-d5bc9619159f46c5.js +0 -1
- package/.next/static/chunks/429-8f4030371ebef5c3.js +0 -1
- package/.next/static/chunks/809-833fcb9fe6e81fd6.js +0 -1
- package/.next/static/chunks/827-6cf4bfc10d1ff0c7.js +0 -1
- package/.next/static/chunks/851-65b033bf38847cbb.js +0 -1
- package/.next/static/chunks/app/goals/[id]/page-231bb4daae0f06eb.js +0 -1
- package/.next/static/chunks/app/goals/page-4dfa36ac38853b88.js +0 -1
- package/.next/static/chunks/app/hypotheses/[id]/page-6ec09d5470557c18.js +0 -1
- package/.next/static/chunks/app/hypotheses/page-1732b7466579493e.js +0 -1
- package/.next/static/chunks/app/ideas/[id]/page-b3dfe1e61fc656a4.js +0 -1
- package/.next/static/chunks/app/layout-eeef7928298d2198.js +0 -1
- package/.next/static/chunks/app/page-3635a292b3d471c0.js +0 -1
- package/.next/static/chunks/app/roadmap/[id]/page-b93a96f017c8d3dd.js +0 -1
- package/.next/static/chunks/app/roadmap/page-eacd69a99fcfc658.js +0 -1
- package/.next/static/chunks/app/roadmap/public/page-6b791041894b76d2.js +0 -1
- package/.next/static/chunks/app/sessions/page-a56ea625acdfa13e.js +0 -1
- package/.next/static/chunks/app/social/page-5211c78a5f37df65.js +0 -1
- package/.next/static/chunks/app/updates/[id]/page-fa20533878416cd0.js +0 -1
- package/.next/static/chunks/app/updates/page-19a09d7046577f70.js +0 -1
- package/.next/static/chunks/webpack-a3c37fcbf859f6f9.js +0 -1
- package/.next/static/css/654766eb547c6bab.css +0 -3
- /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → COv1w-K5vJ1LbOqnlKgHv}/_buildManifest.js +0 -0
- /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → COv1w-K5vJ1LbOqnlKgHv}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# /distribution-meta-ads — Meta/Instagram Ads Campaign Playbook
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/distribution-meta-ads # Full campaign design
|
|
6
|
+
/distribution-meta-ads {audience} # Campaign for specific audience segment
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Input
|
|
10
|
+
- `$ARGUMENTS` — optional: specific audience segment to target
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
### Step 1: Load Context
|
|
15
|
+
1. Read `data/positioning.json` — value proposition, target audience, pain points
|
|
16
|
+
2. Read `data/business-context.json` — product name, funnels, KPIs
|
|
17
|
+
3. Read `data/competitors.json` — competitor ad strategies
|
|
18
|
+
|
|
19
|
+
### Step 2: Audience Research
|
|
20
|
+
Use WebSearch to find audience targeting opportunities:
|
|
21
|
+
- `"[product category] facebook ads benchmarks CPM CPC CPA [year]"`
|
|
22
|
+
- `"[product category] facebook ads targeting"`
|
|
23
|
+
- `"[target audience] interests facebook ads"`
|
|
24
|
+
|
|
25
|
+
Define audience segments:
|
|
26
|
+
|
|
27
|
+
**Segment 1: Interest-Based (Cold)**
|
|
28
|
+
- Interests: [product category tools], [competitor names], [related technologies]
|
|
29
|
+
- Demographics: [age range], [job titles if B2B]
|
|
30
|
+
- Estimated audience size
|
|
31
|
+
|
|
32
|
+
**Segment 2: Behavior-Based (Warm)**
|
|
33
|
+
- Behaviors: Technology early adopters, SaaS users, [industry-specific]
|
|
34
|
+
- Layered with interests for precision
|
|
35
|
+
|
|
36
|
+
**Segment 3: Retargeting (Hot)**
|
|
37
|
+
- Website visitors (last 30 days) who didn't convert
|
|
38
|
+
- Pricing page visitors (last 14 days)
|
|
39
|
+
- Blog readers (last 60 days)
|
|
40
|
+
|
|
41
|
+
**Segment 4: Lookalike**
|
|
42
|
+
- Based on existing signups/customers
|
|
43
|
+
- 1% lookalike for precision, 3-5% for reach
|
|
44
|
+
|
|
45
|
+
### Step 3: Campaign Structure
|
|
46
|
+
Design campaigns following Meta Ads best practices:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Campaign: [Product] — Conversions
|
|
50
|
+
├── Ad Set: Interest-Based (Cold)
|
|
51
|
+
│ ├── Audience: [interests + demographics]
|
|
52
|
+
│ ├── Placement: Feed + Stories (auto)
|
|
53
|
+
│ └── Budget: $5/day
|
|
54
|
+
├── Ad Set: Retargeting (Hot)
|
|
55
|
+
│ ├── Audience: Website visitors 30d, excl. signups
|
|
56
|
+
│ ├── Placement: Feed + Stories (auto)
|
|
57
|
+
│ └── Budget: $3/day
|
|
58
|
+
└── Ad Set: Lookalike 1%
|
|
59
|
+
├── Audience: Lookalike of signups
|
|
60
|
+
├── Placement: Feed + Stories (auto)
|
|
61
|
+
└── Budget: $5/day
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Step 4: Generate Ad Copy
|
|
65
|
+
For each audience segment, queue copy generation:
|
|
66
|
+
- `/promo-copy ad-meta {audience}` — generates primary text + headline + CTA
|
|
67
|
+
- Match messaging to audience temperature (cold=educate, warm=convince, hot=convert)
|
|
68
|
+
|
|
69
|
+
### Step 5: Creative Format Recommendations
|
|
70
|
+
For each ad set, recommend creative format:
|
|
71
|
+
- **Cold audiences:** Carousel (3-5 feature cards) or short video (15-30s)
|
|
72
|
+
- **Retargeting:** Single image with social proof / testimonial
|
|
73
|
+
- **Lookalike:** Video demo or before/after comparison
|
|
74
|
+
|
|
75
|
+
If video skills are available, queue `/promo-video ad-{topic}` for video creatives.
|
|
76
|
+
|
|
77
|
+
### Step 6: Budget & Schedule
|
|
78
|
+
- **Total daily budget:** $10-15/day starting
|
|
79
|
+
- **Split:** 40% cold, 20% retargeting, 40% lookalike
|
|
80
|
+
- **Schedule:** Run 7 days, then evaluate
|
|
81
|
+
- **Dayparting:** If relevant, focus on business hours for B2B
|
|
82
|
+
|
|
83
|
+
### Step 7: A/B Test Plan
|
|
84
|
+
For each ad set:
|
|
85
|
+
- Test 2-3 ad copy variations
|
|
86
|
+
- Test 2 creative formats (image vs carousel vs video)
|
|
87
|
+
- Measure for 7 days before declaring winner
|
|
88
|
+
- Winning criteria: lowest CPA or highest CTR (depending on objective)
|
|
89
|
+
|
|
90
|
+
### Step 8: Tracking
|
|
91
|
+
- UTM parameters: `utm_source=meta&utm_medium=paid&utm_campaign={campaign-slug}&utm_content={ad-set}`
|
|
92
|
+
- Pixel events: ViewContent, Lead, CompleteRegistration
|
|
93
|
+
- CAPI (Conversions API) setup recommendation if not configured
|
|
94
|
+
|
|
95
|
+
### Step 9: Output
|
|
96
|
+
For each campaign, create an idea in `data/ideas.json` with:
|
|
97
|
+
- Category: "growth"
|
|
98
|
+
- Tags: ["growth", "meta-ads", "{audience-segment}"]
|
|
99
|
+
- Implementation plan with campaign structure
|
|
100
|
+
- Success metrics: impressions, reach, CPM, CPC, CTR, conversions, CPA
|
|
101
|
+
- Budget recommendation
|
|
102
|
+
- Queue `copy-ad-meta-{audience}` tasks
|
|
103
|
+
|
|
104
|
+
## Output Files
|
|
105
|
+
- `data/ideas.json` — new Meta Ads campaign ideas
|
|
106
|
+
- `data/campaigns/` — campaign briefs (optional)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# /distribution-repurpose — Content Repurposing Pipeline
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/distribution-repurpose # Repurpose latest shipped idea
|
|
6
|
+
/distribution-repurpose {idea-id} # Repurpose specific shipped idea
|
|
7
|
+
/distribution-repurpose --content="..." # Repurpose arbitrary content
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
- `$ARGUMENTS` — optional: idea ID or content to repurpose
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
### Step 1: Load Source Content
|
|
16
|
+
1. If idea ID provided, read from `data/ideas.json`
|
|
17
|
+
2. If no argument, find the most recently shipped idea
|
|
18
|
+
3. Read `data/positioning.json` — messaging pillars for consistent voice
|
|
19
|
+
4. Read `data/social.json` — understand which platforms are active
|
|
20
|
+
|
|
21
|
+
Extract from source:
|
|
22
|
+
- **Title/headline** — the main hook
|
|
23
|
+
- **Key insight** — what's new/interesting
|
|
24
|
+
- **Target audience** — who cares about this
|
|
25
|
+
- **Technical details** — for dev-focused channels
|
|
26
|
+
- **Business impact** — for business-focused channels
|
|
27
|
+
- **Visual assets** — screenshots, diagrams, ship cards
|
|
28
|
+
|
|
29
|
+
### Step 2: Generate Channel-Specific Adaptations
|
|
30
|
+
|
|
31
|
+
For each active channel, create a tailored version:
|
|
32
|
+
|
|
33
|
+
#### Twitter/X Thread (5-7 tweets)
|
|
34
|
+
- Tweet 1: Hook — the most surprising/valuable insight
|
|
35
|
+
- Tweet 2-5: Story arc — problem → solution → result → detail
|
|
36
|
+
- Tweet 6: Takeaway or lesson learned
|
|
37
|
+
- Tweet 7: CTA with link + UTM
|
|
38
|
+
- Use patterns from `ai-content-generator.ts` (hooks, engagement patterns)
|
|
39
|
+
- Queue: `social-draft-thread-{topic}`
|
|
40
|
+
|
|
41
|
+
#### LinkedIn Post (Professional angle)
|
|
42
|
+
- Opening line: Pattern interrupt or contrarian take
|
|
43
|
+
- Body: "Here's what I learned building [feature]..."
|
|
44
|
+
- Formatting: Short paragraphs, line breaks, no hashtag spam
|
|
45
|
+
- CTA: Soft — "What's your experience with [topic]?"
|
|
46
|
+
- Queue: `copy-social-linkedin`
|
|
47
|
+
|
|
48
|
+
#### Reddit Post (Value-first, subreddit-adapted)
|
|
49
|
+
- Title: Question or insight format (NOT promotional)
|
|
50
|
+
- Body: Genuine story, metrics shared transparently, lessons learned
|
|
51
|
+
- Adapt tone to target subreddit (technical for r/programming, casual for r/SideProject)
|
|
52
|
+
- Link in context only, never as main content
|
|
53
|
+
- Queue: idea with tags ["growth", "reddit", "{subreddit}"]
|
|
54
|
+
|
|
55
|
+
#### Google Ads Keyword Group
|
|
56
|
+
- Map content to search intent keywords
|
|
57
|
+
- If content solves a problem → target "[problem] solution" keywords
|
|
58
|
+
- If content is a comparison → target "[product] vs [competitor]" keywords
|
|
59
|
+
- Queue: `copy-ad-google-{keyword}`
|
|
60
|
+
|
|
61
|
+
#### Meta Retargeting Ad
|
|
62
|
+
- Target: People who visited the content page but didn't convert
|
|
63
|
+
- Creative: Key visual from the content + social proof
|
|
64
|
+
- CTA: Return to complete signup
|
|
65
|
+
- Queue: `copy-ad-meta-retargeting-{content-slug}`
|
|
66
|
+
|
|
67
|
+
#### Email Newsletter Segment
|
|
68
|
+
- Subject line: Hook adapted for email (curiosity gap)
|
|
69
|
+
- Body: Summary with "read more" link
|
|
70
|
+
- Segment: Users interested in [topic]
|
|
71
|
+
- Queue: `email-blast-{campaign-slug}` or include in next digest
|
|
72
|
+
|
|
73
|
+
#### Indie Hackers / Dev.to Post
|
|
74
|
+
- Longer form, more transparent about metrics and journey
|
|
75
|
+
- Include code snippets if technical
|
|
76
|
+
- End with question to encourage discussion
|
|
77
|
+
- Cross-post with canonical URL to own blog
|
|
78
|
+
|
|
79
|
+
### Step 3: UTM Attribution Matrix
|
|
80
|
+
Each adaptation gets consistent tracking:
|
|
81
|
+
|
|
82
|
+
| Channel | utm_source | utm_medium | utm_campaign |
|
|
83
|
+
|---------|-----------|-----------|-------------|
|
|
84
|
+
| Twitter/X | twitter | social | {content-slug} |
|
|
85
|
+
| LinkedIn | linkedin | social | {content-slug} |
|
|
86
|
+
| Reddit | reddit | community | {content-slug} |
|
|
87
|
+
| Google Ads | google | cpc | {content-slug} |
|
|
88
|
+
| Meta Ads | meta | paid | retarget-{content-slug} |
|
|
89
|
+
| Email | email | newsletter | {content-slug} |
|
|
90
|
+
| Indie Hackers | indiehackers | community | {content-slug} |
|
|
91
|
+
| Dev.to | devto | blog | {content-slug} |
|
|
92
|
+
|
|
93
|
+
### Step 4: Publishing Schedule
|
|
94
|
+
Stagger publishing for maximum reach:
|
|
95
|
+
|
|
96
|
+
| Day | Channel | Why |
|
|
97
|
+
|-----|---------|-----|
|
|
98
|
+
| Day 0 | Twitter thread | Immediate, test the hook |
|
|
99
|
+
| Day 1 | LinkedIn post | Business hours reach |
|
|
100
|
+
| Day 2 | Reddit post | Different audience, value-first |
|
|
101
|
+
| Day 3 | Email newsletter | Owned channel, reliable |
|
|
102
|
+
| Day 5 | Dev.to / IH post | Long-form, search indexed |
|
|
103
|
+
| Day 7 | Google Ads | If content validates search intent |
|
|
104
|
+
| Ongoing | Meta retargeting | Runs continuously for page visitors |
|
|
105
|
+
|
|
106
|
+
### Step 5: Output
|
|
107
|
+
Create ideas in `data/ideas.json` for each channel adaptation:
|
|
108
|
+
- Category: "growth"
|
|
109
|
+
- Tags: ["growth", "repurpose", "{channel}", "{source-idea-id}"]
|
|
110
|
+
- Implementation plan with channel-specific content draft
|
|
111
|
+
- Success metrics: channel-specific (impressions, clicks, referral signups)
|
|
112
|
+
- Queue relevant tasks for each channel
|
|
113
|
+
|
|
114
|
+
Print summary:
|
|
115
|
+
- Source content: [title]
|
|
116
|
+
- Adaptations generated: [count]
|
|
117
|
+
- Channels covered: [list]
|
|
118
|
+
- Tasks queued: [list]
|
|
119
|
+
|
|
120
|
+
## Output Files
|
|
121
|
+
- `data/ideas.json` — repurposed content campaign ideas
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# /distribution-seo-content — SEO Content Machine Playbook
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/distribution-seo-content # Full SEO content strategy
|
|
6
|
+
/distribution-seo-content comparison # Comparison pages only
|
|
7
|
+
/distribution-seo-content alternatives # Alternative pages only
|
|
8
|
+
/distribution-seo-content howto # How-to guides only
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Input
|
|
12
|
+
- `$ARGUMENTS` — optional: specific content type to focus on
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Step 1: Load Context
|
|
17
|
+
1. Read `data/competitors.json` — competitor names, SEO keywords, features
|
|
18
|
+
2. Read `data/positioning.json` — our differentiators, target audience, pain points
|
|
19
|
+
3. Read `data/business-context.json` — product name, category, funnels
|
|
20
|
+
4. Read `data/pages.json` — existing pages to avoid duplication
|
|
21
|
+
|
|
22
|
+
### Step 2: Keyword Research
|
|
23
|
+
Use WebSearch to find keyword opportunities:
|
|
24
|
+
|
|
25
|
+
**Comparison Keywords:**
|
|
26
|
+
- `"[product] vs [competitor]"` — for each competitor
|
|
27
|
+
- `"[product] vs [competitor] comparison"` — check if these pages rank
|
|
28
|
+
- `"[competitor] alternative"` — capture competitor-dissatisfied users
|
|
29
|
+
|
|
30
|
+
**Alternative Keywords:**
|
|
31
|
+
- `"best [product category] tools [year]"`
|
|
32
|
+
- `"[product category] alternatives"`
|
|
33
|
+
- `"[incumbent] alternatives"` — for each major player
|
|
34
|
+
- `"top [product category] software"`
|
|
35
|
+
|
|
36
|
+
**Problem-Aware Keywords:**
|
|
37
|
+
- `"how to [solve pain point]"`
|
|
38
|
+
- `"how to [use case] with AI"`
|
|
39
|
+
- `"[pain point] solution for [target audience]"`
|
|
40
|
+
|
|
41
|
+
**Use-Case Keywords:**
|
|
42
|
+
- `"[product category] for [persona]"` (e.g., "AI product manager for solo founders")
|
|
43
|
+
- `"[product category] for [industry]"`
|
|
44
|
+
|
|
45
|
+
For each keyword, estimate via WebSearch:
|
|
46
|
+
- Monthly search volume
|
|
47
|
+
- Competition level
|
|
48
|
+
- Current top-ranking pages (to understand content expectations)
|
|
49
|
+
- Search intent (informational/commercial/transactional)
|
|
50
|
+
|
|
51
|
+
### Step 3: Classify Keywords by Intent
|
|
52
|
+
Group keywords into content types:
|
|
53
|
+
|
|
54
|
+
| Intent | Content Type | Priority | Example |
|
|
55
|
+
|--------|-------------|----------|---------|
|
|
56
|
+
| Commercial | Comparison page | High | "[Product] vs [Competitor]" |
|
|
57
|
+
| Commercial | Alternative page | High | "Best [category] tools" |
|
|
58
|
+
| Informational | How-to guide | Medium | "How to [solve problem]" |
|
|
59
|
+
| Informational | Use-case page | Medium | "[Product] for [persona]" |
|
|
60
|
+
| Transactional | Landing page | High | "[Product category] software" |
|
|
61
|
+
|
|
62
|
+
### Step 4: Content Briefs (Top 10 Keywords)
|
|
63
|
+
For each high-priority keyword, generate a content brief:
|
|
64
|
+
|
|
65
|
+
**Comparison Pages ("[Product] vs [Competitor]"):**
|
|
66
|
+
- H1: "[Product] vs [Competitor]: [Key Difference]"
|
|
67
|
+
- Sections: Overview, Feature comparison table, Pricing, Pros/cons, Use cases, Verdict
|
|
68
|
+
- Schema markup: Product, Review, FAQ
|
|
69
|
+
- Internal links to feature pages and pricing
|
|
70
|
+
- CTA: "Try [Product] free" with UTM
|
|
71
|
+
|
|
72
|
+
**Alternative Pages ("Best [category] tools"):**
|
|
73
|
+
- H1: "Best [Category] Tools in [Year]: Complete Guide"
|
|
74
|
+
- Sections: Our picks (us first), detailed reviews, comparison table, how to choose
|
|
75
|
+
- Schema markup: ItemList, Product
|
|
76
|
+
- Include 5-8 tools (us + competitors)
|
|
77
|
+
- CTA: "Start with [Product]" with UTM
|
|
78
|
+
|
|
79
|
+
**How-To Guides:**
|
|
80
|
+
- H1: "How to [Solve Problem] with [Product]"
|
|
81
|
+
- Sections: Problem statement, Step-by-step solution, Screenshots, FAQ
|
|
82
|
+
- Schema markup: HowTo, FAQ
|
|
83
|
+
- Internal links to relevant feature pages
|
|
84
|
+
- CTA: contextual within the guide
|
|
85
|
+
|
|
86
|
+
**Use-Case Pages:**
|
|
87
|
+
- H1: "[Product] for [Persona]: [Key Benefit]"
|
|
88
|
+
- Sections: Pain points for persona, How [Product] solves them, Testimonials, Pricing
|
|
89
|
+
- Schema markup: Product, FAQ
|
|
90
|
+
- Tailored messaging per persona
|
|
91
|
+
|
|
92
|
+
### Step 5: Internal Linking Strategy
|
|
93
|
+
- Each new page links to 2-3 existing pages
|
|
94
|
+
- Update existing pages to link to new content
|
|
95
|
+
- Create a hub-and-spoke structure around main category page
|
|
96
|
+
- Ensure all comparison pages link to pricing
|
|
97
|
+
|
|
98
|
+
### Step 6: Schema Markup
|
|
99
|
+
For each page type, include:
|
|
100
|
+
- **Comparison:** Product schema for both products, FAQ schema
|
|
101
|
+
- **Alternative:** ItemList schema, Product schema per item
|
|
102
|
+
- **How-to:** HowTo schema with steps, FAQ schema
|
|
103
|
+
- **Use-case:** Product schema, FAQ schema
|
|
104
|
+
|
|
105
|
+
### Step 7: Output
|
|
106
|
+
For each content piece, create an idea in `data/ideas.json`:
|
|
107
|
+
- Category: "growth"
|
|
108
|
+
- Tags: ["growth", "seo", "{content-type}", "{target-keyword}"]
|
|
109
|
+
- Implementation plan with content brief
|
|
110
|
+
- Success metrics: organic traffic, keyword ranking, time on page, conversion rate
|
|
111
|
+
- Queue `/build-page {slug}` for top priority pages
|
|
112
|
+
- UTM: `utm_source=organic&utm_medium=seo&utm_campaign={page-slug}`
|
|
113
|
+
|
|
114
|
+
## Output Files
|
|
115
|
+
- `data/ideas.json` — SEO content machine ideas
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# /distribution-social-expansion — Multi-Platform Social Media Playbook
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
```
|
|
5
|
+
/distribution-social-expansion # Full multi-platform expansion plan
|
|
6
|
+
/distribution-social-expansion linkedin # LinkedIn-specific plan
|
|
7
|
+
/distribution-social-expansion reddit # Reddit-specific plan
|
|
8
|
+
/distribution-social-expansion communities # Indie Hackers, Dev.to, Hashnode plan
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Input
|
|
12
|
+
- `$ARGUMENTS` — optional: specific platform to focus on
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Step 1: Load Context
|
|
17
|
+
1. Read `data/positioning.json` — value proposition, target audience, messaging pillars
|
|
18
|
+
2. Read `data/business-context.json` — product name, social config status
|
|
19
|
+
3. Read `data/social.json` — current Twitter/X presence, draft history, engagement metrics
|
|
20
|
+
4. Read `data/ideas.json` — recently shipped ideas (content fuel)
|
|
21
|
+
|
|
22
|
+
### Step 2: Audit Current Presence
|
|
23
|
+
- Check Twitter/X status (configured, post count, engagement rates)
|
|
24
|
+
- Identify what content performs best on Twitter/X (analyze engagement_history if available)
|
|
25
|
+
- Note content gaps: what platforms are we NOT on?
|
|
26
|
+
|
|
27
|
+
### Step 3: Platform-Specific Expansion Plans
|
|
28
|
+
|
|
29
|
+
#### LinkedIn Strategy
|
|
30
|
+
**Content Pillars:**
|
|
31
|
+
- Build-in-public updates (40%) — what we shipped, metrics, learnings
|
|
32
|
+
- Industry insights (30%) — trends, analysis, opinions on [product category]
|
|
33
|
+
- Product updates (20%) — feature announcements, use cases
|
|
34
|
+
- Engagement posts (10%) — polls, questions, community interaction
|
|
35
|
+
|
|
36
|
+
**Posting Cadence:**
|
|
37
|
+
- 3x/week: Tuesday (build-in-public), Thursday (industry insight), Saturday (product update)
|
|
38
|
+
- Best times: 8-10am and 12-1pm local time (weekdays)
|
|
39
|
+
|
|
40
|
+
**Post Formats:**
|
|
41
|
+
- Text-only with line breaks (highest organic reach)
|
|
42
|
+
- Carousel documents for tutorials/frameworks
|
|
43
|
+
- Short video clips for demos
|
|
44
|
+
|
|
45
|
+
**Copy Generation:**
|
|
46
|
+
- Queue `copy-social-linkedin` for each content pillar
|
|
47
|
+
- Adapt existing Twitter threads into LinkedIn format
|
|
48
|
+
|
|
49
|
+
#### Reddit Strategy
|
|
50
|
+
**Subreddit Research (MANDATORY WebSearch):**
|
|
51
|
+
- Search: "[product category] subreddit"
|
|
52
|
+
- Search: "best subreddits for [target audience]"
|
|
53
|
+
- Search: "reddit [product category] marketing"
|
|
54
|
+
|
|
55
|
+
For each subreddit found:
|
|
56
|
+
- Check subscriber count and activity level
|
|
57
|
+
- Read top 10 posts to understand tone and rules
|
|
58
|
+
- Identify content angles that get upvoted
|
|
59
|
+
- Note self-promotion rules (most subs ban direct promotion)
|
|
60
|
+
|
|
61
|
+
**Target Subreddits (find 5-10):**
|
|
62
|
+
- r/SideProject — "What I built" posts
|
|
63
|
+
- r/SaaS — SaaS-specific discussions
|
|
64
|
+
- r/[product-category] — domain-specific subreddits
|
|
65
|
+
- r/startups — startup journey updates
|
|
66
|
+
- r/Entrepreneur — business insights
|
|
67
|
+
- r/[technology] — tech stack communities
|
|
68
|
+
|
|
69
|
+
**Content Approach:**
|
|
70
|
+
- Value-first: share genuine insights, help others, answer questions
|
|
71
|
+
- NO self-promotion in titles or early in posts
|
|
72
|
+
- Story format: "Here's what I learned building [product]..."
|
|
73
|
+
- Comment engagement: reply to relevant threads with expertise
|
|
74
|
+
- Posting cadence: 2-3x/week across different subreddits
|
|
75
|
+
|
|
76
|
+
#### Indie Hackers / Dev.to / Hashnode
|
|
77
|
+
**Indie Hackers:**
|
|
78
|
+
- "What I built" launch post — product story + metrics
|
|
79
|
+
- Monthly milestone updates — revenue, users, learnings
|
|
80
|
+
- Engage in comments on others' projects
|
|
81
|
+
- Posting cadence: 1-2x/month
|
|
82
|
+
|
|
83
|
+
**Dev.to / Hashnode:**
|
|
84
|
+
- Technical tutorials from shipped features
|
|
85
|
+
- "How we built [feature] with [technology]" posts
|
|
86
|
+
- Cross-post from blog (with canonical URL)
|
|
87
|
+
- Posting cadence: 1-2x/month
|
|
88
|
+
|
|
89
|
+
### Step 4: Content Calendar Template
|
|
90
|
+
Build a weekly content calendar:
|
|
91
|
+
|
|
92
|
+
| Day | Twitter/X | LinkedIn | Reddit | Community |
|
|
93
|
+
|-----|-----------|----------|--------|-----------|
|
|
94
|
+
| Mon | Daily post | — | Comment engagement | — |
|
|
95
|
+
| Tue | Daily post | Build-in-public | r/SideProject post | — |
|
|
96
|
+
| Wed | Daily post | — | Comment engagement | — |
|
|
97
|
+
| Thu | Thread | Industry insight | r/SaaS post | Dev.to article |
|
|
98
|
+
| Fri | Daily post | — | Comment engagement | — |
|
|
99
|
+
| Sat | — | Product update | — | IH update (monthly) |
|
|
100
|
+
| Sun | — | — | — | — |
|
|
101
|
+
|
|
102
|
+
### Step 5: Content Repurposing Matrix
|
|
103
|
+
For ONE piece of content (e.g., a shipped feature):
|
|
104
|
+
|
|
105
|
+
| Source | → Twitter/X | → LinkedIn | → Reddit | → IH/Dev.to |
|
|
106
|
+
|--------|-------------|------------|----------|-------------|
|
|
107
|
+
| Shipped feature | Thread (5-7 tweets) | "What we shipped" post | "Here's what I built" | Technical writeup |
|
|
108
|
+
| Blog post | Key insight tweet | Professional summary | Value-first summary | Cross-post |
|
|
109
|
+
| Milestone | Celebration tweet | Humble brag post | Transparent update | Monthly report |
|
|
110
|
+
| Learning | Hot take tweet | Lesson learned post | "TIL" in relevant sub | Tutorial |
|
|
111
|
+
|
|
112
|
+
### Step 6: UTM & Attribution
|
|
113
|
+
Each platform gets consistent UTM tracking:
|
|
114
|
+
- LinkedIn: `utm_source=linkedin&utm_medium=social&utm_campaign={content-type}`
|
|
115
|
+
- Reddit: `utm_source=reddit&utm_medium=community&utm_campaign={subreddit}`
|
|
116
|
+
- Indie Hackers: `utm_source=indiehackers&utm_medium=community&utm_campaign={post-type}`
|
|
117
|
+
- Dev.to: `utm_source=devto&utm_medium=blog&utm_campaign={article-slug}`
|
|
118
|
+
|
|
119
|
+
### Step 7: Output
|
|
120
|
+
Create ideas in `data/ideas.json` for each platform expansion:
|
|
121
|
+
- Category: "growth"
|
|
122
|
+
- Tags: ["growth", "{platform-name}"]
|
|
123
|
+
- Implementation plan with content calendar + first week of posts
|
|
124
|
+
- Success metrics: followers, impressions, profile visits, referral signups
|
|
125
|
+
- Queue relevant copy tasks (`copy-social-linkedin`, etc.)
|
|
126
|
+
|
|
127
|
+
## Output Files
|
|
128
|
+
- `data/ideas.json` — platform expansion ideas
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=6299,exports.ids=[6299],exports.modules={9576:(t,e,a)=>{a.d(e,{Z:()=>l});var i=a(4770),n=a.n(i);let s={randomUUID:n().randomUUID},r=new Uint8Array(256),o=r.length,d=[];for(let t=0;t<256;++t)d.push((t+256).toString(16).slice(1));let l=function(t,e,a){if(s.randomUUID&&!e&&!t)return s.randomUUID();let i=(t=t||{}).random||(t.rng||function(){return o>r.length-16&&(n().randomFillSync(r),o=0),r.slice(o,o+=16)})();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,e){a=a||0;for(let t=0;t<16;++t)e[a+t]=i[t];return e}return function(t,e=0){return d[t[e+0]]+d[t[e+1]]+d[t[e+2]]+d[t[e+3]]+"-"+d[t[e+4]]+d[t[e+5]]+"-"+d[t[e+6]]+d[t[e+7]]+"-"+d[t[e+8]]+d[t[e+9]]+"-"+d[t[e+10]]+d[t[e+11]]+d[t[e+12]]+d[t[e+13]]+d[t[e+14]]+d[t[e+15]]}(i)}},6299:(t,e,a)=>{a.d(e,{BK:()=>ti,BM:()=>M,B_:()=>T,DT:()=>ta,Ge:()=>J,HX:()=>h,HZ:()=>D,Ir:()=>y,Iw:()=>_,KG:()=>tt,LB:()=>b,M6:()=>S,N0:()=>Y,NY:()=>I,Pk:()=>E,QV:()=>$,Rx:()=>j,Xe:()=>L,Z0:()=>te,_1:()=>B,a9:()=>v,ad:()=>x,b_:()=>f,c5:()=>Z,dZ:()=>O,iE:()=>P,k4:()=>A,kU:()=>U,lo:()=>X,pG:()=>m,pL:()=>w,rF:()=>V,rK:()=>K,s6:()=>k,t:()=>g,uQ:()=>d,x5:()=>H,zg:()=>G});var i=a(2048),n=a(5315),s=a.n(n),r=a(9576),o=a(2114);function d(){return process.env.AI_ANALYST_DATA_DIR||s().join(process.cwd(),"data")}function l(t){return s().join(d(),t)}async function c(){try{await i.promises.access(d())}catch{await i.promises.mkdir(d(),{recursive:!0})}}async function u(t,e){try{let e=await i.promises.readFile(t,"utf-8");return JSON.parse(e)}catch{return e}}async function p(t,e){await c(),await i.promises.writeFile(t,JSON.stringify(e,null,2),"utf-8")}async function _(){return(await u(l("ideas.json"),{ideas:[]})).ideas.map(t=>({...t,epic_id:t.epic_id??null,implementation:{...t.implementation,sub_tasks:t.implementation?.sub_tasks||[]}}))}async function f(t){return(await _()).find(e=>e.id===t)||null}async function g(t){let e=await _(),a=new Date().toISOString(),i={id:`idea-${(0,r.Z)().slice(0,8)}`,created_at:a,updated_at:a,title:t.title,summary:t.summary,category:t.category,priority:t.priority,effort:t.effort,impact:t.impact,context:t.context,rationale:t.rationale,implementation_plan:t.implementation_plan,success_metrics:t.success_metrics,stage:"inbox",source:t.source,implementation:{branch_name:null,pr_url:null,pr_number:null,commits:[],started_at:null,completed_at:null,sub_tasks:[]},comments:[],tags:t.tags||[],related_ideas:[],goal_id:t.goal_id||null,expected_impact:t.expected_impact||null,hypothesis_id:t.hypothesis_id||null,epic_id:t.epic_id||null,prerequisites:t.prerequisites};return e.push(i),await p(l("ideas.json"),{ideas:e}),i.hypothesis_id&&await F(i.hypothesis_id,i.id),i}async function m(t,e){let a=await _(),i=a.findIndex(e=>e.id===t);if(-1===i)return null;let n={...a[i],...e,updated_at:new Date().toISOString()};return a[i]=n,await p(l("ideas.json"),{ideas:a}),n}async function w(t,e,a){let i=await _(),n=i.findIndex(e=>e.id===t);if(-1===n)return null;let s=i[n],d=new Date().toISOString();if(a){let t={id:`comment-${(0,r.Z)().slice(0,8)}`,created_at:d,author:"human",author_name:"Founder",content:a};s.comments.push(t)}if(s.stage=e,s.updated_at=d,"in_progress"!==e||s.implementation.started_at){if("shipped"===e){s.implementation.completed_at=d;let t=[];if(s.goal_id){let e=(await S()).find(t=>t.id===s.goal_id);if(e)for(let a of e.kpis)t.push({goal_id:e.id,kpi_id:a.id,kpi_name:a.name,value:a.current_value,date:d})}s.verification={...o.Lu,kpi_snapshot_at_ship:t}}}else s.implementation.started_at=d;return i[n]=s,await p(l("ideas.json"),{ideas:i}),s}async function y(t,e){let a=await _(),i=a.findIndex(e=>e.id===t);if(-1===i)return null;let n={id:`comment-${(0,r.Z)().slice(0,8)}`,created_at:new Date().toISOString(),author:e.author,author_name:e.author_name,content:e.content};return a[i].comments.push(n),a[i].updated_at=new Date().toISOString(),await p(l("ideas.json"),{ideas:a}),n}async function h(t){let e=await _(),a=e.findIndex(e=>e.id===t);return -1!==a&&(e.splice(a,1),await p(l("ideas.json"),{ideas:e}),!0)}async function j(){return(await u(l("sessions.json"),{sessions:[]})).sessions}async function x(){return(await u(l("implementations.json"),{implementations:[]})).implementations}async function I(t){return(await x()).find(e=>e.idea_id===t&&"failed"!==e.status)||null}async function S(){return(await u(l("goals.json"),{goals:[]})).goals}async function v(t){return(await S()).find(e=>e.id===t)||null}async function D(t){let e=await S(),a=new Date().toISOString(),i=(t.kpis||[]).map((t,e)=>({...t,id:`kpi-${(0,r.Z)().slice(0,8)}`,history:[]})),n={id:`goal-${(0,r.Z)().slice(0,8)}`,created_at:a,updated_at:a,title:t.title,description:t.description,category:t.category,target_value:t.target_value,target_unit:t.target_unit,current_value:null,baseline_value:t.baseline_value||0,deadline:t.deadline,status:"on_track",kpis:i,related_ideas:[]};return e.push(n),await p(l("goals.json"),{goals:e}),n}async function b(t,e){let a=await S(),i=a.findIndex(e=>e.id===t);if(-1===i)return null;let n={...a[i],...e,updated_at:new Date().toISOString()};return a[i]=n,await p(l("goals.json"),{goals:a}),n}async function k(t){let e=await S(),a=e.findIndex(e=>e.id===t);return -1!==a&&(e.splice(a,1),await p(l("goals.json"),{goals:e}),!0)}async function O(t,e,a){let i=await S(),n=i.findIndex(e=>e.id===t);if(-1===n)return null;let s=i[n].kpis.findIndex(t=>t.id===e);if(-1===s)return null;let r={...i[n].kpis[s],...a};return i[n].kpis[s]=r,i[n].updated_at=new Date().toISOString(),await p(l("goals.json"),{goals:i}),r}async function $(t,e,a){let i=await S(),n=i.findIndex(e=>e.id===t);if(-1===n)return null;let s=i[n].kpis.findIndex(t=>t.id===e);if(-1===s)return null;let r={date:a.date||new Date().toISOString().split("T")[0],value:a.value};return i[n].kpis[s].history.push(r),i[n].kpis[s].current_value=a.value,i[n].updated_at=new Date().toISOString(),await p(l("goals.json"),{goals:i}),i[n].kpis[s]}async function Z(){return(await u(l("hypotheses.json"),{hypotheses:[]})).hypotheses}async function U(t){return(await Z()).find(e=>e.id===t)||null}async function M(t){let e=await Z(),a=new Date().toISOString(),i=`hyp-${(0,r.Z)().slice(0,8)}`;if(e.some(t=>t.id===i))throw console.error(`[createHypothesis] Hypothesis ID collision detected: ${i}`),Error(`Hypothesis ID collision detected: ${i}`);console.debug(`[createHypothesis] created id=${i}`);let n={id:i,created_at:a,updated_at:a,title:t.title,statement:t.statement,description:t.description,funnel_stage:t.funnel_stage,priority:t.priority,status:"stated",evidence_for:[],evidence_against:[],validation_criteria:[],validation_ideas:[],reference_model:t.reference_model,effort_to_test:t.effort_to_test,tags:t.tags||[]};return e.push(n),await p(l("hypotheses.json"),{hypotheses:e}),n}async function A(t,e){let a=await Z(),i=a.findIndex(e=>e.id===t);if(-1===i)return null;let n={...a[i],...e,updated_at:new Date().toISOString()};return a[i]=n,await p(l("hypotheses.json"),{hypotheses:a}),n}async function H(t){let e=await Z(),a=e.findIndex(e=>e.id===t);return -1!==a&&(e.splice(a,1),await p(l("hypotheses.json"),{hypotheses:e}),!0)}async function F(t,e){let a=await Z(),i=a.findIndex(e=>e.id===t);return -1===i?null:(a[i].validation_ideas.includes(e)||(a[i].validation_ideas.push(e),a[i].updated_at=new Date().toISOString(),await p(l("hypotheses.json"),{hypotheses:a})),a[i])}let N={xs:1,s:2,m:3,l:5,xl:8};function L(t,e){let a=e.filter(e=>t.idea_ids.includes(e.id)),i={},n=0,s=0;for(let t of a){i[t.stage]=(i[t.stage]||0)+1;let e=N[t.effort]||3;n+=e,"shipped"===t.stage&&(s+=e)}let r=i.shipped||0,o=a.length;return{total_ideas:o,by_stage:i,shipped_count:r,progress_pct:o>0?Math.round(r/o*100):0,effort_total:n,effort_completed:s}}function q(t,e){if(t.status_override)return t.status;let a=e.filter(e=>t.idea_ids.includes(e.id));return 0===a.length?"planned":a.every(t=>"shipped"===t.stage||"rejected"===t.stage)?"completed":a.some(t=>"in_progress"===t.stage||"testing"===t.stage)?"active":"planned"}async function B(){let t=await u(l("roadmap.json"),{epics:[]}),e=await _();return t.epics.map(t=>({...t,status:q(t,e)}))}async function G(t){return(await B()).find(e=>e.id===t)||null}async function T(t){let e=await u(l("roadmap.json"),{epics:[]}),a=new Date().toISOString(),i={id:`epic-${(0,r.Z)().slice(0,8)}`,created_at:a,updated_at:a,title:t.title,description:t.description,category:t.category,goal_id:t.goal_id??null,hypothesis_id:t.hypothesis_id??null,idea_ids:t.idea_ids||[],target_start:t.target_start??null,target_end:t.target_end??null,status:"planned",status_override:!1,depends_on:t.depends_on||[],sort_order:t.sort_order??e.epics.length,auto_generated:t.auto_generated??!1,rationale:t.rationale??null,tags:t.tags||[]};if(e.epics.push(i),await p(l("roadmap.json"),e),i.idea_ids.length>0){let t=await _(),e=!1;for(let a of t)i.idea_ids.includes(a.id)&&a.epic_id!==i.id&&(a.epic_id=i.id,e=!0);e&&await p(l("ideas.json"),{ideas:t})}return i}async function K(t,e){let a=await u(l("roadmap.json"),{epics:[]}),i=a.epics.findIndex(e=>e.id===t);if(-1===i)return null;let n={...a.epics[i],...e,updated_at:new Date().toISOString()};a.epics[i]=n,await p(l("roadmap.json"),a);let s=await _();return n.status=q(n,s),n}async function Y(t){let e=await u(l("roadmap.json"),{epics:[]}),a=e.epics.findIndex(e=>e.id===t);if(-1===a)return!1;let i=e.epics[a];if(e.epics.splice(a,1),await p(l("roadmap.json"),e),i.idea_ids.length>0){let e=await _(),a=!1;for(let i of e)i.epic_id===t&&(i.epic_id=null,a=!0);a&&await p(l("ideas.json"),{ideas:e})}return!0}async function E(t,e){let a=await u(l("roadmap.json"),{epics:[]}),i=a.epics.findIndex(e=>e.id===t);if(-1===i)return null;a.epics[i].idea_ids.includes(e)||(a.epics[i].idea_ids.push(e),a.epics[i].updated_at=new Date().toISOString(),await p(l("roadmap.json"),a));let n=await _(),s=n.find(t=>t.id===e);return s&&s.epic_id!==t&&(s.epic_id=t,await p(l("ideas.json"),{ideas:n})),a.epics[i]}async function J(t,e){let a=await u(l("roadmap.json"),{epics:[]}),i=a.epics.findIndex(e=>e.id===t);if(-1===i)return null;let n=a.epics[i].idea_ids.indexOf(e);-1!==n&&(a.epics[i].idea_ids.splice(n,1),a.epics[i].updated_at=new Date().toISOString(),await p(l("roadmap.json"),a));let s=await _(),r=s.find(t=>t.id===e);return r&&r.epic_id===t&&(r.epic_id=null,await p(l("ideas.json"),{ideas:s})),a.epics[i]}function Q(t,e){let a=new Date(t),i=0;for(;i<e;){a.setDate(a.getDate()+1);let t=a.getDay();0!==t&&6!==t&&i++}return a}function R(t){let[e,a,i]=t.split("-").map(Number);return new Date(e,a-1,i)}function X(t,e,a){let i=new Map,n=new Date;n.setHours(0,0,0,0);let s=new Map;for(let e of[...t].sort((t,e)=>t.sort_order-e.sort_order)){let t=e.goal_id,a=s.get(t);a?a.push(e):s.set(t,[e])}for(let[,t]of Array.from(s.entries())){let a=new Date(n);for(let n of t){if(n.target_start&&n.target_end){i.set(n.id,{start:n.target_start,end:n.target_end});let t=R(n.target_end);t>=a&&(a=Q(t,1));continue}let t=e.filter(t=>n.idea_ids.includes(t.id)),s=0;for(let e of t)s+=N[e.effort]||3;let r=Math.max(1,Math.ceil(s/4)),o=n.target_start||z(a),d=n.target_start?R(n.target_start):new Date(a),l=n.target_end?R(n.target_end):Q(d,r),c=n.target_end||z(l);i.set(n.id,{start:o,end:c}),a=Q(l,1)}}return i}function z(t){let e=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0");return`${e}-${a}-${i}`}let C={repos:[],workspace_dir:"",schedules:{quick:{focus:["recent_changes","todos","errors","fixme"],max_ideas:5},deep:{focus:["architecture","tech_debt","security","patterns","dependencies"],max_ideas:15},metrics:{focus:["funnels","dropoffs","conversions","performance"],max_ideas:10},seo:{focus:["blog_performance","technical_seo","content_gaps","backlinks"],max_ideas:8}}};async function P(){return u(l("config.json"),C)}async function V(t){await p(l("config.json"),t)}async function W(){try{await i.promises.access(l("config.json"))}catch{await p(l("config.json"),C)}}async function tt(){await c(),await W();try{await i.promises.access(l("ideas.json"))}catch{await p(l("ideas.json"),{ideas:[]})}try{await i.promises.access(l("sessions.json"))}catch{await p(l("sessions.json"),{sessions:[]})}try{await i.promises.access(l("implementations.json"))}catch{await p(l("implementations.json"),{implementations:[]})}try{await i.promises.access(l("goals.json"))}catch{await p(l("goals.json"),{goals:[]})}try{await i.promises.access(l("hypotheses.json"))}catch{await p(l("hypotheses.json"),{hypotheses:[]})}try{await i.promises.access(l("roadmap.json"))}catch{await p(l("roadmap.json"),{epics:[]})}try{await i.promises.access(l("investor-updates.json"))}catch{await p(l("investor-updates.json"),{updates:[]})}}async function te(){return(await u(l("investor-updates.json"),{updates:[]})).updates.sort((t,e)=>e.period_end.localeCompare(t.period_end))}async function ta(t){return(await te()).find(e=>e.id===t)||null}async function ti(t,e){let a=await u(l("investor-updates.json"),{updates:[]}),i=a.updates.findIndex(e=>e.id===t);return -1===i?null:(a.updates[i].status=e,await p(l("investor-updates.json"),a),a.updates[i])}},2114:(t,e,a)=>{a.d(e,{Lu:()=>n,pG:()=>i});let i={product:"bg-blue-100 text-blue-800",ux_design:"bg-purple-100 text-purple-800",growth:"bg-green-100 text-green-800",performance:"bg-orange-100 text-orange-800",tech_debt:"bg-yellow-100 text-yellow-800",security:"bg-red-100 text-red-800",infrastructure:"bg-gray-100 text-gray-800",content:"bg-pink-100 text-pink-800",analytics:"bg-cyan-100 text-cyan-800",integration:"bg-indigo-100 text-indigo-800"},n={status:"pending",first_evaluated_at:null,last_evaluated_at:null,evaluation_count:0,next_evaluation_after:null,summary:null,metric_evaluations:[],confidence:null,follow_up_idea_ids:[],requires_human_review:!1,human_review_reason:null,kpi_snapshot_at_ship:[]}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=995,exports.ids=[995],exports.modules={7010:(e,t,r)=>{Promise.resolve().then(r.t.bind(r,2994,23)),Promise.resolve().then(r.t.bind(r,6114,23)),Promise.resolve().then(r.t.bind(r,9727,23)),Promise.resolve().then(r.t.bind(r,9671,23)),Promise.resolve().then(r.t.bind(r,1868,23)),Promise.resolve().then(r.t.bind(r,4759,23))},5698:()=>{},2881:(e,t,r)=>{"use strict";r.d(t,{Z:()=>d});var a=r(7577);let s=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),i=(...e)=>e.filter((e,t,r)=>!!e&&r.indexOf(e)===t).join(" ");var l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let n=(0,a.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:s,className:n="",children:d,iconNode:o,...c},h)=>(0,a.createElement)("svg",{ref:h,...l,width:t,height:t,stroke:e,strokeWidth:s?24*Number(r)/Number(t):r,className:i("lucide",n),...c},[...o.map(([e,t])=>(0,a.createElement)(e,t)),...Array.isArray(d)?d:[d]])),d=(e,t)=>{let r=(0,a.forwardRef)(({className:r,...l},d)=>(0,a.createElement)(n,{ref:d,iconNode:t,className:i(`lucide-${s(e)}`,r),...l}));return r.displayName=`${e}`,r}},732:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=(0,r(2881).Z)("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]])},8258:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=(0,r(2881).Z)("FlaskConical",[["path",{d:"M10 2v7.527a2 2 0 0 1-.211.896L4.72 20.55a1 1 0 0 0 .9 1.45h12.76a1 1 0 0 0 .9-1.45l-5.069-10.127A2 2 0 0 1 14 9.527V2",key:"pzvekw"}],["path",{d:"M8.5 2h7",key:"csnxdl"}],["path",{d:"M7 16h10",key:"wp8him"}]])},9730:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=(0,r(2881).Z)("MessageCircle",[["path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z",key:"vv11sd"}]])},1572:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=(0,r(2881).Z)("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]])},3468:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=(0,r(2881).Z)("Target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]])},434:(e,t,r)=>{"use strict";r.d(t,{default:()=>s.a});var a=r(9404),s=r.n(a)},5047:(e,t,r)=>{"use strict";var a=r(7389);r.o(a,"usePathname")&&r.d(t,{usePathname:function(){return a.usePathname}}),r.o(a,"useRouter")&&r.d(t,{useRouter:function(){return a.useRouter}})},502:(e,t,r)=>{"use strict";r.d(t,{default:()=>v});var a=r(326),s=r(434),i=r(5047),l=r(2881);let n=(0,l.Z)("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]),d=(0,l.Z)("Map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]);var o=r(3468),c=r(8258),h=r(9730);let g=(0,l.Z)("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]),b=(0,l.Z)("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);var u=r(732),x=r(1572),p=r(1135);let m=[{href:"/",label:"Dashboard",icon:a.jsx(n,{className:"w-5 h-5"})},{href:"/roadmap",label:"Roadmap",icon:a.jsx(d,{className:"w-5 h-5"})},{href:"/goals",label:"Goals",icon:a.jsx(o.Z,{className:"w-5 h-5"})},{href:"/hypotheses",label:"Hypotheses",icon:a.jsx(c.Z,{className:"w-5 h-5"})},{href:"/social",label:"Social",icon:a.jsx(h.Z,{className:"w-5 h-5"})},{href:"/sessions",label:"Sessions",icon:a.jsx(g,{className:"w-5 h-5"})},{href:"/settings",label:"Settings",icon:a.jsx(b,{className:"w-5 h-5"})}];function v({children:e}){let t=(0,i.usePathname)();return(0,a.jsxs)("div",{className:"min-h-screen flex",children:[(0,a.jsxs)("aside",{className:"w-64 bg-slate-900 text-white flex flex-col",children:[a.jsx("div",{className:"p-4 border-b border-slate-700",children:(0,a.jsxs)(s.default,{href:"/",className:"flex items-center gap-2",children:[a.jsx("div",{className:"w-10 h-10 bg-emerald-500 rounded-lg flex items-center justify-center",children:a.jsx(u.Z,{className:"w-6 h-6 text-white"})}),(0,a.jsxs)("div",{children:[a.jsx("h1",{className:"font-bold text-lg leading-tight",children:"Analyst"}),a.jsx("p",{className:"text-xs text-slate-400",children:process.env.NEXT_PUBLIC_PRODUCT_NAME||"Business"})]})]})}),a.jsx("nav",{className:"flex-1 p-4",children:a.jsx("ul",{className:"space-y-1",children:m.map(e=>{let r="/"===e.href?"/"===t:t.startsWith(e.href);return a.jsx("li",{children:(0,a.jsxs)(s.default,{href:e.href,className:(0,p.Z)("flex items-center gap-3 px-3 py-2 rounded-lg transition-colors",r?"bg-slate-800 text-white":"text-slate-400 hover:text-white hover:bg-slate-800"),children:[e.icon,a.jsx("span",{children:e.label})]})},e.href)})})}),a.jsx("div",{className:"p-4 border-t border-slate-700",children:(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs text-slate-500",children:[a.jsx(x.Z,{className:"w-4 h-4"}),a.jsx("span",{children:"Powered by Claude"})]})})]}),a.jsx("main",{className:"flex-1 overflow-auto",children:e})]})}},9526:(e,t,r)=>{"use strict";r.d(t,{G:()=>n,GK:()=>N,Gs:()=>c,Hs:()=>a,PN:()=>u,PW:()=>M,Q_:()=>x,R$:()=>k,Vr:()=>h,Wb:()=>b,aR:()=>g,bi:()=>d,en:()=>f,i2:()=>y,kT:()=>p,l5:()=>m,lE:()=>w,lv:()=>l,pG:()=>s,rF:()=>o,tV:()=>v,tl:()=>j,xP:()=>_,yb:()=>i});let a={product:"Product",ux_design:"UX/Design",growth:"Growth",performance:"Performance",tech_debt:"Tech Debt",security:"Security",infrastructure:"Infrastructure",content:"Content",analytics:"Analytics",integration:"Integration"},s={product:"bg-blue-100 text-blue-800",ux_design:"bg-purple-100 text-purple-800",growth:"bg-green-100 text-green-800",performance:"bg-orange-100 text-orange-800",tech_debt:"bg-yellow-100 text-yellow-800",security:"bg-red-100 text-red-800",infrastructure:"bg-gray-100 text-gray-800",content:"bg-pink-100 text-pink-800",analytics:"bg-cyan-100 text-cyan-800",integration:"bg-indigo-100 text-indigo-800"},i={inbox:"Inbox",under_review:"Under Review",approved:"Approved",in_progress:"In Progress",testing:"Testing",shipped:"Shipped",deferred:"Deferred",rejected:"Rejected",rolled_back:"Rolled Back"},l={inbox:"bg-amber-500",under_review:"bg-blue-500",approved:"bg-emerald-500",in_progress:"bg-violet-500",testing:"bg-cyan-500",shipped:"bg-green-500",deferred:"bg-gray-500",rejected:"bg-red-500",rolled_back:"bg-orange-500"},n=["inbox","under_review","approved","in_progress","testing","shipped"],d={xs:"XS",s:"S",m:"M",l:"L",xl:"XL"},o={critical:"Critical",high:"High",medium:"Medium",low:"Low"},c={critical:"bg-red-100 text-red-800 border-red-300",high:"bg-orange-100 text-orange-800 border-orange-300",medium:"bg-yellow-100 text-yellow-800 border-yellow-300",low:"bg-gray-100 text-gray-800 border-gray-300"},h={codebase_analysis:"Codebase Analysis",metrics_review:"Metrics Review",market_research:"Market Research",seo_audit:"SEO Audit",manual:"Manual"},g={pending:"bg-slate-100 text-slate-700",validated:"bg-emerald-100 text-emerald-800",needs_investigation:"bg-amber-100 text-amber-800",inconclusive:"bg-slate-100 text-slate-600",invalidated:"bg-red-100 text-red-800"},b={pending:"Pending",validated:"Validated",needs_investigation:"Needs Investigation",inconclusive:"Inconclusive",invalidated:"Invalidated"},u={ship:"Ship",update:"Update",milestone:"Milestone",digest:"Digest",manual:"Manual",thread:"Thread",insight:"Insight"},x={ship:"bg-green-100 text-green-800",update:"bg-blue-100 text-blue-800",milestone:"bg-amber-100 text-amber-800",digest:"bg-purple-100 text-purple-800",manual:"bg-slate-100 text-slate-800",thread:"bg-indigo-100 text-indigo-800",insight:"bg-cyan-100 text-cyan-800"},p={acquisition:"Acquisition",activation:"Activation",retention:"Retention",revenue:"Revenue",referral:"Referral"},m={acquisition:"bg-blue-100 text-blue-800",activation:"bg-emerald-100 text-emerald-800",retention:"bg-purple-100 text-purple-800",revenue:"bg-amber-100 text-amber-800",referral:"bg-pink-100 text-pink-800"},v={on_track:"On Track",at_risk:"At Risk",behind:"Behind",achieved:"Achieved"},y={on_track:"bg-emerald-100 text-emerald-800 border-emerald-300",at_risk:"bg-amber-100 text-amber-800 border-amber-300",behind:"bg-red-100 text-red-800 border-red-300",achieved:"bg-blue-100 text-blue-800 border-blue-300"},f={manual:"Manual",rest_api:"REST API",posthog:"PostHog",firestore:"Firestore",stripe:"Stripe",whatsapp:"WhatsApp"},k={stated:"Stated",testing:"Testing",validated:"Validated",invalidated:"Invalidated",deferred:"Deferred"},w={stated:"bg-slate-100 text-slate-800 border-slate-300",testing:"bg-amber-100 text-amber-800 border-amber-300",validated:"bg-emerald-100 text-emerald-800 border-emerald-300",invalidated:"bg-red-100 text-red-800 border-red-300",deferred:"bg-slate-100 text-slate-500 border-slate-200"},M={acquisition:"Acquisition",engagement:"Engagement",conversion:"Conversion",monetization:"Monetization"},j={acquisition:"bg-blue-100 text-blue-800",engagement:"bg-purple-100 text-purple-800",conversion:"bg-amber-100 text-amber-800",monetization:"bg-emerald-100 text-emerald-800"},N={planned:"Planned",active:"Active",completed:"Completed",paused:"Paused"},_={planned:"bg-slate-100 text-slate-700 border-slate-300",active:"bg-blue-100 text-blue-800 border-blue-300",completed:"bg-emerald-100 text-emerald-800 border-emerald-300",paused:"bg-amber-100 text-amber-800 border-amber-300"}},2029:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>i,metadata:()=>s});var a=r(9510);r(5023);let s={title:process.env.NEXT_PUBLIC_PRODUCT_NAME?`${process.env.NEXT_PUBLIC_PRODUCT_NAME} Analyst`:"AI Product Manager",description:"AI Product Manager - Autonomous improvement proposals"};function i({children:e}){return a.jsx("html",{lang:"en",children:a.jsx("body",{className:"min-h-screen bg-slate-50",children:e})})}},5023:()=>{},1135:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});let a=function(){for(var e,t,r=0,a="",s=arguments.length;r<s;r++)(e=arguments[r])&&(t=function e(t){var r,a,s="";if("string"==typeof t||"number"==typeof t)s+=t;else if("object"==typeof t){if(Array.isArray(t)){var i=t.length;for(r=0;r<i;r++)t[r]&&(a=e(t[r]))&&(s&&(s+=" "),s+=a)}else for(a in t)t[a]&&(s&&(s+=" "),s+=a)}return s}(e))&&(a&&(a+=" "),a+=t);return a}}};
|