@shepai/cli 1.43.0 → 1.44.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 (179) hide show
  1. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts +1 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +19 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.js +6 -0
  6. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
  7. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +20 -2
  9. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts +18 -0
  10. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js +64 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts +13 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +38 -0
  15. package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.d.ts +13 -0
  16. package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.js +33 -0
  18. package/dist/packages/core/src/domain/generated/output.d.ts +17 -0
  19. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/di/container.js +22 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +4 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +30 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +39 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +60 -1
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +21 -0
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -0
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +69 -0
  33. package/dist/src/presentation/web/app/actions/add-repository.d.ts +11 -0
  34. package/dist/src/presentation/web/app/actions/add-repository.d.ts.map +1 -0
  35. package/dist/src/presentation/web/app/actions/add-repository.js +17 -0
  36. package/dist/src/presentation/web/app/actions/delete-repository.d.ts +5 -0
  37. package/dist/src/presentation/web/app/actions/delete-repository.d.ts.map +1 -0
  38. package/dist/src/presentation/web/app/actions/delete-repository.js +16 -0
  39. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  40. package/dist/src/presentation/web/app/page.js +29 -8
  41. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +2 -0
  42. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +1 -1
  44. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +2 -2
  46. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
  48. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +3 -0
  49. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +8 -2
  52. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts +1 -0
  53. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +28 -3
  55. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +2 -0
  56. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +1 -1
  58. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +2 -2
  60. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +1 -1
  62. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  64. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +2 -1
  66. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  67. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +81 -19
  69. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
  70. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +11 -2
  72. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  73. package/dist/tsconfig.build.tsbuildinfo +1 -1
  74. package/package.json +1 -1
  75. package/web/.next/BUILD_ID +1 -1
  76. package/web/.next/build-manifest.json +2 -2
  77. package/web/.next/cache/.previewinfo +1 -1
  78. package/web/.next/cache/.rscinfo +1 -1
  79. package/web/.next/cache/.tsbuildinfo +1 -1
  80. package/web/.next/cache/config.json +3 -3
  81. package/web/.next/fallback-build-manifest.json +2 -2
  82. package/web/.next/prerender-manifest.json +3 -3
  83. package/web/.next/required-server-files.js +1 -1
  84. package/web/.next/required-server-files.json +1 -1
  85. package/web/.next/server/app/_global-error.html +2 -2
  86. package/web/.next/server/app/_global-error.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  93. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/page/server-reference-manifest.json +48 -18
  95. package/web/.next/server/app/page.js +1 -1
  96. package/web/.next/server/app/page.js.nft.json +1 -1
  97. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/version/page.js.nft.json +1 -1
  99. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  103. package/web/.next/server/chunks/ssr/{[root-of-the-server]__77c0dfc4._.js → [root-of-the-server]__4e8ca89c._.js} +3 -3
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__4e8ca89c._.js.map +1 -0
  105. package/web/.next/server/chunks/ssr/_3ac3601c._.js +10 -0
  106. package/web/.next/server/chunks/ssr/_3ac3601c._.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/_a35f2870._.js +3 -0
  108. package/web/.next/server/chunks/ssr/_a35f2870._.js.map +1 -0
  109. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  112. package/web/.next/server/pages/500.html +2 -2
  113. package/web/.next/server/server-reference-manifest.js +1 -1
  114. package/web/.next/server/server-reference-manifest.json +49 -19
  115. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  116. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  117. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  118. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  119. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  120. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  121. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  122. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  123. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  124. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  125. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  126. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  127. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  128. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +48 -18
  129. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  134. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
  135. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__77c0dfc4._.js → [root-of-the-server]__4e8ca89c._.js} +3 -3
  137. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_3ac3601c._.js +10 -0
  138. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a35f2870._.js +3 -0
  139. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  140. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  141. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +49 -19
  143. package/web/.next/standalone/src/presentation/web/app/actions/add-repository.ts +29 -0
  144. package/web/.next/standalone/src/presentation/web/app/actions/delete-repository.ts +21 -0
  145. package/web/.next/standalone/src/presentation/web/app/page.tsx +34 -8
  146. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +2 -0
  147. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +2 -0
  148. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -0
  149. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node-config.ts +3 -0
  150. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.stories.tsx +30 -3
  151. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +57 -1
  152. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts +2 -0
  153. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +1 -0
  154. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +4 -1
  155. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +3 -0
  156. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center.stories.tsx +6 -3
  157. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +122 -34
  158. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +12 -1
  159. package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +1 -1
  160. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  161. package/web/.next/static/chunks/{8c0b96eb95dd31a9.js → 00f6ac2dde225eb7.js} +1 -1
  162. package/web/.next/static/chunks/45ca9930165e14a2.js +10 -0
  163. package/web/.next/static/chunks/9f8e71029fb04681.js +5 -0
  164. package/web/.next/static/chunks/b7b7abe79e05b229.css +2 -0
  165. package/web/.next/trace +1 -1
  166. package/web/.next/trace-build +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js.map +0 -1
  168. package/web/.next/server/chunks/ssr/_285de9aa._.js +0 -3
  169. package/web/.next/server/chunks/ssr/_285de9aa._.js.map +0 -1
  170. package/web/.next/server/chunks/ssr/_b1f2507a._.js +0 -10
  171. package/web/.next/server/chunks/ssr/_b1f2507a._.js.map +0 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_285de9aa._.js +0 -3
  173. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_b1f2507a._.js +0 -10
  174. package/web/.next/static/chunks/36bb03a0314fb990.css +0 -2
  175. package/web/.next/static/chunks/ac2bd2a7ffc02cd4.js +0 -10
  176. package/web/.next/static/chunks/fe6427c156bda6b0.js +0 -5
  177. /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → KmrV3D2B6O5rYBXaOy3l5}/_buildManifest.js +0 -0
  178. /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → KmrV3D2B6O5rYBXaOy3l5}/_clientMiddlewareManifest.json +0 -0
  179. /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → KmrV3D2B6O5rYBXaOy3l5}/_ssgManifest.js +0 -0
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--qVAyP83VDRO7ohQMjLw8T--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/b13aa397579082e7.js"/><script src="/_next/static/chunks/07f00e2e73d322d2.js" async=""></script><script src="/_next/static/chunks/cfe4dc9904fcfddb.js" async=""></script><script src="/_next/static/chunks/084314470f2144d2.js" async=""></script><script src="/_next/static/chunks/turbopack-35ff53de4dab1e56.js" async=""></script><script src="/_next/static/chunks/ab02eec995295bef.js" async=""></script><script src="/_next/static/chunks/fe70e73feb07bcfd.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/b13aa397579082e7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40799,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n3:I[73006,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n4:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"ViewportBoundary\"]\n9:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"MetadataBoundary\"]\nb:I[42726,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"qVAyP83VDRO7ohQMjLw8T\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ab02eec995295bef.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/fe70e73feb07bcfd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--KmrV3D2B6O5rYBXaOy3l5--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/b13aa397579082e7.js"/><script src="/_next/static/chunks/07f00e2e73d322d2.js" async=""></script><script src="/_next/static/chunks/cfe4dc9904fcfddb.js" async=""></script><script src="/_next/static/chunks/084314470f2144d2.js" async=""></script><script src="/_next/static/chunks/turbopack-35ff53de4dab1e56.js" async=""></script><script src="/_next/static/chunks/ab02eec995295bef.js" async=""></script><script src="/_next/static/chunks/fe70e73feb07bcfd.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/b13aa397579082e7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40799,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n3:I[73006,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n4:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"ViewportBoundary\"]\n9:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"MetadataBoundary\"]\nb:I[42726,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"KmrV3D2B6O5rYBXaOy3l5\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ab02eec995295bef.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/fe70e73feb07bcfd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"4024c538132575328a85253f9a3cd67e7b322a6f84\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"approveFeature\",\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\",\n \"exportedName\": \"approveFeature\"\n },\n \"40953c02fa87e0a9e815723a497715d595133a0a2f\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"getFeatureArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\",\n \"exportedName\": \"getFeatureArtifact\"\n },\n \"401f90d6dd0aa3df55467547de99c05d806530988f\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"getResearchArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\",\n \"exportedName\": \"getResearchArtifact\"\n },\n \"40664ad475a8a74e66c804d0ce3919975e1215c282\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"openIde\",\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\",\n \"exportedName\": \"openIde\"\n },\n \"40fcf4e7ed6da9e136a8abfabca6cb78b856fa9f67\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"openShell\",\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\",\n \"exportedName\": \"openShell\"\n },\n \"40aeb484d2caed59fa028ef82a443349164ceb6523\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"openFolder\",\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\",\n \"exportedName\": \"openFolder\"\n },\n \"0039003fadbee501fb704421bac2ca9c90b871c861\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"pickFolder\",\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\",\n \"exportedName\": \"pickFolder\"\n },\n \"405a5eb2f6a9410c457760405cb4656c0931d77189\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"createFeature\",\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\",\n \"exportedName\": \"createFeature\"\n },\n \"4009808872c41d24b906a53cba731a17ea5eda5f63\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 80016,\n \"async\": false,\n \"exportedName\": \"deleteFeature\",\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\",\n \"exportedName\": \"deleteFeature\"\n }\n },\n \"edge\": {},\n \"encryptionKey\": \"JfZN8QDWmgwXPOJnW5Xa8CXeboCpeP0jdLvxSB+d/3A=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"40553ac32b114a439011f253b9bacc130e50e32cbe\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"approveFeature\",\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\",\n \"exportedName\": \"approveFeature\"\n },\n \"403ad7b75eced40df7745b8a0031a1b673a9ba5ec0\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"getFeatureArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\",\n \"exportedName\": \"getFeatureArtifact\"\n },\n \"404050b3c22696fa580bf210f7b1371dab8ed4bd4f\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"getResearchArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\",\n \"exportedName\": \"getResearchArtifact\"\n },\n \"40ddd8220b7cc7024f591c09c64776909dd4b657d1\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"openIde\",\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\",\n \"exportedName\": \"openIde\"\n },\n \"4098e5b9412b87b57e67533788103b7bc561d4ad70\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"openShell\",\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\",\n \"exportedName\": \"openShell\"\n },\n \"40d10627e69b7c6ec60219df2ce3a86c8484cc8c70\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"openFolder\",\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\",\n \"exportedName\": \"openFolder\"\n },\n \"004b9569bb5a9036447911c895852000902e9a725b\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"pickFolder\",\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\",\n \"exportedName\": \"pickFolder\"\n },\n \"406cefbbddf21c5de6eb666ca0a02300f38e068551\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"createFeature\",\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\",\n \"exportedName\": \"createFeature\"\n },\n \"40978fb8d2bb741362cb7440627f1cc5fd5296796f\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"deleteFeature\",\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\",\n \"exportedName\": \"deleteFeature\"\n },\n \"4088a3c1575448419012dd38f724ada77d0a2a5478\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"addRepository\",\n \"filename\": \"src/presentation/web/app/actions/add-repository.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/add-repository.ts\",\n \"exportedName\": \"addRepository\"\n },\n \"40f8103fabaa3ed11b49e35e0569c2823b036c0b32\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 23768,\n \"async\": false,\n \"exportedName\": \"deleteRepository\",\n \"filename\": \"src/presentation/web/app/actions/delete-repository.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/delete-repository.ts\",\n \"exportedName\": \"deleteRepository\"\n }\n },\n \"edge\": {},\n \"encryptionKey\": \"mzC5Ibb+RvTi3g3nIvBL/YrPXu+MMpiHU5jbPb+kTew=\"\n}"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "node": {
3
- "4024c538132575328a85253f9a3cd67e7b322a6f84": {
3
+ "40553ac32b114a439011f253b9bacc130e50e32cbe": {
4
4
  "workers": {
5
5
  "app/page": {
6
- "moduleId": 80016,
6
+ "moduleId": 23768,
7
7
  "async": false,
8
8
  "exportedName": "approveFeature",
9
9
  "filename": "src/presentation/web/app/actions/approve-feature.ts"
@@ -15,10 +15,10 @@
15
15
  "filename": "src/presentation/web/app/actions/approve-feature.ts",
16
16
  "exportedName": "approveFeature"
17
17
  },
18
- "40953c02fa87e0a9e815723a497715d595133a0a2f": {
18
+ "403ad7b75eced40df7745b8a0031a1b673a9ba5ec0": {
19
19
  "workers": {
20
20
  "app/page": {
21
- "moduleId": 80016,
21
+ "moduleId": 23768,
22
22
  "async": false,
23
23
  "exportedName": "getFeatureArtifact",
24
24
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts"
@@ -30,10 +30,10 @@
30
30
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
31
31
  "exportedName": "getFeatureArtifact"
32
32
  },
33
- "401f90d6dd0aa3df55467547de99c05d806530988f": {
33
+ "404050b3c22696fa580bf210f7b1371dab8ed4bd4f": {
34
34
  "workers": {
35
35
  "app/page": {
36
- "moduleId": 80016,
36
+ "moduleId": 23768,
37
37
  "async": false,
38
38
  "exportedName": "getResearchArtifact",
39
39
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts"
@@ -45,10 +45,10 @@
45
45
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts",
46
46
  "exportedName": "getResearchArtifact"
47
47
  },
48
- "40664ad475a8a74e66c804d0ce3919975e1215c282": {
48
+ "40ddd8220b7cc7024f591c09c64776909dd4b657d1": {
49
49
  "workers": {
50
50
  "app/page": {
51
- "moduleId": 80016,
51
+ "moduleId": 23768,
52
52
  "async": false,
53
53
  "exportedName": "openIde",
54
54
  "filename": "src/presentation/web/app/actions/open-ide.ts"
@@ -60,10 +60,10 @@
60
60
  "filename": "src/presentation/web/app/actions/open-ide.ts",
61
61
  "exportedName": "openIde"
62
62
  },
63
- "40fcf4e7ed6da9e136a8abfabca6cb78b856fa9f67": {
63
+ "4098e5b9412b87b57e67533788103b7bc561d4ad70": {
64
64
  "workers": {
65
65
  "app/page": {
66
- "moduleId": 80016,
66
+ "moduleId": 23768,
67
67
  "async": false,
68
68
  "exportedName": "openShell",
69
69
  "filename": "src/presentation/web/app/actions/open-shell.ts"
@@ -75,10 +75,10 @@
75
75
  "filename": "src/presentation/web/app/actions/open-shell.ts",
76
76
  "exportedName": "openShell"
77
77
  },
78
- "40aeb484d2caed59fa028ef82a443349164ceb6523": {
78
+ "40d10627e69b7c6ec60219df2ce3a86c8484cc8c70": {
79
79
  "workers": {
80
80
  "app/page": {
81
- "moduleId": 80016,
81
+ "moduleId": 23768,
82
82
  "async": false,
83
83
  "exportedName": "openFolder",
84
84
  "filename": "src/presentation/web/app/actions/open-folder.ts"
@@ -90,10 +90,10 @@
90
90
  "filename": "src/presentation/web/app/actions/open-folder.ts",
91
91
  "exportedName": "openFolder"
92
92
  },
93
- "0039003fadbee501fb704421bac2ca9c90b871c861": {
93
+ "004b9569bb5a9036447911c895852000902e9a725b": {
94
94
  "workers": {
95
95
  "app/page": {
96
- "moduleId": 80016,
96
+ "moduleId": 23768,
97
97
  "async": false,
98
98
  "exportedName": "pickFolder",
99
99
  "filename": "src/presentation/web/app/actions/pick-folder.ts"
@@ -105,10 +105,10 @@
105
105
  "filename": "src/presentation/web/app/actions/pick-folder.ts",
106
106
  "exportedName": "pickFolder"
107
107
  },
108
- "405a5eb2f6a9410c457760405cb4656c0931d77189": {
108
+ "406cefbbddf21c5de6eb666ca0a02300f38e068551": {
109
109
  "workers": {
110
110
  "app/page": {
111
- "moduleId": 80016,
111
+ "moduleId": 23768,
112
112
  "async": false,
113
113
  "exportedName": "createFeature",
114
114
  "filename": "src/presentation/web/app/actions/create-feature.ts"
@@ -120,10 +120,10 @@
120
120
  "filename": "src/presentation/web/app/actions/create-feature.ts",
121
121
  "exportedName": "createFeature"
122
122
  },
123
- "4009808872c41d24b906a53cba731a17ea5eda5f63": {
123
+ "40978fb8d2bb741362cb7440627f1cc5fd5296796f": {
124
124
  "workers": {
125
125
  "app/page": {
126
- "moduleId": 80016,
126
+ "moduleId": 23768,
127
127
  "async": false,
128
128
  "exportedName": "deleteFeature",
129
129
  "filename": "src/presentation/web/app/actions/delete-feature.ts"
@@ -134,8 +134,38 @@
134
134
  },
135
135
  "filename": "src/presentation/web/app/actions/delete-feature.ts",
136
136
  "exportedName": "deleteFeature"
137
+ },
138
+ "4088a3c1575448419012dd38f724ada77d0a2a5478": {
139
+ "workers": {
140
+ "app/page": {
141
+ "moduleId": 23768,
142
+ "async": false,
143
+ "exportedName": "addRepository",
144
+ "filename": "src/presentation/web/app/actions/add-repository.ts"
145
+ }
146
+ },
147
+ "layer": {
148
+ "app/page": "action-browser"
149
+ },
150
+ "filename": "src/presentation/web/app/actions/add-repository.ts",
151
+ "exportedName": "addRepository"
152
+ },
153
+ "40f8103fabaa3ed11b49e35e0569c2823b036c0b32": {
154
+ "workers": {
155
+ "app/page": {
156
+ "moduleId": 23768,
157
+ "async": false,
158
+ "exportedName": "deleteRepository",
159
+ "filename": "src/presentation/web/app/actions/delete-repository.ts"
160
+ }
161
+ },
162
+ "layer": {
163
+ "app/page": "action-browser"
164
+ },
165
+ "filename": "src/presentation/web/app/actions/delete-repository.ts",
166
+ "exportedName": "deleteRepository"
137
167
  }
138
168
  },
139
169
  "edge": {},
140
- "encryptionKey": "JfZN8QDWmgwXPOJnW5Xa8CXeboCpeP0jdLvxSB+d/3A="
170
+ "encryptionKey": "mzC5Ibb+RvTi3g3nIvBL/YrPXu+MMpiHU5jbPb+kTew="
141
171
  }
@@ -0,0 +1,29 @@
1
+ 'use server';
2
+
3
+ import { resolve } from '@/lib/server-container';
4
+ import type { AddRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/add-repository.use-case';
5
+ import type { Repository } from '@shepai/core/domain/generated/output';
6
+
7
+ interface AddRepositoryInput {
8
+ path: string;
9
+ name?: string;
10
+ }
11
+
12
+ export async function addRepository(
13
+ input: AddRepositoryInput
14
+ ): Promise<{ repository?: Repository; error?: string }> {
15
+ const { path, name } = input;
16
+
17
+ if (!path?.trim()) {
18
+ return { error: 'path is required' };
19
+ }
20
+
21
+ try {
22
+ const addRepoUseCase = resolve<AddRepositoryUseCase>('AddRepositoryUseCase');
23
+ const repository = await addRepoUseCase.execute({ path, name });
24
+ return { repository };
25
+ } catch (error: unknown) {
26
+ const message = error instanceof Error ? error.message : 'Failed to add repository';
27
+ return { error: message };
28
+ }
29
+ }
@@ -0,0 +1,21 @@
1
+ 'use server';
2
+
3
+ import { resolve } from '@/lib/server-container';
4
+ import type { DeleteRepositoryUseCase } from '@shepai/core/application/use-cases/repositories/delete-repository.use-case';
5
+
6
+ export async function deleteRepository(
7
+ repositoryId: string
8
+ ): Promise<{ success: boolean; error?: string }> {
9
+ if (!repositoryId?.trim()) {
10
+ return { success: false, error: 'id is required' };
11
+ }
12
+
13
+ try {
14
+ const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');
15
+ await useCase.execute(repositoryId);
16
+ return { success: true };
17
+ } catch (error: unknown) {
18
+ const message = error instanceof Error ? error.message : 'Failed to delete repository';
19
+ return { success: false, error: message };
20
+ }
21
+ }
@@ -1,6 +1,7 @@
1
1
  import { ControlCenter } from '@/components/features/control-center';
2
2
  import { resolve } from '@/lib/server-container';
3
3
  import type { ListFeaturesUseCase } from '@shepai/core/application/use-cases/features/list-features.use-case';
4
+ import type { ListRepositoriesUseCase } from '@shepai/core/application/use-cases/repositories/list-repositories.use-case';
4
5
  import type { IAgentRunRepository } from '@shepai/core/application/ports/output/agents/agent-run-repository.interface';
5
6
  import {
6
7
  deriveNodeState,
@@ -35,8 +36,11 @@ const nodeToLifecyclePhase: Record<string, FeatureLifecyclePhase> = {
35
36
 
36
37
  export default async function HomePage() {
37
38
  const listFeatures = resolve<ListFeaturesUseCase>('ListFeaturesUseCase');
39
+ const listRepos = resolve<ListRepositoriesUseCase>('ListRepositoriesUseCase');
38
40
  const agentRunRepo = resolve<IAgentRunRepository>('IAgentRunRepository');
39
- const features = await listFeatures.execute();
41
+
42
+ const [features, repositories] = await Promise.all([listFeatures.execute(), listRepos.execute()]);
43
+
40
44
  const featuresWithRuns = await Promise.all(
41
45
  features.map(async (feature) => {
42
46
  const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
@@ -44,7 +48,7 @@ export default async function HomePage() {
44
48
  })
45
49
  );
46
50
 
47
- // Group features by repository path
51
+ // Group features by repository path (features may still reference paths not yet in repositories table)
48
52
  const featuresByRepo: Record<string, typeof featuresWithRuns> = {};
49
53
  featuresWithRuns.forEach((entry) => {
50
54
  const repoKey = entry.feature.repositoryPath;
@@ -57,16 +61,17 @@ export default async function HomePage() {
57
61
  const nodes: CanvasNodeType[] = [];
58
62
  const edges: Edge[] = [];
59
63
 
60
- Object.entries(featuresByRepo).forEach(([repoPath, repoFeatures]) => {
61
- const repoNodeId = `repo-${repoPath}`;
62
- const repoName = repoPath.split('/').pop() ?? repoPath;
64
+ // First, add nodes for all persisted repositories (including those without features)
65
+ for (const repo of repositories) {
66
+ const repoNodeId = `repo-${repo.id}`;
63
67
  nodes.push({
64
68
  id: repoNodeId,
65
69
  type: 'repositoryNode',
66
70
  position: { x: 0, y: 0 },
67
- data: { name: repoName, repositoryPath: repoPath },
71
+ data: { name: repo.name, repositoryPath: repo.path, id: repo.id },
68
72
  });
69
73
 
74
+ const repoFeatures = featuresByRepo[repo.path] ?? [];
70
75
  repoFeatures.forEach(({ feature, run }) => {
71
76
  const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
72
77
  const lifecycle: FeatureLifecyclePhase =
@@ -105,15 +110,36 @@ export default async function HomePage() {
105
110
  style: { strokeDasharray: '5 5' },
106
111
  });
107
112
  });
108
- });
113
+ }
109
114
 
110
115
  // Use dagre LR layout for compact, automatic positioning
111
116
  const laid = layoutWithDagre(nodes, edges, {
112
117
  direction: 'LR',
113
118
  ranksep: 200,
114
- nodesep: 60,
119
+ nodesep: 15,
115
120
  });
116
121
 
122
+ // Position "+ Add Repository" vertically centered with the bottom-most feature node,
123
+ // mirroring how Dagre centers repo nodes with their connected features.
124
+ const repoNodes = laid.nodes.filter((n) => n.type === 'repositoryNode');
125
+ const featureNodes = laid.nodes.filter((n) => n.type === 'featureNode');
126
+ const sortedFeatures = [...featureNodes].sort((a, b) => a.position.y - b.position.y);
127
+ // Pick the feature node just below center (one past the midpoint index)
128
+ const centerIdx = Math.floor(sortedFeatures.length / 2);
129
+ const targetFeature = sortedFeatures[centerIdx + 1] ?? sortedFeatures[sortedFeatures.length - 1];
130
+ const repoX = repoNodes[0]?.position.x ?? 0;
131
+ // Center the add-repo node (h=50) with the target feature node (h=140)
132
+ const addRepoPosition = targetFeature
133
+ ? { x: repoX, y: targetFeature.position.y + 70 - 25 }
134
+ : { x: repoX, y: (repoNodes[0]?.position.y ?? 0) + 150 };
135
+
136
+ laid.nodes.push({
137
+ id: 'add-repository',
138
+ type: 'addRepositoryNode',
139
+ position: addRepoPosition,
140
+ data: {},
141
+ } as CanvasNodeType);
142
+
117
143
  return (
118
144
  <div className="h-screen w-full">
119
145
  <ControlCenter initialNodes={laid.nodes} initialEdges={laid.edges} />
@@ -31,6 +31,8 @@ export interface PrdQuestionnaireDrawerProps extends PrdQuestionnaireProps {
31
31
  onClose: () => void;
32
32
  /** Feature name shown in drawer header */
33
33
  featureName: string;
34
+ /** Short description shown below the feature name */
35
+ featureDescription?: string;
34
36
  /** Feature ID shown below the name */
35
37
  featureId?: string;
36
38
  /** Current lifecycle stage label */
@@ -8,6 +8,7 @@ export function PrdQuestionnaireDrawer({
8
8
  open,
9
9
  onClose,
10
10
  featureName,
11
+ featureDescription,
11
12
  featureId,
12
13
  repositoryPath,
13
14
  branch,
@@ -21,6 +22,7 @@ export function PrdQuestionnaireDrawer({
21
22
  open={open}
22
23
  onClose={onClose}
23
24
  featureName={featureName}
25
+ featureDescription={featureDescription}
24
26
  featureId={featureId}
25
27
  repositoryPath={repositoryPath}
26
28
  branch={branch}
@@ -329,6 +329,7 @@ export const InDrawer: DrawerStory = {
329
329
  render: () => (
330
330
  <DrawerTemplate
331
331
  featureName="User Authentication Flow"
332
+ featureDescription="Implement OAuth2 login with social providers and MFA support"
332
333
  featureId="FEAT-042"
333
334
  lifecycleLabel="Requirements"
334
335
  data={mockData}
@@ -2,12 +2,15 @@ import type { Node } from '@xyflow/react';
2
2
 
3
3
  export interface RepositoryNodeData {
4
4
  [key: string]: unknown;
5
+ /** Repository domain entity ID (UUID), used for delete operations */
6
+ id?: string;
5
7
  /** Repository name, e.g. "shep-ai/cli" */
6
8
  name: string;
7
9
  /** Absolute path to the repository root, used for IDE/shell actions */
8
10
  repositoryPath?: string;
9
11
  onClick?: () => void;
10
12
  onAdd?: () => void;
13
+ onDelete?: (repositoryId: string) => void;
11
14
  showHandles?: boolean;
12
15
  }
13
16
 
@@ -158,15 +158,42 @@ export const WithActionsAndAddButton: Story = {
158
158
  render: (args) => <RepositoryNodeCanvas data={args} />,
159
159
  };
160
160
 
161
+ const onDelete = () => undefined;
162
+
163
+ export const WithDeleteButton: Story = {
164
+ args: {
165
+ id: 'repo-abc-123',
166
+ repositoryPath: '/home/user/shep-ai/cli',
167
+ },
168
+ argTypes: {
169
+ onDelete: { action: 'onDelete' },
170
+ },
171
+ render: (args) => <RepositoryNodeCanvas data={args} style={{ width: 550, height: 250 }} />,
172
+ };
173
+
161
174
  const multipleReposWithActions: RepositoryNodeData[] = [
162
- { name: 'shep-ai/cli', repositoryPath: '/home/user/shep-ai/cli', onAdd },
163
- { name: 'vercel/edge-runtime', repositoryPath: '/home/user/vercel/edge-runtime', onAdd },
175
+ { id: 'r1', name: 'shep-ai/cli', repositoryPath: '/home/user/shep-ai/cli', onAdd, onDelete },
176
+ {
177
+ id: 'r2',
178
+ name: 'vercel/edge-runtime',
179
+ repositoryPath: '/home/user/vercel/edge-runtime',
180
+ onAdd,
181
+ onDelete,
182
+ },
164
183
  {
184
+ id: 'r3',
165
185
  name: 'acme-corp/web-dashboard-v2',
166
186
  repositoryPath: '/home/user/acme-corp/web-dashboard-v2',
167
187
  onAdd,
188
+ onDelete,
189
+ },
190
+ {
191
+ id: 'r4',
192
+ name: 'openai/tiktoken',
193
+ repositoryPath: '/home/user/openai/tiktoken',
194
+ onAdd,
195
+ onDelete,
168
196
  },
169
- { name: 'openai/tiktoken', repositoryPath: '/home/user/openai/tiktoken', onAdd },
170
197
  ];
171
198
 
172
199
  export const MultipleWithActions: Story = {
@@ -1,14 +1,26 @@
1
1
  'use client';
2
2
 
3
+ import { useState } from 'react';
3
4
  import { Handle, Position } from '@xyflow/react';
4
- import { Github, Plus, Code2, Terminal, FolderOpen } from 'lucide-react';
5
+ import { Github, Plus, Code2, Terminal, FolderOpen, Trash2 } from 'lucide-react';
5
6
  import { cn } from '@/lib/utils';
6
7
  import { ActionButton } from '@/components/common/action-button';
8
+ import {
9
+ AlertDialog,
10
+ AlertDialogAction,
11
+ AlertDialogCancel,
12
+ AlertDialogContent,
13
+ AlertDialogDescription,
14
+ AlertDialogFooter,
15
+ AlertDialogHeader,
16
+ AlertDialogTitle,
17
+ } from '@/components/ui/alert-dialog';
7
18
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
8
19
  import type { RepositoryNodeData } from './repository-node-config';
9
20
  import { useRepositoryActions } from './use-repository-actions';
10
21
 
11
22
  export function RepositoryNode({ data }: { data: RepositoryNodeData; [key: string]: unknown }) {
23
+ const [confirmOpen, setConfirmOpen] = useState(false);
12
24
  const actions = useRepositoryActions(
13
25
  data.repositoryPath ? { repositoryPath: data.repositoryPath } : null
14
26
  );
@@ -24,6 +36,50 @@ export function RepositoryNode({ data }: { data: RepositoryNodeData; [key: strin
24
36
  />
25
37
  ) : null}
26
38
 
39
+ {/* Delete button — visible on hover, positioned to the left */}
40
+ {data.onDelete && data.id ? (
41
+ <>
42
+ <div className="absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100">
43
+ <TooltipProvider>
44
+ <Tooltip>
45
+ <TooltipTrigger asChild>
46
+ <button
47
+ aria-label="Remove repository"
48
+ data-testid="repository-node-delete-button"
49
+ onClick={(e) => {
50
+ e.stopPropagation();
51
+ setConfirmOpen(true);
52
+ }}
53
+ className="bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors"
54
+ >
55
+ <Trash2 className="h-3.5 w-3.5" />
56
+ </button>
57
+ </TooltipTrigger>
58
+ <TooltipContent>Remove repository</TooltipContent>
59
+ </Tooltip>
60
+ </TooltipProvider>
61
+ </div>
62
+
63
+ <AlertDialog open={confirmOpen} onOpenChange={setConfirmOpen}>
64
+ <AlertDialogContent size="sm">
65
+ <AlertDialogHeader>
66
+ <AlertDialogTitle>Remove repository?</AlertDialogTitle>
67
+ <AlertDialogDescription>
68
+ This will remove <strong>{data.name}</strong> from your workspace. The repository
69
+ files on disk won&apos;t be affected.
70
+ </AlertDialogDescription>
71
+ </AlertDialogHeader>
72
+ <AlertDialogFooter>
73
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
74
+ <AlertDialogAction variant="destructive" onClick={() => data.onDelete?.(data.id!)}>
75
+ Remove
76
+ </AlertDialogAction>
77
+ </AlertDialogFooter>
78
+ </AlertDialogContent>
79
+ </AlertDialog>
80
+ </>
81
+ ) : null}
82
+
27
83
  <div
28
84
  role="button"
29
85
  tabIndex={0}
@@ -7,6 +7,8 @@ export interface ReviewDrawerShellProps {
7
7
  onClose: () => void;
8
8
  /** Feature name shown in drawer header */
9
9
  featureName: string;
10
+ /** Short description shown below the feature name */
11
+ featureDescription?: string;
10
12
  /** Feature ID shown below the name (sr-only) */
11
13
  featureId?: string;
12
14
  /** Absolute path to the repository on disk */
@@ -43,6 +43,7 @@ export const Default: Story = {
43
43
  render: () => (
44
44
  <ShellTemplate
45
45
  featureName="User Authentication Flow"
46
+ featureDescription="Implement OAuth2 login with social providers and MFA support"
46
47
  featureId="FEAT-042"
47
48
  repositoryPath="/Users/dev/my-project"
48
49
  branch="feat/auth-flow"
@@ -29,6 +29,7 @@ export function ReviewDrawerShell({
29
29
  open,
30
30
  onClose,
31
31
  featureName,
32
+ featureDescription,
32
33
  featureId,
33
34
  repositoryPath,
34
35
  branch,
@@ -64,7 +65,9 @@ export function ReviewDrawerShell({
64
65
  {/* Header */}
65
66
  <DrawerHeader>
66
67
  <DrawerTitle>{featureName}</DrawerTitle>
67
- {featureId ? (
68
+ {featureDescription ? (
69
+ <DrawerDescription>{featureDescription}</DrawerDescription>
70
+ ) : featureId ? (
68
71
  <DrawerDescription className="sr-only">{featureId}</DrawerDescription>
69
72
  ) : null}
70
73
  </DrawerHeader>
@@ -40,6 +40,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
40
40
  clearSelection,
41
41
  handleCreateFeatureSubmit,
42
42
  handleDeleteFeature,
43
+ handleDeleteRepository,
43
44
  closeCreateDrawer,
44
45
  } = useControlCenterState(initialNodes, initialEdges);
45
46
 
@@ -204,6 +205,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
204
205
  onNodeClick={handleNodeClick}
205
206
  onPaneClick={clearSelection}
206
207
  onRepositoryAdd={handleAddFeatureToRepo}
208
+ onRepositoryDelete={handleDeleteRepository}
207
209
  onRepositorySelect={handleAddRepository}
208
210
  emptyState={<ControlCenterEmptyState onRepositorySelect={handleAddRepository} />}
209
211
  />
@@ -218,6 +220,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
218
220
  open={showPrdDrawer}
219
221
  onClose={clearSelection}
220
222
  featureName={selectedNode?.name ?? ''}
223
+ featureDescription={selectedNode?.description}
221
224
  featureId={selectedNode?.featureId}
222
225
  repositoryPath={selectedNode?.repositoryPath}
223
226
  branch={selectedNode?.branch}
@@ -6,6 +6,7 @@ import type { FeatureNodeType } from '@/components/common/feature-node';
6
6
  import type { RepositoryNodeType } from '@/components/common/repository-node';
7
7
  import type { AddRepositoryNodeType } from '@/components/common/add-repository-node';
8
8
  import { layoutWithDagre } from '@/lib/layout-with-dagre';
9
+ import { AgentEventsProvider } from '@/hooks/agent-events-provider';
9
10
 
10
11
  const meta: Meta<typeof ControlCenter> = {
11
12
  title: 'Features/ControlCenter',
@@ -16,9 +17,11 @@ const meta: Meta<typeof ControlCenter> = {
16
17
  },
17
18
  decorators: [
18
19
  (Story) => (
19
- <div style={{ height: '100vh' }}>
20
- <Story />
21
- </div>
20
+ <AgentEventsProvider>
21
+ <div style={{ height: '100vh' }}>
22
+ <Story />
23
+ </div>
24
+ </AgentEventsProvider>
22
25
  ),
23
26
  ],
24
27
  };