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.
Files changed (101) hide show
  1. package/.next/standalone/.env +1 -1
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-build-manifest.json +20 -20
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  5. package/.next/standalone/.next/build-manifest.json +4 -4
  6. package/.next/standalone/.next/prerender-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  9. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  10. package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
  11. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js +1 -1
  23. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -1
  29. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/provider-status/route.js +1 -0
  31. package/.next/standalone/.next/server/app/api/provider-status/route.js.nft.json +1 -0
  32. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/ideas/[id]/page.js +1 -1
  42. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  52. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/settings.html +1 -1
  54. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  55. package/.next/standalone/.next/server/app/social/page.js +1 -1
  56. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/social.html +1 -1
  58. package/.next/standalone/.next/server/app/social.rsc +2 -2
  59. package/.next/standalone/.next/server/app-paths-manifest.json +12 -11
  60. package/.next/standalone/.next/server/chunks/3794.js +92 -17
  61. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  62. package/.next/standalone/.next/server/pages/404.html +1 -1
  63. package/.next/standalone/.next/server/pages/500.html +1 -1
  64. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  65. package/.next/standalone/data/business-context.json +60 -6
  66. package/.next/standalone/data/goals.json +50 -10
  67. package/.next/standalone/data/ideas.json +1278 -597
  68. package/.next/standalone/data/implementations.json +101 -0
  69. package/.next/standalone/data/posthog.json +68 -0
  70. package/.next/standalone/data/sessions.json +5 -4
  71. package/.next/standalone/data/social.json +86 -3
  72. package/.next/standalone/package.json +1 -1
  73. package/.next/standalone/scripts/analyze.ts +10 -0
  74. package/.next/standalone/scripts/implement.ts +37 -30
  75. package/.next/standalone/scripts/skills/social-media.ts +172 -2
  76. package/.next/static/chunks/59-76eecfb6e8216043.js +1 -0
  77. package/.next/static/chunks/app/goals/[id]/page-051064c3146131cc.js +1 -0
  78. package/.next/static/chunks/app/ideas/[id]/page-adaeb619cd0425e9.js +1 -0
  79. package/.next/static/chunks/app/roadmap/[id]/page-3822586c0d64fff1.js +1 -0
  80. package/.next/static/chunks/app/settings/page-2204cc936ec9474b.js +1 -0
  81. package/.next/static/chunks/app/social/page-018893f87b308651.js +1 -0
  82. package/.next/static/chunks/{main-61d2f25883998186.js → main-c99f3473a63aa803.js} +1 -1
  83. package/.next/static/css/d8bd6d69d1ff97e3.css +3 -0
  84. package/dist/bin/vibebusiness.js +12 -0
  85. package/dist/scripts/analyze.js +170 -68
  86. package/dist/scripts/chat.js +137 -36
  87. package/dist/scripts/heartbeat.js +617 -348
  88. package/dist/scripts/implement.js +218 -70
  89. package/dist/scripts/init.js +164 -16
  90. package/dist/scripts/provider.js +428 -0
  91. package/dist/scripts/scan.js +44 -5
  92. package/package.json +1 -1
  93. package/.next/static/chunks/59-a053b1c0e85128de.js +0 -1
  94. package/.next/static/chunks/app/goals/[id]/page-8dbeab5cc8cf0988.js +0 -1
  95. package/.next/static/chunks/app/ideas/[id]/page-89e3625db9017166.js +0 -1
  96. package/.next/static/chunks/app/roadmap/[id]/page-f437e783039534c4.js +0 -1
  97. package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +0 -1
  98. package/.next/static/chunks/app/social/page-69e480936711ccf2.js +0 -1
  99. package/.next/static/css/179dd3e0738c2fe4.css +0 -3
  100. /package/.next/static/{zIIaTqrawBK1MmHg37JOr → p1Sl4kPMQcYC3c1LgbNSP}/_buildManifest.js +0 -0
  101. /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))}}
@@ -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);
@@ -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 fs4 = require("fs");
102
- var path3 = require("path");
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 (fs4.existsSync(filepath)) {
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 = path3.resolve(process.cwd(), ".env.vault");
248
+ possibleVaultPath = path4.resolve(process.cwd(), ".env.vault");
249
249
  }
250
- if (fs4.existsSync(possibleVaultPath)) {
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] === "~" ? path3.join(os.homedir(), envPath.slice(1)) : envPath;
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 = path3.resolve(process.cwd(), ".env");
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 path4 of optionPaths) {
301
+ for (const path5 of optionPaths) {
302
302
  try {
303
- const parsed = DotenvModule.parse(fs4.readFileSync(path4, { encoding }));
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 ${path4} ${e.message}`);
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 = path3.relative(process.cwd(), filePath);
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 import_child_process = require("child_process");
485
- var fs3 = __toESM(require("fs"));
486
- var path2 = __toESM(require("path"));
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/paths.ts
1022
- var path = __toESM(require("path"));
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 (fs2.existsSync(path.join(cwd, "data", "config.json"))) {
1121
+ if (fs3.existsSync(path2.join(cwd, "data", "config.json"))) {
1027
1122
  return cwd;
1028
1123
  }
1029
1124
  try {
1030
- const entries = fs2.readdirSync(cwd, { withFileTypes: true });
1125
+ const entries = fs3.readdirSync(cwd, { withFileTypes: true });
1031
1126
  for (const entry of entries) {
1032
1127
  if (entry.isDirectory()) {
1033
- const candidate = path.join(cwd, entry.name, "data", "config.json");
1034
- if (fs2.existsSync(candidate)) {
1035
- return path.join(cwd, entry.name);
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 = path.dirname(dir);
1138
+ const parent = path2.dirname(dir);
1044
1139
  if (parent === dir) break;
1045
- if (fs2.existsSync(path.join(parent, "data", "config.json"))) {
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 = path.join(PROJECT_DIR, "data");
1054
- var STATUS_FILE = path.join(PROJECT_DIR, "STATUS.md");
1055
- var TODO_FILE = path.join(PROJECT_DIR, "TODO.md");
1056
- var MEMORY_FILE = path.join(PROJECT_DIR, "MEMORY.md");
1057
- var IDEAS_FILE = path.join(DATA_DIR, "ideas.json");
1058
- var GOALS_FILE = path.join(DATA_DIR, "goals.json");
1059
- var SESSIONS_FILE = path.join(DATA_DIR, "sessions.json");
1060
- var CONFIG_FILE = path.join(DATA_DIR, "config.json");
1061
- var BUSINESS_CONTEXT_FILE = path.join(DATA_DIR, "business-context.json");
1062
- var HYPOTHESES_FILE = path.join(DATA_DIR, "hypotheses.json");
1063
- var IMPLEMENTATIONS_FILE = path.join(DATA_DIR, "implementations.json");
1064
- var ROADMAP_FILE = path.join(DATA_DIR, "roadmap.json");
1065
- var COMPETITORS_FILE = path.join(DATA_DIR, "competitors.json");
1066
- var POSITIONING_FILE = path.join(DATA_DIR, "positioning.json");
1067
- var PAGES_FILE = path.join(DATA_DIR, "pages.json");
1068
- var PAYMENTS_FILE = path.join(DATA_DIR, "payments.json");
1069
- var POSTHOG_FILE = path.join(DATA_DIR, "posthog.json");
1070
- var SOCIAL_FILE = path.join(DATA_DIR, "social.json");
1071
- var TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
1072
- var COMMAND_TEMPLATES_DIR = path.join(TEMPLATES_DIR, "commands");
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 (!fs3.existsSync(CONFIG_FILE)) {
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(fs3.readFileSync(CONFIG_FILE, "utf-8"));
1193
+ return JSON.parse(fs4.readFileSync(CONFIG_FILE, "utf-8"));
1099
1194
  }
1100
1195
  function loadBusinessContext() {
1101
- if (!fs3.existsSync(BUSINESS_CONTEXT_FILE)) {
1196
+ if (!fs4.existsSync(BUSINESS_CONTEXT_FILE)) {
1102
1197
  return void 0;
1103
1198
  }
1104
1199
  try {
1105
- return JSON.parse(fs3.readFileSync(BUSINESS_CONTEXT_FILE, "utf-8"));
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 (!fs3.existsSync(IDEAS_FILE)) {
1206
+ if (!fs4.existsSync(IDEAS_FILE)) {
1112
1207
  return { ideas: [] };
1113
1208
  }
1114
- return JSON.parse(fs3.readFileSync(IDEAS_FILE, "utf-8"));
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 (!fs3.existsSync(SESSIONS_FILE)) {
1215
+ if (!fs4.existsSync(SESSIONS_FILE)) {
1121
1216
  return { sessions: [] };
1122
1217
  }
1123
- return JSON.parse(fs3.readFileSync(SESSIONS_FILE, "utf-8"));
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 (!fs3.existsSync(GOALS_FILE)) return "";
1192
- const goalsData = JSON.parse(fs3.readFileSync(GOALS_FILE, "utf-8"));
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 (!fs3.existsSync(HYPOTHESES_FILE)) return;
1211
- const data = JSON.parse(fs3.readFileSync(HYPOTHESES_FILE, "utf-8"));
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 (!fs3.existsSync(ROADMAP_FILE)) return;
1236
- const roadmapData = JSON.parse(fs3.readFileSync(ROADMAP_FILE, "utf-8"));
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 (!fs3.existsSync(HYPOTHESES_FILE)) return "";
1271
- const data = JSON.parse(fs3.readFileSync(HYPOTHESES_FILE, "utf-8"));
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 = path2.join(DATA_DIR, ".analysis-prompt.txt");
1357
- fs3.writeFileSync(tempPromptFile, prompt);
1358
- const claude = (0, import_child_process.spawn)("claude", [
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
- fs3.unlinkSync(tempPromptFile);
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
- fs3.unlinkSync(tempPromptFile);
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
- fs3.unlinkSync(tempPromptFile);
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
- const snapshotPath = path2.join(DATA_DIR, "codebase-snapshot.json");
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, import_child_process.spawn)("claude", [
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
- fs3.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2));
1611
+ fs4.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2));
1510
1612
  console.log(`Codebase snapshot saved to ${snapshotPath}`);
1511
1613
  }
1512
1614
  } catch (error) {