vibebusiness 1.2.39 → 1.2.41

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 (180) 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 +68 -60
  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 +15 -7
  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/payments.json +33 -0
  130. package/.next/standalone/data/social.json +13 -0
  131. package/.next/standalone/package.json +5 -1
  132. package/.next/standalone/scripts/skills/social-media.ts +456 -0
  133. package/.next/static/chunks/444-125b7b0fa8cbdb81.js +1 -0
  134. package/.next/static/chunks/746-ea7c3e4e69c14385.js +1 -0
  135. package/.next/static/chunks/app/goals/[id]/{page-91b8382d44e93925.js → page-8dbeab5cc8cf0988.js} +1 -1
  136. package/.next/static/chunks/app/goals/{page-ecaa4a2761757014.js → page-794526d1e1a0856a.js} +1 -1
  137. package/.next/static/chunks/app/hypotheses/[id]/{page-894b08de47a73af9.js → page-65032da79ae146c5.js} +1 -1
  138. package/.next/static/chunks/app/hypotheses/page-8314da4be7c533bd.js +1 -0
  139. package/.next/static/chunks/app/ideas/[id]/page-dc9746061e58eea5.js +1 -0
  140. package/.next/static/chunks/app/layout-eeef7928298d2198.js +1 -0
  141. package/.next/static/chunks/app/page-fb66ff080390f20a.js +1 -0
  142. package/.next/static/chunks/app/roadmap/[id]/{page-3848fd96de497d11.js → page-c8c4baf233e0d480.js} +1 -1
  143. package/.next/static/chunks/app/roadmap/page-b15554a207ed2813.js +1 -0
  144. package/.next/static/chunks/app/sessions/page-42fb8edb15b9da1c.js +1 -0
  145. package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +1 -0
  146. package/.next/static/chunks/app/social/page-6c61fb0c2546313e.js +1 -0
  147. package/.next/static/chunks/{main-c0637f9544446589.js → main-98052d4291bccc96.js} +1 -1
  148. package/.next/static/css/02298496de89e16e.css +3 -0
  149. package/README.md +18 -0
  150. package/dist/bin/vibebusiness.js +307 -26
  151. package/dist/scripts/analyze.js +1 -0
  152. package/dist/scripts/chat.js +1 -0
  153. package/dist/scripts/generate-idea.js +1 -0
  154. package/dist/scripts/heartbeat.js +7343 -192
  155. package/dist/scripts/implement.js +1 -0
  156. package/dist/scripts/init.js +46 -6
  157. package/dist/scripts/scan.js +1 -0
  158. package/package.json +5 -1
  159. package/templates/commands/email-marketing.md +148 -10
  160. package/.next/standalone/.next/server/chunks/276.js +0 -2
  161. package/.next/standalone/.next/server/chunks/416.js +0 -1
  162. package/.next/standalone/.next/server/chunks/471.js +0 -2
  163. package/.next/standalone/.next/server/chunks/617.js +0 -1
  164. package/.next/standalone/.next/server/chunks/644.js +0 -1
  165. package/.next/standalone/.next/server/chunks/972.js +0 -12
  166. package/.next/static/chunks/444-6c0edb23956d018d.js +0 -1
  167. package/.next/static/chunks/783-3af6dbdb6afb55f4.js +0 -1
  168. package/.next/static/chunks/app/hypotheses/page-2cf90570526c76d3.js +0 -1
  169. package/.next/static/chunks/app/ideas/[id]/page-e0cca1557b59f7e0.js +0 -1
  170. package/.next/static/chunks/app/layout-ae8acf4955ee5472.js +0 -1
  171. package/.next/static/chunks/app/page-6a52a6950963129a.js +0 -1
  172. package/.next/static/chunks/app/roadmap/page-94d002cf0e37260f.js +0 -1
  173. package/.next/static/chunks/app/sessions/page-8085e6da5e28c7e4.js +0 -1
  174. package/.next/static/chunks/app/settings/page-34f70eef4a23eb4c.js +0 -1
  175. package/.next/static/css/501d0ac30341ebbe.css +0 -3
  176. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_buildManifest.js +0 -0
  177. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_ssgManifest.js +0 -0
  178. /package/.next/static/chunks/{117-b74c3899e29d85d7.js → 117-23260fd0b5f0bd9a.js} +0 -0
  179. /package/.next/static/chunks/app/_not-found/{page-2573b25f318b094f.js → page-a7be1c556b396c8e.js} +0 -0
  180. /package/.next/static/chunks/{fd9d1056-2182e078483b259b.js → fd9d1056-8c714984d5b17b60.js} +0 -0
@@ -0,0 +1,3 @@
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
2
+ ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
3
+ */*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[700px\]{min-width:700px}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-slate-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(241 245 249/var(--tw-divide-opacity,1))}.divide-slate-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(248 250 252/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity,1))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity,1))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity,1))}.border-emerald-500\/20{border-color:rgba(16,185,129,.2)}.border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity,1))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity,1))}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity,1))}.border-t-blue-500{--tw-border-opacity:1;border-top-color:rgb(59 130 246/var(--tw-border-opacity,1))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-amber-500\/10{background-color:rgba(245,158,11,.1)}.bg-amber-500\/20{background-color:rgba(245,158,11,.2)}.bg-amber-500\/70{background-color:rgba(245,158,11,.7)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-500\/10{background-color:rgba(59,130,246,.1)}.bg-cyan-500\/10{background-color:rgba(6,182,212,.1)}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:rgba(16,185,129,.1)}.bg-emerald-500\/70{background-color:rgba(16,185,129,.7)}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-500\/20{background-color:rgba(239,68,68,.2)}.bg-red-500\/70{background-color:rgba(239,68,68,.7)}.bg-rose-500\/10{background-color:rgba(244,63,94,.1)}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-slate-800\/50{background-color:rgba(30,41,59,.5)}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.bg-slate-950\/90{background-color:rgba(2,6,23,.9)}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.bg-violet-500\/10{background-color:rgba(139,92,246,.1)}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-6{padding-left:1.5rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-2{padding-top:.5rem}.pt-28{padding-top:7rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity,1))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity,1))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity,1))}.text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity,1))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity,1))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity,1))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity,1))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity,1))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity,1))}.text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity,1))}.line-through{text-decoration-line:line-through}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-\[0\.03\]{opacity:.03}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-2xl,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.shadow-emerald-500\/5{--tw-shadow-color:rgba(16,185,129,.05);--tw-shadow:var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-500{transition-duration:.5s}:root{--background:#f8fafc;--foreground:#0f172a}body{color:var(--foreground);background:var(--background);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f5f9;border-radius:4px}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.kanban-column{min-height:500px;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1));padding:.75rem}.kanban-column-header{margin-bottom:.75rem;display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1));padding-bottom:.5rem}.idea-card{margin-bottom:.5rem;cursor:pointer;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));padding:.75rem;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.idea-card,.idea-card:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.idea-card:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);transform:translateY(-1px)}.priority-badge{border-radius:.25rem;border-width:1px}.category-badge,.priority-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500}.category-badge,.size-badge{border-radius:.25rem}.size-badge{display:inline-flex;height:1.5rem;width:1.5rem;align-items:center;justify-content:center;border-width:1px;--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1));font-size:.75rem;line-height:1rem;font-weight:700;--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.stage-indicator{height:.5rem;width:.5rem;border-radius:9999px}.comment-bubble{margin-bottom:.75rem;border-radius:.5rem;padding:.75rem}.comment-bubble.human{margin-left:2rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.comment-bubble.ai{margin-right:2rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.btn{display:inline-flex;align-items:center;justify-content:center;border-radius:.5rem;padding:.5rem 1rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-offset-width:2px}.btn-primary{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.btn-primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.btn-secondary{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.btn-secondary:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.btn-secondary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity,1))}.btn-danger{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.btn-danger:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.btn-ghost{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.btn-ghost:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.btn-ghost:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity,1))}.input{width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1));padding:.5rem .75rem}.input:focus{border-color:transparent;outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.textarea{width:100%;resize:none;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1));padding:.5rem .75rem}.textarea:focus{border-color:transparent;outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}@keyframes pulse-subtle{0%,to{opacity:1}50%{opacity:.7}}.animate-pulse-subtle{animation:pulse-subtle 2s ease-in-out infinite}@keyframes slide-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.animate-slide-in{animation:slide-in .2s ease-out}.last\:border-0:last-child{border-width:0}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity,1))}.hover\:border-emerald-200:hover{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity,1))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.hover\:text-slate-300:hover{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-sm:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.focus\:border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-amber-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity,1))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus\:ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.group:hover .group-hover\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}@media (min-width:640px){.sm\:ml-4{margin-left:1rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:gap-8{gap:2rem}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:pb-28{padding-bottom:7rem}.sm\:pt-32{padding-top:8rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}
package/README.md CHANGED
@@ -80,6 +80,7 @@ Heartbeat Cycle:
80
80
  - **Marketing Visuals** — Generates 1080×1080 ship announcement cards (PNG) when ideas ship
81
81
  - **Business Intelligence** — Competitor research, positioning, growth audits, pricing analysis
82
82
  - **Content Marketing** — Keyword research, blog generation, social carousels, email nurture (via ContentFlow)
83
+ - **Social Media** — Twitter/X build-in-public: auto-draft tweets from shipped features, KPI milestones, and weekly digests; review and publish from the dashboard
83
84
  - **Web Dashboard** — Kanban board, goals tracking, hypothesis management, session logs
84
85
 
85
86
  ## Slash Commands
@@ -96,6 +97,7 @@ Available as Claude Code skills when working inside a VibeBusiness project:
96
97
  | `/pricing-analysis` | Competitive pricing analysis |
97
98
  | `/validate-idea` | Pre-build feasibility research |
98
99
  | `/manage` | Interactive data editor (query, create, update, delete) |
100
+ | `/social-media` | Twitter/X setup, draft generation, status check |
99
101
  | `/status-summary` | Generate status report |
100
102
 
101
103
  ## Analysis Modes
@@ -122,6 +124,21 @@ When an idea is moved to `shipped`:
122
124
  4. Ship announcement card generated (1080×1080 PNG) → `data/reports/visuals/`
123
125
  5. Post-ship evaluation scheduled (auto-runs after 7 days)
124
126
 
127
+ ## Social Media (Twitter/X)
128
+
129
+ Build in public with automated tweet drafts:
130
+
131
+ 1. **Connect** — Add X API keys to `.env`, run `social-setup-x`
132
+ 2. **Draft** — Heartbeat auto-generates tweets when you ship features or hit KPI milestones
133
+ 3. **Review** — Browse drafts at `/social` dashboard, edit text, check character count
134
+ 4. **Publish** — One-click publish to X, streak tracked automatically
135
+
136
+ Environment variables (get from https://developer.x.com):
137
+ - `X_API_KEY` / `X_API_SECRET` — Consumer API key and secret
138
+ - `X_ACCESS_TOKEN` / `X_ACCESS_SECRET` — User access token and secret
139
+
140
+ > Free tier: 500 posts/month. OAuth 1.0a, text-only (media support planned).
141
+
125
142
  ## Dashboard
126
143
 
127
144
  ```bash
@@ -145,6 +162,7 @@ data/
145
162
  ├── positioning.json # Brand positioning & copy bank
146
163
  ├── hypotheses.json # Growth hypotheses
147
164
  ├── pages.json # Tracked landing pages
165
+ ├── social.json # Social media drafts and metrics
148
166
  ├── implementations.json # Implementation details per idea
149
167
  └── reports/
150
168
  └── visuals/ # Generated ship announcement cards (PNG)
@@ -6,6 +6,13 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res) => function __init() {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ };
12
+ var __export = (target, all) => {
13
+ for (var name in all)
14
+ __defProp(target, name, { get: all[name], enumerable: true });
15
+ };
9
16
  var __copyProps = (to, from, except, desc) => {
10
17
  if (from && typeof from === "object" || typeof from === "function") {
11
18
  for (let key of __getOwnPropNames(from))
@@ -22,6 +29,272 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
29
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
30
  mod
24
31
  ));
32
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
+
34
+ // scripts/lib/license.ts
35
+ var license_exports = {};
36
+ __export(license_exports, {
37
+ activateLicense: () => activateLicense,
38
+ deactivateLicense: () => deactivateLicense,
39
+ getInstanceId: () => getInstanceId,
40
+ isLicensed: () => isLicensed,
41
+ startTrial: () => startTrial,
42
+ validateLicense: () => validateLicense
43
+ });
44
+ function loadStoredLicense() {
45
+ try {
46
+ if (fs3.existsSync(LICENSE_FILE)) {
47
+ return JSON.parse(fs3.readFileSync(LICENSE_FILE, "utf-8"));
48
+ }
49
+ } catch {
50
+ }
51
+ return null;
52
+ }
53
+ function saveStoredLicense(license) {
54
+ if (!fs3.existsSync(CONFIG_DIR3)) {
55
+ fs3.mkdirSync(CONFIG_DIR3, { recursive: true });
56
+ }
57
+ fs3.writeFileSync(LICENSE_FILE, JSON.stringify(license, null, 2));
58
+ }
59
+ function generateInstanceId() {
60
+ const os = require("os");
61
+ const hostname = os.hostname();
62
+ const user = os.userInfo().username;
63
+ return `${user}@${hostname}`;
64
+ }
65
+ function getInstanceId() {
66
+ const stored = loadStoredLicense();
67
+ if (stored?.instanceId) return stored.instanceId;
68
+ return generateInstanceId();
69
+ }
70
+ function maskKey(key) {
71
+ if (key.length <= 8) return "****";
72
+ return key.slice(0, 4) + "****" + key.slice(-4);
73
+ }
74
+ async function callValidationAPI(key) {
75
+ try {
76
+ const controller = new AbortController();
77
+ const timeout = setTimeout(() => controller.abort(), 1e4);
78
+ const res = await fetch(LICENSE_API_URL, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify({ key }),
82
+ signal: controller.signal
83
+ });
84
+ clearTimeout(timeout);
85
+ if (!res.ok) {
86
+ return { valid: false };
87
+ }
88
+ return await res.json();
89
+ } catch {
90
+ return null;
91
+ }
92
+ }
93
+ function startTrial() {
94
+ const now = /* @__PURE__ */ new Date();
95
+ const expiresAt = new Date(now.getTime() + TRIAL_DURATION_DAYS * 24 * 60 * 60 * 1e3);
96
+ const stored = {
97
+ key: "",
98
+ tier: "trial",
99
+ status: "trial",
100
+ lastValidated: now.toISOString(),
101
+ expiresAt: expiresAt.toISOString(),
102
+ activatedAt: now.toISOString(),
103
+ instanceId: generateInstanceId()
104
+ };
105
+ saveStoredLicense(stored);
106
+ return {
107
+ status: "trial",
108
+ tier: "trial",
109
+ keyMasked: "(trial)",
110
+ lastValidated: stored.lastValidated,
111
+ expiresAt: stored.expiresAt,
112
+ maxRepos: TIER_LIMITS.trial.maxRepos,
113
+ message: `Free trial started. Expires in ${TRIAL_DURATION_DAYS} days (${expiresAt.toLocaleDateString()}).`
114
+ };
115
+ }
116
+ async function activateLicense(key, email) {
117
+ if (!key || key.trim().length === 0) {
118
+ return {
119
+ status: "invalid",
120
+ tier: "trial",
121
+ keyMasked: "",
122
+ lastValidated: null,
123
+ expiresAt: null,
124
+ maxRepos: 0,
125
+ message: "License key cannot be empty."
126
+ };
127
+ }
128
+ const apiResult = await callValidationAPI(key);
129
+ let tier;
130
+ let status;
131
+ let resolvedEmail = email;
132
+ if (apiResult === null) {
133
+ tier = inferTierFromKey(key);
134
+ status = "valid";
135
+ } else if (apiResult.valid) {
136
+ tier = apiResult.tier || inferTierFromKey(key);
137
+ status = "valid";
138
+ resolvedEmail = apiResult.email || email;
139
+ } else {
140
+ return {
141
+ status: "invalid",
142
+ tier: "trial",
143
+ keyMasked: maskKey(key),
144
+ lastValidated: null,
145
+ expiresAt: null,
146
+ maxRepos: 0,
147
+ message: "Invalid license key. Please check your key and try again."
148
+ };
149
+ }
150
+ const now = /* @__PURE__ */ new Date();
151
+ const stored = {
152
+ key,
153
+ tier,
154
+ status,
155
+ email: resolvedEmail,
156
+ lastValidated: now.toISOString(),
157
+ expiresAt: null,
158
+ // subscription-based, no fixed expiry
159
+ activatedAt: now.toISOString(),
160
+ instanceId: generateInstanceId()
161
+ };
162
+ saveStoredLicense(stored);
163
+ const offlineNote = apiResult === null ? " (validated offline \u2014 will re-check when connected)" : "";
164
+ return {
165
+ status: "valid",
166
+ tier,
167
+ keyMasked: maskKey(key),
168
+ lastValidated: stored.lastValidated,
169
+ expiresAt: null,
170
+ maxRepos: TIER_LIMITS[tier].maxRepos,
171
+ email: resolvedEmail,
172
+ message: `License activated (${tier} tier). Key: ${maskKey(key)}${offlineNote}`
173
+ };
174
+ }
175
+ function inferTierFromKey(key) {
176
+ const upper = key.toUpperCase();
177
+ if (upper.startsWith("PRO-")) return "pro";
178
+ if (upper.startsWith("TEAM-")) return "team";
179
+ if (upper.startsWith("ENT-") || upper.startsWith("ENTERPRISE-")) return "enterprise";
180
+ return "solo";
181
+ }
182
+ async function validateLicense() {
183
+ const stored = loadStoredLicense();
184
+ if (!stored) {
185
+ return {
186
+ status: "unknown",
187
+ tier: "trial",
188
+ keyMasked: "",
189
+ lastValidated: null,
190
+ expiresAt: null,
191
+ maxRepos: 0,
192
+ message: "No license found. Run `vibebusiness init` to start a trial or enter a license key."
193
+ };
194
+ }
195
+ const now = /* @__PURE__ */ new Date();
196
+ if (stored.status === "trial" || stored.tier === "trial") {
197
+ if (stored.expiresAt && new Date(stored.expiresAt) < now) {
198
+ return {
199
+ status: "expired",
200
+ tier: "trial",
201
+ keyMasked: "(trial)",
202
+ lastValidated: stored.lastValidated,
203
+ expiresAt: stored.expiresAt,
204
+ maxRepos: 0,
205
+ message: "Trial expired. Enter a license key to continue using VibeBusiness."
206
+ };
207
+ }
208
+ const daysLeft = stored.expiresAt ? Math.ceil((new Date(stored.expiresAt).getTime() - now.getTime()) / (24 * 60 * 60 * 1e3)) : 0;
209
+ return {
210
+ status: "trial",
211
+ tier: "trial",
212
+ keyMasked: "(trial)",
213
+ lastValidated: stored.lastValidated,
214
+ expiresAt: stored.expiresAt,
215
+ maxRepos: TIER_LIMITS.trial.maxRepos,
216
+ message: `Trial active. ${daysLeft} days remaining.`
217
+ };
218
+ }
219
+ const lastValidated = stored.lastValidated ? new Date(stored.lastValidated) : null;
220
+ const daysSinceValidation = lastValidated ? (now.getTime() - lastValidated.getTime()) / (24 * 60 * 60 * 1e3) : Infinity;
221
+ if (daysSinceValidation > 7 && stored.key) {
222
+ const apiResult = await callValidationAPI(stored.key);
223
+ if (apiResult === null) {
224
+ if (daysSinceValidation > OFFLINE_GRACE_DAYS) {
225
+ return {
226
+ status: "expired",
227
+ tier: stored.tier,
228
+ keyMasked: maskKey(stored.key),
229
+ lastValidated: stored.lastValidated,
230
+ expiresAt: stored.expiresAt,
231
+ maxRepos: 0,
232
+ message: `License validation expired (last checked ${Math.floor(daysSinceValidation)} days ago). Connect to the internet to re-validate.`
233
+ };
234
+ }
235
+ } else if (apiResult.valid) {
236
+ stored.lastValidated = now.toISOString();
237
+ stored.status = "valid";
238
+ if (apiResult.email) stored.email = apiResult.email;
239
+ if (apiResult.tier) stored.tier = apiResult.tier;
240
+ saveStoredLicense(stored);
241
+ } else {
242
+ stored.status = "expired";
243
+ stored.lastValidated = now.toISOString();
244
+ saveStoredLicense(stored);
245
+ return {
246
+ status: "expired",
247
+ tier: stored.tier,
248
+ keyMasked: maskKey(stored.key),
249
+ lastValidated: stored.lastValidated,
250
+ expiresAt: stored.expiresAt,
251
+ maxRepos: 0,
252
+ message: "Subscription expired. Renew at https://vibebusiness.com/pricing to continue."
253
+ };
254
+ }
255
+ }
256
+ return {
257
+ status: "valid",
258
+ tier: stored.tier,
259
+ keyMasked: maskKey(stored.key),
260
+ lastValidated: stored.lastValidated,
261
+ expiresAt: stored.expiresAt,
262
+ maxRepos: TIER_LIMITS[stored.tier].maxRepos,
263
+ email: stored.email,
264
+ message: `License valid (${stored.tier} tier).`
265
+ };
266
+ }
267
+ async function isLicensed() {
268
+ const info = await validateLicense();
269
+ return info.status === "valid" || info.status === "trial";
270
+ }
271
+ function deactivateLicense() {
272
+ if (fs3.existsSync(LICENSE_FILE)) {
273
+ fs3.unlinkSync(LICENSE_FILE);
274
+ }
275
+ }
276
+ var fs3, path4, CONFIG_DIR3, LICENSE_FILE, TRIAL_DURATION_DAYS, OFFLINE_GRACE_DAYS, LICENSE_API_URL, TIER_LIMITS;
277
+ var init_license = __esm({
278
+ "scripts/lib/license.ts"() {
279
+ "use strict";
280
+ fs3 = __toESM(require("fs"));
281
+ path4 = __toESM(require("path"));
282
+ CONFIG_DIR3 = path4.join(process.env.HOME || "", ".vibebusiness");
283
+ LICENSE_FILE = path4.join(CONFIG_DIR3, "license.json");
284
+ TRIAL_DURATION_DAYS = 14;
285
+ OFFLINE_GRACE_DAYS = 30;
286
+ LICENSE_API_URL = "https://vibebusiness.com/api/license/validate";
287
+ TIER_LIMITS = {
288
+ trial: { maxRepos: 999 },
289
+ // unlimited during trial
290
+ solo: { maxRepos: 3 },
291
+ pro: { maxRepos: 999 },
292
+ // unlimited
293
+ team: { maxRepos: 999 },
294
+ enterprise: { maxRepos: 999 }
295
+ };
296
+ }
297
+ });
25
298
 
26
299
  // bin/ai-analyst.ts
27
300
  var import_child_process = require("child_process");
@@ -216,31 +489,8 @@ async function getVibeBalance(instanceId) {
216
489
  }
217
490
  }
218
491
 
219
- // scripts/lib/license.ts
220
- var fs3 = __toESM(require("fs"));
221
- var path4 = __toESM(require("path"));
222
- var CONFIG_DIR3 = path4.join(process.env.HOME || "", ".vibebusiness");
223
- var LICENSE_FILE = path4.join(CONFIG_DIR3, "license.json");
224
- function loadStoredLicense() {
225
- try {
226
- if (fs3.existsSync(LICENSE_FILE)) {
227
- return JSON.parse(fs3.readFileSync(LICENSE_FILE, "utf-8"));
228
- }
229
- } catch {
230
- }
231
- return null;
232
- }
233
- function generateInstanceId() {
234
- const os = require("os");
235
- const hostname = os.hostname();
236
- const user = os.userInfo().username;
237
- return `${user}@${hostname}`;
238
- }
239
- function getInstanceId() {
240
- const stored = loadStoredLicense();
241
- if (stored?.instanceId) return stored.instanceId;
242
- return generateInstanceId();
243
- }
492
+ // bin/ai-analyst.ts
493
+ init_license();
244
494
 
245
495
  // src/lib/storage.ts
246
496
  var import_fs = require("fs");
@@ -656,8 +906,15 @@ function cmdStart(args) {
656
906
  process.exit(1);
657
907
  });
658
908
  }
659
- function cmdHeartbeat(args) {
909
+ async function cmdHeartbeat(args) {
660
910
  printBanner();
911
+ const { isLicensed: isLicensed2 } = (init_license(), __toCommonJS(license_exports));
912
+ if (!await isLicensed2()) {
913
+ console.error(" License expired or not found.");
914
+ console.error(" Run `vibebusiness activate <key>` to enter a license key,");
915
+ console.error(" or `vibebusiness init` to start a free trial.\n");
916
+ process.exit(1);
917
+ }
661
918
  const isDryRun = args.includes("--dry-run");
662
919
  const isSession = args.includes("--session");
663
920
  if (isDryRun) {
@@ -814,6 +1071,25 @@ async function cmdSuggestEpics(args) {
814
1071
  process.exit(1);
815
1072
  }
816
1073
  }
1074
+ async function cmdActivate(args) {
1075
+ printBanner();
1076
+ const key = args[0];
1077
+ if (!key) {
1078
+ console.error(" Usage: vibebusiness activate <license-key>\n");
1079
+ console.error(" Example: vibebusiness activate PRO-a1b2c3d4e5f6");
1080
+ process.exit(1);
1081
+ }
1082
+ console.log(" Activating license...\n");
1083
+ const result = await activateLicense(key);
1084
+ if (result.status === "valid") {
1085
+ console.log(` ${result.message}
1086
+ `);
1087
+ } else {
1088
+ console.error(` ${result.message}
1089
+ `);
1090
+ process.exit(1);
1091
+ }
1092
+ }
817
1093
  function cmdVersion() {
818
1094
  console.log(`vibebusiness v${getVersion2()}`);
819
1095
  }
@@ -829,6 +1105,7 @@ function cmdHelp() {
829
1105
  vibe --session Run continuous vibe session
830
1106
  analyze --type=<type> Run codebase analysis (quick|deep|metrics|seo|research)
831
1107
  implement --idea=<id> Implement an approved idea
1108
+ activate <key> Activate a license key (e.g. PRO-xxxxx)
832
1109
  chat [prompt] Launch interactive Claude Code session
833
1110
  suggest-epics [--dry-run] Auto-group ideas into epics by goal+category
834
1111
  status Show current status and idea counts
@@ -906,6 +1183,10 @@ async function main() {
906
1183
  trackEvent("command_run", { command: "status" });
907
1184
  await cmdStatus();
908
1185
  break;
1186
+ case "activate":
1187
+ trackEvent("command_run", { command: "activate" });
1188
+ await cmdActivate(commandArgs);
1189
+ break;
909
1190
  case "telemetry":
910
1191
  handleTelemetryCommand(commandArgs);
911
1192
  break;
@@ -609,6 +609,7 @@ var COMPETITORS_FILE = path.join(DATA_DIR, "competitors.json");
609
609
  var POSITIONING_FILE = path.join(DATA_DIR, "positioning.json");
610
610
  var PAGES_FILE = path.join(DATA_DIR, "pages.json");
611
611
  var PAYMENTS_FILE = path.join(DATA_DIR, "payments.json");
612
+ var SOCIAL_FILE = path.join(DATA_DIR, "social.json");
612
613
  var TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
613
614
  var COMMAND_TEMPLATES_DIR = path.join(TEMPLATES_DIR, "commands");
614
615
 
@@ -76,6 +76,7 @@ var COMPETITORS_FILE = path.join(DATA_DIR, "competitors.json");
76
76
  var POSITIONING_FILE = path.join(DATA_DIR, "positioning.json");
77
77
  var PAGES_FILE = path.join(DATA_DIR, "pages.json");
78
78
  var PAYMENTS_FILE = path.join(DATA_DIR, "payments.json");
79
+ var SOCIAL_FILE = path.join(DATA_DIR, "social.json");
79
80
  var TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
80
81
  var COMMAND_TEMPLATES_DIR = path.join(TEMPLATES_DIR, "commands");
81
82
 
@@ -124,6 +124,7 @@ var COMPETITORS_FILE = path.join(DATA_DIR, "competitors.json");
124
124
  var POSITIONING_FILE = path.join(DATA_DIR, "positioning.json");
125
125
  var PAGES_FILE = path.join(DATA_DIR, "pages.json");
126
126
  var PAYMENTS_FILE = path.join(DATA_DIR, "payments.json");
127
+ var SOCIAL_FILE = path.join(DATA_DIR, "social.json");
127
128
  var TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
128
129
  var COMMAND_TEMPLATES_DIR = path.join(TEMPLATES_DIR, "commands");
129
130