vibebusiness 1.2.49 → 1.2.53
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 +1 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +20 -20
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +4 -4
- package/.next/standalone/.next/prerender-manifest.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/config/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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/provider-status/route.js +1 -0
- package/.next/standalone/.next/server/app/api/provider-status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.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.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_client-reference-manifest.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/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_client-reference-manifest.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.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_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 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +2 -2
- package/.next/standalone/.next/server/app-paths-manifest.json +12 -11
- package/.next/standalone/.next/server/chunks/3794.js +92 -17
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/business-context.json +60 -6
- package/.next/standalone/data/goals.json +50 -10
- package/.next/standalone/data/ideas.json +1278 -597
- package/.next/standalone/data/implementations.json +101 -0
- package/.next/standalone/data/posthog.json +68 -0
- package/.next/standalone/data/sessions.json +5 -4
- package/.next/standalone/data/social.json +86 -3
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/analyze.ts +10 -0
- package/.next/standalone/scripts/implement.ts +37 -30
- package/.next/standalone/scripts/skills/social-media.ts +172 -2
- package/.next/static/chunks/59-76eecfb6e8216043.js +1 -0
- package/.next/static/chunks/app/goals/[id]/page-051064c3146131cc.js +1 -0
- package/.next/static/chunks/app/ideas/[id]/page-adaeb619cd0425e9.js +1 -0
- package/.next/static/chunks/app/roadmap/[id]/page-3822586c0d64fff1.js +1 -0
- package/.next/static/chunks/app/settings/page-2204cc936ec9474b.js +1 -0
- package/.next/static/chunks/app/social/page-018893f87b308651.js +1 -0
- package/.next/static/chunks/{main-61d2f25883998186.js → main-c99f3473a63aa803.js} +1 -1
- package/.next/static/css/d8bd6d69d1ff97e3.css +3 -0
- package/dist/bin/vibebusiness.js +12 -0
- package/dist/scripts/analyze.js +170 -68
- package/dist/scripts/chat.js +137 -36
- package/dist/scripts/heartbeat.js +617 -348
- package/dist/scripts/implement.js +218 -70
- package/dist/scripts/init.js +164 -16
- package/dist/scripts/provider.js +428 -0
- package/dist/scripts/scan.js +44 -5
- package/package.json +1 -1
- package/.next/static/chunks/59-a053b1c0e85128de.js +0 -1
- package/.next/static/chunks/app/goals/[id]/page-8dbeab5cc8cf0988.js +0 -1
- package/.next/static/chunks/app/ideas/[id]/page-89e3625db9017166.js +0 -1
- package/.next/static/chunks/app/roadmap/[id]/page-f437e783039534c4.js +0 -1
- package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +0 -1
- package/.next/static/chunks/app/social/page-69e480936711ccf2.js +0 -1
- package/.next/static/css/179dd3e0738c2fe4.css +0 -3
- /package/.next/static/{zIIaTqrawBK1MmHg37JOr → p1Sl4kPMQcYC3c1LgbNSP}/_buildManifest.js +0 -0
- /package/.next/static/{zIIaTqrawBK1MmHg37JOr → p1Sl4kPMQcYC3c1LgbNSP}/_ssgManifest.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-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-1{margin-right:.25rem}.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-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-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-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-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-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-md{max-width:28rem}.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}.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-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))}.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-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.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-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-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-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-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-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/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-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-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,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-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-2{padding-top:.5rem;padding-bottom:.5rem}.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-3{padding-bottom:.75rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pt-2{padding-top:.5rem}.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-\[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-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-600{--tw-text-opacity:1;color:rgb(8 145 178/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-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/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-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/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-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-70{opacity:.7}.opacity-75{opacity:.75}.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-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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-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);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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)}.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}.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-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-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-indigo-800:hover{--tw-text-opacity:1;color:rgb(55 48 163/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-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\:inline-block{display:inline-block}}@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))}}
|
package/dist/bin/vibebusiness.js
CHANGED
|
@@ -1041,6 +1041,10 @@ function cmdScan(args) {
|
|
|
1041
1041
|
}
|
|
1042
1042
|
runScript("scan.ts", args);
|
|
1043
1043
|
}
|
|
1044
|
+
function cmdProvider(args) {
|
|
1045
|
+
printBanner();
|
|
1046
|
+
runScript("provider.ts", args);
|
|
1047
|
+
}
|
|
1044
1048
|
function cmdChat(args) {
|
|
1045
1049
|
printBanner();
|
|
1046
1050
|
console.log(" Launching interactive Claude Code session...\n");
|
|
@@ -1122,6 +1126,10 @@ function cmdHelp() {
|
|
|
1122
1126
|
run <task-id> Run a specific skill task directly
|
|
1123
1127
|
analyze --type=<type> Run codebase analysis (quick|deep|metrics|seo|research)
|
|
1124
1128
|
implement --idea=<id> Implement an approved idea
|
|
1129
|
+
provider Show AI provider status and capabilities
|
|
1130
|
+
provider setup Set up or change your API key
|
|
1131
|
+
provider validate Validate stored API key
|
|
1132
|
+
provider clear Remove stored API credentials
|
|
1125
1133
|
activate <key> Activate a license key (e.g. PRO-xxxxx)
|
|
1126
1134
|
chat [prompt] Launch interactive Claude Code session
|
|
1127
1135
|
suggest-epics [--dry-run] Auto-group ideas into epics by goal+category
|
|
@@ -1193,6 +1201,10 @@ async function main() {
|
|
|
1193
1201
|
trackEvent("command_run", { command: "suggest-epics", dryRun: commandArgs.includes("--dry-run") });
|
|
1194
1202
|
await cmdSuggestEpics(commandArgs);
|
|
1195
1203
|
break;
|
|
1204
|
+
case "provider":
|
|
1205
|
+
trackEvent("command_run", { command: "provider", subcommand: commandArgs[0] || "status" });
|
|
1206
|
+
cmdProvider(commandArgs);
|
|
1207
|
+
break;
|
|
1196
1208
|
case "scan":
|
|
1197
1209
|
trackEvent("command_run", { command: "scan", deep: commandArgs.includes("--deep"), dryRun: commandArgs.includes("--dry-run") });
|
|
1198
1210
|
cmdScan(commandArgs);
|
package/dist/scripts/analyze.js
CHANGED
|
@@ -98,8 +98,8 @@ var require_package = __commonJS({
|
|
|
98
98
|
var require_main = __commonJS({
|
|
99
99
|
"node_modules/dotenv/lib/main.js"(exports2, module2) {
|
|
100
100
|
"use strict";
|
|
101
|
-
var
|
|
102
|
-
var
|
|
101
|
+
var fs5 = require("fs");
|
|
102
|
+
var path4 = require("path");
|
|
103
103
|
var os = require("os");
|
|
104
104
|
var crypto3 = require("crypto");
|
|
105
105
|
var packageJson = require_package();
|
|
@@ -237,7 +237,7 @@ var require_main = __commonJS({
|
|
|
237
237
|
if (options && options.path && options.path.length > 0) {
|
|
238
238
|
if (Array.isArray(options.path)) {
|
|
239
239
|
for (const filepath of options.path) {
|
|
240
|
-
if (
|
|
240
|
+
if (fs5.existsSync(filepath)) {
|
|
241
241
|
possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`;
|
|
242
242
|
}
|
|
243
243
|
}
|
|
@@ -245,15 +245,15 @@ var require_main = __commonJS({
|
|
|
245
245
|
possibleVaultPath = options.path.endsWith(".vault") ? options.path : `${options.path}.vault`;
|
|
246
246
|
}
|
|
247
247
|
} else {
|
|
248
|
-
possibleVaultPath =
|
|
248
|
+
possibleVaultPath = path4.resolve(process.cwd(), ".env.vault");
|
|
249
249
|
}
|
|
250
|
-
if (
|
|
250
|
+
if (fs5.existsSync(possibleVaultPath)) {
|
|
251
251
|
return possibleVaultPath;
|
|
252
252
|
}
|
|
253
253
|
return null;
|
|
254
254
|
}
|
|
255
255
|
function _resolveHome(envPath) {
|
|
256
|
-
return envPath[0] === "~" ?
|
|
256
|
+
return envPath[0] === "~" ? path4.join(os.homedir(), envPath.slice(1)) : envPath;
|
|
257
257
|
}
|
|
258
258
|
function _configVault(options) {
|
|
259
259
|
const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || options && options.debug);
|
|
@@ -270,7 +270,7 @@ var require_main = __commonJS({
|
|
|
270
270
|
return { parsed };
|
|
271
271
|
}
|
|
272
272
|
function configDotenv(options) {
|
|
273
|
-
const dotenvPath =
|
|
273
|
+
const dotenvPath = path4.resolve(process.cwd(), ".env");
|
|
274
274
|
let encoding = "utf8";
|
|
275
275
|
let processEnv = process.env;
|
|
276
276
|
if (options && options.processEnv != null) {
|
|
@@ -298,13 +298,13 @@ var require_main = __commonJS({
|
|
|
298
298
|
}
|
|
299
299
|
let lastError;
|
|
300
300
|
const parsedAll = {};
|
|
301
|
-
for (const
|
|
301
|
+
for (const path5 of optionPaths) {
|
|
302
302
|
try {
|
|
303
|
-
const parsed = DotenvModule.parse(
|
|
303
|
+
const parsed = DotenvModule.parse(fs5.readFileSync(path5, { encoding }));
|
|
304
304
|
DotenvModule.populate(parsedAll, parsed, options);
|
|
305
305
|
} catch (e) {
|
|
306
306
|
if (debug) {
|
|
307
|
-
_debug(`Failed to load ${
|
|
307
|
+
_debug(`Failed to load ${path5} ${e.message}`);
|
|
308
308
|
}
|
|
309
309
|
lastError = e;
|
|
310
310
|
}
|
|
@@ -317,7 +317,7 @@ var require_main = __commonJS({
|
|
|
317
317
|
const shortPaths = [];
|
|
318
318
|
for (const filePath of optionPaths) {
|
|
319
319
|
try {
|
|
320
|
-
const relative =
|
|
320
|
+
const relative = path4.relative(process.cwd(), filePath);
|
|
321
321
|
shortPaths.push(relative);
|
|
322
322
|
} catch (e) {
|
|
323
323
|
if (debug) {
|
|
@@ -481,9 +481,9 @@ var require_cli_options = __commonJS({
|
|
|
481
481
|
})();
|
|
482
482
|
|
|
483
483
|
// scripts/analyze.ts
|
|
484
|
-
var
|
|
485
|
-
var
|
|
486
|
-
var
|
|
484
|
+
var import_child_process2 = require("child_process");
|
|
485
|
+
var fs4 = __toESM(require("fs"));
|
|
486
|
+
var path3 = __toESM(require("path"));
|
|
487
487
|
|
|
488
488
|
// node_modules/uuid/dist/esm-node/rng.js
|
|
489
489
|
var import_crypto = __toESM(require("crypto"));
|
|
@@ -1018,21 +1018,116 @@ function atomicWriteFileSync(filePath, content) {
|
|
|
1018
1018
|
fs.renameSync(tmpPath, filePath);
|
|
1019
1019
|
}
|
|
1020
1020
|
|
|
1021
|
-
// scripts/lib/
|
|
1022
|
-
var
|
|
1021
|
+
// scripts/lib/ai-provider.ts
|
|
1022
|
+
var import_child_process = require("child_process");
|
|
1023
1023
|
var fs2 = __toESM(require("fs"));
|
|
1024
|
+
var path = __toESM(require("path"));
|
|
1025
|
+
var CREDENTIALS_DIR = path.join(process.env.HOME || "", ".vibebusiness");
|
|
1026
|
+
var CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, "credentials.json");
|
|
1027
|
+
function loadCredentials() {
|
|
1028
|
+
try {
|
|
1029
|
+
if (fs2.existsSync(CREDENTIALS_FILE)) {
|
|
1030
|
+
return JSON.parse(fs2.readFileSync(CREDENTIALS_FILE, "utf-8"));
|
|
1031
|
+
}
|
|
1032
|
+
} catch {
|
|
1033
|
+
}
|
|
1034
|
+
return {};
|
|
1035
|
+
}
|
|
1036
|
+
function detectClaudeCLI(customPath) {
|
|
1037
|
+
const claudeBin = customPath || "claude";
|
|
1038
|
+
try {
|
|
1039
|
+
const version = (0, import_child_process.execSync)(`${claudeBin} --version 2>/dev/null`, {
|
|
1040
|
+
timeout: 1e4,
|
|
1041
|
+
encoding: "utf-8"
|
|
1042
|
+
}).trim();
|
|
1043
|
+
return { found: true, path: claudeBin, version };
|
|
1044
|
+
} catch {
|
|
1045
|
+
const commonPaths = [
|
|
1046
|
+
"/usr/local/bin/claude",
|
|
1047
|
+
path.join(process.env.HOME || "", ".claude", "bin", "claude"),
|
|
1048
|
+
path.join(process.env.HOME || "", ".local", "bin", "claude")
|
|
1049
|
+
];
|
|
1050
|
+
for (const p of commonPaths) {
|
|
1051
|
+
try {
|
|
1052
|
+
if (fs2.existsSync(p)) {
|
|
1053
|
+
const version = (0, import_child_process.execSync)(`${p} --version 2>/dev/null`, {
|
|
1054
|
+
timeout: 1e4,
|
|
1055
|
+
encoding: "utf-8"
|
|
1056
|
+
}).trim();
|
|
1057
|
+
return { found: true, path: p, version };
|
|
1058
|
+
}
|
|
1059
|
+
} catch {
|
|
1060
|
+
continue;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
return { found: false, path: claudeBin };
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
function detectBYOKKeys() {
|
|
1067
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
1068
|
+
return { provider: "anthropic-api", key: process.env.ANTHROPIC_API_KEY, source: "env" };
|
|
1069
|
+
}
|
|
1070
|
+
if (process.env.OPENAI_API_KEY) {
|
|
1071
|
+
return { provider: "openai-api", key: process.env.OPENAI_API_KEY, source: "env" };
|
|
1072
|
+
}
|
|
1073
|
+
if (process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY) {
|
|
1074
|
+
return { provider: "google-api", key: process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY, source: "env" };
|
|
1075
|
+
}
|
|
1076
|
+
const creds = loadCredentials();
|
|
1077
|
+
if (creds.ANTHROPIC_API_KEY) {
|
|
1078
|
+
process.env.ANTHROPIC_API_KEY = creds.ANTHROPIC_API_KEY;
|
|
1079
|
+
return { provider: "anthropic-api", key: creds.ANTHROPIC_API_KEY, source: "credentials" };
|
|
1080
|
+
}
|
|
1081
|
+
if (creds.OPENAI_API_KEY) {
|
|
1082
|
+
process.env.OPENAI_API_KEY = creds.OPENAI_API_KEY;
|
|
1083
|
+
return { provider: "openai-api", key: creds.OPENAI_API_KEY, source: "credentials" };
|
|
1084
|
+
}
|
|
1085
|
+
if (creds.GOOGLE_API_KEY || creds.GEMINI_API_KEY) {
|
|
1086
|
+
const key = creds.GOOGLE_API_KEY || creds.GEMINI_API_KEY;
|
|
1087
|
+
process.env.GOOGLE_API_KEY = key;
|
|
1088
|
+
return { provider: "google-api", key, source: "credentials" };
|
|
1089
|
+
}
|
|
1090
|
+
return null;
|
|
1091
|
+
}
|
|
1092
|
+
var CONFIG_DIR = path.join(process.env.HOME || "", ".ai-analyst");
|
|
1093
|
+
var PROVIDER_CONFIG_FILE = path.join(CONFIG_DIR, "provider.json");
|
|
1094
|
+
function requireClaudeCLI(feature) {
|
|
1095
|
+
const cli = detectClaudeCLI();
|
|
1096
|
+
if (cli.found) {
|
|
1097
|
+
return cli.path;
|
|
1098
|
+
}
|
|
1099
|
+
const featureLabel = feature ? ` (${feature})` : "";
|
|
1100
|
+
const byok = detectBYOKKeys();
|
|
1101
|
+
if (byok) {
|
|
1102
|
+
throw new Error(
|
|
1103
|
+
`This feature${featureLabel} requires Claude Code CLI for file and tool access.
|
|
1104
|
+
Your API key is detected and works for reasoning tasks (heartbeat, idea evaluation),
|
|
1105
|
+
but codebase analysis and implementation need the full CLI.
|
|
1106
|
+
Install it with: npm install -g @anthropic-ai/claude-code`
|
|
1107
|
+
);
|
|
1108
|
+
}
|
|
1109
|
+
throw new Error(
|
|
1110
|
+
`No AI provider found${featureLabel}.
|
|
1111
|
+
Install Claude Code CLI: npm install -g @anthropic-ai/claude-code
|
|
1112
|
+
Or set an API key: export ANTHROPIC_API_KEY=sk-ant-...`
|
|
1113
|
+
);
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
// scripts/lib/paths.ts
|
|
1117
|
+
var path2 = __toESM(require("path"));
|
|
1118
|
+
var fs3 = __toESM(require("fs"));
|
|
1024
1119
|
function findProjectRoot() {
|
|
1025
1120
|
const cwd = process.cwd();
|
|
1026
|
-
if (
|
|
1121
|
+
if (fs3.existsSync(path2.join(cwd, "data", "config.json"))) {
|
|
1027
1122
|
return cwd;
|
|
1028
1123
|
}
|
|
1029
1124
|
try {
|
|
1030
|
-
const entries =
|
|
1125
|
+
const entries = fs3.readdirSync(cwd, { withFileTypes: true });
|
|
1031
1126
|
for (const entry of entries) {
|
|
1032
1127
|
if (entry.isDirectory()) {
|
|
1033
|
-
const candidate =
|
|
1034
|
-
if (
|
|
1035
|
-
return
|
|
1128
|
+
const candidate = path2.join(cwd, entry.name, "data", "config.json");
|
|
1129
|
+
if (fs3.existsSync(candidate)) {
|
|
1130
|
+
return path2.join(cwd, entry.name);
|
|
1036
1131
|
}
|
|
1037
1132
|
}
|
|
1038
1133
|
}
|
|
@@ -1040,9 +1135,9 @@ function findProjectRoot() {
|
|
|
1040
1135
|
}
|
|
1041
1136
|
let dir = cwd;
|
|
1042
1137
|
for (let i = 0; i < 5; i++) {
|
|
1043
|
-
const parent =
|
|
1138
|
+
const parent = path2.dirname(dir);
|
|
1044
1139
|
if (parent === dir) break;
|
|
1045
|
-
if (
|
|
1140
|
+
if (fs3.existsSync(path2.join(parent, "data", "config.json"))) {
|
|
1046
1141
|
return parent;
|
|
1047
1142
|
}
|
|
1048
1143
|
dir = parent;
|
|
@@ -1050,26 +1145,26 @@ function findProjectRoot() {
|
|
|
1050
1145
|
return cwd;
|
|
1051
1146
|
}
|
|
1052
1147
|
var PROJECT_DIR = findProjectRoot();
|
|
1053
|
-
var DATA_DIR =
|
|
1054
|
-
var STATUS_FILE =
|
|
1055
|
-
var TODO_FILE =
|
|
1056
|
-
var MEMORY_FILE =
|
|
1057
|
-
var IDEAS_FILE =
|
|
1058
|
-
var GOALS_FILE =
|
|
1059
|
-
var SESSIONS_FILE =
|
|
1060
|
-
var CONFIG_FILE =
|
|
1061
|
-
var BUSINESS_CONTEXT_FILE =
|
|
1062
|
-
var HYPOTHESES_FILE =
|
|
1063
|
-
var IMPLEMENTATIONS_FILE =
|
|
1064
|
-
var ROADMAP_FILE =
|
|
1065
|
-
var COMPETITORS_FILE =
|
|
1066
|
-
var POSITIONING_FILE =
|
|
1067
|
-
var PAGES_FILE =
|
|
1068
|
-
var PAYMENTS_FILE =
|
|
1069
|
-
var POSTHOG_FILE =
|
|
1070
|
-
var SOCIAL_FILE =
|
|
1071
|
-
var TEMPLATES_DIR =
|
|
1072
|
-
var COMMAND_TEMPLATES_DIR =
|
|
1148
|
+
var DATA_DIR = path2.join(PROJECT_DIR, "data");
|
|
1149
|
+
var STATUS_FILE = path2.join(PROJECT_DIR, "STATUS.md");
|
|
1150
|
+
var TODO_FILE = path2.join(PROJECT_DIR, "TODO.md");
|
|
1151
|
+
var MEMORY_FILE = path2.join(PROJECT_DIR, "MEMORY.md");
|
|
1152
|
+
var IDEAS_FILE = path2.join(DATA_DIR, "ideas.json");
|
|
1153
|
+
var GOALS_FILE = path2.join(DATA_DIR, "goals.json");
|
|
1154
|
+
var SESSIONS_FILE = path2.join(DATA_DIR, "sessions.json");
|
|
1155
|
+
var CONFIG_FILE = path2.join(DATA_DIR, "config.json");
|
|
1156
|
+
var BUSINESS_CONTEXT_FILE = path2.join(DATA_DIR, "business-context.json");
|
|
1157
|
+
var HYPOTHESES_FILE = path2.join(DATA_DIR, "hypotheses.json");
|
|
1158
|
+
var IMPLEMENTATIONS_FILE = path2.join(DATA_DIR, "implementations.json");
|
|
1159
|
+
var ROADMAP_FILE = path2.join(DATA_DIR, "roadmap.json");
|
|
1160
|
+
var COMPETITORS_FILE = path2.join(DATA_DIR, "competitors.json");
|
|
1161
|
+
var POSITIONING_FILE = path2.join(DATA_DIR, "positioning.json");
|
|
1162
|
+
var PAGES_FILE = path2.join(DATA_DIR, "pages.json");
|
|
1163
|
+
var PAYMENTS_FILE = path2.join(DATA_DIR, "payments.json");
|
|
1164
|
+
var POSTHOG_FILE = path2.join(DATA_DIR, "posthog.json");
|
|
1165
|
+
var SOCIAL_FILE = path2.join(DATA_DIR, "social.json");
|
|
1166
|
+
var TEMPLATES_DIR = path2.join(__dirname, "..", "..", "templates");
|
|
1167
|
+
var COMMAND_TEMPLATES_DIR = path2.join(TEMPLATES_DIR, "commands");
|
|
1073
1168
|
|
|
1074
1169
|
// scripts/analyze.ts
|
|
1075
1170
|
function parseArgs() {
|
|
@@ -1092,35 +1187,35 @@ function parseArgs() {
|
|
|
1092
1187
|
return { type, topic, context };
|
|
1093
1188
|
}
|
|
1094
1189
|
function loadConfig() {
|
|
1095
|
-
if (!
|
|
1190
|
+
if (!fs4.existsSync(CONFIG_FILE)) {
|
|
1096
1191
|
throw new Error("Config file not found. Please ensure data/config.json exists.");
|
|
1097
1192
|
}
|
|
1098
|
-
return JSON.parse(
|
|
1193
|
+
return JSON.parse(fs4.readFileSync(CONFIG_FILE, "utf-8"));
|
|
1099
1194
|
}
|
|
1100
1195
|
function loadBusinessContext() {
|
|
1101
|
-
if (!
|
|
1196
|
+
if (!fs4.existsSync(BUSINESS_CONTEXT_FILE)) {
|
|
1102
1197
|
return void 0;
|
|
1103
1198
|
}
|
|
1104
1199
|
try {
|
|
1105
|
-
return JSON.parse(
|
|
1200
|
+
return JSON.parse(fs4.readFileSync(BUSINESS_CONTEXT_FILE, "utf-8"));
|
|
1106
1201
|
} catch {
|
|
1107
1202
|
return void 0;
|
|
1108
1203
|
}
|
|
1109
1204
|
}
|
|
1110
1205
|
function loadIdeas() {
|
|
1111
|
-
if (!
|
|
1206
|
+
if (!fs4.existsSync(IDEAS_FILE)) {
|
|
1112
1207
|
return { ideas: [] };
|
|
1113
1208
|
}
|
|
1114
|
-
return JSON.parse(
|
|
1209
|
+
return JSON.parse(fs4.readFileSync(IDEAS_FILE, "utf-8"));
|
|
1115
1210
|
}
|
|
1116
1211
|
function saveIdeas(data) {
|
|
1117
1212
|
atomicWriteFileSync(IDEAS_FILE, JSON.stringify(data, null, 2));
|
|
1118
1213
|
}
|
|
1119
1214
|
function loadSessions() {
|
|
1120
|
-
if (!
|
|
1215
|
+
if (!fs4.existsSync(SESSIONS_FILE)) {
|
|
1121
1216
|
return { sessions: [] };
|
|
1122
1217
|
}
|
|
1123
|
-
return JSON.parse(
|
|
1218
|
+
return JSON.parse(fs4.readFileSync(SESSIONS_FILE, "utf-8"));
|
|
1124
1219
|
}
|
|
1125
1220
|
function saveSessions(data) {
|
|
1126
1221
|
atomicWriteFileSync(SESSIONS_FILE, JSON.stringify(data, null, 2));
|
|
@@ -1188,8 +1283,8 @@ function addSessionLog(sessionId, message) {
|
|
|
1188
1283
|
}
|
|
1189
1284
|
function loadGoalsContext() {
|
|
1190
1285
|
try {
|
|
1191
|
-
if (!
|
|
1192
|
-
const goalsData = JSON.parse(
|
|
1286
|
+
if (!fs4.existsSync(GOALS_FILE)) return "";
|
|
1287
|
+
const goalsData = JSON.parse(fs4.readFileSync(GOALS_FILE, "utf-8"));
|
|
1193
1288
|
const goals = goalsData.goals || [];
|
|
1194
1289
|
if (goals.length === 0) return "";
|
|
1195
1290
|
return goals.map((g) => {
|
|
@@ -1207,8 +1302,8 @@ function linkIdeasToHypotheses(ideas) {
|
|
|
1207
1302
|
const ideasWithHypothesis = ideas.filter((i) => i.hypothesis_id);
|
|
1208
1303
|
if (ideasWithHypothesis.length === 0) return;
|
|
1209
1304
|
try {
|
|
1210
|
-
if (!
|
|
1211
|
-
const data = JSON.parse(
|
|
1305
|
+
if (!fs4.existsSync(HYPOTHESES_FILE)) return;
|
|
1306
|
+
const data = JSON.parse(fs4.readFileSync(HYPOTHESES_FILE, "utf-8"));
|
|
1212
1307
|
const hypotheses = data.hypotheses || [];
|
|
1213
1308
|
let changed = false;
|
|
1214
1309
|
for (const idea of ideasWithHypothesis) {
|
|
@@ -1232,8 +1327,8 @@ function linkIdeasToHypotheses(ideas) {
|
|
|
1232
1327
|
}
|
|
1233
1328
|
function matchNewIdeasToEpics(newIdeas, ideasData) {
|
|
1234
1329
|
try {
|
|
1235
|
-
if (!
|
|
1236
|
-
const roadmapData = JSON.parse(
|
|
1330
|
+
if (!fs4.existsSync(ROADMAP_FILE)) return;
|
|
1331
|
+
const roadmapData = JSON.parse(fs4.readFileSync(ROADMAP_FILE, "utf-8"));
|
|
1237
1332
|
const epics = roadmapData.epics || [];
|
|
1238
1333
|
if (epics.length === 0) return;
|
|
1239
1334
|
let matched = 0;
|
|
@@ -1267,8 +1362,8 @@ function matchNewIdeasToEpics(newIdeas, ideasData) {
|
|
|
1267
1362
|
}
|
|
1268
1363
|
function loadHypothesesContext() {
|
|
1269
1364
|
try {
|
|
1270
|
-
if (!
|
|
1271
|
-
const data = JSON.parse(
|
|
1365
|
+
if (!fs4.existsSync(HYPOTHESES_FILE)) return "";
|
|
1366
|
+
const data = JSON.parse(fs4.readFileSync(HYPOTHESES_FILE, "utf-8"));
|
|
1272
1367
|
const hypotheses = data.hypotheses || [];
|
|
1273
1368
|
if (hypotheses.length === 0) return "";
|
|
1274
1369
|
return hypotheses.filter((h) => h.status === "stated" || h.status === "testing").map(
|
|
@@ -1347,15 +1442,16 @@ function parseIdeas(response, sessionId) {
|
|
|
1347
1442
|
}
|
|
1348
1443
|
}
|
|
1349
1444
|
async function runClaudeAnalysis(prompt, config, timeoutMs = 6e5) {
|
|
1445
|
+
requireClaudeCLI("codebase analysis");
|
|
1350
1446
|
return new Promise((resolve, reject) => {
|
|
1351
1447
|
const repoPaths = config.repos.map((r) => r.path);
|
|
1352
1448
|
const workDir = repoPaths[0];
|
|
1353
1449
|
console.log("Starting Claude Code analysis...");
|
|
1354
1450
|
console.log(`Working directory: ${workDir}`);
|
|
1355
1451
|
console.log(`Timeout: ${timeoutMs / 1e3}s`);
|
|
1356
|
-
const tempPromptFile =
|
|
1357
|
-
|
|
1358
|
-
const claude = (0,
|
|
1452
|
+
const tempPromptFile = path3.join(DATA_DIR, ".analysis-prompt.txt");
|
|
1453
|
+
fs4.writeFileSync(tempPromptFile, prompt);
|
|
1454
|
+
const claude = (0, import_child_process2.spawn)("claude", [
|
|
1359
1455
|
"--print",
|
|
1360
1456
|
"--dangerously-skip-permissions"
|
|
1361
1457
|
], {
|
|
@@ -1388,7 +1484,7 @@ async function runClaudeAnalysis(prompt, config, timeoutMs = 6e5) {
|
|
|
1388
1484
|
}
|
|
1389
1485
|
}, 5e3);
|
|
1390
1486
|
try {
|
|
1391
|
-
|
|
1487
|
+
fs4.unlinkSync(tempPromptFile);
|
|
1392
1488
|
} catch {
|
|
1393
1489
|
}
|
|
1394
1490
|
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
@@ -1411,7 +1507,7 @@ async function runClaudeAnalysis(prompt, config, timeoutMs = 6e5) {
|
|
|
1411
1507
|
clearInterval(progressInterval);
|
|
1412
1508
|
clearTimeout(timeout);
|
|
1413
1509
|
try {
|
|
1414
|
-
|
|
1510
|
+
fs4.unlinkSync(tempPromptFile);
|
|
1415
1511
|
} catch {
|
|
1416
1512
|
}
|
|
1417
1513
|
const elapsed = Math.round((Date.now() - startTime) / 1e3);
|
|
@@ -1428,7 +1524,7 @@ async function runClaudeAnalysis(prompt, config, timeoutMs = 6e5) {
|
|
|
1428
1524
|
clearInterval(progressInterval);
|
|
1429
1525
|
clearTimeout(timeout);
|
|
1430
1526
|
try {
|
|
1431
|
-
|
|
1527
|
+
fs4.unlinkSync(tempPromptFile);
|
|
1432
1528
|
} catch {
|
|
1433
1529
|
}
|
|
1434
1530
|
reject(error);
|
|
@@ -1436,7 +1532,13 @@ async function runClaudeAnalysis(prompt, config, timeoutMs = 6e5) {
|
|
|
1436
1532
|
});
|
|
1437
1533
|
}
|
|
1438
1534
|
async function generateCodebaseSnapshot(config) {
|
|
1439
|
-
|
|
1535
|
+
try {
|
|
1536
|
+
requireClaudeCLI("codebase snapshot");
|
|
1537
|
+
} catch {
|
|
1538
|
+
console.log("Skipping codebase snapshot (Claude Code CLI not available)");
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1541
|
+
const snapshotPath = path3.join(DATA_DIR, "codebase-snapshot.json");
|
|
1440
1542
|
console.log("Generating codebase snapshot...");
|
|
1441
1543
|
const prompt = `You are analyzing the codebase to generate a structured snapshot.
|
|
1442
1544
|
|
|
@@ -1475,7 +1577,7 @@ Return ONLY this JSON structure (no markdown code blocks):
|
|
|
1475
1577
|
}
|
|
1476
1578
|
}`;
|
|
1477
1579
|
return new Promise((resolve) => {
|
|
1478
|
-
const claude = (0,
|
|
1580
|
+
const claude = (0, import_child_process2.spawn)("claude", [
|
|
1479
1581
|
"--print",
|
|
1480
1582
|
"--dangerously-skip-permissions",
|
|
1481
1583
|
"--model",
|
|
@@ -1506,7 +1608,7 @@ Return ONLY this JSON structure (no markdown code blocks):
|
|
|
1506
1608
|
const jsonMatch = output.match(/\{[\s\S]*\}/);
|
|
1507
1609
|
if (jsonMatch) {
|
|
1508
1610
|
const snapshot = JSON.parse(jsonMatch[0]);
|
|
1509
|
-
|
|
1611
|
+
fs4.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2));
|
|
1510
1612
|
console.log(`Codebase snapshot saved to ${snapshotPath}`);
|
|
1511
1613
|
}
|
|
1512
1614
|
} catch (error) {
|