vibebusiness 1.2.39 → 1.2.42

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.
Files changed (184) hide show
  1. package/.next/standalone/.env +7 -0
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-build-manifest.json +64 -56
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  5. package/.next/standalone/.next/build-manifest.json +6 -6
  6. package/.next/standalone/.next/prerender-manifest.json +1 -1
  7. package/.next/standalone/.next/routes-manifest.json +1 -1
  8. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  9. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/checkout/route.js +1 -0
  16. package/.next/standalone/.next/server/app/api/checkout/route.js.nft.json +1 -0
  17. package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -1
  18. package/.next/standalone/.next/server/app/api/config/detect-repos/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js +1 -1
  22. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/epics/[id]/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/epics/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/goals/[id]/route.js +1 -1
  30. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/goals/route.js +1 -1
  32. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  34. package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js +1 -1
  36. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/hypotheses/route.js +1 -1
  38. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js +1 -1
  40. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js +1 -1
  42. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js +1 -1
  44. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js +1 -1
  46. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/ideas/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/implementations/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -1
  52. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/license/route.js +1 -0
  54. package/.next/standalone/.next/server/app/api/license/route.js.nft.json +1 -0
  55. package/.next/standalone/.next/server/app/api/portal/route.js +1 -0
  56. package/.next/standalone/.next/server/app/api/portal/route.js.nft.json +1 -0
  57. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js +1 -0
  58. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/social/[id]/route.js +1 -0
  60. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -0
  61. package/.next/standalone/.next/server/app/api/social/route.js +1 -0
  62. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -0
  63. package/.next/standalone/.next/server/app/api/webhook/route.js +1 -0
  64. package/.next/standalone/.next/server/app/api/webhook/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/goals/[id]/page.js +1 -1
  66. package/.next/standalone/.next/server/app/goals/[id]/page.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/goals/page.js +1 -1
  69. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js +1 -1
  72. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  75. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/ideas/[id]/page.js +1 -1
  78. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/landing/page.js +1 -1
  81. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/landing.html +1 -1
  84. package/.next/standalone/.next/server/app/landing.rsc +1 -1
  85. package/.next/standalone/.next/server/app/page.js +1 -1
  86. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/roadmap/[id]/page.js +1 -1
  89. package/.next/standalone/.next/server/app/roadmap/[id]/page.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/roadmap/page.js +1 -1
  92. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/sessions/page.js +1 -1
  95. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  98. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/settings.html +1 -1
  101. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  102. package/.next/standalone/.next/server/app/social/page.js +1 -0
  103. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -0
  104. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -0
  105. package/.next/standalone/.next/server/app/social.html +1 -0
  106. package/.next/standalone/.next/server/app/social.meta +5 -0
  107. package/.next/standalone/.next/server/app/social.rsc +7 -0
  108. package/.next/standalone/.next/server/app-paths-manifest.json +17 -9
  109. package/.next/standalone/.next/server/chunks/{682.js → 1682.js} +1 -1
  110. package/.next/standalone/.next/server/chunks/3644.js +1 -0
  111. package/.next/standalone/.next/server/chunks/4376.js +1 -0
  112. package/.next/standalone/.next/server/chunks/4471.js +2 -0
  113. package/.next/standalone/.next/server/chunks/534.js +1 -0
  114. package/.next/standalone/.next/server/chunks/5972.js +12 -0
  115. package/.next/standalone/.next/server/chunks/7809.js +2 -0
  116. package/.next/standalone/.next/server/chunks/9276.js +2 -0
  117. package/.next/standalone/.next/server/chunks/9777.js +1 -0
  118. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  119. package/.next/standalone/.next/server/pages/404.html +1 -1
  120. package/.next/standalone/.next/server/pages/500.html +1 -1
  121. package/.next/standalone/.next/server/pages/_app.js +1 -1
  122. package/.next/standalone/.next/server/pages/_document.js +1 -1
  123. package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/pages/_error.js +1 -1
  125. package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  127. package/.next/standalone/.next/server/webpack-runtime.js +1 -1
  128. package/.next/standalone/data/email-campaigns/welcome-2026-02-20.md +13 -32
  129. package/.next/standalone/data/ideas.json +29 -9
  130. package/.next/standalone/data/payments.json +33 -0
  131. package/.next/standalone/data/social.json +13 -0
  132. package/.next/standalone/package.json +5 -1
  133. package/.next/standalone/scripts/analyze.ts +26 -3
  134. package/.next/standalone/scripts/skills/social-media.ts +535 -0
  135. package/.next/static/chunks/444-125b7b0fa8cbdb81.js +1 -0
  136. package/.next/static/chunks/746-ea7c3e4e69c14385.js +1 -0
  137. package/.next/static/chunks/app/goals/[id]/{page-91b8382d44e93925.js → page-8dbeab5cc8cf0988.js} +1 -1
  138. package/.next/static/chunks/app/goals/{page-ecaa4a2761757014.js → page-794526d1e1a0856a.js} +1 -1
  139. package/.next/static/chunks/app/hypotheses/[id]/{page-894b08de47a73af9.js → page-65032da79ae146c5.js} +1 -1
  140. package/.next/static/chunks/app/hypotheses/page-8314da4be7c533bd.js +1 -0
  141. package/.next/static/chunks/app/ideas/[id]/page-dc9746061e58eea5.js +1 -0
  142. package/.next/static/chunks/app/layout-eeef7928298d2198.js +1 -0
  143. package/.next/static/chunks/app/page-fb66ff080390f20a.js +1 -0
  144. package/.next/static/chunks/app/roadmap/[id]/{page-3848fd96de497d11.js → page-c8c4baf233e0d480.js} +1 -1
  145. package/.next/static/chunks/app/roadmap/page-b15554a207ed2813.js +1 -0
  146. package/.next/static/chunks/app/sessions/page-42fb8edb15b9da1c.js +1 -0
  147. package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +1 -0
  148. package/.next/static/chunks/app/social/page-6c61fb0c2546313e.js +1 -0
  149. package/.next/static/chunks/{main-c0637f9544446589.js → main-98052d4291bccc96.js} +1 -1
  150. package/.next/static/css/02298496de89e16e.css +3 -0
  151. package/README.md +18 -0
  152. package/dist/bin/vibebusiness.js +307 -26
  153. package/dist/scripts/analyze.js +24 -3
  154. package/dist/scripts/chat.js +1 -0
  155. package/dist/scripts/generate-idea.js +1 -0
  156. package/dist/scripts/heartbeat.js +12850 -4578
  157. package/dist/scripts/implement.js +1 -0
  158. package/dist/scripts/init.js +46 -6
  159. package/dist/scripts/scan.js +1 -0
  160. package/package.json +5 -1
  161. package/templates/commands/email-marketing.md +148 -10
  162. package/templates/commands/launch-campaign.md +84 -0
  163. package/templates/commands/promo-copy.md +186 -0
  164. package/.next/standalone/.next/server/chunks/276.js +0 -2
  165. package/.next/standalone/.next/server/chunks/416.js +0 -1
  166. package/.next/standalone/.next/server/chunks/471.js +0 -2
  167. package/.next/standalone/.next/server/chunks/617.js +0 -1
  168. package/.next/standalone/.next/server/chunks/644.js +0 -1
  169. package/.next/standalone/.next/server/chunks/972.js +0 -12
  170. package/.next/static/chunks/444-6c0edb23956d018d.js +0 -1
  171. package/.next/static/chunks/783-3af6dbdb6afb55f4.js +0 -1
  172. package/.next/static/chunks/app/hypotheses/page-2cf90570526c76d3.js +0 -1
  173. package/.next/static/chunks/app/ideas/[id]/page-e0cca1557b59f7e0.js +0 -1
  174. package/.next/static/chunks/app/layout-ae8acf4955ee5472.js +0 -1
  175. package/.next/static/chunks/app/page-6a52a6950963129a.js +0 -1
  176. package/.next/static/chunks/app/roadmap/page-94d002cf0e37260f.js +0 -1
  177. package/.next/static/chunks/app/sessions/page-8085e6da5e28c7e4.js +0 -1
  178. package/.next/static/chunks/app/settings/page-34f70eef4a23eb4c.js +0 -1
  179. package/.next/static/css/501d0ac30341ebbe.css +0 -3
  180. /package/.next/static/chunks/{117-b74c3899e29d85d7.js → 117-23260fd0b5f0bd9a.js} +0 -0
  181. /package/.next/static/chunks/app/_not-found/{page-2573b25f318b094f.js → page-a7be1c556b396c8e.js} +0 -0
  182. /package/.next/static/chunks/{fd9d1056-2182e078483b259b.js → fd9d1056-8c714984d5b17b60.js} +0 -0
  183. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → zsq0nh_UpsL0_XvQlU2YE}/_buildManifest.js +0 -0
  184. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → zsq0nh_UpsL0_XvQlU2YE}/_ssgManifest.js +0 -0
@@ -1555,11 +1555,11 @@
1555
1555
  "summary": "Add a visible pricing section with tier comparison table and direct checkout links to the existing /landing page, replacing the vague FAQ answer.",
1556
1556
  "context": "The landing page at src/app/landing/page.tsx has a hero section, feature walkthrough, demo section, FAQ, and CTA — but no pricing table. The only pricing mention is in the FAQ: 'free to start, paid plans for unlimited projects.' Research shows that visible pricing on landing pages increases conversion 2-3x for developer tools. The monetization strategy doc defines clear tiers (Free Trial $0/14d, Solo $19/mo, Pro $49/mo) but these aren't displayed anywhere users can see them. The competitor comparison table already exists in the landing page but doesn't include pricing comparison.",
1557
1557
  "rationale": "Developers evaluate tools by scanning pricing before investing time in setup. The current landing page drives to `npm install` but gives no pricing context — users who install, try, and love it have no idea what it will cost or how to pay. Adding a pricing section is the lowest-effort, highest-impact change to the acquisition funnel. Cursor's landing page prominently displays Free/Pro/Business tiers, and their 36% conversion rate validates transparent pricing. The BYOK angle ('you pay your own AI costs, we charge for the orchestration') is a unique differentiator worth highlighting.",
1558
- "stage": "inbox",
1558
+ "stage": "shipped",
1559
1559
  "category": "growth",
1560
1560
  "effort": "s",
1561
1561
  "created_at": "2026-02-19T16:02:10.465Z",
1562
- "updated_at": "2026-02-19T16:02:10.465Z",
1562
+ "updated_at": "2026-02-20T20:00:00.000Z",
1563
1563
  "implementation_plan": "1. In `src/app/landing/page.tsx`, add a `PricingSection` component between the FAQ and final CTA sections\n2. Display 3 cards: Free Trial (14 days, full access), Solo ($19/mo, 3 repos), Pro ($49/mo, unlimited)\n3. Each card lists key features with checkmarks, following the tier definitions from docs/monetization-strategy.md\n4. Highlight the BYOK advantage: 'You bring your Claude/OpenAI key. We bring the system. Near-zero AI costs for us = lower prices for you.'\n5. Add 'Start Free Trial' button on Free card (links to npm install command), 'Coming Soon' on paid cards until LemonSqueezy is wired\n6. Add annual pricing toggle showing 2 months free ($190/yr vs $228)\n7. Include a comparison row: 'vs Cursor $20/mo (just autocomplete) vs VibeBusiness $19/mo (full autonomous analyst)'\n8. Add the pricing section link to the navbar",
1564
1564
  "success_metrics": [
1565
1565
  "Landing page bounce rate: unknown → <60% (baseline: unmeasured, target: <60%, timeline: 1 month after adding analytics)",
@@ -1575,8 +1575,11 @@
1575
1575
  ]
1576
1576
  },
1577
1577
  "implementation": {
1578
- "branch_name": null,
1579
- "sub_tasks": []
1578
+ "branch_name": "beta",
1579
+ "sub_tasks": [],
1580
+ "commits": [
1581
+ "8487939 feat: add pricing page, success page, and website webhook handler"
1582
+ ]
1580
1583
  },
1581
1584
  "goal_id": "goal-50k-mrr",
1582
1585
  "tags": [
@@ -1594,9 +1597,15 @@
1594
1597
  "author": "system",
1595
1598
  "author_name": "Goal-Gap Research",
1596
1599
  "content": "Auto-generated to address goal \"Reach $50K MRR by Month 12\" (behind). Current progress: 0/50000 dollars_mrr."
1600
+ },
1601
+ {
1602
+ "id": "cmt-shipped-2026-02-20",
1603
+ "author": "founder",
1604
+ "content": "Shipped: Pricing page with tier comparison, Stripe Checkout CTAs, and success page added to the website.",
1605
+ "created_at": "2026-02-20T20:00:00.000Z"
1597
1606
  }
1598
1607
  ],
1599
- "related_ideas": [],
1608
+ "related_ideas": ["idea-stripe-integration"],
1600
1609
  "epic_id": "epic-fe67f80b"
1601
1610
  },
1602
1611
  {
@@ -2781,16 +2790,21 @@
2781
2790
  "First paying customer processed through Stripe (baseline: $0 MRR)",
2782
2791
  "Weekly re-validation detects canceled subscriptions within 7 days"
2783
2792
  ],
2784
- "stage": "under_review",
2793
+ "stage": "shipped",
2785
2794
  "source": {
2786
2795
  "type": "manual",
2787
2796
  "session_id": null,
2788
2797
  "detected_at": "2026-02-19T16:30:00.000Z"
2789
2798
  },
2790
2799
  "implementation": {
2791
- "branch_name": null,
2800
+ "branch_name": "beta",
2792
2801
  "pr_url": null,
2793
- "commits": [],
2802
+ "commits": [
2803
+ "afa789d feat: add payments skill with Stripe integration wizard",
2804
+ "888f3b1 feat: add Stripe checkout, portal, and webhook endpoints",
2805
+ "8487939 feat: add pricing page, success page, and website webhook handler",
2806
+ "6f4a548 feat: wire end-to-end monetization flow (Stripe → license key → CLI gate)"
2807
+ ],
2794
2808
  "sub_tasks": []
2795
2809
  },
2796
2810
  "comments": [
@@ -2799,6 +2813,12 @@
2799
2813
  "author": "analyst",
2800
2814
  "content": "Consolidated from 5 rejected LemonSqueezy ideas (idea-f0f8ee79, idea-v5uf36b5, idea-141b5aa7, idea-cd2e2717, idea-3b3c0c1f). Stripe chosen because founder already has active account under Porfin LTDA (Brazil). Future: migrate to Delaware LLC Stripe account when MRR scales.",
2801
2815
  "created_at": "2026-02-19T16:30:00.000Z"
2816
+ },
2817
+ {
2818
+ "id": "cmt-shipped-2026-02-20",
2819
+ "author": "founder",
2820
+ "content": "Shipped: Stripe Checkout, Customer Portal, webhook endpoints, pricing page, success page, and end-to-end license key → CLI gate flow all wired up. Revenue funnel is unblocked.",
2821
+ "created_at": "2026-02-20T20:00:00.000Z"
2802
2822
  }
2803
2823
  ],
2804
2824
  "tags": [
@@ -2811,7 +2831,7 @@
2811
2831
  "goal_id": "goal-50k-mrr",
2812
2832
  "expected_impact": "Stripe is the payment layer for idea-vibe-credits. Wire up Stripe first, then build the credits system on top.",
2813
2833
  "created_at": "2026-02-19T16:30:00.000Z",
2814
- "updated_at": "2026-02-20T18:08:37.842Z",
2834
+ "updated_at": "2026-02-20T20:00:00.000Z",
2815
2835
  "related_ideas": [
2816
2836
  "idea-vibe-credits"
2817
2837
  ],
@@ -0,0 +1,33 @@
1
+ {
2
+ "last_updated": "2026-02-20T00:00:00.000Z",
3
+ "integration_status": {
4
+ "sdk_installed": true,
5
+ "api_key_valid": true,
6
+ "products_created": true,
7
+ "checkout_endpoint": true,
8
+ "webhook_endpoint": true,
9
+ "portal_endpoint": true
10
+ },
11
+ "framework": {
12
+ "framework": "nextjs",
13
+ "typescript": true,
14
+ "appRouter": true,
15
+ "srcDir": true
16
+ },
17
+ "products": [
18
+ {
19
+ "name": "VibeBusiness Pro",
20
+ "stripe_product_id": "prod_U11wzZ3SWU35hJ",
21
+ "stripe_price_id": "price_1T2zsfAZqeMoBPkQhCUUXXOG",
22
+ "amount_cents": 2900,
23
+ "currency": "usd",
24
+ "interval": "month"
25
+ }
26
+ ],
27
+ "generated_files": [
28
+ "src/lib/stripe.ts",
29
+ "src/app/api/checkout/route.ts",
30
+ "src/app/api/webhook/route.ts",
31
+ "src/app/api/portal/route.ts"
32
+ ]
33
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "last_updated": "2026-02-20T22:50:48.200Z",
3
+ "platform": "x",
4
+ "username": "@luisgmey",
5
+ "credentials_valid": true,
6
+ "drafts": [],
7
+ "metrics": {
8
+ "followers_count": 334,
9
+ "post_streak_days": 0,
10
+ "total_posts": 0,
11
+ "last_post_date": null
12
+ }
13
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.39",
3
+ "version": "1.2.42",
4
4
  "description": "AI-powered autonomous business analyst. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -69,5 +69,9 @@
69
69
  "typescript": "^5.4.5",
70
70
  "uuid": "^9.0.1",
71
71
  "vitest": "^4.0.18"
72
+ },
73
+ "dependencies": {
74
+ "stripe": "^20.3.1",
75
+ "twitter-api-v2": "^1.29.0"
72
76
  }
73
77
  }
@@ -431,6 +431,8 @@ function parseIdeas(response: string, sessionId: string): BusinessIdea[] {
431
431
  commits: [],
432
432
  started_at: null,
433
433
  completed_at: null,
434
+ sub_tasks: [],
435
+ decomposition_attempts: 0,
434
436
  },
435
437
  comments: [],
436
438
  tags: idea.tags || [],
@@ -685,11 +687,32 @@ async function main() {
685
687
  addSessionLog(session.id, `Parsed ${newIdeas.length} ideas from response`);
686
688
 
687
689
  if (newIdeas.length > 0) {
688
- // Save ideas
690
+ // Save ideas (with dedup against existing ideas by title similarity)
689
691
  const ideasData = loadIdeas();
690
- ideasData.ideas.push(...newIdeas);
692
+ const existingTitles = ideasData.ideas.map(i => i.title);
693
+
694
+ const deduped = newIdeas.filter(idea => {
695
+ const newWords = idea.title.toLowerCase().split(/\s+/).filter(w => w.length > 3);
696
+ if (newWords.length === 0) return true;
697
+ const isDuplicate = existingTitles.some(existingTitle => {
698
+ const existingWords = existingTitle.toLowerCase().split(/\s+/).filter(w => w.length > 3);
699
+ if (existingWords.length === 0) return false;
700
+ const overlapCount = newWords.filter(w => existingWords.includes(w)).length;
701
+ return overlapCount / newWords.length > 0.6;
702
+ });
703
+ if (isDuplicate) {
704
+ console.log(`Skipped duplicate idea: "${idea.title}"`);
705
+ }
706
+ return !isDuplicate;
707
+ });
708
+
709
+ if (deduped.length < newIdeas.length) {
710
+ addSessionLog(session.id, `Deduplicated ${newIdeas.length - deduped.length} duplicate idea(s)`);
711
+ }
712
+
713
+ ideasData.ideas.push(...deduped);
691
714
  saveIdeas(ideasData);
692
- addSessionLog(session.id, `Saved ${newIdeas.length} new ideas`);
715
+ addSessionLog(session.id, `Saved ${deduped.length} new ideas (${newIdeas.length - deduped.length} duplicates skipped)`);
693
716
 
694
717
  // Auto-link ideas to hypotheses
695
718
  linkIdeasToHypotheses(newIdeas);