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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +25 -25
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new.html +1 -1
- package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +11 -11
- package/.next/standalone/.next/server/chunks/6299.js +1 -1
- package/.next/standalone/.next/server/chunks/7151.js +10 -10
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/pages-manifest.json +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/business-context.json +1 -1
- package/.next/standalone/data/goals.json +1 -1
- package/.next/standalone/data/ideas.json +25 -8
- package/.next/standalone/data/implementations.json +40 -2
- package/.next/standalone/data/reports/visuals/idea-3f4595f7-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-4rxt3mkj-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-6631456b-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-boot-001-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-fb3eba74-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-prqf3lob-card.png +0 -0
- package/.next/standalone/package.json +1 -1
- package/.next/static/chunks/app/page-d325a95479e7c453.js +1 -0
- package/dist/bin/vibebusiness.js +2 -0
- package/dist/scripts/heartbeat.js +120 -6
- package/dist/scripts/scan.js +3 -0
- package/dist/scripts/social-routine.js +3 -0
- package/package.json +1 -1
- package/.next/static/chunks/app/page-01dbe60c967e1d7e.js +0 -1
- /package/.next/static/{wNtgcOjGe3Ddj1fZJp4v3 → kgtR3Ls8MG4aQqwp3I0UE}/_buildManifest.js +0 -0
- /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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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/
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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
|
-
{"/
|
|
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":"
|
|
1
|
+
{"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"FPXGr6bC7+RXazd2oi2jDkpRxYAiPKKwH7YGVpUyog0="}
|
|
@@ -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-
|
|
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": "
|
|
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":
|
|
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":
|
|
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": "
|
|
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-
|
|
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
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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()}]);
|
package/dist/bin/vibebusiness.js
CHANGED
|
@@ -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
|
|
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${
|
|
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
|
|
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 (
|
|
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 {
|