vibebusiness 1.2.87 → 1.2.89
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 +89 -72
- 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/chunks/7151.js +10 -10
- 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/business-context.json +31 -181
- package/.next/standalone/data/codebase-snapshot.json +64 -42
- package/.next/standalone/data/competitors.json +39 -559
- package/.next/standalone/data/config.json +16 -40
- package/.next/standalone/data/goals.json +35 -410
- package/.next/standalone/data/positioning.json +10 -127
- package/.next/standalone/data/sessions.json +84 -299
- 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 +3 -2
- package/.next/standalone/scripts/analyze.ts +70 -21
- 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 -8
- package/dist/scripts/analyze.js +161 -19
- package/dist/scripts/heartbeat.js +24 -129
- package/dist/scripts/implement.js +77 -15
- package/dist/scripts/scan.js +0 -3
- package/dist/scripts/social-routine.js +0 -3
- package/package.json +3 -2
- package/scripts/lib/video/compositions/DemoVideo.tsx +50 -134
- package/scripts/lib/video/compositions/Root.tsx +2 -21
- 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/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/heartbeat-sessions.json +0 -7550
- package/.next/standalone/data/hypotheses.json +0 -269
- package/.next/standalone/data/ideas.json +0 -10764
- package/.next/standalone/data/implementations.json +0 -3342
- package/.next/standalone/data/pages.json +0 -22
- package/.next/standalone/data/payments.json +0 -33
- package/.next/standalone/data/reports/visuals/idea-3f4595f7-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-4rxt3mkj-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-6631456b-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-boot-001-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-fb3eba74-card.png +0 -0
- 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-prqf3lob-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 -194
- package/.next/standalone/data/social.json.backup +0 -179
- package/.next/standalone/data/videos/ad-solo-founder-burnout.mp4 +0 -0
- package/.next/standalone/data/videos/ai-gets-business-feed.mp4 +0 -0
- package/.next/standalone/data/videos/idea-graveyard-feed.mp4 +0 -0
- package/.next/standalone/data/videos/lonely-founder-feed.mp4 +0 -0
- package/.next/standalone/data/videos/staging/ad-solo-founder-burnout.json +0 -54
- package/.next/standalone/data/videos/staging/ai-gets-business.json +0 -55
- package/.next/standalone/data/videos/staging/idea-graveyard.json +0 -61
- package/.next/standalone/data/videos/staging/lonely-founder.json +0 -60
- package/.next/standalone/data/videos/staging/while-you-slept-v2-fast.json +0 -67
- package/.next/standalone/data/videos/staging/while-you-slept-v3-dynamic.json +0 -67
- package/.next/standalone/data/videos/while-you-slept-demo-feed.mp4 +0 -0
- package/.next/standalone/data/videos/while-you-slept-v2-fast-feed.mp4 +0 -0
- package/.next/standalone/data/videos/while-you-slept-v3-dynamic-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/3.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-d325a95479e7c453.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/{kgtR3Ls8MG4aQqwp3I0UE → UaMf1fmArAE78vyk_zQVK}/_buildManifest.js +0 -0
- /package/.next/static/{kgtR3Ls8MG4aQqwp3I0UE → UaMf1fmArAE78vyk_zQVK}/_ssgManifest.js +0 -0
|
@@ -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 _(){let t=await u(l("ideas.json"),{ideas:[]}),e=["critical","high","medium","low"],a=["xs","s","m","l","xl"];return t.ideas.map(t=>({...t,stage:t.stage??t.status??"inbox",priority:e.includes(t.priority)?t.priority:"medium",impact:a.includes(t.impact)?t.impact:"m",effort:a.includes(t.effort)?t.effort:"s",comments:t.comments??[],tags:t.tags??[],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}}};
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
You are an AI Business Analyst for vibebusiness, Autonomous AI business analyst that continuously analyzes codebases, metrics, and market data to generate, prioritize, implement, and verify improvement ideas. Closes the full lifecycle loop: observe → analyze → recommend → implement → ship → verify → learn. Brain/hands architecture: VibeBusiness decides WHAT to build; Claude Code CLI handles HOW to code it..
|
|
2
|
-
|
|
3
|
-
The product consists of:
|
|
4
|
-
1. **VibeBusiness CLI + Dashboard (vibebusiness)**: Next.js dashboard with Kanban board, goals, KPI charts, hypothesis tracking. TypeScript CLI with heartbeat loop, analysis engine, and implementation pipeline. Distributed via npm.
|
|
5
|
-
Tech: Next.js 14, TypeScript 5, Tailwind CSS, Lucide React, tsup, Claude Code CLI
|
|
6
|
-
|
|
7
|
-
Your role is to analyze the codebase and generate actionable improvement ideas.
|
|
8
|
-
|
|
9
|
-
## Quick Analysis Task
|
|
10
|
-
|
|
11
|
-
Perform a quick scan of the codebase focusing on:
|
|
12
|
-
- Recent changes (git log --oneline -20)
|
|
13
|
-
- TODO/FIXME comments that need attention
|
|
14
|
-
- Error handling gaps
|
|
15
|
-
- Console.log statements left in production code
|
|
16
|
-
- Obvious performance issues (N+1 queries, missing indexes)
|
|
17
|
-
- Security quick wins (exposed secrets, missing validation)
|
|
18
|
-
|
|
19
|
-
## Repositories to Analyze
|
|
20
|
-
- vibebusiness: /Users/luismey/Code/vibebusiness (nextjs)
|
|
21
|
-
|
|
22
|
-
## Analysis Steps
|
|
23
|
-
|
|
24
|
-
1. For each repository:
|
|
25
|
-
a. Check recent git commits for patterns
|
|
26
|
-
b. Search for TODO, FIXME, HACK comments
|
|
27
|
-
c. Look for console.log/print statements in non-test files
|
|
28
|
-
d. Check for obvious security issues (hardcoded credentials, SQL injection patterns)
|
|
29
|
-
|
|
30
|
-
2. Prioritize findings by business impact
|
|
31
|
-
|
|
32
|
-
3. Generate up to 5 improvement ideas
|
|
33
|
-
|
|
34
|
-
## Research Protocol
|
|
35
|
-
|
|
36
|
-
Before generating ideas, conduct research to ground proposals in reality:
|
|
37
|
-
|
|
38
|
-
### Codebase Verification (MANDATORY)
|
|
39
|
-
For every idea, VERIFY using Glob and Grep that:
|
|
40
|
-
- The feature/system you reference actually exists
|
|
41
|
-
- You understand the current implementation before proposing changes
|
|
42
|
-
- files_analyzed contains real paths you confirmed exist
|
|
43
|
-
|
|
44
|
-
### Web Research
|
|
45
|
-
Use WebSearch to research:
|
|
46
|
-
- Industry best practices for the problem
|
|
47
|
-
- How competitors solve similar problems (CodeScene, Cursor, Devin (Cognition), GitHub Copilot, PostHog, ChatPRD, Mendral, ValidatorAI, Baremetrics, Lovable)
|
|
48
|
-
- local market-specific context (search in the local language when relevant)
|
|
49
|
-
- Technology approaches with measurable outcomes
|
|
50
|
-
|
|
51
|
-
### Business Model Constraints
|
|
52
|
-
- Solo founder — speed over perfection, focus over breadth
|
|
53
|
-
- Pre-revenue — zero marketing budget, PLG-only distribution
|
|
54
|
-
- BYOK model — users provide their own Claude/OpenAI keys (near-zero COGS, 90-95% gross margins)
|
|
55
|
-
- Local-first — all data stays on user's machine, no cloud infrastructure needed
|
|
56
|
-
- Claude Code CLI dependency — primary AI backend, BYOK API fallback for users without Max plan
|
|
57
|
-
- 12-18 month competitive window before incumbents (Microsoft/GitHub) could replicate
|
|
58
|
-
- Target segment: indie hackers / solo technical founders (Segment B) — CLI-native, $20-100/mo tool budget
|
|
59
|
-
|
|
60
|
-
### Regulatory & Compliance
|
|
61
|
-
- EU AI Act — low risk (business analysis tool, not high-risk classification)
|
|
62
|
-
- SOC 2 — target before enterprise push (Phase 3)
|
|
63
|
-
- Local-first architecture: user data never touches VibeBusiness servers
|
|
64
|
-
|
|
65
|
-
### Monitoring & Observability (MANDATORY for every idea)
|
|
66
|
-
|
|
67
|
-
success_metrics MUST be:
|
|
68
|
-
- Quantifiable with baseline → target → timeline format
|
|
69
|
-
- Verifiable via logs, metrics, or database queries
|
|
70
|
-
- Include at least one monitoring metric (e.g., error rate, latency, delivery rate)
|
|
71
|
-
|
|
72
|
-
implementation_plan MUST include a "Monitoring" step that specifies:
|
|
73
|
-
- What to log (entry/exit of services, errors with context, data validation)
|
|
74
|
-
- What metrics to track (latency, success rate, throughput)
|
|
75
|
-
- Alert thresholds if applicable (e.g., "alert if error_rate > 5%")
|
|
76
|
-
- How to verify the feature works post-deploy (health check, smoke test)
|
|
77
|
-
|
|
78
|
-
BAD success_metrics (reject): "Improve response time", "Better UX"
|
|
79
|
-
GOOD success_metrics: "Reduce avg response time from 86h to <8h within 2 weeks, verified via Firestore query on response_time field"
|
|
80
|
-
|
|
81
|
-
### Business Funnel Assessment (MANDATORY for growth/product/revenue ideas)
|
|
82
|
-
Consider the business funnel before proposing ideas:
|
|
83
|
-
- Acquisition: Are developers finding VibeBusiness? (npm downloads, GitHub stars, Show HN traffic) (no threshold defined)
|
|
84
|
-
- Activation: Do users complete their first vibe cycle and experience the 10x moment in under 5 minutes? (no threshold defined)
|
|
85
|
-
- Retention: Are users running weekly vibe cycles and reviewing recommendations? (D7 >35%, D30 >25%) (no threshold defined)
|
|
86
|
-
- Revenue: Are users converting to Pro ($29/mo)? Target: 11.7% free-to-paid conversion. (no threshold defined)
|
|
87
|
-
- Referral: Are users sharing VibeBusiness? (tweets, HN posts, community mentions, referral program) (no threshold defined)
|
|
88
|
-
If earlier stages are broken, propose fixes for THOSE stages. Include "prerequisites" on every growth/revenue idea that depends on a later funnel stage.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
### Active Business Goals (WEIGHT ideas toward these)
|
|
92
|
-
|
|
93
|
-
**goal-ship-v13: Ship VibeBusiness v1.3 to npm** — Status: achieved, Progress: 1 / 1 shipped_version, Deadline: 2026-Q1
|
|
94
|
-
- v1.3 Released on npm: 1 / 1 boolean (higher_is_better)
|
|
95
|
-
- First-Run Time to Value: N/A / 60 seconds (lower_is_better)
|
|
96
|
-
|
|
97
|
-
**goal-beta-users: Recruit 20 Indie Hacker Beta Users** — Status: behind, Progress: 0 / 20 beta_users, Deadline: 2026-Q2
|
|
98
|
-
- Beta User Signups: 0 / 20 users (higher_is_better)
|
|
99
|
-
- Beta D7 Retention: N/A / 40 percent (higher_is_better)
|
|
100
|
-
- Recommendation Review Rate: N/A / 60 percent (higher_is_better)
|
|
101
|
-
- Init-to-First-Scan Activation Rate: N/A / 60 percent (higher_is_better)
|
|
102
|
-
|
|
103
|
-
**goal-100-paying: Achieve 100 Paying Customers** — Status: behind, Progress: 0 / 100 paying_customers, Deadline: 2026-Q3
|
|
104
|
-
- Paying Users: 0 / 100 users (higher_is_better)
|
|
105
|
-
- Free-to-Paid Conversion Rate: N/A / 11.7 percent (higher_is_better)
|
|
106
|
-
- npm Weekly Downloads: 0 / 500 downloads/week (higher_is_better)
|
|
107
|
-
|
|
108
|
-
**goal-50k-mrr: Reach $50K MRR by Month 12** — Status: behind, Progress: 0 / 50000 dollars_mrr, Deadline: 2027-Q1
|
|
109
|
-
- Monthly Recurring Revenue: 0 / 50000 dollars (higher_is_better)
|
|
110
|
-
- Monthly Logo Churn Rate: N/A / 5 percent (lower_is_better)
|
|
111
|
-
- Net Revenue Retention: N/A / 120 percent (higher_is_better)
|
|
112
|
-
|
|
113
|
-
**goal-build-in-public: Build in Public: Daily X/Twitter Presence** — Status: behind, Progress: 0 / 1000 followers, Deadline: 2026-Q3
|
|
114
|
-
- X/Twitter Followers: 0 / 1000 followers (higher_is_better)
|
|
115
|
-
- Daily Post Streak: 1 / 90 days (higher_is_better)
|
|
116
|
-
|
|
117
|
-
When generating ideas, PREFER ideas that directly move a goal's KPIs. Include `goal_id` in the idea JSON if it aligns with a specific goal (e.g., "goal_id": "goal-003").
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
### Active Business Hypotheses (VALIDATE through experiments)
|
|
121
|
-
|
|
122
|
-
**hyp-10x-moment: The 10x Moment in Under 5 Minutes Drives Conversion** [activation] — Status: stated, Priority: critical, Effort: l
|
|
123
|
-
Statement: If the first vibe cycle produces a specific, actionable business recommendation the founder didn't already know — in under 60 seconds — then D7 retention will exceed 40% and free-to-paid conversion will exceed 11.7%.
|
|
124
|
-
|
|
125
|
-
**hyp-indie-hackers-wtp: Indie Hackers Will Pay $29/month for an AI Business Analyst** [monetization] — Status: stated, Priority: critical, Effort: m
|
|
126
|
-
Statement: If VibeBusiness provides persistent business context, real metric integrations, and actionable weekly recommendations, then indie hackers will convert to Pro at $29/month at rates exceeding 8% of active free users.
|
|
127
|
-
|
|
128
|
-
**hyp-build-in-public: Build-in-Public Drives Organic Acquisition at Zero Cost** [acquisition] — Status: stated, Priority: high, Effort: m
|
|
129
|
-
Statement: If the founder posts daily on X/Twitter documenting the VibeBusiness journey (90% value, 10% product), then organic npm downloads will exceed 500/week within 90 days of consistent posting.
|
|
130
|
-
|
|
131
|
-
**hyp-byok-adoption: BYOK Model Reduces Adoption Friction for Target Segment** [activation] — Status: stated, Priority: high, Effort: s
|
|
132
|
-
Statement: If VibeBusiness targets Claude Code power users (who already pay $100-200/month for Claude Max), then BYOK setup friction will not significantly impact conversion — at least 60% of installers will complete their first vibe cycle.
|
|
133
|
-
|
|
134
|
-
**hyp-memory-switching-cost: MEMORY.md Accumulation Creates Meaningful Switching Costs by Day 30** [engagement] — Status: stated, Priority: high, Effort: l
|
|
135
|
-
Statement: If MEMORY.md accumulates 700+ observations by Day 30 and users can see this growth visually, then D30 retention will exceed 25% and users who reach Day 30 will have <3% monthly churn.
|
|
136
|
-
|
|
137
|
-
**hyp-implementation-differentiator: Autonomous Implementation Engine Is the Key Differentiator** [engagement] — Status: stated, Priority: high, Effort: xl
|
|
138
|
-
Statement: If VibeBusiness autonomously ships code via Claude Code CLI (branch → PR → merge → verify), then users who experience at least one autonomously shipped feature will retain at 2x the rate of users who only receive recommendations.
|
|
139
|
-
|
|
140
|
-
When generating ideas, PREFER ideas that validate or invalidate an active hypothesis. Set `hypothesis_id` in the idea JSON to the hypothesis ID (e.g., "hypothesis_id": "hyp-003"). The cheapest validation experiment for each hypothesis is the highest-priority idea.
|
|
141
|
-
|
|
142
|
-
## Output Format
|
|
143
|
-
|
|
144
|
-
Return a JSON array of ideas:
|
|
145
|
-
```json
|
|
146
|
-
[
|
|
147
|
-
|
|
148
|
-
Each idea must be a valid JSON object with these fields:
|
|
149
|
-
{
|
|
150
|
-
"title": "string - Clear, actionable title (max 80 chars)",
|
|
151
|
-
"summary": "string - One sentence describing the improvement",
|
|
152
|
-
"category": "product | ux_design | growth | performance | tech_debt | security | infrastructure | content | analytics | integration",
|
|
153
|
-
"priority": "critical | high | medium | low",
|
|
154
|
-
"effort": "xs | s | m | l | xl",
|
|
155
|
-
"impact": "xs | s | m | l | xl",
|
|
156
|
-
"context": "string - What triggered this idea (observations, data)",
|
|
157
|
-
"rationale": "string - Why this matters for the business",
|
|
158
|
-
"implementation_plan": "string - Step-by-step implementation (markdown ok)",
|
|
159
|
-
"success_metrics": ["array of measurable outcomes"],
|
|
160
|
-
"tags": ["array of relevant tags"],
|
|
161
|
-
"files_analyzed": ["array of relevant file paths"],
|
|
162
|
-
"goal_id": "optional - ID of the business goal this idea supports (e.g., goal-001, goal-003)",
|
|
163
|
-
"hypothesis_id": "optional - ID of the business hypothesis this idea validates (e.g., hyp-001, hyp-003). Include when this idea is an experiment to test a hypothesis.",
|
|
164
|
-
"prerequisites": "optional - For growth/revenue/monetization ideas, specify conditions that must be met before this idea should proceed. Format: { description: string, funnel_stage: string, conditions: [{ kpi_id: string, operator: 'gte'|'lte', value: number, label: string }] }"
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
]
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
Only output the JSON array, no other text.
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
# Landing Page Improvements — 2026-02-20 (Round 2)
|
|
2
|
-
|
|
3
|
-
## Metadata
|
|
4
|
-
- Type: landing
|
|
5
|
-
- Generated: 2026-02-20
|
|
6
|
-
- Positioning version: 2026-02-18
|
|
7
|
-
- Parameters: full page audit — improvements beyond round 1
|
|
8
|
-
|
|
9
|
-
## Positioning Inputs
|
|
10
|
-
- **Pain points**: Decision paralysis (high), strategic isolation (medium), fragmented tools (medium)
|
|
11
|
-
- **Pillars**: Built for Indie Hackers, Compounding Value
|
|
12
|
-
- **Objection preempted**: "$29/month is too expensive" + "Can I trust AI for business decisions?"
|
|
13
|
-
- **Social proof**: Already shipping features autonomously (PR #74), whitespace claim
|
|
14
|
-
- **CTA source**: copy_bank — "npx vibebusiness" (zero-friction), "See What VibeBusiness Finds in Your Codebase" (curiosity)
|
|
15
|
-
- **Tone**: Founder voice — confident, technical, direct. No corporate speak.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Issues Found (Current Page Audit)
|
|
20
|
-
|
|
21
|
-
### 1. Hero badge is insider jargon
|
|
22
|
-
**Current:** `CLI-native. BYOK. Local-first.`
|
|
23
|
-
**Problem:** BYOK means nothing to most visitors. Even "CLI-native" filters out anyone not yet sold. This badge should hook, not filter.
|
|
24
|
-
**Suggested:** `For indie hackers who ship` or `Free. No account. 60 seconds.`
|
|
25
|
-
**Why:** Addresses the #1 acquisition barrier — friction. Leads with what they get, not how it's built.
|
|
26
|
-
|
|
27
|
-
### 2. No explicit audience callout in hero
|
|
28
|
-
**Problem:** The page never says WHO this is for above the fold. "Indie hackers" appears only in the footer. Visitors need to self-identify within 3 seconds.
|
|
29
|
-
**Suggested addition** (below subheadline, above terminal):
|
|
30
|
-
> Built for solo founders and indie hackers who can build anything — but aren't sure what to build next.
|
|
31
|
-
|
|
32
|
-
**Why:** Matches primary audience from positioning. Self-selecting. If you read that and think "that's me," you're hooked.
|
|
33
|
-
|
|
34
|
-
### 3. Missing social proof / credibility section
|
|
35
|
-
**Problem:** Zero social proof on the entire page. No user count, no testimonials, no stats. The positioning data has proof points ready to use.
|
|
36
|
-
**Suggested section** (between FAQ and Final CTA, or as a strip above Final CTA):
|
|
37
|
-
|
|
38
|
-
**Heading:** Built with its own advice
|
|
39
|
-
**Copy:**
|
|
40
|
-
- VibeBusiness dogfoods itself — it analyzed its own codebase and shipped 4 production features autonomously
|
|
41
|
-
- The only tool that occupies genuine whitespace: autonomous loop + codebase analysis + business strategy + code implementation
|
|
42
|
-
- BYOK economics: 90-95% gross margins. Your API key, your data, your machine.
|
|
43
|
-
|
|
44
|
-
**Why:** "Built with its own advice" is a unique proof point no competitor can claim. It demonstrates the product works by showing it built itself.
|
|
45
|
-
|
|
46
|
-
### 4. Pain points section — card 3 is weak
|
|
47
|
-
**Current (card 3):** "Too many tools, zero continuity" — Baremetrics for metrics. ChatGPT for advice. Notion for decisions. AI for code.
|
|
48
|
-
**Problem:** Pain point intensity is "medium" vs "high" for the others. Also, most indie hackers don't use Baremetrics.
|
|
49
|
-
**Suggested replacement:**
|
|
50
|
-
|
|
51
|
-
**Title:** "Building alone, deciding alone"
|
|
52
|
-
**Copy:** No co-founder to challenge your assumptions. No PM to prioritize your backlog. No board to hold you accountable. Every decision falls on you — and the ones you avoid are the ones that matter most.
|
|
53
|
-
|
|
54
|
-
**Why:** "Strategic isolation" pain point (medium intensity but high emotional resonance). Directly leads into VibeBusiness as the "AI co-founder" without saying those words.
|
|
55
|
-
|
|
56
|
-
### 5. Missing pricing signal
|
|
57
|
-
**Problem:** FAQ mentions "free to start" but there's no pricing preview. Visitors want to know cost before installing anything.
|
|
58
|
-
**Suggested addition** (new section between Differentiators and Comparison, or as a strip):
|
|
59
|
-
|
|
60
|
-
**Heading:** Start free. Scale when ready.
|
|
61
|
-
**Layout:** 3 cards side-by-side
|
|
62
|
-
|
|
63
|
-
| Free | Pro — $29/mo | Team — $19/user/mo |
|
|
64
|
-
|------|-------------|-------------------|
|
|
65
|
-
| 1 project | Unlimited projects | Shared memory |
|
|
66
|
-
| Daily vibe cycle | Hourly vibe cycle | Team dashboards |
|
|
67
|
-
| 30-day memory | Unlimited memory | Cross-project insights |
|
|
68
|
-
| **npx vibebusiness** | **Start 14-day trial** | **Coming soon** |
|
|
69
|
-
|
|
70
|
-
**Why:** Removes "how much does this cost?" anxiety. $29/mo is cheap for the indie hacker audience ($20-100/mo tool budget). Showing it neutralizes the objection.
|
|
71
|
-
|
|
72
|
-
### 6. Final CTA — add a low-commitment alternative
|
|
73
|
-
**Problem:** Only CTA is "npm install" — high commitment for someone who just arrived. No email capture for people not ready.
|
|
74
|
-
**Suggested:** Add a secondary CTA below the install button:
|
|
75
|
-
|
|
76
|
-
> Not ready to install? [Join 0 indie hackers on the waitlist →]
|
|
77
|
-
|
|
78
|
-
**Why:** Captures leads who are interested but not ready to install. Supports goal-beta-users (0/20).
|
|
79
|
-
|
|
80
|
-
### 7. "How it works" section — add time context
|
|
81
|
-
**Problem:** The 6-step loop (Observe → Analyze → Implement → Ship → Verify → Learn) doesn't convey HOW FAST this happens.
|
|
82
|
-
**Suggested:** Add a time marker to the section subheadline:
|
|
83
|
-
|
|
84
|
-
**Current:** "VibeBusiness runs an autonomous heartbeat loop that observes, analyzes, recommends, implements, ships, and verifies — continuously."
|
|
85
|
-
**After:** "One heartbeat. 60 seconds. VibeBusiness observes your codebase, analyzes what matters, and delivers prioritized improvement ideas — before your coffee gets cold."
|
|
86
|
-
|
|
87
|
-
**Why:** Concrete time anchor. "Before your coffee gets cold" is founder-voice, not corporate.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Prioritized Implementation Order
|
|
92
|
-
|
|
93
|
-
1. **Hero badge** → Quick win, 1 line change (high impact on first impression)
|
|
94
|
-
2. **Audience callout** → 1 line addition below subheadline (self-selection)
|
|
95
|
-
3. **Pain point card 3** → Copy swap (emotional resonance)
|
|
96
|
-
4. **Social proof strip** → New section, ~15 lines JSX (credibility)
|
|
97
|
-
5. **Pricing preview** → New section, ~40 lines JSX (conversion)
|
|
98
|
-
6. **Secondary CTA** → 1 line addition to final section (lead capture)
|
|
99
|
-
7. **"How it works" subheadline** → Copy swap (time anchor)
|
|
100
|
-
|
|
101
|
-
## Variations
|
|
102
|
-
|
|
103
|
-
### Hero badge alternatives
|
|
104
|
-
- A: `Free. No account. 60 seconds.` (friction-forward)
|
|
105
|
-
- B: `For indie hackers who ship` (audience-forward)
|
|
106
|
-
- C: `npm install -g vibebusiness` (action-forward, matches CTA)
|
|
107
|
-
|
|
108
|
-
### Audience callout alternatives
|
|
109
|
-
- A: `Built for solo founders and indie hackers who can build anything — but aren't sure what to build next.`
|
|
110
|
-
- B: `For developers who ship products, not just code.`
|
|
111
|
-
- C: `The missing co-founder for your side project.`
|