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.
- package/.next/standalone/.env +7 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +68 -60
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +6 -6
- package/.next/standalone/.next/prerender-manifest.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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/checkout/route.js +1 -0
- package/.next/standalone/.next/server/app/api/checkout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/detect-repos/route.js.nft.json +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/health/route.js.nft.json +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]/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/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 -0
- package/.next/standalone/.next/server/app/api/license/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/portal/route.js +1 -0
- package/.next/standalone/.next/server/app/api/portal/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js +1 -0
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/[id]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/route.js +1 -0
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/webhook/route.js +1 -0
- package/.next/standalone/.next/server/app/api/webhook/route.js.nft.json +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/landing/page.js +1 -1
- package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/landing.html +1 -1
- package/.next/standalone/.next/server/app/landing.rsc +1 -1
- 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/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/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 +2 -2
- package/.next/standalone/.next/server/app/social/page.js +1 -0
- package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/social.html +1 -0
- package/.next/standalone/.next/server/app/social.meta +5 -0
- package/.next/standalone/.next/server/app/social.rsc +7 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +15 -7
- package/.next/standalone/.next/server/chunks/{682.js → 1682.js} +1 -1
- package/.next/standalone/.next/server/chunks/3644.js +1 -0
- package/.next/standalone/.next/server/chunks/4376.js +1 -0
- package/.next/standalone/.next/server/chunks/4471.js +2 -0
- package/.next/standalone/.next/server/chunks/534.js +1 -0
- package/.next/standalone/.next/server/chunks/5972.js +12 -0
- package/.next/standalone/.next/server/chunks/7809.js +2 -0
- package/.next/standalone/.next/server/chunks/9276.js +2 -0
- package/.next/standalone/.next/server/chunks/9777.js +1 -0
- 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/pages/_app.js +1 -1
- package/.next/standalone/.next/server/pages/_document.js +1 -1
- package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/standalone/.next/server/pages/_error.js +1 -1
- package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/webpack-runtime.js +1 -1
- package/.next/standalone/data/email-campaigns/welcome-2026-02-20.md +13 -32
- package/.next/standalone/data/payments.json +33 -0
- package/.next/standalone/data/social.json +13 -0
- package/.next/standalone/package.json +5 -1
- package/.next/standalone/scripts/skills/social-media.ts +456 -0
- package/.next/static/chunks/444-125b7b0fa8cbdb81.js +1 -0
- package/.next/static/chunks/746-ea7c3e4e69c14385.js +1 -0
- package/.next/static/chunks/app/goals/[id]/{page-91b8382d44e93925.js → page-8dbeab5cc8cf0988.js} +1 -1
- package/.next/static/chunks/app/goals/{page-ecaa4a2761757014.js → page-794526d1e1a0856a.js} +1 -1
- package/.next/static/chunks/app/hypotheses/[id]/{page-894b08de47a73af9.js → page-65032da79ae146c5.js} +1 -1
- package/.next/static/chunks/app/hypotheses/page-8314da4be7c533bd.js +1 -0
- package/.next/static/chunks/app/ideas/[id]/page-dc9746061e58eea5.js +1 -0
- package/.next/static/chunks/app/layout-eeef7928298d2198.js +1 -0
- package/.next/static/chunks/app/page-fb66ff080390f20a.js +1 -0
- package/.next/static/chunks/app/roadmap/[id]/{page-3848fd96de497d11.js → page-c8c4baf233e0d480.js} +1 -1
- package/.next/static/chunks/app/roadmap/page-b15554a207ed2813.js +1 -0
- package/.next/static/chunks/app/sessions/page-42fb8edb15b9da1c.js +1 -0
- package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +1 -0
- package/.next/static/chunks/app/social/page-6c61fb0c2546313e.js +1 -0
- package/.next/static/chunks/{main-c0637f9544446589.js → main-98052d4291bccc96.js} +1 -1
- package/.next/static/css/02298496de89e16e.css +3 -0
- package/README.md +18 -0
- package/dist/bin/vibebusiness.js +307 -26
- package/dist/scripts/analyze.js +1 -0
- package/dist/scripts/chat.js +1 -0
- package/dist/scripts/generate-idea.js +1 -0
- package/dist/scripts/heartbeat.js +7343 -192
- package/dist/scripts/implement.js +1 -0
- package/dist/scripts/init.js +46 -6
- package/dist/scripts/scan.js +1 -0
- package/package.json +5 -1
- package/templates/commands/email-marketing.md +148 -10
- package/.next/standalone/.next/server/chunks/276.js +0 -2
- package/.next/standalone/.next/server/chunks/416.js +0 -1
- package/.next/standalone/.next/server/chunks/471.js +0 -2
- package/.next/standalone/.next/server/chunks/617.js +0 -1
- package/.next/standalone/.next/server/chunks/644.js +0 -1
- package/.next/standalone/.next/server/chunks/972.js +0 -12
- package/.next/static/chunks/444-6c0edb23956d018d.js +0 -1
- package/.next/static/chunks/783-3af6dbdb6afb55f4.js +0 -1
- package/.next/static/chunks/app/hypotheses/page-2cf90570526c76d3.js +0 -1
- package/.next/static/chunks/app/ideas/[id]/page-e0cca1557b59f7e0.js +0 -1
- package/.next/static/chunks/app/layout-ae8acf4955ee5472.js +0 -1
- package/.next/static/chunks/app/page-6a52a6950963129a.js +0 -1
- package/.next/static/chunks/app/roadmap/page-94d002cf0e37260f.js +0 -1
- package/.next/static/chunks/app/sessions/page-8085e6da5e28c7e4.js +0 -1
- package/.next/static/chunks/app/settings/page-34f70eef4a23eb4c.js +0 -1
- package/.next/static/css/501d0ac30341ebbe.css +0 -3
- /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_buildManifest.js +0 -0
- /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_ssgManifest.js +0 -0
- /package/.next/static/chunks/{117-b74c3899e29d85d7.js → 117-23260fd0b5f0bd9a.js} +0 -0
- /package/.next/static/chunks/app/_not-found/{page-2573b25f318b094f.js → page-a7be1c556b396c8e.js} +0 -0
- /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)
|
package/dist/bin/vibebusiness.js
CHANGED
|
@@ -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
|
-
//
|
|
220
|
-
|
|
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;
|
package/dist/scripts/analyze.js
CHANGED
|
@@ -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
|
|
package/dist/scripts/chat.js
CHANGED
|
@@ -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
|
|