heartbeads 0.4.0

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 (205) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-build-manifest.json +49 -0
  3. package/.next/app-path-routes-manifest.json +1 -0
  4. package/.next/build-manifest.json +32 -0
  5. package/.next/export-marker.json +1 -0
  6. package/.next/images-manifest.json +1 -0
  7. package/.next/next-minimal-server.js.nft.json +1 -0
  8. package/.next/next-server.js.nft.json +1 -0
  9. package/.next/package.json +1 -0
  10. package/.next/prerender-manifest.json +1 -0
  11. package/.next/react-loadable-manifest.json +8 -0
  12. package/.next/required-server-files.json +1 -0
  13. package/.next/routes-manifest.json +1 -0
  14. package/.next/server/app/_not-found/page.js +1 -0
  15. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  17. package/.next/server/app/_not-found.html +1 -0
  18. package/.next/server/app/_not-found.meta +6 -0
  19. package/.next/server/app/_not-found.rsc +9 -0
  20. package/.next/server/app/api/auth/route.js +1 -0
  21. package/.next/server/app/api/auth/route.js.nft.json +1 -0
  22. package/.next/server/app/api/beads/route.js +8 -0
  23. package/.next/server/app/api/beads/route.js.nft.json +1 -0
  24. package/.next/server/app/api/beads/stream/route.js +10 -0
  25. package/.next/server/app/api/beads/stream/route.js.nft.json +1 -0
  26. package/.next/server/app/api/beads.body +1 -0
  27. package/.next/server/app/api/beads.meta +1 -0
  28. package/.next/server/app/api/config/route.js +8 -0
  29. package/.next/server/app/api/config/route.js.nft.json +1 -0
  30. package/.next/server/app/api/docs/page.js +120 -0
  31. package/.next/server/app/api/docs/page.js.nft.json +1 -0
  32. package/.next/server/app/api/docs/page_client-reference-manifest.js +1 -0
  33. package/.next/server/app/api/docs.html +120 -0
  34. package/.next/server/app/api/docs.meta +5 -0
  35. package/.next/server/app/api/docs.rsc +70 -0
  36. package/.next/server/app/api/login/route.js +1 -0
  37. package/.next/server/app/api/login/route.js.nft.json +1 -0
  38. package/.next/server/app/api/logout/route.js +1 -0
  39. package/.next/server/app/api/logout/route.js.nft.json +1 -0
  40. package/.next/server/app/api/oauth/callback/route.js +1 -0
  41. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -0
  42. package/.next/server/app/api/oauth/client-metadata.json/route.js +1 -0
  43. package/.next/server/app/api/oauth/client-metadata.json/route.js.nft.json +1 -0
  44. package/.next/server/app/api/oauth/jwks.json/route.js +1 -0
  45. package/.next/server/app/api/oauth/jwks.json/route.js.nft.json +1 -0
  46. package/.next/server/app/api/records/route.js +1 -0
  47. package/.next/server/app/api/records/route.js.nft.json +1 -0
  48. package/.next/server/app/api/status/route.js +1 -0
  49. package/.next/server/app/api/status/route.js.nft.json +1 -0
  50. package/.next/server/app/api/v1/graph/route.js +1 -0
  51. package/.next/server/app/api/v1/graph/route.js.nft.json +1 -0
  52. package/.next/server/app/api/v1/issues/[id]/route.js +1 -0
  53. package/.next/server/app/api/v1/issues/[id]/route.js.nft.json +1 -0
  54. package/.next/server/app/api/v1/ready/route.js +1 -0
  55. package/.next/server/app/api/v1/ready/route.js.nft.json +1 -0
  56. package/.next/server/app/index.html +1 -0
  57. package/.next/server/app/index.meta +5 -0
  58. package/.next/server/app/index.rsc +9 -0
  59. package/.next/server/app/login/page.js +1 -0
  60. package/.next/server/app/login/page.js.nft.json +1 -0
  61. package/.next/server/app/login/page_client-reference-manifest.js +1 -0
  62. package/.next/server/app/login.html +1 -0
  63. package/.next/server/app/login.meta +5 -0
  64. package/.next/server/app/login.rsc +9 -0
  65. package/.next/server/app/opengraph-image.png/route.js +1 -0
  66. package/.next/server/app/opengraph-image.png/route.js.nft.json +1 -0
  67. package/.next/server/app/opengraph-image.png.body +0 -0
  68. package/.next/server/app/opengraph-image.png.meta +1 -0
  69. package/.next/server/app/page.js +24 -0
  70. package/.next/server/app/page.js.nft.json +1 -0
  71. package/.next/server/app/page_client-reference-manifest.js +1 -0
  72. package/.next/server/app/twitter-image.png/route.js +1 -0
  73. package/.next/server/app/twitter-image.png/route.js.nft.json +1 -0
  74. package/.next/server/app/twitter-image.png.body +0 -0
  75. package/.next/server/app/twitter-image.png.meta +1 -0
  76. package/.next/server/app-paths-manifest.json +22 -0
  77. package/.next/server/chunks/247.js +12 -0
  78. package/.next/server/chunks/29.js +1 -0
  79. package/.next/server/chunks/343.js +1 -0
  80. package/.next/server/chunks/460.js +12 -0
  81. package/.next/server/chunks/533.js +38 -0
  82. package/.next/server/chunks/542.js +27 -0
  83. package/.next/server/chunks/590.js +6 -0
  84. package/.next/server/chunks/615.js +15 -0
  85. package/.next/server/chunks/696.js +25 -0
  86. package/.next/server/chunks/719.js +2 -0
  87. package/.next/server/chunks/739.js +1 -0
  88. package/.next/server/chunks/950.js +2 -0
  89. package/.next/server/chunks/font-manifest.json +1 -0
  90. package/.next/server/edge-runtime-webpack.js +2 -0
  91. package/.next/server/edge-runtime-webpack.js.map +1 -0
  92. package/.next/server/font-manifest.json +1 -0
  93. package/.next/server/functions-config-manifest.json +1 -0
  94. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  95. package/.next/server/middleware-build-manifest.js +1 -0
  96. package/.next/server/middleware-manifest.json +32 -0
  97. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  98. package/.next/server/middleware.js +14 -0
  99. package/.next/server/middleware.js.map +1 -0
  100. package/.next/server/next-font-manifest.js +1 -0
  101. package/.next/server/next-font-manifest.json +1 -0
  102. package/.next/server/pages/404.html +1 -0
  103. package/.next/server/pages/500.html +1 -0
  104. package/.next/server/pages/_app.js +1 -0
  105. package/.next/server/pages/_app.js.nft.json +1 -0
  106. package/.next/server/pages/_document.js +1 -0
  107. package/.next/server/pages/_document.js.nft.json +1 -0
  108. package/.next/server/pages/_error.js +1 -0
  109. package/.next/server/pages/_error.js.nft.json +1 -0
  110. package/.next/server/pages-manifest.json +1 -0
  111. package/.next/server/server-reference-manifest.js +1 -0
  112. package/.next/server/server-reference-manifest.json +1 -0
  113. package/.next/server/webpack-runtime.js +1 -0
  114. package/.next/static/chunks/149.a3e3a5dc03e21086.js +1 -0
  115. package/.next/static/chunks/2200cc46-7c93a0e00b0bb825.js +1 -0
  116. package/.next/static/chunks/788-aa413085174e935a.js +1 -0
  117. package/.next/static/chunks/945-3ff1d381a0af1ecd.js +2 -0
  118. package/.next/static/chunks/971-bb44d52bcd9ee2a9.js +1 -0
  119. package/.next/static/chunks/app/_not-found/page-200b7a7a6cfc29df.js +1 -0
  120. package/.next/static/chunks/app/api/docs/page-1dc18f40154cdce6.js +1 -0
  121. package/.next/static/chunks/app/layout-13e3cdaaa416edb6.js +1 -0
  122. package/.next/static/chunks/app/login/page-60d930d64f021753.js +1 -0
  123. package/.next/static/chunks/app/not-found-ae1139bed2018dd8.js +1 -0
  124. package/.next/static/chunks/app/page-583300dd8af66e5a.js +1 -0
  125. package/.next/static/chunks/framework-6e06c675866dc992.js +1 -0
  126. package/.next/static/chunks/main-app-8b0c4a1007dbb7f4.js +1 -0
  127. package/.next/static/chunks/main-e680fb049d7426e1.js +1 -0
  128. package/.next/static/chunks/pages/_app-0c3037849002a4aa.js +1 -0
  129. package/.next/static/chunks/pages/_error-a647cd2c75dc4dc7.js +1 -0
  130. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  131. package/.next/static/chunks/webpack-117444a4bfe51057.js +1 -0
  132. package/.next/static/css/8c1b520a38ba4ccd.css +3 -0
  133. package/.next/static/vFM69sDrBUf_9ULwPmVAE/_buildManifest.js +1 -0
  134. package/.next/static/vFM69sDrBUf_9ULwPmVAE/_ssgManifest.js +1 -0
  135. package/README.md +389 -0
  136. package/app/api/auth/route.ts +103 -0
  137. package/app/api/beads/route.ts +27 -0
  138. package/app/api/beads/stream/route.ts +83 -0
  139. package/app/api/config/route.ts +48 -0
  140. package/app/api/docs/page.tsx +497 -0
  141. package/app/api/login/route.ts +42 -0
  142. package/app/api/logout/route.ts +14 -0
  143. package/app/api/oauth/callback/route.ts +97 -0
  144. package/app/api/oauth/client-metadata.json/route.ts +33 -0
  145. package/app/api/oauth/jwks.json/route.ts +32 -0
  146. package/app/api/records/route.ts +168 -0
  147. package/app/api/status/route.ts +25 -0
  148. package/app/api/v1/graph/route.ts +251 -0
  149. package/app/api/v1/issues/[id]/route.ts +158 -0
  150. package/app/api/v1/ready/route.ts +229 -0
  151. package/app/globals.css +230 -0
  152. package/app/layout.tsx +51 -0
  153. package/app/login/page.tsx +164 -0
  154. package/app/not-found.tsx +91 -0
  155. package/app/opengraph-image.png +0 -0
  156. package/app/page.tsx +2041 -0
  157. package/app/twitter-image.png +0 -0
  158. package/bin/heartbeads.mjs +225 -0
  159. package/components/ActivityItem.tsx +326 -0
  160. package/components/ActivityOverlay.tsx +125 -0
  161. package/components/ActivityPanel.tsx +345 -0
  162. package/components/AllCommentsPanel.tsx +270 -0
  163. package/components/AuthButton.tsx +202 -0
  164. package/components/BeadTooltip.tsx +246 -0
  165. package/components/BeadsGraph.tsx +2493 -0
  166. package/components/BeadsLogo.tsx +94 -0
  167. package/components/CommentTooltip.tsx +338 -0
  168. package/components/ContextMenu.tsx +272 -0
  169. package/components/DescriptionModal.tsx +595 -0
  170. package/components/GraphStats.tsx +121 -0
  171. package/components/HeartIcon.tsx +33 -0
  172. package/components/HelpPanel.tsx +339 -0
  173. package/components/MobileActionSheet.tsx +255 -0
  174. package/components/NodeDetail.tsx +793 -0
  175. package/components/SettingsModal.tsx +315 -0
  176. package/components/StatusLegend.tsx +99 -0
  177. package/components/TimelineBar.tsx +116 -0
  178. package/components/TutorialOverlay.tsx +235 -0
  179. package/hooks/useBeadsComments.ts +81 -0
  180. package/hooks/useIsMobile.ts +19 -0
  181. package/lib/activity.ts +377 -0
  182. package/lib/agent.ts +29 -0
  183. package/lib/api-helpers.ts +46 -0
  184. package/lib/auth/client.ts +221 -0
  185. package/lib/auth.tsx +159 -0
  186. package/lib/comments.ts +413 -0
  187. package/lib/diff-beads.ts +128 -0
  188. package/lib/discover.ts +228 -0
  189. package/lib/env.ts +33 -0
  190. package/lib/gate.ts +55 -0
  191. package/lib/parse-beads.ts +234 -0
  192. package/lib/session.ts +52 -0
  193. package/lib/settings.ts +42 -0
  194. package/lib/timeline.ts +138 -0
  195. package/lib/tts.ts +397 -0
  196. package/lib/types.ts +271 -0
  197. package/lib/utils.ts +48 -0
  198. package/lib/watch-beads.ts +97 -0
  199. package/next.config.mjs +4 -0
  200. package/package.json +81 -0
  201. package/postcss.config.mjs +9 -0
  202. package/public/image.png +0 -0
  203. package/scripts/generate-jwk.js +38 -0
  204. package/tailwind.config.ts +41 -0
  205. package/tsconfig.json +24 -0
@@ -0,0 +1 @@
1
+ {"status":200,"headers":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/beads/layout,_N_T_/api/beads/route,_N_T_/api/beads"}}
@@ -0,0 +1,8 @@
1
+ "use strict";(()=>{var e={};e.id=729,e.ids=[729],e.modules={20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},78893:e=>{e.exports=require("buffer")},61282:e=>{e.exports=require("child_process")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},35816:e=>{e.exports=require("process")},20247:(e,r,t)=>{t.r(r),t.d(r,{originalPathname:()=>g,patchFetch:()=>b,requestAsyncStorage:()=>m,routeModule:()=>y,serverHooks:()=>x,staticGenerationAsyncStorage:()=>h});var i={};t.r(i),t.d(i,{GET:()=>f,dynamic:()=>d});var n=t(12085),a=t(31650),s=t(85980),o=t(30627),c=t(32933),p=t(92048),u=t(55315),l=t(90696);let d="force-dynamic";async function f(){try{let e=(0,c.M)(),r=["."],t=(0,u.join)(e.beadsDir,"config.yaml");try{if((0,p.existsSync)(t)){let e=(0,p.readFileSync)(t,"utf-8"),i=(0,l.Qc)(e),n=i?.repos?.additional;Array.isArray(n)&&(r=[i?.repos?.primary||".",...n])}}catch{}let i=(0,c.K)(e.beadsDir);return o.NextResponse.json({name:e.issuePrefix||e.repoName,prefix:e.issuePrefix||null,repoCount:1+e.additionalRepos,repos:r,repoUrls:i})}catch{return o.NextResponse.json({name:"Beads",prefix:null,repoCount:0,repos:[]})}}let y=new n.AppRouteRouteModule({definition:{kind:a.x.APP_ROUTE,page:"/api/config/route",pathname:"/api/config",filename:"route",bundlePath:"app/api/config/route"},resolvedPagePath:"/Users/david/Projects/gainforest/beads-map/app/api/config/route.ts",nextConfigOutput:"",userland:i}),{requestAsyncStorage:m,staticGenerationAsyncStorage:h,serverHooks:x}=y,g="/api/config/route";function b(){return(0,s.patchFetch)({serverHooks:x,staticGenerationAsyncStorage:h})}},32933:(e,r,t)=>{t.d(r,{K:()=>u,M:()=>c});var i=t(92048),n=t(55315),a=t(61282),s=t(90696);function o(e){let r=(0,n.join)(e,"config.yaml");try{if(!(0,i.existsSync)(r))return{additionalRepos:0};let e=(0,i.readFileSync)(r,"utf-8"),t=(0,s.Qc)(e),n=t?.["issue-prefix"]||void 0,a=t?.repos?.additional,o=Array.isArray(a)?a.length:0;return{issuePrefix:n,additionalRepos:o}}catch{return{additionalRepos:0}}}function c(e){let r=process.env.BEADS_DIR;if(r){let e;let t=(0,n.resolve)(r);e=".beads"===(0,n.basename)(t)?t:(0,i.existsSync)((0,n.join)(t,".beads"))?(0,n.join)(t,".beads"):t;try{e=(0,i.realpathSync)(e)}catch{}let a=(0,n.dirname)(e),s=(0,n.basename)(a),c=o(e);return{beadsDir:e,repoRoot:a,repoName:s,...c}}let t=(0,n.resolve)(e||process.cwd()),{root:a}=(0,n.parse)(t);for(;;){let r=(0,n.join)(t,".beads");if((0,i.existsSync)(r)&&(0,i.statSync)(r).isDirectory()){let e;try{e=(0,i.realpathSync)(r)}catch{e=r}let t=(0,n.dirname)(e),a=(0,n.basename)(t),s=o(e);return{beadsDir:e,repoRoot:t,repoName:a,...s}}if(t===a)throw Error(`No .beads/ directory found.
2
+ Searched from: ${(0,n.resolve)(e||process.cwd())}
3
+
4
+ To initialize beads in your project, run:
5
+ bd init
6
+
7
+ Or set the BEADS_DIR environment variable:
8
+ BEADS_DIR=/path/to/project/.beads heartbeads`);t=(0,n.dirname)(t)}}function p(e){try{let r=(0,a.execSync)("git config --get remote.origin.url",{cwd:e,encoding:"utf-8",timeout:3e3,stdio:["pipe","pipe","pipe"]});return function(e){let r=e.trim().replace(/\.git$/,""),t=r.match(/^git@([^:]+):(.+)$/);return t?`https://${t[1]}/${t[2]}`:r.startsWith("https://")||r.startsWith("http://")?r:null}(r)}catch{return null}}function u(e){let r;let t={},a=(0,n.dirname)(e),o=p(a),c=(0,n.join)(e,"config.yaml"),u=[];try{if((0,i.existsSync)(c)){let e=(0,i.readFileSync)(c,"utf-8"),t=(0,s.Qc)(e);r=t?.["issue-prefix"]||void 0;let o=t?.repos?.additional;Array.isArray(o)&&(u=o.map(e=>(0,n.resolve)(a,e)).filter(e=>(0,i.existsSync)((0,n.join)(e,".beads"))))}}catch{}let l=r||(0,n.basename)(a);for(let e of(o&&(t[l]=o),u)){let r=p(e);if(!r)continue;let a=(0,n.join)(e,".beads","config.yaml"),o=(0,n.basename)(e);try{if((0,i.existsSync)(a)){let e=(0,i.readFileSync)(a,"utf-8"),r=(0,s.Qc)(e);r?.["issue-prefix"]&&(o=r["issue-prefix"])}}catch{}t[o]=r}return t}}};var r=require("../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),i=r.X(0,[719,247,696],()=>t(20247));module.exports=i})();
@@ -0,0 +1 @@
1
+ {"version":1,"files":["../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/action-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/async-local-storage.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/request-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/server/lib/trace/constants.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/server/lib/trace/tracer.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/package.json","../../../../../node_modules/next","../../../../../package.json","../../../../package.json","../../../chunks/247.js","../../../chunks/696.js","../../../chunks/719.js","../../../webpack-runtime.js"]}
@@ -0,0 +1,120 @@
1
+ (()=>{var e={};e.id=241,e.ids=[241],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},55315:e=>{"use strict";e.exports=require("path")},17360:e=>{"use strict";e.exports=require("url")},12582:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>i.a,__next_app__:()=>m,originalPathname:()=>x,pages:()=>c,routeModule:()=>p,tree:()=>o}),s(53699),s(19709),s(69784);var a=s(69296),r=s(31650),n=s(87045),i=s.n(n),l=s(58184),d={};for(let e in l)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(d[e]=()=>l[e]);s.d(t,d);let o=["",{children:["api",{children:["docs",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.bind(s,53699)),"/Users/david/Projects/gainforest/beads-map/app/api/docs/page.tsx"]}]},{}]},{metadata:{icon:[],apple:[],openGraph:[async e=>(await Promise.resolve().then(s.bind(s,70493))).default(e)],twitter:[async e=>(await Promise.resolve().then(s.bind(s,80232))).default(e)],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(s.bind(s,19709)),"/Users/david/Projects/gainforest/beads-map/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(s.bind(s,69784)),"/Users/david/Projects/gainforest/beads-map/app/not-found.tsx"],metadata:{icon:[],apple:[],openGraph:[async e=>(await Promise.resolve().then(s.bind(s,70493))).default(e)],twitter:[async e=>(await Promise.resolve().then(s.bind(s,80232))).default(e)],manifest:void 0}}],c=["/Users/david/Projects/gainforest/beads-map/app/api/docs/page.tsx"],x="/api/docs/page",m={require:s,loadChunk:()=>Promise.resolve()},p=new a.AppPageRouteModule({definition:{kind:r.x.APP_PAGE,page:"/api/docs/page",pathname:"/api/docs",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:o}})},40585:(e,t,s)=>{Promise.resolve().then(s.bind(s,67960))},92220:(e,t,s)=>{Promise.resolve().then(s.bind(s,13429))},15169:(e,t,s)=>{Promise.resolve().then(s.t.bind(s,66544,23)),Promise.resolve().then(s.t.bind(s,93477,23)),Promise.resolve().then(s.t.bind(s,95116,23)),Promise.resolve().then(s.t.bind(s,96676,23)),Promise.resolve().then(s.t.bind(s,59645,23)),Promise.resolve().then(s.t.bind(s,88850,23))},25864:()=>{},13429:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>i});var a=s(98924),r=s(32828),n=s(13810);function i(){return(0,a.jsxs)("div",{className:"h-full flex flex-col items-center justify-center bg-white text-zinc-800 px-6 select-none",children:[(0,a.jsxs)("div",{className:"relative w-full max-w-md mb-8",children:[a.jsx("svg",{viewBox:"0 0 400 40",fill:"none",className:"w-full text-zinc-200","aria-hidden":"true",children:a.jsx("line",{x1:"0",y1:"20",x2:"400",y2:"20",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeDasharray:"4 6",opacity:"0.6"})}),a.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:a.jsx("div",{className:"bg-white px-4",children:a.jsx(n.A,{className:"w-10 h-10 text-emerald-500"})})})]}),a.jsx("h1",{className:"text-7xl font-extralight tracking-tight text-zinc-300 mb-3 animate-fade-in",children:"404"}),a.jsx("p",{className:"text-lg text-zinc-500 font-light mb-2 animate-fade-in",style:{animationDelay:"0.05s"},children:"This bead has no pulse."}),a.jsx("p",{className:"text-sm text-zinc-400 mb-8 text-center max-w-xs animate-fade-in",style:{animationDelay:"0.1s"},children:"We searched the entire dependency graph, but this node doesn't exist. Maybe it was closed, maybe it never was."}),(0,a.jsxs)(r.default,{href:"/",className:"inline-flex items-center gap-2 px-5 py-2.5 rounded-full bg-emerald-500 text-white text-sm font-medium shadow-sm hover:bg-emerald-600 hover:shadow-md transition-all duration-200 ease-out animate-fade-in",style:{animationDelay:"0.15s"},children:[a.jsx("svg",{viewBox:"0 0 16 16",fill:"none",className:"w-4 h-4","aria-hidden":"true",children:a.jsx("path",{d:"M10 12L6 8l4-4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),"Back to the heartbeat"]}),a.jsx("p",{className:"mt-12 text-[11px] text-zinc-300 animate-fade-in",style:{animationDelay:"0.2s"},children:"error code: BEAD_NOT_FOUND \xb7 flatline detected"})]})}},13810:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(98924);function r({className:e}){return(0,a.jsxs)("svg",{viewBox:"0 0 32 32",fill:"none",className:e,"aria-hidden":"true",children:[(0,a.jsxs)("polyline",{points:"1,16 6,16 8,16 9.5,14 11,18 12.5,6 14,26 15.5,10 17,16 19,16 20.5,14.5 21.5,17.5 22.5,16 31,16",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",fill:"none",opacity:"0.9",children:[a.jsx("animate",{attributeName:"stroke-dasharray",values:"0 60;60 0",dur:"2s",repeatCount:"indefinite"}),a.jsx("animate",{attributeName:"opacity",values:"0.4;0.95;0.95;0.4",dur:"2s",repeatCount:"indefinite"})]}),(0,a.jsxs)("polyline",{points:"1,16 6,16 8,16 9.5,14 11,18 12.5,6 14,26 15.5,10 17,16 19,16 20.5,14.5 21.5,17.5 22.5,16 31,16",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",fill:"none",opacity:"0.15",children:[a.jsx("animate",{attributeName:"stroke-dasharray",values:"0 60;60 0",dur:"2s",repeatCount:"indefinite"}),a.jsx("animate",{attributeName:"opacity",values:"0;0.2;0.2;0",dur:"2s",repeatCount:"indefinite"})]}),(0,a.jsxs)("circle",{cx:"0",cy:"16",r:"1.5",fill:"currentColor",opacity:"0",children:[a.jsx("animate",{attributeName:"cx",values:"1;6;8;9.5;11;12.5;14;15.5;17;19;20.5;21.5;22.5;31",dur:"2s",repeatCount:"indefinite"}),a.jsx("animate",{attributeName:"cy",values:"16;16;16;14;18;6;26;10;16;16;14.5;17.5;16;16",dur:"2s",repeatCount:"indefinite"}),a.jsx("animate",{attributeName:"opacity",values:"0;0.8;1;1;1;1;1;1;0.8;0.6;0.6;0.6;0.4;0",dur:"2s",repeatCount:"indefinite"}),a.jsx("animate",{attributeName:"r",values:"1;1.5;2;2.5;2;2.5;2;1.5;1.5;1;1;1;1;0.5",dur:"2s",repeatCount:"indefinite"})]})]})}},67960:(e,t,s)=>{"use strict";s.d(t,{AuthProvider:()=>i,a:()=>l});var a=s(98924),r=s(63911);let n=(0,r.createContext)(null);function i({children:e}){let[t,s]=(0,r.useState)({status:"idle",session:null,error:null,isLoading:!0}),i=(0,r.useCallback)(async e=>{s(e=>({...e,status:"authorizing",isLoading:!0,error:null}));try{let t=e.includes(".")?e:`${e}.bsky.social`,s=await fetch("/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({handle:t,returnTo:window.location.pathname+window.location.search})});if(!s.ok){let e=await s.json();throw Error(e.error||"Login failed")}let a=await s.json();window.location.href=a.redirectUrl}catch(t){let e=t instanceof Error?t:Error("Login failed");throw s({status:"error",session:null,error:e,isLoading:!1}),e}},[]),l=(0,r.useCallback)(async()=>{try{await fetch("/api/logout",{method:"POST"})}catch(e){console.error("Logout request failed:",e)}s({status:"idle",session:null,error:null,isLoading:!1})},[]);return a.jsx(n.Provider,{value:{state:t,login:i,logout:l},children:e})}function l(){let e=(0,r.useContext)(n);if(!e)throw Error("useAuth must be used within an AuthProvider");let{state:t,login:s,logout:a}=e;return{status:t.status,session:t.session,error:t.error,isLoading:t.isLoading,isAuthenticated:"authenticated"===t.status,login:s,logout:a}}},53699:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>n,metadata:()=>r});var a=s(55886);let r={title:"Heartbeads API Docs",description:"Public REST API documentation for Heartbeads"};function n(){return a.jsx("div",{className:"min-h-screen bg-white text-zinc-800 antialiased overflow-y-auto h-screen",children:(0,a.jsxs)("div",{className:"max-w-3xl mx-auto px-6 py-12",children:[(0,a.jsxs)("div",{className:"mb-10",children:[a.jsx("a",{href:"/",className:"text-xs text-zinc-400 hover:text-emerald-500 transition-colors",children:"← Back to graph"}),a.jsx("h1",{className:"text-2xl font-semibold mt-3 text-zinc-900",children:"Heartbeads API"}),a.jsx("p",{className:"text-sm text-zinc-500 mt-1.5 leading-relaxed",children:"Read-only REST API for AI agents, CI/CD bots, and integrations. No authentication required. All endpoints return JSON with CORS headers."}),(0,a.jsxs)("div",{className:"flex items-center gap-3 mt-3",children:[a.jsx("span",{className:"text-[11px] font-mono px-2 py-0.5 rounded-full bg-emerald-50 text-emerald-600 border border-emerald-200",children:"v1"}),(0,a.jsxs)("span",{className:"text-[11px] text-zinc-400",children:["Base path: ",a.jsx("code",{className:"font-mono",children:"/api/v1"})]})]})]}),(0,a.jsxs)("nav",{className:"mb-10 p-4 rounded-xl bg-zinc-50 border border-zinc-100",children:[a.jsx("h2",{className:"text-[11px] font-semibold uppercase tracking-widest text-zinc-400 mb-2",children:"Endpoints"}),(0,a.jsxs)("ul",{className:"space-y-1.5 text-sm",children:[a.jsx("li",{children:(0,a.jsxs)("a",{href:"#graph",className:"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline",children:[a.jsx("code",{className:"font-mono text-xs",children:"GET /api/v1/graph"}),a.jsx("span",{className:"text-zinc-400 ml-2",children:"— Full project snapshot"})]})}),a.jsx("li",{children:(0,a.jsxs)("a",{href:"#issues",className:"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline",children:[a.jsx("code",{className:"font-mono text-xs",children:"GET /api/v1/issues/:id"}),a.jsx("span",{className:"text-zinc-400 ml-2",children:"— Single issue detail"})]})}),a.jsx("li",{children:(0,a.jsxs)("a",{href:"#ready",className:"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline",children:[a.jsx("code",{className:"font-mono text-xs",children:"GET /api/v1/ready"}),a.jsx("span",{className:"text-zinc-400 ml-2",children:"— Actionable issues"})]})})]})]}),(0,a.jsxs)("section",{className:"mb-10",children:[a.jsx("h2",{className:"text-lg font-semibold text-zinc-900 mb-3",children:"Common Details"}),(0,a.jsxs)("div",{className:"space-y-3 text-sm text-zinc-600 leading-relaxed",children:[(0,a.jsxs)("p",{children:["All responses include CORS headers (",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"Access-Control-Allow-Origin: *"}),") and are cached for 30 seconds."]}),(0,a.jsxs)("p",{children:["Every response includes a ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"_meta"})," object with ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"generated_at"})," (ISO 8601), ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"api_version"}),", ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"heartbeads_version"}),", and optional ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"warnings"}),"."]}),(0,a.jsxs)("p",{children:["Error responses return ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:'{ "error": "...", "hint": "..." }'})," with appropriate HTTP status codes (404, 500)."]})]})]}),(0,a.jsxs)("section",{className:"mb-10",children:[a.jsx("h2",{className:"text-lg font-semibold text-zinc-900 mb-3",children:"Authentication"}),(0,a.jsxs)("div",{className:"space-y-3 text-sm text-zinc-600 leading-relaxed",children:[(0,a.jsxs)("p",{children:["By default, no authentication is required. When heartbeads is started with ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"--password"}),", all API requests must include the password:"]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex items-start gap-2",children:[a.jsx("span",{className:"shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5",children:"1"}),(0,a.jsxs)("div",{children:[a.jsx("span",{className:"font-medium text-zinc-700",children:"Bearer token"})," (recommended)",a.jsx("pre",{className:"mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto",children:'curl -H "Authorization: Bearer <password>" http://localhost:3000/api/v1/graph'})]})]}),(0,a.jsxs)("div",{className:"flex items-start gap-2",children:[a.jsx("span",{className:"shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5",children:"2"}),(0,a.jsxs)("div",{children:[a.jsx("span",{className:"font-medium text-zinc-700",children:"Query parameter"}),a.jsx("pre",{className:"mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto",children:'curl "http://localhost:3000/api/v1/graph?token=<password>"'})]})]})]}),(0,a.jsxs)("p",{children:["Unauthenticated API requests return ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"401"})," with a JSON error. Browser requests are redirected to a login page."]})]})]}),a.jsx("hr",{className:"border-zinc-100 mb-10"}),(0,a.jsxs)("section",{id:"graph",className:"mb-12 scroll-mt-8",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[a.jsx("span",{className:"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200",children:"GET"}),a.jsx("code",{className:"text-sm font-mono font-semibold text-zinc-900",children:"/api/v1/graph"})]}),a.jsx("p",{className:"text-sm text-zinc-600 mb-4 leading-relaxed",children:"Returns the entire project state in a single response: all issues with comments and claims, dependency edges, summary statistics, and a recent activity feed. This is the primary endpoint for AI agents that need full project context."}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Query Parameters"}),a.jsx("div",{className:"overflow-x-auto mb-4",children:(0,a.jsxs)("table",{className:"w-full text-sm border-collapse",children:[a.jsx("thead",{children:(0,a.jsxs)("tr",{className:"text-left text-xs text-zinc-500 border-b border-zinc-100",children:[a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Param"}),a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Type"}),a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Default"}),a.jsx("th",{className:"py-2 font-medium",children:"Description"})]})}),(0,a.jsxs)("tbody",{className:"text-zinc-600",children:[(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"status"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),(0,a.jsxs)("td",{className:"py-2 text-xs",children:["Comma-separated status filter: ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"open,in_progress,blocked,deferred,closed"})]})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"priority"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),(0,a.jsxs)("td",{className:"py-2 text-xs",children:["Comma-separated priority filter: ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"0"})," (critical) to ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"4"})," (backlog)"]})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"prefix"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),(0,a.jsxs)("td",{className:"py-2 text-xs",children:["Filter by repo prefix (e.g. ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"beads-map"}),")"]})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"include"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"comments,activity"}),a.jsx("td",{className:"py-2 text-xs",children:"Opt-in to expensive fields. Empty string skips both. Omitting returns all."})]}),(0,a.jsxs)("tr",{children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"limit"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"number"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"50"}),a.jsx("td",{className:"py-2 text-xs",children:"Activity feed cap (max 200)"})]})]})]})}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Example Request"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4",children:"curl http://localhost:3000/api/v1/graph?status=open,in_progress&limit=10"}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Response Shape"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto",children:`{
2
+ "project": {
3
+ "name": "my-project",
4
+ "prefix": "my-proj",
5
+ "repos": [".", "../backend"],
6
+ "repoUrls": { "my-proj": "https://github.com/org/my-project" }
7
+ },
8
+ "issues": [
9
+ {
10
+ "id": "my-proj-abc",
11
+ "title": "Fix login redirect",
12
+ "description": "Full markdown description...",
13
+ "status": "open",
14
+ "priority": 1,
15
+ "issue_type": "bug",
16
+ "owner": "alice",
17
+ "assignee": "bob",
18
+ "labels": [],
19
+ "created_at": "2025-01-15T10:00:00Z",
20
+ "updated_at": "2025-01-16T14:30:00Z",
21
+ "closed_at": null,
22
+ "close_reason": null,
23
+ "prefix": "my-proj",
24
+ "blockers": ["my-proj-xyz"],
25
+ "dependents": ["my-proj-def"],
26
+ "comments": [
27
+ {
28
+ "author": { "handle": "alice.bsky.social", "did": "did:plc:..." },
29
+ "text": "This needs to be fixed before release",
30
+ "createdAt": "2025-01-16T14:30:00Z",
31
+ "likes": 2,
32
+ "replies": []
33
+ }
34
+ ],
35
+ "claimed_by": {
36
+ "handle": "bob.bsky.social",
37
+ "did": "did:plc:...",
38
+ "claimed_at": "2025-01-16T15:00:00Z"
39
+ }
40
+ }
41
+ ],
42
+ "dependencies": [
43
+ { "from": "my-proj-xyz", "to": "my-proj-abc", "type": "blocks" }
44
+ ],
45
+ "stats": {
46
+ "total": 42, "open": 15, "in_progress": 8,
47
+ "blocked": 3, "closed": 16, "actionable": 12
48
+ },
49
+ "activity": [
50
+ {
51
+ "type": "comment-added",
52
+ "time": "2025-01-16T14:30:00Z",
53
+ "issue_id": "my-proj-abc",
54
+ "issue_title": "Fix login redirect",
55
+ "actor": { "handle": "alice.bsky.social" },
56
+ "detail": "This needs to be fixed..."
57
+ }
58
+ ],
59
+ "_meta": {
60
+ "generated_at": "2025-01-17T09:00:00Z",
61
+ "api_version": "v1",
62
+ "heartbeads_version": "0.3.7"
63
+ }
64
+ }`})]}),a.jsx("hr",{className:"border-zinc-100 mb-10"}),(0,a.jsxs)("section",{id:"issues",className:"mb-12 scroll-mt-8",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[a.jsx("span",{className:"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200",children:"GET"}),a.jsx("code",{className:"text-sm font-mono font-semibold text-zinc-900",children:"/api/v1/issues/:id"})]}),(0,a.jsxs)("p",{className:"text-sm text-zinc-600 mb-4 leading-relaxed",children:["Returns a single issue with its full description, threaded comments, claim info, and enriched blockers/dependents (each includes ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"title"})," and ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"status"})," so you can understand the blocking context without extra requests)."]}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Path Parameters"}),a.jsx("div",{className:"overflow-x-auto mb-4",children:(0,a.jsxs)("table",{className:"w-full text-sm border-collapse",children:[a.jsx("thead",{children:(0,a.jsxs)("tr",{className:"text-left text-xs text-zinc-500 border-b border-zinc-100",children:[a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Param"}),a.jsx("th",{className:"py-2 font-medium",children:"Description"})]})}),a.jsx("tbody",{className:"text-zinc-600",children:(0,a.jsxs)("tr",{children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"id"}),(0,a.jsxs)("td",{className:"py-2 text-xs",children:["The issue ID (e.g. ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"beads-map-abc"}),")"]})]})})]})}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Example Request"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4",children:"curl http://localhost:3000/api/v1/issues/beads-map-abc"}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Response Shape"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4",children:`{
65
+ "issue": {
66
+ "id": "beads-map-abc",
67
+ "title": "Fix login redirect",
68
+ "description": "Full markdown description...",
69
+ "status": "open",
70
+ "priority": 1,
71
+ "issue_type": "bug",
72
+ "owner": "alice",
73
+ "assignee": null,
74
+ "labels": [],
75
+ "created_at": "2025-01-15T10:00:00Z",
76
+ "updated_at": "2025-01-16T14:30:00Z",
77
+ "closed_at": null,
78
+ "close_reason": null,
79
+ "prefix": "beads-map",
80
+ "blockers": [
81
+ { "id": "beads-map-xyz", "title": "Deploy auth service", "status": "in_progress" }
82
+ ],
83
+ "dependents": [
84
+ { "id": "beads-map-def", "title": "Add SSO support", "status": "open" }
85
+ ],
86
+ "comments": [...],
87
+ "claimed_by": null
88
+ },
89
+ "_meta": { ... }
90
+ }`}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Error Response (404)"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto",children:`{
91
+ "error": "Issue not found",
92
+ "hint": "No issue with id \\"nonexistent\\". Use GET /api/v1/graph to list all issues."
93
+ }`})]}),a.jsx("hr",{className:"border-zinc-100 mb-10"}),(0,a.jsxs)("section",{id:"ready",className:"mb-12 scroll-mt-8",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[a.jsx("span",{className:"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200",children:"GET"}),a.jsx("code",{className:"text-sm font-mono font-semibold text-zinc-900",children:"/api/v1/ready"})]}),(0,a.jsxs)("p",{className:"text-sm text-zinc-600 mb-4 leading-relaxed",children:["Returns issues that are ready to work on: status is ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"open"})," or ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"in_progress"})," and all upstream blockers are ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"closed"}),". Sorted by priority (critical first), then by age (oldest first)."]}),(0,a.jsxs)("p",{className:"text-sm text-zinc-500 mb-4 leading-relaxed",children:["This is the “what should I work on?” endpoint. A Playwright test bot can hit ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"?type=feature&unclaimed=true"})," to find untested features. A code reviewer can query ",a.jsx("code",{className:"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded",children:"?type=bug"})," to find bugs needing review."]}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Query Parameters"}),a.jsx("div",{className:"overflow-x-auto mb-4",children:(0,a.jsxs)("table",{className:"w-full text-sm border-collapse",children:[a.jsx("thead",{children:(0,a.jsxs)("tr",{className:"text-left text-xs text-zinc-500 border-b border-zinc-100",children:[a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Param"}),a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Type"}),a.jsx("th",{className:"py-2 pr-4 font-medium",children:"Default"}),a.jsx("th",{className:"py-2 font-medium",children:"Description"})]})}),(0,a.jsxs)("tbody",{className:"text-zinc-600",children:[(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"unclaimed"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"boolean"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"false"}),a.jsx("td",{className:"py-2 text-xs",children:"Only return issues with no claim comment"})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"type"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),(0,a.jsxs)("td",{className:"py-2 text-xs",children:["Comma-separated issue type filter: ",a.jsx("code",{className:"bg-zinc-100 px-1 rounded",children:"task,bug,feature,chore,epic"})]})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"assignee"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),a.jsx("td",{className:"py-2 text-xs",children:"Filter by assignee handle"})]}),(0,a.jsxs)("tr",{className:"border-b border-zinc-50",children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"prefix"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"string"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),a.jsx("td",{className:"py-2 text-xs",children:"Filter by repo prefix"})]}),(0,a.jsxs)("tr",{children:[a.jsx("td",{className:"py-2 pr-4 font-mono text-xs text-teal-600",children:"limit"}),a.jsx("td",{className:"py-2 pr-4 text-xs",children:"number"}),a.jsx("td",{className:"py-2 pr-4 text-xs text-zinc-400",children:"all"}),a.jsx("td",{className:"py-2 text-xs",children:"Max issues returned"})]})]})]})}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Example Requests"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4",children:`# All actionable issues
94
+ curl http://localhost:3000/api/v1/ready
95
+
96
+ # Only unclaimed bugs
97
+ curl "http://localhost:3000/api/v1/ready?unclaimed=true&type=bug"
98
+
99
+ # Top 5 highest priority
100
+ curl "http://localhost:3000/api/v1/ready?limit=5"`}),a.jsx("h3",{className:"text-xs font-semibold text-zinc-700 mb-2",children:"Response Shape"}),a.jsx("pre",{className:"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto",children:`{
101
+ "issues": [
102
+ {
103
+ "id": "my-proj-abc",
104
+ "title": "Fix login redirect",
105
+ "status": "open",
106
+ "priority": 0,
107
+ "issue_type": "bug",
108
+ ...
109
+ "comments": [...],
110
+ "claimed_by": null
111
+ }
112
+ ],
113
+ "stats": {
114
+ "total_ready": 12,
115
+ "unclaimed": 8,
116
+ "by_priority": { "0": 2, "1": 5, "2": 3, "3": 2 },
117
+ "by_type": { "bug": 4, "feature": 6, "task": 2 }
118
+ },
119
+ "_meta": { ... }
120
+ }`})]}),a.jsx("hr",{className:"border-zinc-100 mb-10"}),(0,a.jsxs)("section",{className:"mb-12",children:[a.jsx("h2",{className:"text-lg font-semibold text-zinc-900 mb-4",children:"Example Use Cases"}),a.jsx("div",{className:"space-y-3",children:[{agent:"Playwright test bot",endpoint:"GET /api/v1/ready?type=feature&unclaimed=true",desc:"Finds untested features, writes E2E tests"},{agent:"Code reviewer AI",endpoint:"GET /api/v1/graph?status=in_progress",desc:"Reviews work in progress, posts feedback as comments"},{agent:"Planning agent",endpoint:"GET /api/v1/graph",desc:"Analyzes the full dependency graph, identifies bottlenecks"},{agent:"CI/CD bot",endpoint:"GET /api/v1/issues/:id",desc:"Checks a specific issue's status after deployment"},{agent:"Standup bot",endpoint:"GET /api/v1/graph?include=activity&limit=20",desc:"Summarizes the last 20 activities for daily standup"}].map(e=>(0,a.jsxs)("div",{className:"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100",children:[a.jsx("div",{className:"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5",children:a.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-teal-500"})}),(0,a.jsxs)("div",{children:[a.jsx("div",{className:"text-xs font-semibold text-zinc-700",children:e.agent}),a.jsx("code",{className:"text-[11px] font-mono text-teal-600",children:e.endpoint}),a.jsx("div",{className:"text-xs text-zinc-500 mt-0.5",children:e.desc})]})]},e.agent))})]}),a.jsx("footer",{className:"text-center text-xs text-zinc-300 pt-6 border-t border-zinc-100",children:"Heartbeads API v1"})]})})}},19709:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>d,metadata:()=>i,viewport:()=>l});var a=s(55886),r=s(36691);let n=(0,r.createProxy)(String.raw`/Users/david/Projects/gainforest/beads-map/lib/auth.tsx#AuthProvider`);(0,r.createProxy)(String.raw`/Users/david/Projects/gainforest/beads-map/lib/auth.tsx#useAuth`),s(29944);let i={metadataBase:new URL(process.env.PUBLIC_URL||"http://localhost:3000"),title:"Heartbeads",description:"Interactive dependency graph viewer for beads issues — see your project's heartbeat",openGraph:{title:"Heartbeads",description:"Interactive dependency graph viewer for beads issues — see your project's heartbeat",type:"website",siteName:"Heartbeads",images:[{url:"/image.png",width:1200,height:630,alt:"Heartbeads — interactive dependency graph viewer"}]},twitter:{card:"summary_large_image",title:"Heartbeads",description:"Interactive dependency graph viewer for beads issues — see your project's heartbeat",images:["/image.png"]}},l={width:"device-width",initialScale:1,maximumScale:1,userScalable:!1};function d({children:e}){return a.jsx("html",{lang:"en",children:a.jsx("body",{children:a.jsx(n,{children:e})})})}},69784:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>a});let a=(0,s(36691).createProxy)(String.raw`/Users/david/Projects/gainforest/beads-map/app/not-found.tsx#default`)},70493:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(56258);let r=e=>[{type:"image/png",width:3008,height:1686,url:(0,a.fillMetadataSegment)(".",e.params,"opengraph-image.png")+"?dd44d0a71ff29c1f"}]},80232:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>r});var a=s(56258);let r=e=>[{type:"image/png",width:3008,height:1686,url:(0,a.fillMetadataSegment)(".",e.params,"twitter-image.png")+"?dd44d0a71ff29c1f"}]},29944:()=>{}};var t=require("../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),a=t.X(0,[719,950],()=>s(12582));module.exports=a})();
@@ -0,0 +1 @@
1
+ {"version":1,"files":["../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/action-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/async-local-storage.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/request-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/server/lib/trace/constants.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/server/lib/trace/tracer.js","../../../../../node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/package.json","../../../../../node_modules/next","../../../../../package.json","../../../../package.json","../../../chunks/719.js","../../../chunks/950.js","../../../webpack-runtime.js","page_client-reference-manifest.js"]}
@@ -0,0 +1 @@
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/api/docs/page"]={"moduleLoading":{"prefix":"/_next/","crossOrigin":null},"ssrModuleMapping":{"176":{"*":{"id":"96676","name":"*","chunks":[],"async":false}},"1819":{"*":{"id":"13429","name":"*","chunks":[],"async":false}},"2433":{"*":{"id":"66544","name":"*","chunks":[],"async":false}},"2651":{"*":{"id":"59645","name":"*","chunks":[],"async":false}},"4314":{"*":{"id":"66304","name":"*","chunks":[],"async":false}},"7523":{"*":{"id":"93477","name":"*","chunks":[],"async":false}},"7796":{"*":{"id":"67960","name":"*","chunks":[],"async":false}},"8528":{"*":{"id":"95116","name":"*","chunks":[],"async":false}},"9414":{"*":{"id":"88850","name":"*","chunks":[],"async":false}},"9725":{"*":{"id":"21035","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/app-router.js":{"id":2433,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/app-router.js":{"id":2433,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/client-page.js":{"id":7523,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/client-page.js":{"id":7523,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/error-boundary.js":{"id":8528,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":8528,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/layout-router.js":{"id":176,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/layout-router.js":{"id":176,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/not-found-boundary.js":{"id":2651,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":2651,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/client/components/render-from-template-context.js":{"id":9414,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/node_modules/.pnpm/next@14.2.35_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":9414,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/app/login/page.tsx":{"id":9725,"name":"*","chunks":[],"async":false},"/Users/david/Projects/gainforest/beads-map/app/globals.css":{"id":4443,"name":"*","chunks":["185","static/chunks/app/layout-13e3cdaaa416edb6.js"],"async":false},"/Users/david/Projects/gainforest/beads-map/lib/auth.tsx":{"id":7796,"name":"*","chunks":["185","static/chunks/app/layout-13e3cdaaa416edb6.js"],"async":false},"/Users/david/Projects/gainforest/beads-map/app/not-found.tsx":{"id":1819,"name":"*","chunks":["788","static/chunks/788-aa413085174e935a.js","160","static/chunks/app/not-found-ae1139bed2018dd8.js"],"async":false},"/Users/david/Projects/gainforest/beads-map/app/page.tsx":{"id":4314,"name":"*","chunks":["971","static/chunks/971-bb44d52bcd9ee2a9.js","931","static/chunks/app/page-583300dd8af66e5a.js"],"async":false}},"entryCSSFiles":{"/Users/david/Projects/gainforest/beads-map/":[],"/Users/david/Projects/gainforest/beads-map/app/layout":["static/css/8c1b520a38ba4ccd.css"],"/Users/david/Projects/gainforest/beads-map/app/not-found":[],"/Users/david/Projects/gainforest/beads-map/app/page":[],"/Users/david/Projects/gainforest/beads-map/app/api/docs/page":[]}}
@@ -0,0 +1,120 @@
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/_next/static/css/8c1b520a38ba4ccd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-117444a4bfe51057.js"/><script src="/_next/static/chunks/2200cc46-7c93a0e00b0bb825.js" async=""></script><script src="/_next/static/chunks/945-3ff1d381a0af1ecd.js" async=""></script><script src="/_next/static/chunks/main-app-8b0c4a1007dbb7f4.js" async=""></script><script src="/_next/static/chunks/app/layout-13e3cdaaa416edb6.js" async=""></script><script src="/_next/static/chunks/788-aa413085174e935a.js" async=""></script><script src="/_next/static/chunks/app/not-found-ae1139bed2018dd8.js" async=""></script><title>Heartbeads API Docs</title><meta name="description" content="Public REST API documentation for Heartbeads"/><meta property="og:title" content="Heartbeads"/><meta property="og:description" content="Interactive dependency graph viewer for beads issues — see your project&#x27;s heartbeat"/><meta property="og:site_name" content="Heartbeads"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="3008"/><meta property="og:image:height" content="1686"/><meta property="og:image" content="http://localhost:3000/opengraph-image.png?dd44d0a71ff29c1f"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Heartbeads"/><meta name="twitter:description" content="Interactive dependency graph viewer for beads issues — see your project&#x27;s heartbeat"/><meta name="twitter:image:type" content="image/png"/><meta name="twitter:image:width" content="3008"/><meta name="twitter:image:height" content="1686"/><meta name="twitter:image" content="http://localhost:3000/twitter-image.png?dd44d0a71ff29c1f"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="min-h-screen bg-white text-zinc-800 antialiased overflow-y-auto h-screen"><div class="max-w-3xl mx-auto px-6 py-12"><div class="mb-10"><a href="/" class="text-xs text-zinc-400 hover:text-emerald-500 transition-colors">← Back to graph</a><h1 class="text-2xl font-semibold mt-3 text-zinc-900">Heartbeads API</h1><p class="text-sm text-zinc-500 mt-1.5 leading-relaxed">Read-only REST API for AI agents, CI/CD bots, and integrations. No authentication required. All endpoints return JSON with CORS headers.</p><div class="flex items-center gap-3 mt-3"><span class="text-[11px] font-mono px-2 py-0.5 rounded-full bg-emerald-50 text-emerald-600 border border-emerald-200">v1</span><span class="text-[11px] text-zinc-400">Base path: <code class="font-mono">/api/v1</code></span></div></div><nav class="mb-10 p-4 rounded-xl bg-zinc-50 border border-zinc-100"><h2 class="text-[11px] font-semibold uppercase tracking-widest text-zinc-400 mb-2">Endpoints</h2><ul class="space-y-1.5 text-sm"><li><a href="#graph" class="text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline"><code class="font-mono text-xs">GET /api/v1/graph</code><span class="text-zinc-400 ml-2">— Full project snapshot</span></a></li><li><a href="#issues" class="text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline"><code class="font-mono text-xs">GET /api/v1/issues/:id</code><span class="text-zinc-400 ml-2">— Single issue detail</span></a></li><li><a href="#ready" class="text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline"><code class="font-mono text-xs">GET /api/v1/ready</code><span class="text-zinc-400 ml-2">— Actionable issues</span></a></li></ul></nav><section class="mb-10"><h2 class="text-lg font-semibold text-zinc-900 mb-3">Common Details</h2><div class="space-y-3 text-sm text-zinc-600 leading-relaxed"><p>All responses include CORS headers (<code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">Access-Control-Allow-Origin: *</code>) and are cached for 30 seconds.</p><p>Every response includes a <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">_meta</code> object with <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">generated_at</code> (ISO 8601), <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">api_version</code>, <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">heartbeads_version</code>, and optional <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">warnings</code>.</p><p>Error responses return <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">{ &quot;error&quot;: &quot;...&quot;, &quot;hint&quot;: &quot;...&quot; }</code> with appropriate HTTP status codes (404, 500).</p></div></section><section class="mb-10"><h2 class="text-lg font-semibold text-zinc-900 mb-3">Authentication</h2><div class="space-y-3 text-sm text-zinc-600 leading-relaxed"><p>By default, no authentication is required. When heartbeads is started with <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">--password</code>, all API requests must include the password:</p><div class="space-y-2"><div class="flex items-start gap-2"><span class="shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5">1</span><div><span class="font-medium text-zinc-700">Bearer token</span> (recommended)<pre class="mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto">curl -H &quot;Authorization: Bearer &lt;password&gt;&quot; http://localhost:3000/api/v1/graph</pre></div></div><div class="flex items-start gap-2"><span class="shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5">2</span><div><span class="font-medium text-zinc-700">Query parameter</span><pre class="mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto">curl &quot;http://localhost:3000/api/v1/graph?token=&lt;password&gt;&quot;</pre></div></div></div><p>Unauthenticated API requests return <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">401</code> with a JSON error. Browser requests are redirected to a login page.</p></div></section><hr class="border-zinc-100 mb-10"/><section id="graph" class="mb-12 scroll-mt-8"><div class="flex items-center gap-2 mb-3"><span class="text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200">GET</span><code class="text-sm font-mono font-semibold text-zinc-900">/api/v1/graph</code></div><p class="text-sm text-zinc-600 mb-4 leading-relaxed">Returns the entire project state in a single response: all issues with comments and claims, dependency edges, summary statistics, and a recent activity feed. This is the primary endpoint for AI agents that need full project context.</p><h3 class="text-xs font-semibold text-zinc-700 mb-2">Query Parameters</h3><div class="overflow-x-auto mb-4"><table class="w-full text-sm border-collapse"><thead><tr class="text-left text-xs text-zinc-500 border-b border-zinc-100"><th class="py-2 pr-4 font-medium">Param</th><th class="py-2 pr-4 font-medium">Type</th><th class="py-2 pr-4 font-medium">Default</th><th class="py-2 font-medium">Description</th></tr></thead><tbody class="text-zinc-600"><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">status</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Comma-separated status filter: <code class="bg-zinc-100 px-1 rounded">open,in_progress,blocked,deferred,closed</code></td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">priority</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Comma-separated priority filter: <code class="bg-zinc-100 px-1 rounded">0</code> (critical) to <code class="bg-zinc-100 px-1 rounded">4</code> (backlog)</td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">prefix</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Filter by repo prefix (e.g. <code class="bg-zinc-100 px-1 rounded">beads-map</code>)</td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">include</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">comments,activity</td><td class="py-2 text-xs">Opt-in to expensive fields. Empty string skips both. Omitting returns all.</td></tr><tr><td class="py-2 pr-4 font-mono text-xs text-teal-600">limit</td><td class="py-2 pr-4 text-xs">number</td><td class="py-2 pr-4 text-xs text-zinc-400">50</td><td class="py-2 text-xs">Activity feed cap (max 200)</td></tr></tbody></table></div><h3 class="text-xs font-semibold text-zinc-700 mb-2">Example Request</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4">curl http://localhost:3000/api/v1/graph?status=open,in_progress&amp;limit=10</pre><h3 class="text-xs font-semibold text-zinc-700 mb-2">Response Shape</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto">{
2
+ &quot;project&quot;: {
3
+ &quot;name&quot;: &quot;my-project&quot;,
4
+ &quot;prefix&quot;: &quot;my-proj&quot;,
5
+ &quot;repos&quot;: [&quot;.&quot;, &quot;../backend&quot;],
6
+ &quot;repoUrls&quot;: { &quot;my-proj&quot;: &quot;https://github.com/org/my-project&quot; }
7
+ },
8
+ &quot;issues&quot;: [
9
+ {
10
+ &quot;id&quot;: &quot;my-proj-abc&quot;,
11
+ &quot;title&quot;: &quot;Fix login redirect&quot;,
12
+ &quot;description&quot;: &quot;Full markdown description...&quot;,
13
+ &quot;status&quot;: &quot;open&quot;,
14
+ &quot;priority&quot;: 1,
15
+ &quot;issue_type&quot;: &quot;bug&quot;,
16
+ &quot;owner&quot;: &quot;alice&quot;,
17
+ &quot;assignee&quot;: &quot;bob&quot;,
18
+ &quot;labels&quot;: [],
19
+ &quot;created_at&quot;: &quot;2025-01-15T10:00:00Z&quot;,
20
+ &quot;updated_at&quot;: &quot;2025-01-16T14:30:00Z&quot;,
21
+ &quot;closed_at&quot;: null,
22
+ &quot;close_reason&quot;: null,
23
+ &quot;prefix&quot;: &quot;my-proj&quot;,
24
+ &quot;blockers&quot;: [&quot;my-proj-xyz&quot;],
25
+ &quot;dependents&quot;: [&quot;my-proj-def&quot;],
26
+ &quot;comments&quot;: [
27
+ {
28
+ &quot;author&quot;: { &quot;handle&quot;: &quot;alice.bsky.social&quot;, &quot;did&quot;: &quot;did:plc:...&quot; },
29
+ &quot;text&quot;: &quot;This needs to be fixed before release&quot;,
30
+ &quot;createdAt&quot;: &quot;2025-01-16T14:30:00Z&quot;,
31
+ &quot;likes&quot;: 2,
32
+ &quot;replies&quot;: []
33
+ }
34
+ ],
35
+ &quot;claimed_by&quot;: {
36
+ &quot;handle&quot;: &quot;bob.bsky.social&quot;,
37
+ &quot;did&quot;: &quot;did:plc:...&quot;,
38
+ &quot;claimed_at&quot;: &quot;2025-01-16T15:00:00Z&quot;
39
+ }
40
+ }
41
+ ],
42
+ &quot;dependencies&quot;: [
43
+ { &quot;from&quot;: &quot;my-proj-xyz&quot;, &quot;to&quot;: &quot;my-proj-abc&quot;, &quot;type&quot;: &quot;blocks&quot; }
44
+ ],
45
+ &quot;stats&quot;: {
46
+ &quot;total&quot;: 42, &quot;open&quot;: 15, &quot;in_progress&quot;: 8,
47
+ &quot;blocked&quot;: 3, &quot;closed&quot;: 16, &quot;actionable&quot;: 12
48
+ },
49
+ &quot;activity&quot;: [
50
+ {
51
+ &quot;type&quot;: &quot;comment-added&quot;,
52
+ &quot;time&quot;: &quot;2025-01-16T14:30:00Z&quot;,
53
+ &quot;issue_id&quot;: &quot;my-proj-abc&quot;,
54
+ &quot;issue_title&quot;: &quot;Fix login redirect&quot;,
55
+ &quot;actor&quot;: { &quot;handle&quot;: &quot;alice.bsky.social&quot; },
56
+ &quot;detail&quot;: &quot;This needs to be fixed...&quot;
57
+ }
58
+ ],
59
+ &quot;_meta&quot;: {
60
+ &quot;generated_at&quot;: &quot;2025-01-17T09:00:00Z&quot;,
61
+ &quot;api_version&quot;: &quot;v1&quot;,
62
+ &quot;heartbeads_version&quot;: &quot;0.3.7&quot;
63
+ }
64
+ }</pre></section><hr class="border-zinc-100 mb-10"/><section id="issues" class="mb-12 scroll-mt-8"><div class="flex items-center gap-2 mb-3"><span class="text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200">GET</span><code class="text-sm font-mono font-semibold text-zinc-900">/api/v1/issues/:id</code></div><p class="text-sm text-zinc-600 mb-4 leading-relaxed">Returns a single issue with its full description, threaded comments, claim info, and enriched blockers/dependents (each includes <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">title</code> and <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">status</code> so you can understand the blocking context without extra requests).</p><h3 class="text-xs font-semibold text-zinc-700 mb-2">Path Parameters</h3><div class="overflow-x-auto mb-4"><table class="w-full text-sm border-collapse"><thead><tr class="text-left text-xs text-zinc-500 border-b border-zinc-100"><th class="py-2 pr-4 font-medium">Param</th><th class="py-2 font-medium">Description</th></tr></thead><tbody class="text-zinc-600"><tr><td class="py-2 pr-4 font-mono text-xs text-teal-600">id</td><td class="py-2 text-xs">The issue ID (e.g. <code class="bg-zinc-100 px-1 rounded">beads-map-abc</code>)</td></tr></tbody></table></div><h3 class="text-xs font-semibold text-zinc-700 mb-2">Example Request</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4">curl http://localhost:3000/api/v1/issues/beads-map-abc</pre><h3 class="text-xs font-semibold text-zinc-700 mb-2">Response Shape</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4">{
65
+ &quot;issue&quot;: {
66
+ &quot;id&quot;: &quot;beads-map-abc&quot;,
67
+ &quot;title&quot;: &quot;Fix login redirect&quot;,
68
+ &quot;description&quot;: &quot;Full markdown description...&quot;,
69
+ &quot;status&quot;: &quot;open&quot;,
70
+ &quot;priority&quot;: 1,
71
+ &quot;issue_type&quot;: &quot;bug&quot;,
72
+ &quot;owner&quot;: &quot;alice&quot;,
73
+ &quot;assignee&quot;: null,
74
+ &quot;labels&quot;: [],
75
+ &quot;created_at&quot;: &quot;2025-01-15T10:00:00Z&quot;,
76
+ &quot;updated_at&quot;: &quot;2025-01-16T14:30:00Z&quot;,
77
+ &quot;closed_at&quot;: null,
78
+ &quot;close_reason&quot;: null,
79
+ &quot;prefix&quot;: &quot;beads-map&quot;,
80
+ &quot;blockers&quot;: [
81
+ { &quot;id&quot;: &quot;beads-map-xyz&quot;, &quot;title&quot;: &quot;Deploy auth service&quot;, &quot;status&quot;: &quot;in_progress&quot; }
82
+ ],
83
+ &quot;dependents&quot;: [
84
+ { &quot;id&quot;: &quot;beads-map-def&quot;, &quot;title&quot;: &quot;Add SSO support&quot;, &quot;status&quot;: &quot;open&quot; }
85
+ ],
86
+ &quot;comments&quot;: [...],
87
+ &quot;claimed_by&quot;: null
88
+ },
89
+ &quot;_meta&quot;: { ... }
90
+ }</pre><h3 class="text-xs font-semibold text-zinc-700 mb-2">Error Response (404)</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto">{
91
+ &quot;error&quot;: &quot;Issue not found&quot;,
92
+ &quot;hint&quot;: &quot;No issue with id \&quot;nonexistent\&quot;. Use GET /api/v1/graph to list all issues.&quot;
93
+ }</pre></section><hr class="border-zinc-100 mb-10"/><section id="ready" class="mb-12 scroll-mt-8"><div class="flex items-center gap-2 mb-3"><span class="text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200">GET</span><code class="text-sm font-mono font-semibold text-zinc-900">/api/v1/ready</code></div><p class="text-sm text-zinc-600 mb-4 leading-relaxed">Returns issues that are ready to work on: status is <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">open</code> or <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">in_progress</code> and all upstream blockers are <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">closed</code>. Sorted by priority (critical first), then by age (oldest first).</p><p class="text-sm text-zinc-500 mb-4 leading-relaxed">This is the “what should I work on?” endpoint. A Playwright test bot can hit <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">?type=feature&amp;unclaimed=true</code> to find untested features. A code reviewer can query <code class="text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded">?type=bug</code> to find bugs needing review.</p><h3 class="text-xs font-semibold text-zinc-700 mb-2">Query Parameters</h3><div class="overflow-x-auto mb-4"><table class="w-full text-sm border-collapse"><thead><tr class="text-left text-xs text-zinc-500 border-b border-zinc-100"><th class="py-2 pr-4 font-medium">Param</th><th class="py-2 pr-4 font-medium">Type</th><th class="py-2 pr-4 font-medium">Default</th><th class="py-2 font-medium">Description</th></tr></thead><tbody class="text-zinc-600"><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">unclaimed</td><td class="py-2 pr-4 text-xs">boolean</td><td class="py-2 pr-4 text-xs text-zinc-400">false</td><td class="py-2 text-xs">Only return issues with no claim comment</td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">type</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Comma-separated issue type filter: <code class="bg-zinc-100 px-1 rounded">task,bug,feature,chore,epic</code></td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">assignee</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Filter by assignee handle</td></tr><tr class="border-b border-zinc-50"><td class="py-2 pr-4 font-mono text-xs text-teal-600">prefix</td><td class="py-2 pr-4 text-xs">string</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Filter by repo prefix</td></tr><tr><td class="py-2 pr-4 font-mono text-xs text-teal-600">limit</td><td class="py-2 pr-4 text-xs">number</td><td class="py-2 pr-4 text-xs text-zinc-400">all</td><td class="py-2 text-xs">Max issues returned</td></tr></tbody></table></div><h3 class="text-xs font-semibold text-zinc-700 mb-2">Example Requests</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4"># All actionable issues
94
+ curl http://localhost:3000/api/v1/ready
95
+
96
+ # Only unclaimed bugs
97
+ curl &quot;http://localhost:3000/api/v1/ready?unclaimed=true&amp;type=bug&quot;
98
+
99
+ # Top 5 highest priority
100
+ curl &quot;http://localhost:3000/api/v1/ready?limit=5&quot;</pre><h3 class="text-xs font-semibold text-zinc-700 mb-2">Response Shape</h3><pre class="bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto">{
101
+ &quot;issues&quot;: [
102
+ {
103
+ &quot;id&quot;: &quot;my-proj-abc&quot;,
104
+ &quot;title&quot;: &quot;Fix login redirect&quot;,
105
+ &quot;status&quot;: &quot;open&quot;,
106
+ &quot;priority&quot;: 0,
107
+ &quot;issue_type&quot;: &quot;bug&quot;,
108
+ ...
109
+ &quot;comments&quot;: [...],
110
+ &quot;claimed_by&quot;: null
111
+ }
112
+ ],
113
+ &quot;stats&quot;: {
114
+ &quot;total_ready&quot;: 12,
115
+ &quot;unclaimed&quot;: 8,
116
+ &quot;by_priority&quot;: { &quot;0&quot;: 2, &quot;1&quot;: 5, &quot;2&quot;: 3, &quot;3&quot;: 2 },
117
+ &quot;by_type&quot;: { &quot;bug&quot;: 4, &quot;feature&quot;: 6, &quot;task&quot;: 2 }
118
+ },
119
+ &quot;_meta&quot;: { ... }
120
+ }</pre></section><hr class="border-zinc-100 mb-10"/><section class="mb-12"><h2 class="text-lg font-semibold text-zinc-900 mb-4">Example Use Cases</h2><div class="space-y-3"><div class="flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100"><div class="shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5"><div class="w-1.5 h-1.5 rounded-full bg-teal-500"></div></div><div><div class="text-xs font-semibold text-zinc-700">Playwright test bot</div><code class="text-[11px] font-mono text-teal-600">GET /api/v1/ready?type=feature&amp;unclaimed=true</code><div class="text-xs text-zinc-500 mt-0.5">Finds untested features, writes E2E tests</div></div></div><div class="flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100"><div class="shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5"><div class="w-1.5 h-1.5 rounded-full bg-teal-500"></div></div><div><div class="text-xs font-semibold text-zinc-700">Code reviewer AI</div><code class="text-[11px] font-mono text-teal-600">GET /api/v1/graph?status=in_progress</code><div class="text-xs text-zinc-500 mt-0.5">Reviews work in progress, posts feedback as comments</div></div></div><div class="flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100"><div class="shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5"><div class="w-1.5 h-1.5 rounded-full bg-teal-500"></div></div><div><div class="text-xs font-semibold text-zinc-700">Planning agent</div><code class="text-[11px] font-mono text-teal-600">GET /api/v1/graph</code><div class="text-xs text-zinc-500 mt-0.5">Analyzes the full dependency graph, identifies bottlenecks</div></div></div><div class="flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100"><div class="shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5"><div class="w-1.5 h-1.5 rounded-full bg-teal-500"></div></div><div><div class="text-xs font-semibold text-zinc-700">CI/CD bot</div><code class="text-[11px] font-mono text-teal-600">GET /api/v1/issues/:id</code><div class="text-xs text-zinc-500 mt-0.5">Checks a specific issue&#x27;s status after deployment</div></div></div><div class="flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100"><div class="shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5"><div class="w-1.5 h-1.5 rounded-full bg-teal-500"></div></div><div><div class="text-xs font-semibold text-zinc-700">Standup bot</div><code class="text-[11px] font-mono text-teal-600">GET /api/v1/graph?include=activity&amp;limit=20</code><div class="text-xs text-zinc-500 mt-0.5">Summarizes the last 20 activities for daily standup</div></div></div></div></section><footer class="text-center text-xs text-zinc-300 pt-6 border-t border-zinc-100">Heartbeads API v1</footer></div></div><script src="/_next/static/chunks/webpack-117444a4bfe51057.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/8c1b520a38ba4ccd.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2433,[],\"\"]\n5:I[176,[],\"\"]\n6:I[9414,[],\"\"]\n7:I[7796,[\"185\",\"static/chunks/app/layout-13e3cdaaa416edb6.js\"],\"AuthProvider\"]\n8:I[1819,[\"788\",\"static/chunks/788-aa413085174e935a.js\",\"160\",\"static/chunks/app/not-found-ae1139bed2018dd8.js\"],\"default\"]\na:I[8528,[],\"\"]\n4:T6bc,{\n \"project\": {\n \"name\": \"my-project\",\n \"prefix\": \"my-proj\",\n \"repos\": [\".\", \"../backend\"],\n \"repoUrls\": { \"my-proj\": \"https://github.com/org/my-project\" }\n },\n \"issues\": [\n {\n \"id\": \"my-proj-abc\",\n \"title\": \"Fix login redirect\",\n \"description\": \"Full markdown description...\",\n \"status\": \"open\",\n \"priority\": 1,\n \"issue_type\": \"bug\",\n \"owner\": \"alice\",\n \"assignee\": \"bob\",\n \"labels\": [],\n \"created_at\": \"2025-01-15T10:00:00Z\",\n \"updated_at\": \"2025-01-16T14:30:00Z\",\n \"closed_at\": null,\n \"close_reason\": null,\n \"prefix\": \"my-proj\",\n \"blockers\": [\"my-proj-xyz\"],\n \"dependents\": [\"my-proj-def\"],\n \"comments\": [\n {\n \"author\": { \"handle\": \"alice.bsky.social\", \"did\": \"did:plc:...\" },\n \"text\": \"This needs to be fixed before release\",\n \"createdAt\": \"2025-01-16T14:30:00Z\",\n \"likes\": 2,\n \"replies\": []\n }\n ],\n \"claimed_by\": {\n \"handle\": \"bob.bsky.social\",\n \"did\": \"did:plc:...\",\n \"claimed_at\": \"2025-01-16T15:00:00Z\"\n }\n }\n ],\n \"dependencies\": [\n { \"from\": \"my-proj-xyz\", \"to\": \"my-proj-abc\", \"type\": \"blocks\" }\n ],\n \"stats\": {\n \"total\": 42, \"open\": 15, \"in_progress\": 8,\n \"blocked\": 3, \"closed\": 16, \"actionable\": 12\n },\n \"activity\": [\n {\n \"type\": \"comment-added\",\n \"time\": \"2025-01-16T14:30:00Z\",\n \"issue_id\": \"my-proj-abc\",\n \"issue_title\": \"Fix login redirect\",\n \"actor\": { \"handle\": \"alice.bsky.social\" },\n \"detail\": \"This needs to be fixed...\"\n }\n ],\n \"_meta\": {\n \"generated_at\": \"2025-01-17T09:00:00Z\",\n \"api_version\": \"v1\",\n \"heartbeads_version\": \"0.3.7\"\n }\n}b:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"vFM69sDrBUf_9ULwPmVAE\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"api\",\"docs\"],\"initialTree\":[\"\",{\"children\":[\"api\",{\"children\":[\"docs\",{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"api\",{\"children\":[\"docs\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-white text-zinc-800 antialiased overflow-y-auto h-screen\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-3xl mx-auto px-6 py-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-10\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"className\":\"text-xs text-zinc-400 hover:text-emerald-500 transition-colors\",\"children\":\"← Back to graph\"}],[\"$\",\"h1\",null,{\"className\":\"text-2xl font-semibold mt-3 text-zinc-900\",\"children\":\"Heartbeads API\"}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-500 mt-1.5 leading-relaxed\",\"children\":\"Read-only REST API for AI agents, CI/CD bots, and integrations. No authentication required. All endpoints return JSON with CORS headers.\"}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 mt-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-[11px] font-mono px-2 py-0.5 rounded-full bg-emerald-50 text-emerald-600 border border-emerald-200\",\"children\":\"v1\"}],[\"$\",\"span\",null,{\"className\":\"text-[11px] text-zinc-400\",\"children\":[\"Base path: \",[\"$\",\"code\",null,{\"className\":\"font-mono\",\"children\":\"/api/v1\"}]]}]]}]]}],[\"$\",\"nav\",null,{\"className\":\"mb-10 p-4 rounded-xl bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-[11px] font-semibold uppercase tracking-widest text-zinc-400 mb-2\",\"children\":\"Endpoints\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-1.5 text-sm\",\"children\":[[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"#graph\",\"className\":\"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline\",\"children\":[[\"$\",\"code\",null,{\"className\":\"font-mono text-xs\",\"children\":\"GET /api/v1/graph\"}],[\"$\",\"span\",null,{\"className\":\"text-zinc-400 ml-2\",\"children\":\"— Full project snapshot\"}]]}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"#issues\",\"className\":\"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline\",\"children\":[[\"$\",\"code\",null,{\"className\":\"font-mono text-xs\",\"children\":\"GET /api/v1/issues/:id\"}],[\"$\",\"span\",null,{\"className\":\"text-zinc-400 ml-2\",\"children\":\"— Single issue detail\"}]]}]}],[\"$\",\"li\",null,{\"children\":[\"$\",\"a\",null,{\"href\":\"#ready\",\"className\":\"text-teal-600 hover:text-teal-700 underline-offset-2 hover:underline\",\"children\":[[\"$\",\"code\",null,{\"className\":\"font-mono text-xs\",\"children\":\"GET /api/v1/ready\"}],[\"$\",\"span\",null,{\"className\":\"text-zinc-400 ml-2\",\"children\":\"— Actionable issues\"}]]}]}]]}]]}],[\"$\",\"section\",null,{\"className\":\"mb-10\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-zinc-900 mb-3\",\"children\":\"Common Details\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3 text-sm text-zinc-600 leading-relaxed\",\"children\":[[\"$\",\"p\",null,{\"children\":[\"All responses include CORS headers (\",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"Access-Control-Allow-Origin: *\"}],\") and are cached for 30 seconds.\"]}],[\"$\",\"p\",null,{\"children\":[\"Every response includes a \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"_meta\"}],\" object with \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"generated_at\"}],\" (ISO 8601), \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"api_version\"}],\", \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"heartbeads_version\"}],\", and optional \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"warnings\"}],\".\"]}],[\"$\",\"p\",null,{\"children\":[\"Error responses return \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"{ \\\"error\\\": \\\"...\\\", \\\"hint\\\": \\\"...\\\" }\"}],\" with appropriate HTTP status codes (404, 500).\"]}]]}]]}],[\"$\",\"section\",null,{\"className\":\"mb-10\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-zinc-900 mb-3\",\"children\":\"Authentication\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3 text-sm text-zinc-600 leading-relaxed\",\"children\":[[\"$\",\"p\",null,{\"children\":[\"By default, no authentication is required. When heartbeads is started with \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"--password\"}],\", all API requests must include the password:\"]}],[\"$\",\"div\",null,{\"className\":\"space-y-2\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-start gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5\",\"children\":\"1\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"font-medium text-zinc-700\",\"children\":\"Bearer token\"}],\" (recommended)\",[\"$\",\"pre\",null,{\"className\":\"mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto\",\"children\":\"curl -H \\\"Authorization: Bearer \u003cpassword\u003e\\\" http://localhost:3000/api/v1/graph\"}]]}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-start gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"shrink-0 text-[11px] font-mono px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600 mt-0.5\",\"children\":\"2\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"span\",null,{\"className\":\"font-medium text-zinc-700\",\"children\":\"Query parameter\"}],[\"$\",\"pre\",null,{\"className\":\"mt-1 bg-zinc-950 text-zinc-300 rounded-lg p-3 text-xs font-mono overflow-x-auto\",\"children\":\"curl \\\"http://localhost:3000/api/v1/graph?token=\u003cpassword\u003e\\\"\"}]]}]]}]]}],[\"$\",\"p\",null,{\"children\":[\"Unauthenticated API requests return \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"401\"}],\" with a JSON error. Browser requests are redirected to a login page.\"]}]]}]]}],[\"$\",\"hr\",null,{\"className\":\"border-zinc-100 mb-10\"}],[\"$\",\"section\",null,{\"id\":\"graph\",\"className\":\"mb-12 scroll-mt-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200\",\"children\":\"GET\"}],[\"$\",\"code\",null,{\"className\":\"text-sm font-mono font-semibold text-zinc-900\",\"children\":\"/api/v1/graph\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-600 mb-4 leading-relaxed\",\"children\":\"Returns the entire project state in a single response: all issues with comments and claims, dependency edges, summary statistics, and a recent activity feed. This is the primary endpoint for AI agents that need full project context.\"}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Query Parameters\"}],[\"$\",\"div\",null,{\"className\":\"overflow-x-auto mb-4\",\"children\":[\"$\",\"table\",null,{\"className\":\"w-full text-sm border-collapse\",\"children\":[[\"$\",\"thead\",null,{\"children\":[\"$\",\"tr\",null,{\"className\":\"text-left text-xs text-zinc-500 border-b border-zinc-100\",\"children\":[[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Param\"}],[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Type\"}],[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Default\"}],[\"$\",\"th\",null,{\"className\":\"py-2 font-medium\",\"children\":\"Description\"}]]}]}],[\"$\",\"tbody\",null,{\"className\":\"text-zinc-600\",\"children\":[[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"status\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":[\"Comma-separated status filter: \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"open,in_progress,blocked,deferred,closed\"}]]}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"priority\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":[\"Comma-separated priority filter: \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"0\"}],\" (critical) to \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"4\"}],\" (backlog)\"]}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"prefix\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":[\"Filter by repo prefix (e.g. \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"beads-map\"}],\")\"]}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"include\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"comments,activity\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Opt-in to expensive fields. Empty string skips both. Omitting returns all.\"}]]}],[\"$\",\"tr\",null,{\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"limit\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"number\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"50\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Activity feed cap (max 200)\"}]]}]]}]]}]}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Example Request\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4\",\"children\":\"curl http://localhost:3000/api/v1/graph?status=open,in_progress\u0026limit=10\"}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Response Shape\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto\",\"children\":\"$4\"}]]}],[\"$\",\"hr\",null,{\"className\":\"border-zinc-100 mb-10\"}],[\"$\",\"section\",null,{\"id\":\"issues\",\"className\":\"mb-12 scroll-mt-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200\",\"children\":\"GET\"}],[\"$\",\"code\",null,{\"className\":\"text-sm font-mono font-semibold text-zinc-900\",\"children\":\"/api/v1/issues/:id\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-600 mb-4 leading-relaxed\",\"children\":[\"Returns a single issue with its full description, threaded comments, claim info, and enriched blockers/dependents (each includes \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"title\"}],\" and \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"status\"}],\" so you can understand the blocking context without extra requests).\"]}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Path Parameters\"}],[\"$\",\"div\",null,{\"className\":\"overflow-x-auto mb-4\",\"children\":[\"$\",\"table\",null,{\"className\":\"w-full text-sm border-collapse\",\"children\":[[\"$\",\"thead\",null,{\"children\":[\"$\",\"tr\",null,{\"className\":\"text-left text-xs text-zinc-500 border-b border-zinc-100\",\"children\":[[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Param\"}],[\"$\",\"th\",null,{\"className\":\"py-2 font-medium\",\"children\":\"Description\"}]]}]}],[\"$\",\"tbody\",null,{\"className\":\"text-zinc-600\",\"children\":[\"$\",\"tr\",null,{\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"id\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":[\"The issue ID (e.g. \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"beads-map-abc\"}],\")\"]}]]}]}]]}]}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Example Request\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4\",\"children\":\"curl http://localhost:3000/api/v1/issues/beads-map-abc\"}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Response Shape\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4\",\"children\":\"{\\n \\\"issue\\\": {\\n \\\"id\\\": \\\"beads-map-abc\\\",\\n \\\"title\\\": \\\"Fix login redirect\\\",\\n \\\"description\\\": \\\"Full markdown description...\\\",\\n \\\"status\\\": \\\"open\\\",\\n \\\"priority\\\": 1,\\n \\\"issue_type\\\": \\\"bug\\\",\\n \\\"owner\\\": \\\"alice\\\",\\n \\\"assignee\\\": null,\\n \\\"labels\\\": [],\\n \\\"created_at\\\": \\\"2025-01-15T10:00:00Z\\\",\\n \\\"updated_at\\\": \\\"2025-01-16T14:30:00Z\\\",\\n \\\"closed_at\\\": null,\\n \\\"close_reason\\\": null,\\n \\\"prefix\\\": \\\"beads-map\\\",\\n \\\"blockers\\\": [\\n { \\\"id\\\": \\\"beads-map-xyz\\\", \\\"title\\\": \\\"Deploy auth service\\\", \\\"status\\\": \\\"in_progress\\\" }\\n ],\\n \\\"dependents\\\": [\\n { \\\"id\\\": \\\"beads-map-def\\\", \\\"title\\\": \\\"Add SSO support\\\", \\\"status\\\": \\\"open\\\" }\\n ],\\n \\\"comments\\\": [...],\\n \\\"claimed_by\\\": null\\n },\\n \\\"_meta\\\": { ... }\\n}\"}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Error Response (404)\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto\",\"children\":\"{\\n \\\"error\\\": \\\"Issue not found\\\",\\n \\\"hint\\\": \\\"No issue with id \\\\\\\"nonexistent\\\\\\\". Use GET /api/v1/graph to list all issues.\\\"\\n}\"}]]}],[\"$\",\"hr\",null,{\"className\":\"border-zinc-100 mb-10\"}],[\"$\",\"section\",null,{\"id\":\"ready\",\"className\":\"mb-12 scroll-mt-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 mb-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-[11px] font-mono font-bold px-2 py-0.5 rounded bg-emerald-50 text-emerald-600 border border-emerald-200\",\"children\":\"GET\"}],[\"$\",\"code\",null,{\"className\":\"text-sm font-mono font-semibold text-zinc-900\",\"children\":\"/api/v1/ready\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-600 mb-4 leading-relaxed\",\"children\":[\"Returns issues that are ready to work on: status is \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"open\"}],\" or \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"in_progress\"}],\" and all upstream blockers are \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"closed\"}],\". Sorted by priority (critical first), then by age (oldest first).\"]}],[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-500 mb-4 leading-relaxed\",\"children\":[\"This is the “what should I work on?” endpoint. A Playwright test bot can hit \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"?type=feature\u0026unclaimed=true\"}],\" to find untested features. A code reviewer can query \",[\"$\",\"code\",null,{\"className\":\"text-xs font-mono bg-zinc-100 px-1.5 py-0.5 rounded\",\"children\":\"?type=bug\"}],\" to find bugs needing review.\"]}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Query Parameters\"}],[\"$\",\"div\",null,{\"className\":\"overflow-x-auto mb-4\",\"children\":[\"$\",\"table\",null,{\"className\":\"w-full text-sm border-collapse\",\"children\":[[\"$\",\"thead\",null,{\"children\":[\"$\",\"tr\",null,{\"className\":\"text-left text-xs text-zinc-500 border-b border-zinc-100\",\"children\":[[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Param\"}],[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Type\"}],[\"$\",\"th\",null,{\"className\":\"py-2 pr-4 font-medium\",\"children\":\"Default\"}],[\"$\",\"th\",null,{\"className\":\"py-2 font-medium\",\"children\":\"Description\"}]]}]}],[\"$\",\"tbody\",null,{\"className\":\"text-zinc-600\",\"children\":[[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"unclaimed\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"boolean\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"false\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Only return issues with no claim comment\"}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"type\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":[\"Comma-separated issue type filter: \",[\"$\",\"code\",null,{\"className\":\"bg-zinc-100 px-1 rounded\",\"children\":\"task,bug,feature,chore,epic\"}]]}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"assignee\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Filter by assignee handle\"}]]}],[\"$\",\"tr\",null,{\"className\":\"border-b border-zinc-50\",\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"prefix\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"string\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Filter by repo prefix\"}]]}],[\"$\",\"tr\",null,{\"children\":[[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 font-mono text-xs text-teal-600\",\"children\":\"limit\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs\",\"children\":\"number\"}],[\"$\",\"td\",null,{\"className\":\"py-2 pr-4 text-xs text-zinc-400\",\"children\":\"all\"}],[\"$\",\"td\",null,{\"className\":\"py-2 text-xs\",\"children\":\"Max issues returned\"}]]}]]}]]}]}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Example Requests\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto mb-4\",\"children\":\"# All actionable issues\\ncurl http://localhost:3000/api/v1/ready\\n\\n# Only unclaimed bugs\\ncurl \\\"http://localhost:3000/api/v1/ready?unclaimed=true\u0026type=bug\\\"\\n\\n# Top 5 highest priority\\ncurl \\\"http://localhost:3000/api/v1/ready?limit=5\\\"\"}],[\"$\",\"h3\",null,{\"className\":\"text-xs font-semibold text-zinc-700 mb-2\",\"children\":\"Response Shape\"}],[\"$\",\"pre\",null,{\"className\":\"bg-zinc-950 text-zinc-300 rounded-lg p-4 text-xs font-mono overflow-x-auto\",\"children\":\"{\\n \\\"issues\\\": [\\n {\\n \\\"id\\\": \\\"my-proj-abc\\\",\\n \\\"title\\\": \\\"Fix login redirect\\\",\\n \\\"status\\\": \\\"open\\\",\\n \\\"priority\\\": 0,\\n \\\"issue_type\\\": \\\"bug\\\",\\n ...\\n \\\"comments\\\": [...],\\n \\\"claimed_by\\\": null\\n }\\n ],\\n \\\"stats\\\": {\\n \\\"total_ready\\\": 12,\\n \\\"unclaimed\\\": 8,\\n \\\"by_priority\\\": { \\\"0\\\": 2, \\\"1\\\": 5, \\\"2\\\": 3, \\\"3\\\": 2 },\\n \\\"by_type\\\": { \\\"bug\\\": 4, \\\"feature\\\": 6, \\\"task\\\": 2 }\\n },\\n \\\"_meta\\\": { ... }\\n}\"}]]}],[\"$\",\"hr\",null,{\"className\":\"border-zinc-100 mb-10\"}],[\"$\",\"section\",null,{\"className\":\"mb-12\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-lg font-semibold text-zinc-900 mb-4\",\"children\":\"Example Use Cases\"}],[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"div\",\"Playwright test bot\",{\"className\":\"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"div\",null,{\"className\":\"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-1.5 h-1.5 rounded-full bg-teal-500\"}]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold text-zinc-700\",\"children\":\"Playwright test bot\"}],[\"$\",\"code\",null,{\"className\":\"text-[11px] font-mono text-teal-600\",\"children\":\"GET /api/v1/ready?type=feature\u0026unclaimed=true\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-zinc-500 mt-0.5\",\"children\":\"Finds untested features, writes E2E tests\"}]]}]]}],[\"$\",\"div\",\"Code reviewer AI\",{\"className\":\"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"div\",null,{\"className\":\"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-1.5 h-1.5 rounded-full bg-teal-500\"}]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold text-zinc-700\",\"children\":\"Code reviewer AI\"}],[\"$\",\"code\",null,{\"className\":\"text-[11px] font-mono text-teal-600\",\"children\":\"GET /api/v1/graph?status=in_progress\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-zinc-500 mt-0.5\",\"children\":\"Reviews work in progress, posts feedback as comments\"}]]}]]}],[\"$\",\"div\",\"Planning agent\",{\"className\":\"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"div\",null,{\"className\":\"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-1.5 h-1.5 rounded-full bg-teal-500\"}]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold text-zinc-700\",\"children\":\"Planning agent\"}],[\"$\",\"code\",null,{\"className\":\"text-[11px] font-mono text-teal-600\",\"children\":\"GET /api/v1/graph\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-zinc-500 mt-0.5\",\"children\":\"Analyzes the full dependency graph, identifies bottlenecks\"}]]}]]}],[\"$\",\"div\",\"CI/CD bot\",{\"className\":\"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"div\",null,{\"className\":\"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-1.5 h-1.5 rounded-full bg-teal-500\"}]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold text-zinc-700\",\"children\":\"CI/CD bot\"}],[\"$\",\"code\",null,{\"className\":\"text-[11px] font-mono text-teal-600\",\"children\":\"GET /api/v1/issues/:id\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-zinc-500 mt-0.5\",\"children\":\"Checks a specific issue's status after deployment\"}]]}]]}],[\"$\",\"div\",\"Standup bot\",{\"className\":\"flex items-start gap-3 p-3 rounded-lg bg-zinc-50 border border-zinc-100\",\"children\":[[\"$\",\"div\",null,{\"className\":\"shrink-0 w-5 h-5 rounded-full bg-teal-100 flex items-center justify-center mt-0.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-1.5 h-1.5 rounded-full bg-teal-500\"}]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold text-zinc-700\",\"children\":\"Standup bot\"}],[\"$\",\"code\",null,{\"className\":\"text-[11px] font-mono text-teal-600\",\"children\":\"GET /api/v1/graph?include=activity\u0026limit=20\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-zinc-500 mt-0.5\",\"children\":\"Summarizes the last 20 activities for daily standup\"}]]}]]}]]}]]}],[\"$\",\"footer\",null,{\"className\":\"text-center text-xs text-zinc-300 pt-6 border-t border-zinc-100\",\"children\":\"Heartbeads API v1\"}]]}]}],null],null],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"api\",\"children\",\"docs\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"api\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8c1b520a38ba4ccd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"$L8\",null,{}],\"notFoundStyles\":[]}]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Heartbeads API Docs\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Public REST API documentation for Heartbeads\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Heartbeads\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"Interactive dependency graph viewer for beads issues — see your project's heartbeat\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:site_name\",\"content\":\"Heartbeads\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image:width\",\"content\":\"3008\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:height\",\"content\":\"1686\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image\",\"content\":\"http://localhost:3000/opengraph-image.png?dd44d0a71ff29c1f\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Heartbeads\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Interactive dependency graph viewer for beads issues — see your project's heartbeat\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:image:width\",\"content\":\"3008\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:image:height\",\"content\":\"1686\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:image\",\"content\":\"http://localhost:3000/twitter-image.png?dd44d0a71ff29c1f\"}]]\n3:null\n"])</script></body></html>
@@ -0,0 +1,5 @@
1
+ {
2
+ "headers": {
3
+ "x-next-cache-tags": "_N_T_/layout,_N_T_/api/layout,_N_T_/api/docs/layout,_N_T_/api/docs/page,_N_T_/api/docs"
4
+ }
5
+ }