vibebusiness 1.2.83 → 1.2.85

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 (254) hide show
  1. package/.next/standalone/.env +27 -14
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-build-manifest.json +87 -70
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  5. package/.next/standalone/.next/build-manifest.json +8 -8
  6. package/.next/standalone/.next/prerender-manifest.json +1 -1
  7. package/.next/standalone/.next/required-server-files.json +1 -1
  8. package/.next/standalone/.next/routes-manifest.json +1 -1
  9. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  10. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  13. package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/briefing/route.js +1 -0
  16. package/.next/standalone/.next/server/app/api/briefing/route.js.nft.json +1 -0
  17. package/.next/standalone/.next/server/app/api/checkout/route.js +1 -1
  18. package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -1
  19. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js +1 -1
  22. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/epics/[id]/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/epics/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/goals/[id]/route.js +1 -1
  30. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/goals/route.js +1 -1
  32. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  34. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/hypotheses/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js +1 -1
  39. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js +1 -1
  41. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js +1 -1
  43. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js +1 -1
  45. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js +1 -1
  47. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/ideas/route.js +1 -1
  49. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/implementations/route.js +1 -1
  51. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/investor-updates/generate/route.js +1 -1
  53. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -1
  54. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/license/route.js +1 -1
  56. package/.next/standalone/.next/server/app/api/portal/route.js +1 -1
  57. package/.next/standalone/.next/server/app/api/provider-status/route.js +1 -1
  58. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js +1 -1
  59. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/api/social/[id]/route.js +1 -1
  61. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/social/route.js +1 -1
  63. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/webhook/route.js +1 -1
  65. package/.next/standalone/.next/server/app/briefing/page.js +1 -0
  66. package/.next/standalone/.next/server/app/briefing/page.js.nft.json +1 -0
  67. package/.next/standalone/.next/server/app/briefing/page_client-reference-manifest.js +1 -0
  68. package/.next/standalone/.next/server/app/goals/[id]/page.js +1 -1
  69. package/.next/standalone/.next/server/app/goals/[id]/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/goals/page.js +1 -1
  72. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js +1 -1
  75. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  78. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/ideas/[id]/page.js +1 -1
  81. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/index.html +1 -0
  84. package/.next/standalone/.next/server/app/index.meta +6 -0
  85. package/.next/standalone/.next/server/app/index.rsc +6 -0
  86. package/.next/standalone/.next/server/app/kanban/page.js +1 -0
  87. package/.next/standalone/.next/server/app/kanban/page.js.nft.json +1 -0
  88. package/.next/standalone/.next/server/app/kanban/page_client-reference-manifest.js +1 -0
  89. package/.next/standalone/.next/server/app/page.js +1 -1
  90. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/roadmap/[id]/page.js +1 -1
  93. package/.next/standalone/.next/server/app/roadmap/[id]/page.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/roadmap/investors/page.js +1 -1
  96. package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/roadmap/page.js +1 -1
  99. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/roadmap/public/page.js +1 -1
  102. package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/sessions/page.js +1 -1
  105. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  108. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/settings.html +1 -1
  111. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  112. package/.next/standalone/.next/server/app/social/page.js +1 -1
  113. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/social.html +1 -1
  116. package/.next/standalone/.next/server/app/social.rsc +3 -3
  117. package/.next/standalone/.next/server/app/updates/[id]/page.js +1 -1
  118. package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/updates/new/page.js +1 -1
  121. package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/updates/new.html +1 -1
  123. package/.next/standalone/.next/server/app/updates/new.rsc +3 -3
  124. package/.next/standalone/.next/server/app/updates/page.js +1 -1
  125. package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app-paths-manifest.json +18 -15
  128. package/.next/standalone/.next/server/chunks/3098.js +1 -0
  129. package/.next/standalone/.next/server/chunks/3871.js +1 -1
  130. package/.next/standalone/.next/server/chunks/4355.js +1 -0
  131. package/.next/standalone/.next/server/chunks/4471.js +2 -2
  132. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  133. package/.next/standalone/.next/server/pages/404.html +1 -1
  134. package/.next/standalone/.next/server/pages/500.html +1 -1
  135. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  137. package/.next/standalone/data/codebase-snapshot.json +55 -42
  138. package/.next/standalone/data/config.json +16 -40
  139. package/.next/standalone/data/positioning.json +10 -127
  140. package/.next/standalone/data/sessions.json +56 -312
  141. package/.next/standalone/node_modules/@esbuild/{darwin-arm64 → darwin-x64}/bin/esbuild +0 -0
  142. package/.next/standalone/node_modules/@esbuild/{darwin-arm64 → darwin-x64}/package.json +3 -3
  143. package/.next/standalone/package.json +1 -1
  144. package/.next/standalone/scripts/analyze.ts +35 -10
  145. package/.next/standalone/scripts/implement.ts +67 -17
  146. package/.next/standalone/server.js +1 -1
  147. package/.next/standalone/templates/commands/distribution-google-ads.md +86 -0
  148. package/.next/standalone/templates/commands/distribution-meta-ads.md +106 -0
  149. package/.next/standalone/templates/commands/distribution-repurpose.md +121 -0
  150. package/.next/standalone/templates/commands/distribution-seo-content.md +115 -0
  151. package/.next/standalone/templates/commands/distribution-social-expansion.md +128 -0
  152. package/.next/static/chunks/147-b00f2ac2bbec93ae.js +1 -0
  153. package/.next/static/chunks/159-4ce492ccac6de8f7.js +1 -0
  154. package/.next/static/chunks/47-eba0f8b4f9b17641.js +1 -0
  155. package/.next/static/chunks/547-921898871311cd72.js +1 -0
  156. package/.next/static/chunks/619-2b2ff3b9eaef112c.js +1 -0
  157. package/.next/static/chunks/735-b33805b2b19d17ad.js +1 -0
  158. package/.next/static/chunks/879-7fbd95e93ddc4636.js +1 -0
  159. package/.next/static/chunks/930-330300153dfcbfc0.js +1 -0
  160. package/.next/static/chunks/app/briefing/page-683aba0c52e910d7.js +1 -0
  161. package/.next/static/chunks/app/goals/[id]/page-40818dc7e710eeda.js +1 -0
  162. package/.next/static/chunks/app/goals/page-f80a64a68854e357.js +1 -0
  163. package/.next/static/chunks/app/hypotheses/[id]/page-023c882fa395f3ed.js +1 -0
  164. package/.next/static/chunks/app/hypotheses/page-168748bde00e7d90.js +1 -0
  165. package/.next/static/chunks/app/ideas/[id]/page-5f33e0ecf590ddec.js +1 -0
  166. package/.next/static/chunks/app/kanban/page-4f18f1e4f56948a5.js +1 -0
  167. package/.next/static/chunks/app/layout-cd1571ba4ed4a0fa.js +1 -0
  168. package/.next/static/chunks/app/page-0a8b9a7b052e6eac.js +1 -0
  169. package/.next/static/chunks/app/roadmap/[id]/page-9ba8a537e30c633c.js +1 -0
  170. package/.next/static/chunks/app/roadmap/investors/{page-0095ea5695573796.js → page-a914223623f56df3.js} +1 -1
  171. package/.next/static/chunks/app/roadmap/page-30de1fdc304eb572.js +1 -0
  172. package/.next/static/chunks/app/roadmap/public/page-c481b3f9217919ac.js +1 -0
  173. package/.next/static/chunks/app/sessions/page-d7eefd2fd42b4d55.js +1 -0
  174. package/.next/static/chunks/app/settings/{page-3afa908a96ce4e51.js → page-caf6daf930e4f2c6.js} +1 -1
  175. package/.next/static/chunks/app/social/page-21daeca0cf8af46b.js +1 -0
  176. package/.next/static/chunks/app/updates/[id]/page-2807cd17ae4938d0.js +1 -0
  177. package/.next/static/chunks/app/updates/new/{page-dcc67ffca587dcc2.js → page-ac5b966024ce0ddc.js} +1 -1
  178. package/.next/static/chunks/app/updates/page-b6efcdaae7f4f6d2.js +1 -0
  179. package/.next/static/chunks/{main-6ee938c5db2d5eb4.js → main-3eb11800bc19ca7f.js} +1 -1
  180. package/.next/static/chunks/{main-app-f42d9aa726a818bf.js → main-app-06ab73909d2a44c7.js} +1 -1
  181. package/.next/static/chunks/webpack-616e068a201ad621.js +1 -0
  182. package/.next/static/css/ff70d16171b1c02c.css +3 -0
  183. package/dist/bin/vibebusiness.js +1 -0
  184. package/dist/scripts/analyze.js +128 -8
  185. package/dist/scripts/heartbeat.js +17 -1
  186. package/dist/scripts/implement.js +77 -15
  187. package/package.json +1 -1
  188. package/templates/commands/distribution-google-ads.md +86 -0
  189. package/templates/commands/distribution-meta-ads.md +106 -0
  190. package/templates/commands/distribution-repurpose.md +121 -0
  191. package/templates/commands/distribution-seo-content.md +115 -0
  192. package/templates/commands/distribution-social-expansion.md +128 -0
  193. package/.next/standalone/.next/server/chunks/6299.js +0 -1
  194. package/.next/standalone/.next/server/chunks/995.js +0 -1
  195. package/.next/standalone/data/.analysis-prompt.txt +0 -170
  196. package/.next/standalone/data/business-context.json +0 -187
  197. package/.next/standalone/data/competitors.json +0 -576
  198. package/.next/standalone/data/copy/landing-improvements-2026-02-20.md +0 -111
  199. package/.next/standalone/data/copy/landing-landing-page-2026-02-20.md +0 -68
  200. package/.next/standalone/data/email-campaigns/sequences/onboarding.md +0 -183
  201. package/.next/standalone/data/email-campaigns/welcome-2026-02-20.md +0 -42
  202. package/.next/standalone/data/goals.json +0 -439
  203. package/.next/standalone/data/heartbeat-sessions.json +0 -7550
  204. package/.next/standalone/data/hypotheses.json +0 -269
  205. package/.next/standalone/data/ideas.json +0 -10747
  206. package/.next/standalone/data/implementations.json +0 -3304
  207. package/.next/standalone/data/pages.json +0 -22
  208. package/.next/standalone/data/payments.json +0 -33
  209. package/.next/standalone/data/reports/visuals/idea-first-tweet-card.png +0 -0
  210. package/.next/standalone/data/reports/visuals/idea-lp-hero-specificity-card.png +0 -0
  211. package/.next/standalone/data/reports/visuals/idea-lp-og-meta-card.png +0 -0
  212. package/.next/standalone/data/reports/visuals/idea-lp-social-proof-card.png +0 -0
  213. package/.next/standalone/data/reports/visuals/idea-readme-landing-url-card.png +0 -0
  214. package/.next/standalone/data/reports/visuals/idea-stripe-integration-card.png +0 -0
  215. package/.next/standalone/data/reports/visuals/promo-launch.png +0 -0
  216. package/.next/standalone/data/reports/visuals/promo-ship-fast.png +0 -0
  217. package/.next/standalone/data/reports/visuals/promo-while-you-slept-v2.png +0 -0
  218. package/.next/standalone/data/reports/visuals/promo-while-you-slept-v3.png +0 -0
  219. package/.next/standalone/data/reports/visuals/promo-while-you-slept.png +0 -0
  220. package/.next/standalone/data/social.json +0 -179
  221. package/.next/standalone/data/videos/ad-solo-founder-burnout.mp4 +0 -0
  222. package/.next/standalone/data/videos/staging/ad-solo-founder-burnout.json +0 -54
  223. package/.next/standalone/data/videos/while-you-slept-demo-feed.mp4 +0 -0
  224. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/0.pack +0 -0
  225. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/index.pack +0 -0
  226. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/0.pack +0 -0
  227. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/1.pack +0 -0
  228. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/2.pack +0 -0
  229. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack +0 -0
  230. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack.old +0 -0
  231. package/.next/static/chunks/280-fd1092f75f985b1e.js +0 -1
  232. package/.next/static/chunks/354-d5bc9619159f46c5.js +0 -1
  233. package/.next/static/chunks/429-8f4030371ebef5c3.js +0 -1
  234. package/.next/static/chunks/809-833fcb9fe6e81fd6.js +0 -1
  235. package/.next/static/chunks/827-6cf4bfc10d1ff0c7.js +0 -1
  236. package/.next/static/chunks/851-65b033bf38847cbb.js +0 -1
  237. package/.next/static/chunks/app/goals/[id]/page-231bb4daae0f06eb.js +0 -1
  238. package/.next/static/chunks/app/goals/page-4dfa36ac38853b88.js +0 -1
  239. package/.next/static/chunks/app/hypotheses/[id]/page-6ec09d5470557c18.js +0 -1
  240. package/.next/static/chunks/app/hypotheses/page-1732b7466579493e.js +0 -1
  241. package/.next/static/chunks/app/ideas/[id]/page-b3dfe1e61fc656a4.js +0 -1
  242. package/.next/static/chunks/app/layout-eeef7928298d2198.js +0 -1
  243. package/.next/static/chunks/app/page-3635a292b3d471c0.js +0 -1
  244. package/.next/static/chunks/app/roadmap/[id]/page-b93a96f017c8d3dd.js +0 -1
  245. package/.next/static/chunks/app/roadmap/page-eacd69a99fcfc658.js +0 -1
  246. package/.next/static/chunks/app/roadmap/public/page-6b791041894b76d2.js +0 -1
  247. package/.next/static/chunks/app/sessions/page-a56ea625acdfa13e.js +0 -1
  248. package/.next/static/chunks/app/social/page-5211c78a5f37df65.js +0 -1
  249. package/.next/static/chunks/app/updates/[id]/page-fa20533878416cd0.js +0 -1
  250. package/.next/static/chunks/app/updates/page-19a09d7046577f70.js +0 -1
  251. package/.next/static/chunks/webpack-a3c37fcbf859f6f9.js +0 -1
  252. package/.next/static/css/654766eb547c6bab.css +0 -3
  253. /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → COv1w-K5vJ1LbOqnlKgHv}/_buildManifest.js +0 -0
  254. /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → COv1w-K5vJ1LbOqnlKgHv}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{6863:function(e,n,t){Promise.resolve().then(t.t.bind(t,2846,23)),Promise.resolve().then(t.t.bind(t,9107,23)),Promise.resolve().then(t.t.bind(t,1060,23)),Promise.resolve().then(t.t.bind(t,4707,23)),Promise.resolve().then(t.t.bind(t,80,23)),Promise.resolve().then(t.t.bind(t,6423,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,117],function(){return n(4278),n(6863)}),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{8834:function(e,n,t){Promise.resolve().then(t.t.bind(t,2846,23)),Promise.resolve().then(t.t.bind(t,9107,23)),Promise.resolve().then(t.t.bind(t,1060,23)),Promise.resolve().then(t.t.bind(t,4707,23)),Promise.resolve().then(t.t.bind(t,80,23)),Promise.resolve().then(t.t.bind(t,6423,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,117],function(){return n(4278),n(8834)}),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ !function(){"use strict";var e,t,n,r,o,u,i,c,f,a={},l={};function d(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}},r=!0;try{a[e](n,n.exports,d),r=!1}finally{r&&delete l[e]}return n.exports}d.m=a,e=[],d.O=function(t,n,r,o){if(n){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u<e.length;u++){for(var n=e[u][0],r=e[u][1],o=e[u][2],c=!0,f=0;f<n.length;f++)i>=o&&Object.keys(d.O).every(function(e){return d.O[e](n[f])})?n.splice(f--,1):(c=!1,o<i&&(i=o));if(c){e.splice(u--,1);var a=r();void 0!==a&&(t=a)}}return t},d.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var o=Object.create(null);d.r(o);var u={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach(function(t){u[t]=function(){return e[t]}});return u.default=function(){return e},d.d(o,u),o},d.d=function(e,t){for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce(function(t,n){return d.f[n](e,t),t},[]))},d.u=function(e){},d.miniCssF=function(e){},d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="_N_E:",d.l=function(e,t,n,u){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var i,c,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var l=f[a];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+n){i=l;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,d.nc&&i.setAttribute("nonce",d.nc),i.setAttribute("data-webpack",o+n),i.src=d.tu(e)),r[e]=[t];var s=function(t,n){i.onerror=i.onload=null,clearTimeout(p);var o=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(function(e){return e(n)}),t)return t(n)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=s.bind(null,i.onerror),i.onload=s.bind(null,i.onload),c&&document.head.appendChild(i)},d.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.tt=function(){return void 0===u&&(u={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(u=trustedTypes.createPolicy("nextjs#bundler",u))),u},d.tu=function(e){return d.tt().createScriptURL(e)},d.p="/_next/",i={272:0,461:0},d.f.j=function(e,t){var n=d.o(i,e)?i[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(/^(272|461)$/.test(e))i[e]=0;else{var r=new Promise(function(t,r){n=i[e]=[t,r]});t.push(n[2]=r);var o=d.p+d.u(e),u=Error();d.l(o,function(t){if(d.o(i,e)&&(0!==(n=i[e])&&(i[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",u.name="ChunkLoadError",u.type=r,u.request=o,n[1](u)}},"chunk-"+e,e)}}},d.O.j=function(e){return 0===i[e]},c=function(e,t){var n,r,o=t[0],u=t[1],c=t[2],f=0;if(o.some(function(e){return 0!==i[e]})){for(n in u)d.o(u,n)&&(d.m[n]=u[n]);if(c)var a=c(d)}for(e&&e(t);f<o.length;f++)r=o[f],d.o(i,r)&&i[r]&&i[r][0](),i[r]=0;return d.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(c.bind(null,0)),f.push=c.bind(null,f.push.bind(f))}();
@@ -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}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.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-12{top:3rem}.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}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.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-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.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-12{margin-top:3rem}.mt-16{margin-top:4rem}.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}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-96{height:24rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-\[600px\]{max-height:600px}.min-h-64{min-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-\[1\.25rem\]{min-width:1.25rem}.min-w-\[3rem\]{min-width:3rem}.min-w-\[700px\]{min-width:700px}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-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}.items-baseline{align-items:baseline}.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}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.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-l-4{border-left-width:4px}.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-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-blue-700\/50{border-color:rgba(29,78,216,.5)}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity,1))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity,1))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.border-emerald-700\/50{border-color:rgba(4,120,87,.5)}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-purple-700\/50{border-color:rgba(126,34,206,.5)}.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-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/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))}.border-t-transparent{border-top-color:transparent}.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{--tw-bg-opacity:1;background-color:rgb(0 0 0/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-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-blue-900\/50{background-color:rgba(30,58,138,.5)}.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-emerald-900\/50{background-color:rgba(6,78,59,.5)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/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-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.bg-purple-900\/50{background-color:rgba(88,28,135,.5)}.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-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-slate-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))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity,1))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from:#3b82f6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(59,130,246,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-slate-800{--tw-gradient-from:#1e293b var(--tw-gradient-from-position);--tw-gradient-to:rgba(30,41,59,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-slate-900{--tw-gradient-from:#0f172a var(--tw-gradient-from-position);--tw-gradient-to:rgba(15,23,42,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.to-slate-800{--tw-gradient-to:#1e293b var(--tw-gradient-to-position)}.to-slate-900{--tw-gradient-to:#0f172a var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.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}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.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-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.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-xl{font-size:1.25rem;line-height:1.75rem}.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-wide{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-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/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-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity,1))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity,1))}.text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/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-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/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-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/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-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.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-300{transition-duration:.3s}.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-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/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-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/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-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/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-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/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-amber-900:hover{--tw-text-opacity:1;color:rgb(120 53 15/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\:bg-slate-300:disabled{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.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}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:block{display:block}.md\:hidden{display:none}.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-4{grid-template-columns:repeat(4,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))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@@ -608,6 +608,7 @@ async function getIdeas() {
608
608
  }
609
609
  }));
610
610
  }
611
+ var goalsLock = getFilePath("goals") + ".lock";
611
612
  var MAX_EPIC_SIZE = 5;
612
613
  var STOP_WORDS = /* @__PURE__ */ new Set([
613
614
  "the",
@@ -1039,6 +1039,104 @@ Return a JSON array with a single idea:
1039
1039
  ]
1040
1040
  \`\`\`
1041
1041
 
1042
+ Only output the JSON array, no other text.
1043
+ `;
1044
+ }
1045
+ function generateGrowthAnalysisPrompt(options) {
1046
+ const baseContext = buildBaseContext(options.businessConfig);
1047
+ const researchProtocol = buildResearchProtocol(options.businessConfig);
1048
+ const competitors = options.businessConfig?.competitors?.join(", ") || "industry competitors";
1049
+ const productName = options.businessConfig?.product?.name || "our product";
1050
+ const productSummary = options.businessConfig?.product?.summary || "";
1051
+ return `${baseContext}
1052
+
1053
+ ## Growth Distribution Analysis Task
1054
+
1055
+ You are a growth strategist and distribution engine. Your job is to propose **concrete, channel-specific digital marketing and distribution campaigns** that a solo founder can execute with AI assistance.
1056
+
1057
+ This is NOT a codebase review. You are analyzing the product's **distribution landscape** and proposing specific campaigns to acquire users.
1058
+
1059
+ ### Step 1: Research the Distribution Landscape
1060
+
1061
+ **MANDATORY \u2014 use WebSearch for each:**
1062
+
1063
+ 1. Search: "${productName} acquisition channels ${(/* @__PURE__ */ new Date()).getFullYear()}"
1064
+ 2. Search: "${productSummary ? productSummary.split(",")[0] : productName} google ads benchmarks CPC CTR"
1065
+ 3. Search: "best marketing channels for SaaS startups ${(/* @__PURE__ */ new Date()).getFullYear()}"
1066
+ ${competitors !== "industry competitors" ? `4. For each competitor (${competitors}), search: "{competitor} marketing strategy"` : "4. Search for competitor marketing strategies in this space"}
1067
+
1068
+ **Load local data (use Read tool):**
1069
+ - \`data/competitors.json\` \u2014 competitor channels, SEO keywords, growth strategies
1070
+ - \`data/positioning.json\` \u2014 our positioning, value proposition, target audience
1071
+ - \`data/business-context.json\` \u2014 funnel health, KPIs, monetization status
1072
+ - \`data/marketing-strategies.json\` \u2014 current marketing strategy and excluded channels
1073
+
1074
+ ### Step 2: Propose Campaigns Across Scalable Channels
1075
+
1076
+ For each channel below, propose 1-2 specific campaigns with concrete details:
1077
+
1078
+ #### A. Google Ads \u2014 Search Campaigns
1079
+ - Research specific keywords via WebSearch ("[product category] keywords", "AI [category] google ads")
1080
+ - Propose keyword groups with estimated search volume and CPC
1081
+ - Specify match types and negative keywords
1082
+ - Suggest budget ($10-20/day starting point) and bidding strategy
1083
+ - Include landing page recommendation (existing page or new page to build)
1084
+ - Queue task: \`copy-ad-google-{keyword}\` for each keyword group
1085
+
1086
+ #### B. Meta/Instagram Ads Campaigns
1087
+ - Propose specific audience segments (interest targeting, lookalike, retargeting)
1088
+ - Suggest campaign objectives (awareness, traffic, conversions)
1089
+ - Specify creative format (image, carousel, video)
1090
+ - Propose budget and schedule
1091
+ - Queue task: \`copy-ad-meta-{audience}\` for each audience segment
1092
+
1093
+ #### C. Social Media Expansion (Beyond Twitter/X)
1094
+ - **LinkedIn:** Content pillars, posting frequency (3x/week), best times, post types
1095
+ - **Reddit:** Specific subreddits to target (use WebSearch to find them), content angles per sub, posting cadence, rules to follow
1096
+ - **Indie Hackers / Dev.to / Hashnode:** "What I built" posts, technical tutorials, milestone celebrations
1097
+
1098
+ #### D. SEO Content Machine
1099
+ - Keyword clusters to target (WebSearch for volume + competition)
1100
+ - Content types: comparison pages ("[Product] vs [Competitor]"), alternative pages, how-to guides
1101
+ - Programmatic page templates (one template, many pages)
1102
+
1103
+ #### E. Content Repurposing Pipeline
1104
+ - For each piece of content, specify how to adapt for every channel
1105
+ - Example: shipped feature \u2192 Twitter thread + Reddit post + LinkedIn post + email newsletter + Google Ads keyword group + Meta retargeting ad
1106
+
1107
+ ### Step 3: Output Format
1108
+
1109
+ Each idea MUST include:
1110
+ - **Channel name and sub-channel** (e.g., "Google Ads \u2014 Search", "Reddit \u2014 r/SideProject")
1111
+ - **Specific targeting** (keywords, audiences, subreddits)
1112
+ - **Budget recommendation** with expected CPC/CPA
1113
+ - **Content angle/hook**
1114
+ - **Expected results** (impressions, clicks, signups)
1115
+ - **UTM parameters** for attribution: utm_source={platform}&utm_medium={type}&utm_campaign={slug}
1116
+ - **Existing tasks to queue** (e.g., \`copy-ad-google-ai-product-manager\`, \`copy-social-linkedin\`)
1117
+ - **Tags** including channel: e.g., ['growth', 'google-ads'] or ['growth', 'reddit', 'r/SideProject']
1118
+
1119
+ ${researchProtocol}
1120
+ ${buildGoalsSection(options.goalsContext)}
1121
+ ${buildHypothesesSection(options.hypothesesContext)}
1122
+
1123
+ ## Output Format
1124
+
1125
+ Return a JSON array of up to ${options.maxIdeas} distribution campaign ideas:
1126
+ \`\`\`json
1127
+ [
1128
+ ${IDEA_SCHEMA}
1129
+ ]
1130
+ \`\`\`
1131
+
1132
+ IMPORTANT:
1133
+ - Every idea must have category: "growth"
1134
+ - Every idea must have specific channel + targeting details in the context field
1135
+ - Every idea must include UTM parameters in the implementation_plan
1136
+ - Tags must include the channel name (e.g., "google-ads", "meta-ads", "reddit", "linkedin", "seo")
1137
+ - Include budget estimates where applicable
1138
+ - Be SPECIFIC: name the keywords, subreddits, audiences \u2014 not generic advice
1139
+
1042
1140
  Only output the JSON array, no other text.
1043
1141
  `;
1044
1142
  }
@@ -1054,6 +1152,8 @@ function getAnalysisPrompt(options) {
1054
1152
  return generateSEOAnalysisPrompt(options);
1055
1153
  case "research":
1056
1154
  return generateResearchPrompt(options);
1155
+ case "growth":
1156
+ return generateGrowthAnalysisPrompt(options);
1057
1157
  default:
1058
1158
  return generateQuickAnalysisPrompt(options);
1059
1159
  }
@@ -1544,7 +1644,7 @@ function parseArgs() {
1544
1644
  for (const arg of args) {
1545
1645
  if (arg.startsWith("--type=")) {
1546
1646
  const value = arg.split("=")[1];
1547
- if (["quick", "deep", "metrics", "seo", "research"].includes(value)) {
1647
+ if (["quick", "deep", "metrics", "seo", "research", "growth"].includes(value)) {
1548
1648
  type = value;
1549
1649
  }
1550
1650
  } else if (arg.startsWith("--topic=")) {
@@ -1640,15 +1740,33 @@ function updateSession(sessionId, updates) {
1640
1740
  saveSessions(sessions);
1641
1741
  }
1642
1742
  }
1743
+ var pendingLogs = /* @__PURE__ */ new Map();
1643
1744
  function addSessionLog(sessionId, message) {
1644
- const sessions = loadSessions();
1645
- const index = sessions.sessions.findIndex((s) => s.id === sessionId);
1646
- if (index !== -1) {
1647
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
1648
- sessions.sessions[index].logs.push(`[${timestamp}] ${message}`);
1649
- saveSessions(sessions);
1650
- }
1651
1745
  console.log(message);
1746
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
1747
+ const entry = `[${timestamp}] ${message}`;
1748
+ const existing = pendingLogs.get(sessionId) ?? [];
1749
+ existing.push(entry);
1750
+ pendingLogs.set(sessionId, existing);
1751
+ }
1752
+ function flushSessionLogs(sessionId) {
1753
+ const lines = pendingLogs.get(sessionId);
1754
+ const n = lines?.length ?? 0;
1755
+ console.log(`[analyze] Flushing ${n} buffered log lines for session ${sessionId}`);
1756
+ try {
1757
+ const sessions = loadSessions();
1758
+ const index = sessions.sessions.findIndex((s) => s.id === sessionId);
1759
+ if (index !== -1 && lines && lines.length > 0) {
1760
+ sessions.sessions[index].logs.push(...lines);
1761
+ saveSessions(sessions);
1762
+ }
1763
+ } catch (err) {
1764
+ const msg = err instanceof Error ? err.message : String(err);
1765
+ console.log(`[analyze] ERROR: failed to flush session logs for ${sessionId}: ${msg}`);
1766
+ throw err;
1767
+ } finally {
1768
+ pendingLogs.delete(sessionId);
1769
+ }
1652
1770
  }
1653
1771
  function loadGoalsContext() {
1654
1772
  try {
@@ -2122,6 +2240,8 @@ async function main() {
2122
2240
  console.error("\n=== Analysis Failed ===");
2123
2241
  console.error(error);
2124
2242
  process.exit(1);
2243
+ } finally {
2244
+ flushSessionLogs(session.id);
2125
2245
  }
2126
2246
  }
2127
2247
  if (process.argv[1] && /[/\\]analyze\.(ts|js)$/.test(process.argv[1])) {
@@ -34412,6 +34412,7 @@ async function getIdeas() {
34412
34412
  }
34413
34413
  }));
34414
34414
  }
34415
+ var goalsLock = getFilePath("goals") + ".lock";
34415
34416
  var MAX_EPIC_SIZE = 5;
34416
34417
  var STOP_WORDS = /* @__PURE__ */ new Set([
34417
34418
  "the",
@@ -35931,6 +35932,18 @@ Best practice workflow:
35931
35932
  3. Review research findings \u2192 approve or revise
35932
35933
  4. Approved \u2192 trigger "implement-{id}" for autonomous implementation
35933
35934
 
35935
+ GROWTH DISTRIBUTION ANALYSIS:
35936
+ - "growth-analysis" \u2192 Run growth/distribution analysis to generate digital marketing campaign ideas
35937
+ - Generates ideas for: Google Ads keywords, Meta Ads audiences, Reddit posts, LinkedIn content, SEO pages, content repurposing
35938
+ - Each idea includes specific channel, targeting, budget, and expected results
35939
+
35940
+ When to recommend growth-analysis:
35941
+ 1. Acquisition goal is "behind" or "at_risk" \u2192 URGENT: run growth-analysis
35942
+ 2. No growth-category ideas exist in inbox or under_review \u2192 run growth-analysis
35943
+ 3. Last growth analysis was >14 days ago \u2192 schedule growth-analysis
35944
+ 4. Monthly budget changed (paid_ads no longer excluded) \u2192 run growth-analysis to propose paid campaigns
35945
+ 5. New competitor detected \u2192 run growth-analysis to find their channels we're not using
35946
+
35934
35947
  GOAL-GAP RESEARCH:
35935
35948
  - To research ideas for an underperforming goal, use task_id: "goal-gap-research-{goalId}"
35936
35949
  - Use when a goal is "behind" or "at_risk" AND has few/no active ideas working toward it
@@ -38683,6 +38696,9 @@ async function executeTask(task, config, businessContext) {
38683
38696
  case "seo-audit":
38684
38697
  await runAnalysis("seo");
38685
38698
  return true;
38699
+ case "growth-analysis":
38700
+ await runAnalysis("growth");
38701
+ return true;
38686
38702
  default:
38687
38703
  if (taskId.startsWith("evaluate-shipped-")) {
38688
38704
  const ideaId = taskId.replace("evaluate-shipped-", "");
@@ -39131,7 +39147,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39131
39147
  log(`Task to do: ${taskToDo.id} \u2014 ${taskToDo.description}`);
39132
39148
  const success = await executeTask(taskToDo, heartbeatConfig, businessContext);
39133
39149
  if (success && !DRY_RUN) {
39134
- if (!["quick-analysis", "deep-analysis", "metrics-analysis", "seo-audit"].includes(taskToDo.id)) {
39150
+ if (!["quick-analysis", "deep-analysis", "metrics-analysis", "seo-audit", "growth-analysis"].includes(taskToDo.id)) {
39135
39151
  updateTodoFile(taskToDo.id, true);
39136
39152
  }
39137
39153
  } else if (!success) {
@@ -6,6 +6,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
9
13
  var __copyProps = (to, from, except, desc) => {
10
14
  if (from && typeof from === "object" || typeof from === "function") {
11
15
  for (let key of __getOwnPropNames(from))
@@ -22,8 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
26
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
27
  mod
24
28
  ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
30
 
26
31
  // scripts/implement.ts
32
+ var implement_exports = {};
33
+ __export(implement_exports, {
34
+ revertIdeaStage: () => revertIdeaStage,
35
+ updateImplementation: () => updateImplementation
36
+ });
37
+ module.exports = __toCommonJS(implement_exports);
27
38
  var import_child_process3 = require("child_process");
28
39
  var fs5 = __toESM(require("fs"));
29
40
  var os = __toESM(require("os"));
@@ -370,6 +381,25 @@ function updateIdea(ideaId, updates) {
370
381
  saveJson(IDEAS_FILE, data);
371
382
  }
372
383
  }
384
+ function revertIdeaStage(ideaId, reason) {
385
+ try {
386
+ const data = loadJson(IDEAS_FILE);
387
+ const index = data.ideas.findIndex((i) => i.id === ideaId);
388
+ if (index !== -1) {
389
+ data.ideas[index].stage = "approved";
390
+ if (!data.ideas[index].comments) data.ideas[index].comments = [];
391
+ data.ideas[index].comments.push({
392
+ id: `comment-${Date.now()}`,
393
+ author: "system",
394
+ body: reason,
395
+ created_at: (/* @__PURE__ */ new Date()).toISOString()
396
+ });
397
+ saveJson(IDEAS_FILE, data);
398
+ }
399
+ } catch (e) {
400
+ console.error("[implement] Failed to revert idea stage", { ideaId, error: e.message });
401
+ }
402
+ }
373
403
  function createImplementation(ideaId, repoName, branchName, workspacePath) {
374
404
  const data = loadJson(IMPLEMENTATIONS_FILE);
375
405
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -573,7 +603,7 @@ async function runImplementation(workspacePath, prompt, implId, timeoutMs = 3e5,
573
603
  claudeArgs.push("--allowedTools", "Read Edit Write Bash");
574
604
  }
575
605
  claudeArgs.push("-p", prompt);
576
- return new Promise((resolve) => {
606
+ return new Promise((resolve, reject) => {
577
607
  const claude = (0, import_child_process3.spawn)("claude", claudeArgs, {
578
608
  cwd: workspacePath,
579
609
  env: { ...process.env },
@@ -604,7 +634,7 @@ async function runImplementation(workspacePath, prompt, implId, timeoutMs = 3e5,
604
634
  } catch {
605
635
  }
606
636
  }, 5e3);
607
- resolve(false);
637
+ reject(new Error(`Implementation timed out after ${timeoutMs / 1e3}s`));
608
638
  }
609
639
  }, timeoutMs);
610
640
  claude.stdout.on("data", (data) => {
@@ -624,10 +654,10 @@ async function runImplementation(workspacePath, prompt, implId, timeoutMs = 3e5,
624
654
  const elapsed = Math.round((Date.now() - startTime) / 1e3);
625
655
  if (code === 0) {
626
656
  addLog(implId, `Claude Code completed successfully in ${elapsed}s (${output.length} chars)`);
627
- resolve(true);
657
+ resolve();
628
658
  } else {
629
659
  addLog(implId, `Claude Code exited with code ${code} after ${elapsed}s`);
630
- resolve(false);
660
+ reject(new Error(`Claude Code exited with code ${code}`));
631
661
  }
632
662
  });
633
663
  claude.on("error", (error) => {
@@ -635,7 +665,7 @@ async function runImplementation(workspacePath, prompt, implId, timeoutMs = 3e5,
635
665
  isResolved = true;
636
666
  clearTimeout(timeout);
637
667
  addLog(implId, `Claude Code error: ${error.message}`);
638
- resolve(false);
668
+ reject(error);
639
669
  });
640
670
  });
641
671
  }
@@ -721,10 +751,27 @@ async function main() {
721
751
  if (scope) console.log(`Mode: Scoped sub-task`);
722
752
  if (skipPr) console.log(`Mode: Skip PR creation`);
723
753
  if (createPrOnly) console.log(`Mode: Create PR only`);
724
- const config = loadConfig();
725
- const idea = loadIdea(ideaId);
754
+ let config;
755
+ try {
756
+ config = loadConfig();
757
+ } catch (err) {
758
+ const e = err;
759
+ console.error("[implement] Failed to load config", { error: e.message, file: CONFIG_FILE });
760
+ console.error(`[implement] Cannot continue without config \u2014 exiting. Check that ${CONFIG_FILE} exists and contains valid JSON.`);
761
+ process.exit(1);
762
+ }
763
+ let idea;
764
+ try {
765
+ idea = loadIdea(ideaId);
766
+ } catch (err) {
767
+ const e = err;
768
+ console.error("[implement] Failed to load idea", { ideaId, error: e.message, file: IDEAS_FILE });
769
+ console.error(`[implement] Cannot continue without idea record \u2014 exiting. Check that ${IDEAS_FILE} exists and contains valid JSON.`);
770
+ process.exit(1);
771
+ }
726
772
  if (!idea) {
727
- console.error(`Idea not found: ${ideaId}`);
773
+ console.error("[implement] Failed to load idea", { ideaId, error: "idea not found in ideas file", file: IDEAS_FILE });
774
+ console.error(`[implement] Idea ${ideaId} not found \u2014 exiting.`);
728
775
  process.exit(1);
729
776
  }
730
777
  console.log(`Title: ${idea.title}`);
@@ -749,7 +796,14 @@ async function main() {
749
796
  const defaultBranch = targetRepo.default_branch || "main";
750
797
  console.log(`Branch: ${branchName}`);
751
798
  console.log(`Workspace: ${config.workspace_dir}`);
752
- const implData = loadJson(IMPLEMENTATIONS_FILE);
799
+ let implData;
800
+ try {
801
+ implData = loadJson(IMPLEMENTATIONS_FILE);
802
+ } catch (err) {
803
+ const e = err;
804
+ console.error("[implement] Failed to load implementations file, falling back to fresh session", { error: e.message, file: IMPLEMENTATIONS_FILE });
805
+ implData = { implementations: [] };
806
+ }
753
807
  const existingImpl = implData.implementations.find(
754
808
  (i) => i.idea_id === ideaId && i.status !== "failed" && i.status !== "completed"
755
809
  );
@@ -821,14 +875,11 @@ async function main() {
821
875
  }
822
876
  updateImplementation(impl.id, { status: "implementing" });
823
877
  const prompt = generatePrompt(idea, scope);
824
- const success = await runImplementation(workspacePath, prompt, impl.id, timeout, {
878
+ await runImplementation(workspacePath, prompt, impl.id, timeout, {
825
879
  model: model || (scope ? "sonnet" : void 0),
826
880
  // Default to sonnet for sub-tasks
827
881
  scoped: !!scope
828
882
  });
829
- if (!success) {
830
- throw new Error("Implementation failed");
831
- }
832
883
  if (hasChanges(workspacePath)) {
833
884
  addLog(impl.id, "Changes detected, staging and committing...");
834
885
  if (scope) {
@@ -902,12 +953,23 @@ Idea: ${idea.id}`;
902
953
  const err = error;
903
954
  addLog(impl.id, `Error: ${err.message}`);
904
955
  updateImplementation(impl.id, {
905
- status: "failed"
956
+ status: "failed",
957
+ error_message: err.message
906
958
  });
959
+ revertIdeaStage(ideaId, `Implementation failed: ${err.message}`);
960
+ console.error("[implement] Fatal error", { ideaId, implId: impl.id, error: err.message, stack: err.stack });
907
961
  console.error(`
908
962
  === Implementation Failed ===`);
909
963
  console.error(err.message);
910
964
  process.exit(1);
911
965
  }
912
966
  }
913
- main().catch(console.error);
967
+ var _scriptPath = process.argv[1] ?? "";
968
+ if (_scriptPath.endsWith("implement.ts") || _scriptPath.endsWith("implement.js")) {
969
+ main().catch(console.error);
970
+ }
971
+ // Annotate the CommonJS export names for ESM import in node:
972
+ 0 && (module.exports = {
973
+ revertIdeaStage,
974
+ updateImplementation
975
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.83",
3
+ "version": "1.2.85",
4
4
  "description": "AI-powered autonomous product manager. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -0,0 +1,86 @@
1
+ # /distribution-google-ads — Google Ads Campaign Playbook
2
+
3
+ ## Usage
4
+ ```
5
+ /distribution-google-ads # Full campaign design
6
+ /distribution-google-ads {keyword} # Campaign for specific keyword cluster
7
+ ```
8
+
9
+ ## Input
10
+ - `$ARGUMENTS` — optional: specific keyword or keyword cluster to target
11
+
12
+ ## Process
13
+
14
+ ### Step 1: Load Context
15
+ 1. Read `data/positioning.json` — value proposition, target audience, differentiators
16
+ 2. Read `data/competitors.json` — competitor SEO keywords, growth channels
17
+ 3. Read `data/business-context.json` — product name, funnels, KPIs, monetization
18
+
19
+ ### Step 2: Keyword Research
20
+ Use WebSearch to find keyword opportunities:
21
+ - `"[product category] google ads keywords [year]"`
22
+ - `"[product category] search volume CPC benchmarks"`
23
+ - `"[competitor name] google ads keywords"` (for each top competitor)
24
+ - `"[product pain point] solution"` (problem-aware searches)
25
+
26
+ For each keyword group, estimate:
27
+ - Monthly search volume
28
+ - Average CPC
29
+ - Competition level (low/medium/high)
30
+ - Commercial intent (informational/commercial/transactional)
31
+
32
+ ### Step 3: Campaign Structure
33
+ Design campaigns following Google Ads best practices:
34
+
35
+ ```
36
+ Campaign: [Product Category] — Search
37
+ ├── Ad Group: Brand Terms
38
+ │ ├── Keywords: [product name], [product name] review, [product name] pricing
39
+ │ └── Negative: free, open source, tutorial
40
+ ├── Ad Group: Problem-Aware
41
+ │ ├── Keywords: [pain point] solution, how to [solve problem]
42
+ │ └── Negative: DIY, manual
43
+ ├── Ad Group: Competitor Terms
44
+ │ ├── Keywords: [competitor] alternative, [competitor] vs
45
+ │ └── Negative: [competitor] login, [competitor] support
46
+ └── Ad Group: Category Terms
47
+ ├── Keywords: best [category] tool, [category] software
48
+ └── Negative: free, open source
49
+ ```
50
+
51
+ ### Step 4: Generate Ad Copy
52
+ For each ad group, queue copy generation:
53
+ - `/promo-copy ad-google {keyword}` — generates 3 headlines (30 chars) + 2 descriptions (90 chars)
54
+ - Ensure copy matches keyword intent
55
+ - Include call-to-action aligned with landing page
56
+
57
+ ### Step 5: Landing Page Recommendations
58
+ For each ad group:
59
+ - Map to existing page if available (check `data/pages.json`)
60
+ - If no matching page exists, queue `/build-page {slug}` with ad-specific messaging
61
+ - Ensure landing page has conversion tracking (PostHog events)
62
+
63
+ ### Step 6: Budget & Bidding Strategy
64
+ Recommend starting budget:
65
+ - **Phase 1 (Week 1-2):** $10-15/day across all ad groups — gather data
66
+ - **Phase 2 (Week 3-4):** Pause underperformers, double down on winners — $15-20/day
67
+ - **Bidding:** Start with Maximize Clicks, switch to Target CPA after 30 conversions
68
+
69
+ ### Step 7: Conversion Tracking
70
+ Define tracking setup:
71
+ - UTM parameters: `utm_source=google&utm_medium=cpc&utm_campaign={campaign-slug}&utm_content={ad-group}`
72
+ - PostHog events to track: page_view, signup_started, signup_completed
73
+ - Google Ads conversion action: signup_completed
74
+
75
+ ### Step 8: Output
76
+ For each campaign, create an idea in `data/ideas.json` with:
77
+ - Category: "growth"
78
+ - Tags: ["growth", "google-ads", "{keyword-group}"]
79
+ - Implementation plan with full campaign structure
80
+ - Success metrics: impressions, clicks, CTR, CPC, conversions, CPA
81
+ - Budget recommendation
82
+ - Queue `copy-ad-google-{keyword}` tasks
83
+
84
+ ## Output Files
85
+ - `data/ideas.json` — new Google Ads campaign ideas
86
+ - `data/campaigns/` — campaign briefs (optional)