vibebusiness 1.2.84 → 1.2.87

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 (90) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +25 -25
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  35. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/page.js +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/roadmap/public/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_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/settings.html +1 -1
  53. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  54. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/social.html +1 -1
  56. package/.next/standalone/.next/server/app/social.rsc +1 -1
  57. package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/updates/new.html +1 -1
  61. package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
  62. package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app-paths-manifest.json +11 -11
  65. package/.next/standalone/.next/server/chunks/6299.js +1 -1
  66. package/.next/standalone/.next/server/chunks/7151.js +10 -10
  67. package/.next/standalone/.next/server/pages/404.html +1 -1
  68. package/.next/standalone/.next/server/pages/500.html +1 -1
  69. package/.next/standalone/.next/server/pages-manifest.json +1 -1
  70. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  71. package/.next/standalone/data/business-context.json +1 -1
  72. package/.next/standalone/data/goals.json +1 -1
  73. package/.next/standalone/data/ideas.json +25 -8
  74. package/.next/standalone/data/implementations.json +40 -2
  75. package/.next/standalone/data/reports/visuals/idea-3f4595f7-card.png +0 -0
  76. package/.next/standalone/data/reports/visuals/idea-4rxt3mkj-card.png +0 -0
  77. package/.next/standalone/data/reports/visuals/idea-6631456b-card.png +0 -0
  78. package/.next/standalone/data/reports/visuals/idea-boot-001-card.png +0 -0
  79. package/.next/standalone/data/reports/visuals/idea-fb3eba74-card.png +0 -0
  80. package/.next/standalone/data/reports/visuals/idea-prqf3lob-card.png +0 -0
  81. package/.next/standalone/package.json +1 -1
  82. package/.next/static/chunks/app/page-d325a95479e7c453.js +1 -0
  83. package/dist/bin/vibebusiness.js +2 -0
  84. package/dist/scripts/heartbeat.js +120 -6
  85. package/dist/scripts/scan.js +3 -0
  86. package/dist/scripts/social-routine.js +3 -0
  87. package/package.json +1 -1
  88. package/.next/static/chunks/app/page-01dbe60c967e1d7e.js +0 -1
  89. /package/.next/static/{wNtgcOjGe3Ddj1fZJp4v3 → kgtR3Ls8MG4aQqwp3I0UE}/_buildManifest.js +0 -0
  90. /package/.next/static/{wNtgcOjGe3Ddj1fZJp4v3 → kgtR3Ls8MG4aQqwp3I0UE}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/654766eb547c6bab.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js"/><script src="/_next/static/chunks/fd9d1056-8c714984d5b17b60.js" async=""></script><script src="/_next/static/chunks/117-23260fd0b5f0bd9a.js" async=""></script><script src="/_next/static/chunks/main-app-f42d9aa726a818bf.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AI Product Manager</title><meta name="description" content="AI Product Manager - Autonomous improvement proposals"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen bg-slate-50"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/654766eb547c6bab.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"wNtgcOjGe3Ddj1fZJp4v3\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/654766eb547c6bab.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen bg-slate-50\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AI Product Manager\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"AI Product Manager - Autonomous improvement proposals\"}]]\n3:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/654766eb547c6bab.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js"/><script src="/_next/static/chunks/fd9d1056-8c714984d5b17b60.js" async=""></script><script src="/_next/static/chunks/117-23260fd0b5f0bd9a.js" async=""></script><script src="/_next/static/chunks/main-app-f42d9aa726a818bf.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AI Product Manager</title><meta name="description" content="AI Product Manager - Autonomous improvement proposals"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen bg-slate-50"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/654766eb547c6bab.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"kgtR3Ls8MG4aQqwp3I0UE\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/654766eb547c6bab.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen bg-slate-50\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AI Product Manager\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"AI Product Manager - Autonomous improvement proposals\"}]]\n3:null\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" defer=""></script><script src="/_next/static/chunks/framework-f66176bb897dc684.js" defer=""></script><script src="/_next/static/chunks/main-6ee938c5db2d5eb4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-72b849fbd24ac258.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7ba65e1336b92748.js" defer=""></script><script src="/_next/static/wNtgcOjGe3Ddj1fZJp4v3/_buildManifest.js" defer=""></script><script src="/_next/static/wNtgcOjGe3Ddj1fZJp4v3/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"wNtgcOjGe3Ddj1fZJp4v3","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" defer=""></script><script src="/_next/static/chunks/framework-f66176bb897dc684.js" defer=""></script><script src="/_next/static/chunks/main-6ee938c5db2d5eb4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-72b849fbd24ac258.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7ba65e1336b92748.js" defer=""></script><script src="/_next/static/kgtR3Ls8MG4aQqwp3I0UE/_buildManifest.js" defer=""></script><script src="/_next/static/kgtR3Ls8MG4aQqwp3I0UE/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"kgtR3Ls8MG4aQqwp3I0UE","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- {"/_app":"pages/_app.js","/_error":"pages/_error.js","/_document":"pages/_document.js","/404":"pages/404.html"}
1
+ {"/_error":"pages/_error.js","/_app":"pages/_app.js","/_document":"pages/_document.js","/404":"pages/404.html"}
@@ -1 +1 @@
1
- {"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"FeD7eD253vOXADLWmxA8XSfPT5TYn6wYTkJbega3Jq0="}
1
+ {"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"FPXGr6bC7+RXazd2oi2jDkpRxYAiPKKwH7YGVpUyog0="}
@@ -183,5 +183,5 @@
183
183
  }
184
184
  }
185
185
  ],
186
- "last_auto_update": "2026-02-24T01:21:05.058Z"
186
+ "last_auto_update": "2026-02-26T15:06:39.362Z"
187
187
  }
@@ -444,4 +444,4 @@
444
444
  "related_ideas": []
445
445
  }
446
446
  ]
447
- }
447
+ }
@@ -6217,7 +6217,8 @@
6217
6217
  "output_snippet": "\n=== AI Product Manager - Implementation ===\n\nIdea ID: idea-8c9cf42c\nMode: Scoped sub-task\nMode: Skip PR creation\nTitle: Add workspaces/ and .analysis-prompt.txt to .gitignore\nCategory: security\nTarget repo: vibebusiness\nBranch: ai/idea-8c9cf42c-impl\nWorkspace: /Users/luismey/Code/vibebusiness/workspaces\nUsing pre-configured worktree: /Users/luismey/Code/vibebusiness/workspaces/vibebusiness-worktrees/ai/idea-8c9cf42c-impl-g1\nRunning Claude Code to implement changes (timeout: 600s (model: sonnet))...\nBoth acceptance criteria are met:\n\n- `git status` — neither `workspaces/` nor `data/.analysis-prompt.txt` appears as an untracked file.\n- `git check-ignore -v` output:\n - `.gitignore:86:workspaces/` — matched by line 86\n - `.gitignore:75:data/.analysis-prompt.txt` — matched by line 75\n\nNo changes were needed; both rules were already present in `.gitignore`. No negation rules (`!data/`) exist that could override them.\nClaude Code completed successfully in 15s (423 chars)\nSkipping PR creation (--skip-pr)\n\n=== Implementation Complete (PR skipped) ===\nBranch: ai/idea-8c9cf42c-impl\n"
6218
6218
  }
6219
6219
  ],
6220
- "decomposition_attempts": 1
6220
+ "decomposition_attempts": 1,
6221
+ "pr_creation_attempts": 1
6221
6222
  },
6222
6223
  "comments": [
6223
6224
  {
@@ -7414,7 +7415,7 @@
7414
7415
  {
7415
7416
  "id": "idea-fb3eba74",
7416
7417
  "created_at": "2026-02-19T19:31:25.141Z",
7417
- "updated_at": "2026-02-23T06:00:00Z",
7418
+ "updated_at": "2026-02-26T15:06:50.709Z",
7418
7419
  "title": "Add atomic file writes and per-file locking to storage layer",
7419
7420
  "summary": "All JSON data mutations use read-modify-write without locks or atomic writes, causing silent data loss when heartbeat, analyze, and API routes run concurrently.",
7420
7421
  "category": "tech_debt",
@@ -7429,7 +7430,7 @@
7429
7430
  "Lock contention rate baseline: unmeasured → target: <5 contention events per heartbeat session within 1 week",
7430
7431
  "Session log write count per analysis: baseline ~50 writes → target: 1 write (batch flush) within 1 week"
7431
7432
  ],
7432
- "stage": "in_progress",
7433
+ "stage": "shipped",
7433
7434
  "source": {
7434
7435
  "type": "codebase_analysis",
7435
7436
  "session_id": "session-2c7f65d3",
@@ -7446,7 +7447,7 @@
7446
7447
  "pr_number": null,
7447
7448
  "commits": [],
7448
7449
  "started_at": "2026-02-23T06:00:00Z",
7449
- "completed_at": null,
7450
+ "completed_at": "2026-02-26T15:06:50.709Z",
7450
7451
  "sub_tasks": [
7451
7452
  {
7452
7453
  "id": "st-001",
@@ -7658,7 +7659,7 @@
7658
7659
  }
7659
7660
  ],
7660
7661
  "decomposition_attempts": 1,
7661
- "pr_creation_attempts": 1
7662
+ "pr_creation_attempts": 3
7662
7663
  },
7663
7664
  "comments": [
7664
7665
  {
@@ -7666,6 +7667,20 @@
7666
7667
  "author": "ai-analyst",
7667
7668
  "created_at": "2026-02-22T00:00:00.000Z",
7668
7669
  "body": "TRIAGE 2026-02-22 (dedup-triage-and-approve-inbox): Moved to under_review. Has merit but did not score in top 8 for this triage pass. Re-evaluate in next batch triage when approved queue drops below 3."
7670
+ },
7671
+ {
7672
+ "id": "comment-1772118277051",
7673
+ "author": "system",
7674
+ "author_name": "System",
7675
+ "content": "Auto-shipped: PR creation failed 2 times (likely changes already on main branch). No PR created.",
7676
+ "created_at": "2026-02-26T15:04:37.051Z"
7677
+ },
7678
+ {
7679
+ "id": "comment-1772118410709",
7680
+ "author": "system",
7681
+ "author_name": "System",
7682
+ "content": "Auto-shipped: PR creation failed 3 times (likely changes already on main branch). No PR created.",
7683
+ "created_at": "2026-02-26T15:06:50.709Z"
7669
7684
  }
7670
7685
  ],
7671
7686
  "tags": [
@@ -8903,13 +8918,13 @@
8903
8918
  "summary": "Display a daily briefing as a dashboard view showing KPI snapshots, prioritized recommendations, alerts, and recent activity.",
8904
8919
  "context": "Landing page audit: promises 'delivers morning briefing with prioritized recommendations' but heartbeat only updates STATUS.md — no human-readable summary view exists in the dashboard.",
8905
8920
  "rationale": "The morning briefing is a core differentiator vs. ChatGPT which 'forgets sessions'. Users need a single view that answers 'what happened overnight and what should I focus on today?' without reading raw markdown files.",
8906
- "stage": "approved",
8921
+ "stage": "testing",
8907
8922
  "category": "product",
8908
8923
  "effort": "m",
8909
8924
  "impact": "l",
8910
8925
  "priority": "high",
8911
8926
  "created_at": "2026-02-21T02:44:44.000Z",
8912
- "updated_at": "2026-02-23T05:56:23Z",
8927
+ "updated_at": "2026-02-26T15:04:49.614Z",
8913
8928
  "implementation_plan": "1. Create /briefing route (or prominent section on main dashboard page)\n2. Build BriefingView component that aggregates: KPI snapshot with trends (from /api/goals), top 3 prioritized recommendations (from /api/ideas sorted by score), alerts (stale ideas, at-risk goals, unmeasured KPIs), recently shipped ideas, what the heartbeat worked on (from STATUS.md/TODO.md)\n3. Add API route /api/briefing that compiles all data into a single payload\n4. Make this the default view when user opens dashboard each morning\n5. Add date-based greeting and summary header",
8914
8929
  "success_metrics": [
8915
8930
  "Briefing view loads in <2 seconds with all sections populated",
@@ -9179,7 +9194,9 @@
9179
9194
  "output_snippet": "p/api/briefing/__tests__/integration.test.ts`:\n\n**6 tests covering the full briefing feature:**\n\n1. **API shape test** — Fixtures with 2 goals (3 KPIs total), 5 ideas (1 stale, 1 shipped, 3 actionable). Asserts: status 200, `alerts.length >= 2`, `recommendations.length === 3`, `kpi_snapshots.length === 3`, `recently_shipped` contains only the shipped idea.\n\n2. **Alert accuracy test** — One `at_risk` goal + one `on_track` goal + one stale idea (10 days old). Asserts exactly one `at_risk_goal` alert (severity=`critical`) and one `stale_idea` alert (severity=`warning`), with zero false positives for the healthy goal.\n\n3. **Recommendation scoring test** — Three ideas: `critical+xl` (45), `critical+xs` (41), `high+l` (34). Asserts the top-3 order by `priority_score×10 + impact_score` descending.\n\n4. **Heartbeat parse test** — Mocks `fs.readFileSync` per filename to return `Last check-in: 2026-02-23T09:00:00Z` and task lists. Asserts `last_checkin`, `in_progress_tasks`, and `recently_completed` are parsed correctly.\n\n5. **Error handling test** — `getIdeas()` throws `Error('disk read failure')`. Asserts status 500, `success === false`, and `console.error` was called with `'[/api/briefing] Failed to compile briefing:'`.\n\n6. **Missing files test** — `fs.readFileSync` throws ENOENT. Asserts status is still 200 (graceful degradation) with `heartbeat.last_checkin === null` and empty task arrays.\n\n**Key implementation details:**\n- Uses `vi.hoisted()` to declare mock functions before `vi.mock()` factories run (required for vitest)\n- Mocks both `default` and named exports of `'fs'` to handle either import style\n- Uses typed `Alert` interface inline for safe property access in test 2\n- `beforeEach` resets all mocks and sets `mockReadFileSync` to return `''` by default\nClaude Code completed successfully in 348s (1857 chars)\nChanges detected, staging and committing...\nSkipping PR creation (--skip-pr)\n\n=== Implementation Complete (PR skipped) ===\nBranch: ai/idea-morning-briefing-impl\n"
9180
9195
  }
9181
9196
  ],
9182
- "decomposition_attempts": 1
9197
+ "decomposition_attempts": 1,
9198
+ "pr_url": "https://github.com/braza-ai/100xmanager/pull/32",
9199
+ "pr_number": 32
9183
9200
  },
9184
9201
  "goal_id": "goal-beta-users",
9185
9202
  "expected_impact": "First-run wow factor and daily engagement — users see the product is alive and working for them every morning",
@@ -2435,7 +2435,14 @@
2435
2435
  "[2026-02-23T05:49:08.858Z] Checking out branch: ai/idea-8c9cf42c-impl",
2436
2436
  "[2026-02-23T05:49:08.869Z] Merging origin/main into ai/idea-8c9cf42c-impl...",
2437
2437
  "[2026-02-23T05:49:08.877Z] Create PR only mode — skipping implementation",
2438
- "[2026-02-23T05:49:08.887Z] No commits to push, skipping PR creation"
2438
+ "[2026-02-23T05:49:08.887Z] No commits to push, skipping PR creation",
2439
+ "[2026-02-26T15:06:51.152Z] Fetching latest from origin...",
2440
+ "[2026-02-26T15:06:55.162Z] Checking out branch: ai/idea-8c9cf42c-impl",
2441
+ "[2026-02-26T15:06:55.215Z] Merging origin/main into ai/idea-8c9cf42c-impl...",
2442
+ "[2026-02-26T15:06:55.374Z] Create PR only mode — skipping implementation",
2443
+ "[2026-02-26T15:06:55.387Z] Pushing branch ai/idea-8c9cf42c-impl to origin",
2444
+ "[2026-02-26T15:06:59.131Z] Creating PR with gh CLI",
2445
+ "[2026-02-26T15:07:02.072Z] Failed to create PR: Command failed: gh pr create --title [AI] Add workspaces/ and .analysis-prompt.txt to .gitignore --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlyqrgb9.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-8c9cf42c-impl (createPullRequest)\n"
2439
2446
  ]
2440
2447
  },
2441
2448
  {
@@ -3186,7 +3193,21 @@
3186
3193
  "[2026-02-24T01:13:50.244Z] Create PR only mode — skipping implementation",
3187
3194
  "[2026-02-24T01:13:50.260Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3188
3195
  "[2026-02-24T01:13:51.445Z] Creating PR with gh CLI",
3189
- "[2026-02-24T01:13:52.612Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\na pull request for branch \"ai/idea-fb3eba74-impl\" into branch \"main\" already exists:\nhttps://github.com/braza-ai/100xmanager/pull/29\n"
3196
+ "[2026-02-24T01:13:52.612Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\na pull request for branch \"ai/idea-fb3eba74-impl\" into branch \"main\" already exists:\nhttps://github.com/braza-ai/100xmanager/pull/29\n",
3197
+ "[2026-02-26T15:04:24.063Z] Fetching latest from origin...",
3198
+ "[2026-02-26T15:04:30.185Z] Checking out branch: ai/idea-fb3eba74-impl",
3199
+ "[2026-02-26T15:04:30.217Z] Merging origin/main into ai/idea-fb3eba74-impl...",
3200
+ "[2026-02-26T15:04:30.324Z] Create PR only mode — skipping implementation",
3201
+ "[2026-02-26T15:04:30.336Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3202
+ "[2026-02-26T15:04:34.111Z] Creating PR with gh CLI",
3203
+ "[2026-02-26T15:04:37.015Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-fb3eba74-impl (createPullRequest)\n",
3204
+ "[2026-02-26T15:06:40.266Z] Fetching latest from origin...",
3205
+ "[2026-02-26T15:06:44.435Z] Checking out branch: ai/idea-fb3eba74-impl",
3206
+ "[2026-02-26T15:06:44.483Z] Merging origin/main into ai/idea-fb3eba74-impl...",
3207
+ "[2026-02-26T15:06:44.494Z] Create PR only mode — skipping implementation",
3208
+ "[2026-02-26T15:06:44.510Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3209
+ "[2026-02-26T15:06:48.065Z] Creating PR with gh CLI",
3210
+ "[2026-02-26T15:06:50.670Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-fb3eba74-impl (createPullRequest)\n"
3190
3211
  ]
3191
3212
  },
3192
3213
  {
@@ -3299,6 +3320,23 @@
3299
3320
  "[2026-02-24T01:34:12.229Z] Changes detected, staging and committing...",
3300
3321
  "[2026-02-24T01:34:12.318Z] Skipping PR creation (--skip-pr)"
3301
3322
  ]
3323
+ },
3324
+ {
3325
+ "id": "impl-mm3lgu4f",
3326
+ "idea_id": "idea-morning-briefing",
3327
+ "status": "completed",
3328
+ "repo_name": "vibebusiness",
3329
+ "branch_name": "ai/idea-morning-briefing-impl",
3330
+ "workspace_path": "/Users/luismey/Code/vibebusiness/workspaces/vibebusiness",
3331
+ "logs": [
3332
+ "[2026-02-26T15:04:37.503Z] Implementation started",
3333
+ "[2026-02-26T15:04:37.504Z] Fetching latest from origin...",
3334
+ "[2026-02-26T15:04:41.557Z] Checking out branch: ai/idea-morning-briefing-impl",
3335
+ "[2026-02-26T15:04:41.599Z] Merging origin/main into ai/idea-morning-briefing-impl...",
3336
+ "[2026-02-26T15:04:41.689Z] Create PR only mode — skipping implementation",
3337
+ "[2026-02-26T15:04:41.700Z] Pushing branch ai/idea-morning-briefing-impl to origin",
3338
+ "[2026-02-26T15:04:45.865Z] Creating PR with gh CLI"
3339
+ ]
3302
3340
  }
3303
3341
  ]
3304
3342
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.84",
3
+ "version": "1.2.87",
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 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{7075:function(e,t,s){Promise.resolve().then(s.bind(s,4067)),Promise.resolve().then(s.bind(s,1259)),Promise.resolve().then(s.bind(s,8825))},4067:function(e,t,s){"use strict";s.d(t,{default:function(){return o}});var a=s(7437),r=s(9376),l=s(6221),i=s(9801),n=s(4372),c=s(6076),d=s(8623);function o(e){let{stats:t}=e,s=(0,r.useRouter)();return(0,a.jsx)("header",{className:"px-6 py-4 bg-white border-b border-slate-200",children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-slate-900",children:"Idea Dashboard"}),(0,a.jsxs)("div",{className:"flex items-center gap-6 mt-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-slate-600",children:[(0,a.jsx)(l.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.total," total"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-amber-600",children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.inbox," in inbox"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-violet-600",children:[(0,a.jsx)(n.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.inProgress," in progress"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-emerald-600",children:[(0,a.jsx)(c.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.shipped," shipped"]})]})]})]}),(0,a.jsx)(d.Z,{onAnalysisComplete:()=>{s.refresh()}})]})})}},1259:function(e,t,s){"use strict";s.d(t,{default:function(){return f}});var a=s(7437),r=s(7648),l=s(9376),i=s(5466),n=s(2048),c=s(8896),d=s(8220),o=s(2718),x=s(5621),m=s(8728),u=s(2222),h=s(2023),b=s(1994),g=s(257);let p=[{href:"/",label:"Dashboard",icon:(0,a.jsx)(i.Z,{className:"w-5 h-5"})},{href:"/roadmap",label:"Roadmap",icon:(0,a.jsx)(n.Z,{className:"w-5 h-5"})},{href:"/goals",label:"Goals",icon:(0,a.jsx)(c.Z,{className:"w-5 h-5"})},{href:"/hypotheses",label:"Hypotheses",icon:(0,a.jsx)(d.Z,{className:"w-5 h-5"})},{href:"/social",label:"Social",icon:(0,a.jsx)(o.Z,{className:"w-5 h-5"})},{href:"/sessions",label:"Sessions",icon:(0,a.jsx)(x.Z,{className:"w-5 h-5"})},{href:"/settings",label:"Settings",icon:(0,a.jsx)(m.Z,{className:"w-5 h-5"})}];function f(e){let{children:t}=e,s=(0,l.usePathname)();return(0,a.jsxs)("div",{className:"min-h-screen flex",children:[(0,a.jsxs)("aside",{className:"w-64 bg-slate-900 text-white flex flex-col",children:[(0,a.jsx)("div",{className:"p-4 border-b border-slate-700",children:(0,a.jsxs)(r.default,{href:"/",className:"flex items-center gap-2",children:[(0,a.jsx)("div",{className:"w-10 h-10 bg-emerald-500 rounded-lg flex items-center justify-center",children:(0,a.jsx)(u.Z,{className:"w-6 h-6 text-white"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"font-bold text-lg leading-tight",children:"Analyst"}),(0,a.jsx)("p",{className:"text-xs text-slate-400",children:g.env.NEXT_PUBLIC_PRODUCT_NAME||"Business"})]})]})}),(0,a.jsx)("nav",{className:"flex-1 p-4",children:(0,a.jsx)("ul",{className:"space-y-1",children:p.map(e=>{let t="/"===e.href?"/"===s:s.startsWith(e.href);return(0,a.jsx)("li",{children:(0,a.jsxs)(r.default,{href:e.href,className:(0,b.Z)("flex items-center gap-3 px-3 py-2 rounded-lg transition-colors",t?"bg-slate-800 text-white":"text-slate-400 hover:text-white hover:bg-slate-800"),children:[e.icon,(0,a.jsx)("span",{children:e.label})]})},e.href)})})}),(0,a.jsx)("div",{className:"p-4 border-t border-slate-700",children:(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs text-slate-500",children:[(0,a.jsx)(h.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Powered by Claude"})]})})]}),(0,a.jsx)("main",{className:"flex-1 overflow-auto",children:t})]})}},8623:function(e,t,s){"use strict";s.d(t,{Z:function(){return o}});var a=s(7437),r=s(2265),l=s(1817),i=s(3276),n=s(1671),c=s(9322),d=s(1994);function o(e){let{onAnalysisComplete:t}=e,[s,o]=(0,r.useState)(!1),[x,m]=(0,r.useState)(!1),[u,h]=(0,r.useState)(null),b=async e=>{m(!0),h(null);try{let s=await fetch("/api/analyze",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:e})}),a=await s.json();a.success?(h({success:!0,message:"Generated ".concat(a.ideas_count," new ideas")}),null==t||t()):h({success:!1,message:a.error||"Analysis failed"})}catch(e){h({success:!1,message:"Failed to start analysis"})}finally{m(!1),setTimeout(()=>{h(null),o(!1)},3e3)}};return(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("button",{onClick:()=>o(!s),disabled:x,className:(0,d.Z)("btn btn-primary gap-2",x&&"opacity-75 cursor-wait"),children:x?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l.Z,{className:"w-4 h-4 animate-spin"}),(0,a.jsx)("span",{children:"Analyzing..."})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Analyze Now"})]})}),s&&!x&&(0,a.jsxs)("div",{className:"absolute right-0 mt-2 w-56 bg-white rounded-lg shadow-lg border border-slate-200 py-2 z-10 animate-slide-in",children:[(0,a.jsxs)("button",{onClick:()=>b("quick"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Quick Scan"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Recent changes, TODOs, errors"})]}),(0,a.jsxs)("button",{onClick:()=>b("deep"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Deep Review"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Architecture, tech debt, security"})]}),(0,a.jsxs)("button",{onClick:()=>b("metrics"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Metrics Review"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Funnels, conversions, drop-offs"})]}),(0,a.jsxs)("button",{onClick:()=>b("seo"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"SEO Audit"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Blog performance, technical SEO"})]})]}),u&&(0,a.jsx)("div",{className:(0,d.Z)("absolute right-0 mt-2 px-4 py-3 rounded-lg shadow-lg animate-slide-in",u.success?"bg-emerald-50 border border-emerald-200":"bg-red-50 border border-red-200"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[u.success?(0,a.jsx)(n.Z,{className:"w-4 h-4 text-emerald-600"}):(0,a.jsx)(c.Z,{className:"w-4 h-4 text-red-600"}),(0,a.jsx)("span",{className:(0,d.Z)("text-sm font-medium",u.success?"text-emerald-800":"text-red-800"),children:u.message})]})})]})}},8825:function(e,t,s){"use strict";s.d(t,{default:function(){return C}});var a=s(7437),r=s(2265),l=s(3247),i=s(740),n=s(2489),c=s(1994),d=s(7648),o=s(9322),x=s(265),m=s(6858),u=s(5051),h=s(1239),b=s(3417),g=s(8896),p=s(4286),f=s(6646),j=s(6153);function v(e){let{priority:t}=e;switch(t){case"critical":return(0,a.jsx)(o.Z,{className:"w-3 h-3"});case"high":return(0,a.jsx)(x.Z,{className:"w-3 h-3"});case"medium":return(0,a.jsx)(m.Z,{className:"w-3 h-3"});case"low":return(0,a.jsx)(u.Z,{className:"w-3 h-3"});default:return null}}function N(e){var t,s;let{size:r,label:l}=e;return(0,a.jsx)("span",{className:"size-badge",title:l,children:null!==(s=null!==(t=j.bi[r])&&void 0!==t?t:r)&&void 0!==s?s:"—"})}function y(e){var t,s,r,l,i;let{idea:n,compact:o=!1}=e,m=null!==(t=n.comments)&&void 0!==t?t:[],u=null!==(s=n.tags)&&void 0!==s?s:[],y=m.length>0;return(0,a.jsx)(d.default,{href:"/ideas/".concat(n.id),children:(0,a.jsxs)("div",{className:"idea-card",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsxs)("span",{className:(0,c.Z)("priority-badge",null!==(r=j.Gs[n.priority])&&void 0!==r?r:"bg-slate-100 text-slate-600"),children:[(0,a.jsx)(v,{priority:n.priority}),(0,a.jsx)("span",{className:"ml-1",children:null!==(i=null!==(l=j.rF[n.priority])&&void 0!==l?l:n.priority)&&void 0!==i?i:"—"})]}),(0,a.jsx)("span",{className:(0,c.Z)("category-badge",j.pG[n.category]),children:j.Hs[n.category]})]}),(0,a.jsx)("h3",{className:"font-medium text-slate-900 text-sm leading-snug mb-1",children:n.title}),!o&&(0,a.jsx)("p",{className:"text-xs text-slate-500 line-clamp-2 mb-2",children:n.summary}),(0,a.jsxs)("div",{className:"flex items-center justify-between mt-2 pt-2 border-t border-slate-100",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1",title:"Effort",children:[(0,a.jsx)(h.Z,{className:"w-3 h-3 text-slate-400"}),(0,a.jsx)(N,{size:n.effort,label:"Effort"})]}),(0,a.jsx)("span",{className:"text-slate-300",children:"/"}),(0,a.jsxs)("div",{className:"flex items-center gap-1",title:"Impact",children:[(0,a.jsx)(x.Z,{className:"w-3 h-3 text-slate-400"}),(0,a.jsx)(N,{size:n.impact,label:"Impact"})]})]}),y&&(0,a.jsxs)("div",{className:"flex items-center gap-1 text-slate-400",children:[(0,a.jsx)(b.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:"text-xs",children:m.length})]})]}),n.goal_id&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-2 text-emerald-600",children:[(0,a.jsx)(g.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:"text-[10px]",children:"Goal aligned"})]}),"shipped"===n.stage&&n.verification&&"pending"!==n.verification.status&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,a.jsx)(p.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:(0,c.Z)("text-[10px] px-1 py-0.5 rounded",j.aR[n.verification.status]),children:j.Wb[n.verification.status]})]}),n.verification_status&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,a.jsx)(f.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:(0,c.Z)("text-[10px] px-1 py-0.5 rounded","proceed"===n.verification_status&&"bg-green-100 text-green-700","extend"===n.verification_status&&"bg-blue-100 text-blue-700","investigate"===n.verification_status&&"bg-yellow-100 text-yellow-700","stop"===n.verification_status&&"bg-red-100 text-red-700"),children:n.verification_status.toUpperCase()})]}),!o&&u.length>0&&(0,a.jsxs)("div",{className:"flex flex-wrap gap-1 mt-2",children:[u.slice(0,3).map(e=>(0,a.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 bg-slate-100 text-slate-500 rounded",children:e},e)),u.length>3&&(0,a.jsxs)("span",{className:"text-[10px] text-slate-400",children:["+",u.length-3]})]})]})})}var w=s(8623);let Z=["product","ux_design","growth","performance","tech_debt","security","infrastructure","content","analytics","integration"],_=["critical","high","medium","low"],k=["xs","s","m","l","xl"];function C(e){let{ideas:t}=e,[s,d]=(0,r.useState)({categories:[],priorities:[],efforts:[],search:""}),[o,x]=(0,r.useState)(!1),[m,u]=(0,r.useState)(null),h=(0,r.useMemo)(()=>{let e={all:t.length};return t.forEach(t=>{e[t.category]=(e[t.category]||0)+1}),e},[t]),b=(0,r.useMemo)(()=>t.filter(e=>{if(m&&e.category!==m)return!1;if(s.search){let t=s.search.toLowerCase();if(!(e.title.toLowerCase().includes(t)||e.summary.toLowerCase().includes(t)||e.tags.some(e=>e.toLowerCase().includes(t))))return!1}return(!(s.categories.length>0)||!!s.categories.includes(e.category))&&(!(s.priorities.length>0)||!!s.priorities.includes(e.priority))&&(!(s.efforts.length>0)||!!s.efforts.includes(e.effort))}),[t,s,m]),g=(0,r.useMemo)(()=>{let e={};return j.G.forEach(t=>{e[t]=[]}),b.forEach(t=>{j.G.includes(t.stage)&&e[t.stage].push(t)}),e},[b]),p=s.categories.length+s.priorities.length+s.efforts.length,f=null!==m||""!==s.search||p>0,v=(e,t)=>{d(s=>{let a=s[e],r=a.includes(t)?a.filter(e=>e!==t):[...a,t];return{...s,[e]:r}})};return(0,a.jsxs)("div",{className:"h-full flex flex-col",children:[(0,a.jsx)("div",{className:"px-6 py-3 bg-slate-50 border-b border-slate-200 overflow-x-auto",children:(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsxs)("button",{onClick:()=>u(null),className:(0,c.Z)("px-3 py-1.5 text-sm font-medium rounded-full whitespace-nowrap transition-colors",null===m?"bg-slate-800 text-white":"bg-white text-slate-600 hover:bg-slate-100 border border-slate-200"),children:["All",(0,a.jsxs)("span",{className:"ml-1.5 text-xs opacity-70",children:["(",h.all,")"]})]}),Z.map(e=>(0,a.jsxs)("button",{onClick:()=>u(e),className:(0,c.Z)("px-3 py-1.5 text-sm font-medium rounded-full whitespace-nowrap transition-colors",m===e?j.pG[e]:"bg-white text-slate-600 hover:bg-slate-100 border border-slate-200"),children:[j.Hs[e],h[e]>0&&(0,a.jsxs)("span",{className:"ml-1.5 text-xs opacity-70",children:["(",h[e],")"]})]},e))]})}),(0,a.jsxs)("div",{className:"px-6 py-4 bg-white border-b border-slate-200",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsxs)("div",{className:"relative flex-1 max-w-md",children:[(0,a.jsx)(l.Z,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400"}),(0,a.jsx)("input",{type:"text",placeholder:"Search ideas...",value:s.search,onChange:e=>d(t=>({...t,search:e.target.value})),className:"input pl-10"})]}),(0,a.jsxs)("button",{onClick:()=>x(!o),className:(0,c.Z)("btn btn-secondary gap-2",o&&"bg-slate-200"),children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Filters"}),p>0&&(0,a.jsx)("span",{className:"px-1.5 py-0.5 bg-emerald-500 text-white text-xs rounded-full",children:p})]}),p>0&&(0,a.jsxs)("button",{onClick:()=>{d({categories:[],priorities:[],efforts:[],search:""})},className:"btn btn-ghost gap-1 text-sm",children:[(0,a.jsx)(n.Z,{className:"w-4 h-4"}),"Clear"]})]}),o&&(0,a.jsxs)("div",{className:"mt-4 flex flex-wrap gap-6 animate-slide-in",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Category"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:Z.map(e=>(0,a.jsx)("button",{onClick:()=>v("categories",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.categories.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.Hs[e]},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Priority"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:_.map(e=>(0,a.jsx)("button",{onClick:()=>v("priorities",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.priorities.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.rF[e]},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Effort"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:k.map(e=>(0,a.jsx)("button",{onClick:()=>v("efforts",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.efforts.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.bi[e]},e))})]})]})]}),0!==t.length||f?(0,a.jsx)("div",{className:"flex-1 overflow-x-auto p-6",children:(0,a.jsx)("div",{className:"flex gap-4 h-full min-w-max",children:j.G.map(e=>(0,a.jsxs)("div",{className:"w-72 flex flex-col",children:[(0,a.jsxs)("div",{className:"kanban-column-header",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("div",{className:(0,c.Z)("stage-indicator",j.lv[e])}),(0,a.jsx)("span",{className:"font-medium text-slate-700",children:j.yb[e]})]}),(0,a.jsx)("span",{className:"text-sm text-slate-400",children:g[e].length})]}),(0,a.jsx)("div",{className:"kanban-column flex-1 overflow-y-auto",children:0===g[e].length?(0,a.jsx)("div",{className:"text-center py-8 text-slate-400 text-sm",children:"No ideas"}):g[e].map(e=>(0,a.jsx)(y,{idea:e},e.id))})]},e))})}):(0,a.jsx)("div",{className:"flex-1 flex items-center justify-center p-6",children:(0,a.jsxs)("div",{className:"flex flex-col items-center justify-center h-96 text-center gap-6",children:[(0,a.jsx)("div",{className:"text-6xl",children:"\uD83E\uDD16"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Your AI analyst is ready"}),(0,a.jsx)("p",{className:"text-gray-500 max-w-md",children:"Run your first vibe cycle to generate prioritized improvement ideas for your codebase."})]}),(0,a.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,a.jsx)(w.Z,{}),(0,a.jsxs)("p",{className:"text-sm text-gray-400",children:["Or run: ",(0,a.jsx)("code",{className:"bg-gray-100 px-2 py-0.5 rounded",children:"vibebusiness analyze --type=quick"})]})]}),(0,a.jsxs)("div",{className:"mt-4 opacity-40 pointer-events-none border border-dashed border-gray-300 rounded-lg p-4 w-72 text-left",children:[(0,a.jsx)("div",{className:"text-xs font-medium text-gray-400 uppercase mb-1",children:"Example idea"}),(0,a.jsx)("div",{className:"font-medium text-gray-700 text-sm",children:"Add empty-state onboarding UI to Kanban"}),(0,a.jsx)("div",{className:"text-xs text-gray-400 mt-1",children:"ux_design \xb7 XS effort \xb7 high impact"})]})]})})]})}},6153:function(e,t,s){"use strict";s.d(t,{G:function(){return n},GK:function(){return _},Gs:function(){return o},Hs:function(){return a},PN:function(){return h},PW:function(){return w},Q_:function(){return b},R$:function(){return N},Vr:function(){return x},Wb:function(){return u},aR:function(){return m},bi:function(){return c},en:function(){return v},i2:function(){return j},kT:function(){return g},l5:function(){return p},lE:function(){return y},lv:function(){return i},pG:function(){return r},rF:function(){return d},tV:function(){return f},tl:function(){return Z},xP:function(){return k},yb:function(){return l}});let a={product:"Product",ux_design:"UX/Design",growth:"Growth",performance:"Performance",tech_debt:"Tech Debt",security:"Security",infrastructure:"Infrastructure",content:"Content",analytics:"Analytics",integration:"Integration"},r={product:"bg-blue-100 text-blue-800",ux_design:"bg-purple-100 text-purple-800",growth:"bg-green-100 text-green-800",performance:"bg-orange-100 text-orange-800",tech_debt:"bg-yellow-100 text-yellow-800",security:"bg-red-100 text-red-800",infrastructure:"bg-gray-100 text-gray-800",content:"bg-pink-100 text-pink-800",analytics:"bg-cyan-100 text-cyan-800",integration:"bg-indigo-100 text-indigo-800"},l={inbox:"Inbox",under_review:"Under Review",approved:"Approved",in_progress:"In Progress",testing:"Testing",shipped:"Shipped",deferred:"Deferred",rejected:"Rejected",rolled_back:"Rolled Back"},i={inbox:"bg-amber-500",under_review:"bg-blue-500",approved:"bg-emerald-500",in_progress:"bg-violet-500",testing:"bg-cyan-500",shipped:"bg-green-500",deferred:"bg-gray-500",rejected:"bg-red-500",rolled_back:"bg-orange-500"},n=["inbox","under_review","approved","in_progress","testing","shipped"],c={xs:"XS",s:"S",m:"M",l:"L",xl:"XL"},d={critical:"Critical",high:"High",medium:"Medium",low:"Low"},o={critical:"bg-red-100 text-red-800 border-red-300",high:"bg-orange-100 text-orange-800 border-orange-300",medium:"bg-yellow-100 text-yellow-800 border-yellow-300",low:"bg-gray-100 text-gray-800 border-gray-300"},x={codebase_analysis:"Codebase Analysis",metrics_review:"Metrics Review",market_research:"Market Research",seo_audit:"SEO Audit",manual:"Manual"},m={pending:"bg-slate-100 text-slate-700",validated:"bg-emerald-100 text-emerald-800",needs_investigation:"bg-amber-100 text-amber-800",inconclusive:"bg-slate-100 text-slate-600",invalidated:"bg-red-100 text-red-800"},u={pending:"Pending",validated:"Validated",needs_investigation:"Needs Investigation",inconclusive:"Inconclusive",invalidated:"Invalidated"},h={ship:"Ship",update:"Update",milestone:"Milestone",digest:"Digest",manual:"Manual",thread:"Thread",insight:"Insight"},b={ship:"bg-green-100 text-green-800",update:"bg-blue-100 text-blue-800",milestone:"bg-amber-100 text-amber-800",digest:"bg-purple-100 text-purple-800",manual:"bg-slate-100 text-slate-800",thread:"bg-indigo-100 text-indigo-800",insight:"bg-cyan-100 text-cyan-800"},g={acquisition:"Acquisition",activation:"Activation",retention:"Retention",revenue:"Revenue",referral:"Referral"},p={acquisition:"bg-blue-100 text-blue-800",activation:"bg-emerald-100 text-emerald-800",retention:"bg-purple-100 text-purple-800",revenue:"bg-amber-100 text-amber-800",referral:"bg-pink-100 text-pink-800"},f={on_track:"On Track",at_risk:"At Risk",behind:"Behind",achieved:"Achieved"},j={on_track:"bg-emerald-100 text-emerald-800 border-emerald-300",at_risk:"bg-amber-100 text-amber-800 border-amber-300",behind:"bg-red-100 text-red-800 border-red-300",achieved:"bg-blue-100 text-blue-800 border-blue-300"},v={manual:"Manual",rest_api:"REST API",posthog:"PostHog",firestore:"Firestore",stripe:"Stripe",whatsapp:"WhatsApp"},N={stated:"Stated",testing:"Testing",validated:"Validated",invalidated:"Invalidated",deferred:"Deferred"},y={stated:"bg-slate-100 text-slate-800 border-slate-300",testing:"bg-amber-100 text-amber-800 border-amber-300",validated:"bg-emerald-100 text-emerald-800 border-emerald-300",invalidated:"bg-red-100 text-red-800 border-red-300",deferred:"bg-slate-100 text-slate-500 border-slate-200"},w={acquisition:"Acquisition",engagement:"Engagement",conversion:"Conversion",monetization:"Monetization"},Z={acquisition:"bg-blue-100 text-blue-800",engagement:"bg-purple-100 text-purple-800",conversion:"bg-amber-100 text-amber-800",monetization:"bg-emerald-100 text-emerald-800"},_={planned:"Planned",active:"Active",completed:"Completed",paused:"Paused"},k={planned:"bg-slate-100 text-slate-700 border-slate-300",active:"bg-blue-100 text-blue-800 border-blue-300",completed:"bg-emerald-100 text-emerald-800 border-emerald-300",paused:"bg-amber-100 text-amber-800 border-amber-300"}}},function(e){e.O(0,[972,851,971,117,744],function(){return e(e.s=7075)}),_N_E=e.O()}]);
@@ -607,6 +607,8 @@ async function getIdeas() {
607
607
  priority: VALID_PRIORITIES.includes(idea.priority) ? idea.priority : "medium",
608
608
  impact: VALID_SIZES.includes(idea.impact) ? idea.impact : "m",
609
609
  effort: VALID_SIZES.includes(idea.effort) ? idea.effort : "s",
610
+ comments: idea.comments ?? [],
611
+ tags: idea.tags ?? [],
610
612
  epic_id: idea.epic_id ?? null,
611
613
  implementation: {
612
614
  ...idea.implementation,
@@ -9594,6 +9594,9 @@ function invokeClaudeCLI(options, claudePath) {
9594
9594
  stderr += data.toString();
9595
9595
  });
9596
9596
  if (useStdin && child.stdin) {
9597
+ child.stdin.on("error", (err2) => {
9598
+ if (err2.code !== "EPIPE") throw err2;
9599
+ });
9597
9600
  child.stdin.write(options.prompt);
9598
9601
  child.stdin.end();
9599
9602
  }
@@ -34166,6 +34169,14 @@ function execGit(args2, cwd, timeoutMs) {
34166
34169
  throw new Error(`git ${args2[0]} failed: ${stderr || execError.message}`);
34167
34170
  }
34168
34171
  }
34172
+ function checkGitAvailable() {
34173
+ try {
34174
+ (0, import_child_process10.execFileSync)("git", ["--version"], { stdio: "pipe", timeout: 5e3 });
34175
+ return true;
34176
+ } catch {
34177
+ return false;
34178
+ }
34179
+ }
34169
34180
 
34170
34181
  // scripts/lib/shell-safe.ts
34171
34182
  var SAFE_BRANCH_RE = /^[a-zA-Z0-9._\-/]+$/;
@@ -34412,6 +34423,8 @@ async function getIdeas() {
34412
34423
  priority: VALID_PRIORITIES.includes(idea.priority) ? idea.priority : "medium",
34413
34424
  impact: VALID_SIZES.includes(idea.impact) ? idea.impact : "m",
34414
34425
  effort: VALID_SIZES.includes(idea.effort) ? idea.effort : "s",
34426
+ comments: idea.comments ?? [],
34427
+ tags: idea.tags ?? [],
34415
34428
  epic_id: idea.epic_id ?? null,
34416
34429
  implementation: {
34417
34430
  ...idea.implementation,
@@ -34857,6 +34870,9 @@ init_paths();
34857
34870
  var ROOT_DIR = PROJECT_DIR;
34858
34871
  var execAsync = (0, import_util.promisify)(import_child_process11.exec);
34859
34872
  var DEFAULT_MAX_DECOMP_ATTEMPTS = 2;
34873
+ var MAX_REASONING_PROMPT_CHARS = 8e4;
34874
+ var MAX_CONTEXT_CHARS = 2e4;
34875
+ var IDLE_THRESHOLD = 2;
34860
34876
  function spawnAsync(cmd, args2, options) {
34861
34877
  return new Promise((resolve3, reject) => {
34862
34878
  const child = (0, import_child_process11.spawn)(cmd, args2, {
@@ -35734,13 +35750,16 @@ function buildContextForClaude(state, alerts, businessContext) {
35734
35750
  in_progress: state.ideas.filter((i) => i.stage === "in_progress").map((i) => {
35735
35751
  const subTasks = i.implementation.sub_tasks || [];
35736
35752
  const completed = subTasks.filter((st) => st.status === "completed").length;
35737
- const failed = subTasks.filter((st) => st.status === "failed").length;
35753
+ const failedTasks = subTasks.filter((st) => st.status === "failed");
35754
+ const lastFailedTask = failedTasks.length > 0 ? failedTasks[failedTasks.length - 1] : null;
35755
+ const lastFailureMsg = lastFailedTask?.error_message ? lastFailedTask.error_message.substring(0, 120) : null;
35738
35756
  return {
35739
35757
  id: i.id,
35740
35758
  title: i.title,
35741
35759
  days_in_progress: daysSince(i.updated_at),
35742
35760
  branch: i.implementation.branch_name,
35743
- sub_task_progress: subTasks.length > 0 ? `${completed}/${subTasks.length} done${failed > 0 ? `, ${failed} failed` : ""}` : null
35761
+ sub_task_progress: subTasks.length > 0 ? `${completed}/${subTasks.length} done${failedTasks.length > 0 ? `, ${failedTasks.length} failed` : ""}` : null,
35762
+ last_failure: lastFailureMsg
35744
35763
  };
35745
35764
  }),
35746
35765
  shipped: state.ideas.filter((i) => i.stage === "shipped").map((i) => ({
@@ -35858,8 +35877,33 @@ async function runClaudeReasoning(state, alerts, businessContext) {
35858
35877
  const memorySection = memoryContext ? `
35859
35878
 
35860
35879
  LEARNINGS FROM PREVIOUS SESSIONS:
35880
+ IMPORTANT: Any MEMORY.md entry that asserts a file exists, is missing, is a placeholder, or is disabled \u2014 re-read the referenced file NOW before treating it as current. Memory entries are hypotheses, not ground truth.
35861
35881
  ${memoryContext}
35862
35882
  ` : "";
35883
+ const CONTEXT_BUDGET = MAX_CONTEXT_CHARS;
35884
+ const contextObj = context;
35885
+ const ideasObj = contextObj.ideas;
35886
+ const contextSize = () => JSON.stringify(contextObj).length + memoryContext.length;
35887
+ if (contextSize() > CONTEXT_BUDGET && ideasObj && Array.isArray(ideasObj.shipped)) {
35888
+ const count = ideasObj.shipped.length;
35889
+ if (count > 0) {
35890
+ ideasObj.shipped = `${count} shipped ideas omitted`;
35891
+ log(`[context-trim] Dropped shipped ideas (${count})`);
35892
+ }
35893
+ }
35894
+ if (contextSize() > CONTEXT_BUDGET && ideasObj && Array.isArray(ideasObj.inbox)) {
35895
+ ideasObj.inbox = ideasObj.inbox.map((i) => ({
35896
+ id: i.id,
35897
+ title: i.title,
35898
+ priority: i.priority,
35899
+ days_in_inbox: i.days_in_inbox
35900
+ }));
35901
+ log(`[context-trim] Trimmed inbox idea details`);
35902
+ }
35903
+ if (contextSize() > CONTEXT_BUDGET && contextObj.codebase_context) {
35904
+ contextObj.codebase_context = "[codebase_context omitted to reduce prompt size]";
35905
+ log(`[context-trim] Dropped codebase_context`);
35906
+ }
35863
35907
  const prompt = `You are the AI Product Manager for ${productName}${productSummary}.
35864
35908
 
35865
35909
  CURRENT STATE:
@@ -35871,7 +35915,11 @@ Your job is to analyze this state and recommend the next action. Consider:
35871
35915
  3. Are there ideas stuck that need to be moved forward?
35872
35916
  4. What should be prioritized next?
35873
35917
  5. Approved ideas are pre-sorted by score (priority \xD7 impact / effort, boosted by goal and hypothesis alignment). Prefer the highest-scored idea unless you have a specific reason to override (funnel stage mismatch, stale assumption, or a critical alert). Reference the score when explaining your choice. If recommending implementation, use task_id "implement-{ideaId}".
35874
- 6. Are there in_progress ideas with sub-tasks? Check their progress.
35918
+ 6. Are there in_progress ideas with sub-tasks? Check their progress. If an idea shows "last_failure", that is the most recent error from the last sub-task execution.
35919
+
35920
+ FM3 \u2014 IMPLEMENTATION RETRY RULES:
35921
+ - For any implement-* task where the idea shows a non-null "last_failure": you MUST NOT recommend the same task unless you explicitly state a different strategy in the analysis.
35922
+ - If last_failure indicates an unresolvable environment issue (e.g., "ENOENT", "permission denied", "network unreachable", "git not found"), move the task to Blocked immediately instead of retrying. Set autonomous=false in next_action so the system routes it to Blocked.
35875
35923
 
35876
35924
  DATA FRESHNESS CHECK:
35877
35925
  Before acting on any TODO or idea description, verify its assumptions against live_data:
@@ -35905,6 +35953,7 @@ META-TASKS:
35905
35953
  - "batch-cleanup" \u2014 Multiple cleanup operations in one pass
35906
35954
  - Use descriptive task_id names and detailed descriptions so the executor knows exactly what to do
35907
35955
  - The description field is critical \u2014 it's the full instruction set for the executor
35956
+ - FM2: For research/spike tasks whose output is a file (docs, reports, analysis), append [expects: relative/path] to the description. Example: "Research DATAJUD API endpoints [expects: docs/spike-datajud.md]". The system will verify the file exists after completion \u2014 tasks that skip file creation will be kept in High Priority and retried.
35908
35957
 
35909
35958
  EVALUATION TASKS:
35910
35959
  - To evaluate a shipped idea's success metrics, use task_id: "evaluate-shipped-{ideaId}"
@@ -36142,6 +36191,9 @@ If there's nothing urgent, set next_action to null and new_todos to an empty arr
36142
36191
  Focus on actionable, specific recommendations. Be concise.`;
36143
36192
  const startTime = Date.now();
36144
36193
  const promptSize = prompt.length;
36194
+ if (promptSize > MAX_REASONING_PROMPT_CHARS) {
36195
+ log(`[context-trim] WARNING: Total prompt is ${promptSize} chars (over ${MAX_REASONING_PROMPT_CHARS} soft cap) \u2014 may cause timeout`);
36196
+ }
36145
36197
  log(`Running Claude reasoning (prompt: ${promptSize} chars)...`);
36146
36198
  const reasoningSchema = {
36147
36199
  type: "object",
@@ -37203,6 +37255,11 @@ async function executeAutonomousImplementation(ideaId) {
37203
37255
  log(`Autonomy not enabled, skipping implementation for ${ideaId}`);
37204
37256
  return false;
37205
37257
  }
37258
+ if (!checkGitAvailable()) {
37259
+ log("[pre-flight] git not found in PATH (ENOENT) \u2014 implementation tasks unavailable");
37260
+ reclassifyAsHumanDependent(`implement-${ideaId}`);
37261
+ return false;
37262
+ }
37206
37263
  const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
37207
37264
  let idea = ideasData.ideas.find((i) => i.id === ideaId);
37208
37265
  if (!idea && !ideaId.startsWith("idea-")) {
@@ -37631,6 +37688,18 @@ ${allowedFiles.map((f) => `- ${f}`).join("\n")}
37631
37688
  resolve3(false);
37632
37689
  return;
37633
37690
  }
37691
+ const expectsMatch = description.match(/\[expects:\s*([^\]]+)\]/);
37692
+ if (expectsMatch) {
37693
+ const expectedRelPath = expectsMatch[1].trim();
37694
+ const expectedFullPath = path30.join(PROJECT_DIR, expectedRelPath);
37695
+ if (!fs35.existsSync(expectedFullPath)) {
37696
+ log(`[FM2] Artifact verification FAILED for ${taskId}: expected "${expectedRelPath}" but file not found`);
37697
+ incrementMetaTaskFailureCount(taskId);
37698
+ resolve3(false);
37699
+ return;
37700
+ }
37701
+ log(`[FM2] Artifact verification passed: ${expectedRelPath} exists`);
37702
+ }
37634
37703
  log(`Meta-task completed: ${output.substring(0, 200)}`);
37635
37704
  resolve3(true);
37636
37705
  } else {
@@ -38869,7 +38938,33 @@ function updateTodoFile(taskId, completed) {
38869
38938
  log(`Failed to update TODO.md: ${error instanceof Error ? error.message : "Unknown error"}`);
38870
38939
  }
38871
38940
  }
38872
- function generateStatusContent(state, alerts, nextTask, reasoning, systemHealth) {
38941
+ function readConsecutiveNoops() {
38942
+ try {
38943
+ if (!fs35.existsSync(STATUS_FILE)) return 0;
38944
+ const content = fs35.readFileSync(STATUS_FILE, "utf-8");
38945
+ const match = content.match(/^consecutive_noops:\s*(\d+)/m);
38946
+ return match ? parseInt(match[1], 10) : 0;
38947
+ } catch {
38948
+ return 0;
38949
+ }
38950
+ }
38951
+ function ensureSystemIdleTask() {
38952
+ try {
38953
+ const content = fs35.readFileSync(TODO_FILE, "utf-8");
38954
+ if (content.includes("`system-idle`")) return;
38955
+ const highPriorityMarker = "## High Priority";
38956
+ const idx = content.indexOf(highPriorityMarker);
38957
+ if (idx === -1) return;
38958
+ const insertAt = content.indexOf("\n", idx) + 1;
38959
+ const idleLine = "\n- [ ] `system-idle` \u2014 All autonomous tasks are blocked. Review Blocked section and unblock manually.\n";
38960
+ const newContent = content.slice(0, insertAt) + idleLine + content.slice(insertAt);
38961
+ fs35.writeFileSync(TODO_FILE, newContent);
38962
+ log("[IDLE] Added system-idle task to TODO.md High Priority section");
38963
+ } catch (error) {
38964
+ log(`Failed to add system-idle task: ${error instanceof Error ? error.message : "Unknown"}`);
38965
+ }
38966
+ }
38967
+ function generateStatusContent(state, alerts, nextTask, reasoning, systemHealth, consecutiveNoops) {
38873
38968
  const now = /* @__PURE__ */ new Date();
38874
38969
  const currentGoal = state.goals[0];
38875
38970
  const goalSection = currentGoal ? `- **Goal:** ${currentGoal.title} (${currentGoal.target_value}${currentGoal.target_unit} by Q2 2026)
@@ -38921,6 +39016,7 @@ ${systemHealth.recovery_actions.map((a) => `- ${a}`).join("\n")}
38921
39016
 
38922
39017
  **Last Heartbeat:** ${formatDateTime(now)}
38923
39018
  **Next Scheduled:** ${nextScheduled}
39019
+ consecutive_noops: ${consecutiveNoops ?? 0}
38924
39020
 
38925
39021
  ## Current Focus
38926
39022
 
@@ -38993,6 +39089,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
38993
39089
  if (SKIP_REASONING) {
38994
39090
  log("Skipping Claude reasoning step");
38995
39091
  }
39092
+ let consecutiveNoops = readConsecutiveNoops();
38996
39093
  const state = loadState4();
38997
39094
  const businessContext = loadBusinessContext();
38998
39095
  const heartbeatConfig = loadConfig();
@@ -39066,6 +39163,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39066
39163
  };
39067
39164
  log(`Task override: ${taskToDo.id} \u2014 ${taskToDo.description}`);
39068
39165
  }
39166
+ let inlineWorkDone = false;
39069
39167
  if (!TASK_OVERRIDE) {
39070
39168
  const inProgressOverride = (() => {
39071
39169
  const cfgCheck = loadConfig();
@@ -39103,6 +39201,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39103
39201
  const success = await executeTask(reasoning.next_action, heartbeatConfig, businessContext);
39104
39202
  if (success) {
39105
39203
  taskToDo = null;
39204
+ inlineWorkDone = true;
39106
39205
  } else {
39107
39206
  log(`Critical task failed, resuming in-progress work: ${inProgressOverride.id}`);
39108
39207
  taskToDo = inProgressOverride;
@@ -39126,7 +39225,9 @@ async function runSingleHeartbeat(beatNumber = 1) {
39126
39225
  taskToDo = existingTask;
39127
39226
  } else {
39128
39227
  const success = await executeTask(reasoning.next_action, heartbeatConfig, businessContext);
39129
- if (!success) {
39228
+ if (success) {
39229
+ inlineWorkDone = true;
39230
+ } else {
39130
39231
  taskToDo = determineWork(state);
39131
39232
  }
39132
39233
  }
@@ -39134,9 +39235,19 @@ async function runSingleHeartbeat(beatNumber = 1) {
39134
39235
  taskToDo = determineWork(state);
39135
39236
  }
39136
39237
  }
39238
+ if (!taskToDo && !inlineWorkDone && !TASK_OVERRIDE && !DRY_RUN) {
39239
+ consecutiveNoops++;
39240
+ log(`[IDLE] No task determined (consecutive_noops: ${consecutiveNoops})`);
39241
+ if (consecutiveNoops >= IDLE_THRESHOLD) {
39242
+ log(`[IDLE] All actionable tasks blocked. Pausing autonomous work (${consecutiveNoops} consecutive no-ops >= threshold ${IDLE_THRESHOLD}).`);
39243
+ ensureSystemIdleTask();
39244
+ }
39245
+ }
39246
+ let taskSucceeded = false;
39137
39247
  if (taskToDo) {
39138
39248
  log(`Task to do: ${taskToDo.id} \u2014 ${taskToDo.description}`);
39139
39249
  const success = await executeTask(taskToDo, heartbeatConfig, businessContext);
39250
+ taskSucceeded = success;
39140
39251
  if (success && !DRY_RUN) {
39141
39252
  if (!["quick-analysis", "deep-analysis", "metrics-analysis", "seo-audit"].includes(taskToDo.id)) {
39142
39253
  updateTodoFile(taskToDo.id, true);
@@ -39182,6 +39293,9 @@ async function runSingleHeartbeat(beatNumber = 1) {
39182
39293
  } else {
39183
39294
  log("No tasks to do right now");
39184
39295
  }
39296
+ if (taskSucceeded || inlineWorkDone) {
39297
+ consecutiveNoops = 0;
39298
+ }
39185
39299
  if (reasoning?.new_todos && reasoning.new_todos.length > 0 && !DRY_RUN) {
39186
39300
  const MAX_NEW_TODOS_PER_HEARTBEAT = 2;
39187
39301
  const cappedTodos = reasoning.new_todos.slice(0, MAX_NEW_TODOS_PER_HEARTBEAT);
@@ -39195,7 +39309,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39195
39309
  pruneMemoryLearnings();
39196
39310
  }
39197
39311
  if (!DRY_RUN) {
39198
- const statusContent = generateStatusContent(state, alerts, taskToDo, reasoning, systemHealth);
39312
+ const statusContent = generateStatusContent(state, alerts, taskToDo, reasoning, systemHealth, consecutiveNoops);
39199
39313
  fs35.writeFileSync(STATUS_FILE, statusContent);
39200
39314
  log("Updated STATUS.md");
39201
39315
  } else {